From 9e00eafda82eb92c792857d5818c639ca0579a02 Mon Sep 17 00:00:00 2001 From: Martin Karkowski Date: Mon, 17 Jan 2022 18:06:10 +0100 Subject: [PATCH] small fixes --- lib/cli/createService.ts | 11 +- lib/cli/generateFolderStructure.ts | 20 +-- lib/cli/nope.ts | 11 +- lib/cli/repl.ts | 13 +- lib/cli/runNopeBackend.ts | 169 +++++++----------- ...eLoader.ts => getPackageLoader.browser.ts} | 10 +- lib/loader/getPackageLoader.nodejs.ts | 26 +++ lib/loader/index.browser.ts | 2 +- lib/loader/index.nodejs.ts | 4 +- lib/loader/nopePackageLoader.nodejs.ts | 34 ++++ lib/types/nope/nopePackageLoader.interface.ts | 4 + package.json | 3 +- 12 files changed, 169 insertions(+), 138 deletions(-) rename lib/loader/{getPackageLoader.ts => getPackageLoader.browser.ts} (79%) create mode 100644 lib/loader/getPackageLoader.nodejs.ts create mode 100644 lib/loader/nopePackageLoader.nodejs.ts diff --git a/lib/cli/createService.ts b/lib/cli/createService.ts index 5e64618..05eb85b 100644 --- a/lib/cli/createService.ts +++ b/lib/cli/createService.ts @@ -65,25 +65,25 @@ export async function createService( parser.add_argument("--noFuncs", { help: "Prevents using Functions", - action: "storeTrue", + action: "store_true", dest: "noFuncs", }); parser.add_argument("--runInstances", { help: "Run instances provided in a packages.", - action: "storeTrue", + action: "store_true", dest: "runInstances", }); parser.add_argument("--runEveryService", { help: "Run instances provided in a packages.", - action: "storeTrue", + action: "store_true", dest: "runEveryService", }); parser.add_argument("--runExtra", { help: "Runs every instance in an extra Service", - action: "storeTrue", + action: "store_true", dest: "runExtra", }); @@ -329,7 +329,6 @@ export async function createService( __dirname, "..", "..", - "..", "lib", "templates", "linux.service.handlebars" @@ -347,7 +346,6 @@ export async function createService( __dirname, "..", "..", - "..", "lib", "templates", "index.js.handlebars" @@ -363,7 +361,6 @@ export async function createService( __dirname, "..", "..", - "..", "lib", "templates", "service.js.handlebars" diff --git a/lib/cli/generateFolderStructure.ts b/lib/cli/generateFolderStructure.ts index 594f8a2..f8bc985 100644 --- a/lib/cli/generateFolderStructure.ts +++ b/lib/cli/generateFolderStructure.ts @@ -14,31 +14,15 @@ import { getNopeLogger } from "../logger/getLogger"; const FOLDERS_TO_CREATE = [ "config", - "modules", - "open-api", - "pages", - join("public", "nope"), - join("dist", "modules"), + "modules" ]; const BASE_FOLDER = __dirname; const FILES_TO_COPY = [ - // Public-Files, like logo etc. - "/public/nope/logo_light.png", - "/public/nope/logo.png", - // Default-Pages - "/pages/_app.tsx", - "/pages/index.tsx", // Config-Files "tsconfig.json", - "tsconfigBackend.json", + "tsconfig.browser.json", // Doc-Files: "jsdoc.json", - // NextJS - "next.config.js", - "next-env.d.ts", - - // Package File: - "package.json", ]; export async function generateFolderStructure( diff --git a/lib/cli/nope.ts b/lib/cli/nope.ts index eab93ac..8ae5b70 100644 --- a/lib/cli/nope.ts +++ b/lib/cli/nope.ts @@ -41,11 +41,12 @@ export async function main() { console.log(`NoPE - Command Line Interface. Please select the option you want. Therefore add one of the following options: - \x1b[4mhelp\x1b[0m Show this help. - \x1b[4mrun\x1b[0m Start a NoPE-Backend. - \x1b[4minit\x1b[0m Initialize a new project. This project is empty. - \x1b[4mscan\x1b[0m Trys to update the configuration file. - \x1b[4mservice\x1b[0m Generate Helper Files to provide services + \x1b[4mhelp\x1b[0m Show this help. + \x1b[4mrun\x1b[0m Start a NoPE-Backend. + \x1b[4minit\x1b[0m Initialize a new project. This project is empty. + \x1b[4mscan\x1b[0m Trys to update the configuration file. + \x1b[4mservice\x1b[0m Generate Helper Files to provide services + \x1b[4mrepl\x1b[0m Opens an interactive console. Have fun using NoPE :) diff --git a/lib/cli/repl.ts b/lib/cli/repl.ts index 432b172..79e7cce 100644 --- a/lib/cli/repl.ts +++ b/lib/cli/repl.ts @@ -21,18 +21,25 @@ export async function repl( defaultValue?: any; }[] = [] ) { - const { dispatcher } = await run(additionalArguments); + const loader = await run( + additionalArguments, + { + // skipLoadingConfig: true + }, + true + ); const interactiveConsole = start({}); // Assing the context - interactiveConsole.context.dispatcher = dispatcher; + interactiveConsole.context.dispatcher = loader.dispatcher; + interactiveConsole.context.loader = loader; // Promise, that will be finished on exiting the interactive console. const promise = new Promise((resolve) => { interactiveConsole.once("exit", resolve); }); await promise; - await dispatcher.dispose(); + await loader.dispatcher.dispose(); } // If requested As Main => Perform the Operation. diff --git a/lib/cli/runNopeBackend.ts b/lib/cli/runNopeBackend.ts index 37da99d..1d2508d 100644 --- a/lib/cli/runNopeBackend.ts +++ b/lib/cli/runNopeBackend.ts @@ -17,7 +17,8 @@ import { validLayers, } from "../communication/getLayer.nodejs"; import { sleep } from "../helpers/async"; -import { getPackageLoader } from "../loader/getPackageLoader"; +import { deepClone } from "../helpers/objectMethods"; +import { getPackageLoader } from "../loader/getPackageLoader.browser"; import { loadFunctions, loadPackages } from "../loader/loadPackages"; import { generateLogfilePath, useLogFile } from "../logger/fileLogging"; import { getNopeLogger } from "../logger/getLogger"; @@ -30,6 +31,51 @@ import { import { INopePackageLoader } from "../types/nope/nopePackageLoader.interface"; import { NOPELOGO } from "./renderNope"; +export interface RunArgs { + file: string; + channel: validLayerOrMirror; + params: string; + // Flag to prevent loading the configuration + skipLoadingConfig: boolean; + // Level of the logger. + log: LoggerLevel; + // The Enable Singletons. Defaults to true + singleton: boolean; + // The default-selector to select the service providers + defaultSelector: ValidDefaultSelectors; + // The default-selector to select the service providers + dispatcherLogLevel: LoggerLevel; + // The default-selector to select the service providers + communicationLogLevel: LoggerLevel; + // Enable File-logging: + logToFile: boolean; + // Delay to wait for system beeing ready. + delay: number; + // Flag to force using the selectors. Might have a performance inpact. + forceUsingSelectors: boolean; + // Define the Timingsparameter + timings: Partial; + // Forces the Selectors + forceSelectors: boolean; +} + +export const DEFAULT_SETTINGS: RunArgs = { + file: "./config/settings.json", + channel: "event", + skipLoadingConfig: false, + params: "not-provided", + log: "debug", + singleton: true, + dispatcherLogLevel: "info", + communicationLogLevel: "info", + delay: 2, + forceSelectors: false, + timings: {}, + defaultSelector: "first", + forceUsingSelectors: false, + logToFile: false, +}; + /** * Helper Function to Read-In the Arguments used by the * cli-tool @@ -42,21 +88,9 @@ export async function readInArgs( type: "string" | "number"; name: string | string; defaultValue?: any; - }[] = [] -): Promise<{ - file: string; - channel: keyof typeof validLayers; - params?: string; - skipLoadingConfig?: boolean; - log: LoggerLevel; - forceEmittingUpdates?: boolean; - defaultSelector: ValidDefaultSelectors; - dispatcherLogLevel: LoggerLevel; - communicationLogLevel?: LoggerLevel; - logToFile?: boolean; - delay: number; - forceUsingSelectors?: boolean; -}> { + }[] = [], + forcedArgs: Partial = {} +): Promise { const parser = new ArgumentParser({ // version: "1.0.0", add_help: true, @@ -118,13 +152,6 @@ export async function readInArgs( dest: "defaultSelector", }); - parser.add_argument("--force-emit", { - help: "Forces emitting the events of the system. Otherwise, only subscribed events are emitted.", - action: "append", - nargs: "?", - dest: "forceEmittingUpdates", - }); - parser.add_argument("--log-to-file", { help: "Log will be stored in a logfile.", action: "append", @@ -173,84 +200,32 @@ export async function readInArgs( dest: "communicationLogLevel", }); - const args: { - file: string; - channel: keyof typeof validLayers; - params?: string; - skipLoadingConfig?: boolean; - log: LoggerLevel; - forceEmittingUpdates?: boolean; - defaultSelector: ValidDefaultSelectors; - dispatcherLogLevel: LoggerLevel; - communicationLogLevel?: LoggerLevel; - logToFile?: boolean; - delay: number; - forceUsingSelectors?: boolean; - } = parser.parse_args(); + const args: RunArgs = parser.parse_args(); if (args.params === "not-provided") { delete args.params; } args.skipLoadingConfig = Array.isArray(args.skipLoadingConfig); - args.forceEmittingUpdates = Array.isArray(args.forceEmittingUpdates); args.logToFile = Array.isArray(args.logToFile); args.forceUsingSelectors = Array.isArray(args.forceUsingSelectors); - return args; + return Object.assign(args, forcedArgs); } // Define the Main Function. // This function is used as cli tool. export async function runNopeBackend( - _args: { - file?: string; - channel?: validLayerOrMirror; - params?: string; - // Flag to prevent loading the configuration - skipLoadingConfig?: boolean; - // Flag to force sending updates. - forceEmittingUpdates?: boolean; - // Level of the logger. - log?: LoggerLevel; - // The Enable Singletons. Defaults to true - singleton?: boolean; - // The default-selector to select the service providers - defaultSelector?: ValidDefaultSelectors; - // The default-selector to select the service providers - dispatcherLogLevel?: LoggerLevel; - // The default-selector to select the service providers - communicationLogLevel?: LoggerLevel; - // Enable File-logging: - logToFile?: boolean; - // Delay to wait for system beeing ready. - delay?: number; - // Flag to force using the selectors. Might have a performance inpact. - forceUsingSelectors?: boolean; - // Define the Timingsparameter - timings?: Partial; - } = {} + _args: Partial = {} ): Promise { let opts: { params: string | number; }; - const args = Object.assign( - { - file: "./config/settings.json", - channel: "event", - skipLoadingConfig: false, - params: "not-provided", - log: "debug", - singleton: true, - dispatcherLogLevel: "info", - communicationLogLevel: "info", - delay: 2, - forceSelectors: false, - timings: {}, - }, - _args - ); + // Default Settings + const _defaultSettings: RunArgs = deepClone(DEFAULT_SETTINGS); + + const args = Object.assign(_defaultSettings, _args); try { // Try to read in the default config file. @@ -313,13 +288,9 @@ export async function runNopeBackend( logger.info("loading Functions"); await loadFunctions(args.file); } catch (e) { - logger.error( - "Unable to load the Packages defined in " + - args.file + - " See Output for detailled information", - e - ); - return; + logger.error("Unable to load the Packages defined in " + args.file); + logger.error("Returning without config. "); + args.skipLoadingConfig = true; } } @@ -355,13 +326,7 @@ export async function runNopeBackend( logger.info("loading Packages"); await loadPackages(loader, args.file, args.delay); } catch (e) { - logger.error( - "Unable to load the Packages defined in " + - args.file + - " See Output for detailled information", - e - ); - return; + logger.error("Unable to load the Packages defined in " + args.file); } } @@ -390,7 +355,9 @@ export async function run( type: "string" | "number"; name: string | string; defaultValue?: any; - }[] = [] + }[] = [], + forcedArgs: Partial = {}, + quite = false ) { // Subscribe to unhandled Reactions. process.on("unhandledRejection", (reason, p) => { @@ -402,10 +369,12 @@ export async function run( throw reason; }); - console.log(NOPELOGO); - console.log("\n\n"); + if (!quite) { + console.log(NOPELOGO); + console.log("\n\n"); + } - const args = await readInArgs(additionalArguments); + const args = await readInArgs(additionalArguments, forcedArgs); return await runNopeBackend(args); } diff --git a/lib/loader/getPackageLoader.ts b/lib/loader/getPackageLoader.browser.ts similarity index 79% rename from lib/loader/getPackageLoader.ts rename to lib/loader/getPackageLoader.browser.ts index ab172ed..2ee0d47 100644 --- a/lib/loader/getPackageLoader.ts +++ b/lib/loader/getPackageLoader.browser.ts @@ -7,6 +7,7 @@ */ import { getSingleton } from "../helpers/singletonMethod"; +import { INopePackageLoaderConstructor } from "../types/nope"; import { INopeDispatcherOptions } from "../types/nope/nopeDispatcher.interface"; import { generateNopeBasicPackage } from "./generateNopeBasicPackage"; import { NopePackageLoader } from "./nopePackageLoader"; @@ -17,11 +18,16 @@ import { NopePackageLoader } from "./nopePackageLoader"; */ export function getPackageLoader( options: INopeDispatcherOptions, - singleton = true + singleton = true, + constructorClass: INopePackageLoaderConstructor = null ) { + if (constructorClass === null || constructorClass === undefined) { + constructorClass = NopePackageLoader; + } + const create = () => { // Create a loader - const loader = new NopePackageLoader(); + const loader = new constructorClass(); // load the default Package: loader diff --git a/lib/loader/getPackageLoader.nodejs.ts b/lib/loader/getPackageLoader.nodejs.ts new file mode 100644 index 0000000..2045e97 --- /dev/null +++ b/lib/loader/getPackageLoader.nodejs.ts @@ -0,0 +1,26 @@ +/** + * @author Martin Karkowski + * @email m.karkowski@zema.de + * @create date 2020-11-06 14:20:32 + * @modify date 2021-08-11 19:59:47 + * @desc [description] + */ + +import { INopeDispatcherOptions } from "../types/nope/nopeDispatcher.interface"; +import { getPackageLoader as getBrowserPackageLoader } from "./getPackageLoader.browser"; +import { NopePackageLoaderFileAccess } from "./nopePackageLoader.nodejs"; + +/** + * Function to extract a Singleton Dispatcher + * @param options The provided options for the Dispatcher + */ +export function getPackageLoader( + options: INopeDispatcherOptions, + singleton = true +) { + return getBrowserPackageLoader( + options, + singleton, + NopePackageLoaderFileAccess + ); +} diff --git a/lib/loader/index.browser.ts b/lib/loader/index.browser.ts index d28b00c..6a4925e 100644 --- a/lib/loader/index.browser.ts +++ b/lib/loader/index.browser.ts @@ -7,5 +7,5 @@ */ export { generateNopeBasicPackage } from "./generateNopeBasicPackage"; -export { getPackageLoader } from "./getPackageLoader"; +export { getPackageLoader } from "./getPackageLoader.browser"; export { NopePackageLoader } from "./nopePackageLoader"; diff --git a/lib/loader/index.nodejs.ts b/lib/loader/index.nodejs.ts index ea6f5c8..21d8f99 100644 --- a/lib/loader/index.nodejs.ts +++ b/lib/loader/index.nodejs.ts @@ -6,7 +6,9 @@ * @desc [description] */ -export * from "./index.browser"; +export { generateNopeBasicPackage } from "./generateNopeBasicPackage"; +export { getPackageLoader } from "./getPackageLoader.nodejs"; +export { NopePackageLoaderFileAccess as NopePackageLoader } from "./nopePackageLoader.nodejs"; export { IConfigFile, IPackageConfig, diff --git a/lib/loader/nopePackageLoader.nodejs.ts b/lib/loader/nopePackageLoader.nodejs.ts new file mode 100644 index 0000000..c09b196 --- /dev/null +++ b/lib/loader/nopePackageLoader.nodejs.ts @@ -0,0 +1,34 @@ +/** + * @author Martin Karkowski + * @email m.karkowski@zema.de + * @create date 2018-07-01 09:10:35 + * @modify date 2022-01-10 16:24:45 + * @desc [description] + */ + +import { injectable } from "inversify"; +import { NopePackageLoader } from "nope_browser/dist/lib/loader/index.browser"; +import { resolve } from "path"; +import "reflect-metadata"; +import { IPackageDescription } from "../types/nope/nopePackage.interface"; + +/** + * Helper Class to Build an inversify Container. + * + * @export + * @class NopePackageLoader + * @implements {INopePackageLoader} + */ +@injectable() +export class NopePackageLoaderFileAccess extends NopePackageLoader { + async loadPackageFile(path: string, useAutostart = true, useInstance = true) { + const loadedPackage = (await import(resolve(path))) + .DESCRIPTION as IPackageDescription; + if (!useAutostart) { + loadedPackage.autostart = {}; + } + if (!useInstance) { + loadedPackage.defaultInstances = []; + } + } +} diff --git a/lib/types/nope/nopePackageLoader.interface.ts b/lib/types/nope/nopePackageLoader.interface.ts index 94d8291..ea43c4c 100644 --- a/lib/types/nope/nopePackageLoader.interface.ts +++ b/lib/types/nope/nopePackageLoader.interface.ts @@ -6,6 +6,10 @@ import { IPackageDescription, } from "./nopePackage.interface"; +export interface INopePackageLoaderConstructor { + new (): INopePackageLoader; +} + export interface INopePackageLoader { /** * Accessor for a Dispatcher; diff --git a/package.json b/package.json index 03793bf..9a7d570 100644 --- a/package.json +++ b/package.json @@ -2,7 +2,8 @@ "name": "nope", "version": "1.0.0", "description": "NoPE Runtime", - "main": "dist/index.browser.js", + "browser": "build/nope.js", + "main": "dist/index.nodejs.js", "files": [ "build", "dist",