@autofleet/super-express 7.0.14 → 7.0.15

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,2 +1,2 @@
1
- Object.defineProperty(exports,`__esModule`,{value:!0});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));const c=s(require(`express`)),l=s(require(`@autofleet/nitur`)),u={bodyParser:`1000mb`,helmet:!0,morgan:!0,nitur:!0,stats:!0,tracing:!0,eagerLoadUserPermissions:!0};var d=`7.0.14`;function f({logger:e,...t}){let n=(0,c.default)(),r={...u,...t};if(r.morgan){let t=require(`morgan`);e.debug(`[SuperExpress] formatting is enabled ✅`),n.use(t((t,n,r)=>{let i={method:t.method(n,r),url:t.url(n,r)??`unknown URL`,status:t.status(n,r),contentLength:t.res(n,r,`content-length`),responseTime:t[`response-time`](n,r)??`0`,userAgent:t[`user-agent`](n,r)};e.info(i.url,{httpRequest:{status:i.status,requestUrl:i.url,requestMethod:i.method,responseSize:i.contentLength,latency:{seconds:Number.parseInt(i.responseTime,10)/1e3,nanos:Number.parseInt(i.responseTime,10)*1e6},userAgent:i.userAgent}})}))}if(r.helmet){e.debug(`[SuperExpress] security is enabled ✅`);let t={"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`};n.use((e,n,r)=>{n.set(t),r()}),n.disable(`x-powered-by`)}else e.warn(`[SuperExpress] security headers are disabled 😨`);if(r.bodyParser){e.debug(`[SuperExpress] body-parser is enabled ✅`);let t=typeof r.bodyParser==`string`?r.bodyParser:`1000mb`;n.use(c.default.json({limit:t}))}else e.debug(`[SuperExpress] body-parser is disabled ❌`);if(r.nitur&&(n.get(`/alive`,(0,l.aliveEndpoint)({logger:e,...r.aliveEndpointOptions})),e.debug(`[SuperExpress] added /alive endpoint ✅`)),r.stats){let t=new Date;n.get(`/stats`,(e,n)=>{n.json({name:r.name||`default-name`,version:r.version||`default-version`,serverRunningSince:t})}),e.debug(`[SuperExpress] added /stats endpoint ✅`)}if(r.tracing){let{enableTracing:t,middleware:i}=require(`@autofleet/zehut`);t({logger:e}),n.use(i({eagerLoadUserPermissions:r.eagerLoadUserPermissions})),e.debug(`[SuperExpress] tracing is enabled ✅`)}let i=n.listen.bind(n);return n.listen=function(t,n){let r=process.env.NODE_ENV===`production`;return e.debug(`[SuperExpress] is started with version ${d||`unknown`}`),e.debug(`[SuperExpress] will listen on port ${t}`),e.debug(`[SuperExpress] production mode: ${r}`),i(t,n)},Object.assign(n,{nativeListen:i})}var p=f;exports.default=p,exports.superExpress=f;
1
+ Object.defineProperty(exports,`__esModule`,{value:!0});var e=Object.create,t=Object.defineProperty,n=Object.getOwnPropertyDescriptor,r=Object.getOwnPropertyNames,i=Object.getPrototypeOf,a=Object.prototype.hasOwnProperty,o=(e,i,o,s)=>{if(i&&typeof i==`object`||typeof i==`function`)for(var c=r(i),l=0,u=c.length,d;l<u;l++)d=c[l],!a.call(e,d)&&d!==o&&t(e,d,{get:(e=>i[e]).bind(null,d),enumerable:!(s=n(i,d))||s.enumerable});return e},s=(n,r,a)=>(a=n==null?{}:e(i(n)),o(r||!n||!n.__esModule?t(a,`default`,{value:n,enumerable:!0}):a,n));const c=s(require(`express`)),l=s(require(`@autofleet/nitur`)),u={bodyParser:`1000mb`,helmet:!0,morgan:!0,nitur:!0,stats:!0,tracing:!0,eagerLoadUserPermissions:!0};var d=`7.0.15`;function f({logger:e,...t}){let n=(0,c.default)(),r={...u,...t};if(r.morgan){let t=require(`morgan`);e.debug(`[SuperExpress] formatting is enabled ✅`),n.use(t((t,n,r)=>{let i={method:t.method(n,r),url:t.url(n,r)??`unknown URL`,status:t.status(n,r),contentLength:t.res(n,r,`content-length`),responseTime:t[`response-time`](n,r)??`0`,userAgent:t[`user-agent`](n,r)};e.info(i.url,{httpRequest:{status:i.status,requestUrl:i.url,requestMethod:i.method,responseSize:i.contentLength,latency:{seconds:Number.parseInt(i.responseTime,10)/1e3,nanos:Number.parseInt(i.responseTime,10)*1e6},userAgent:i.userAgent}})}))}if(r.helmet){e.debug(`[SuperExpress] security is enabled ✅`);let t={"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`};n.use((e,n,r)=>{n.set(t),r()}),n.disable(`x-powered-by`)}else e.warn(`[SuperExpress] security headers are disabled 😨`);if(r.bodyParser){e.debug(`[SuperExpress] body-parser is enabled ✅`);let t=typeof r.bodyParser==`string`?r.bodyParser:`1000mb`;n.use(c.default.json({limit:t}))}else e.debug(`[SuperExpress] body-parser is disabled ❌`);if(r.nitur&&(n.get(`/alive`,(0,l.aliveEndpoint)({logger:e,...r.aliveEndpointOptions})),e.debug(`[SuperExpress] added /alive endpoint ✅`)),r.stats){let t=new Date;n.get(`/stats`,(e,n)=>{n.json({name:r.name||`default-name`,version:r.version||`default-version`,serverRunningSince:t})}),e.debug(`[SuperExpress] added /stats endpoint ✅`)}if(r.tracing){let{enableTracing:t,middleware:i}=require(`@autofleet/zehut`);t({logger:e}),n.use(i({eagerLoadUserPermissions:r.eagerLoadUserPermissions})),e.debug(`[SuperExpress] tracing is enabled ✅`)}let i=n.listen.bind(n);return n.listen=function(t,n){let r=process.env.NODE_ENV===`production`;return e.debug(`[SuperExpress] is started with version ${d||`unknown`}`),e.debug(`[SuperExpress] will listen on port ${t}`),e.debug(`[SuperExpress] production mode: ${r}`),i(t,n)},Object.assign(n,{nativeListen:i})}var p=f;exports.default=p,exports.superExpress=f;
2
2
  //# sourceMappingURL=index.cjs.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.cjs","names":["defaultOptions: Omit<Options, 'logger'>","nativeListen: typeof app['listen']","port: number","callback?: () => void"],"sources":["../config/default-options.ts","../package.json","../src/index.ts"],"sourcesContent":["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: Omit<Options, 'logger'> = {\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.14\",\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\": \"tsdown\",\n \"dev\": \"tsdoen --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 \"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 { version } 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 logger.debug(`[SuperExpress] is started with version ${version || 'unknown'}`);\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"],"mappings":"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"}
1
+ {"version":3,"file":"index.cjs","names":["defaultOptions: Omit<Options, 'logger'>","nativeListen: typeof app['listen']","port: number","callback?: () => void"],"sources":["../config/default-options.ts","../package.json","../src/index.ts"],"sourcesContent":["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: Omit<Options, 'logger'> = {\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.15\",\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\": \"tsdown\",\n \"dev\": \"tsdoen --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 \"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 { version } 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 logger.debug(`[SuperExpress] is started with version ${version || 'unknown'}`);\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"],"mappings":"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"}
package/dist/index.js CHANGED
@@ -1,2 +1,2 @@
1
- import{createRequire as e}from"node:module";import t from"express";import{aliveEndpoint as n}from"@autofleet/nitur";var r=e(import.meta.url);const i={bodyParser:`1000mb`,helmet:!0,morgan:!0,nitur:!0,stats:!0,tracing:!0,eagerLoadUserPermissions:!0};var a=`7.0.14`;function o({logger:e,...o}){let s=t(),c={...i,...o};if(c.morgan){let t=r(`morgan`);e.debug(`[SuperExpress] formatting is enabled ✅`),s.use(t((t,n,r)=>{let i={method:t.method(n,r),url:t.url(n,r)??`unknown URL`,status:t.status(n,r),contentLength:t.res(n,r,`content-length`),responseTime:t[`response-time`](n,r)??`0`,userAgent:t[`user-agent`](n,r)};e.info(i.url,{httpRequest:{status:i.status,requestUrl:i.url,requestMethod:i.method,responseSize:i.contentLength,latency:{seconds:Number.parseInt(i.responseTime,10)/1e3,nanos:Number.parseInt(i.responseTime,10)*1e6},userAgent:i.userAgent}})}))}if(c.helmet){e.debug(`[SuperExpress] security is enabled ✅`);let t={"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`};s.use((e,n,r)=>{n.set(t),r()}),s.disable(`x-powered-by`)}else e.warn(`[SuperExpress] security headers are disabled 😨`);if(c.bodyParser){e.debug(`[SuperExpress] body-parser is enabled ✅`);let n=typeof c.bodyParser==`string`?c.bodyParser:`1000mb`;s.use(t.json({limit:n}))}else e.debug(`[SuperExpress] body-parser is disabled ❌`);if(c.nitur&&(s.get(`/alive`,n({logger:e,...c.aliveEndpointOptions})),e.debug(`[SuperExpress] added /alive endpoint ✅`)),c.stats){let t=new Date;s.get(`/stats`,(e,n)=>{n.json({name:c.name||`default-name`,version:c.version||`default-version`,serverRunningSince:t})}),e.debug(`[SuperExpress] added /stats endpoint ✅`)}if(c.tracing){let{enableTracing:t,middleware:n}=r(`@autofleet/zehut`);t({logger:e}),s.use(n({eagerLoadUserPermissions:c.eagerLoadUserPermissions})),e.debug(`[SuperExpress] tracing is enabled ✅`)}let l=s.listen.bind(s);return s.listen=function(t,n){let r=process.env.NODE_ENV===`production`;return e.debug(`[SuperExpress] is started with version ${a||`unknown`}`),e.debug(`[SuperExpress] will listen on port ${t}`),e.debug(`[SuperExpress] production mode: ${r}`),l(t,n)},Object.assign(s,{nativeListen:l})}var s=o;export{s as default,o as superExpress};
1
+ import{createRequire as e}from"node:module";import t from"express";import{aliveEndpoint as n}from"@autofleet/nitur";var r=e(import.meta.url);const i={bodyParser:`1000mb`,helmet:!0,morgan:!0,nitur:!0,stats:!0,tracing:!0,eagerLoadUserPermissions:!0};var a=`7.0.15`;function o({logger:e,...o}){let s=t(),c={...i,...o};if(c.morgan){let t=r(`morgan`);e.debug(`[SuperExpress] formatting is enabled ✅`),s.use(t((t,n,r)=>{let i={method:t.method(n,r),url:t.url(n,r)??`unknown URL`,status:t.status(n,r),contentLength:t.res(n,r,`content-length`),responseTime:t[`response-time`](n,r)??`0`,userAgent:t[`user-agent`](n,r)};e.info(i.url,{httpRequest:{status:i.status,requestUrl:i.url,requestMethod:i.method,responseSize:i.contentLength,latency:{seconds:Number.parseInt(i.responseTime,10)/1e3,nanos:Number.parseInt(i.responseTime,10)*1e6},userAgent:i.userAgent}})}))}if(c.helmet){e.debug(`[SuperExpress] security is enabled ✅`);let t={"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`};s.use((e,n,r)=>{n.set(t),r()}),s.disable(`x-powered-by`)}else e.warn(`[SuperExpress] security headers are disabled 😨`);if(c.bodyParser){e.debug(`[SuperExpress] body-parser is enabled ✅`);let n=typeof c.bodyParser==`string`?c.bodyParser:`1000mb`;s.use(t.json({limit:n}))}else e.debug(`[SuperExpress] body-parser is disabled ❌`);if(c.nitur&&(s.get(`/alive`,n({logger:e,...c.aliveEndpointOptions})),e.debug(`[SuperExpress] added /alive endpoint ✅`)),c.stats){let t=new Date;s.get(`/stats`,(e,n)=>{n.json({name:c.name||`default-name`,version:c.version||`default-version`,serverRunningSince:t})}),e.debug(`[SuperExpress] added /stats endpoint ✅`)}if(c.tracing){let{enableTracing:t,middleware:n}=r(`@autofleet/zehut`);t({logger:e}),s.use(n({eagerLoadUserPermissions:c.eagerLoadUserPermissions})),e.debug(`[SuperExpress] tracing is enabled ✅`)}let l=s.listen.bind(s);return s.listen=function(t,n){let r=process.env.NODE_ENV===`production`;return e.debug(`[SuperExpress] is started with version ${a||`unknown`}`),e.debug(`[SuperExpress] will listen on port ${t}`),e.debug(`[SuperExpress] production mode: ${r}`),l(t,n)},Object.assign(s,{nativeListen:l})}var s=o;export{s as default,o as superExpress};
2
2
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","names":["defaultOptions: Omit<Options, 'logger'>","nativeListen: typeof app['listen']","port: number","callback?: () => void"],"sources":["../config/default-options.ts","../package.json","../src/index.ts"],"sourcesContent":["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: Omit<Options, 'logger'> = {\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.14\",\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\": \"tsdown\",\n \"dev\": \"tsdoen --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 \"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 { version } 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 logger.debug(`[SuperExpress] is started with version ${version || 'unknown'}`);\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"],"mappings":"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"}
1
+ {"version":3,"file":"index.js","names":["defaultOptions: Omit<Options, 'logger'>","nativeListen: typeof app['listen']","port: number","callback?: () => void"],"sources":["../config/default-options.ts","../package.json","../src/index.ts"],"sourcesContent":["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: Omit<Options, 'logger'> = {\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.15\",\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\": \"tsdown\",\n \"dev\": \"tsdoen --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 \"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 { version } 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 logger.debug(`[SuperExpress] is started with version ${version || 'unknown'}`);\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"],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@autofleet/super-express",
3
- "version": "7.0.14",
3
+ "version": "7.0.15",
4
4
  "description": "AF Express with built in boilerplate",
5
5
  "type": "module",
6
6
  "main": "./dist/index.js",