@node-cli/static-server 3.1.2 → 3.1.3

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/dist/parse.js CHANGED
@@ -1,5 +1,5 @@
1
- import { defaultFlags, defaultParameters } from "./defaults.js";
2
1
  import { parser } from "@node-cli/parser";
2
+ import { defaultFlags, defaultParameters } from "./defaults.js";
3
3
  export const config = parser({
4
4
  meta: import.meta,
5
5
  flags: {
package/dist/parse.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/parse.ts"],"sourcesContent":["import { defaultFlags, defaultParameters } from \"./defaults.js\";\n\nimport { parser } from \"@node-cli/parser\";\n\nexport type Flags = {\n\tcache?: number;\n\tcors?: boolean;\n\tdirs?: boolean;\n\tgzip?: boolean;\n\thttp2?: boolean;\n\tlogs?: boolean;\n\topen?: boolean;\n\tport?: number;\n\thost?: string;\n};\n\nexport type Parameters = {\n\tpath?: string;\n};\n\nexport type Configuration = {\n\tflags?: Flags;\n\tparameters?: Parameters;\n\tusage?: boolean;\n\texamples?: string;\n};\n\nexport const config: Configuration = parser({\n\tmeta: import.meta,\n\tflags: {\n\t\thost: {\n\t\t\tdefault: defaultFlags.host,\n\t\t\tdescription: \"Host to listen on\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tcache: {\n\t\t\tshortFlag: \"c\",\n\t\t\tdefault: defaultFlags.cache,\n\t\t\tdescription: \"Time in seconds for caching files\",\n\t\t\ttype: \"number\",\n\t\t},\n\t\tcors: {\n\t\t\tshortFlag: \"C\",\n\t\t\tdefault: defaultFlags.cors,\n\t\t\tdescription: \"Set CORS headers to * to allow requests from any origin\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tdirs: {\n\t\t\tshortFlag: \"d\",\n\t\t\tdefault: defaultFlags.dirs,\n\t\t\tdescription: \"List the directory's contents\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tgzip: {\n\t\t\tshortFlag: \"g\",\n\t\t\tdefault: defaultFlags.gzip,\n\t\t\tdescription: \"Enable GZIP compression\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\thelp: {\n\t\t\tshortFlag: \"h\",\n\t\t\tdescription: \"Display help instructions\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\thttp2: {\n\t\t\tshortFlag: \"H\",\n\t\t\tdefault: defaultFlags.http2,\n\t\t\tdescription: \"Use HTTP/2 and SSL (local certificate provided)\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tlogs: {\n\t\t\tshortFlag: \"l\",\n\t\t\tdefault: defaultFlags.logs,\n\t\t\tdescription: \"Log HTTP requests at the prompt\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\topen: {\n\t\t\tshortFlag: \"o\",\n\t\t\tdefault: defaultFlags.open,\n\t\t\tdescription: \"Open in your default browser\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tport: {\n\t\t\tshortFlag: \"p\",\n\t\t\tdefault: defaultFlags.port,\n\t\t\tdescription: \"Port to listen on\",\n\t\t\ttype: \"number\",\n\t\t},\n\t\tversion: {\n\t\t\tshortFlag: \"v\",\n\t\t\tdescription: \"Output the current version\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t},\n\tparameters: {\n\t\tpath: {\n\t\t\tdefault: \"current folder\",\n\t\t\tdescription: \"the path to serve files from\",\n\t\t},\n\t},\n\tusage: true,\n\tdefaultFlags,\n\tdefaultParameters,\n});\n"],"names":["defaultFlags","defaultParameters","parser","config","meta","flags","host","default","description","type","cache","shortFlag","cors","dirs","gzip","help","http2","logs","open","port","version","parameters","path","usage"],"mappings":"AAAA,SAASA,YAAY,EAAEC,iBAAiB,QAAQ,gBAAgB;AAEhE,SAASC,MAAM,QAAQ,mBAAmB;AAyB1C,OAAO,MAAMC,SAAwBD,OAAO;IAC3CE,MAAM;IACNC,OAAO;QACNC,MAAM;YACLC,SAASP,aAAaM,IAAI;YAC1BE,aAAa;YACbC,MAAM;QACP;QACAC,OAAO;YACNC,WAAW;YACXJ,SAASP,aAAaU,KAAK;YAC3BF,aAAa;YACbC,MAAM;QACP;QACAG,MAAM;YACLD,WAAW;YACXJ,SAASP,aAAaY,IAAI;YAC1BJ,aAAa;YACbC,MAAM;QACP;QACAI,MAAM;YACLF,WAAW;YACXJ,SAASP,aAAaa,IAAI;YAC1BL,aAAa;YACbC,MAAM;QACP;QACAK,MAAM;YACLH,WAAW;YACXJ,SAASP,aAAac,IAAI;YAC1BN,aAAa;YACbC,MAAM;QACP;QACAM,MAAM;YACLJ,WAAW;YACXH,aAAa;YACbC,MAAM;QACP;QACAO,OAAO;YACNL,WAAW;YACXJ,SAASP,aAAagB,KAAK;YAC3BR,aAAa;YACbC,MAAM;QACP;QACAQ,MAAM;YACLN,WAAW;YACXJ,SAASP,aAAaiB,IAAI;YAC1BT,aAAa;YACbC,MAAM;QACP;QACAS,MAAM;YACLP,WAAW;YACXJ,SAASP,aAAakB,IAAI;YAC1BV,aAAa;YACbC,MAAM;QACP;QACAU,MAAM;YACLR,WAAW;YACXJ,SAASP,aAAamB,IAAI;YAC1BX,aAAa;YACbC,MAAM;QACP;QACAW,SAAS;YACRT,WAAW;YACXH,aAAa;YACbC,MAAM;QACP;IACD;IACAY,YAAY;QACXC,MAAM;YACLf,SAAS;YACTC,aAAa;QACd;IACD;IACAe,OAAO;IACPvB;IACAC;AACD,GAAG"}
1
+ {"version":3,"sources":["../src/parse.ts"],"sourcesContent":["import { parser } from \"@node-cli/parser\";\nimport { defaultFlags, defaultParameters } from \"./defaults.js\";\n\nexport type Flags = {\n\tcache?: number;\n\tcors?: boolean;\n\tdirs?: boolean;\n\tgzip?: boolean;\n\thttp2?: boolean;\n\tlogs?: boolean;\n\topen?: boolean;\n\tport?: number;\n\thost?: string;\n};\n\nexport type Parameters = {\n\tpath?: string;\n};\n\nexport type Configuration = {\n\tflags?: Flags;\n\tparameters?: Parameters;\n\tusage?: boolean;\n\texamples?: string;\n};\n\nexport const config: Configuration = parser({\n\tmeta: import.meta,\n\tflags: {\n\t\thost: {\n\t\t\tdefault: defaultFlags.host,\n\t\t\tdescription: \"Host to listen on\",\n\t\t\ttype: \"string\",\n\t\t},\n\t\tcache: {\n\t\t\tshortFlag: \"c\",\n\t\t\tdefault: defaultFlags.cache,\n\t\t\tdescription: \"Time in seconds for caching files\",\n\t\t\ttype: \"number\",\n\t\t},\n\t\tcors: {\n\t\t\tshortFlag: \"C\",\n\t\t\tdefault: defaultFlags.cors,\n\t\t\tdescription: \"Set CORS headers to * to allow requests from any origin\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tdirs: {\n\t\t\tshortFlag: \"d\",\n\t\t\tdefault: defaultFlags.dirs,\n\t\t\tdescription: \"List the directory's contents\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tgzip: {\n\t\t\tshortFlag: \"g\",\n\t\t\tdefault: defaultFlags.gzip,\n\t\t\tdescription: \"Enable GZIP compression\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\thelp: {\n\t\t\tshortFlag: \"h\",\n\t\t\tdescription: \"Display help instructions\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\thttp2: {\n\t\t\tshortFlag: \"H\",\n\t\t\tdefault: defaultFlags.http2,\n\t\t\tdescription: \"Use HTTP/2 and SSL (local certificate provided)\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tlogs: {\n\t\t\tshortFlag: \"l\",\n\t\t\tdefault: defaultFlags.logs,\n\t\t\tdescription: \"Log HTTP requests at the prompt\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\topen: {\n\t\t\tshortFlag: \"o\",\n\t\t\tdefault: defaultFlags.open,\n\t\t\tdescription: \"Open in your default browser\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t\tport: {\n\t\t\tshortFlag: \"p\",\n\t\t\tdefault: defaultFlags.port,\n\t\t\tdescription: \"Port to listen on\",\n\t\t\ttype: \"number\",\n\t\t},\n\t\tversion: {\n\t\t\tshortFlag: \"v\",\n\t\t\tdescription: \"Output the current version\",\n\t\t\ttype: \"boolean\",\n\t\t},\n\t},\n\tparameters: {\n\t\tpath: {\n\t\t\tdefault: \"current folder\",\n\t\t\tdescription: \"the path to serve files from\",\n\t\t},\n\t},\n\tusage: true,\n\tdefaultFlags,\n\tdefaultParameters,\n});\n"],"names":["parser","defaultFlags","defaultParameters","config","meta","flags","host","default","description","type","cache","shortFlag","cors","dirs","gzip","help","http2","logs","open","port","version","parameters","path","usage"],"mappings":"AAAA,SAASA,MAAM,QAAQ,mBAAmB;AAC1C,SAASC,YAAY,EAAEC,iBAAiB,QAAQ,gBAAgB;AAyBhE,OAAO,MAAMC,SAAwBH,OAAO;IAC3CI,MAAM;IACNC,OAAO;QACNC,MAAM;YACLC,SAASN,aAAaK,IAAI;YAC1BE,aAAa;YACbC,MAAM;QACP;QACAC,OAAO;YACNC,WAAW;YACXJ,SAASN,aAAaS,KAAK;YAC3BF,aAAa;YACbC,MAAM;QACP;QACAG,MAAM;YACLD,WAAW;YACXJ,SAASN,aAAaW,IAAI;YAC1BJ,aAAa;YACbC,MAAM;QACP;QACAI,MAAM;YACLF,WAAW;YACXJ,SAASN,aAAaY,IAAI;YAC1BL,aAAa;YACbC,MAAM;QACP;QACAK,MAAM;YACLH,WAAW;YACXJ,SAASN,aAAaa,IAAI;YAC1BN,aAAa;YACbC,MAAM;QACP;QACAM,MAAM;YACLJ,WAAW;YACXH,aAAa;YACbC,MAAM;QACP;QACAO,OAAO;YACNL,WAAW;YACXJ,SAASN,aAAae,KAAK;YAC3BR,aAAa;YACbC,MAAM;QACP;QACAQ,MAAM;YACLN,WAAW;YACXJ,SAASN,aAAagB,IAAI;YAC1BT,aAAa;YACbC,MAAM;QACP;QACAS,MAAM;YACLP,WAAW;YACXJ,SAASN,aAAaiB,IAAI;YAC1BV,aAAa;YACbC,MAAM;QACP;QACAU,MAAM;YACLR,WAAW;YACXJ,SAASN,aAAakB,IAAI;YAC1BX,aAAa;YACbC,MAAM;QACP;QACAW,SAAS;YACRT,WAAW;YACXH,aAAa;YACbC,MAAM;QACP;IACD;IACAY,YAAY;QACXC,MAAM;YACLf,SAAS;YACTC,aAAa;QACd;IACD;IACAe,OAAO;IACPtB;IACAC;AACD,GAAG"}
package/dist/server.js CHANGED
@@ -1,16 +1,16 @@
1
1
  #!/usr/bin/env node
2
- import fastifyStatic from "@fastify/static";
3
- import { cert, key } from "./certs.js";
4
2
  import path from "node:path";
5
3
  import fastifyCache from "@fastify/caching";
6
4
  import fastifyCompress from "@fastify/compress";
7
5
  import fastifyCors from "@fastify/cors";
6
+ import fastifyStatic from "@fastify/static";
8
7
  import { Logger } from "@node-cli/logger";
9
8
  import Fastify from "fastify";
10
9
  import fs from "fs-extra";
11
10
  import kleur from "kleur";
12
11
  import open from "open";
13
12
  import portfinder from "portfinder";
13
+ import { cert, key } from "./certs.js";
14
14
  import fastifyLogs from "./logs.js";
15
15
  import { config } from "./parse.js";
16
16
  import { renderDirectories } from "./templates/directories.js";
@@ -1 +1 @@
1
- {"version":3,"sources":["../src/server.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport fastifyStatic, { FastifyStaticOptions } from \"@fastify/static\";\nimport { cert, key } from \"./certs.js\";\n\nimport path from \"node:path\";\nimport fastifyCache from \"@fastify/caching\";\nimport fastifyCompress from \"@fastify/compress\";\nimport fastifyCors from \"@fastify/cors\";\nimport { Logger } from \"@node-cli/logger\";\nimport Fastify from \"fastify\";\nimport fs from \"fs-extra\";\nimport kleur from \"kleur\";\nimport open from \"open\";\nimport portfinder from \"portfinder\";\nimport fastifyLogs from \"./logs.js\";\nimport { config } from \"./parse.js\";\nimport { renderDirectories } from \"./templates/directories.js\";\nimport { renderNotFound } from \"./templates/not-found.js\";\n\nexport const logger = new Logger({\n\tboring: process.env.NODE_ENV === \"test\",\n});\n\nlet customPath = config.parameters[0];\nif (fs.pathExistsSync(customPath)) {\n\tcustomPath = path.resolve(customPath);\n} else {\n\tlogger.printErrorsAndExit([`Folder ${customPath} does not exist!`], 0);\n}\n\nconst fastifyOptions: {\n\tdisableRequestLogging?: boolean;\n\thttp2?: boolean;\n\thttps?: any;\n\tlogger?: any;\n} = {\n\tdisableRequestLogging: true,\n};\n\nif (config.flags.logs) {\n\tfastifyOptions.logger = {\n\t\tlevel: \"info\",\n\t\ttransport: {\n\t\t\ttarget: \"pino-pretty\",\n\t\t\toptions: {\n\t\t\t\thideObject: true,\n\t\t\t\ttranslateTime: \"SYS:standard\",\n\t\t\t\tignore: \"pid,hostname,reqId,resTime,resTimeMs,level\",\n\t\t\t},\n\t\t},\n\t};\n}\n\nif (config.flags.http2) {\n\tfastifyOptions.http2 = true;\n\tfastifyOptions.https = { key, cert };\n}\n\nconst fastify = Fastify(fastifyOptions);\n\nif (config.flags.logs) {\n\tfastify.register(fastifyLogs);\n}\n\nif (config.flags.gzip) {\n\tfastify.register(fastifyCompress, {\n\t\tglobal: true,\n\t\tencodings: [\"gzip\", \"deflate\", \"br\", \"identity\"],\n\t});\n}\n\nif (config.flags.cors) {\n\tfastify.register(fastifyCors);\n}\n\nconst fastifyCacheOptions: {\n\texpiresIn?: number;\n\tserverExpiresIn?: number;\n\tprivacy?: any;\n} = {};\n\nif (config.flags.cache > 0) {\n\tfastifyCacheOptions.expiresIn = config.flags.cache;\n\tfastifyCacheOptions.serverExpiresIn = config.flags.cache;\n\tfastifyCacheOptions.privacy = \"public\";\n} else {\n\tfastifyCacheOptions.privacy = \"no-cache\";\n}\n\nfastify.register(fastifyCache, fastifyCacheOptions);\n\nconst staticOptions: FastifyStaticOptions = {\n\troot: customPath,\n};\nif (config.flags.dirs) {\n\tstaticOptions.list = {\n\t\tformat: \"html\",\n\t\trender: renderDirectories,\n\t};\n}\nfastify.register(fastifyStatic, staticOptions);\n\nfastify.setNotFoundHandler((_request, reply) => {\n\treply.code(404).type(\"text/html\").send(renderNotFound(config.flags.dirs));\n});\n\n/**\n * Run the server!\n */\nlet port: number,\n\taddress: string,\n\tportMessage = \"\";\nconst start = async () => {\n\ttry {\n\t\tport = await portfinder.getPortPromise({ port: Number(config.flags.port) });\n\t\tif (port !== config.flags.port) {\n\t\t\tportMessage = `\\n\\n${kleur.yellow(\n\t\t\t\t`Warning: port ${config.flags.port} was not available!`,\n\t\t\t)}`;\n\t\t\tconfig.flags.port = port;\n\t\t}\n\t\tconst listenOptions: { port?: number; host?: string } = {\n\t\t\tport: config.flags.port,\n\t\t};\n\t\tif (config.flags.host) {\n\t\t\tlistenOptions.host = config.flags.host;\n\t\t\taddress = config.flags.host;\n\t\t} else {\n\t\t\taddress = \"localhost\";\n\t\t}\n\t\tawait fastify.listen(listenOptions);\n\n\t\tconst url = `${config.flags.http2 ? \"https\" : \"http\"}://${address}:${\n\t\t\tconfig.flags.port\n\t\t}`;\n\t\tconst messages = [\n\t\t\t`${kleur.cyan(\"Static Server\")} is up and running!`,\n\t\t\t\"\",\n\t\t\t`${kleur.cyan(url)}`,\n\t\t\t\"\",\n\t\t\t`Hit CTRL+C to shut it down.${portMessage}`,\n\t\t];\n\n\t\tlogger.printBox(messages, { newLineAfter: false });\n\n\t\tif (config.flags.open) {\n\t\t\tawait open(url, {\n\t\t\t\twait: false,\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tfastify.log.error(error);\n\t\t// eslint-disable-next-line unicorn/no-process-exit\n\t\tprocess.exit(1);\n\t}\n};\nstart();\n"],"names":["fastifyStatic","cert","key","path","fastifyCache","fastifyCompress","fastifyCors","Logger","Fastify","fs","kleur","open","portfinder","fastifyLogs","config","renderDirectories","renderNotFound","logger","boring","process","env","NODE_ENV","customPath","parameters","pathExistsSync","resolve","printErrorsAndExit","fastifyOptions","disableRequestLogging","flags","logs","level","transport","target","options","hideObject","translateTime","ignore","http2","https","fastify","register","gzip","global","encodings","cors","fastifyCacheOptions","cache","expiresIn","serverExpiresIn","privacy","staticOptions","root","dirs","list","format","render","setNotFoundHandler","_request","reply","code","type","send","port","address","portMessage","start","getPortPromise","Number","yellow","listenOptions","host","listen","url","messages","cyan","printBox","newLineAfter","wait","error","log","exit"],"mappings":"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"}
1
+ {"version":3,"sources":["../src/server.ts"],"sourcesContent":["#!/usr/bin/env node\n\nimport path from \"node:path\";\nimport fastifyCache from \"@fastify/caching\";\nimport fastifyCompress from \"@fastify/compress\";\nimport fastifyCors from \"@fastify/cors\";\nimport fastifyStatic, { FastifyStaticOptions } from \"@fastify/static\";\nimport { Logger } from \"@node-cli/logger\";\nimport Fastify from \"fastify\";\nimport fs from \"fs-extra\";\nimport kleur from \"kleur\";\nimport open from \"open\";\nimport portfinder from \"portfinder\";\nimport { cert, key } from \"./certs.js\";\nimport fastifyLogs from \"./logs.js\";\nimport { config } from \"./parse.js\";\nimport { renderDirectories } from \"./templates/directories.js\";\nimport { renderNotFound } from \"./templates/not-found.js\";\n\nexport const logger = new Logger({\n\tboring: process.env.NODE_ENV === \"test\",\n});\n\nlet customPath = config.parameters[0];\nif (fs.pathExistsSync(customPath)) {\n\tcustomPath = path.resolve(customPath);\n} else {\n\tlogger.printErrorsAndExit([`Folder ${customPath} does not exist!`], 0);\n}\n\nconst fastifyOptions: {\n\tdisableRequestLogging?: boolean;\n\thttp2?: boolean;\n\thttps?: any;\n\tlogger?: any;\n} = {\n\tdisableRequestLogging: true,\n};\n\nif (config.flags.logs) {\n\tfastifyOptions.logger = {\n\t\tlevel: \"info\",\n\t\ttransport: {\n\t\t\ttarget: \"pino-pretty\",\n\t\t\toptions: {\n\t\t\t\thideObject: true,\n\t\t\t\ttranslateTime: \"SYS:standard\",\n\t\t\t\tignore: \"pid,hostname,reqId,resTime,resTimeMs,level\",\n\t\t\t},\n\t\t},\n\t};\n}\n\nif (config.flags.http2) {\n\tfastifyOptions.http2 = true;\n\tfastifyOptions.https = { key, cert };\n}\n\nconst fastify = Fastify(fastifyOptions);\n\nif (config.flags.logs) {\n\tfastify.register(fastifyLogs);\n}\n\nif (config.flags.gzip) {\n\tfastify.register(fastifyCompress, {\n\t\tglobal: true,\n\t\tencodings: [\"gzip\", \"deflate\", \"br\", \"identity\"],\n\t});\n}\n\nif (config.flags.cors) {\n\tfastify.register(fastifyCors);\n}\n\nconst fastifyCacheOptions: {\n\texpiresIn?: number;\n\tserverExpiresIn?: number;\n\tprivacy?: any;\n} = {};\n\nif (config.flags.cache > 0) {\n\tfastifyCacheOptions.expiresIn = config.flags.cache;\n\tfastifyCacheOptions.serverExpiresIn = config.flags.cache;\n\tfastifyCacheOptions.privacy = \"public\";\n} else {\n\tfastifyCacheOptions.privacy = \"no-cache\";\n}\n\nfastify.register(fastifyCache, fastifyCacheOptions);\n\nconst staticOptions: FastifyStaticOptions = {\n\troot: customPath,\n};\nif (config.flags.dirs) {\n\tstaticOptions.list = {\n\t\tformat: \"html\",\n\t\trender: renderDirectories,\n\t};\n}\nfastify.register(fastifyStatic, staticOptions);\n\nfastify.setNotFoundHandler((_request, reply) => {\n\treply.code(404).type(\"text/html\").send(renderNotFound(config.flags.dirs));\n});\n\n/**\n * Run the server!\n */\nlet port: number,\n\taddress: string,\n\tportMessage = \"\";\nconst start = async () => {\n\ttry {\n\t\tport = await portfinder.getPortPromise({ port: Number(config.flags.port) });\n\t\tif (port !== config.flags.port) {\n\t\t\tportMessage = `\\n\\n${kleur.yellow(\n\t\t\t\t`Warning: port ${config.flags.port} was not available!`,\n\t\t\t)}`;\n\t\t\tconfig.flags.port = port;\n\t\t}\n\t\tconst listenOptions: { port?: number; host?: string } = {\n\t\t\tport: config.flags.port,\n\t\t};\n\t\tif (config.flags.host) {\n\t\t\tlistenOptions.host = config.flags.host;\n\t\t\taddress = config.flags.host;\n\t\t} else {\n\t\t\taddress = \"localhost\";\n\t\t}\n\t\tawait fastify.listen(listenOptions);\n\n\t\tconst url = `${config.flags.http2 ? \"https\" : \"http\"}://${address}:${\n\t\t\tconfig.flags.port\n\t\t}`;\n\t\tconst messages = [\n\t\t\t`${kleur.cyan(\"Static Server\")} is up and running!`,\n\t\t\t\"\",\n\t\t\t`${kleur.cyan(url)}`,\n\t\t\t\"\",\n\t\t\t`Hit CTRL+C to shut it down.${portMessage}`,\n\t\t];\n\n\t\tlogger.printBox(messages, { newLineAfter: false });\n\n\t\tif (config.flags.open) {\n\t\t\tawait open(url, {\n\t\t\t\twait: false,\n\t\t\t});\n\t\t}\n\t} catch (error) {\n\t\tfastify.log.error(error);\n\t\t// eslint-disable-next-line unicorn/no-process-exit\n\t\tprocess.exit(1);\n\t}\n};\nstart();\n"],"names":["path","fastifyCache","fastifyCompress","fastifyCors","fastifyStatic","Logger","Fastify","fs","kleur","open","portfinder","cert","key","fastifyLogs","config","renderDirectories","renderNotFound","logger","boring","process","env","NODE_ENV","customPath","parameters","pathExistsSync","resolve","printErrorsAndExit","fastifyOptions","disableRequestLogging","flags","logs","level","transport","target","options","hideObject","translateTime","ignore","http2","https","fastify","register","gzip","global","encodings","cors","fastifyCacheOptions","cache","expiresIn","serverExpiresIn","privacy","staticOptions","root","dirs","list","format","render","setNotFoundHandler","_request","reply","code","type","send","port","address","portMessage","start","getPortPromise","Number","yellow","listenOptions","host","listen","url","messages","cyan","printBox","newLineAfter","wait","error","log","exit"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@node-cli/static-server",
3
- "version": "3.1.2",
3
+ "version": "3.1.3",
4
4
  "license": "MIT",
5
5
  "author": "Arno Versini",
6
6
  "description": "A simple, zero-configuration, command line HTTP server to serve static files locally",
@@ -9,7 +9,8 @@
9
9
  "exports": "./dist/server.js",
10
10
  "bin": "dist/server.js",
11
11
  "files": [
12
- "dist"
12
+ "dist",
13
+ "README.md"
13
14
  ],
14
15
  "node": ">=18",
15
16
  "scripts": {
@@ -18,30 +19,33 @@
18
19
  "build:js": "swc --strip-leading-paths --source-maps --out-dir dist src --copy-files",
19
20
  "build:types": "tsc",
20
21
  "clean": "rimraf dist types coverage",
22
+ "comments:fix": "comments --merge-line-comments 'src/**/*.ts'",
21
23
  "lint": "biome lint src",
24
+ "lint:fix": "biome check src --write --no-errors-on-unmatched",
22
25
  "watch": "swc --strip-leading-paths --watch --out-dir dist src"
23
26
  },
24
27
  "dependencies": {
25
- "@fastify/caching": "8.4.0",
26
- "@fastify/compress": "7.0.3",
27
- "@fastify/cors": "9.0.1",
28
- "@fastify/static": "7.0.4",
29
- "@node-cli/logger": "1.3.1",
30
- "@node-cli/parser": "2.4.1",
31
- "fastify": "4.29.1",
32
- "fastify-plugin": "4.5.1",
33
- "fs-extra": "11.3.0",
28
+ "@fastify/caching": "9.0.3",
29
+ "@fastify/compress": "8.1.0",
30
+ "@fastify/cors": "11.1.0",
31
+ "@fastify/static": "8.2.0",
32
+ "@node-cli/logger": "../logger",
33
+ "@node-cli/parser": "../parser",
34
+ "fastify": "5.5.0",
35
+ "fastify-plugin": "5.0.1",
36
+ "fs-extra": "11.3.1",
34
37
  "kleur": "4.1.5",
35
- "open": "10.1.2",
36
- "pino-pretty": "11.3.0",
38
+ "open": "10.2.0",
39
+ "pino-pretty": "13.1.1",
37
40
  "portfinder": "1.0.37"
38
41
  },
39
42
  "publishConfig": {
40
43
  "access": "public"
41
44
  },
42
45
  "devDependencies": {
46
+ "@node-cli/comments": "0.2.0",
43
47
  "@vitest/coverage-v8": "3.2.4",
44
48
  "vitest": "3.2.4"
45
49
  },
46
- "gitHead": "2cef8f88aa5316a1789caad2bd7327ca908ccb9f"
50
+ "gitHead": "d90392dcb766dd605bc3eeabc7c7a7ab0c8e6da6"
47
51
  }