qcobjects-cli 2.6.1 → 2.7.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +11 -0
- package/VERSION +1 -1
- package/package.json +6 -3
- package/public/cjs/cli-commands-lint.js +207 -0
- package/public/cjs/cli-commands-lint.js.map +1 -0
- package/public/cjs/cli-commands.js +2 -1
- package/public/cjs/cli-commands.js.map +1 -1
- package/public/cjs/collab-server.js +10 -9
- package/public/cjs/collab-server.js.map +1 -1
- package/public/cjs/defaultsettings.js +1 -1
- package/public/cjs/defaultsettings.js.map +1 -1
- package/public/cjs/main-http-gae-server.js +2 -2
- package/public/cjs/main-http-gae-server.js.map +1 -1
- package/public/cjs/main-http-server.js +2 -2
- package/public/cjs/main-http-server.js.map +1 -1
- package/public/cjs/main-http2-server.js +2 -2
- package/public/cjs/main-http2-server.js.map +1 -1
- package/public/cjs/qcobjects-shell.js +2 -2
- package/public/cjs/qcobjects-shell.js.map +1 -1
- package/public/esm/cli-commands-lint.mjs +139 -0
- package/public/esm/cli-commands-lint.mjs.map +7 -0
- package/public/esm/cli-commands.mjs +2 -0
- package/public/esm/cli-commands.mjs.map +2 -2
- package/public/esm/collab-server.mjs +2 -1
- package/public/esm/collab-server.mjs.map +2 -2
- package/public/esm/defaultsettings.mjs +2 -2
- package/public/esm/defaultsettings.mjs.map +2 -2
- package/public/esm/main-http-gae-server.mjs +3 -3
- package/public/esm/main-http-gae-server.mjs.map +2 -2
- package/public/esm/main-http-server.mjs +3 -3
- package/public/esm/main-http-server.mjs.map +2 -2
- package/public/esm/main-http2-server.mjs +3 -3
- package/public/esm/main-http2-server.mjs.map +2 -2
- package/public/esm/qcobjects-shell.mjs +2 -2
- package/public/esm/qcobjects-shell.mjs.map +2 -2
- package/public/types/index.d.ts +15 -0
- package/src/cli-commands-lint.ts +181 -0
- package/src/cli-commands.ts +2 -1
- package/src/collab-server.ts +2 -1
- package/src/defaultsettings.ts +2 -2
- package/src/main-http-gae-server.ts +3 -3
- package/src/main-http-server.ts +3 -3
- package/src/main-http2-server.ts +3 -3
- package/src/qcobjects-shell.ts +2 -2
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/main-http2-server.ts"],
|
|
4
|
-
"sourcesContent": ["/**\n * QCObjects Framework CLI\n * ________________\n *\n * Author: Jean Machuca <correojean@gmail.com>\n *\n * Cross Browser Javascript Framework for MVC Patterns\n * QCObjects is licensed under the MIT License\n * [LICENSE] (https://github.com/QCObjects/qcobjects-cli/blob/main/LICENSE.txt)\n *\n * Copyright (C) 2015 Jean Machuca,<correojean@gmail.com>\n *\n * Everyone is permitted to copy and distribute verbatim copies of this\n * license document, but changing it is not allowed.\n */\n/*eslint no-unused-vars: \"off\"*/\n/*eslint no-redeclare: \"off\"*/\n/*eslint no-empty: \"off\"*/\n/*eslint strict: \"off\"*/\n/*eslint no-mixed-operators: \"off\"*/\n/*eslint no-undef: \"off\"*/\n\"use strict\";\n\nimport { findPackageNodePath, Import, Package, InheritClass, CONFIG, logger, New, global, ClassFactory } from \"qcobjects\";\n\nimport mime from \"mime\";\nimport path from \"node:path\";\n\nimport http2 from \"node:http2\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport URL from \"node:url\";\nimport http from \"node:http\";\nimport { FileDispatcher } from \"./main-file\";\nimport { PipeLog } from \"./common-pipelog\";\n\nconst absolutePath = path.resolve(__dirname, \"./\");\n\nconst ImportMicroservice = function (microservicePackage: string) {\n var _ret_;\n var standardPath = findPackageNodePath(microservicePackage) || findPackageNodePath(microservicePackage + \".js\");\n if (standardPath !== null) {\n _ret_ = Import(microservicePackage);\n } else {\n var nonStandardPath = findPackageNodePath(absolutePath + \"/backend/\" + microservicePackage) || findPackageNodePath(absolutePath + \"/backend/\" + microservicePackage + \".js\");\n if (nonStandardPath !== null) {\n _ret_ = Import(absolutePath + \"/backend/\" + microservicePackage);\n } else {\n _ret_ = Promise.resolve((async () => (await import(microservicePackage)))());\n }\n }\n return _ret_;\n};\n\nclass HTTP2ServerResponse extends InheritClass {\n fileDispatcher: any;\n request: any;\n headers!: { [x: string]: string | number };\n stream: any;\n body: any;\n constructor({\n headers = {\n \":status\": 200,\n \"content-type\": \"text/html\",\n \"cache-control\": CONFIG.get(\"cacheControl\", \"max-age=31536000\")\n },\n body = \"\",\n request = null,\n fileDispatcher = null,\n stream = null\n }) {\n super();\n var self = this;\n self.request = request || {};\n self.stream = stream;\n self.headers = headers;\n self.body = body;\n self.fileDispatcher = fileDispatcher;\n \n // Initialize request properties if not set\n if (!self.request.scriptname || !self.request.pathname) {\n const defaultPath = \"/\";\n self.request.pathname = self.request.pathname || defaultPath;\n self.request.scriptname = self.request.scriptname || CONFIG.get(\"documentRootFileIndex\", \"index.html\");\n }\n\n // Ensure documentRoot is set\n if (!CONFIG.get(\"documentRoot\")) {\n CONFIG.set(\"documentRoot\", path.join(process.cwd(), \"public\"));\n }\n \n self._generateResponse();\n }\n\n sendFile(stream: { respondWithFD: (arg0: any, arg1: { \"content-length\": any; \"last-modified\": any; \"content-type\": any; \"cache-control\": any; }) => void; on: (arg0: string, arg1: { (): void; (): void; }) => void; end: () => void; respond: (arg0: { \":status\": number; \"content-type\": any; }) => void; write: (arg0: string) => void; }, fileName: string) {\n // read and send file content in the stream\n\n try {\n const fd = fs.openSync(fileName, \"r\");\n const stat = fs.fstatSync(fd);\n const headers = {\n \"content-length\": stat.size,\n \"last-modified\": stat.mtime.toUTCString(),\n \"content-type\": mime.getType(fileName),\n \"cache-control\": CONFIG.get(\"cacheControl\", \"max-age=31536000\")\n };\n stream.respondWithFD(fd, headers);\n stream.on(\"close\", () => {\n logger.debug(\"closing file \" + fileName);\n fs.closeSync(fd);\n });\n stream.end();\n\n } catch (e: any) {\n logger.debug(\"[HTTP2ServerResponse][sendFile][ERROR] Something went wrong when trying to send the response as file \" + fileName);\n if (e.errno == -2) {\n const headers = {\n \":status\": 404,\n \"content-type\": mime.getType(fileName)\n };\n stream.respond(headers);\n stream.write(\"<h1>404 - FILE NOT FOUND</h1>\");\n stream.on(\"close\", () => {\n logger.debug(\"closing file \" + fileName);\n });\n stream.end();\n }\n }\n }\n _generateResponse() {\n var response = this;\n response.fileDispatcher = New(FileDispatcher, {\n scriptname: response.request.scriptname,\n pathname: response.request.pathname,\n done(headers: { [x: string]: number; }, body: any, templateURI: any, isTemplate: any) {\n response.headers = headers;\n var stream = response.stream;\n if (isTemplate) {\n response.body = body;\n stream.respond(response.headers);\n stream.write(response.body);\n stream.end();\n } else if (headers[\":status\"] == 200) {\n response.sendFile(stream, templateURI);\n } else {\n stream.respond(response.headers);\n stream.end();\n }\n }\n });\n\n }\n\n}\n\nclass HTTP2ServerRequest extends InheritClass {\n constructor({\n scriptname = \"\",\n path = \"\",\n method = \"\",\n url = \"\",\n headers = null,\n flags = null,\n protocol = null,\n slashes = null,\n auth = null,\n host = null,\n port = null,\n hostname = null,\n hash = null,\n search = \"\",\n query = \"\",\n pathname = \"\",\n href = \"\"\n }) {\n super({\n scriptname,\n path,\n method,\n url,\n headers,\n flags,\n protocol,\n slashes,\n auth,\n host,\n port,\n hostname,\n hash,\n search,\n query,\n pathname,\n href\n });\n }\n}\n\n\n\nexport class HTTP2Server extends InheritClass {\n server!: http2.Http2SecureServer<typeof import(\"http\").IncomingMessage, typeof import(\"http\").ServerResponse, typeof http2.Http2ServerRequest, typeof http2.Http2ServerResponse>;\n interceptorInstances: any;\n request: any;\n response: any;\n constructor({\n request = null,\n response = \"\",\n server = null,\n scriptname = \"\",\n interceptorInstances = []\n }: { request: any, response: any, server?: any, scriptname: string, interceptorInstances: any[] }) {\n super({\n request,\n response,\n server,\n scriptname,\n interceptorInstances\n });\n\n const welcometo = \"Welcome to \\n\";\n const instructions = \"HTTP2Server \\n\";\n const logo = \" .d88888b. .d8888b. .d88888b. 888 d8b 888 \\r\\nd88P\\\" \\\"Y88bd88P Y88bd88P\\\" \\\"Y88b888 Y8P 888 \\r\\n888 888888 888888 888888 888 \\r\\n888 888888 888 88888888b. 8888 .d88b. .d8888b888888.d8888b \\r\\n888 888888 888 888888 \\\"88b \\\"888d8P Y8bd88P\\\" 888 88K \\r\\n888 Y8b 888888 888888 888888 888 88888888888888 888 \\\"Y8888b. \\r\\nY88b.Y8b88PY88b d88PY88b. .d88P888 d88P 888Y8b. Y88b. Y88b. X88 \\r\\n \\\"Y888888\\\" \\\"Y8888P\\\" \\\"Y88888P\\\" 88888P\\\" 888 \\\"Y8888 \\\"Y8888P \\\"Y888 88888P' \\r\\n Y8b 888 \\r\\n d88P \\r\\n 888P\\\" \";\n console.log(welcometo);\n console.log(logo);\n console.log(instructions);\n logger.debug(this.showIPAddress());\n logger.info(\"Listening on HTTP PORT: \" + CONFIG.get(\"serverPortHTTP\").toString());\n logger.info(\"Listening on HTTPS PORT: \" + CONFIG.get(\"serverPortHTTPS\").toString());\n logger.info(\"Go to: \\n\" + this.showPossibleURL());\n\n const http2ServerInstance = this;\n http2ServerInstance.server = http2.createSecureServer({\n key: fs.readFileSync(CONFIG.get(\"private-key-pem\")),\n cert: fs.readFileSync(CONFIG.get(\"private-cert-pem\")),\n allowHTTP1: CONFIG.get(\"allowHTTP1\"),\n origins: [\"https://\" + CONFIG.get(\"domain\"), \"http://\" + CONFIG.get(\"domain\")]\n });\n server = http2ServerInstance.server;\n\n server.on(\"error\", (err: any) => console.error(err));\n\n server.on(\"session\", (session: { altsvc: (arg0: string, arg1: string) => void; origin: (arg0: string, arg1: string) => void; }) => {\n // Set altsvc for origin https://example.org:80\n session.altsvc(\"h2=\\\":8000\\\"\", \"https://\" + CONFIG.get(\"domain\"));\n session.altsvc(\"https=\\\":\" + CONFIG.get(\"serverPortHTTPS\") + \"\\\"\", \"https://\" + CONFIG.get(\"domain\"));\n session.altsvc(\"http=\\\":\" + CONFIG.get(\"serverPortHTTP\") + \"\\\"\", \"http://\" + CONFIG.get(\"domain\"));\n session.origin(\"https://\" + CONFIG.get(\"domain\"), \"http://\" + CONFIG.get(\"domain\"));\n\n });\n\n if (global.get(\"backendAvailable\")) {\n logger.info(\"Loading backend interceptors...\");\n const interceptors = CONFIG.get(\"backend\", {}).interceptors;\n if (typeof interceptors !== \"undefined\") {\n logger.info(\"Backend Interceptors Available\");\n interceptors.map((interceptor: { microservice: string; }) => {\n ImportMicroservice(interceptor.microservice);\n var interceptorClassFactory = ClassFactory(interceptor.microservice + \".Interceptor\");\n var interceptorInstance = New(interceptorClassFactory, {\n domain: CONFIG.get(\"domain\"),\n basePath: CONFIG.get(\"basePath\"),\n projectPath: CONFIG.get(\"projectPath\"),\n interceptor: interceptor,\n server: server\n });\n http2ServerInstance.interceptorInstances.push(interceptorInstance);\n });\n }\n }\n\n server.on(\"stream\", (stream: { session: { setTimeout: (arg0: any) => void; setMaxListeners: (arg0: number) => void; removeListener: (arg0: string, arg1: () => void) => void; on: (arg0: string, arg1: () => void) => void; altsvc: (arg0: string, arg1: any) => void; }; destroyed: any; respond: (arg0: { \":status\": number; \"content-type\": string; }) => void; on: (arg0: string, arg1: () => void) => void; write: (arg0: string) => void; end: () => void; id: any; }, headers: { [x: string]: any; }, flags: any) => {\n CONFIG.set(\"backendTimeout\", CONFIG.get(\"backendTimeout\") || 20000);\n stream.session.setTimeout(CONFIG.get(\"backendTimeout\"));\n stream.session.setMaxListeners(9999999999);\n var timeoutHandler = () => {\n // end the stream on timeout\n try {\n if (!stream.destroyed) {\n logger.info(\"A timeout occurred... \" + CONFIG.get(\"backendTimeout\").toString());\n logger.info(\"Killing session...\");\n stream.respond({\n \":status\": 500,\n \"content-type\": \"text/html\"\n });\n stream.on(\"error\", () => { });\n stream.write(\"<h1>500 - INTERNAL SERVER ERROR (TIMEOUT)</h1>\");\n stream.end();\n } else {\n logger.debug(\"Session was normally finishing...\");\n }\n } catch (e: any) {\n logger.debug(`An unhandled error occurred during timeout catching: ${e}`);\n }\n\n if (!stream.destroyed) {\n stream.session.removeListener(\"timeout\", timeoutHandler);\n } else {\n server.removeListener(\"timeout\", timeoutHandler);\n }\n\n };\n if (!stream.destroyed) {\n stream.session.on(\"timeout\", timeoutHandler);\n }\n\n stream.session.altsvc(\"h2=\\\":8000\\\"\", stream.id);\n stream.session.altsvc(\"https=\\\":\" + CONFIG.get(\"serverPortHTTPS\") + \"\\\"\", stream.id);\n stream.session.altsvc(\"http=\\\":\" + CONFIG.get(\"serverPortHTTP\") + \"\\\"\", stream.id);\n const request = Object.assign(New(HTTP2ServerRequest), URL.parse(headers[\":path\"]));\n request.headers = headers;\n request.flags = flags;\n http2ServerInstance.request = request;\n http2ServerInstance.request.method = headers[\":method\"];\n http2ServerInstance.request.path = headers[\":path\"];\n\n // Fix pathname and scriptname initialization\n const pathParts = http2ServerInstance.request.pathname.split(\"/\");\n if (pathParts.length > 0) {\n if (http2ServerInstance.request.pathname.indexOf(\".\") < 0) {\n http2ServerInstance.request.scriptname = CONFIG.get(\"documentRootFileIndex\", \"index.html\");\n // Keep the original pathname as is, no need to reassign\n } else {\n http2ServerInstance.request.scriptname = pathParts[pathParts.length - 1];\n http2ServerInstance.request.pathname = http2ServerInstance.request.pathname.substr(0, http2ServerInstance.request.pathname.lastIndexOf(\"/\"));\n }\n } else {\n http2ServerInstance.request.scriptname = CONFIG.get(\"documentRootFileIndex\", \"index.html\");\n http2ServerInstance.request.pathname = \"/\";\n }\n\n logger.debug(PipeLog.pipe(this.request));\n\n if (global.get(\"backendAvailable\")) {\n logger.info(\"Backend Microservices Available...\");\n\n logger.info(\"Loading backend routes...\");\n const routes = CONFIG.get(\"backend\", {}).routes;\n const selectedRoute = routes.filter((route: { path: string; }) => {\n const standardRoutePath = route.path.replace(/{(.*?)}/g, \"(?<$1>.*)\");\n return (new RegExp(standardRoutePath, \"g\")).test(request.path);\n });\n if (selectedRoute.length > 0) {\n selectedRoute.map((route: { path: string; microservice: string; }) => {\n const standardRoutePath = route.path.replace(/{(.*?)}/g, \"(?<$1>.*)\"); //allowing {param}\n console.log(standardRoutePath);\n const selectedRouteParams = {\n ...[...request.path.matchAll((new RegExp(standardRoutePath, \"g\")))][0][\"groups\"]\n };\n ImportMicroservice(route.microservice).then(function () {\n logger.debug(`Trying to execute ${route.microservice + \".Microservice\"}...`);\n var microServiceClassFactory = ClassFactory(route.microservice + \".Microservice\");\n if (typeof microServiceClassFactory !== \"undefined\") {\n http2ServerInstance.response = New(microServiceClassFactory, {\n domain: CONFIG.get(\"domain\"),\n basePath: CONFIG.get(\"basePath\"),\n projectPath: CONFIG.get(\"projectPath\"),\n route: route,\n routeParams: selectedRouteParams,\n server: server,\n stream: stream,\n request: request\n });\n\n } else {\n throw Error(`${route.microservice + \".Microservice\"} not defined.`);\n }\n }).catch((e: string | undefined) => {\n throw Error(e);\n });\n });\n } else {\n this.response = New(HTTP2ServerResponse, {\n domain: CONFIG.get(\"domain\"),\n basePath: CONFIG.get(\"basePath\"),\n projectPath: CONFIG.get(\"projectPath\"),\n server: server,\n stream: stream,\n request: request\n });\n }\n\n } else {\n // ...\n\n this.response = New(HTTP2ServerResponse, {\n domain: CONFIG.get(\"domain\"),\n basePath: CONFIG.get(\"basePath\"),\n projectPath: CONFIG.get(\"projectPath\"),\n server: server,\n stream: stream,\n request: request\n });\n\n }\n\n });\n\n }\n\n showIPAddress() {\n var _ret_ = \"\";\n var ifaces = os.networkInterfaces();\n Object.keys(ifaces).forEach(function (iface) {\n ifaces[iface]?.map(function (ipGroup: any) {\n _ret_ += iface + \": \" + PipeLog.pipe(ipGroup) + \"\\n\";\n });\n });\n return _ret_;\n }\n showPossibleURL(): string {\n let _ret_ = \"\";\n const ifaces = os.networkInterfaces();\n Object.keys(ifaces).forEach((iface) => {\n ifaces[iface]?.forEach((ipGroup: any) => {\n if (ipGroup.family.toLowerCase() === \"ipv4\") {\n _ret_ += `http://${ipGroup.address}:${CONFIG.get(\"serverPortHTTP\")}/\\n`;\n _ret_ += `https://${ipGroup.address}:${CONFIG.get(\"serverPortHTTPS\")}/\\n`;\n }\n });\n });\n return _ret_;\n }\n\n start() {\n var server = this.server;\n\n // http2 port is 8443 but normally is used 443 by replacing current https\n\n\n const httpServer = http.createServer((req , res) => {\n res.writeHead(301, {\n Location: `https://${req.headers.host}${req.url}`\n });\n res.end();\n });\n\n httpServer.listen(CONFIG.get(\"serverPortHTTP\"));\n server.listen(CONFIG.get(\"serverPortHTTPS\"));\n }\n\n}\n\nPackage(\"org.quickcorp.qcobjects.main.http2.server\", [\n HTTP2ServerResponse, HTTP2ServerRequest, HTTP2Server\n\n]);\n\n\n\n\n"],
|
|
5
|
-
"mappings": ";;AAuBA,SAAS,qBAAqB,QAAQ,SAAS,cAAc,QAAQ,QAAQ,KAAK,
|
|
4
|
+
"sourcesContent": ["/**\n * QCObjects Framework CLI\n * ________________\n *\n * Author: Jean Machuca <correojean@gmail.com>\n *\n * Cross Browser Javascript Framework for MVC Patterns\n * QCObjects is licensed under the MIT License\n * [LICENSE] (https://github.com/QCObjects/qcobjects-cli/blob/main/LICENSE.txt)\n *\n * Copyright (C) 2015 Jean Machuca,<correojean@gmail.com>\n *\n * Everyone is permitted to copy and distribute verbatim copies of this\n * license document, but changing it is not allowed.\n */\n/*eslint no-unused-vars: \"off\"*/\n/*eslint no-redeclare: \"off\"*/\n/*eslint no-empty: \"off\"*/\n/*eslint strict: \"off\"*/\n/*eslint no-mixed-operators: \"off\"*/\n/*eslint no-undef: \"off\"*/\n\"use strict\";\n\nimport { findPackageNodePath, Import, Package, InheritClass, CONFIG, logger, New, get, ClassFactory } from \"qcobjects\";\n\nimport mime from \"mime\";\nimport path from \"node:path\";\n\nimport http2 from \"node:http2\";\nimport fs from \"node:fs\";\nimport os from \"node:os\";\nimport URL from \"node:url\";\nimport http from \"node:http\";\nimport { FileDispatcher } from \"./main-file\";\nimport { PipeLog } from \"./common-pipelog\";\n\nconst absolutePath = path.resolve(__dirname, \"./\");\n\nconst ImportMicroservice = function (microservicePackage: string) {\n var _ret_;\n var standardPath = findPackageNodePath(microservicePackage) || findPackageNodePath(microservicePackage + \".js\");\n if (standardPath !== null) {\n _ret_ = Import(microservicePackage);\n } else {\n var nonStandardPath = findPackageNodePath(absolutePath + \"/backend/\" + microservicePackage) || findPackageNodePath(absolutePath + \"/backend/\" + microservicePackage + \".js\");\n if (nonStandardPath !== null) {\n _ret_ = Import(absolutePath + \"/backend/\" + microservicePackage);\n } else {\n _ret_ = Promise.resolve((async () => (await import(microservicePackage)))());\n }\n }\n return _ret_;\n};\n\nclass HTTP2ServerResponse extends InheritClass {\n fileDispatcher: any;\n request: any;\n headers!: { [x: string]: string | number };\n stream: any;\n body: any;\n constructor({\n headers = {\n \":status\": 200,\n \"content-type\": \"text/html\",\n \"cache-control\": CONFIG.get(\"cacheControl\", \"max-age=31536000\")\n },\n body = \"\",\n request = null,\n fileDispatcher = null,\n stream = null\n }) {\n super();\n var self = this;\n self.request = request || {};\n self.stream = stream;\n self.headers = headers;\n self.body = body;\n self.fileDispatcher = fileDispatcher;\n \n // Initialize request properties if not set\n if (!self.request.scriptname || !self.request.pathname) {\n const defaultPath = \"/\";\n self.request.pathname = self.request.pathname || defaultPath;\n self.request.scriptname = self.request.scriptname || CONFIG.get(\"documentRootFileIndex\", \"index.html\");\n }\n\n // Ensure documentRoot is set\n if (!CONFIG.get(\"documentRoot\")) {\n CONFIG.set(\"documentRoot\", path.join(process.cwd(), \"public\"));\n }\n \n self._generateResponse();\n }\n\n sendFile(stream: { respondWithFD: (arg0: any, arg1: { \"content-length\": any; \"last-modified\": any; \"content-type\": any; \"cache-control\": any; }) => void; on: (arg0: string, arg1: { (): void; (): void; }) => void; end: () => void; respond: (arg0: { \":status\": number; \"content-type\": any; }) => void; write: (arg0: string) => void; }, fileName: string) {\n // read and send file content in the stream\n\n try {\n const fd = fs.openSync(fileName, \"r\");\n const stat = fs.fstatSync(fd);\n const headers = {\n \"content-length\": stat.size,\n \"last-modified\": stat.mtime.toUTCString(),\n \"content-type\": mime.getType(fileName),\n \"cache-control\": CONFIG.get(\"cacheControl\", \"max-age=31536000\")\n };\n stream.respondWithFD(fd, headers);\n stream.on(\"close\", () => {\n logger.debug(\"closing file \" + fileName);\n fs.closeSync(fd);\n });\n stream.end();\n\n } catch (e: any) {\n logger.debug(\"[HTTP2ServerResponse][sendFile][ERROR] Something went wrong when trying to send the response as file \" + fileName);\n if (e.errno == -2) {\n const headers = {\n \":status\": 404,\n \"content-type\": mime.getType(fileName)\n };\n stream.respond(headers);\n stream.write(\"<h1>404 - FILE NOT FOUND</h1>\");\n stream.on(\"close\", () => {\n logger.debug(\"closing file \" + fileName);\n });\n stream.end();\n }\n }\n }\n _generateResponse() {\n var response = this;\n response.fileDispatcher = New(FileDispatcher, {\n scriptname: response.request.scriptname,\n pathname: response.request.pathname,\n done(headers: { [x: string]: number; }, body: any, templateURI: any, isTemplate: any) {\n response.headers = headers;\n var stream = response.stream;\n if (isTemplate) {\n response.body = body;\n stream.respond(response.headers);\n stream.write(response.body);\n stream.end();\n } else if (headers[\":status\"] == 200) {\n response.sendFile(stream, templateURI);\n } else {\n stream.respond(response.headers);\n stream.end();\n }\n }\n });\n\n }\n\n}\n\nclass HTTP2ServerRequest extends InheritClass {\n constructor({\n scriptname = \"\",\n path = \"\",\n method = \"\",\n url = \"\",\n headers = null,\n flags = null,\n protocol = null,\n slashes = null,\n auth = null,\n host = null,\n port = null,\n hostname = null,\n hash = null,\n search = \"\",\n query = \"\",\n pathname = \"\",\n href = \"\"\n }) {\n super({\n scriptname,\n path,\n method,\n url,\n headers,\n flags,\n protocol,\n slashes,\n auth,\n host,\n port,\n hostname,\n hash,\n search,\n query,\n pathname,\n href\n });\n }\n}\n\n\n\nexport class HTTP2Server extends InheritClass {\n server!: http2.Http2SecureServer<typeof import(\"http\").IncomingMessage, typeof import(\"http\").ServerResponse, typeof http2.Http2ServerRequest, typeof http2.Http2ServerResponse>;\n interceptorInstances: any;\n request: any;\n response: any;\n constructor({\n request = null,\n response = \"\",\n server = null,\n scriptname = \"\",\n interceptorInstances = []\n }: { request: any, response: any, server?: any, scriptname: string, interceptorInstances: any[] }) {\n super({\n request,\n response,\n server,\n scriptname,\n interceptorInstances\n });\n\n const welcometo = \"Welcome to \\n\";\n const instructions = \"HTTP2Server \\n\";\n const logo = \" .d88888b. .d8888b. .d88888b. 888 d8b 888 \\r\\nd88P\\\" \\\"Y88bd88P Y88bd88P\\\" \\\"Y88b888 Y8P 888 \\r\\n888 888888 888888 888888 888 \\r\\n888 888888 888 88888888b. 8888 .d88b. .d8888b888888.d8888b \\r\\n888 888888 888 888888 \\\"88b \\\"888d8P Y8bd88P\\\" 888 88K \\r\\n888 Y8b 888888 888888 888888 888 88888888888888 888 \\\"Y8888b. \\r\\nY88b.Y8b88PY88b d88PY88b. .d88P888 d88P 888Y8b. Y88b. Y88b. X88 \\r\\n \\\"Y888888\\\" \\\"Y8888P\\\" \\\"Y88888P\\\" 88888P\\\" 888 \\\"Y8888 \\\"Y8888P \\\"Y888 88888P' \\r\\n Y8b 888 \\r\\n d88P \\r\\n 888P\\\" \";\n console.log(welcometo);\n console.log(logo);\n console.log(instructions);\n logger.debug(this.showIPAddress());\n logger.info(\"Listening on HTTP PORT: \" + CONFIG.get(\"serverPortHTTP\").toString());\n logger.info(\"Listening on HTTPS PORT: \" + CONFIG.get(\"serverPortHTTPS\").toString());\n logger.info(\"Go to: \\n\" + this.showPossibleURL());\n\n const http2ServerInstance = this;\n http2ServerInstance.server = http2.createSecureServer({\n key: fs.readFileSync(CONFIG.get(\"private-key-pem\")),\n cert: fs.readFileSync(CONFIG.get(\"private-cert-pem\")),\n allowHTTP1: CONFIG.get(\"allowHTTP1\"),\n origins: [\"https://\" + CONFIG.get(\"domain\"), \"http://\" + CONFIG.get(\"domain\")]\n });\n server = http2ServerInstance.server;\n\n server.on(\"error\", (err: any) => console.error(err));\n\n server.on(\"session\", (session: { altsvc: (arg0: string, arg1: string) => void; origin: (arg0: string, arg1: string) => void; }) => {\n // Set altsvc for origin https://example.org:80\n session.altsvc(\"h2=\\\":8000\\\"\", \"https://\" + CONFIG.get(\"domain\"));\n session.altsvc(\"https=\\\":\" + CONFIG.get(\"serverPortHTTPS\") + \"\\\"\", \"https://\" + CONFIG.get(\"domain\"));\n session.altsvc(\"http=\\\":\" + CONFIG.get(\"serverPortHTTP\") + \"\\\"\", \"http://\" + CONFIG.get(\"domain\"));\n session.origin(\"https://\" + CONFIG.get(\"domain\"), \"http://\" + CONFIG.get(\"domain\"));\n\n });\n\n if (get(\"backendAvailable\")) {\n logger.info(\"Loading backend interceptors...\");\n const interceptors = CONFIG.get(\"backend\", {}).interceptors;\n if (typeof interceptors !== \"undefined\") {\n logger.info(\"Backend Interceptors Available\");\n interceptors.map((interceptor: { microservice: string; }) => {\n ImportMicroservice(interceptor.microservice);\n var interceptorClassFactory = ClassFactory(interceptor.microservice + \".Interceptor\");\n var interceptorInstance = New(interceptorClassFactory, {\n domain: CONFIG.get(\"domain\"),\n basePath: CONFIG.get(\"basePath\"),\n projectPath: CONFIG.get(\"projectPath\"),\n interceptor: interceptor,\n server: server\n });\n http2ServerInstance.interceptorInstances.push(interceptorInstance);\n });\n }\n }\n\n server.on(\"stream\", (stream: { session: { setTimeout: (arg0: any) => void; setMaxListeners: (arg0: number) => void; removeListener: (arg0: string, arg1: () => void) => void; on: (arg0: string, arg1: () => void) => void; altsvc: (arg0: string, arg1: any) => void; }; destroyed: any; respond: (arg0: { \":status\": number; \"content-type\": string; }) => void; on: (arg0: string, arg1: () => void) => void; write: (arg0: string) => void; end: () => void; id: any; }, headers: { [x: string]: any; }, flags: any) => {\n CONFIG.set(\"backendTimeout\", CONFIG.get(\"backendTimeout\") || 20000);\n stream.session.setTimeout(CONFIG.get(\"backendTimeout\"));\n stream.session.setMaxListeners(9999999999);\n var timeoutHandler = () => {\n // end the stream on timeout\n try {\n if (!stream.destroyed) {\n logger.info(\"A timeout occurred... \" + CONFIG.get(\"backendTimeout\").toString());\n logger.info(\"Killing session...\");\n stream.respond({\n \":status\": 500,\n \"content-type\": \"text/html\"\n });\n stream.on(\"error\", () => { });\n stream.write(\"<h1>500 - INTERNAL SERVER ERROR (TIMEOUT)</h1>\");\n stream.end();\n } else {\n logger.debug(\"Session was normally finishing...\");\n }\n } catch (e: any) {\n logger.debug(`An unhandled error occurred during timeout catching: ${e}`);\n }\n\n if (!stream.destroyed) {\n stream.session.removeListener(\"timeout\", timeoutHandler);\n } else {\n server.removeListener(\"timeout\", timeoutHandler);\n }\n\n };\n if (!stream.destroyed) {\n stream.session.on(\"timeout\", timeoutHandler);\n }\n\n stream.session.altsvc(\"h2=\\\":8000\\\"\", stream.id);\n stream.session.altsvc(\"https=\\\":\" + CONFIG.get(\"serverPortHTTPS\") + \"\\\"\", stream.id);\n stream.session.altsvc(\"http=\\\":\" + CONFIG.get(\"serverPortHTTP\") + \"\\\"\", stream.id);\n const request = Object.assign(New(HTTP2ServerRequest), URL.parse(headers[\":path\"]));\n request.headers = headers;\n request.flags = flags;\n http2ServerInstance.request = request;\n http2ServerInstance.request.method = headers[\":method\"];\n http2ServerInstance.request.path = headers[\":path\"];\n\n // Fix pathname and scriptname initialization\n const pathParts = http2ServerInstance.request.pathname.split(\"/\");\n if (pathParts.length > 0) {\n if (http2ServerInstance.request.pathname.indexOf(\".\") < 0) {\n http2ServerInstance.request.scriptname = CONFIG.get(\"documentRootFileIndex\", \"index.html\");\n // Keep the original pathname as is, no need to reassign\n } else {\n http2ServerInstance.request.scriptname = pathParts[pathParts.length - 1];\n http2ServerInstance.request.pathname = http2ServerInstance.request.pathname.substr(0, http2ServerInstance.request.pathname.lastIndexOf(\"/\"));\n }\n } else {\n http2ServerInstance.request.scriptname = CONFIG.get(\"documentRootFileIndex\", \"index.html\");\n http2ServerInstance.request.pathname = \"/\";\n }\n\n logger.debug(PipeLog.pipe(this.request));\n\n if (get(\"backendAvailable\")) {\n logger.info(\"Backend Microservices Available...\");\n\n logger.info(\"Loading backend routes...\");\n const routes = CONFIG.get(\"backend\", {}).routes;\n const selectedRoute = routes.filter((route: { path: string; }) => {\n const standardRoutePath = route.path.replace(/{(.*?)}/g, \"(?<$1>.*)\");\n return (new RegExp(standardRoutePath, \"g\")).test(request.path);\n });\n if (selectedRoute.length > 0) {\n selectedRoute.map((route: { path: string; microservice: string; }) => {\n const standardRoutePath = route.path.replace(/{(.*?)}/g, \"(?<$1>.*)\"); //allowing {param}\n console.log(standardRoutePath);\n const selectedRouteParams = {\n ...[...request.path.matchAll((new RegExp(standardRoutePath, \"g\")))][0][\"groups\"]\n };\n ImportMicroservice(route.microservice).then(function () {\n logger.debug(`Trying to execute ${route.microservice + \".Microservice\"}...`);\n var microServiceClassFactory = ClassFactory(route.microservice + \".Microservice\");\n if (typeof microServiceClassFactory !== \"undefined\") {\n http2ServerInstance.response = New(microServiceClassFactory, {\n domain: CONFIG.get(\"domain\"),\n basePath: CONFIG.get(\"basePath\"),\n projectPath: CONFIG.get(\"projectPath\"),\n route: route,\n routeParams: selectedRouteParams,\n server: server,\n stream: stream,\n request: request\n });\n\n } else {\n throw Error(`${route.microservice + \".Microservice\"} not defined.`);\n }\n }).catch((e: string | undefined) => {\n throw Error(e);\n });\n });\n } else {\n this.response = New(HTTP2ServerResponse, {\n domain: CONFIG.get(\"domain\"),\n basePath: CONFIG.get(\"basePath\"),\n projectPath: CONFIG.get(\"projectPath\"),\n server: server,\n stream: stream,\n request: request\n });\n }\n\n } else {\n // ...\n\n this.response = New(HTTP2ServerResponse, {\n domain: CONFIG.get(\"domain\"),\n basePath: CONFIG.get(\"basePath\"),\n projectPath: CONFIG.get(\"projectPath\"),\n server: server,\n stream: stream,\n request: request\n });\n\n }\n\n });\n\n }\n\n showIPAddress() {\n var _ret_ = \"\";\n var ifaces = os.networkInterfaces();\n Object.keys(ifaces).forEach(function (iface) {\n ifaces[iface]?.map(function (ipGroup: any) {\n _ret_ += iface + \": \" + PipeLog.pipe(ipGroup) + \"\\n\";\n });\n });\n return _ret_;\n }\n showPossibleURL(): string {\n let _ret_ = \"\";\n const ifaces = os.networkInterfaces();\n Object.keys(ifaces).forEach((iface) => {\n ifaces[iface]?.forEach((ipGroup: any) => {\n if (ipGroup.family.toLowerCase() === \"ipv4\") {\n _ret_ += `http://${ipGroup.address}:${CONFIG.get(\"serverPortHTTP\")}/\\n`;\n _ret_ += `https://${ipGroup.address}:${CONFIG.get(\"serverPortHTTPS\")}/\\n`;\n }\n });\n });\n return _ret_;\n }\n\n start() {\n var server = this.server;\n\n // http2 port is 8443 but normally is used 443 by replacing current https\n\n\n const httpServer = http.createServer((req , res) => {\n res.writeHead(301, {\n Location: `https://${req.headers.host}${req.url}`\n });\n res.end();\n });\n\n httpServer.listen(CONFIG.get(\"serverPortHTTP\"));\n server.listen(CONFIG.get(\"serverPortHTTPS\"));\n }\n\n}\n\nPackage(\"org.quickcorp.qcobjects.main.http2.server\", [\n HTTP2ServerResponse, HTTP2ServerRequest, HTTP2Server\n\n]);\n\n\n\n\n"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["path", "request"]
|
|
7
7
|
}
|
|
@@ -45,11 +45,11 @@ Y88b.Y8b88PY88b d88PY88b. .d88P888 d88P 888Y8b. Y88b. Y88b. X88 \r
|
|
|
45
45
|
__dirname: "./",
|
|
46
46
|
__filename: "qcobjects-shell-file.js"
|
|
47
47
|
};
|
|
48
|
-
|
|
48
|
+
globalThis.context = vm.createContext(sandbox);
|
|
49
49
|
const runScript = /* @__PURE__ */ __name((code, logOutput = false) => {
|
|
50
50
|
const options = { filename: sandbox.__filename };
|
|
51
51
|
const backgroundRunScript = /* @__PURE__ */ __name((code2) => {
|
|
52
|
-
var output2 = vm.runInContext(code2,
|
|
52
|
+
var output2 = vm.runInContext(code2, globalThis.context, options);
|
|
53
53
|
return output2;
|
|
54
54
|
}, "backgroundRunScript");
|
|
55
55
|
var output = backgroundRunScript(code);
|
|
@@ -1,7 +1,7 @@
|
|
|
1
1
|
{
|
|
2
2
|
"version": 3,
|
|
3
3
|
"sources": ["../../src/qcobjects-shell.ts"],
|
|
4
|
-
"sourcesContent": ["#!/usr/bin/env node\n/**\n * QCObjects Framework CLI\n * ________________\n *\n * Author: Jean Machuca <correojean@gmail.com>\n *\n * Cross Browser Javascript Framework for MVC Patterns\n * QCObjects is licensed under the MIT License\n * [LICENSE] (https://github.com/QCObjects/qcobjects-cli/blob/main/LICENSE.txt)\n *\n * Copyright (C) 2015 Jean Machuca,<correojean@gmail.com>\n *\n * Everyone is permitted to copy and distribute verbatim copies of this\n * license document, but changing it is not allowed.\n*/\n/*eslint no-unused-vars: \"off\"*/\n/*eslint no-redeclare: \"off\"*/\n/*eslint no-empty: \"off\"*/\n/*eslint strict: \"off\"*/\n/*eslint no-mixed-operators: \"off\"*/\n/*eslint no-undef: \"off\"*/\n\"use strict\";\n\nconst welcometo = \"Welcome to \\n\";\nconst instructions = \"Type:\\n .exit to quit\\n .help for see a quick guide\\n And any other command to execute like pure javascript \\n All the QCObjects stuff is already loaded for you\";\n//const logo = ' .88888. a88888b. .88888. dP oo dP \\r\\nd8\\' `8b d8\\' `88 d8\\' `8b 88 88 \\r\\n88 88 88 88 88 88d888b. dP .d8888b. .d8888b. d8888P .d8888b. \\r\\n88 db 88 88 88 88 88\\' `88 88 88ooood8 88\\' `\\\"\\\" 88 Y8ooooo. \\r\\nY8. Y88P Y8. .88 Y8. .8P 88. .88 88 88. ... 88. ... 88 88 \\r\\n `8888PY8b Y88888P\\' `8888P\\' 88Y8888\\' 88 `88888P\\' `88888P\\' dP `88888P\\' \\r\\noooooooooooooooooooooooooooooooooooooooo88~oooooooooooooooooooooooooooooooooo\\r\\n dP ';\nconst logo = \" .d88888b. .d8888b. .d88888b. 888 d8b 888 \\r\\nd88P\\\" \\\"Y88bd88P Y88bd88P\\\" \\\"Y88b888 Y8P 888 \\r\\n888 888888 888888 888888 888 \\r\\n888 888888 888 88888888b. 8888 .d88b. .d8888b888888.d8888b \\r\\n888 888888 888 888888 \\\"88b \\\"888d8P Y8bd88P\\\" 888 88K \\r\\n888 Y8b 888888 888888 888888 888 88888888888888 888 \\\"Y8888b. \\r\\nY88b.Y8b88PY88b d88PY88b. .d88P888 d88P 888Y8b. Y88b. Y88b. X88 \\r\\n \\\"Y888888\\\" \\\"Y8888P\\\" \\\"Y88888P\\\" 88888P\\\" 888 \\\"Y8888 \\\"Y8888P \\\"Y888 88888P' \\r\\n Y8b 888 \\r\\n d88P \\r\\n 888P\\\" \";\nimport path from \"path\";\nconst absolutePath = path.resolve( __dirname, \"./\" );\n\nimport vm from \"vm\";\n\nimport {InheritClass, global} from \"qcobjects\";\nimport \"./defaultsettings\";\nimport readline from \"readline\";\n\n\nclass Main extends InheritClass {\n constructor(){\n super();\n this.start();\n }\n\n start (){\n const sandbox = {\n require:require,\n module:module,\n __dirname:\"./\",\n __filename:\"qcobjects-shell-file.js\"\n };\n
|
|
5
|
-
"mappings": ";;;;;;;;;;;AA4BA,OAAO,UAAU;AAGjB,OAAO,QAAQ;AAEf,SAAQ,cAAc,cAAa;AACnC,OAAO;AACP,OAAO,cAAc;AAnCrB;AAAA;AAwBA,UAAM,YAAY;AAClB,UAAM,eAAe;AAErB,UAAM,OAAO;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAAA;AAEb,UAAM,eAAe,KAAK,QAAS,WAAW,IAAK;AAAA,IASnD,MAAM,aAAa,aAAa;AAAA,MAtChC,OAsCgC;AAAA;AAAA;AAAA,MAC9B,cAAa;AACX,cAAM;AACN,aAAK,MAAM;AAAA,MACb;AAAA,MAEA,QAAQ;AACN,cAAM,UAAU;AAAA,UACd;AAAA,UACA;AAAA,UACA,WAAU;AAAA,UACV,YAAW;AAAA,QACb;AACA,
|
|
4
|
+
"sourcesContent": ["#!/usr/bin/env node\n/**\n * QCObjects Framework CLI\n * ________________\n *\n * Author: Jean Machuca <correojean@gmail.com>\n *\n * Cross Browser Javascript Framework for MVC Patterns\n * QCObjects is licensed under the MIT License\n * [LICENSE] (https://github.com/QCObjects/qcobjects-cli/blob/main/LICENSE.txt)\n *\n * Copyright (C) 2015 Jean Machuca,<correojean@gmail.com>\n *\n * Everyone is permitted to copy and distribute verbatim copies of this\n * license document, but changing it is not allowed.\n*/\n/*eslint no-unused-vars: \"off\"*/\n/*eslint no-redeclare: \"off\"*/\n/*eslint no-empty: \"off\"*/\n/*eslint strict: \"off\"*/\n/*eslint no-mixed-operators: \"off\"*/\n/*eslint no-undef: \"off\"*/\n\"use strict\";\n\nconst welcometo = \"Welcome to \\n\";\nconst instructions = \"Type:\\n .exit to quit\\n .help for see a quick guide\\n And any other command to execute like pure javascript \\n All the QCObjects stuff is already loaded for you\";\n//const logo = ' .88888. a88888b. .88888. dP oo dP \\r\\nd8\\' `8b d8\\' `88 d8\\' `8b 88 88 \\r\\n88 88 88 88 88 88d888b. dP .d8888b. .d8888b. d8888P .d8888b. \\r\\n88 db 88 88 88 88 88\\' `88 88 88ooood8 88\\' `\\\"\\\" 88 Y8ooooo. \\r\\nY8. Y88P Y8. .88 Y8. .8P 88. .88 88 88. ... 88. ... 88 88 \\r\\n `8888PY8b Y88888P\\' `8888P\\' 88Y8888\\' 88 `88888P\\' `88888P\\' dP `88888P\\' \\r\\noooooooooooooooooooooooooooooooooooooooo88~oooooooooooooooooooooooooooooooooo\\r\\n dP ';\nconst logo = \" .d88888b. .d8888b. .d88888b. 888 d8b 888 \\r\\nd88P\\\" \\\"Y88bd88P Y88bd88P\\\" \\\"Y88b888 Y8P 888 \\r\\n888 888888 888888 888888 888 \\r\\n888 888888 888 88888888b. 8888 .d88b. .d8888b888888.d8888b \\r\\n888 888888 888 888888 \\\"88b \\\"888d8P Y8bd88P\\\" 888 88K \\r\\n888 Y8b 888888 888888 888888 888 88888888888888 888 \\\"Y8888b. \\r\\nY88b.Y8b88PY88b d88PY88b. .d88P888 d88P 888Y8b. Y88b. Y88b. X88 \\r\\n \\\"Y888888\\\" \\\"Y8888P\\\" \\\"Y88888P\\\" 88888P\\\" 888 \\\"Y8888 \\\"Y8888P \\\"Y888 88888P' \\r\\n Y8b 888 \\r\\n d88P \\r\\n 888P\\\" \";\nimport path from \"path\";\nconst absolutePath = path.resolve( __dirname, \"./\" );\n\nimport vm from \"vm\";\n\nimport {InheritClass, global} from \"qcobjects\";\nimport \"./defaultsettings\";\nimport readline from \"readline\";\n\n\nclass Main extends InheritClass {\n constructor(){\n super();\n this.start();\n }\n\n start (){\n const sandbox = {\n require:require,\n module:module,\n __dirname:\"./\",\n __filename:\"qcobjects-shell-file.js\"\n };\n (globalThis as any).context = vm.createContext(sandbox);\n \n const runScript = (code: string,logOutput=false)=>{\n const options = {filename:sandbox.__filename};\n \n const backgroundRunScript = (code: string):any=>{\n var output = vm.runInContext(code,(globalThis as any).context,options);\n return output;\n };\n \n var output = backgroundRunScript(code);\n \n if (logOutput && typeof output !== \"undefined\"){\n console.log(output);\n }\n };\n \n const syncGlobal = ()=>{\n var s = \"Object.assign(this,this.constructor.constructor('return this')())\";\n runScript(s);\n };\n \n readline.emitKeypressEvents(process.stdin);\n if (process.stdin.isTTY)\n process.stdin.setRawMode(true);\n \n const qcobjects_version = global.__get_version_string__();\n \n const rl = readline.createInterface({\n input: process.stdin,\n output: process.stdout,\n prompt: qcobjects_version + \" >\"\n });\n \n const protected_symbols = [ \"clearInterval\",\n \"clearTimeout\",\n \"setInterval\",\n \"setTimeout\", \"queueMicrotask\",\n \"clearImmediate\", \"setImmediate\", \"_asyncLoad\",\n \"_fireAsyncLoad\", \"asyncLoad\", \"logger\",\n \"_Crypt\", \"CONFIG\", \"waitUntil\",\n \"_super_\", \"ComplexStorageCache\", \"TagElements\",\n \"onload\", \"InheritClass\", \"Component\",\n \"Controller\", \"View\", \"Service\",\n \"JSONService\", \"ConfigService\", \"VO\",\n \"serviceLoader\", \"componentLoader\", \"ComponentURI\",\n \"SourceJS\", \"SourceCSS\", \"ArrayList\",\n \"ArrayCollection\", \"Effect\", \"Timer\",\n \"Export\", \"Import\", \"Package\",\n \"Class\", \"New\", \"Tag\",\n \"Ready\", \"Contact\", \"FormField\",\n \"ButtonField\", \"InputField\", \"TextField\",\n \"EmailField\", \"GridComponent\", \"GridController\",\n \"GridView\", \"Move\", \"RotateX\",\n \"RotateY\", \"RotateZ\", \"Rotate\",\n \"Fade\", \"Radius\", \"CanvasTool\",\n \"BasicLayout\"\n ];\n \n const preloaded_scripts = [\n \"require('qcobjects')\",\n \"Object.assign(this,this.constructor.constructor('return this')())\"\n ];\n \n preloaded_scripts.map(preloaded_script =>\n runScript(preloaded_script.trim())\n );\n \n \n console.log(welcometo);\n console.log(logo);\n console.log(instructions);\n rl.prompt(true);\n \n rl.on(\"line\", (line) => {\n var codeline = line.trim();\n switch (true) {\n case codeline==\"hello\":\n console.log(\"world!\");\n break;\n case codeline==\".exit\":\n rl.close();\n break;\n default:\n try{\n runScript(codeline,true);\n syncGlobal.bind(sandbox)();\n }catch (e){\n console.log(\"An exeption ocurred while trying to run your awesome code! \");\n console.log(e);\n }\n break;\n }\n rl.prompt();\n }).on(\"close\", () => {\n console.log(\"Thank you for using QCObjects.\");\n console.log(\"Have a nice day!\");\n process.exit(0);\n });\n \n }\n}"],
|
|
5
|
+
"mappings": "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",
|
|
6
6
|
"names": ["code", "output"]
|
|
7
7
|
}
|
package/public/types/index.d.ts
CHANGED
|
@@ -92,6 +92,20 @@ declare module "cli-commands-jira" {
|
|
|
92
92
|
getIssueList(): Promise<void>;
|
|
93
93
|
}
|
|
94
94
|
}
|
|
95
|
+
declare module "cli-commands-lint" {
|
|
96
|
+
import { InheritClass } from "qcobjects";
|
|
97
|
+
export class CommandHandler extends InheritClass {
|
|
98
|
+
choiceOption: {
|
|
99
|
+
lint: (targets: string[], options: {
|
|
100
|
+
fix?: boolean;
|
|
101
|
+
config?: string;
|
|
102
|
+
}) => Promise<void>;
|
|
103
|
+
};
|
|
104
|
+
constructor({ switchCommander }: {
|
|
105
|
+
switchCommander: any;
|
|
106
|
+
});
|
|
107
|
+
}
|
|
108
|
+
}
|
|
95
109
|
declare module "cli-commands-publish-static" {
|
|
96
110
|
import { InheritClass } from "qcobjects";
|
|
97
111
|
export class CommandHandler extends InheritClass {
|
|
@@ -118,6 +132,7 @@ declare module "cli-commands" {
|
|
|
118
132
|
export * as publishStatic from "cli-commands-publish-static";
|
|
119
133
|
export * as buildTypescript from "cli-commands-build-typescript";
|
|
120
134
|
export * as buildEsbuild from "cli-commands-build-esbuild";
|
|
135
|
+
export * as lintCommand from "cli-commands-lint";
|
|
121
136
|
}
|
|
122
137
|
declare module "defaultsettings" {
|
|
123
138
|
import "qcobjects";
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* QCObjects Framework CLI
|
|
3
|
+
* ________________
|
|
4
|
+
*
|
|
5
|
+
* Author: Jean Machuca <correojean@gmail.com>
|
|
6
|
+
*
|
|
7
|
+
* Cross Browser Javascript Framework for MVC Patterns
|
|
8
|
+
* QCObjects is licensed under the MIT License
|
|
9
|
+
* [LICENSE] (https://github.com/QCObjects/qcobjects-cli/blob/main/LICENSE.txt)
|
|
10
|
+
*
|
|
11
|
+
* Copyright (C) 2015 Jean Machuca,<correojean@gmail.com>
|
|
12
|
+
*
|
|
13
|
+
* Everyone is permitted to copy and distribute verbatim copies of this
|
|
14
|
+
* license document, but changing it is not allowed.
|
|
15
|
+
*/
|
|
16
|
+
/*eslint no-unused-vars: "off"*/
|
|
17
|
+
/*eslint no-redeclare: "off"*/
|
|
18
|
+
/*eslint no-empty: "off"*/
|
|
19
|
+
/*eslint strict: "off"*/
|
|
20
|
+
/*eslint no-mixed-operators: "off"*/
|
|
21
|
+
/*eslint no-undef: "off"*/
|
|
22
|
+
"use strict";
|
|
23
|
+
import fs from "node:fs";
|
|
24
|
+
import path from "node:path";
|
|
25
|
+
import { pathToFileURL } from "node:url";
|
|
26
|
+
import glob from "glob";
|
|
27
|
+
import { Linter } from "eslint";
|
|
28
|
+
import globals from "globals";
|
|
29
|
+
import * as tsParserModule from "@typescript-eslint/parser";
|
|
30
|
+
import * as tsPluginModule from "@typescript-eslint/eslint-plugin";
|
|
31
|
+
import { Package, InheritClass } from "qcobjects";
|
|
32
|
+
|
|
33
|
+
const tsParser = (tsParserModule as any).default ?? tsParserModule;
|
|
34
|
+
const tsPlugin = (tsPluginModule as any).default ?? tsPluginModule;
|
|
35
|
+
|
|
36
|
+
const DEFAULT_TARGETS = ["src/**/*.ts"];
|
|
37
|
+
|
|
38
|
+
const DEFAULT_IGNORES = [
|
|
39
|
+
"node_modules/**",
|
|
40
|
+
"build/**",
|
|
41
|
+
"public/**",
|
|
42
|
+
"dist/**",
|
|
43
|
+
"coverage/**",
|
|
44
|
+
".git/**",
|
|
45
|
+
];
|
|
46
|
+
|
|
47
|
+
const DEFAULT_FLAT_CONFIG: any[] = [
|
|
48
|
+
{
|
|
49
|
+
files: ["**/*.ts", "**/*.tsx", "**/*.js", "**/*.mjs", "**/*.cjs"],
|
|
50
|
+
plugins: {
|
|
51
|
+
"@typescript-eslint": tsPlugin,
|
|
52
|
+
},
|
|
53
|
+
languageOptions: {
|
|
54
|
+
parser: tsParser,
|
|
55
|
+
ecmaVersion: "latest",
|
|
56
|
+
sourceType: "module",
|
|
57
|
+
globals: {
|
|
58
|
+
...globals.browser,
|
|
59
|
+
...globals.node,
|
|
60
|
+
...globals.commonjs,
|
|
61
|
+
},
|
|
62
|
+
},
|
|
63
|
+
rules: {
|
|
64
|
+
"no-undef": "error",
|
|
65
|
+
"no-unused-vars": ["warn", { argsIgnorePattern: "^_", varsIgnorePattern: "^_" }],
|
|
66
|
+
"no-empty": "off",
|
|
67
|
+
"no-constant-condition": "off",
|
|
68
|
+
"no-redeclare": "off",
|
|
69
|
+
"no-var": "off",
|
|
70
|
+
"no-mixed-operators": "off",
|
|
71
|
+
},
|
|
72
|
+
},
|
|
73
|
+
];
|
|
74
|
+
|
|
75
|
+
export class CommandHandler extends InheritClass {
|
|
76
|
+
choiceOption: {
|
|
77
|
+
lint: (targets: string[], options: { fix?: boolean; config?: string }) => Promise<void>;
|
|
78
|
+
};
|
|
79
|
+
|
|
80
|
+
constructor({
|
|
81
|
+
switchCommander
|
|
82
|
+
}: { switchCommander: any }) {
|
|
83
|
+
super({ switchCommander });
|
|
84
|
+
this.choiceOption = {
|
|
85
|
+
async lint(targets, options) {
|
|
86
|
+
try {
|
|
87
|
+
const cwd = process.cwd();
|
|
88
|
+
const requestedTargets = targets.length > 0 ? targets : DEFAULT_TARGETS;
|
|
89
|
+
const ignoreFlags = DEFAULT_IGNORES.map(ignored => new RegExp(ignored.replace(/\*\*/g, ".*")));
|
|
90
|
+
const files = requestedTargets
|
|
91
|
+
.flatMap(target => glob.sync(target, { cwd, nodir: true }))
|
|
92
|
+
.filter((file: string) => !ignoreFlags.some(flag => flag.test(file)));
|
|
93
|
+
|
|
94
|
+
if (files.length === 0) {
|
|
95
|
+
console.warn(`No files matched: ${requestedTargets.join(", ")}`);
|
|
96
|
+
process.exit(0);
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
let flatConfig = DEFAULT_FLAT_CONFIG;
|
|
100
|
+
const appConfigPath = ["eslint.config.js", "eslint.config.mjs", "eslint.config.cjs"]
|
|
101
|
+
.map(name => path.resolve(cwd, name))
|
|
102
|
+
.find(appConfigPath => fs.existsSync(appConfigPath));
|
|
103
|
+
|
|
104
|
+
if (options.config) {
|
|
105
|
+
const explicitConfigPath = path.resolve(cwd, options.config);
|
|
106
|
+
if (!fs.existsSync(explicitConfigPath)) {
|
|
107
|
+
console.warn(`Config file not found: ${explicitConfigPath}`);
|
|
108
|
+
process.exit(1);
|
|
109
|
+
}
|
|
110
|
+
flatConfig = (await import(pathToFileURL(explicitConfigPath).href)).default;
|
|
111
|
+
console.log(`Using config file: ${explicitConfigPath}`);
|
|
112
|
+
} else if (appConfigPath) {
|
|
113
|
+
flatConfig = (await import(pathToFileURL(appConfigPath).href)).default;
|
|
114
|
+
console.log(`Using app config file: ${appConfigPath}`);
|
|
115
|
+
} else if (fs.existsSync(path.resolve(cwd, ".eslintrc")) || fs.existsSync(path.resolve(cwd, ".eslintrc.js")) || fs.existsSync(path.resolve(cwd, ".eslintrc.cjs")) || fs.existsSync(path.resolve(cwd, ".eslintrc.json"))) {
|
|
116
|
+
console.warn("Legacy .eslintrc config detected but not supported; using built-in QCObjects settings. Migrate to eslint.config.mjs to override defaults.");
|
|
117
|
+
} else {
|
|
118
|
+
console.log("No app eslint config found. Using built-in QCObjects settings (overridable with an eslint.config.mjs in your app).");
|
|
119
|
+
}
|
|
120
|
+
|
|
121
|
+
const linter = new Linter({ cwd, configType: "flat" });
|
|
122
|
+
let errorCount = 0;
|
|
123
|
+
let warningCount = 0;
|
|
124
|
+
let fixedCount = 0;
|
|
125
|
+
|
|
126
|
+
for (const file of files) {
|
|
127
|
+
const absolutePath = path.resolve(cwd, file);
|
|
128
|
+
const source = fs.readFileSync(absolutePath, "utf8");
|
|
129
|
+
const result: { fixed: boolean; output: string; messages: any[] } = options.fix
|
|
130
|
+
? linter.verifyAndFix(source, flatConfig, absolutePath)
|
|
131
|
+
: { fixed: false, output: source, messages: linter.verify(source, flatConfig, absolutePath) };
|
|
132
|
+
if (result.fixed) {
|
|
133
|
+
fixedCount++;
|
|
134
|
+
fs.writeFileSync(absolutePath, result.output);
|
|
135
|
+
}
|
|
136
|
+
for (const message of result.messages) {
|
|
137
|
+
const severity = message.severity === 2 ? "error" : message.severity === 1 ? "warning" : "info";
|
|
138
|
+
const output = `${file}:${message.line}:${message.column} ${severity} ${message.message} (${message.ruleId ?? "parse"})`;
|
|
139
|
+
if (message.severity === 2) {
|
|
140
|
+
errorCount++;
|
|
141
|
+
console.error(output);
|
|
142
|
+
} else if (message.severity === 1) {
|
|
143
|
+
warningCount++;
|
|
144
|
+
console.warn(output);
|
|
145
|
+
} else {
|
|
146
|
+
console.log(output);
|
|
147
|
+
}
|
|
148
|
+
}
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const summary = `${files.length} file(s) linted, ${errorCount} error(s), ${warningCount} warning(s), ${fixedCount} file(s) fixed.`;
|
|
152
|
+
if (errorCount > 0) {
|
|
153
|
+
console.error(summary);
|
|
154
|
+
process.exit(1);
|
|
155
|
+
}
|
|
156
|
+
console.log(summary);
|
|
157
|
+
process.exit(0);
|
|
158
|
+
} catch (e: any) {
|
|
159
|
+
console.warn(`Something went wrong trying to lint: ${e.message}`);
|
|
160
|
+
process.exit(1);
|
|
161
|
+
}
|
|
162
|
+
}
|
|
163
|
+
};
|
|
164
|
+
|
|
165
|
+
const commandHandler = this;
|
|
166
|
+
|
|
167
|
+
const lintCommand = switchCommander.program.command("lint [targets...]")
|
|
168
|
+
.allowExcessArguments(false)
|
|
169
|
+
.option("-f, --fix", "Automatically fix problems")
|
|
170
|
+
.option("-c, --config <path>", "Use a specific eslint config file")
|
|
171
|
+
.description("Lints JS/TS files using built-in QCObjects settings. Default target: src/**/*.ts")
|
|
172
|
+
.action(function (targets: string[], options: { fix?: boolean; config?: string }) {
|
|
173
|
+
commandHandler.choiceOption.lint.call(commandHandler, targets ?? [], options);
|
|
174
|
+
});
|
|
175
|
+
|
|
176
|
+
}
|
|
177
|
+
}
|
|
178
|
+
|
|
179
|
+
Package("com.qcobjects.cli.commands.lint", [
|
|
180
|
+
CommandHandler
|
|
181
|
+
]);
|
package/src/cli-commands.ts
CHANGED
|
@@ -27,4 +27,5 @@ export * as versionCommand from "./cli-commands-version";
|
|
|
27
27
|
export * as jiraCommand from "./cli-commands-jira";
|
|
28
28
|
export * as publishStatic from "./cli-commands-publish-static";
|
|
29
29
|
export * as buildTypescript from "./cli-commands-build-typescript";
|
|
30
|
-
export * as buildEsbuild from "./cli-commands-build-esbuild";
|
|
30
|
+
export * as buildEsbuild from "./cli-commands-build-esbuild";
|
|
31
|
+
export * as lintCommand from "./cli-commands-lint";
|
package/src/collab-server.ts
CHANGED
|
@@ -20,7 +20,8 @@
|
|
|
20
20
|
/*eslint strict: "off"*/
|
|
21
21
|
/*eslint no-mixed-operators: "off"*/
|
|
22
22
|
/*eslint no-undef: "off"*/
|
|
23
|
-
import { CONFIG, Package, InheritClass, logger
|
|
23
|
+
import { CONFIG, Package, InheritClass, logger } from "qcobjects";
|
|
24
|
+
const global = globalThis as any;
|
|
24
25
|
import os from "os";
|
|
25
26
|
import fs from "fs";
|
|
26
27
|
import net from "node:net";
|
package/src/defaultsettings.ts
CHANGED
|
@@ -24,7 +24,7 @@ import "qcobjects";
|
|
|
24
24
|
import {readFileSync} from "node:fs";
|
|
25
25
|
import path from "node:path";
|
|
26
26
|
import fs from "node:fs";
|
|
27
|
-
import { CONFIG, global, logger, _Crypt, findPackageNodePath, Export, _DataStringify, Processor } from "qcobjects";
|
|
27
|
+
import { CONFIG, global, logger, _Crypt, findPackageNodePath, Export, _DataStringify, Processor, set } from "qcobjects";
|
|
28
28
|
|
|
29
29
|
export const __get_version__ = () => {
|
|
30
30
|
|
|
@@ -196,7 +196,7 @@ const __load_default_settings__ = () => {
|
|
|
196
196
|
setDevMode(CONFIG.get("devmode", ""));
|
|
197
197
|
|
|
198
198
|
if (typeof CONFIG.get("backend") !== "undefined") {
|
|
199
|
-
|
|
199
|
+
set("backendAvailable", true);
|
|
200
200
|
}
|
|
201
201
|
|
|
202
202
|
if (typeof CONFIG.get("basePath") !== "undefined") {
|
|
@@ -20,7 +20,7 @@
|
|
|
20
20
|
/*eslint no-mixed-operators: "off"*/
|
|
21
21
|
/*eslint no-undef: "off"*/
|
|
22
22
|
"use strict";
|
|
23
|
-
import { findPackageNodePath, Import, Package, InheritClass, CONFIG, logger, New,
|
|
23
|
+
import { findPackageNodePath, Import, Package, InheritClass, CONFIG, logger, New, get, ClassFactory, Export } from "qcobjects";
|
|
24
24
|
import os from "node:os";
|
|
25
25
|
import path from "node:path";
|
|
26
26
|
import fs from "node:fs";
|
|
@@ -74,7 +74,7 @@ export class HTTPServer extends InheritClass {
|
|
|
74
74
|
|
|
75
75
|
server?.on("error", (err: any) => console.error(err));
|
|
76
76
|
|
|
77
|
-
if (
|
|
77
|
+
if (get("backendAvailable")) {
|
|
78
78
|
logger.info("Loading backend interceptors...");
|
|
79
79
|
const interceptors = CONFIG.get("backend", {}).interceptors;
|
|
80
80
|
if (typeof interceptors !== "undefined") {
|
|
@@ -139,7 +139,7 @@ export class HTTPServer extends InheritClass {
|
|
|
139
139
|
|
|
140
140
|
logger.debug(PipeLog.pipe(this.request));
|
|
141
141
|
|
|
142
|
-
if (
|
|
142
|
+
if (get("backendAvailable")) {
|
|
143
143
|
logger.info("Backend GAE Microservices Available");
|
|
144
144
|
const routes = CONFIG.get("backend").routes;
|
|
145
145
|
const selectedRoute = routes.filter((route: { path: string; }) => {
|
package/src/main-http-server.ts
CHANGED
|
@@ -22,7 +22,7 @@
|
|
|
22
22
|
"use strict";
|
|
23
23
|
import os from "node:os";
|
|
24
24
|
import path from "node:path";
|
|
25
|
-
import { findPackageNodePath, Import, Package, InheritClass, CONFIG, logger, New,
|
|
25
|
+
import { findPackageNodePath, Import, Package, InheritClass, CONFIG, logger, New, get, ClassFactory, Export } from "qcobjects";
|
|
26
26
|
import fs from "fs";
|
|
27
27
|
import mime from "mime";
|
|
28
28
|
import http from "http";
|
|
@@ -428,7 +428,7 @@ export class HTTPServer extends InheritClass {
|
|
|
428
428
|
|
|
429
429
|
this.server.on("error", (err: any) => console.error(err));
|
|
430
430
|
|
|
431
|
-
if (
|
|
431
|
+
if (get("backendAvailable")) {
|
|
432
432
|
logger.info("Loading backend interceptors...");
|
|
433
433
|
const interceptors = CONFIG.get("backend", {}).interceptors;
|
|
434
434
|
if (typeof interceptors !== "undefined") {
|
|
@@ -492,7 +492,7 @@ export class HTTPServer extends InheritClass {
|
|
|
492
492
|
|
|
493
493
|
logger.debug(PipeLog.pipe(this.request));
|
|
494
494
|
|
|
495
|
-
if (
|
|
495
|
+
if (get("backendAvailable")) {
|
|
496
496
|
logger.info("Backend Legacy Microservices Available...");
|
|
497
497
|
|
|
498
498
|
logger.info("Loading backend routes...");
|
package/src/main-http2-server.ts
CHANGED
|
@@ -21,7 +21,7 @@
|
|
|
21
21
|
/*eslint no-undef: "off"*/
|
|
22
22
|
"use strict";
|
|
23
23
|
|
|
24
|
-
import { findPackageNodePath, Import, Package, InheritClass, CONFIG, logger, New,
|
|
24
|
+
import { findPackageNodePath, Import, Package, InheritClass, CONFIG, logger, New, get, ClassFactory } from "qcobjects";
|
|
25
25
|
|
|
26
26
|
import mime from "mime";
|
|
27
27
|
import path from "node:path";
|
|
@@ -248,7 +248,7 @@ export class HTTP2Server extends InheritClass {
|
|
|
248
248
|
|
|
249
249
|
});
|
|
250
250
|
|
|
251
|
-
if (
|
|
251
|
+
if (get("backendAvailable")) {
|
|
252
252
|
logger.info("Loading backend interceptors...");
|
|
253
253
|
const interceptors = CONFIG.get("backend", {}).interceptors;
|
|
254
254
|
if (typeof interceptors !== "undefined") {
|
|
@@ -330,7 +330,7 @@ export class HTTP2Server extends InheritClass {
|
|
|
330
330
|
|
|
331
331
|
logger.debug(PipeLog.pipe(this.request));
|
|
332
332
|
|
|
333
|
-
if (
|
|
333
|
+
if (get("backendAvailable")) {
|
|
334
334
|
logger.info("Backend Microservices Available...");
|
|
335
335
|
|
|
336
336
|
logger.info("Loading backend routes...");
|
package/src/qcobjects-shell.ts
CHANGED
|
@@ -49,13 +49,13 @@ class Main extends InheritClass {
|
|
|
49
49
|
__dirname:"./",
|
|
50
50
|
__filename:"qcobjects-shell-file.js"
|
|
51
51
|
};
|
|
52
|
-
|
|
52
|
+
(globalThis as any).context = vm.createContext(sandbox);
|
|
53
53
|
|
|
54
54
|
const runScript = (code: string,logOutput=false)=>{
|
|
55
55
|
const options = {filename:sandbox.__filename};
|
|
56
56
|
|
|
57
57
|
const backgroundRunScript = (code: string):any=>{
|
|
58
|
-
var output = vm.runInContext(code,
|
|
58
|
+
var output = vm.runInContext(code,(globalThis as any).context,options);
|
|
59
59
|
return output;
|
|
60
60
|
};
|
|
61
61
|
|