• Home
  • Features
  • Pricing
  • Docs
  • Announcements
  • Sign In

RobinTail / express-zod-api / 15980543093

30 Jun 2025 06:17PM UTC coverage: 100.0%. Remained the same
15980543093

Pull #2778

github

web-flow
Merge fc817f046 into 22f3987ec
Pull Request #2778: chore(deps): update typescript-eslint and its rule tester (used by migration) to v8.35.1

1230 of 1273 branches covered (96.62%)

3994 of 3994 relevant lines covered (100.0%)

361.86 hits per line

Source File
Press 'n' to go to next uncovered line, 'b' for previous

100.0
/express-zod-api/src/config-type.ts
1
import type compression from "compression";
2
import { IRouter, Request, RequestHandler } from "express";
3
import type fileUpload from "express-fileupload";
4
import { ServerOptions } from "node:https";
5
import { BuiltinLoggerConfig } from "./builtin-logger";
6
import { AbstractEndpoint } from "./endpoint";
7
import { AbstractLogger, ActualLogger } from "./logger-helpers";
8
import { Method } from "./method";
9
import { AbstractResultHandler } from "./result-handler";
10
import { ListenOptions } from "node:net";
11
import { GetLogger } from "./server-helpers";
12

13
export type InputSource = keyof Pick<
14
  Request,
15
  "query" | "body" | "files" | "params" | "headers"
16
>;
17
export type InputSources = Record<Method, InputSource[]>;
18

19
type Headers = Record<string, string>;
20
type HeadersProvider = (params: {
21
  /** @desc The default headers to be overridden. */
22
  defaultHeaders: Headers;
23
  request: Request;
24
  endpoint: AbstractEndpoint;
25
  logger: ActualLogger;
26
}) => Headers | Promise<Headers>;
27

28
type ChildLoggerProvider = (params: {
29
  request: Request;
30
  parent: ActualLogger;
31
}) => ActualLogger | Promise<ActualLogger>;
32

33
type LogAccess = (request: Request, logger: ActualLogger) => void;
34

35
export interface CommonConfig {
36
  /**
37
   * @desc Enables cross-origin resource sharing.
38
   * @link https://developer.mozilla.org/en-US/docs/Web/HTTP/CORS
39
   * @desc You can override the default CORS headers by setting up a provider function here.
40
   */
41
  cors: boolean | HeadersProvider;
42
  /**
43
   * @desc How to respond to a request that uses a wrong method to an existing endpoint
44
   * @example 404 — Not found
45
   * @example 405 — Method not allowed, incl. the "Allow" header with a list of methods
46
   * @default 405
47
   * */
48
  wrongMethodBehavior?: 404 | 405;
49
  /**
50
   * @desc The ResultHandler to use for handling routing, parsing and upload errors
51
   * @default defaultResultHandler
52
   * @see defaultResultHandler
53
   */
54
  errorHandler?: AbstractResultHandler;
55
  /**
56
   * @desc Built-in logger configuration or an instance of any compatible logger.
57
   * @example { level: "debug", color: true }
58
   * @default { level: NODE_ENV === "production" ? "warn" : "debug", color: isSupported(), depth: 2 }
59
   * */
60
  logger?: Partial<BuiltinLoggerConfig> | AbstractLogger;
61
  /**
62
   * @desc A child logger returned by this function can override the logger in all handlers for each request
63
   * @example ({ parent }) => parent.child({ requestId: uuid() })
64
   * */
65
  childLoggerProvider?: ChildLoggerProvider;
66
  /**
67
   * @desc The function for producing access logs
68
   * @default ({ method, path }, logger) => logger.debug(`${method}: ${path}`)
69
   * @example null — disables the feature
70
   * */
71
  accessLogger?: null | LogAccess;
72
  /**
73
   * @desc You can disable the startup logo.
74
   * @default true
75
   */
76
  startupLogo?: boolean;
77
  /**
78
   * @desc Which properties of request are combined into the input for endpoints and middlewares.
79
   * @desc The order matters: priority from lowest to highest
80
   * @default defaultInputSources
81
   * @see defaultInputSources
82
   */
83
  inputSources?: Partial<InputSources>;
84
}
85

86
type BeforeUpload = (params: {
87
  request: Request;
88
  logger: ActualLogger;
89
}) => void | Promise<void>;
90

91
type UploadOptions = Pick<
92
  fileUpload.Options,
93
  | "createParentPath"
94
  | "uriDecodeFileNames"
95
  | "safeFileNames"
96
  | "preserveExtension"
97
  | "useTempFiles"
