@autofleet/super-express 7.0.7 → 7.0.8

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/index.cjs CHANGED
@@ -1,3 +1,3 @@
1
1
  'use strict';Object.defineProperty(exports,'__esModule',{value:true});var node_module=require('node:module'),v=require('express'),g=require('pino'),pinoCloudLogging=require('pino-cloud-logging');var _documentCurrentScript=typeof document!=='undefined'?document.currentScript:null;function _interopDefault(e){return e&&e.__esModule?e:{default:e}}var v__default=/*#__PURE__*/_interopDefault(v);var g__default=/*#__PURE__*/_interopDefault(g);var require$1=node_module.createRequire((typeof document === 'undefined' ? require('u' + 'rl').pathToFileURL(__filename).href : (_documentCurrentScript && _documentCurrentScript.tagName.toUpperCase() === 'SCRIPT' && _documentCurrentScript.src || new URL('index.cjs', document.baseURI).href)));
2
- var L=Object.defineProperty;var n=(t,r)=>L(t,"name",{value:r,configurable:true}),m=(t=>typeof require$1<"u"?require$1:typeof Proxy<"u"?new Proxy(t,{get:(r,e)=>(typeof require$1<"u"?require$1:r)[e]}):t)(function(t){if(typeof require$1<"u")return require$1.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var h;(function(t){t.trace="trace",t.debug="debug",t.info="info",t.warn="warn",t.error="error",t.fatal="fatal";})(h||(h={}));var S=n(t=>t||(process.env.LOG_LEVEL?process.env.LOG_LEVEL:process.env.NODE_ENV&&["production","staging","test"].includes(process.env.NODE_ENV)?"info":(process.env.NODE_ENV==="development","debug")),"getLevel"),C=n((t,r)=>{let e;return process.env.NODE_ENV==="production"?e=g__default.default(pinoCloudLogging.gcpLogOptions({level:process.env.PINO_LOG_LEVEL||"info",...r})):e=g__default.default({level:process.env.PINO_LOG_LEVEL||"info",transport:{target:"pino-pretty",options:{colorize:true}},...r}),e.level=t,e},"createLoggerInstance"),c=class{static{n(this,"LoggerInstanceManager");}#t=[];#e;constructor(r){this.#e=C(S(r),{mixin:n(()=>this.addMetadata(),"mixin"),serializers:{...g.stdSerializers,e:g.stdSerializers.errWithCause,err:g.stdSerializers.errWithCause,error:g.stdSerializers.errWithCause,errors(e){return Array.isArray(e)?e.map(g.stdSerializers.errWithCause):g.stdSerializers.errWithCause(e)}}});}winstonLikeLoggerCall(r,e,s){s?this.#e[r](s,e):this.#e[r](e);}addMetadata(){let r={};return this.#t.forEach(e=>{let s=e();Object.assign(r,s);}),r}addContextMiddleware=n(r=>this.#t.push(r),"addContextMiddleware");trace=n((r,e)=>this.winstonLikeLoggerCall("trace",r,e),"trace");debug=n((r,e)=>this.winstonLikeLoggerCall("debug",r,e),"debug");info=n((r,e)=>this.winstonLikeLoggerCall("info",r,e),"info");warn=n((r,e)=>this.winstonLikeLoggerCall("warn",r,e),"warn");error=n((r,e)=>this.winstonLikeLoggerCall("error",r,e),"error");fatal=n((r,e)=>this.winstonLikeLoggerCall("fatal",r,e),"fatal");child=n(r=>this.#e.child(r),"child");get level(){return this.#e.level}},b=n(t=>new c(t),"default");var x=b();async function E({rabbit:t=null,sequelize:r=null,redis:e=null,elasticsearch:s=null}){if(t&&!await t.isConnected())throw new Error("Rabbit is not alive");if(r){let[[{status:u}]]=await r.query("select 'ok' as status");if(u!=="ok")throw new Error("Sequelize is not alive")}return e&&await e.ping(),s&&await s.ping(),{status:"ok"}}n(E,"systemAliveCheck");function f(t){let r=t.logger??x;return async(e,s)=>{try{let u=await E(t);return s.json(u),!0}catch(u){return s.status(500).json({err:u}),r.error("Error on alive endpoint",{err:u}),false}}}n(f,"aliveEndpointMiddleware");var y={bodyParser:"1000mb",helmet:true,morgan:true,nitur:true,stats:true,tracing:true,eagerLoadUserPermissions:true};var w={version:"7.0.7"};function A({logger:t,...r}){let e=v__default.default(),s={...y,...r};if(s.morgan){let i=m("morgan");t.debug("[SuperExpress] formatting is enabled \u2705"),e.use(i((o,a,p)=>{let d={method:o.method(a,p),url:o.url(a,p)??"unknown URL",status:o.status(a,p),contentLength:o.res(a,p,"content-length"),responseTime:o["response-time"](a,p)??"0",userAgent:o["user-agent"](a,p)};t.info(d.url,{httpRequest:{status:d.status,requestUrl:d.url,requestMethod:d.method,responseSize:d.contentLength,latency:{seconds:Number.parseInt(d.responseTime,10)/1e3,nanos:Number.parseInt(d.responseTime,10)*1e6},userAgent:d.userAgent}});}));}if(s.helmet){t.debug("[SuperExpress] security is enabled \u2705");let i={"Content-Security-Policy":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests","Cross-Origin-Opener-Policy":"same-origin","Cross-Origin-Resource-Policy":"same-origin","Origin-Agent-Cluster":"?1","Referrer-Policy":"no-referrer","Strict-Transport-Security":"max-age=15552000; includeSubDomains","X-Content-Type-Options":"nosniff","X-DNS-Prefetch-Control":"off","X-Download-Options":"noopen","X-Frame-Options":"SAMEORIGIN","X-Permitted-Cross-Domain-Policies":"none","X-XSS-Protection":"0"};e.use((o,a,p)=>{a.set(i),p();}),e.disable("x-powered-by");}else t.warn("[SuperExpress] security headers are disabled \u{1F628}");if(s.bodyParser){t.debug("[SuperExpress] body-parser is enabled \u2705");let i=typeof s.bodyParser=="string"?s.bodyParser:"1000mb";e.use(v__default.default.json({limit:i}));}else t.debug("[SuperExpress] body-parser is disabled \u274C");if(s.nitur&&(e.get("/alive",f({logger:t,...s.aliveEndpointOptions})),t.debug("[SuperExpress] added /alive endpoint \u2705")),s.stats){let i=new Date;e.get("/stats",(o,a)=>{a.json({name:s.name||"default-name",version:s.version||"default-version",serverRunningSince:i});}),t.debug("[SuperExpress] added /stats endpoint \u2705");}if(s.tracing){let{enableTracing:i,middleware:o}=m("@autofleet/zehut");i({logger:t}),e.use(o({eagerLoadUserPermissions:s.eagerLoadUserPermissions})),t.debug("[SuperExpress] tracing is enabled \u2705");}let u=e.listen.bind(e);return e.listen=function(i,o){let a=process.env.NODE_ENV==="production",p=w?.version;return t.debug(`[SuperExpress] is started with version ${p}`),t.debug(`[SuperExpress] will listen on port ${i}`),t.debug(`[SuperExpress] production mode: ${a}`),u(i,o)},Object.assign(e,{nativeListen:u})}n(A,"superExpress");var K=A;exports.default=K;exports.superExpress=A;//# sourceMappingURL=index.cjs.map
2
+ var L=Object.defineProperty;var n=(t,r)=>L(t,"name",{value:r,configurable:true}),m=(t=>typeof require$1<"u"?require$1:typeof Proxy<"u"?new Proxy(t,{get:(r,e)=>(typeof require$1<"u"?require$1:r)[e]}):t)(function(t){if(typeof require$1<"u")return require$1.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var h;(function(t){t.trace="trace",t.debug="debug",t.info="info",t.warn="warn",t.error="error",t.fatal="fatal";})(h||(h={}));var S=n(t=>t||(process.env.LOG_LEVEL?process.env.LOG_LEVEL:process.env.NODE_ENV&&["production","staging","test"].includes(process.env.NODE_ENV)?"info":(process.env.NODE_ENV==="development","debug")),"getLevel"),C=n((t,r)=>{let e;return process.env.NODE_ENV==="production"?e=g__default.default(pinoCloudLogging.gcpLogOptions({level:process.env.PINO_LOG_LEVEL||"info",...r})):e=g__default.default({level:process.env.PINO_LOG_LEVEL||"info",transport:{target:"pino-pretty",options:{colorize:true}},...r}),e.level=t,e},"createLoggerInstance"),c=class{static{n(this,"LoggerInstanceManager");}#t=[];#e;constructor(r){this.#e=C(S(r),{mixin:n(()=>this.addMetadata(),"mixin"),serializers:{...g.stdSerializers,e:g.stdSerializers.errWithCause,err:g.stdSerializers.errWithCause,error:g.stdSerializers.errWithCause,errors(e){return Array.isArray(e)?e.map(g.stdSerializers.errWithCause):g.stdSerializers.errWithCause(e)}}});}winstonLikeLoggerCall(r,e,s){s?this.#e[r](s,e):this.#e[r](e);}addMetadata(){let r={};return this.#t.forEach(e=>{let s=e();Object.assign(r,s);}),r}addContextMiddleware=n(r=>this.#t.push(r),"addContextMiddleware");trace=n((r,e)=>this.winstonLikeLoggerCall("trace",r,e),"trace");debug=n((r,e)=>this.winstonLikeLoggerCall("debug",r,e),"debug");info=n((r,e)=>this.winstonLikeLoggerCall("info",r,e),"info");warn=n((r,e)=>this.winstonLikeLoggerCall("warn",r,e),"warn");error=n((r,e)=>this.winstonLikeLoggerCall("error",r,e),"error");fatal=n((r,e)=>this.winstonLikeLoggerCall("fatal",r,e),"fatal");child=n(r=>this.#e.child(r),"child");get level(){return this.#e.level}},b=n(t=>new c(t),"default");var x=b();async function E({rabbit:t=null,sequelize:r=null,redis:e=null,elasticsearch:s=null}){if(t&&!await t.isConnected())throw new Error("Rabbit is not alive");if(r){let[[{status:u}]]=await r.query("select 'ok' as status");if(u!=="ok")throw new Error("Sequelize is not alive")}return e&&await e.ping(),s&&await s.ping(),{status:"ok"}}n(E,"systemAliveCheck");function f(t){let r=t.logger??x;return async(e,s)=>{try{let u=await E(t);return s.json(u),!0}catch(u){return s.status(500).json({err:u}),r.error("Error on alive endpoint",{err:u}),false}}}n(f,"aliveEndpointMiddleware");var y={bodyParser:"1000mb",helmet:true,morgan:true,nitur:true,stats:true,tracing:true,eagerLoadUserPermissions:true};var w={version:"7.0.8"};function A({logger:t,...r}){let e=v__default.default(),s={...y,...r};if(s.morgan){let i=m("morgan");t.debug("[SuperExpress] formatting is enabled \u2705"),e.use(i((o,a,p)=>{let d={method:o.method(a,p),url:o.url(a,p)??"unknown URL",status:o.status(a,p),contentLength:o.res(a,p,"content-length"),responseTime:o["response-time"](a,p)??"0",userAgent:o["user-agent"](a,p)};t.info(d.url,{httpRequest:{status:d.status,requestUrl:d.url,requestMethod:d.method,responseSize:d.contentLength,latency:{seconds:Number.parseInt(d.responseTime,10)/1e3,nanos:Number.parseInt(d.responseTime,10)*1e6},userAgent:d.userAgent}});}));}if(s.helmet){t.debug("[SuperExpress] security is enabled \u2705");let i={"Content-Security-Policy":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests","Cross-Origin-Opener-Policy":"same-origin","Cross-Origin-Resource-Policy":"same-origin","Origin-Agent-Cluster":"?1","Referrer-Policy":"no-referrer","Strict-Transport-Security":"max-age=15552000; includeSubDomains","X-Content-Type-Options":"nosniff","X-DNS-Prefetch-Control":"off","X-Download-Options":"noopen","X-Frame-Options":"SAMEORIGIN","X-Permitted-Cross-Domain-Policies":"none","X-XSS-Protection":"0"};e.use((o,a,p)=>{a.set(i),p();}),e.disable("x-powered-by");}else t.warn("[SuperExpress] security headers are disabled \u{1F628}");if(s.bodyParser){t.debug("[SuperExpress] body-parser is enabled \u2705");let i=typeof s.bodyParser=="string"?s.bodyParser:"1000mb";e.use(v__default.default.json({limit:i}));}else t.debug("[SuperExpress] body-parser is disabled \u274C");if(s.nitur&&(e.get("/alive",f({logger:t,...s.aliveEndpointOptions})),t.debug("[SuperExpress] added /alive endpoint \u2705")),s.stats){let i=new Date;e.get("/stats",(o,a)=>{a.json({name:s.name||"default-name",version:s.version||"default-version",serverRunningSince:i});}),t.debug("[SuperExpress] added /stats endpoint \u2705");}if(s.tracing){let{enableTracing:i,middleware:o}=m("@autofleet/zehut");i({logger:t}),e.use(o({eagerLoadUserPermissions:s.eagerLoadUserPermissions})),t.debug("[SuperExpress] tracing is enabled \u2705");}let u=e.listen.bind(e);return e.listen=function(i,o){let a=process.env.NODE_ENV==="production",p=w?.version;return t.debug(`[SuperExpress] is started with version ${p}`),t.debug(`[SuperExpress] will listen on port ${i}`),t.debug(`[SuperExpress] production mode: ${a}`),u(i,o)},Object.assign(e,{nativeListen:u})}n(A,"superExpress");var K=A;exports.default=K;exports.superExpress=A;//# sourceMappingURL=index.cjs.map
3
3
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../logger/src/index.ts","../../nitur/src/logger.ts","../../nitur/src/alive-endpoint/base.ts","../../nitur/src/alive-endpoint/middleware.ts","../config/default-options.ts","../package.json","../src/index.ts"],"names":["LogLevel","getLevel","__name","logLevel","process","env","LOG_LEVEL","NODE_ENV","includes","createLoggerInstance","level","options","loggerInstance","Pino","gcpLogOptions","PINO_LOG_LEVEL","transport","target","colorize","LoggerInstanceManager","#contextMiddlewares","#logger","constructor","mixin","addMetadata","serializers","stdSerializers","e","errWithCause","err","error","errors","val","Array","isArray","map","winstonLikeLoggerCall","message","meta","newMetadata","forEach","middleware","metadata","Object","assign","addContextMiddleware","push","trace","debug","info","warn","fatal","child","src_default","loglevel","logger_default","Logger","systemAliveCheck","rabbit","sequelize","redis","elasticsearch","isConnected","Error","status","query","ping","aliveEndpointMiddleware","parameters","logger","loggerFallback","_req","res","response","json","defaultOptions","bodyParser","helmet","morgan","nitur","stats","tracing","eagerLoadUserPermissions","package_default","superExpress","app","express","mergedOptions","require","use","tokens","req","values","method","url","contentLength","responseTime","userAgent","httpRequest","requestUrl","requestMethod","responseSize","latency","seconds","Number","parseInt","nanos","HEADERS","next","set","disable","limit","get","aliveEndpoint","aliveEndpointOptions","serverRunningSince","Date","name","version","enableTracing","nativeListen","listen","bind","port","callback","isProd","packageJson","index_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import Pino, { type LoggerOptions, stdSerializers } from 'pino';\nimport { gcpLogOptions } from 'pino-cloud-logging';\n\nexport enum LogLevel {\n trace = 'trace',\n debug = 'debug',\n info = 'info',\n warn = 'warn',\n error = 'error',\n fatal = 'fatal',\n}\n\nconst getLevel = (logLevel?: LogLevel): LogLevel => {\n if (logLevel) return logLevel;\n if (process.env.LOG_LEVEL) return process.env.LOG_LEVEL as LogLevel;\n if (process.env.NODE_ENV && ['production', 'staging', 'test'].includes(process.env.NODE_ENV)) return LogLevel.info;\n if (process.env.NODE_ENV === 'development') return LogLevel.debug;\n return LogLevel.debug;\n};\n\nconst createLoggerInstance = (level: LogLevel, options: Omit<LoggerOptions, 'transport'>): Pino.Logger => {\n let loggerInstance;\n if (process.env.NODE_ENV === 'production') {\n loggerInstance = Pino(gcpLogOptions({\n level: process.env.PINO_LOG_LEVEL || 'info',\n ...options,\n } as object));\n } else {\n loggerInstance = Pino({\n level: process.env.PINO_LOG_LEVEL || 'info',\n transport: {\n target: 'pino-pretty',\n options: {\n colorize: true,\n },\n },\n ...options,\n });\n }\n loggerInstance.level = level;\n return loggerInstance;\n};\n\ntype MiddlewareFunction = () => Record<string, unknown>;\n\nexport class LoggerInstanceManager {\n #contextMiddlewares: MiddlewareFunction[] = [];\n\n #logger: Pino.Logger;\n\n constructor(logLevel?: LogLevel) {\n this.#logger = createLoggerInstance(getLevel(logLevel), {\n mixin: () => this.addMetadata(),\n serializers: {\n ...stdSerializers,\n e: stdSerializers.errWithCause,\n err: stdSerializers.errWithCause,\n error: stdSerializers.errWithCause,\n errors(val) {\n if (Array.isArray(val)) {\n return val.map(stdSerializers.errWithCause);\n }\n return stdSerializers.errWithCause(val);\n },\n },\n });\n }\n\n // To support winston like logging in pino\n private winstonLikeLoggerCall(logLevel: LogLevel, message: string, meta: unknown): void {\n if (meta) {\n this.#logger[logLevel](meta, message);\n } else {\n this.#logger[logLevel](message);\n }\n }\n\n private addMetadata(): Record<string, unknown> {\n const newMetadata = {};\n this.#contextMiddlewares.forEach((middleware) => {\n const metadata = middleware();\n Object.assign(newMetadata, metadata);\n });\n return newMetadata;\n }\n\n addContextMiddleware = (middleware: MiddlewareFunction): number => this.#contextMiddlewares.push(middleware);\n\n trace = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.trace, message, meta);\n\n debug = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.debug, message, meta);\n\n info = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.info, message, meta);\n\n warn = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.warn, message, meta);\n\n error = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.error, message, meta);\n\n fatal = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.fatal, message, meta);\n\n child = (metadata: Record<string, unknown>): Pino.Logger => this.#logger.child(metadata);\n\n get level(): Pino.LevelWithSilentOrString {\n return this.#logger.level;\n }\n}\n\nexport default (loglevel?: `${LogLevel}`): LoggerInstanceManager => new LoggerInstanceManager(loglevel as LogLevel);\n","import Logger from '@autofleet/logger';\n\nexport default Logger();\n","import type loggerFallback from '../logger';\n\nexport interface SystemAliveParameters {\n rabbit?: null | { isConnected: () => PromiseLike<boolean>; };\n sequelize?: null | { query(sql: string | { query: string; values: unknown[]; }): PromiseLike<any>; };\n redis?: null | { ping: () => Promise<void>; };\n elasticsearch?: null | { ping: () => Promise<boolean>; };\n logger?: typeof loggerFallback;\n}\n\nexport async function systemAliveCheck({\n rabbit = null,\n sequelize = null,\n redis = null,\n elasticsearch = null,\n}: SystemAliveParameters): Promise<{ status: 'ok'; }> {\n if (rabbit) {\n const isRabbitAlive = await rabbit.isConnected();\n if (!isRabbitAlive) {\n throw new Error('Rabbit is not alive');\n }\n }\n\n if (sequelize) {\n const [[{ status }]] = await sequelize.query('select \\'ok\\' as status');\n if (status !== 'ok') {\n throw new Error('Sequelize is not alive');\n }\n }\n\n if (redis) {\n await redis.ping();\n }\n\n if (elasticsearch) {\n await elasticsearch.ping();\n }\n\n return { status: 'ok' };\n};\n","import type { Request, Response } from 'express';\nimport loggerFallback from '../logger';\nimport { systemAliveCheck, type SystemAliveParameters } from './base';\n\nexport function aliveEndpointMiddleware(parameters: SystemAliveParameters) {\n const logger = parameters.logger ?? loggerFallback;\n return async (_req: Request, res: Response): Promise<boolean> => {\n try {\n const response = await systemAliveCheck(parameters);\n res.json(response);\n return true;\n } catch (err) {\n res.status(500).json({ err });\n logger.error('Error on alive endpoint', { err });\n return false;\n }\n };\n}\n","import type { LoggerInstanceManager } from '@autofleet/logger';\nimport type { aliveEndpoint } from '@autofleet/nitur';\n\n/** Options to customize the behavior of the SuperExpress application. */\nexport interface Options {\n /** The name of the application. @default 'default-name' */\n name?: string;\n /** The version of the application. @default 'default-version' */\n version?: string;\n /** Enables or disables body parser middleware. if given a string, will be used as the limit for body size @default '1000mb' */\n bodyParser?: boolean | string;\n /** Enables or disables security headers middleware. @default true */\n helmet?: boolean;\n /** Enables or disables HTTP request logging middleware. @default true */\n morgan?: boolean;\n /** Enables or disables the alive endpoint middleware. @default true */\n nitur?: boolean;\n /** Enables or disables the stats endpoint middleware. @default true */\n stats?: boolean;\n /** Enables or disables request tracing middleware. @default true */\n tracing?: boolean;\n /** Enables or disables eager loading of user permissions for tracing middleware. @default true */\n eagerLoadUserPermissions?: boolean;\n /** Options to customize the alive endpoint middleware. */\n aliveEndpointOptions?: Omit<Parameters<typeof aliveEndpoint>[0], 'logger'>;\n /** The servers logger instance. */\n logger: LoggerInstanceManager;\n}\n\nexport const defaultOptions = {\n bodyParser: '1000mb',\n helmet: true,\n morgan: true,\n nitur: true,\n stats: true,\n tracing: true,\n eagerLoadUserPermissions: true,\n} satisfies Omit<Options, 'logger'>;\n","{\n \"name\": \"@autofleet/super-express\",\n \"version\": \"7.0.7\",\n \"description\": \"AF Express with built in boilerplate\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"author\": \"Autofleet\",\n \"license\": \"Proprietary\",\n \"files\": [\n \"dist/\"\n ],\n \"scripts\": {\n \"test\": \"tsx --test\",\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/Autofleet/autorepo.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/Autofleet/autorepo/issues\"\n },\n \"homepage\": \"https://github.com/Autofleet/autorepo/tree/master/packages/super-express#readme\",\n \"dependencies\": {\n \"express\": \"^4.21.2\"\n },\n \"devDependencies\": {\n \"@autofleet/logger\": \"^4.2.1\",\n \"@autofleet/nitur\": \"^2.1.0\",\n \"@autofleet/zehut\": \"^4.0.0\",\n \"@types/express\": \"^4.17.21\",\n \"@types/morgan\": \"^1.9.9\",\n \"@types/supertest\": \"^6.0.2\",\n \"morgan\": \"^1.10.0\",\n \"supertest\": \"^7.0.0\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.19.3\"\n },\n \"peerDependencies\": {\n \"@autofleet/logger\": \">=4.0.0\",\n \"@autofleet/nitur\": \">=2.1.0\",\n \"@autofleet/zehut\": \">=4.0.0\",\n \"morgan\": \"^1.10.0\"\n },\n \"peerDependenciesMeta\": {\n \"@autofleet/nitur\": {\n \"optional\": true\n },\n \"@autofleet/zehut\": {\n \"optional\": true\n },\n \"morgan\": {\n \"optional\": true\n }\n }\n}\n","import type { Server } from 'node:http';\nimport express from 'express';\nimport { aliveEndpoint } from '@autofleet/nitur';\nimport { defaultOptions, type Options } from '../config/default-options.js';\nimport packageJson from '../package.json' with { type: 'json' };\n\n/** Extended express.Application interface which includes nativeListen and the overridden listen method. */\ninterface SuperExpressApp extends Omit<express.Application, 'listen'> {\n /** Original express listen method. */\n nativeListen: express.Application['listen'];\n\n /**\n * Overridden listen method to add custom behavior.\n * @param port - The port number to listen on.\n * @param cb - Optional callback function to execute after the server starts listening.\n */\n listen(port: number, cb?: () => void): Server;\n}\n\n/**\n * Creates a new SuperExpress application with the given options.\n * @param options Optional settings to customize the application.\n * @returns A SuperExpress application instance.\n */\nexport function superExpress({ logger, ...options }: Options): SuperExpressApp {\n const app = express();\n const mergedOptions = { ...defaultOptions, ...options };\n /** Formatting */\n if (mergedOptions.morgan) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const morgan = require('morgan') as typeof import('morgan');\n logger.debug('[SuperExpress] formatting is enabled ✅');\n app.use(morgan((tokens, req, res) => {\n const values = {\n method: tokens.method(req, res),\n url: tokens.url(req, res) ?? 'unknown URL',\n status: tokens.status(req, res),\n contentLength: tokens.res(req, res, 'content-length'),\n responseTime: tokens['response-time'](req, res) ?? '0',\n userAgent: tokens['user-agent'](req, res),\n };\n logger.info(values.url, {\n httpRequest: {\n status: values.status,\n requestUrl: values.url,\n requestMethod: values.method,\n responseSize: values.contentLength,\n latency: {\n seconds: Number.parseInt(values.responseTime, 10) / 1_000,\n nanos: Number.parseInt(values.responseTime, 10) * 1_000_000,\n },\n userAgent: values.userAgent,\n },\n });\n return undefined;\n }));\n }\n /** Security */\n if (mergedOptions.helmet) {\n logger.debug('[SuperExpress] security is enabled ✅');\n // this is what helmet does by default. https://helmetjs.github.io/faq/you-might-not-need-helmet/\n const HEADERS = {\n 'Content-Security-Policy':\n // eslint-disable-next-line @stylistic/max-len\n 'default-src \\'self\\';base-uri \\'self\\';font-src \\'self\\' https: data:;form-action \\'self\\';frame-ancestors \\'self\\';img-src \\'self\\' data:;object-src \\'none\\';script-src \\'self\\';script-src-attr \\'none\\';style-src \\'self\\' https: \\'unsafe-inline\\';upgrade-insecure-requests',\n 'Cross-Origin-Opener-Policy': 'same-origin',\n 'Cross-Origin-Resource-Policy': 'same-origin',\n 'Origin-Agent-Cluster': '?1',\n 'Referrer-Policy': 'no-referrer',\n 'Strict-Transport-Security': 'max-age=15552000; includeSubDomains',\n 'X-Content-Type-Options': 'nosniff',\n 'X-DNS-Prefetch-Control': 'off',\n 'X-Download-Options': 'noopen',\n 'X-Frame-Options': 'SAMEORIGIN',\n 'X-Permitted-Cross-Domain-Policies': 'none',\n 'X-XSS-Protection': '0',\n };\n app.use((_req, res, next) => {\n res.set(HEADERS);\n next();\n });\n app.disable('x-powered-by');\n } else {\n logger.warn('[SuperExpress] security headers are disabled 😨');\n }\n /** Body Parser */\n if (mergedOptions.bodyParser) {\n logger.debug('[SuperExpress] body-parser is enabled ✅');\n const limit = typeof mergedOptions.bodyParser === 'string' ? mergedOptions.bodyParser : '1000mb';\n app.use(express.json({ limit }));\n } else {\n logger.debug('[SuperExpress] body-parser is disabled ❌');\n }\n /** Alive Endpoint */\n if (mergedOptions.nitur) {\n app.get('/alive', aliveEndpoint({ logger, ...mergedOptions.aliveEndpointOptions }));\n logger.debug('[SuperExpress] added /alive endpoint ✅');\n }\n /** Stats Endpoint */\n if (mergedOptions.stats) {\n const serverRunningSince = new Date();\n app.get('/stats', (_req, res) => {\n res.json({\n name: mergedOptions.name || 'default-name',\n version: mergedOptions.version || 'default-version',\n serverRunningSince,\n });\n });\n logger.debug('[SuperExpress] added /stats endpoint ✅');\n }\n /** Tracing */\n if (mergedOptions.tracing) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { enableTracing, middleware } = require('@autofleet/zehut') as typeof import('@autofleet/zehut');\n enableTracing({ logger });\n\n app.use(middleware({\n eagerLoadUserPermissions: mergedOptions.eagerLoadUserPermissions,\n }));\n logger.debug('[SuperExpress] tracing is enabled ✅');\n }\n\n const nativeListen: typeof app['listen'] = app.listen.bind(app);\n app.listen = function (port: number, callback?: () => void) {\n const isProd = process.env.NODE_ENV === 'production';\n const version = packageJson?.version || 'unknown';\n logger.debug(`[SuperExpress] is started with version ${version}`);\n logger.debug(`[SuperExpress] will listen on port ${port}`);\n logger.debug(`[SuperExpress] production mode: ${isProd}`);\n return nativeListen(port, callback);\n } as typeof app['listen'];\n\n return Object.assign(app, { nativeListen }) as SuperExpressApp;\n}\n\nexport default superExpress;\n"]}
1
+ {"version":3,"sources":["../../logger/src/index.ts","../../nitur/src/logger.ts","../../nitur/src/alive-endpoint/base.ts","../../nitur/src/alive-endpoint/middleware.ts","../config/default-options.ts","../package.json","../src/index.ts"],"names":["LogLevel","getLevel","__name","logLevel","process","env","LOG_LEVEL","NODE_ENV","includes","createLoggerInstance","level","options","loggerInstance","Pino","gcpLogOptions","PINO_LOG_LEVEL","transport","target","colorize","LoggerInstanceManager","#contextMiddlewares","#logger","constructor","mixin","addMetadata","serializers","stdSerializers","e","errWithCause","err","error","errors","val","Array","isArray","map","winstonLikeLoggerCall","message","meta","newMetadata","forEach","middleware","metadata","Object","assign","addContextMiddleware","push","trace","debug","info","warn","fatal","child","src_default","loglevel","logger_default","Logger","systemAliveCheck","rabbit","sequelize","redis","elasticsearch","isConnected","Error","status","query","ping","aliveEndpointMiddleware","parameters","logger","loggerFallback","_req","res","response","json","defaultOptions","bodyParser","helmet","morgan","nitur","stats","tracing","eagerLoadUserPermissions","package_default","superExpress","app","express","mergedOptions","require","use","tokens","req","values","method","url","contentLength","responseTime","userAgent","httpRequest","requestUrl","requestMethod","responseSize","latency","seconds","Number","parseInt","nanos","HEADERS","next","set","disable","limit","get","aliveEndpoint","aliveEndpointOptions","serverRunningSince","Date","name","version","enableTracing","nativeListen","listen","bind","port","callback","isProd","packageJson","index_default"],"mappings":"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","file":"index.cjs","sourcesContent":["import Pino, { type LoggerOptions, stdSerializers } from 'pino';\nimport { gcpLogOptions } from 'pino-cloud-logging';\n\nexport enum LogLevel {\n trace = 'trace',\n debug = 'debug',\n info = 'info',\n warn = 'warn',\n error = 'error',\n fatal = 'fatal',\n}\n\nconst getLevel = (logLevel?: LogLevel): LogLevel => {\n if (logLevel) return logLevel;\n if (process.env.LOG_LEVEL) return process.env.LOG_LEVEL as LogLevel;\n if (process.env.NODE_ENV && ['production', 'staging', 'test'].includes(process.env.NODE_ENV)) return LogLevel.info;\n if (process.env.NODE_ENV === 'development') return LogLevel.debug;\n return LogLevel.debug;\n};\n\nconst createLoggerInstance = (level: LogLevel, options: Omit<LoggerOptions, 'transport'>): Pino.Logger => {\n let loggerInstance;\n if (process.env.NODE_ENV === 'production') {\n loggerInstance = Pino(gcpLogOptions({\n level: process.env.PINO_LOG_LEVEL || 'info',\n ...options,\n } as object));\n } else {\n loggerInstance = Pino({\n level: process.env.PINO_LOG_LEVEL || 'info',\n transport: {\n target: 'pino-pretty',\n options: {\n colorize: true,\n },\n },\n ...options,\n });\n }\n loggerInstance.level = level;\n return loggerInstance;\n};\n\ntype MiddlewareFunction = () => Record<string, unknown>;\n\nexport class LoggerInstanceManager {\n #contextMiddlewares: MiddlewareFunction[] = [];\n\n #logger: Pino.Logger;\n\n constructor(logLevel?: LogLevel) {\n this.#logger = createLoggerInstance(getLevel(logLevel), {\n mixin: () => this.addMetadata(),\n serializers: {\n ...stdSerializers,\n e: stdSerializers.errWithCause,\n err: stdSerializers.errWithCause,\n error: stdSerializers.errWithCause,\n errors(val) {\n if (Array.isArray(val)) {\n return val.map(stdSerializers.errWithCause);\n }\n return stdSerializers.errWithCause(val);\n },\n },\n });\n }\n\n // To support winston like logging in pino\n private winstonLikeLoggerCall(logLevel: LogLevel, message: string, meta: unknown): void {\n if (meta) {\n this.#logger[logLevel](meta, message);\n } else {\n this.#logger[logLevel](message);\n }\n }\n\n private addMetadata(): Record<string, unknown> {\n const newMetadata = {};\n this.#contextMiddlewares.forEach((middleware) => {\n const metadata = middleware();\n Object.assign(newMetadata, metadata);\n });\n return newMetadata;\n }\n\n addContextMiddleware = (middleware: MiddlewareFunction): number => this.#contextMiddlewares.push(middleware);\n\n trace = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.trace, message, meta);\n\n debug = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.debug, message, meta);\n\n info = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.info, message, meta);\n\n warn = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.warn, message, meta);\n\n error = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.error, message, meta);\n\n fatal = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.fatal, message, meta);\n\n child = (metadata: Record<string, unknown>): Pino.Logger => this.#logger.child(metadata);\n\n get level(): Pino.LevelWithSilentOrString {\n return this.#logger.level;\n }\n}\n\nexport default (loglevel?: `${LogLevel}`): LoggerInstanceManager => new LoggerInstanceManager(loglevel as LogLevel);\n","import Logger from '@autofleet/logger';\n\nexport default Logger();\n","import type loggerFallback from '../logger';\n\nexport interface SystemAliveParameters {\n rabbit?: null | { isConnected: () => PromiseLike<boolean>; };\n sequelize?: null | { query(sql: string | { query: string; values: unknown[]; }): PromiseLike<any>; };\n redis?: null | { ping: () => Promise<void>; };\n elasticsearch?: null | { ping: () => Promise<boolean>; };\n logger?: typeof loggerFallback;\n}\n\nexport async function systemAliveCheck({\n rabbit = null,\n sequelize = null,\n redis = null,\n elasticsearch = null,\n}: SystemAliveParameters): Promise<{ status: 'ok'; }> {\n if (rabbit) {\n const isRabbitAlive = await rabbit.isConnected();\n if (!isRabbitAlive) {\n throw new Error('Rabbit is not alive');\n }\n }\n\n if (sequelize) {\n const [[{ status }]] = await sequelize.query('select \\'ok\\' as status');\n if (status !== 'ok') {\n throw new Error('Sequelize is not alive');\n }\n }\n\n if (redis) {\n await redis.ping();\n }\n\n if (elasticsearch) {\n await elasticsearch.ping();\n }\n\n return { status: 'ok' };\n};\n","import type { Request, Response } from 'express';\nimport loggerFallback from '../logger';\nimport { systemAliveCheck, type SystemAliveParameters } from './base';\n\nexport function aliveEndpointMiddleware(parameters: SystemAliveParameters) {\n const logger = parameters.logger ?? loggerFallback;\n return async (_req: Request, res: Response): Promise<boolean> => {\n try {\n const response = await systemAliveCheck(parameters);\n res.json(response);\n return true;\n } catch (err) {\n res.status(500).json({ err });\n logger.error('Error on alive endpoint', { err });\n return false;\n }\n };\n}\n","import type { LoggerInstanceManager } from '@autofleet/logger';\nimport type { aliveEndpoint } from '@autofleet/nitur';\n\n/** Options to customize the behavior of the SuperExpress application. */\nexport interface Options {\n /** The name of the application. @default 'default-name' */\n name?: string;\n /** The version of the application. @default 'default-version' */\n version?: string;\n /** Enables or disables body parser middleware. if given a string, will be used as the limit for body size @default '1000mb' */\n bodyParser?: boolean | string;\n /** Enables or disables security headers middleware. @default true */\n helmet?: boolean;\n /** Enables or disables HTTP request logging middleware. @default true */\n morgan?: boolean;\n /** Enables or disables the alive endpoint middleware. @default true */\n nitur?: boolean;\n /** Enables or disables the stats endpoint middleware. @default true */\n stats?: boolean;\n /** Enables or disables request tracing middleware. @default true */\n tracing?: boolean;\n /** Enables or disables eager loading of user permissions for tracing middleware. @default true */\n eagerLoadUserPermissions?: boolean;\n /** Options to customize the alive endpoint middleware. */\n aliveEndpointOptions?: Omit<Parameters<typeof aliveEndpoint>[0], 'logger'>;\n /** The servers logger instance. */\n logger: LoggerInstanceManager;\n}\n\nexport const defaultOptions = {\n bodyParser: '1000mb',\n helmet: true,\n morgan: true,\n nitur: true,\n stats: true,\n tracing: true,\n eagerLoadUserPermissions: true,\n} satisfies Omit<Options, 'logger'>;\n","{\n \"name\": \"@autofleet/super-express\",\n \"version\": \"7.0.8\",\n \"description\": \"AF Express with built in boilerplate\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"author\": \"Autofleet\",\n \"license\": \"Proprietary\",\n \"files\": [\n \"dist/\"\n ],\n \"scripts\": {\n \"test\": \"tsx --test\",\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/Autofleet/autorepo.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/Autofleet/autorepo/issues\"\n },\n \"homepage\": \"https://github.com/Autofleet/autorepo/tree/master/packages/super-express#readme\",\n \"dependencies\": {\n \"express\": \"^4.21.2\"\n },\n \"devDependencies\": {\n \"@autofleet/logger\": \"^4.2.1\",\n \"@autofleet/nitur\": \"^2.1.0\",\n \"@autofleet/zehut\": \"^4.0.0\",\n \"@types/express\": \"^4.17.21\",\n \"@types/morgan\": \"^1.9.9\",\n \"@types/supertest\": \"^6.0.2\",\n \"morgan\": \"^1.10.0\",\n \"supertest\": \"^7.0.0\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.19.3\"\n },\n \"peerDependencies\": {\n \"@autofleet/logger\": \">=4.0.0\",\n \"@autofleet/nitur\": \">=2.1.0\",\n \"@autofleet/zehut\": \">=4.0.0\",\n \"morgan\": \"^1.10.0\"\n },\n \"peerDependenciesMeta\": {\n \"@autofleet/nitur\": {\n \"optional\": true\n },\n \"@autofleet/zehut\": {\n \"optional\": true\n },\n \"morgan\": {\n \"optional\": true\n }\n }\n}\n","import type { Server } from 'node:http';\nimport express from 'express';\nimport { aliveEndpoint } from '@autofleet/nitur';\nimport { defaultOptions, type Options } from '../config/default-options.js';\nimport packageJson from '../package.json' with { type: 'json' };\n\n/** Extended express.Application interface which includes nativeListen and the overridden listen method. */\ninterface SuperExpressApp extends Omit<express.Application, 'listen'> {\n /** Original express listen method. */\n nativeListen: express.Application['listen'];\n\n /**\n * Overridden listen method to add custom behavior.\n * @param port - The port number to listen on.\n * @param cb - Optional callback function to execute after the server starts listening.\n */\n listen(port: number, cb?: () => void): Server;\n}\n\n/**\n * Creates a new SuperExpress application with the given options.\n * @param options Optional settings to customize the application.\n * @returns A SuperExpress application instance.\n */\nexport function superExpress({ logger, ...options }: Options): SuperExpressApp {\n const app = express();\n const mergedOptions = { ...defaultOptions, ...options };\n /** Formatting */\n if (mergedOptions.morgan) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const morgan = require('morgan') as typeof import('morgan');\n logger.debug('[SuperExpress] formatting is enabled ✅');\n app.use(morgan((tokens, req, res) => {\n const values = {\n method: tokens.method(req, res),\n url: tokens.url(req, res) ?? 'unknown URL',\n status: tokens.status(req, res),\n contentLength: tokens.res(req, res, 'content-length'),\n responseTime: tokens['response-time'](req, res) ?? '0',\n userAgent: tokens['user-agent'](req, res),\n };\n logger.info(values.url, {\n httpRequest: {\n status: values.status,\n requestUrl: values.url,\n requestMethod: values.method,\n responseSize: values.contentLength,\n latency: {\n seconds: Number.parseInt(values.responseTime, 10) / 1_000,\n nanos: Number.parseInt(values.responseTime, 10) * 1_000_000,\n },\n userAgent: values.userAgent,\n },\n });\n return undefined;\n }));\n }\n /** Security */\n if (mergedOptions.helmet) {\n logger.debug('[SuperExpress] security is enabled ✅');\n // this is what helmet does by default. https://helmetjs.github.io/faq/you-might-not-need-helmet/\n const HEADERS = {\n 'Content-Security-Policy':\n // eslint-disable-next-line @stylistic/max-len\n 'default-src \\'self\\';base-uri \\'self\\';font-src \\'self\\' https: data:;form-action \\'self\\';frame-ancestors \\'self\\';img-src \\'self\\' data:;object-src \\'none\\';script-src \\'self\\';script-src-attr \\'none\\';style-src \\'self\\' https: \\'unsafe-inline\\';upgrade-insecure-requests',\n 'Cross-Origin-Opener-Policy': 'same-origin',\n 'Cross-Origin-Resource-Policy': 'same-origin',\n 'Origin-Agent-Cluster': '?1',\n 'Referrer-Policy': 'no-referrer',\n 'Strict-Transport-Security': 'max-age=15552000; includeSubDomains',\n 'X-Content-Type-Options': 'nosniff',\n 'X-DNS-Prefetch-Control': 'off',\n 'X-Download-Options': 'noopen',\n 'X-Frame-Options': 'SAMEORIGIN',\n 'X-Permitted-Cross-Domain-Policies': 'none',\n 'X-XSS-Protection': '0',\n };\n app.use((_req, res, next) => {\n res.set(HEADERS);\n next();\n });\n app.disable('x-powered-by');\n } else {\n logger.warn('[SuperExpress] security headers are disabled 😨');\n }\n /** Body Parser */\n if (mergedOptions.bodyParser) {\n logger.debug('[SuperExpress] body-parser is enabled ✅');\n const limit = typeof mergedOptions.bodyParser === 'string' ? mergedOptions.bodyParser : '1000mb';\n app.use(express.json({ limit }));\n } else {\n logger.debug('[SuperExpress] body-parser is disabled ❌');\n }\n /** Alive Endpoint */\n if (mergedOptions.nitur) {\n app.get('/alive', aliveEndpoint({ logger, ...mergedOptions.aliveEndpointOptions }));\n logger.debug('[SuperExpress] added /alive endpoint ✅');\n }\n /** Stats Endpoint */\n if (mergedOptions.stats) {\n const serverRunningSince = new Date();\n app.get('/stats', (_req, res) => {\n res.json({\n name: mergedOptions.name || 'default-name',\n version: mergedOptions.version || 'default-version',\n serverRunningSince,\n });\n });\n logger.debug('[SuperExpress] added /stats endpoint ✅');\n }\n /** Tracing */\n if (mergedOptions.tracing) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { enableTracing, middleware } = require('@autofleet/zehut') as typeof import('@autofleet/zehut');\n enableTracing({ logger });\n\n app.use(middleware({\n eagerLoadUserPermissions: mergedOptions.eagerLoadUserPermissions,\n }));\n logger.debug('[SuperExpress] tracing is enabled ✅');\n }\n\n const nativeListen: typeof app['listen'] = app.listen.bind(app);\n app.listen = function (port: number, callback?: () => void) {\n const isProd = process.env.NODE_ENV === 'production';\n const version = packageJson?.version || 'unknown';\n logger.debug(`[SuperExpress] is started with version ${version}`);\n logger.debug(`[SuperExpress] will listen on port ${port}`);\n logger.debug(`[SuperExpress] production mode: ${isProd}`);\n return nativeListen(port, callback);\n } as typeof app['listen'];\n\n return Object.assign(app, { nativeListen }) as SuperExpressApp;\n}\n\nexport default superExpress;\n"]}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
1
  import {createRequire}from'node:module';import v from'express';import g,{stdSerializers}from'pino';import {gcpLogOptions}from'pino-cloud-logging';var require=createRequire(import.meta.url);
2
- var L=Object.defineProperty;var n=(t,r)=>L(t,"name",{value:r,configurable:true}),m=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(r,e)=>(typeof require<"u"?require:r)[e]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var h;(function(t){t.trace="trace",t.debug="debug",t.info="info",t.warn="warn",t.error="error",t.fatal="fatal";})(h||(h={}));var S=n(t=>t||(process.env.LOG_LEVEL?process.env.LOG_LEVEL:process.env.NODE_ENV&&["production","staging","test"].includes(process.env.NODE_ENV)?"info":(process.env.NODE_ENV==="development","debug")),"getLevel"),C=n((t,r)=>{let e;return process.env.NODE_ENV==="production"?e=g(gcpLogOptions({level:process.env.PINO_LOG_LEVEL||"info",...r})):e=g({level:process.env.PINO_LOG_LEVEL||"info",transport:{target:"pino-pretty",options:{colorize:true}},...r}),e.level=t,e},"createLoggerInstance"),c=class{static{n(this,"LoggerInstanceManager");}#t=[];#e;constructor(r){this.#e=C(S(r),{mixin:n(()=>this.addMetadata(),"mixin"),serializers:{...stdSerializers,e:stdSerializers.errWithCause,err:stdSerializers.errWithCause,error:stdSerializers.errWithCause,errors(e){return Array.isArray(e)?e.map(stdSerializers.errWithCause):stdSerializers.errWithCause(e)}}});}winstonLikeLoggerCall(r,e,s){s?this.#e[r](s,e):this.#e[r](e);}addMetadata(){let r={};return this.#t.forEach(e=>{let s=e();Object.assign(r,s);}),r}addContextMiddleware=n(r=>this.#t.push(r),"addContextMiddleware");trace=n((r,e)=>this.winstonLikeLoggerCall("trace",r,e),"trace");debug=n((r,e)=>this.winstonLikeLoggerCall("debug",r,e),"debug");info=n((r,e)=>this.winstonLikeLoggerCall("info",r,e),"info");warn=n((r,e)=>this.winstonLikeLoggerCall("warn",r,e),"warn");error=n((r,e)=>this.winstonLikeLoggerCall("error",r,e),"error");fatal=n((r,e)=>this.winstonLikeLoggerCall("fatal",r,e),"fatal");child=n(r=>this.#e.child(r),"child");get level(){return this.#e.level}},b=n(t=>new c(t),"default");var x=b();async function E({rabbit:t=null,sequelize:r=null,redis:e=null,elasticsearch:s=null}){if(t&&!await t.isConnected())throw new Error("Rabbit is not alive");if(r){let[[{status:u}]]=await r.query("select 'ok' as status");if(u!=="ok")throw new Error("Sequelize is not alive")}return e&&await e.ping(),s&&await s.ping(),{status:"ok"}}n(E,"systemAliveCheck");function f(t){let r=t.logger??x;return async(e,s)=>{try{let u=await E(t);return s.json(u),!0}catch(u){return s.status(500).json({err:u}),r.error("Error on alive endpoint",{err:u}),false}}}n(f,"aliveEndpointMiddleware");var y={bodyParser:"1000mb",helmet:true,morgan:true,nitur:true,stats:true,tracing:true,eagerLoadUserPermissions:true};var w={version:"7.0.7"};function A({logger:t,...r}){let e=v(),s={...y,...r};if(s.morgan){let i=m("morgan");t.debug("[SuperExpress] formatting is enabled \u2705"),e.use(i((o,a,p)=>{let d={method:o.method(a,p),url:o.url(a,p)??"unknown URL",status:o.status(a,p),contentLength:o.res(a,p,"content-length"),responseTime:o["response-time"](a,p)??"0",userAgent:o["user-agent"](a,p)};t.info(d.url,{httpRequest:{status:d.status,requestUrl:d.url,requestMethod:d.method,responseSize:d.contentLength,latency:{seconds:Number.parseInt(d.responseTime,10)/1e3,nanos:Number.parseInt(d.responseTime,10)*1e6},userAgent:d.userAgent}});}));}if(s.helmet){t.debug("[SuperExpress] security is enabled \u2705");let i={"Content-Security-Policy":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests","Cross-Origin-Opener-Policy":"same-origin","Cross-Origin-Resource-Policy":"same-origin","Origin-Agent-Cluster":"?1","Referrer-Policy":"no-referrer","Strict-Transport-Security":"max-age=15552000; includeSubDomains","X-Content-Type-Options":"nosniff","X-DNS-Prefetch-Control":"off","X-Download-Options":"noopen","X-Frame-Options":"SAMEORIGIN","X-Permitted-Cross-Domain-Policies":"none","X-XSS-Protection":"0"};e.use((o,a,p)=>{a.set(i),p();}),e.disable("x-powered-by");}else t.warn("[SuperExpress] security headers are disabled \u{1F628}");if(s.bodyParser){t.debug("[SuperExpress] body-parser is enabled \u2705");let i=typeof s.bodyParser=="string"?s.bodyParser:"1000mb";e.use(v.json({limit:i}));}else t.debug("[SuperExpress] body-parser is disabled \u274C");if(s.nitur&&(e.get("/alive",f({logger:t,...s.aliveEndpointOptions})),t.debug("[SuperExpress] added /alive endpoint \u2705")),s.stats){let i=new Date;e.get("/stats",(o,a)=>{a.json({name:s.name||"default-name",version:s.version||"default-version",serverRunningSince:i});}),t.debug("[SuperExpress] added /stats endpoint \u2705");}if(s.tracing){let{enableTracing:i,middleware:o}=m("@autofleet/zehut");i({logger:t}),e.use(o({eagerLoadUserPermissions:s.eagerLoadUserPermissions})),t.debug("[SuperExpress] tracing is enabled \u2705");}let u=e.listen.bind(e);return e.listen=function(i,o){let a=process.env.NODE_ENV==="production",p=w?.version;return t.debug(`[SuperExpress] is started with version ${p}`),t.debug(`[SuperExpress] will listen on port ${i}`),t.debug(`[SuperExpress] production mode: ${a}`),u(i,o)},Object.assign(e,{nativeListen:u})}n(A,"superExpress");var K=A;export{K as default,A as superExpress};//# sourceMappingURL=index.js.map
2
+ var L=Object.defineProperty;var n=(t,r)=>L(t,"name",{value:r,configurable:true}),m=(t=>typeof require<"u"?require:typeof Proxy<"u"?new Proxy(t,{get:(r,e)=>(typeof require<"u"?require:r)[e]}):t)(function(t){if(typeof require<"u")return require.apply(this,arguments);throw Error('Dynamic require of "'+t+'" is not supported')});var h;(function(t){t.trace="trace",t.debug="debug",t.info="info",t.warn="warn",t.error="error",t.fatal="fatal";})(h||(h={}));var S=n(t=>t||(process.env.LOG_LEVEL?process.env.LOG_LEVEL:process.env.NODE_ENV&&["production","staging","test"].includes(process.env.NODE_ENV)?"info":(process.env.NODE_ENV==="development","debug")),"getLevel"),C=n((t,r)=>{let e;return process.env.NODE_ENV==="production"?e=g(gcpLogOptions({level:process.env.PINO_LOG_LEVEL||"info",...r})):e=g({level:process.env.PINO_LOG_LEVEL||"info",transport:{target:"pino-pretty",options:{colorize:true}},...r}),e.level=t,e},"createLoggerInstance"),c=class{static{n(this,"LoggerInstanceManager");}#t=[];#e;constructor(r){this.#e=C(S(r),{mixin:n(()=>this.addMetadata(),"mixin"),serializers:{...stdSerializers,e:stdSerializers.errWithCause,err:stdSerializers.errWithCause,error:stdSerializers.errWithCause,errors(e){return Array.isArray(e)?e.map(stdSerializers.errWithCause):stdSerializers.errWithCause(e)}}});}winstonLikeLoggerCall(r,e,s){s?this.#e[r](s,e):this.#e[r](e);}addMetadata(){let r={};return this.#t.forEach(e=>{let s=e();Object.assign(r,s);}),r}addContextMiddleware=n(r=>this.#t.push(r),"addContextMiddleware");trace=n((r,e)=>this.winstonLikeLoggerCall("trace",r,e),"trace");debug=n((r,e)=>this.winstonLikeLoggerCall("debug",r,e),"debug");info=n((r,e)=>this.winstonLikeLoggerCall("info",r,e),"info");warn=n((r,e)=>this.winstonLikeLoggerCall("warn",r,e),"warn");error=n((r,e)=>this.winstonLikeLoggerCall("error",r,e),"error");fatal=n((r,e)=>this.winstonLikeLoggerCall("fatal",r,e),"fatal");child=n(r=>this.#e.child(r),"child");get level(){return this.#e.level}},b=n(t=>new c(t),"default");var x=b();async function E({rabbit:t=null,sequelize:r=null,redis:e=null,elasticsearch:s=null}){if(t&&!await t.isConnected())throw new Error("Rabbit is not alive");if(r){let[[{status:u}]]=await r.query("select 'ok' as status");if(u!=="ok")throw new Error("Sequelize is not alive")}return e&&await e.ping(),s&&await s.ping(),{status:"ok"}}n(E,"systemAliveCheck");function f(t){let r=t.logger??x;return async(e,s)=>{try{let u=await E(t);return s.json(u),!0}catch(u){return s.status(500).json({err:u}),r.error("Error on alive endpoint",{err:u}),false}}}n(f,"aliveEndpointMiddleware");var y={bodyParser:"1000mb",helmet:true,morgan:true,nitur:true,stats:true,tracing:true,eagerLoadUserPermissions:true};var w={version:"7.0.8"};function A({logger:t,...r}){let e=v(),s={...y,...r};if(s.morgan){let i=m("morgan");t.debug("[SuperExpress] formatting is enabled \u2705"),e.use(i((o,a,p)=>{let d={method:o.method(a,p),url:o.url(a,p)??"unknown URL",status:o.status(a,p),contentLength:o.res(a,p,"content-length"),responseTime:o["response-time"](a,p)??"0",userAgent:o["user-agent"](a,p)};t.info(d.url,{httpRequest:{status:d.status,requestUrl:d.url,requestMethod:d.method,responseSize:d.contentLength,latency:{seconds:Number.parseInt(d.responseTime,10)/1e3,nanos:Number.parseInt(d.responseTime,10)*1e6},userAgent:d.userAgent}});}));}if(s.helmet){t.debug("[SuperExpress] security is enabled \u2705");let i={"Content-Security-Policy":"default-src 'self';base-uri 'self';font-src 'self' https: data:;form-action 'self';frame-ancestors 'self';img-src 'self' data:;object-src 'none';script-src 'self';script-src-attr 'none';style-src 'self' https: 'unsafe-inline';upgrade-insecure-requests","Cross-Origin-Opener-Policy":"same-origin","Cross-Origin-Resource-Policy":"same-origin","Origin-Agent-Cluster":"?1","Referrer-Policy":"no-referrer","Strict-Transport-Security":"max-age=15552000; includeSubDomains","X-Content-Type-Options":"nosniff","X-DNS-Prefetch-Control":"off","X-Download-Options":"noopen","X-Frame-Options":"SAMEORIGIN","X-Permitted-Cross-Domain-Policies":"none","X-XSS-Protection":"0"};e.use((o,a,p)=>{a.set(i),p();}),e.disable("x-powered-by");}else t.warn("[SuperExpress] security headers are disabled \u{1F628}");if(s.bodyParser){t.debug("[SuperExpress] body-parser is enabled \u2705");let i=typeof s.bodyParser=="string"?s.bodyParser:"1000mb";e.use(v.json({limit:i}));}else t.debug("[SuperExpress] body-parser is disabled \u274C");if(s.nitur&&(e.get("/alive",f({logger:t,...s.aliveEndpointOptions})),t.debug("[SuperExpress] added /alive endpoint \u2705")),s.stats){let i=new Date;e.get("/stats",(o,a)=>{a.json({name:s.name||"default-name",version:s.version||"default-version",serverRunningSince:i});}),t.debug("[SuperExpress] added /stats endpoint \u2705");}if(s.tracing){let{enableTracing:i,middleware:o}=m("@autofleet/zehut");i({logger:t}),e.use(o({eagerLoadUserPermissions:s.eagerLoadUserPermissions})),t.debug("[SuperExpress] tracing is enabled \u2705");}let u=e.listen.bind(e);return e.listen=function(i,o){let a=process.env.NODE_ENV==="production",p=w?.version;return t.debug(`[SuperExpress] is started with version ${p}`),t.debug(`[SuperExpress] will listen on port ${i}`),t.debug(`[SuperExpress] production mode: ${a}`),u(i,o)},Object.assign(e,{nativeListen:u})}n(A,"superExpress");var K=A;export{K as default,A as superExpress};//# sourceMappingURL=index.js.map
3
3
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"sources":["../../logger/src/index.ts","../../nitur/src/logger.ts","../../nitur/src/alive-endpoint/base.ts","../../nitur/src/alive-endpoint/middleware.ts","../config/default-options.ts","../package.json","../src/index.ts"],"names":["LogLevel","getLevel","__name","logLevel","process","env","LOG_LEVEL","NODE_ENV","includes","createLoggerInstance","level","options","loggerInstance","Pino","gcpLogOptions","PINO_LOG_LEVEL","transport","target","colorize","LoggerInstanceManager","#contextMiddlewares","#logger","constructor","mixin","addMetadata","serializers","stdSerializers","e","errWithCause","err","error","errors","val","Array","isArray","map","winstonLikeLoggerCall","message","meta","newMetadata","forEach","middleware","metadata","Object","assign","addContextMiddleware","push","trace","debug","info","warn","fatal","child","src_default","loglevel","logger_default","Logger","systemAliveCheck","rabbit","sequelize","redis","elasticsearch","isConnected","Error","status","query","ping","aliveEndpointMiddleware","parameters","logger","loggerFallback","_req","res","response","json","defaultOptions","bodyParser","helmet","morgan","nitur","stats","tracing","eagerLoadUserPermissions","package_default","superExpress","app","express","mergedOptions","require","use","tokens","req","values","method","url","contentLength","responseTime","userAgent","httpRequest","requestUrl","requestMethod","responseSize","latency","seconds","Number","parseInt","nanos","HEADERS","next","set","disable","limit","get","aliveEndpoint","aliveEndpointOptions","serverRunningSince","Date","name","version","enableTracing","nativeListen","listen","bind","port","callback","isProd","packageJson","index_default"],"mappings":"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","file":"index.js","sourcesContent":["import Pino, { type LoggerOptions, stdSerializers } from 'pino';\nimport { gcpLogOptions } from 'pino-cloud-logging';\n\nexport enum LogLevel {\n trace = 'trace',\n debug = 'debug',\n info = 'info',\n warn = 'warn',\n error = 'error',\n fatal = 'fatal',\n}\n\nconst getLevel = (logLevel?: LogLevel): LogLevel => {\n if (logLevel) return logLevel;\n if (process.env.LOG_LEVEL) return process.env.LOG_LEVEL as LogLevel;\n if (process.env.NODE_ENV && ['production', 'staging', 'test'].includes(process.env.NODE_ENV)) return LogLevel.info;\n if (process.env.NODE_ENV === 'development') return LogLevel.debug;\n return LogLevel.debug;\n};\n\nconst createLoggerInstance = (level: LogLevel, options: Omit<LoggerOptions, 'transport'>): Pino.Logger => {\n let loggerInstance;\n if (process.env.NODE_ENV === 'production') {\n loggerInstance = Pino(gcpLogOptions({\n level: process.env.PINO_LOG_LEVEL || 'info',\n ...options,\n } as object));\n } else {\n loggerInstance = Pino({\n level: process.env.PINO_LOG_LEVEL || 'info',\n transport: {\n target: 'pino-pretty',\n options: {\n colorize: true,\n },\n },\n ...options,\n });\n }\n loggerInstance.level = level;\n return loggerInstance;\n};\n\ntype MiddlewareFunction = () => Record<string, unknown>;\n\nexport class LoggerInstanceManager {\n #contextMiddlewares: MiddlewareFunction[] = [];\n\n #logger: Pino.Logger;\n\n constructor(logLevel?: LogLevel) {\n this.#logger = createLoggerInstance(getLevel(logLevel), {\n mixin: () => this.addMetadata(),\n serializers: {\n ...stdSerializers,\n e: stdSerializers.errWithCause,\n err: stdSerializers.errWithCause,\n error: stdSerializers.errWithCause,\n errors(val) {\n if (Array.isArray(val)) {\n return val.map(stdSerializers.errWithCause);\n }\n return stdSerializers.errWithCause(val);\n },\n },\n });\n }\n\n // To support winston like logging in pino\n private winstonLikeLoggerCall(logLevel: LogLevel, message: string, meta: unknown): void {\n if (meta) {\n this.#logger[logLevel](meta, message);\n } else {\n this.#logger[logLevel](message);\n }\n }\n\n private addMetadata(): Record<string, unknown> {\n const newMetadata = {};\n this.#contextMiddlewares.forEach((middleware) => {\n const metadata = middleware();\n Object.assign(newMetadata, metadata);\n });\n return newMetadata;\n }\n\n addContextMiddleware = (middleware: MiddlewareFunction): number => this.#contextMiddlewares.push(middleware);\n\n trace = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.trace, message, meta);\n\n debug = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.debug, message, meta);\n\n info = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.info, message, meta);\n\n warn = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.warn, message, meta);\n\n error = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.error, message, meta);\n\n fatal = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.fatal, message, meta);\n\n child = (metadata: Record<string, unknown>): Pino.Logger => this.#logger.child(metadata);\n\n get level(): Pino.LevelWithSilentOrString {\n return this.#logger.level;\n }\n}\n\nexport default (loglevel?: `${LogLevel}`): LoggerInstanceManager => new LoggerInstanceManager(loglevel as LogLevel);\n","import Logger from '@autofleet/logger';\n\nexport default Logger();\n","import type loggerFallback from '../logger';\n\nexport interface SystemAliveParameters {\n rabbit?: null | { isConnected: () => PromiseLike<boolean>; };\n sequelize?: null | { query(sql: string | { query: string; values: unknown[]; }): PromiseLike<any>; };\n redis?: null | { ping: () => Promise<void>; };\n elasticsearch?: null | { ping: () => Promise<boolean>; };\n logger?: typeof loggerFallback;\n}\n\nexport async function systemAliveCheck({\n rabbit = null,\n sequelize = null,\n redis = null,\n elasticsearch = null,\n}: SystemAliveParameters): Promise<{ status: 'ok'; }> {\n if (rabbit) {\n const isRabbitAlive = await rabbit.isConnected();\n if (!isRabbitAlive) {\n throw new Error('Rabbit is not alive');\n }\n }\n\n if (sequelize) {\n const [[{ status }]] = await sequelize.query('select \\'ok\\' as status');\n if (status !== 'ok') {\n throw new Error('Sequelize is not alive');\n }\n }\n\n if (redis) {\n await redis.ping();\n }\n\n if (elasticsearch) {\n await elasticsearch.ping();\n }\n\n return { status: 'ok' };\n};\n","import type { Request, Response } from 'express';\nimport loggerFallback from '../logger';\nimport { systemAliveCheck, type SystemAliveParameters } from './base';\n\nexport function aliveEndpointMiddleware(parameters: SystemAliveParameters) {\n const logger = parameters.logger ?? loggerFallback;\n return async (_req: Request, res: Response): Promise<boolean> => {\n try {\n const response = await systemAliveCheck(parameters);\n res.json(response);\n return true;\n } catch (err) {\n res.status(500).json({ err });\n logger.error('Error on alive endpoint', { err });\n return false;\n }\n };\n}\n","import type { LoggerInstanceManager } from '@autofleet/logger';\nimport type { aliveEndpoint } from '@autofleet/nitur';\n\n/** Options to customize the behavior of the SuperExpress application. */\nexport interface Options {\n /** The name of the application. @default 'default-name' */\n name?: string;\n /** The version of the application. @default 'default-version' */\n version?: string;\n /** Enables or disables body parser middleware. if given a string, will be used as the limit for body size @default '1000mb' */\n bodyParser?: boolean | string;\n /** Enables or disables security headers middleware. @default true */\n helmet?: boolean;\n /** Enables or disables HTTP request logging middleware. @default true */\n morgan?: boolean;\n /** Enables or disables the alive endpoint middleware. @default true */\n nitur?: boolean;\n /** Enables or disables the stats endpoint middleware. @default true */\n stats?: boolean;\n /** Enables or disables request tracing middleware. @default true */\n tracing?: boolean;\n /** Enables or disables eager loading of user permissions for tracing middleware. @default true */\n eagerLoadUserPermissions?: boolean;\n /** Options to customize the alive endpoint middleware. */\n aliveEndpointOptions?: Omit<Parameters<typeof aliveEndpoint>[0], 'logger'>;\n /** The servers logger instance. */\n logger: LoggerInstanceManager;\n}\n\nexport const defaultOptions = {\n bodyParser: '1000mb',\n helmet: true,\n morgan: true,\n nitur: true,\n stats: true,\n tracing: true,\n eagerLoadUserPermissions: true,\n} satisfies Omit<Options, 'logger'>;\n","{\n \"name\": \"@autofleet/super-express\",\n \"version\": \"7.0.7\",\n \"description\": \"AF Express with built in boilerplate\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"author\": \"Autofleet\",\n \"license\": \"Proprietary\",\n \"files\": [\n \"dist/\"\n ],\n \"scripts\": {\n \"test\": \"tsx --test\",\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/Autofleet/autorepo.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/Autofleet/autorepo/issues\"\n },\n \"homepage\": \"https://github.com/Autofleet/autorepo/tree/master/packages/super-express#readme\",\n \"dependencies\": {\n \"express\": \"^4.21.2\"\n },\n \"devDependencies\": {\n \"@autofleet/logger\": \"^4.2.1\",\n \"@autofleet/nitur\": \"^2.1.0\",\n \"@autofleet/zehut\": \"^4.0.0\",\n \"@types/express\": \"^4.17.21\",\n \"@types/morgan\": \"^1.9.9\",\n \"@types/supertest\": \"^6.0.2\",\n \"morgan\": \"^1.10.0\",\n \"supertest\": \"^7.0.0\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.19.3\"\n },\n \"peerDependencies\": {\n \"@autofleet/logger\": \">=4.0.0\",\n \"@autofleet/nitur\": \">=2.1.0\",\n \"@autofleet/zehut\": \">=4.0.0\",\n \"morgan\": \"^1.10.0\"\n },\n \"peerDependenciesMeta\": {\n \"@autofleet/nitur\": {\n \"optional\": true\n },\n \"@autofleet/zehut\": {\n \"optional\": true\n },\n \"morgan\": {\n \"optional\": true\n }\n }\n}\n","import type { Server } from 'node:http';\nimport express from 'express';\nimport { aliveEndpoint } from '@autofleet/nitur';\nimport { defaultOptions, type Options } from '../config/default-options.js';\nimport packageJson from '../package.json' with { type: 'json' };\n\n/** Extended express.Application interface which includes nativeListen and the overridden listen method. */\ninterface SuperExpressApp extends Omit<express.Application, 'listen'> {\n /** Original express listen method. */\n nativeListen: express.Application['listen'];\n\n /**\n * Overridden listen method to add custom behavior.\n * @param port - The port number to listen on.\n * @param cb - Optional callback function to execute after the server starts listening.\n */\n listen(port: number, cb?: () => void): Server;\n}\n\n/**\n * Creates a new SuperExpress application with the given options.\n * @param options Optional settings to customize the application.\n * @returns A SuperExpress application instance.\n */\nexport function superExpress({ logger, ...options }: Options): SuperExpressApp {\n const app = express();\n const mergedOptions = { ...defaultOptions, ...options };\n /** Formatting */\n if (mergedOptions.morgan) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const morgan = require('morgan') as typeof import('morgan');\n logger.debug('[SuperExpress] formatting is enabled ✅');\n app.use(morgan((tokens, req, res) => {\n const values = {\n method: tokens.method(req, res),\n url: tokens.url(req, res) ?? 'unknown URL',\n status: tokens.status(req, res),\n contentLength: tokens.res(req, res, 'content-length'),\n responseTime: tokens['response-time'](req, res) ?? '0',\n userAgent: tokens['user-agent'](req, res),\n };\n logger.info(values.url, {\n httpRequest: {\n status: values.status,\n requestUrl: values.url,\n requestMethod: values.method,\n responseSize: values.contentLength,\n latency: {\n seconds: Number.parseInt(values.responseTime, 10) / 1_000,\n nanos: Number.parseInt(values.responseTime, 10) * 1_000_000,\n },\n userAgent: values.userAgent,\n },\n });\n return undefined;\n }));\n }\n /** Security */\n if (mergedOptions.helmet) {\n logger.debug('[SuperExpress] security is enabled ✅');\n // this is what helmet does by default. https://helmetjs.github.io/faq/you-might-not-need-helmet/\n const HEADERS = {\n 'Content-Security-Policy':\n // eslint-disable-next-line @stylistic/max-len\n 'default-src \\'self\\';base-uri \\'self\\';font-src \\'self\\' https: data:;form-action \\'self\\';frame-ancestors \\'self\\';img-src \\'self\\' data:;object-src \\'none\\';script-src \\'self\\';script-src-attr \\'none\\';style-src \\'self\\' https: \\'unsafe-inline\\';upgrade-insecure-requests',\n 'Cross-Origin-Opener-Policy': 'same-origin',\n 'Cross-Origin-Resource-Policy': 'same-origin',\n 'Origin-Agent-Cluster': '?1',\n 'Referrer-Policy': 'no-referrer',\n 'Strict-Transport-Security': 'max-age=15552000; includeSubDomains',\n 'X-Content-Type-Options': 'nosniff',\n 'X-DNS-Prefetch-Control': 'off',\n 'X-Download-Options': 'noopen',\n 'X-Frame-Options': 'SAMEORIGIN',\n 'X-Permitted-Cross-Domain-Policies': 'none',\n 'X-XSS-Protection': '0',\n };\n app.use((_req, res, next) => {\n res.set(HEADERS);\n next();\n });\n app.disable('x-powered-by');\n } else {\n logger.warn('[SuperExpress] security headers are disabled 😨');\n }\n /** Body Parser */\n if (mergedOptions.bodyParser) {\n logger.debug('[SuperExpress] body-parser is enabled ✅');\n const limit = typeof mergedOptions.bodyParser === 'string' ? mergedOptions.bodyParser : '1000mb';\n app.use(express.json({ limit }));\n } else {\n logger.debug('[SuperExpress] body-parser is disabled ❌');\n }\n /** Alive Endpoint */\n if (mergedOptions.nitur) {\n app.get('/alive', aliveEndpoint({ logger, ...mergedOptions.aliveEndpointOptions }));\n logger.debug('[SuperExpress] added /alive endpoint ✅');\n }\n /** Stats Endpoint */\n if (mergedOptions.stats) {\n const serverRunningSince = new Date();\n app.get('/stats', (_req, res) => {\n res.json({\n name: mergedOptions.name || 'default-name',\n version: mergedOptions.version || 'default-version',\n serverRunningSince,\n });\n });\n logger.debug('[SuperExpress] added /stats endpoint ✅');\n }\n /** Tracing */\n if (mergedOptions.tracing) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { enableTracing, middleware } = require('@autofleet/zehut') as typeof import('@autofleet/zehut');\n enableTracing({ logger });\n\n app.use(middleware({\n eagerLoadUserPermissions: mergedOptions.eagerLoadUserPermissions,\n }));\n logger.debug('[SuperExpress] tracing is enabled ✅');\n }\n\n const nativeListen: typeof app['listen'] = app.listen.bind(app);\n app.listen = function (port: number, callback?: () => void) {\n const isProd = process.env.NODE_ENV === 'production';\n const version = packageJson?.version || 'unknown';\n logger.debug(`[SuperExpress] is started with version ${version}`);\n logger.debug(`[SuperExpress] will listen on port ${port}`);\n logger.debug(`[SuperExpress] production mode: ${isProd}`);\n return nativeListen(port, callback);\n } as typeof app['listen'];\n\n return Object.assign(app, { nativeListen }) as SuperExpressApp;\n}\n\nexport default superExpress;\n"]}
1
+ {"version":3,"sources":["../../logger/src/index.ts","../../nitur/src/logger.ts","../../nitur/src/alive-endpoint/base.ts","../../nitur/src/alive-endpoint/middleware.ts","../config/default-options.ts","../package.json","../src/index.ts"],"names":["LogLevel","getLevel","__name","logLevel","process","env","LOG_LEVEL","NODE_ENV","includes","createLoggerInstance","level","options","loggerInstance","Pino","gcpLogOptions","PINO_LOG_LEVEL","transport","target","colorize","LoggerInstanceManager","#contextMiddlewares","#logger","constructor","mixin","addMetadata","serializers","stdSerializers","e","errWithCause","err","error","errors","val","Array","isArray","map","winstonLikeLoggerCall","message","meta","newMetadata","forEach","middleware","metadata","Object","assign","addContextMiddleware","push","trace","debug","info","warn","fatal","child","src_default","loglevel","logger_default","Logger","systemAliveCheck","rabbit","sequelize","redis","elasticsearch","isConnected","Error","status","query","ping","aliveEndpointMiddleware","parameters","logger","loggerFallback","_req","res","response","json","defaultOptions","bodyParser","helmet","morgan","nitur","stats","tracing","eagerLoadUserPermissions","package_default","superExpress","app","express","mergedOptions","require","use","tokens","req","values","method","url","contentLength","responseTime","userAgent","httpRequest","requestUrl","requestMethod","responseSize","latency","seconds","Number","parseInt","nanos","HEADERS","next","set","disable","limit","get","aliveEndpoint","aliveEndpointOptions","serverRunningSince","Date","name","version","enableTracing","nativeListen","listen","bind","port","callback","isProd","packageJson","index_default"],"mappings":"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","file":"index.js","sourcesContent":["import Pino, { type LoggerOptions, stdSerializers } from 'pino';\nimport { gcpLogOptions } from 'pino-cloud-logging';\n\nexport enum LogLevel {\n trace = 'trace',\n debug = 'debug',\n info = 'info',\n warn = 'warn',\n error = 'error',\n fatal = 'fatal',\n}\n\nconst getLevel = (logLevel?: LogLevel): LogLevel => {\n if (logLevel) return logLevel;\n if (process.env.LOG_LEVEL) return process.env.LOG_LEVEL as LogLevel;\n if (process.env.NODE_ENV && ['production', 'staging', 'test'].includes(process.env.NODE_ENV)) return LogLevel.info;\n if (process.env.NODE_ENV === 'development') return LogLevel.debug;\n return LogLevel.debug;\n};\n\nconst createLoggerInstance = (level: LogLevel, options: Omit<LoggerOptions, 'transport'>): Pino.Logger => {\n let loggerInstance;\n if (process.env.NODE_ENV === 'production') {\n loggerInstance = Pino(gcpLogOptions({\n level: process.env.PINO_LOG_LEVEL || 'info',\n ...options,\n } as object));\n } else {\n loggerInstance = Pino({\n level: process.env.PINO_LOG_LEVEL || 'info',\n transport: {\n target: 'pino-pretty',\n options: {\n colorize: true,\n },\n },\n ...options,\n });\n }\n loggerInstance.level = level;\n return loggerInstance;\n};\n\ntype MiddlewareFunction = () => Record<string, unknown>;\n\nexport class LoggerInstanceManager {\n #contextMiddlewares: MiddlewareFunction[] = [];\n\n #logger: Pino.Logger;\n\n constructor(logLevel?: LogLevel) {\n this.#logger = createLoggerInstance(getLevel(logLevel), {\n mixin: () => this.addMetadata(),\n serializers: {\n ...stdSerializers,\n e: stdSerializers.errWithCause,\n err: stdSerializers.errWithCause,\n error: stdSerializers.errWithCause,\n errors(val) {\n if (Array.isArray(val)) {\n return val.map(stdSerializers.errWithCause);\n }\n return stdSerializers.errWithCause(val);\n },\n },\n });\n }\n\n // To support winston like logging in pino\n private winstonLikeLoggerCall(logLevel: LogLevel, message: string, meta: unknown): void {\n if (meta) {\n this.#logger[logLevel](meta, message);\n } else {\n this.#logger[logLevel](message);\n }\n }\n\n private addMetadata(): Record<string, unknown> {\n const newMetadata = {};\n this.#contextMiddlewares.forEach((middleware) => {\n const metadata = middleware();\n Object.assign(newMetadata, metadata);\n });\n return newMetadata;\n }\n\n addContextMiddleware = (middleware: MiddlewareFunction): number => this.#contextMiddlewares.push(middleware);\n\n trace = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.trace, message, meta);\n\n debug = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.debug, message, meta);\n\n info = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.info, message, meta);\n\n warn = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.warn, message, meta);\n\n error = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.error, message, meta);\n\n fatal = (message: string, meta?: unknown): void => this.winstonLikeLoggerCall(LogLevel.fatal, message, meta);\n\n child = (metadata: Record<string, unknown>): Pino.Logger => this.#logger.child(metadata);\n\n get level(): Pino.LevelWithSilentOrString {\n return this.#logger.level;\n }\n}\n\nexport default (loglevel?: `${LogLevel}`): LoggerInstanceManager => new LoggerInstanceManager(loglevel as LogLevel);\n","import Logger from '@autofleet/logger';\n\nexport default Logger();\n","import type loggerFallback from '../logger';\n\nexport interface SystemAliveParameters {\n rabbit?: null | { isConnected: () => PromiseLike<boolean>; };\n sequelize?: null | { query(sql: string | { query: string; values: unknown[]; }): PromiseLike<any>; };\n redis?: null | { ping: () => Promise<void>; };\n elasticsearch?: null | { ping: () => Promise<boolean>; };\n logger?: typeof loggerFallback;\n}\n\nexport async function systemAliveCheck({\n rabbit = null,\n sequelize = null,\n redis = null,\n elasticsearch = null,\n}: SystemAliveParameters): Promise<{ status: 'ok'; }> {\n if (rabbit) {\n const isRabbitAlive = await rabbit.isConnected();\n if (!isRabbitAlive) {\n throw new Error('Rabbit is not alive');\n }\n }\n\n if (sequelize) {\n const [[{ status }]] = await sequelize.query('select \\'ok\\' as status');\n if (status !== 'ok') {\n throw new Error('Sequelize is not alive');\n }\n }\n\n if (redis) {\n await redis.ping();\n }\n\n if (elasticsearch) {\n await elasticsearch.ping();\n }\n\n return { status: 'ok' };\n};\n","import type { Request, Response } from 'express';\nimport loggerFallback from '../logger';\nimport { systemAliveCheck, type SystemAliveParameters } from './base';\n\nexport function aliveEndpointMiddleware(parameters: SystemAliveParameters) {\n const logger = parameters.logger ?? loggerFallback;\n return async (_req: Request, res: Response): Promise<boolean> => {\n try {\n const response = await systemAliveCheck(parameters);\n res.json(response);\n return true;\n } catch (err) {\n res.status(500).json({ err });\n logger.error('Error on alive endpoint', { err });\n return false;\n }\n };\n}\n","import type { LoggerInstanceManager } from '@autofleet/logger';\nimport type { aliveEndpoint } from '@autofleet/nitur';\n\n/** Options to customize the behavior of the SuperExpress application. */\nexport interface Options {\n /** The name of the application. @default 'default-name' */\n name?: string;\n /** The version of the application. @default 'default-version' */\n version?: string;\n /** Enables or disables body parser middleware. if given a string, will be used as the limit for body size @default '1000mb' */\n bodyParser?: boolean | string;\n /** Enables or disables security headers middleware. @default true */\n helmet?: boolean;\n /** Enables or disables HTTP request logging middleware. @default true */\n morgan?: boolean;\n /** Enables or disables the alive endpoint middleware. @default true */\n nitur?: boolean;\n /** Enables or disables the stats endpoint middleware. @default true */\n stats?: boolean;\n /** Enables or disables request tracing middleware. @default true */\n tracing?: boolean;\n /** Enables or disables eager loading of user permissions for tracing middleware. @default true */\n eagerLoadUserPermissions?: boolean;\n /** Options to customize the alive endpoint middleware. */\n aliveEndpointOptions?: Omit<Parameters<typeof aliveEndpoint>[0], 'logger'>;\n /** The servers logger instance. */\n logger: LoggerInstanceManager;\n}\n\nexport const defaultOptions = {\n bodyParser: '1000mb',\n helmet: true,\n morgan: true,\n nitur: true,\n stats: true,\n tracing: true,\n eagerLoadUserPermissions: true,\n} satisfies Omit<Options, 'logger'>;\n","{\n \"name\": \"@autofleet/super-express\",\n \"version\": \"7.0.8\",\n \"description\": \"AF Express with built in boilerplate\",\n \"type\": \"module\",\n \"main\": \"./dist/index.js\",\n \"module\": \"./dist/index.js\",\n \"types\": \"./dist/index.d.ts\",\n \"exports\": {\n \".\": {\n \"import\": {\n \"types\": \"./dist/index.d.ts\",\n \"default\": \"./dist/index.js\"\n },\n \"require\": {\n \"types\": \"./dist/index.d.cts\",\n \"default\": \"./dist/index.cjs\"\n }\n }\n },\n \"engines\": {\n \"node\": \">=18\"\n },\n \"author\": \"Autofleet\",\n \"license\": \"Proprietary\",\n \"files\": [\n \"dist/\"\n ],\n \"scripts\": {\n \"test\": \"tsx --test\",\n \"build\": \"tsup\",\n \"dev\": \"tsup --watch\"\n },\n \"repository\": {\n \"type\": \"git\",\n \"url\": \"git+https://github.com/Autofleet/autorepo.git\"\n },\n \"bugs\": {\n \"url\": \"https://github.com/Autofleet/autorepo/issues\"\n },\n \"homepage\": \"https://github.com/Autofleet/autorepo/tree/master/packages/super-express#readme\",\n \"dependencies\": {\n \"express\": \"^4.21.2\"\n },\n \"devDependencies\": {\n \"@autofleet/logger\": \"^4.2.1\",\n \"@autofleet/nitur\": \"^2.1.0\",\n \"@autofleet/zehut\": \"^4.0.0\",\n \"@types/express\": \"^4.17.21\",\n \"@types/morgan\": \"^1.9.9\",\n \"@types/supertest\": \"^6.0.2\",\n \"morgan\": \"^1.10.0\",\n \"supertest\": \"^7.0.0\",\n \"tsup\": \"^8.4.0\",\n \"tsx\": \"^4.19.3\"\n },\n \"peerDependencies\": {\n \"@autofleet/logger\": \">=4.0.0\",\n \"@autofleet/nitur\": \">=2.1.0\",\n \"@autofleet/zehut\": \">=4.0.0\",\n \"morgan\": \"^1.10.0\"\n },\n \"peerDependenciesMeta\": {\n \"@autofleet/nitur\": {\n \"optional\": true\n },\n \"@autofleet/zehut\": {\n \"optional\": true\n },\n \"morgan\": {\n \"optional\": true\n }\n }\n}\n","import type { Server } from 'node:http';\nimport express from 'express';\nimport { aliveEndpoint } from '@autofleet/nitur';\nimport { defaultOptions, type Options } from '../config/default-options.js';\nimport packageJson from '../package.json' with { type: 'json' };\n\n/** Extended express.Application interface which includes nativeListen and the overridden listen method. */\ninterface SuperExpressApp extends Omit<express.Application, 'listen'> {\n /** Original express listen method. */\n nativeListen: express.Application['listen'];\n\n /**\n * Overridden listen method to add custom behavior.\n * @param port - The port number to listen on.\n * @param cb - Optional callback function to execute after the server starts listening.\n */\n listen(port: number, cb?: () => void): Server;\n}\n\n/**\n * Creates a new SuperExpress application with the given options.\n * @param options Optional settings to customize the application.\n * @returns A SuperExpress application instance.\n */\nexport function superExpress({ logger, ...options }: Options): SuperExpressApp {\n const app = express();\n const mergedOptions = { ...defaultOptions, ...options };\n /** Formatting */\n if (mergedOptions.morgan) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const morgan = require('morgan') as typeof import('morgan');\n logger.debug('[SuperExpress] formatting is enabled ✅');\n app.use(morgan((tokens, req, res) => {\n const values = {\n method: tokens.method(req, res),\n url: tokens.url(req, res) ?? 'unknown URL',\n status: tokens.status(req, res),\n contentLength: tokens.res(req, res, 'content-length'),\n responseTime: tokens['response-time'](req, res) ?? '0',\n userAgent: tokens['user-agent'](req, res),\n };\n logger.info(values.url, {\n httpRequest: {\n status: values.status,\n requestUrl: values.url,\n requestMethod: values.method,\n responseSize: values.contentLength,\n latency: {\n seconds: Number.parseInt(values.responseTime, 10) / 1_000,\n nanos: Number.parseInt(values.responseTime, 10) * 1_000_000,\n },\n userAgent: values.userAgent,\n },\n });\n return undefined;\n }));\n }\n /** Security */\n if (mergedOptions.helmet) {\n logger.debug('[SuperExpress] security is enabled ✅');\n // this is what helmet does by default. https://helmetjs.github.io/faq/you-might-not-need-helmet/\n const HEADERS = {\n 'Content-Security-Policy':\n // eslint-disable-next-line @stylistic/max-len\n 'default-src \\'self\\';base-uri \\'self\\';font-src \\'self\\' https: data:;form-action \\'self\\';frame-ancestors \\'self\\';img-src \\'self\\' data:;object-src \\'none\\';script-src \\'self\\';script-src-attr \\'none\\';style-src \\'self\\' https: \\'unsafe-inline\\';upgrade-insecure-requests',\n 'Cross-Origin-Opener-Policy': 'same-origin',\n 'Cross-Origin-Resource-Policy': 'same-origin',\n 'Origin-Agent-Cluster': '?1',\n 'Referrer-Policy': 'no-referrer',\n 'Strict-Transport-Security': 'max-age=15552000; includeSubDomains',\n 'X-Content-Type-Options': 'nosniff',\n 'X-DNS-Prefetch-Control': 'off',\n 'X-Download-Options': 'noopen',\n 'X-Frame-Options': 'SAMEORIGIN',\n 'X-Permitted-Cross-Domain-Policies': 'none',\n 'X-XSS-Protection': '0',\n };\n app.use((_req, res, next) => {\n res.set(HEADERS);\n next();\n });\n app.disable('x-powered-by');\n } else {\n logger.warn('[SuperExpress] security headers are disabled 😨');\n }\n /** Body Parser */\n if (mergedOptions.bodyParser) {\n logger.debug('[SuperExpress] body-parser is enabled ✅');\n const limit = typeof mergedOptions.bodyParser === 'string' ? mergedOptions.bodyParser : '1000mb';\n app.use(express.json({ limit }));\n } else {\n logger.debug('[SuperExpress] body-parser is disabled ❌');\n }\n /** Alive Endpoint */\n if (mergedOptions.nitur) {\n app.get('/alive', aliveEndpoint({ logger, ...mergedOptions.aliveEndpointOptions }));\n logger.debug('[SuperExpress] added /alive endpoint ✅');\n }\n /** Stats Endpoint */\n if (mergedOptions.stats) {\n const serverRunningSince = new Date();\n app.get('/stats', (_req, res) => {\n res.json({\n name: mergedOptions.name || 'default-name',\n version: mergedOptions.version || 'default-version',\n serverRunningSince,\n });\n });\n logger.debug('[SuperExpress] added /stats endpoint ✅');\n }\n /** Tracing */\n if (mergedOptions.tracing) {\n // eslint-disable-next-line @typescript-eslint/no-require-imports\n const { enableTracing, middleware } = require('@autofleet/zehut') as typeof import('@autofleet/zehut');\n enableTracing({ logger });\n\n app.use(middleware({\n eagerLoadUserPermissions: mergedOptions.eagerLoadUserPermissions,\n }));\n logger.debug('[SuperExpress] tracing is enabled ✅');\n }\n\n const nativeListen: typeof app['listen'] = app.listen.bind(app);\n app.listen = function (port: number, callback?: () => void) {\n const isProd = process.env.NODE_ENV === 'production';\n const version = packageJson?.version || 'unknown';\n logger.debug(`[SuperExpress] is started with version ${version}`);\n logger.debug(`[SuperExpress] will listen on port ${port}`);\n logger.debug(`[SuperExpress] production mode: ${isProd}`);\n return nativeListen(port, callback);\n } as typeof app['listen'];\n\n return Object.assign(app, { nativeListen }) as SuperExpressApp;\n}\n\nexport default superExpress;\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/super-express",
3
- "version": "7.0.7",
3
+ "version": "7.0.8",
4
4
  "description": "AF Express with built in boilerplate",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",