arkos 1.4.0-canary.34 → 1.4.0-canary.36

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.
@@ -33,7 +33,9 @@ let _app;
33
33
  exports._arkosConfig = {
34
34
  welcomeMessage: "Welcome to our RESTful API generated by Arkos, find out more about Arkos at www.arkosjs.com",
35
35
  port: Number(process.env.CLI_PORT) || Number(process.env.PORT) || 8000,
36
- host: process.env.CLI_HOST || process.env.HOST || "localhost",
36
+ host: process.env.CLI_HOST ||
37
+ process.env.HOST ||
38
+ (process.env.ARKOS_BUILD !== "true" ? "0.0.0.0" : "127.0.0.1"),
37
39
  fileUpload: {
38
40
  baseUploadDir: "uploads",
39
41
  baseRoute: "/api/uploads",
@@ -52,6 +54,7 @@ async function initApp(arkosConfig = {}) {
52
54
  try {
53
55
  exports._arkosConfig.available = true;
54
56
  const portAndHost = await port_and_host_allocator_1.default.getHostAndAvailablePort(process.env, arkosConfig);
57
+ let networkHost = port_and_host_allocator_1.default.getFirstNonLocalIp();
55
58
  exports._arkosConfig = (0, deepmerge_helper_1.default)(exports._arkosConfig, arkosConfig);
56
59
  _app = await (0, app_1.bootstrap)(exports._arkosConfig);
57
60
  const time = new Date().toTimeString().split(" ")[0];
@@ -61,8 +64,13 @@ async function initApp(arkosConfig = {}) {
61
64
  if (exports._arkosConfig?.configureServer)
62
65
  await exports._arkosConfig.configureServer(server);
63
66
  server.listen(Number(portAndHost?.port), portAndHost.host === "localhost" ? "127.0.0.1" : portAndHost.host, () => {
64
- const message = `${sheu_1.default.gray(time)} {{server}} waiting on http://${portAndHost?.host}:${portAndHost?.port}`;
67
+ const host = portAndHost?.host === "0.0.0.0" ? "localhost" : portAndHost?.host;
68
+ const message = `${sheu_1.default.gray(time)} {{server}} waiting on http://${host}:${portAndHost?.port}`;
65
69
  sheu_1.default.ready(message.replace("{{server}}", `${(0, text_helpers_1.capitalize)(process.env.NODE_ENV || "development")} server`));
70
+ if (networkHost && portAndHost.host === "0.0.0.0")
71
+ sheu_1.default.ready(message
72
+ .replace("{{server}}", `Network ${process.env.NODE_ENV || "development"} server`)
73
+ .replace(host, networkHost));
66
74
  if (exports._arkosConfig?.swagger?.mode)
67
75
  sheu_1.default.ready(`${message.replace("{{server}}", "Documentation")}${exports._arkosConfig?.swagger?.endpoint || "/api/docs"}`);
68
76
  });
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { IncomingMessage, Server, ServerResponse } from \"http\";\nimport AppError from \"./modules/error-handler/utils/app-error\";\nimport { Express } from \"express\";\nimport { bootstrap } from \"./app\";\nimport { ArkosConfig } from \"./types/arkos-config\";\nimport deepmerge from \"./utils/helpers/deepmerge.helper\";\nimport http from \"http\";\nimport sheu from \"./utils/sheu\";\nimport { capitalize } from \"./utils/helpers/text.helpers\";\nimport portAndHostAllocator from \"./utils/features/port-and-host-allocator\";\nimport { killDevelopmentServerChildProcess } from \"./utils/cli/dev\";\nimport { killServerChildProcess } from \"./utils/cli/utils/cli.helpers\";\nimport { killProductionServerChildProcess } from \"./utils/cli/start\";\n\nprocess.on(\"uncaughtException\", (err) => {\n if (err.message.includes(\"EPIPE\")) return;\n\n sheu.error(\"\\nUNCAUGHT EXCEPTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n\n console.error(err.name, err.message);\n console.error(err);\n process.exit(1);\n});\n\nlet server: Server<typeof IncomingMessage, typeof ServerResponse>;\nlet _app: Express;\n\nexport let _arkosConfig: ArkosConfig & { available?: boolean } = {\n welcomeMessage:\n \"Welcome to our RESTful API generated by Arkos, find out more about Arkos at www.arkosjs.com\",\n port: Number(process.env.CLI_PORT) || Number(process.env.PORT) || 8000,\n host: process.env.CLI_HOST || process.env.HOST || \"localhost\",\n fileUpload: {\n baseUploadDir: \"uploads\",\n baseRoute: \"/api/uploads\",\n },\n routers: {\n strict: false,\n },\n available: false,\n debugging: {\n requests: {\n level: 1,\n },\n },\n};\n\n/**\n * Initializes the application server.\n *\n * This function starts the server by listening on a specified port.\n * The port is determined by the following order of precedence:\n * 1. The `port` argument passed to the function.\n * 2. Defaults to `8000` if neither is provided.\n *\n * @param {ArkosConfig} arkosConfig - initial configs for the api ( authentication, port).\n * @returns {Promise<Express>} This function returns the Express App after all middlewares configurations.\n * You can prevent it from listen py passing port as undefined\n *\n */\nasync function initApp(\n arkosConfig: ArkosConfig = {}\n): Promise<Express | undefined> {\n try {\n _arkosConfig.available = true;\n\n const portAndHost = await portAndHostAllocator.getHostAndAvailablePort(\n process.env,\n arkosConfig\n );\n\n _arkosConfig = deepmerge(_arkosConfig, arkosConfig);\n\n _app = await bootstrap(_arkosConfig);\n const time = new Date().toTimeString().split(\" \")[0];\n\n if (\n (\"port\" in arkosConfig && arkosConfig?.port !== undefined) ||\n !(\"port\" in arkosConfig)\n ) {\n server = http.createServer(_app);\n\n if (_arkosConfig?.configureServer)\n await _arkosConfig.configureServer(server);\n\n server.listen(\n Number(portAndHost?.port),\n portAndHost.host! === \"localhost\" ? \"127.0.0.1\" : portAndHost.host!,\n () => {\n const message = `${sheu.gray(time)} {{server}} waiting on http://${portAndHost?.host}:${portAndHost?.port}`;\n\n sheu.ready(\n message.replace(\n \"{{server}}\",\n `${capitalize(process.env.NODE_ENV || \"development\")} server`\n )\n );\n if (_arkosConfig?.swagger?.mode)\n sheu.ready(\n `${message.replace(\"{{server}}\", \"Documentation\")}${_arkosConfig?.swagger?.endpoint || \"/api/docs\"}`\n );\n }\n );\n } else {\n sheu.warn(\n `${sheu.gray(time)} Port set to undefined, hence no internal http server was setup.`\n );\n }\n\n return _app;\n } catch (err: any) {\n sheu.error(\n err?.message || \"Something went wrong while starting your application!\"\n );\n console.error(err);\n killDevelopmentServerChildProcess?.();\n killServerChildProcess?.();\n killProductionServerChildProcess?.();\n }\n}\n\nprocess.on(\"unhandledRejection\", (err: AppError) => {\n sheu.error(\"\\nUNHANDLED REJECTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n console.error(err.name, err.message);\n console.error(err);\n server?.close(() => {\n process.exit(1);\n });\n});\n\n/**\n * Terminates the current running express application, server and process.\n *\n * @returns {void}\n */\nexport function terminateApplicationRunningProcessAndServer(): void {\n server?.close(() => {\n process.exit(1);\n });\n}\n\n/**\n * Gives access to the underlying current configurations being used by **Arkos** by default and also passed through `arkos.init()`\n *\n * @returns {ArkosConfig}\n */\nexport function getArkosConfig(): ArkosConfig {\n return _arkosConfig;\n}\n\nexport function getExpressApp() {\n return _app;\n}\n\nexport { server, initApp };\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { IncomingMessage, Server, ServerResponse } from \"http\";\nimport AppError from \"./modules/error-handler/utils/app-error\";\nimport { Express } from \"express\";\nimport { bootstrap } from \"./app\";\nimport { ArkosConfig } from \"./types/arkos-config\";\nimport deepmerge from \"./utils/helpers/deepmerge.helper\";\nimport http from \"http\";\nimport sheu from \"./utils/sheu\";\nimport { capitalize } from \"./utils/helpers/text.helpers\";\nimport portAndHostAllocator from \"./utils/features/port-and-host-allocator\";\nimport { killDevelopmentServerChildProcess } from \"./utils/cli/dev\";\nimport { killServerChildProcess } from \"./utils/cli/utils/cli.helpers\";\nimport { killProductionServerChildProcess } from \"./utils/cli/start\";\n\nprocess.on(\"uncaughtException\", (err) => {\n if (err.message.includes(\"EPIPE\")) return;\n\n sheu.error(\"\\nUNCAUGHT EXCEPTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n\n console.error(err.name, err.message);\n console.error(err);\n process.exit(1);\n});\n\nlet server: Server<typeof IncomingMessage, typeof ServerResponse>;\nlet _app: Express;\n\nexport let _arkosConfig: ArkosConfig & { available?: boolean } = {\n welcomeMessage:\n \"Welcome to our RESTful API generated by Arkos, find out more about Arkos at www.arkosjs.com\",\n port: Number(process.env.CLI_PORT) || Number(process.env.PORT) || 8000,\n host:\n process.env.CLI_HOST ||\n process.env.HOST ||\n (process.env.ARKOS_BUILD !== \"true\" ? \"0.0.0.0\" : \"127.0.0.1\"),\n fileUpload: {\n baseUploadDir: \"uploads\",\n baseRoute: \"/api/uploads\",\n },\n routers: {\n strict: false,\n },\n available: false,\n debugging: {\n requests: {\n level: 1,\n },\n },\n};\n\n/**\n * Initializes the application server.\n *\n * This function starts the server by listening on a specified port.\n * The port is determined by the following order of precedence:\n * 1. The `port` argument passed to the function.\n * 2. Defaults to `8000` if neither is provided.\n *\n * @param {ArkosConfig} arkosConfig - initial configs for the api ( authentication, port).\n * @returns {Promise<Express>} This function returns the Express App after all middlewares configurations.\n * You can prevent it from listen py passing port as undefined\n *\n */\nasync function initApp(\n arkosConfig: ArkosConfig = {}\n): Promise<Express | undefined> {\n try {\n _arkosConfig.available = true;\n\n const portAndHost = await portAndHostAllocator.getHostAndAvailablePort(\n process.env,\n arkosConfig\n );\n\n let networkHost = portAndHostAllocator.getFirstNonLocalIp();\n\n _arkosConfig = deepmerge(_arkosConfig, arkosConfig);\n\n _app = await bootstrap(_arkosConfig);\n const time = new Date().toTimeString().split(\" \")[0];\n\n if (\n (\"port\" in arkosConfig && arkosConfig?.port !== undefined) ||\n !(\"port\" in arkosConfig)\n ) {\n server = http.createServer(_app);\n\n if (_arkosConfig?.configureServer)\n await _arkosConfig.configureServer(server);\n\n server.listen(\n Number(portAndHost?.port),\n portAndHost.host! === \"localhost\" ? \"127.0.0.1\" : portAndHost.host!,\n () => {\n const host =\n portAndHost?.host === \"0.0.0.0\" ? \"localhost\" : portAndHost?.host;\n const message = `${sheu.gray(time)} {{server}} waiting on http://${host}:${portAndHost?.port}`;\n\n sheu.ready(\n message.replace(\n \"{{server}}\",\n `${capitalize(process.env.NODE_ENV || \"development\")} server`\n )\n );\n if (networkHost && portAndHost.host === \"0.0.0.0\")\n sheu.ready(\n message\n .replace(\n \"{{server}}\",\n `Network ${process.env.NODE_ENV || \"development\"} server`\n )\n .replace(host, networkHost)\n );\n if (_arkosConfig?.swagger?.mode)\n sheu.ready(\n `${message.replace(\"{{server}}\", \"Documentation\")}${_arkosConfig?.swagger?.endpoint || \"/api/docs\"}`\n );\n }\n );\n } else {\n sheu.warn(\n `${sheu.gray(time)} Port set to undefined, hence no internal http server was setup.`\n );\n }\n\n return _app;\n } catch (err: any) {\n sheu.error(\n err?.message || \"Something went wrong while starting your application!\"\n );\n console.error(err);\n killDevelopmentServerChildProcess?.();\n killServerChildProcess?.();\n killProductionServerChildProcess?.();\n }\n}\n\nprocess.on(\"unhandledRejection\", (err: AppError) => {\n sheu.error(\"\\nUNHANDLED REJECTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n console.error(err.name, err.message);\n console.error(err);\n server?.close(() => {\n process.exit(1);\n });\n});\n\n/**\n * Terminates the current running express application, server and process.\n *\n * @returns {void}\n */\nexport function terminateApplicationRunningProcessAndServer(): void {\n server?.close(() => {\n process.exit(1);\n });\n}\n\n/**\n * Gives access to the underlying current configurations being used by **Arkos** by default and also passed through `arkos.init()`\n *\n * @returns {ArkosConfig}\n */\nexport function getArkosConfig(): ArkosConfig {\n return _arkosConfig;\n}\n\nexport function getExpressApp() {\n return _app;\n}\n\nexport { server, initApp };\n"]}
@@ -8,12 +8,12 @@ exports.killDevelopmentServerChildProcess = killDevelopmentServerChildProcess;
8
8
  const child_process_1 = require("child_process");
9
9
  const chokidar_1 = __importDefault(require("chokidar"));
10
10
  const fs_helpers_1 = require("../helpers/fs.helpers");
11
- const cli_helpers_1 = require("./utils/cli.helpers");
12
11
  const dotenv_helpers_1 = require("../dotenv.helpers");
13
12
  const fs_1 = __importDefault(require("fs"));
14
13
  const path_1 = __importDefault(require("path"));
15
14
  const sheu_1 = __importDefault(require("../sheu"));
16
15
  const port_and_host_allocator_1 = __importDefault(require("../features/port-and-host-allocator"));
16
+ const watermark_stamper_1 = __importDefault(require("./utils/watermark-stamper"));
17
17
  let child = null;
18
18
  let envFiles;
19
19
  async function devCommand(options = {}) {
@@ -113,11 +113,10 @@ async function devCommand(options = {}) {
113
113
  const envWatcher = setupEnvWatcher();
114
114
  const env = getEnv();
115
115
  const hostAndPort = await port_and_host_allocator_1.default.getHostAndAvailablePort(env, { logWarning: true });
116
- console.info(`\n \x1b[1m\x1b[36m Arkos.js ${(0, cli_helpers_1.getVersion)()}\x1b[0m`);
117
- console.info(` - Local: http://${hostAndPort?.host}:${hostAndPort?.port}`);
118
- console.info(` - Environments: ${(0, fs_helpers_1.fullCleanCwd)(envFiles?.join(", ") || "")
119
- .replaceAll(`\\`, "")
120
- .replaceAll("/", "")}\n`);
116
+ watermark_stamper_1.default.stamp({
117
+ ...hostAndPort,
118
+ envFiles,
119
+ });
121
120
  const cleanup = () => {
122
121
  if (restartTimeout)
123
122
  clearTimeout(restartTimeout);
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../src/utils/cli/dev.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, ChildProcess } from \"child_process\";\nimport chokidar from \"chokidar\";\nimport { fullCleanCwd, getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { getVersion } from \"./utils/cli.helpers\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport sheu from \"../sheu\";\nimport portAndHostAllocator from \"../features/port-and-host-allocator\";\n\ninterface DevOptions {\n port?: string;\n host?: string;\n}\n\nlet child: ChildProcess | null = null;\nlet envFiles: string[] | undefined;\n\n/**\n * Dev server command for the arkos CLI\n */\nexport async function devCommand(options: DevOptions = {}) {\n if (process.env.NODE_ENV === \"test\" || !process.env.NODE_ENV)\n process.env.NODE_ENV = \"development\";\n envFiles = loadEnvironmentVariables();\n child = null;\n let restartTimeout: NodeJS.Timeout | null = null;\n\n try {\n const { port, host } = options;\n let isRestarting = false;\n let restartingFiles = new Set<string>();\n\n const fileExt = getUserFileExtension();\n\n const entryPoint = path.resolve(process.cwd(), `src/app.${fileExt}`);\n\n if (!fs.existsSync(entryPoint)) {\n console.error(`Could not find application entry point at ${entryPoint}`);\n process.exit(1);\n }\n\n const getEnv = () =>\n ({\n NODE_ENV: \"development\",\n ...process.env,\n ...(port && { CLI_PORT: port }),\n ...(host && { CLI_HOST: host }),\n }) as { [x: string]: string };\n\n const startServer = () => {\n if (child) {\n child.kill();\n child = null;\n }\n\n const env = getEnv();\n\n if (fileExt === \"ts\") {\n child = spawn(\"npx\", [\"tsx-strict\", \"--watch\", entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n } else {\n child = spawn(\n \"npx\",\n [\"tsx-strict\", \"--no-type-check\", \"--watch\", entryPoint],\n {\n stdio: \"inherit\",\n env,\n shell: true,\n }\n );\n }\n\n if (child) {\n child.on(\"error\", (error) => {\n console.error(\"Failed to start server:\", error);\n });\n\n child.on(\"exit\", (code, signal) => {\n if (!isRestarting && signal !== \"SIGTERM\" && signal !== \"SIGINT\") {\n console.info(`Server exited with code ${code}, restarting...`);\n startServer();\n }\n });\n }\n };\n\n const scheduleRestart = (reason: string, filePath?: string) => {\n if (filePath) restartingFiles.add(filePath);\n\n if (restartTimeout) clearTimeout(restartTimeout);\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0];\n\n isRestarting = true;\n if (child) {\n child.kill();\n child = null;\n }\n\n restartTimeout = setTimeout(() => {\n sheu.info(`\\x1b[90m${time}\\x1b[0m Restarting: ${reason.toLowerCase()}`);\n startServer();\n isRestarting = false;\n restartTimeout = null;\n if (filePath) restartingFiles.delete(filePath);\n }, 1000);\n };\n\n const setupEnvWatcher = () => {\n const envWatcher = chokidar.watch(\n fullCleanCwd(envFiles?.join(\",\") || \"\")\n .replaceAll(\"/\", \"\")\n .split(\",\") || [],\n {\n ignoreInitial: true,\n persistent: true,\n }\n );\n\n envWatcher.on(\"all\", (_, filePath) => {\n try {\n envFiles = loadEnvironmentVariables();\n scheduleRestart(\"Environment files changed\", \"env-files\");\n } catch (error) {\n console.error(`Error reloading ${filePath}:`, error);\n }\n });\n\n return envWatcher;\n };\n\n startServer();\n\n const envWatcher = setupEnvWatcher();\n\n const env = getEnv();\n const hostAndPort = await portAndHostAllocator.getHostAndAvailablePort(\n env,\n { logWarning: true }\n );\n\n console.info(`\\n \\x1b[1m\\x1b[36m Arkos.js ${getVersion()}\\x1b[0m`);\n console.info(\n ` - Local: http://${hostAndPort?.host}:${hostAndPort?.port}`\n );\n console.info(\n ` - Environments: ${fullCleanCwd(envFiles?.join(\", \") || \"\")\n .replaceAll(`\\\\`, \"\")\n .replaceAll(\"/\", \"\")}\\n`\n );\n\n const cleanup = () => {\n if (restartTimeout) clearTimeout(restartTimeout);\n\n if (envWatcher) envWatcher.close();\n\n if (child) {\n child.kill(\"SIGTERM\");\n\n setTimeout(() => {\n if (child && !child.killed) child.kill(\"SIGKILL\");\n }, 5000);\n }\n\n process.exit(0);\n };\n\n // Handle process exit\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n // Handle uncaught exceptions\n process.on(\"uncaughtException\", (error) => {\n console.error(\"Uncaught Exception:\", error);\n cleanup();\n });\n } catch (error) {\n console.error(\"Development server failed to start:\", error);\n\n if (child) {\n (child as ChildProcess)?.kill?.();\n child = null;\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Help function to help other processes to terminate the development server child process\n */\nexport function killDevelopmentServerChildProcess() {\n (child as ChildProcess)?.kill?.();\n child = null;\n}\n"]}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../src/utils/cli/dev.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, ChildProcess } from \"child_process\";\nimport chokidar from \"chokidar\";\nimport { fullCleanCwd, getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { getVersion } from \"./utils/cli.helpers\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport sheu from \"../sheu\";\nimport portAndHostAllocator from \"../features/port-and-host-allocator\";\nimport watermarkStamper from \"./utils/watermark-stamper\";\n\ninterface DevOptions {\n port?: string;\n host?: string;\n}\n\nlet child: ChildProcess | null = null;\nlet envFiles: string[] | undefined;\n\n/**\n * Dev server command for the arkos CLI\n */\nexport async function devCommand(options: DevOptions = {}) {\n if (process.env.NODE_ENV === \"test\" || !process.env.NODE_ENV)\n process.env.NODE_ENV = \"development\";\n envFiles = loadEnvironmentVariables();\n child = null;\n let restartTimeout: NodeJS.Timeout | null = null;\n\n try {\n const { port, host } = options;\n let isRestarting = false;\n let restartingFiles = new Set<string>();\n\n const fileExt = getUserFileExtension();\n\n const entryPoint = path.resolve(process.cwd(), `src/app.${fileExt}`);\n\n if (!fs.existsSync(entryPoint)) {\n console.error(`Could not find application entry point at ${entryPoint}`);\n process.exit(1);\n }\n\n const getEnv = () =>\n ({\n NODE_ENV: \"development\",\n ...process.env,\n ...(port && { CLI_PORT: port }),\n ...(host && { CLI_HOST: host }),\n }) as { [x: string]: string };\n\n const startServer = () => {\n if (child) {\n child.kill();\n child = null;\n }\n\n const env = getEnv();\n\n if (fileExt === \"ts\") {\n child = spawn(\"npx\", [\"tsx-strict\", \"--watch\", entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n } else {\n child = spawn(\n \"npx\",\n [\"tsx-strict\", \"--no-type-check\", \"--watch\", entryPoint],\n {\n stdio: \"inherit\",\n env,\n shell: true,\n }\n );\n }\n\n if (child) {\n child.on(\"error\", (error) => {\n console.error(\"Failed to start server:\", error);\n });\n\n child.on(\"exit\", (code, signal) => {\n if (!isRestarting && signal !== \"SIGTERM\" && signal !== \"SIGINT\") {\n console.info(`Server exited with code ${code}, restarting...`);\n startServer();\n }\n });\n }\n };\n\n const scheduleRestart = (reason: string, filePath?: string) => {\n if (filePath) restartingFiles.add(filePath);\n\n if (restartTimeout) clearTimeout(restartTimeout);\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0];\n\n isRestarting = true;\n if (child) {\n child.kill();\n child = null;\n }\n\n restartTimeout = setTimeout(() => {\n sheu.info(`\\x1b[90m${time}\\x1b[0m Restarting: ${reason.toLowerCase()}`);\n startServer();\n isRestarting = false;\n restartTimeout = null;\n if (filePath) restartingFiles.delete(filePath);\n }, 1000);\n };\n\n const setupEnvWatcher = () => {\n const envWatcher = chokidar.watch(\n fullCleanCwd(envFiles?.join(\",\") || \"\")\n .replaceAll(\"/\", \"\")\n .split(\",\") || [],\n {\n ignoreInitial: true,\n persistent: true,\n }\n );\n\n envWatcher.on(\"all\", (_, filePath) => {\n try {\n envFiles = loadEnvironmentVariables();\n scheduleRestart(\"Environment files changed\", \"env-files\");\n } catch (error) {\n console.error(`Error reloading ${filePath}:`, error);\n }\n });\n\n return envWatcher;\n };\n\n startServer();\n\n const envWatcher = setupEnvWatcher();\n\n const env = getEnv();\n const hostAndPort = await portAndHostAllocator.getHostAndAvailablePort(\n env,\n { logWarning: true }\n );\n\n watermarkStamper.stamp({\n ...hostAndPort,\n envFiles,\n });\n\n const cleanup = () => {\n if (restartTimeout) clearTimeout(restartTimeout);\n\n if (envWatcher) envWatcher.close();\n\n if (child) {\n child.kill(\"SIGTERM\");\n\n setTimeout(() => {\n if (child && !child.killed) child.kill(\"SIGKILL\");\n }, 5000);\n }\n\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n process.on(\"uncaughtException\", (error) => {\n console.error(\"Uncaught Exception:\", error);\n cleanup();\n });\n } catch (error) {\n console.error(\"Development server failed to start:\", error);\n\n if (child) {\n (child as ChildProcess)?.kill?.();\n child = null;\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Help function to help other processes to terminate the development server child process\n */\nexport function killDevelopmentServerChildProcess() {\n (child as ChildProcess)?.kill?.();\n child = null;\n}\n"]}
@@ -19,6 +19,6 @@ function killServerChildProcess() {
19
19
  (0, start_1.killProductionServerChildProcess)();
20
20
  }