98
  | "tempFileDir"
99
  | "debug"
100
  | "uploadTimeout"
101
  | "limits"
102
> & {
103
  /**
104
   * @desc The error to throw when the file exceeds the configured fileSize limit (handled by errorHandler).
105
   * @see limits
106
   * @override limitHandler
107
   * @example createHttpError(413, "The file is too large")
108
   * */
109
  limitError?: Error;
110
  /**
111
   * @desc A handler to execute before uploading — it can be used for restrictions by throwing an error.
112
   * @example ({ request }) => { throw createHttpError(403, "Not authorized"); }
113
   * */
114
  beforeUpload?: BeforeUpload;
115
};
116

117
type CompressionOptions = Pick<
118
  compression.CompressionOptions,
119
  "threshold" | "level" | "strategy" | "chunkSize" | "memLevel"
120
>;
121

122
interface GracefulOptions {
123
  /**
124
   * @desc Time given to drain ongoing requests before closing the server.
125
   * @default 1000
126
   * */
127
  timeout?: number;
128
  /**
129
   * @desc Process event (Signal) that triggers the graceful shutdown.
130
   * @see Signals
131
   * @default [SIGINT, SIGTERM]
132
   * */
133
  events?: string[];
134
  /** @desc The hook to call after the server was closed, but before terminating the process. */
135
  beforeExit?: () => void | Promise<void>;
136
}
137

138
type BeforeRouting = (params: {
139
  app: IRouter;
140
  /** @desc Returns child logger for the given request (if configured) or the configured logger otherwise */
141
  getLogger: GetLogger;
142
}) => void | Promise<void>;
143

144
export interface HttpConfig {
145
  /** @desc Port, UNIX socket or custom options. */
146
  listen: number | string | ListenOptions;
147
}
148

149
interface HttpsConfig extends HttpConfig {
150
  /** @desc At least "cert" and "key" options required. */
151
  options: ServerOptions;
152
}
153

154
export interface ServerConfig extends CommonConfig {
155
  /** @desc HTTP server configuration. */
156
  http?: HttpConfig;
157
  /** @desc HTTPS server configuration. */
158
  https?: HttpsConfig;
159
  /**
160
   * @desc Custom JSON parser.
161
   * @default express.json()
162
   * @link https://expressjs.com/en/4x/api.html#express.json
163
   * */
164
  jsonParser?: RequestHandler;
165
  /**
166
   * @desc Enable or configure uploads handling.
167
   * @requires express-fileupload
168
   * */
169
  upload?: boolean | UploadOptions;
170
  /**
171
   * @desc Enable or configure response compression.
172
   * @requires compression
173
   */
174
  compression?: boolean | CompressionOptions;
175
  /**
176
   * @desc Custom raw parser (assigns Buffer to request body)
177
   * @default express.raw()
178
   * @link https://expressjs.com/en/4x/api.html#express.raw
179
   * */
180
  rawParser?: RequestHandler;
181
  /**
182
   * @desc Custom parser for URL Encoded requests used for submitting HTML forms
183
   * @default express.urlencoded()
184
   * @link https://expressjs.com/en/4x/api.html#express.urlencoded
185
   * */
186
  formParser?: RequestHandler;
187
  /**
188
   * @desc A code to execute before processing the Routing of your API (and before parsing).
189
   * @desc This can be a good place for express middlewares establishing their own routes.
190
   * @desc It can help to avoid making a DIY solution based on the attachRouting() approach.
191
   * @example ({ app }) => { app.use('/docs', swaggerUi.serve, swaggerUi.setup(swaggerDocument)); }
192
   * */
193
  beforeRouting?: BeforeRouting;
194
  /**
195
   * @desc Rejects new connections and attempts to finish ongoing ones in the specified time before exit.
196
   * */
197
  gracefulShutdown?: boolean | GracefulOptions;
198
}
199

200
export interface AppConfig extends CommonConfig {
201
  /** @desc Your custom express app or express router instead. */
202
  app: IRouter;
203
}
204

205
export function createConfig(config: ServerConfig): ServerConfig;
206
export function createConfig(config: AppConfig): AppConfig;
207
export function createConfig(config: AppConfig | ServerConfig) {
6✔
208
  return config;
48✔
209
}
48✔
STATUS · Troubleshooting · Open an Issue · Sales · Support · CAREERS · ENTERPRISE · START FREE · SCHEDULE DEMO
ANNOUNCEMENTS · TWITTER · TOS & SLA · Supported CI Services · What's a CI service? · Automated Testing

© 2025 Coveralls, Inc