21
21
  function getVersion() {
22
- return "1.4.0-canary.34";
22
+ return "1.4.0-canary.36";
23
23
  }
24
24
  //# sourceMappingURL=cli.helpers.js.map
@@ -1,12 +1,20 @@
1
1
  "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
2
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
+ const port_and_host_allocator_1 = __importDefault(require("../../features/port-and-host-allocator"));
3
7
  const fs_helpers_1 = require("../../helpers/fs.helpers");
4
8
  const cli_helpers_1 = require("./cli.helpers");
5
9
  class WatermarkStamper {
6
10
  stamp({ envFiles, host, port, }) {
7
11
  console.info(`\n \x1b[1m\x1b[36m Arkos.js ${(0, cli_helpers_1.getVersion)()}\x1b[0m`);
8
- if (host && port)
9
- console.info(` - Local: http://${host}:${port}`);
12
+ if (host && port) {
13
+ console.info(` - Local: http://${["0.0.0.0", "127.0.0.1"].includes(host) ? "localhost" : host}:${port}`);
14
+ let nonLocalIp = port_and_host_allocator_1.default.getFirstNonLocalIp();
15
+ if (nonLocalIp && host === "0.0.0.0")
16
+ console.info(` - Network: http://${nonLocalIp}:${port}`);
17
+ }
10
18
  if (envFiles?.length || 0 > 1)
11
19
  console.info(` - Environments: ${(0, fs_helpers_1.fullCleanCwd)(envFiles?.join(", ") || "")
12
20
  .replaceAll(`\\`, "")
@@ -1 +1 @@
1
- {"version":3,"file":"watermark-stamper.js","sourceRoot":"","sources":["../../../../../src/utils/cli/utils/watermark-stamper.ts"],"names":[],"mappings":";;AAAA,yDAAwD;AACxD,+CAA2C;AAK3C,MAAM,gBAAgB;IAIpB,KAAK,CAAC,EACJ,QAAQ,EACR,IAAI,EACJ,IAAI,GAKL;QACC,OAAO,CAAC,IAAI,CAAC,iCAAiC,IAAA,wBAAU,GAAE,SAAS,CAAC,CAAC;QACrE,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,4BAA4B,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3E,IAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC;YAC3B,OAAO,CAAC,IAAI,CACV,qBAAqB,IAAA,yBAAY,EAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1D,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;iBACpB,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAC3B,CAAC;IACN,CAAC;CACF;AAED,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEhD,kBAAe,gBAAgB,CAAC","sourcesContent":["import { fullCleanCwd } from \"../../helpers/fs.helpers\";\nimport { getVersion } from \"./cli.helpers\";\n\n/**\n * Helps in putting Arkosjs watermark\n */\nclass WatermarkStamper {\n /**\n * Stamps Arkosjs watermark with Local and Environments\n */\n stamp({\n envFiles,\n host,\n port,\n }: {\n envFiles: string[] | undefined;\n host: string | undefined;\n port: string | undefined;\n }) {\n console.info(`\\n \\x1b[1m\\x1b[36m Arkos.js ${getVersion()}\\x1b[0m`);\n if (host && port) console.info(` - Local: http://${host}:${port}`);\n if (envFiles?.length || 0 > 1)\n console.info(\n ` - Environments: ${fullCleanCwd(envFiles?.join(\", \") || \"\")\n .replaceAll(`\\\\`, \"\")\n .replaceAll(\"/\", \"\")}\\n`\n );\n }\n}\n\nconst watermarkStamper = new WatermarkStamper();\n\nexport default watermarkStamper;\n"]}
1
+ {"version":3,"file":"watermark-stamper.js","sourceRoot":"","sources":["../../../../../src/utils/cli/utils/watermark-stamper.ts"],"names":[],"mappings":";;;;;AAAA,qGAA0E;AAC1E,yDAAwD;AACxD,+CAA2C;AAK3C,MAAM,gBAAgB;IAIpB,KAAK,CAAC,EACJ,QAAQ,EACR,IAAI,EACJ,IAAI,GAKL;QACC,OAAO,CAAC,IAAI,CAAC,iCAAiC,IAAA,wBAAU,GAAE,SAAS,CAAC,CAAC;QACrE,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CACV,4BAA4B,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CACnG,CAAC;YACF,IAAI,UAAU,GAAG,iCAAoB,CAAC,kBAAkB,EAAE,CAAC;YAC3D,IAAI,UAAU,IAAI,IAAI,KAAK,SAAS;gBAClC,OAAO,CAAC,IAAI,CAAC,4BAA4B,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC;YAC3B,OAAO,CAAC,IAAI,CACV,qBAAqB,IAAA,yBAAY,EAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1D,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;iBACpB,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAC3B,CAAC;IACN,CAAC;CACF;AAED,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEhD,kBAAe,gBAAgB,CAAC","sourcesContent":["import portAndHostAllocator from \"../../features/port-and-host-allocator\";\nimport { fullCleanCwd } from \"../../helpers/fs.helpers\";\nimport { getVersion } from \"./cli.helpers\";\n\n/**\n * Helps in putting Arkosjs watermark\n */\nclass WatermarkStamper {\n /**\n * Stamps Arkosjs watermark with Local and Environments\n */\n stamp({\n envFiles,\n host,\n port,\n }: {\n envFiles: string[] | undefined;\n host: string | undefined;\n port: string | undefined;\n }) {\n console.info(`\\n \\x1b[1m\\x1b[36m Arkos.js ${getVersion()}\\x1b[0m`);\n if (host && port) {\n console.info(\n ` - Local: http://${[\"0.0.0.0\", \"127.0.0.1\"].includes(host) ? \"localhost\" : host}:${port}`\n );\n let nonLocalIp = portAndHostAllocator.getFirstNonLocalIp();\n if (nonLocalIp && host === \"0.0.0.0\")\n console.info(` - Network: http://${nonLocalIp}:${port}`);\n }\n\n if (envFiles?.length || 0 > 1)\n console.info(\n ` - Environments: ${fullCleanCwd(envFiles?.join(\", \") || \"\")\n .replaceAll(`\\\\`, \"\")\n .replaceAll(\"/\", \"\")}\\n`\n );\n }\n}\n\nconst watermarkStamper = new WatermarkStamper();\n\nexport default watermarkStamper;\n"]}
@@ -38,12 +38,37 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
38
38
  Object.defineProperty(exports, "__esModule", { value: true });
39
39
  const net = __importStar(require("net"));
40
40
  const sheu_1 = __importDefault(require("../sheu"));
41
+ const os_1 = __importDefault(require("os"));
41
42
  class PortAndHostAllocator {
42
43
  constructor() {
43
44
  this.prevWarnings = new Set();
44
45
  }
46
+ getFirstNonLocalIp() {
47
+ const networkInterfaces = os_1.default.networkInterfaces();
48
+ let localIpAddress;
49
+ if (this.networkHost)
50
+ return this.networkHost;
51
+ for (const interfaceName in networkInterfaces) {
52
+ const netInterface = networkInterfaces[interfaceName];
53
+ if (!netInterface)
54
+ break;
55
+ for (const alias of netInterface) {
56
+ if (alias.family === "IPv4" && !alias.internal) {
57
+ localIpAddress = alias.address;
58
+ break;
59
+ }
60
+ }
61
+ if (localIpAddress)
62
+ break;
63
+ }
64
+ this.networkHost = localIpAddress;
65
+ return localIpAddress;
66
+ }
45
67
  getCorrectHostAndPortToUse(env, config) {
46
- const host = env?.CLI_HOST || config?.host || env?.HOST || "localhost";
68
+ const host = env?.CLI_HOST ||
69
+ config?.host ||
70
+ env?.HOST ||
71
+ (env.ARKOS_BUILD !== "true" ? "0.0.0.0" : "127.0.0.1");
47
72
  const port = env?.CLI_PORT || config?.port || env?.PORT || "8000";
48
73
  return { host: String(host), port: String(port) };
49
74
  }
@@ -66,15 +91,14 @@ class PortAndHostAllocator {
66
91
  }
67
92
  const msg = `Port ${currentPort} is in use, trying port ${currentPort + 1} instead...`;
68
93
  this.prevWarnings.add(msg);
69
- if (config?.logWarning) {
94
+ if (config?.logWarning)
70
95
  sheu_1.default.warn(`${msg}`);
71
- }
72
96
  currentPort++;
73
97
  }
74
98
  }
75
99
  async isPortAvailable(host, port) {
76
100
  return new Promise((resolve) => {
77
- const actualHost = !["localhost", "127.0.0.1"].includes(host)
101
+ const actualHost = !["localhost", "127.0.0.1", "0.0.0.0"].includes(host)
78
102
  ? host
79
103
  : "localhost";
80
104
  const socket = net.createConnection({
@@ -1 +1 @@
1
- {"version":3,"file":"port-and-host-allocator.js","sourceRoot":"","sources":["../../../../src/utils/features/port-and-host-allocator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosConfig } from \"../../exports\";\nimport * as net from \"net\";\nimport sheu from \"../sheu\";\n\nclass PortAndHostAllocator {\n private host: string | undefined;\n private port: string | undefined;\n private prevWarnings = new Set<string>();\n\n /**\n * Helps in correcting getting the right host and port to be used according to cli params, arkos config, env and default host and port.\n *\n * Is worth mentioning that this will be preserved along the application until it restarts.\n *\n * @param config {ArkosConfig} - your application configuraiton\n * @param env {Record<string,any>} - current env, may pass process.env\n */\n getCorrectHostAndPortToUse(\n env: Record<string, any>,\n config?: ArkosConfig\n ): { port: string; host: string } {\n const host = env?.CLI_HOST || config?.host || env?.HOST || \"localhost\";\n const port = env?.CLI_PORT || config?.port || env?.PORT || \"8000\";\n return { host: String(host), port: String(port) };\n }\n\n /**\n * Finds an available port starting from the configured port and incrementing until one is found\n *\n * @param env {Record<string,any>} - current env, may pass process.env\n * @param config {ArkosConfig} - your application configuration\n * @returns Promise<{port: string; host: string}> - available port and host\n */\n async getHostAndAvailablePort(\n env: Record<string, any>,\n config?: ArkosConfig & { logWarning?: boolean; caller?: string }\n ): Promise<{ port: string; host: string }> {\n if (this.port && this.host) {\n if (config?.logWarning && this.prevWarnings.size > 0) {\n console.info(\"\");\n Array.from(this.prevWarnings).forEach((msg) => sheu.warn(msg));\n }\n return { port: this.port, host: this.host };\n }\n\n const { host, port: initialPort } = this.getCorrectHostAndPortToUse(\n env,\n config\n );\n let currentPort = parseInt(initialPort, 10);\n\n while (true) {\n const isAvailable = await this.isPortAvailable(host, currentPort);\n\n if (isAvailable) {\n this.port = currentPort.toString();\n this.host = host;\n return { host, port: currentPort.toString() };\n }\n\n const msg = `Port ${currentPort} is in use, trying port ${currentPort + 1} instead...`;\n this.prevWarnings.add(msg);\n\n if (config?.logWarning) {\n // console.info(\"\");\n sheu.warn(`${msg}`);\n }\n\n currentPort++;\n }\n }\n\n /**\n * Checks if a port is available on the given host\n *\n * @param host {string} - host to check\n * @param port {number} - port to check\n * @returns Promise<boolean> - true if port is available, false otherwise\n */\n private async isPortAvailable(host: string, port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const actualHost = ![\"localhost\", \"127.0.0.1\"].includes(host)\n ? host\n : \"localhost\";\n const socket = net.createConnection({\n host: actualHost,\n port,\n timeout: 100,\n });\n\n socket.on(\"connect\", () => {\n socket.destroy();\n resolve(false);\n });\n\n socket.on(\"error\", () => {\n resolve(true);\n });\n\n socket.on(\"timeout\", () => {\n socket.destroy();\n resolve(true); // Port is available\n });\n });\n }\n\n logWarnings() {\n console.info(\"\");\n Array.from(this.prevWarnings).forEach((msg) => sheu.warn(msg));\n }\n}\n\nconst portAndHostAllocator = new PortAndHostAllocator();\n\nexport default portAndHostAllocator;\n"]}
1
+ {"version":3,"file":"port-and-host-allocator.js","sourceRoot":"","sources":["../../../../src/utils/features/port-and-host-allocator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosConfig } from \"../../exports\";\nimport * as net from \"net\";\nimport sheu from \"../sheu\";\nimport os from \"os\";\n\nclass PortAndHostAllocator {\n private host: string | undefined;\n private networkHost: string | undefined;\n private port: string | undefined;\n private prevWarnings = new Set<string>();\n\n getFirstNonLocalIp() {\n const networkInterfaces = os.networkInterfaces();\n let localIpAddress;\n if (this.networkHost) return this.networkHost;\n\n for (const interfaceName in networkInterfaces) {\n const netInterface = networkInterfaces[interfaceName];\n if (!netInterface) break;\n for (const alias of netInterface) {\n if (alias.family === \"IPv4\" && !alias.internal) {\n localIpAddress = alias.address;\n break;\n }\n }\n if (localIpAddress) break;\n }\n\n this.networkHost = localIpAddress;\n return localIpAddress;\n }\n\n /**\n * Helps in correcting getting the right host and port to be used according to cli params, arkos config, env and default host and port.\n *\n * Is worth mentioning that this will be preserved along the application until it restarts.\n *\n * @param config {ArkosConfig} - your application configuraiton\n * @param env {Record<string,any>} - current env, may pass process.env\n */\n getCorrectHostAndPortToUse(\n env: Record<string, any>,\n config?: ArkosConfig\n ): { port: string; host: string } {\n const host =\n env?.CLI_HOST ||\n config?.host ||\n env?.HOST ||\n (env.ARKOS_BUILD !== \"true\" ? \"0.0.0.0\" : \"127.0.0.1\");\n const port = env?.CLI_PORT || config?.port || env?.PORT || \"8000\";\n\n return { host: String(host), port: String(port) };\n }\n\n /**\n * Finds an available port starting from the configured port and incrementing until one is found\n *\n * @param env {Record<string,any>} - current env, may pass process.env\n * @param config {ArkosConfig} - your application configuration\n * @returns Promise<{port: string; host: string}> - available port and host\n */\n async getHostAndAvailablePort(\n env: Record<string, any>,\n config?: ArkosConfig & { logWarning?: boolean; caller?: string }\n ): Promise<{ port: string; host: string }> {\n if (this.port && this.host) {\n if (config?.logWarning && this.prevWarnings.size > 0) {\n console.info(\"\");\n Array.from(this.prevWarnings).forEach((msg) => sheu.warn(msg));\n }\n return { port: this.port, host: this.host };\n }\n\n const { host, port: initialPort } = this.getCorrectHostAndPortToUse(\n env,\n config\n );\n let currentPort = parseInt(initialPort, 10);\n\n while (true) {\n const isAvailable = await this.isPortAvailable(host, currentPort);\n\n if (isAvailable) {\n this.port = currentPort.toString();\n this.host = host;\n return { host, port: currentPort.toString() };\n }\n\n const msg = `Port ${currentPort} is in use, trying port ${currentPort + 1} instead...`;\n this.prevWarnings.add(msg);\n\n if (config?.logWarning) sheu.warn(`${msg}`);\n\n currentPort++;\n }\n }\n\n /**\n * Checks if a port is available on the given host\n *\n * @param host {string} - host to check\n * @param port {number} - port to check\n * @returns Promise<boolean> - true if port is available, false otherwise\n */\n private async isPortAvailable(host: string, port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const actualHost = ![\"localhost\", \"127.0.0.1\", \"0.0.0.0\"].includes(host)\n ? host\n : \"localhost\";\n const socket = net.createConnection({\n host: actualHost,\n port,\n timeout: 100,\n });\n\n socket.on(\"connect\", () => {\n socket.destroy();\n resolve(false);\n });\n\n socket.on(\"error\", () => {\n resolve(true);\n });\n\n socket.on(\"timeout\", () => {\n socket.destroy();\n resolve(true);\n });\n });\n }\n\n logWarnings() {\n console.info(\"\");\n Array.from(this.prevWarnings).forEach((msg) => sheu.warn(msg));\n }\n}\n\nconst portAndHostAllocator = new PortAndHostAllocator();\n\nexport default portAndHostAllocator;\n"]}
@@ -23,7 +23,9 @@ let _app;
23
23
  export let _arkosConfig = {
24
24
  welcomeMessage: "Welcome to our RESTful API generated by Arkos, find out more about Arkos at www.arkosjs.com",
25
25
  port: Number(process.env.CLI_PORT) || Number(process.env.PORT) || 8000,
26
- host: process.env.CLI_HOST || process.env.HOST || "localhost",
26
+ host: process.env.CLI_HOST ||
27
+ process.env.HOST ||
28
+ (process.env.ARKOS_BUILD !== "true" ? "0.0.0.0" : "127.0.0.1"),
27
29
  fileUpload: {
28
30
  baseUploadDir: "uploads",
29
31
  baseRoute: "/api/uploads",
@@ -42,6 +44,7 @@ async function initApp(arkosConfig = {}) {
42
44
  try {
43
45
  _arkosConfig.available = true;
44
46
  const portAndHost = await portAndHostAllocator.getHostAndAvailablePort(process.env, arkosConfig);
47
+ let networkHost = portAndHostAllocator.getFirstNonLocalIp();
45
48
  _arkosConfig = deepmerge(_arkosConfig, arkosConfig);
46
49
  _app = await bootstrap(_arkosConfig);
47
50
  const time = new Date().toTimeString().split(" ")[0];
@@ -51,8 +54,13 @@ async function initApp(arkosConfig = {}) {
51
54
  if (_arkosConfig?.configureServer)
52
55
  await _arkosConfig.configureServer(server);
53
56
  server.listen(Number(portAndHost?.port), portAndHost.host === "localhost" ? "127.0.0.1" : portAndHost.host, () => {
54
- const message = `${sheu.gray(time)} {{server}} waiting on http://${portAndHost?.host}:${portAndHost?.port}`;
57
+ const host = portAndHost?.host === "0.0.0.0" ? "localhost" : portAndHost?.host;
58
+ const message = `${sheu.gray(time)} {{server}} waiting on http://${host}:${portAndHost?.port}`;
55
59
  sheu.ready(message.replace("{{server}}", `${capitalize(process.env.NODE_ENV || "development")} server`));
60
+ if (networkHost && portAndHost.host === "0.0.0.0")
61
+ sheu.ready(message
62
+ .replace("{{server}}", `Network ${process.env.NODE_ENV || "development"} server`)
63
+ .replace(host, networkHost));
56
64
  if (_arkosConfig?.swagger?.mode)
57
65
  sheu.ready(`${message.replace("{{server}}", "Documentation")}${_arkosConfig?.swagger?.endpoint || "/api/docs"}`);
58
66
  });
@@ -1 +1 @@
1
- {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { IncomingMessage, Server, ServerResponse } from \"http\";\nimport AppError from \"./modules/error-handler/utils/app-error\";\nimport { Express } from \"express\";\nimport { bootstrap } from \"./app\";\nimport { ArkosConfig } from \"./types/arkos-config\";\nimport deepmerge from \"./utils/helpers/deepmerge.helper\";\nimport http from \"http\";\nimport sheu from \"./utils/sheu\";\nimport { capitalize } from \"./utils/helpers/text.helpers\";\nimport portAndHostAllocator from \"./utils/features/port-and-host-allocator\";\nimport { killDevelopmentServerChildProcess } from \"./utils/cli/dev\";\nimport { killServerChildProcess } from \"./utils/cli/utils/cli.helpers\";\nimport { killProductionServerChildProcess } from \"./utils/cli/start\";\n\nprocess.on(\"uncaughtException\", (err) => {\n if (err.message.includes(\"EPIPE\")) return;\n\n sheu.error(\"\\nUNCAUGHT EXCEPTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n\n console.error(err.name, err.message);\n console.error(err);\n process.exit(1);\n});\n\nlet server: Server<typeof IncomingMessage, typeof ServerResponse>;\nlet _app: Express;\n\nexport let _arkosConfig: ArkosConfig & { available?: boolean } = {\n welcomeMessage:\n \"Welcome to our RESTful API generated by Arkos, find out more about Arkos at www.arkosjs.com\",\n port: Number(process.env.CLI_PORT) || Number(process.env.PORT) || 8000,\n host: process.env.CLI_HOST || process.env.HOST || \"localhost\",\n fileUpload: {\n baseUploadDir: \"uploads\",\n baseRoute: \"/api/uploads\",\n },\n routers: {\n strict: false,\n },\n available: false,\n debugging: {\n requests: {\n level: 1,\n },\n },\n};\n\n/**\n * Initializes the application server.\n *\n * This function starts the server by listening on a specified port.\n * The port is determined by the following order of precedence:\n * 1. The `port` argument passed to the function.\n * 2. Defaults to `8000` if neither is provided.\n *\n * @param {ArkosConfig} arkosConfig - initial configs for the api ( authentication, port).\n * @returns {Promise<Express>} This function returns the Express App after all middlewares configurations.\n * You can prevent it from listen py passing port as undefined\n *\n */\nasync function initApp(\n arkosConfig: ArkosConfig = {}\n): Promise<Express | undefined> {\n try {\n _arkosConfig.available = true;\n\n const portAndHost = await portAndHostAllocator.getHostAndAvailablePort(\n process.env,\n arkosConfig\n );\n\n _arkosConfig = deepmerge(_arkosConfig, arkosConfig);\n\n _app = await bootstrap(_arkosConfig);\n const time = new Date().toTimeString().split(\" \")[0];\n\n if (\n (\"port\" in arkosConfig && arkosConfig?.port !== undefined) ||\n !(\"port\" in arkosConfig)\n ) {\n server = http.createServer(_app);\n\n if (_arkosConfig?.configureServer)\n await _arkosConfig.configureServer(server);\n\n server.listen(\n Number(portAndHost?.port),\n portAndHost.host! === \"localhost\" ? \"127.0.0.1\" : portAndHost.host!,\n () => {\n const message = `${sheu.gray(time)} {{server}} waiting on http://${portAndHost?.host}:${portAndHost?.port}`;\n\n sheu.ready(\n message.replace(\n \"{{server}}\",\n `${capitalize(process.env.NODE_ENV || \"development\")} server`\n )\n );\n if (_arkosConfig?.swagger?.mode)\n sheu.ready(\n `${message.replace(\"{{server}}\", \"Documentation\")}${_arkosConfig?.swagger?.endpoint || \"/api/docs\"}`\n );\n }\n );\n } else {\n sheu.warn(\n `${sheu.gray(time)} Port set to undefined, hence no internal http server was setup.`\n );\n }\n\n return _app;\n } catch (err: any) {\n sheu.error(\n err?.message || \"Something went wrong while starting your application!\"\n );\n console.error(err);\n killDevelopmentServerChildProcess?.();\n killServerChildProcess?.();\n killProductionServerChildProcess?.();\n }\n}\n\nprocess.on(\"unhandledRejection\", (err: AppError) => {\n sheu.error(\"\\nUNHANDLED REJECTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n console.error(err.name, err.message);\n console.error(err);\n server?.close(() => {\n process.exit(1);\n });\n});\n\n/**\n * Terminates the current running express application, server and process.\n *\n * @returns {void}\n */\nexport function terminateApplicationRunningProcessAndServer(): void {\n server?.close(() => {\n process.exit(1);\n });\n}\n\n/**\n * Gives access to the underlying current configurations being used by **Arkos** by default and also passed through `arkos.init()`\n *\n * @returns {ArkosConfig}\n */\nexport function getArkosConfig(): ArkosConfig {\n return _arkosConfig;\n}\n\nexport function getExpressApp() {\n return _app;\n}\n\nexport { server, initApp };\n"]}
1
+ {"version":3,"file":"server.js","sourceRoot":"","sources":["../../src/server.ts"],"names":[],"mappings":"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","sourcesContent":["import { IncomingMessage, Server, ServerResponse } from \"http\";\nimport AppError from \"./modules/error-handler/utils/app-error\";\nimport { Express } from \"express\";\nimport { bootstrap } from \"./app\";\nimport { ArkosConfig } from \"./types/arkos-config\";\nimport deepmerge from \"./utils/helpers/deepmerge.helper\";\nimport http from \"http\";\nimport sheu from \"./utils/sheu\";\nimport { capitalize } from \"./utils/helpers/text.helpers\";\nimport portAndHostAllocator from \"./utils/features/port-and-host-allocator\";\nimport { killDevelopmentServerChildProcess } from \"./utils/cli/dev\";\nimport { killServerChildProcess } from \"./utils/cli/utils/cli.helpers\";\nimport { killProductionServerChildProcess } from \"./utils/cli/start\";\n\nprocess.on(\"uncaughtException\", (err) => {\n if (err.message.includes(\"EPIPE\")) return;\n\n sheu.error(\"\\nUNCAUGHT EXCEPTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n\n console.error(err.name, err.message);\n console.error(err);\n process.exit(1);\n});\n\nlet server: Server<typeof IncomingMessage, typeof ServerResponse>;\nlet _app: Express;\n\nexport let _arkosConfig: ArkosConfig & { available?: boolean } = {\n welcomeMessage:\n \"Welcome to our RESTful API generated by Arkos, find out more about Arkos at www.arkosjs.com\",\n port: Number(process.env.CLI_PORT) || Number(process.env.PORT) || 8000,\n host:\n process.env.CLI_HOST ||\n process.env.HOST ||\n (process.env.ARKOS_BUILD !== \"true\" ? \"0.0.0.0\" : \"127.0.0.1\"),\n fileUpload: {\n baseUploadDir: \"uploads\",\n baseRoute: \"/api/uploads\",\n },\n routers: {\n strict: false,\n },\n available: false,\n debugging: {\n requests: {\n level: 1,\n },\n },\n};\n\n/**\n * Initializes the application server.\n *\n * This function starts the server by listening on a specified port.\n * The port is determined by the following order of precedence:\n * 1. The `port` argument passed to the function.\n * 2. Defaults to `8000` if neither is provided.\n *\n * @param {ArkosConfig} arkosConfig - initial configs for the api ( authentication, port).\n * @returns {Promise<Express>} This function returns the Express App after all middlewares configurations.\n * You can prevent it from listen py passing port as undefined\n *\n */\nasync function initApp(\n arkosConfig: ArkosConfig = {}\n): Promise<Express | undefined> {\n try {\n _arkosConfig.available = true;\n\n const portAndHost = await portAndHostAllocator.getHostAndAvailablePort(\n process.env,\n arkosConfig\n );\n\n let networkHost = portAndHostAllocator.getFirstNonLocalIp();\n\n _arkosConfig = deepmerge(_arkosConfig, arkosConfig);\n\n _app = await bootstrap(_arkosConfig);\n const time = new Date().toTimeString().split(\" \")[0];\n\n if (\n (\"port\" in arkosConfig && arkosConfig?.port !== undefined) ||\n !(\"port\" in arkosConfig)\n ) {\n server = http.createServer(_app);\n\n if (_arkosConfig?.configureServer)\n await _arkosConfig.configureServer(server);\n\n server.listen(\n Number(portAndHost?.port),\n portAndHost.host! === \"localhost\" ? \"127.0.0.1\" : portAndHost.host!,\n () => {\n const host =\n portAndHost?.host === \"0.0.0.0\" ? \"localhost\" : portAndHost?.host;\n const message = `${sheu.gray(time)} {{server}} waiting on http://${host}:${portAndHost?.port}`;\n\n sheu.ready(\n message.replace(\n \"{{server}}\",\n `${capitalize(process.env.NODE_ENV || \"development\")} server`\n )\n );\n if (networkHost && portAndHost.host === \"0.0.0.0\")\n sheu.ready(\n message\n .replace(\n \"{{server}}\",\n `Network ${process.env.NODE_ENV || \"development\"} server`\n )\n .replace(host, networkHost)\n );\n if (_arkosConfig?.swagger?.mode)\n sheu.ready(\n `${message.replace(\"{{server}}\", \"Documentation\")}${_arkosConfig?.swagger?.endpoint || \"/api/docs\"}`\n );\n }\n );\n } else {\n sheu.warn(\n `${sheu.gray(time)} Port set to undefined, hence no internal http server was setup.`\n );\n }\n\n return _app;\n } catch (err: any) {\n sheu.error(\n err?.message || \"Something went wrong while starting your application!\"\n );\n console.error(err);\n killDevelopmentServerChildProcess?.();\n killServerChildProcess?.();\n killProductionServerChildProcess?.();\n }\n}\n\nprocess.on(\"unhandledRejection\", (err: AppError) => {\n sheu.error(\"\\nUNHANDLED REJECTION! SHUTTING DOWN...\\n\", {\n timestamp: true,\n bold: true,\n });\n console.error(err.name, err.message);\n console.error(err);\n server?.close(() => {\n process.exit(1);\n });\n});\n\n/**\n * Terminates the current running express application, server and process.\n *\n * @returns {void}\n */\nexport function terminateApplicationRunningProcessAndServer(): void {\n server?.close(() => {\n process.exit(1);\n });\n}\n\n/**\n * Gives access to the underlying current configurations being used by **Arkos** by default and also passed through `arkos.init()`\n *\n * @returns {ArkosConfig}\n */\nexport function getArkosConfig(): ArkosConfig {\n return _arkosConfig;\n}\n\nexport function getExpressApp() {\n return _app;\n}\n\nexport { server, initApp };\n"]}
@@ -1,12 +1,12 @@
1
1
  import { spawn } from "child_process";
2
2
  import chokidar from "chokidar";
3
3
  import { fullCleanCwd, getUserFileExtension } from "../helpers/fs.helpers.js";
4
- import { getVersion } from "./utils/cli.helpers.js";
5
4
  import { loadEnvironmentVariables } from "../dotenv.helpers.js";
6
5
  import fs from "fs";
7
6
  import path from "path";
8
7
  import sheu from "../sheu.js";
9
8
  import portAndHostAllocator from "../features/port-and-host-allocator.js";
9
+ import watermarkStamper from "./utils/watermark-stamper.js";
10
10
  let child = null;
11
11
  let envFiles;
12
12
  export async function devCommand(options = {}) {
@@ -106,11 +106,10 @@ export async function devCommand(options = {}) {
106
106
  const envWatcher = setupEnvWatcher();
107
107
  const env = getEnv();
108
108
  const hostAndPort = await portAndHostAllocator.getHostAndAvailablePort(env, { logWarning: true });
109
- console.info(`\n \x1b[1m\x1b[36m Arkos.js ${getVersion()}\x1b[0m`);
110
- console.info(` - Local: http://${hostAndPort?.host}:${hostAndPort?.port}`);
111
- console.info(` - Environments: ${fullCleanCwd(envFiles?.join(", ") || "")
112
- .replaceAll(`\\`, "")
113
- .replaceAll("/", "")}\n`);
109
+ watermarkStamper.stamp({
110
+ ...hostAndPort,
111
+ envFiles,
112
+ });
114
113
  const cleanup = () => {
115
114
  if (restartTimeout)
116
115
  clearTimeout(restartTimeout);
@@ -1 +1 @@
1
- {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../src/utils/cli/dev.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, ChildProcess } from \"child_process\";\nimport chokidar from \"chokidar\";\nimport { fullCleanCwd, getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { getVersion } from \"./utils/cli.helpers\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport sheu from \"../sheu\";\nimport portAndHostAllocator from \"../features/port-and-host-allocator\";\n\ninterface DevOptions {\n port?: string;\n host?: string;\n}\n\nlet child: ChildProcess | null = null;\nlet envFiles: string[] | undefined;\n\n/**\n * Dev server command for the arkos CLI\n */\nexport async function devCommand(options: DevOptions = {}) {\n if (process.env.NODE_ENV === \"test\" || !process.env.NODE_ENV)\n process.env.NODE_ENV = \"development\";\n envFiles = loadEnvironmentVariables();\n child = null;\n let restartTimeout: NodeJS.Timeout | null = null;\n\n try {\n const { port, host } = options;\n let isRestarting = false;\n let restartingFiles = new Set<string>();\n\n const fileExt = getUserFileExtension();\n\n const entryPoint = path.resolve(process.cwd(), `src/app.${fileExt}`);\n\n if (!fs.existsSync(entryPoint)) {\n console.error(`Could not find application entry point at ${entryPoint}`);\n process.exit(1);\n }\n\n const getEnv = () =>\n ({\n NODE_ENV: \"development\",\n ...process.env,\n ...(port && { CLI_PORT: port }),\n ...(host && { CLI_HOST: host }),\n }) as { [x: string]: string };\n\n const startServer = () => {\n if (child) {\n child.kill();\n child = null;\n }\n\n const env = getEnv();\n\n if (fileExt === \"ts\") {\n child = spawn(\"npx\", [\"tsx-strict\", \"--watch\", entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n } else {\n child = spawn(\n \"npx\",\n [\"tsx-strict\", \"--no-type-check\", \"--watch\", entryPoint],\n {\n stdio: \"inherit\",\n env,\n shell: true,\n }\n );\n }\n\n if (child) {\n child.on(\"error\", (error) => {\n console.error(\"Failed to start server:\", error);\n });\n\n child.on(\"exit\", (code, signal) => {\n if (!isRestarting && signal !== \"SIGTERM\" && signal !== \"SIGINT\") {\n console.info(`Server exited with code ${code}, restarting...`);\n startServer();\n }\n });\n }\n };\n\n const scheduleRestart = (reason: string, filePath?: string) => {\n if (filePath) restartingFiles.add(filePath);\n\n if (restartTimeout) clearTimeout(restartTimeout);\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0];\n\n isRestarting = true;\n if (child) {\n child.kill();\n child = null;\n }\n\n restartTimeout = setTimeout(() => {\n sheu.info(`\\x1b[90m${time}\\x1b[0m Restarting: ${reason.toLowerCase()}`);\n startServer();\n isRestarting = false;\n restartTimeout = null;\n if (filePath) restartingFiles.delete(filePath);\n }, 1000);\n };\n\n const setupEnvWatcher = () => {\n const envWatcher = chokidar.watch(\n fullCleanCwd(envFiles?.join(\",\") || \"\")\n .replaceAll(\"/\", \"\")\n .split(\",\") || [],\n {\n ignoreInitial: true,\n persistent: true,\n }\n );\n\n envWatcher.on(\"all\", (_, filePath) => {\n try {\n envFiles = loadEnvironmentVariables();\n scheduleRestart(\"Environment files changed\", \"env-files\");\n } catch (error) {\n console.error(`Error reloading ${filePath}:`, error);\n }\n });\n\n return envWatcher;\n };\n\n startServer();\n\n const envWatcher = setupEnvWatcher();\n\n const env = getEnv();\n const hostAndPort = await portAndHostAllocator.getHostAndAvailablePort(\n env,\n { logWarning: true }\n );\n\n console.info(`\\n \\x1b[1m\\x1b[36m Arkos.js ${getVersion()}\\x1b[0m`);\n console.info(\n ` - Local: http://${hostAndPort?.host}:${hostAndPort?.port}`\n );\n console.info(\n ` - Environments: ${fullCleanCwd(envFiles?.join(\", \") || \"\")\n .replaceAll(`\\\\`, \"\")\n .replaceAll(\"/\", \"\")}\\n`\n );\n\n const cleanup = () => {\n if (restartTimeout) clearTimeout(restartTimeout);\n\n if (envWatcher) envWatcher.close();\n\n if (child) {\n child.kill(\"SIGTERM\");\n\n setTimeout(() => {\n if (child && !child.killed) child.kill(\"SIGKILL\");\n }, 5000);\n }\n\n process.exit(0);\n };\n\n // Handle process exit\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n // Handle uncaught exceptions\n process.on(\"uncaughtException\", (error) => {\n console.error(\"Uncaught Exception:\", error);\n cleanup();\n });\n } catch (error) {\n console.error(\"Development server failed to start:\", error);\n\n if (child) {\n (child as ChildProcess)?.kill?.();\n child = null;\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Help function to help other processes to terminate the development server child process\n */\nexport function killDevelopmentServerChildProcess() {\n (child as ChildProcess)?.kill?.();\n child = null;\n}\n"]}
1
+ {"version":3,"file":"dev.js","sourceRoot":"","sources":["../../../../src/utils/cli/dev.ts"],"names":[],"mappings":"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","sourcesContent":["import { spawn, ChildProcess } from \"child_process\";\nimport chokidar from \"chokidar\";\nimport { fullCleanCwd, getUserFileExtension } from \"../helpers/fs.helpers\";\nimport { getVersion } from \"./utils/cli.helpers\";\nimport { loadEnvironmentVariables } from \"../dotenv.helpers\";\nimport fs from \"fs\";\nimport path from \"path\";\nimport sheu from \"../sheu\";\nimport portAndHostAllocator from \"../features/port-and-host-allocator\";\nimport watermarkStamper from \"./utils/watermark-stamper\";\n\ninterface DevOptions {\n port?: string;\n host?: string;\n}\n\nlet child: ChildProcess | null = null;\nlet envFiles: string[] | undefined;\n\n/**\n * Dev server command for the arkos CLI\n */\nexport async function devCommand(options: DevOptions = {}) {\n if (process.env.NODE_ENV === \"test\" || !process.env.NODE_ENV)\n process.env.NODE_ENV = \"development\";\n envFiles = loadEnvironmentVariables();\n child = null;\n let restartTimeout: NodeJS.Timeout | null = null;\n\n try {\n const { port, host } = options;\n let isRestarting = false;\n let restartingFiles = new Set<string>();\n\n const fileExt = getUserFileExtension();\n\n const entryPoint = path.resolve(process.cwd(), `src/app.${fileExt}`);\n\n if (!fs.existsSync(entryPoint)) {\n console.error(`Could not find application entry point at ${entryPoint}`);\n process.exit(1);\n }\n\n const getEnv = () =>\n ({\n NODE_ENV: \"development\",\n ...process.env,\n ...(port && { CLI_PORT: port }),\n ...(host && { CLI_HOST: host }),\n }) as { [x: string]: string };\n\n const startServer = () => {\n if (child) {\n child.kill();\n child = null;\n }\n\n const env = getEnv();\n\n if (fileExt === \"ts\") {\n child = spawn(\"npx\", [\"tsx-strict\", \"--watch\", entryPoint], {\n stdio: \"inherit\",\n env,\n shell: true,\n });\n } else {\n child = spawn(\n \"npx\",\n [\"tsx-strict\", \"--no-type-check\", \"--watch\", entryPoint],\n {\n stdio: \"inherit\",\n env,\n shell: true,\n }\n );\n }\n\n if (child) {\n child.on(\"error\", (error) => {\n console.error(\"Failed to start server:\", error);\n });\n\n child.on(\"exit\", (code, signal) => {\n if (!isRestarting && signal !== \"SIGTERM\" && signal !== \"SIGINT\") {\n console.info(`Server exited with code ${code}, restarting...`);\n startServer();\n }\n });\n }\n };\n\n const scheduleRestart = (reason: string, filePath?: string) => {\n if (filePath) restartingFiles.add(filePath);\n\n if (restartTimeout) clearTimeout(restartTimeout);\n const now = new Date();\n const time = now.toTimeString().split(\" \")[0];\n\n isRestarting = true;\n if (child) {\n child.kill();\n child = null;\n }\n\n restartTimeout = setTimeout(() => {\n sheu.info(`\\x1b[90m${time}\\x1b[0m Restarting: ${reason.toLowerCase()}`);\n startServer();\n isRestarting = false;\n restartTimeout = null;\n if (filePath) restartingFiles.delete(filePath);\n }, 1000);\n };\n\n const setupEnvWatcher = () => {\n const envWatcher = chokidar.watch(\n fullCleanCwd(envFiles?.join(\",\") || \"\")\n .replaceAll(\"/\", \"\")\n .split(\",\") || [],\n {\n ignoreInitial: true,\n persistent: true,\n }\n );\n\n envWatcher.on(\"all\", (_, filePath) => {\n try {\n envFiles = loadEnvironmentVariables();\n scheduleRestart(\"Environment files changed\", \"env-files\");\n } catch (error) {\n console.error(`Error reloading ${filePath}:`, error);\n }\n });\n\n return envWatcher;\n };\n\n startServer();\n\n const envWatcher = setupEnvWatcher();\n\n const env = getEnv();\n const hostAndPort = await portAndHostAllocator.getHostAndAvailablePort(\n env,\n { logWarning: true }\n );\n\n watermarkStamper.stamp({\n ...hostAndPort,\n envFiles,\n });\n\n const cleanup = () => {\n if (restartTimeout) clearTimeout(restartTimeout);\n\n if (envWatcher) envWatcher.close();\n\n if (child) {\n child.kill(\"SIGTERM\");\n\n setTimeout(() => {\n if (child && !child.killed) child.kill(\"SIGKILL\");\n }, 5000);\n }\n\n process.exit(0);\n };\n\n process.on(\"SIGINT\", cleanup);\n process.on(\"SIGTERM\", cleanup);\n\n process.on(\"uncaughtException\", (error) => {\n console.error(\"Uncaught Exception:\", error);\n cleanup();\n });\n } catch (error) {\n console.error(\"Development server failed to start:\", error);\n\n if (child) {\n (child as ChildProcess)?.kill?.();\n child = null;\n }\n\n process.exit(1);\n }\n}\n\n/**\n * Help function to help other processes to terminate the development server child process\n */\nexport function killDevelopmentServerChildProcess() {\n (child as ChildProcess)?.kill?.();\n child = null;\n}\n"]}
@@ -11,6 +11,6 @@ export function killServerChildProcess() {
11
11
  killProductionServerChildProcess();
12
12
  }
13
13
  export function getVersion() {
14
- return "1.4.0-canary.34";
14
+ return "1.4.0-canary.36";
15
15
  }
16
16
  //# sourceMappingURL=cli.helpers.js.map
@@ -1,10 +1,15 @@
1
+ import portAndHostAllocator from "../../features/port-and-host-allocator.js";
1
2
  import { fullCleanCwd } from "../../helpers/fs.helpers.js";
2
3
  import { getVersion } from "./cli.helpers.js";
3
4
  class WatermarkStamper {
4
5
  stamp({ envFiles, host, port, }) {
5
6
  console.info(`\n \x1b[1m\x1b[36m Arkos.js ${getVersion()}\x1b[0m`);
6
- if (host && port)
7
- console.info(` - Local: http://${host}:${port}`);
7
+ if (host && port) {
8
+ console.info(` - Local: http://${["0.0.0.0", "127.0.0.1"].includes(host) ? "localhost" : host}:${port}`);
9
+ let nonLocalIp = portAndHostAllocator.getFirstNonLocalIp();
10
+ if (nonLocalIp && host === "0.0.0.0")
11
+ console.info(` - Network: http://${nonLocalIp}:${port}`);
12
+ }
8
13
  if (envFiles?.length || 0 > 1)
9
14
  console.info(` - Environments: ${fullCleanCwd(envFiles?.join(", ") || "")
10
15
  .replaceAll(`\\`, "")
@@ -1 +1 @@
1
- {"version":3,"file":"watermark-stamper.js","sourceRoot":"","sources":["../../../../../src/utils/cli/utils/watermark-stamper.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3C,MAAM,gBAAgB;IAIpB,KAAK,CAAC,EACJ,QAAQ,EACR,IAAI,EACJ,IAAI,GAKL;QACC,OAAO,CAAC,IAAI,CAAC,iCAAiC,UAAU,EAAE,SAAS,CAAC,CAAC;QACrE,IAAI,IAAI,IAAI,IAAI;YAAE,OAAO,CAAC,IAAI,CAAC,4BAA4B,IAAI,IAAI,IAAI,EAAE,CAAC,CAAC;QAC3E,IAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC;YAC3B,OAAO,CAAC,IAAI,CACV,qBAAqB,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1D,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;iBACpB,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAC3B,CAAC;IACN,CAAC;CACF;AAED,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEhD,eAAe,gBAAgB,CAAC","sourcesContent":["import { fullCleanCwd } from \"../../helpers/fs.helpers\";\nimport { getVersion } from \"./cli.helpers\";\n\n/**\n * Helps in putting Arkosjs watermark\n */\nclass WatermarkStamper {\n /**\n * Stamps Arkosjs watermark with Local and Environments\n */\n stamp({\n envFiles,\n host,\n port,\n }: {\n envFiles: string[] | undefined;\n host: string | undefined;\n port: string | undefined;\n }) {\n console.info(`\\n \\x1b[1m\\x1b[36m Arkos.js ${getVersion()}\\x1b[0m`);\n if (host && port) console.info(` - Local: http://${host}:${port}`);\n if (envFiles?.length || 0 > 1)\n console.info(\n ` - Environments: ${fullCleanCwd(envFiles?.join(\", \") || \"\")\n .replaceAll(`\\\\`, \"\")\n .replaceAll(\"/\", \"\")}\\n`\n );\n }\n}\n\nconst watermarkStamper = new WatermarkStamper();\n\nexport default watermarkStamper;\n"]}
1
+ {"version":3,"file":"watermark-stamper.js","sourceRoot":"","sources":["../../../../../src/utils/cli/utils/watermark-stamper.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,MAAM,wCAAwC,CAAC;AAC1E,OAAO,EAAE,YAAY,EAAE,MAAM,0BAA0B,CAAC;AACxD,OAAO,EAAE,UAAU,EAAE,MAAM,eAAe,CAAC;AAK3C,MAAM,gBAAgB;IAIpB,KAAK,CAAC,EACJ,QAAQ,EACR,IAAI,EACJ,IAAI,GAKL;QACC,OAAO,CAAC,IAAI,CAAC,iCAAiC,UAAU,EAAE,SAAS,CAAC,CAAC;QACrE,IAAI,IAAI,IAAI,IAAI,EAAE,CAAC;YACjB,OAAO,CAAC,IAAI,CACV,4BAA4B,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,WAAW,CAAC,CAAC,CAAC,IAAI,IAAI,IAAI,EAAE,CACnG,CAAC;YACF,IAAI,UAAU,GAAG,oBAAoB,CAAC,kBAAkB,EAAE,CAAC;YAC3D,IAAI,UAAU,IAAI,IAAI,KAAK,SAAS;gBAClC,OAAO,CAAC,IAAI,CAAC,4BAA4B,UAAU,IAAI,IAAI,EAAE,CAAC,CAAC;QACnE,CAAC;QAED,IAAI,QAAQ,EAAE,MAAM,IAAI,CAAC,GAAG,CAAC;YAC3B,OAAO,CAAC,IAAI,CACV,qBAAqB,YAAY,CAAC,QAAQ,EAAE,IAAI,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;iBAC1D,UAAU,CAAC,IAAI,EAAE,EAAE,CAAC;iBACpB,UAAU,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAC3B,CAAC;IACN,CAAC;CACF;AAED,MAAM,gBAAgB,GAAG,IAAI,gBAAgB,EAAE,CAAC;AAEhD,eAAe,gBAAgB,CAAC","sourcesContent":["import portAndHostAllocator from \"../../features/port-and-host-allocator\";\nimport { fullCleanCwd } from \"../../helpers/fs.helpers\";\nimport { getVersion } from \"./cli.helpers\";\n\n/**\n * Helps in putting Arkosjs watermark\n */\nclass WatermarkStamper {\n /**\n * Stamps Arkosjs watermark with Local and Environments\n */\n stamp({\n envFiles,\n host,\n port,\n }: {\n envFiles: string[] | undefined;\n host: string | undefined;\n port: string | undefined;\n }) {\n console.info(`\\n \\x1b[1m\\x1b[36m Arkos.js ${getVersion()}\\x1b[0m`);\n if (host && port) {\n console.info(\n ` - Local: http://${[\"0.0.0.0\", \"127.0.0.1\"].includes(host) ? \"localhost\" : host}:${port}`\n );\n let nonLocalIp = portAndHostAllocator.getFirstNonLocalIp();\n if (nonLocalIp && host === \"0.0.0.0\")\n console.info(` - Network: http://${nonLocalIp}:${port}`);\n }\n\n if (envFiles?.length || 0 > 1)\n console.info(\n ` - Environments: ${fullCleanCwd(envFiles?.join(\", \") || \"\")\n .replaceAll(`\\\\`, \"\")\n .replaceAll(\"/\", \"\")}\\n`\n );\n }\n}\n\nconst watermarkStamper = new WatermarkStamper();\n\nexport default watermarkStamper;\n"]}
@@ -1,11 +1,36 @@
1
1
  import * as net from "net";
2
2
  import sheu from "../sheu.js";
3
+ import os from "os";
3
4
  class PortAndHostAllocator {
4
5
  constructor() {
5
6
  this.prevWarnings = new Set();
6
7
  }
8
+ getFirstNonLocalIp() {
9
+ const networkInterfaces = os.networkInterfaces();
10
+ let localIpAddress;
11
+ if (this.networkHost)
12
+ return this.networkHost;
13
+ for (const interfaceName in networkInterfaces) {
14
+ const netInterface = networkInterfaces[interfaceName];
15
+ if (!netInterface)
16
+ break;
17
+ for (const alias of netInterface) {
18
+ if (alias.family === "IPv4" && !alias.internal) {
19
+ localIpAddress = alias.address;
20
+ break;
21
+ }
22
+ }
23
+ if (localIpAddress)
24
+ break;
25
+ }
26
+ this.networkHost = localIpAddress;
27
+ return localIpAddress;
28
+ }
7
29
  getCorrectHostAndPortToUse(env, config) {
8
- const host = env?.CLI_HOST || config?.host || env?.HOST || "localhost";
30
+ const host = env?.CLI_HOST ||
31
+ config?.host ||
32
+ env?.HOST ||
33
+ (env.ARKOS_BUILD !== "true" ? "0.0.0.0" : "127.0.0.1");
9
34
  const port = env?.CLI_PORT || config?.port || env?.PORT || "8000";
10
35
  return { host: String(host), port: String(port) };
11
36
  }
@@ -28,15 +53,14 @@ class PortAndHostAllocator {
28
53
  }
29
54
  const msg = `Port ${currentPort} is in use, trying port ${currentPort + 1} instead...`;
30
55
  this.prevWarnings.add(msg);
31
- if (config?.logWarning) {
56
+ if (config?.logWarning)
32
57
  sheu.warn(`${msg}`);
33
- }
34
58
  currentPort++;
35
59
  }
36
60
  }
37
61
  async isPortAvailable(host, port) {
38
62
  return new Promise((resolve) => {
39
- const actualHost = !["localhost", "127.0.0.1"].includes(host)
63
+ const actualHost = !["localhost", "127.0.0.1", "0.0.0.0"].includes(host)
40
64
  ? host
41
65
  : "localhost";
42
66
  const socket = net.createConnection({
@@ -1 +1 @@
1
- {"version":3,"file":"port-and-host-allocator.js","sourceRoot":"","sources":["../../../../src/utils/features/port-and-host-allocator.ts"],"names":[],"mappings":"AACA,OAAO,KAAK,GAAG,MAAM,KAAK,CAAC;AAC3B,OAAO,IAAI,MAAM,SAAS,CAAC;AAE3B,MAAM,oBAAoB;IAA1B;QAGU,iBAAY,GAAG,IAAI,GAAG,EAAU,CAAC;IAuG3C,CAAC;IA7FC,0BAA0B,CACxB,GAAwB,EACxB,MAAoB;QAEpB,MAAM,IAAI,GAAG,GAAG,EAAE,QAAQ,IAAI,MAAM,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,WAAW,CAAC;QACvE,MAAM,IAAI,GAAG,GAAG,EAAE,QAAQ,IAAI,MAAM,EAAE,IAAI,IAAI,GAAG,EAAE,IAAI,IAAI,MAAM,CAAC;QAClE,OAAO,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,MAAM,CAAC,IAAI,CAAC,EAAE,CAAC;IACpD,CAAC;IASD,KAAK,CAAC,uBAAuB,CAC3B,GAAwB,EACxB,MAAgE;QAEhE,IAAI,IAAI,CAAC,IAAI,IAAI,IAAI,CAAC,IAAI,EAAE,CAAC;YAC3B,IAAI,MAAM,EAAE,UAAU,IAAI,IAAI,CAAC,YAAY,CAAC,IAAI,GAAG,CAAC,EAAE,CAAC;gBACrD,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;gBACjB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;YACjE,CAAC;YACD,OAAO,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,IAAI,EAAE,IAAI,CAAC,IAAI,EAAE,CAAC;QAC9C,CAAC;QAED,MAAM,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,EAAE,GAAG,IAAI,CAAC,0BAA0B,CACjE,GAAG,EACH,MAAM,CACP,CAAC;QACF,IAAI,WAAW,GAAG,QAAQ,CAAC,WAAW,EAAE,EAAE,CAAC,CAAC;QAE5C,OAAO,IAAI,EAAE,CAAC;YACZ,MAAM,WAAW,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,IAAI,EAAE,WAAW,CAAC,CAAC;YAElE,IAAI,WAAW,EAAE,CAAC;gBAChB,IAAI,CAAC,IAAI,GAAG,WAAW,CAAC,QAAQ,EAAE,CAAC;gBACnC,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;gBACjB,OAAO,EAAE,IAAI,EAAE,IAAI,EAAE,WAAW,CAAC,QAAQ,EAAE,EAAE,CAAC;YAChD,CAAC;YAED,MAAM,GAAG,GAAG,QAAQ,WAAW,2BAA2B,WAAW,GAAG,CAAC,aAAa,CAAC;YACvF,IAAI,CAAC,YAAY,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC;YAE3B,IAAI,MAAM,EAAE,UAAU,EAAE,CAAC;gBAEvB,IAAI,CAAC,IAAI,CAAC,GAAG,GAAG,EAAE,CAAC,CAAC;YACtB,CAAC;YAED,WAAW,EAAE,CAAC;QAChB,CAAC;IACH,CAAC;IASO,KAAK,CAAC,eAAe,CAAC,IAAY,EAAE,IAAY;QACtD,OAAO,IAAI,OAAO,CAAC,CAAC,OAAO,EAAE,EAAE;YAC7B,MAAM,UAAU,GAAG,CAAC,CAAC,WAAW,EAAE,WAAW,CAAC,CAAC,QAAQ,CAAC,IAAI,CAAC;gBAC3D,CAAC,CAAC,IAAI;gBACN,CAAC,CAAC,WAAW,CAAC;YAChB,MAAM,MAAM,GAAG,GAAG,CAAC,gBAAgB,CAAC;gBAClC,IAAI,EAAE,UAAU;gBAChB,IAAI;gBACJ,OAAO,EAAE,GAAG;aACb,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACxB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,CAAC,KAAK,CAAC,CAAC;YACjB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,OAAO,EAAE,GAAG,EAAE;gBACtB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;YAEH,MAAM,CAAC,EAAE,CAAC,SAAS,EAAE,GAAG,EAAE;gBACxB,MAAM,CAAC,OAAO,EAAE,CAAC;gBACjB,OAAO,CAAC,IAAI,CAAC,CAAC;YAChB,CAAC,CAAC,CAAC;QACL,CAAC,CAAC,CAAC;IACL,CAAC;IAED,WAAW;QACT,OAAO,CAAC,IAAI,CAAC,EAAE,CAAC,CAAC;QACjB,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,YAAY,CAAC,CAAC,OAAO,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,IAAI,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC,CAAC;IACjE,CAAC;CACF;AAED,MAAM,oBAAoB,GAAG,IAAI,oBAAoB,EAAE,CAAC;AAExD,eAAe,oBAAoB,CAAC","sourcesContent":["import { ArkosConfig } from \"../../exports\";\nimport * as net from \"net\";\nimport sheu from \"../sheu\";\n\nclass PortAndHostAllocator {\n private host: string | undefined;\n private port: string | undefined;\n private prevWarnings = new Set<string>();\n\n /**\n * Helps in correcting getting the right host and port to be used according to cli params, arkos config, env and default host and port.\n *\n * Is worth mentioning that this will be preserved along the application until it restarts.\n *\n * @param config {ArkosConfig} - your application configuraiton\n * @param env {Record<string,any>} - current env, may pass process.env\n */\n getCorrectHostAndPortToUse(\n env: Record<string, any>,\n config?: ArkosConfig\n ): { port: string; host: string } {\n const host = env?.CLI_HOST || config?.host || env?.HOST || \"localhost\";\n const port = env?.CLI_PORT || config?.port || env?.PORT || \"8000\";\n return { host: String(host), port: String(port) };\n }\n\n /**\n * Finds an available port starting from the configured port and incrementing until one is found\n *\n * @param env {Record<string,any>} - current env, may pass process.env\n * @param config {ArkosConfig} - your application configuration\n * @returns Promise<{port: string; host: string}> - available port and host\n */\n async getHostAndAvailablePort(\n env: Record<string, any>,\n config?: ArkosConfig & { logWarning?: boolean; caller?: string }\n ): Promise<{ port: string; host: string }> {\n if (this.port && this.host) {\n if (config?.logWarning && this.prevWarnings.size > 0) {\n console.info(\"\");\n Array.from(this.prevWarnings).forEach((msg) => sheu.warn(msg));\n }\n return { port: this.port, host: this.host };\n }\n\n const { host, port: initialPort } = this.getCorrectHostAndPortToUse(\n env,\n config\n );\n let currentPort = parseInt(initialPort, 10);\n\n while (true) {\n const isAvailable = await this.isPortAvailable(host, currentPort);\n\n if (isAvailable) {\n this.port = currentPort.toString();\n this.host = host;\n return { host, port: currentPort.toString() };\n }\n\n const msg = `Port ${currentPort} is in use, trying port ${currentPort + 1} instead...`;\n this.prevWarnings.add(msg);\n\n if (config?.logWarning) {\n // console.info(\"\");\n sheu.warn(`${msg}`);\n }\n\n currentPort++;\n }\n }\n\n /**\n * Checks if a port is available on the given host\n *\n * @param host {string} - host to check\n * @param port {number} - port to check\n * @returns Promise<boolean> - true if port is available, false otherwise\n */\n private async isPortAvailable(host: string, port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const actualHost = ![\"localhost\", \"127.0.0.1\"].includes(host)\n ? host\n : \"localhost\";\n const socket = net.createConnection({\n host: actualHost,\n port,\n timeout: 100,\n });\n\n socket.on(\"connect\", () => {\n socket.destroy();\n resolve(false);\n });\n\n socket.on(\"error\", () => {\n resolve(true);\n });\n\n socket.on(\"timeout\", () => {\n socket.destroy();\n resolve(true); // Port is available\n });\n });\n }\n\n logWarnings() {\n console.info(\"\");\n Array.from(this.prevWarnings).forEach((msg) => sheu.warn(msg));\n }\n}\n\nconst portAndHostAllocator = new PortAndHostAllocator();\n\nexport default portAndHostAllocator;\n"]}
1
+ {"version":3,"file":"port-and-host-allocator.js","sourceRoot":"","sources":["../../../../src/utils/features/port-and-host-allocator.ts"],"names":[],"mappings":"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","sourcesContent":["import { ArkosConfig } from \"../../exports\";\nimport * as net from \"net\";\nimport sheu from \"../sheu\";\nimport os from \"os\";\n\nclass PortAndHostAllocator {\n private host: string | undefined;\n private networkHost: string | undefined;\n private port: string | undefined;\n private prevWarnings = new Set<string>();\n\n getFirstNonLocalIp() {\n const networkInterfaces = os.networkInterfaces();\n let localIpAddress;\n if (this.networkHost) return this.networkHost;\n\n for (const interfaceName in networkInterfaces) {\n const netInterface = networkInterfaces[interfaceName];\n if (!netInterface) break;\n for (const alias of netInterface) {\n if (alias.family === \"IPv4\" && !alias.internal) {\n localIpAddress = alias.address;\n break;\n }\n }\n if (localIpAddress) break;\n }\n\n this.networkHost = localIpAddress;\n return localIpAddress;\n }\n\n /**\n * Helps in correcting getting the right host and port to be used according to cli params, arkos config, env and default host and port.\n *\n * Is worth mentioning that this will be preserved along the application until it restarts.\n *\n * @param config {ArkosConfig} - your application configuraiton\n * @param env {Record<string,any>} - current env, may pass process.env\n */\n getCorrectHostAndPortToUse(\n env: Record<string, any>,\n config?: ArkosConfig\n ): { port: string; host: string } {\n const host =\n env?.CLI_HOST ||\n config?.host ||\n env?.HOST ||\n (env.ARKOS_BUILD !== \"true\" ? \"0.0.0.0\" : \"127.0.0.1\");\n const port = env?.CLI_PORT || config?.port || env?.PORT || \"8000\";\n\n return { host: String(host), port: String(port) };\n }\n\n /**\n * Finds an available port starting from the configured port and incrementing until one is found\n *\n * @param env {Record<string,any>} - current env, may pass process.env\n * @param config {ArkosConfig} - your application configuration\n * @returns Promise<{port: string; host: string}> - available port and host\n */\n async getHostAndAvailablePort(\n env: Record<string, any>,\n config?: ArkosConfig & { logWarning?: boolean; caller?: string }\n ): Promise<{ port: string; host: string }> {\n if (this.port && this.host) {\n if (config?.logWarning && this.prevWarnings.size > 0) {\n console.info(\"\");\n Array.from(this.prevWarnings).forEach((msg) => sheu.warn(msg));\n }\n return { port: this.port, host: this.host };\n }\n\n const { host, port: initialPort } = this.getCorrectHostAndPortToUse(\n env,\n config\n );\n let currentPort = parseInt(initialPort, 10);\n\n while (true) {\n const isAvailable = await this.isPortAvailable(host, currentPort);\n\n if (isAvailable) {\n this.port = currentPort.toString();\n this.host = host;\n return { host, port: currentPort.toString() };\n }\n\n const msg = `Port ${currentPort} is in use, trying port ${currentPort + 1} instead...`;\n this.prevWarnings.add(msg);\n\n if (config?.logWarning) sheu.warn(`${msg}`);\n\n currentPort++;\n }\n }\n\n /**\n * Checks if a port is available on the given host\n *\n * @param host {string} - host to check\n * @param port {number} - port to check\n * @returns Promise<boolean> - true if port is available, false otherwise\n */\n private async isPortAvailable(host: string, port: number): Promise<boolean> {\n return new Promise((resolve) => {\n const actualHost = ![\"localhost\", \"127.0.0.1\", \"0.0.0.0\"].includes(host)\n ? host\n : \"localhost\";\n const socket = net.createConnection({\n host: actualHost,\n port,\n timeout: 100,\n });\n\n socket.on(\"connect\", () => {\n socket.destroy();\n resolve(false);\n });\n\n socket.on(\"error\", () => {\n resolve(true);\n });\n\n socket.on(\"timeout\", () => {\n socket.destroy();\n resolve(true);\n });\n });\n }\n\n logWarnings() {\n console.info(\"\");\n Array.from(this.prevWarnings).forEach((msg) => sheu.warn(msg));\n }\n}\n\nconst portAndHostAllocator = new PortAndHostAllocator();\n\nexport default portAndHostAllocator;\n"]}
@@ -1,8 +1,10 @@
1
1
  import { ArkosConfig } from "../../exports";
2
2
  declare class PortAndHostAllocator {
3
3
  private host;
4
+ private networkHost;
4
5
  private port;
5
6
  private prevWarnings;
7
+ getFirstNonLocalIp(): string | undefined;
6
8
  getCorrectHostAndPortToUse(env: Record<string, any>, config?: ArkosConfig): {
7
9
  port: string;
8
10
  host: string;
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "arkos",
3
- "version": "1.4.0-canary.34",
3
+ "version": "1.4.0-canary.36",
4
4
  "description": "The Express & Prisma RESTful Framework",
5
5
  "main": "dist/cjs/exports/index.js",
6
6
  "module": "dist/esm/exports/index.js",