@rosen-bridge/fastify-enhanced 3.0.0 → 3.1.0-d5b86d3e

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/CHANGELOG.md CHANGED
@@ -1,5 +1,11 @@
1
1
  # @rosen-bridge/fastify-enhanced
2
2
 
3
+ ## 3.1.0-d5b86d3e
4
+
5
+ ### Minor Changes
6
+
7
+ - Add support for using AbstractLogger in place of the default Fastify logger
8
+
3
9
  ## 3.0.0
4
10
 
5
11
  ### Major Changes
package/README.md CHANGED
@@ -32,37 +32,26 @@ yarn add zod@^3.21.4
32
32
 
33
33
  ## Usage
34
34
 
35
- To use the enhanced Fastify, import `createFastify` and use it to create a fastify instance and register routes. Use data types defined under `types` object, to define validation constraints for requests and responses:
35
+ To use the enhanced Fastify, import `makeFastify` and use it to create a fastify instance and register routes. Install and use zod to define schemas for validating requests and responses:
36
+
37
+ > Note: For **BigInt** field types, since JSON does not support the BigInt data type, you should use `z.coerce.bigint()` in the schema, and the value in the data transfer object (DTO) should be either a **number** or a **string**; `coerce` allows Zod to validate and transform the number or string value into a BigInt. Also its preferred to use string for bigint types in the response schemas.
36
38
 
37
39
  ```ts
38
- import { FastifyBaseLogger, FastifyInstance } from 'fastify';
39
- import { IncomingMessage, Server, ServerResponse } from 'http';
40
-
41
- import {
42
- ZodTypeProvider,
43
- createFastify,
44
- types,
45
- } from '@rosen-bridge/fastify-enhanced';
46
-
47
- const addTokenPaymentRoute = (
48
- fastify: FastifyInstance<
49
- Server<typeof IncomingMessage, typeof ServerResponse>,
50
- IncomingMessage,
51
- ServerResponse<IncomingMessage>,
52
- FastifyBaseLogger,
53
- ZodTypeProvider
54
- >,
55
- ) => {
56
- const bodySchema = types.object({
57
- tokenName: types.string(),
58
- tokenAmount: types.bigint(),
59
- tokenDecimals: types.number(),
40
+ import { z } from 'zod';
41
+
42
+ import { FastifyWithZod, makeFastify } from '@rosen-bridge/fastify-enhanced';
43
+
44
+ const addTokenPaymentRoute = (fastify: FastifyWithZod) => {
45
+ const bodySchema = z.object({
46
+ tokenName: z.string(),
47
+ tokenAmount: z.coerce.bigint(),
48
+ tokenDecimals: z.number(),
60
49
  });
61
50
 
62
- const res200Schema = types.object({
63
- name: types.string(),
64
- amount: types.bigint(),
65
- decimal: types.number(),
51
+ const res200Schema = z.object({
52
+ name: z.string(),
53
+ amount: z.string(),
54
+ decimal: z.number(),
66
55
  });
67
56
 
68
57
  const payTokenOpts = {
@@ -77,15 +66,89 @@ const addTokenPaymentRoute = (
77
66
  fastify.post('/payToken', payTokenOpts, async (request, reply) => {
78
67
  return reply.status(200).send({
79
68
  name: request.body.tokenName,
80
- amount: request.body.tokenAmount,
69
+ amount: request.body.tokenAmount.toString(),
81
70
  decimal: request.body.tokenDecimals,
82
71
  });
83
72
  });
73
+ };
74
+
75
+ const addDemoRoute = (fastify: FastifyWithZod) => {
76
+ const bodySchema = z.object({
77
+ numberField: z.number(),
78
+ bigintField: z.coerce.bigint(),
79
+ booleanField: z.boolean(),
80
+ stringField: z.string(),
81
+ optionalStringField: z.optional(z.string()),
82
+ objectField: z.object({
83
+ bigintField: z.coerce.bigint(),
84
+ // ...
85
+ }),
86
+ numberArrayField: z.array(z.number()),
87
+ stringArrayField: z.array(z.string()),
88
+ unionField: z.union([
89
+ z.string(),
90
+ z.object({
91
+ stringArrayField: z.array(z.string()),
92
+ // ...
93
+ }),
94
+ ]),
95
+ });
96
+
97
+ const qsSchema = z.object({
98
+ qs: z.union([z.string().transform((i) => [i]), z.array(z.string())]),
99
+ });
100
+
101
+ const res200Schema = z.object({
102
+ qs: z.array(z.string()),
103
+ numberField: z.number(),
104
+ bigintField: z.string(),
105
+ booleanField: z.boolean(),
106
+ stringField: z.string(),
107
+ optionalStringField: z.optional(z.string()),
108
+ objectField: z.object({
109
+ bigintField: z.string(),
110
+ // ...
111
+ }),
112
+ numberArrayField: z.array(z.number()),
113
+ stringArrayField: z.array(z.string()),
114
+ unionField: z.union([
115
+ z.string(),
116
+ z.object({
117
+ stringArrayField: z.array(z.string()),
118
+ // ...
119
+ }),
120
+ ]),
121
+ });
122
+
123
+ const routeOpts = {
124
+ schema: {
125
+ querystring: qsSchema,
126
+ body: bodySchema,
127
+ response: {
128
+ 200: res200Schema,
129
+ },
130
+ },
131
+ };
84
132
 
85
- return fastify;
133
+ fastify.post('/demo', routeOpts, async (request, reply) => {
134
+ return reply.status(200).send({
135
+ qs: request.query.qs,
136
+ numberField: request.body.numberField,
137
+ bigintField: request.body.bigintField.toString(),
138
+ booleanField: request.body.booleanField,
139
+ stringField: request.body.stringField,
140
+ optionalStringField: request.body.optionalStringField,
141
+ objectField: {
142
+ bigintField: request.body.objectField.bigintField.toString(),
143
+ },
144
+ numberArrayField: request.body.numberArrayField,
145
+ stringArrayField: request.body.stringArrayField,
146
+ unionField: request.body.unionField,
147
+ });
148
+ });
86
149
  };
87
150
 
88
- const fastify = await createFastify(
151
+ const fastify = await makeFastify(
89
152
  {
90
153
  path: '/swagger',
91
154
  title: '',
@@ -95,27 +158,69 @@ const fastify = await createFastify(
95
158
  { logger: false },
96
159
  );
97
160
  addTokenPaymentRoute(fastify);
161
+ // Or fastify.register(addTokenPaymentRoute);
162
+ addDemoRoute(fastify);
98
163
 
99
164
  const start = async () => {
100
165
  try {
101
- await fastify.listen({ port: 8000 });
166
+ await fastify.ready();
167
+ await fastify.listen({ host: '127.0.0.1', port: 8000 });
168
+ console.log(`listening http://127.0.0.1:8000`);
102
169
  } catch (err) {
103
- console.log(err);
170
+ console.error(err);
104
171
  process.exit(1);
105
172
  }
106
173
  };
174
+
107
175
  start();
176
+
177
+ /*
178
+ curl --request POST \
179
+ --url 'http://localhost:8000/demo?qs=key1&qs=key2' \
180
+ --header 'content-type: application/json' \
181
+ --data '{
182
+ "numberField": 10,
183
+ "bigintField": "10000",
184
+ "booleanField": true,
185
+ "stringField": "str",
186
+ "objectField": {
187
+ "bigintField": 10
188
+ },
189
+ "numberArrayField": [
190
+ 0,
191
+ 100,
192
+ 1000
193
+ ],
194
+ "stringArrayField": [
195
+ "str1",
196
+ "str2"
197
+ ],
198
+ "unionField": {
199
+ "stringArrayField": [
200
+ "str1",
201
+ "str2"
202
+ ]
203
+ }
204
+ }'
205
+ */
108
206
  ```
109
207
 
110
- To define a nested route don't forget to add `ZodTypeProvider` to the Fastify instance that is passed to the `register` method, to enable Zod typing validation:
208
+ In order to use an instance of **AbstractLogger** instead of the default fastify logger, set the `logger` property of the fastify options to `false` and pass the **AbstractLogger** instance (wrapped in **FastifyLogger** class) to the `loggerInstance` property. **FastifyLogger** is an adapter for Pino interface compliance used in fastify.
111
209
 
112
210
  ```ts
113
- fastify.register(
114
- (instance, opts, next) => {
115
- const subFastify = instance.withTypeProvider<ZodTypeProvider>();
116
- addTokenPaymentRoute(subFastify);
117
- next();
211
+ import { ConsoleLogger } from '@rosen-bridge/abstract-logger';
212
+ import { makeFastify, FastifyLogger } from '@rosen-bridge/fastify-enhanced';
213
+
214
+ const fastify = await makeFastify(
215
+ {
216
+ path: '/swagger',
217
+ title: '',
218
+ description: '',
219
+ version: '0.0.1',
220
+ },
221
+ {
222
+ logger: false,
223
+ loggerInstance: new FastifyLogger(new ConsoleLogger()),
118
224
  },
119
- { prefix: 'subroute' },
120
225
  );
121
226
  ```
package/dist/index.d.ts CHANGED
@@ -2,4 +2,5 @@ export type { FastifyZodOpenApiTypeProvider } from 'fastify-zod-openapi';
2
2
  export * from './fastify';
3
3
  export * from './types';
4
4
  export type { FastifyRequest, FastifyReply, HookHandlerDoneFunction, } from 'fastify';
5
+ export * from './logger';
5
6
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AACzE,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,YAAY,EACV,cAAc,EACd,YAAY,EACZ,uBAAuB,GACxB,MAAM,SAAS,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AACzE,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,YAAY,EACV,cAAc,EACd,YAAY,EACZ,uBAAuB,GACxB,MAAM,SAAS,CAAC;AACjB,cAAc,UAAU,CAAC"}
package/dist/index.js CHANGED
@@ -1,3 +1,4 @@
1
1
  export * from './fastify';
2
2
  export * from './types';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IEZhc3RpZnlab2RPcGVuQXBpVHlwZVByb3ZpZGVyIH0gZnJvbSAnZmFzdGlmeS16b2Qtb3BlbmFwaSc7XG5leHBvcnQgKiBmcm9tICcuL2Zhc3RpZnknO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgdHlwZSB7XG4gIEZhc3RpZnlSZXF1ZXN0LFxuICBGYXN0aWZ5UmVwbHksXG4gIEhvb2tIYW5kbGVyRG9uZUZ1bmN0aW9uLFxufSBmcm9tICdmYXN0aWZ5JztcbiJdfQ==
3
+ export * from './logger';
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxTQUFTLENBQUM7QUFNeEIsY0FBYyxVQUFVLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IEZhc3RpZnlab2RPcGVuQXBpVHlwZVByb3ZpZGVyIH0gZnJvbSAnZmFzdGlmeS16b2Qtb3BlbmFwaSc7XG5leHBvcnQgKiBmcm9tICcuL2Zhc3RpZnknO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG5leHBvcnQgdHlwZSB7XG4gIEZhc3RpZnlSZXF1ZXN0LFxuICBGYXN0aWZ5UmVwbHksXG4gIEhvb2tIYW5kbGVyRG9uZUZ1bmN0aW9uLFxufSBmcm9tICdmYXN0aWZ5JztcbmV4cG9ydCAqIGZyb20gJy4vbG9nZ2VyJztcbiJdfQ==
@@ -0,0 +1,94 @@
1
+ import { FastifyBaseLogger, LogLevel } from 'fastify';
2
+ import { AbstractLogger } from '@rosen-bridge/abstract-logger';
3
+ export declare class FastifyLogger implements FastifyBaseLogger {
4
+ protected logger: AbstractLogger;
5
+ level: LogLevel;
6
+ /**
7
+ * creates a new instance
8
+ *
9
+ * @param logger - the underlying logger to delegate to
10
+ * @param level - for FastifyBaseLogger interface compliance
11
+ */
12
+ constructor(logger: AbstractLogger, level?: LogLevel);
13
+ /**
14
+ * no-op silent logger method (for Pino interface compliance)
15
+ * logs nothing regardless of input
16
+ */
17
+ silent: () => void;
18
+ /**
19
+ * logs a trace-level message
20
+ *
21
+ * the LogFn used in fastify logger has multiple signatures, for
22
+ * more info see {@link FastifyLogFn}
23
+ *
24
+ * @param obj: object to be serialized
25
+ * @param msg: the log message to write
26
+ */
27
+ trace: (...args: unknown[]) => void;
28
+ /**
29
+ * logs a debug-level message
30
+ *
31
+ * the LogFn used in fastify logger has multiple signatures, for
32
+ * more info see {@link FastifyLogFn}
33
+ *
34
+ * @param obj: object to be serialized
35
+ * @param msg: the log message to write
36
+ */
37
+ debug: (...args: unknown[]) => void;
38
+ /**
39
+ * logs an info-level message
40
+ *
41
+ * the LogFn used in fastify logger has multiple signatures, for
42
+ * more info see {@link FastifyLogFn}
43
+ *
44
+ * @param obj: object to be serialized
45
+ * @param msg: the log message to write
46
+ */
47
+ info: (...args: unknown[]) => void;
48
+ /**
49
+ * logs a warning-level message
50
+ *
51
+ * the LogFn used in fastify logger has multiple signatures, for
52
+ * more info see {@link FastifyLogFn}
53
+ *
54
+ * @param obj: object to be serialized
55
+ * @param msg: the log message to write
56
+ */
57
+ warn: (...args: unknown[]) => void;
58
+ /**
59
+ * logs an error-level message
60
+ *
61
+ * the LogFn used in fastify logger has multiple signatures, for
62
+ * more info see {@link FastifyLogFn}
63
+ *
64
+ * @param obj: object to be serialized
65
+ * @param msg: the log message to write
66
+ */
67
+ error: (...args: unknown[]) => void;
68
+ /**
69
+ * logs a critical/fatal-level message
70
+ *
71
+ * the LogFn used in fastify logger has multiple signatures, for
72
+ * more info see {@link FastifyLogFn}
73
+ *
74
+ * @param obj: object to be serialized
75
+ * @param msg: the log message to write
76
+ */
77
+ fatal: (...args: unknown[]) => void;
78
+ /**
79
+ * creates a child logger with bindings and optional configuration
80
+ * conforms to the Pino/Fastify logger interface
81
+ *
82
+ * @param bindings - Key-value pairs to attach to all logs from the child logger
83
+ * @returns A new FastifyBaseLogger instance (child logger)
84
+ */
85
+ child: (bindings: Record<string, unknown>) => FastifyBaseLogger;
86
+ /**
87
+ * utility function to map and serialize the arguments of fastify logger functions
88
+ *
89
+ * the LogFn used in fastify logger has multiple signatures, for
90
+ * more info see {@link FastifyLogFn}
91
+ */
92
+ private parseArgs;
93
+ }
94
+ //# sourceMappingURL=logger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"logger.d.ts","sourceRoot":"","sources":["../lib/logger.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,iBAAiB,EAAE,QAAQ,EAAE,MAAM,SAAS,CAAC;AAKtD,OAAO,EAAE,cAAc,EAAE,MAAM,+BAA+B,CAAC;AAE/D,qBAAa,aAAc,YAAW,iBAAiB;IAQnD,SAAS,CAAC,MAAM,EAAE,cAAc;IACzB,KAAK,EAAE,QAAQ;IARxB;;;;;OAKG;gBAES,MAAM,EAAE,cAAc,EACzB,KAAK,GAAE,QAAiB;IAGjC;;;OAGG;IACH,MAAM,aAEJ;IAEF;;;;;;;;OAQG;IACH,KAAK,GAAI,GAAG,MAAM,OAAO,EAAE,UAGzB;IAEF;;;;;;;;OAQG;IACH,KAAK,GAAI,GAAG,MAAM,OAAO,EAAE,UAGzB;IAEF;;;;;;;;OAQG;IACH,IAAI,GAAI,GAAG,MAAM,OAAO,EAAE,UAGxB;IAEF;;;;;;;;OAQG;IACH,IAAI,GAAI,GAAG,MAAM,OAAO,EAAE,UAGxB;IAEF;;;;;;;;OAQG;IACH,KAAK,GAAI,GAAG,MAAM,OAAO,EAAE,UAGzB;IAEF;;;;;;;;OAQG;IACH,KAAK,GAAI,GAAG,MAAM,OAAO,EAAE,UAGzB;IAEF;;;;;;OAMG;IACH,KAAK,GAAI,UAAU,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,KAAG,iBAAiB,CAG5D;IAEF;;;;;OAKG;IACH,OAAO,CAAC,SAAS,CAwBf;CACH"}
package/dist/logger.js ADDED
@@ -0,0 +1,142 @@
1
+ import { serializers } from 'fastify/lib/logger-pino.js';
2
+ export class FastifyLogger {
3
+ logger;
4
+ level;
5
+ /**
6
+ * creates a new instance
7
+ *
8
+ * @param logger - the underlying logger to delegate to
9
+ * @param level - for FastifyBaseLogger interface compliance
10
+ */
11
+ constructor(logger, level = 'info') {
12
+ this.logger = logger;
13
+ this.level = level;
14
+ }
15
+ /**
16
+ * no-op silent logger method (for Pino interface compliance)
17
+ * logs nothing regardless of input
18
+ */
19
+ silent = () => {
20
+ // No-op
21
+ };
22
+ /**
23
+ * logs a trace-level message
24
+ *
25
+ * the LogFn used in fastify logger has multiple signatures, for
26
+ * more info see {@link FastifyLogFn}
27
+ *
28
+ * @param obj: object to be serialized
29
+ * @param msg: the log message to write
30
+ */
31
+ trace = (...args) => {
32
+ const { message, ...context } = this.parseArgs(...args);
33
+ this.logger.trace(message, context);
34
+ };
35
+ /**
36
+ * logs a debug-level message
37
+ *
38
+ * the LogFn used in fastify logger has multiple signatures, for
39
+ * more info see {@link FastifyLogFn}
40
+ *
41
+ * @param obj: object to be serialized
42
+ * @param msg: the log message to write
43
+ */
44
+ debug = (...args) => {
45
+ const { message, ...context } = this.parseArgs(...args);
46
+ this.logger.debug(message, context);
47
+ };
48
+ /**
49
+ * logs an info-level message
50
+ *
51
+ * the LogFn used in fastify logger has multiple signatures, for
52
+ * more info see {@link FastifyLogFn}
53
+ *
54
+ * @param obj: object to be serialized
55
+ * @param msg: the log message to write
56
+ */
57
+ info = (...args) => {
58
+ const { message, ...context } = this.parseArgs(...args);
59
+ this.logger.info(message, context);
60
+ };
61
+ /**
62
+ * logs a warning-level message
63
+ *
64
+ * the LogFn used in fastify logger has multiple signatures, for
65
+ * more info see {@link FastifyLogFn}
66
+ *
67
+ * @param obj: object to be serialized
68
+ * @param msg: the log message to write
69
+ */
70
+ warn = (...args) => {
71
+ const { message, ...context } = this.parseArgs(...args);
72
+ this.logger.warn(message, context);
73
+ };
74
+ /**
75
+ * logs an error-level message
76
+ *
77
+ * the LogFn used in fastify logger has multiple signatures, for
78
+ * more info see {@link FastifyLogFn}
79
+ *
80
+ * @param obj: object to be serialized
81
+ * @param msg: the log message to write
82
+ */
83
+ error = (...args) => {
84
+ const { message, ...context } = this.parseArgs(...args);
85
+ this.logger.error(message, context);
86
+ };
87
+ /**
88
+ * logs a critical/fatal-level message
89
+ *
90
+ * the LogFn used in fastify logger has multiple signatures, for
91
+ * more info see {@link FastifyLogFn}
92
+ *
93
+ * @param obj: object to be serialized
94
+ * @param msg: the log message to write
95
+ */
96
+ fatal = (...args) => {
97
+ const { message, ...context } = this.parseArgs(...args);
98
+ this.logger.critical(message, context);
99
+ };
100
+ /**
101
+ * creates a child logger with bindings and optional configuration
102
+ * conforms to the Pino/Fastify logger interface
103
+ *
104
+ * @param bindings - Key-value pairs to attach to all logs from the child logger
105
+ * @returns A new FastifyBaseLogger instance (child logger)
106
+ */
107
+ child = (bindings) => {
108
+ const childLogger = this.logger.child(JSON.stringify(bindings));
109
+ return new FastifyLogger(childLogger, this.level);
110
+ };
111
+ /**
112
+ * utility function to map and serialize the arguments of fastify logger functions
113
+ *
114
+ * the LogFn used in fastify logger has multiple signatures, for
115
+ * more info see {@link FastifyLogFn}
116
+ */
117
+ parseArgs = (...args) => {
118
+ const [arg0, arg1] = args;
119
+ if (!arg0)
120
+ throw new Error('Fastify log parse failed');
121
+ let info = {};
122
+ if (typeof arg0 === 'string') {
123
+ // format: message [...splat]
124
+ info.message = arg0;
125
+ }
126
+ else {
127
+ // format: meta [message] [...splat]
128
+ info = arg0;
129
+ if (arg0 instanceof Error)
130
+ info = { err: arg0, message: arg0.message };
131
+ // serialize fastify req, res, err
132
+ for (const key in info) {
133
+ if (serializers[key])
134
+ info[key] = serializers[key](info[key]);
135
+ }
136
+ if (arg1)
137
+ info.message = arg1;
138
+ }
139
+ return info;
140
+ };
141
+ }
142
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibG9nZ2VyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2xvZ2dlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFHQSxPQUFPLEVBQUUsV0FBVyxFQUFFLE1BQU0sNEJBQTRCLENBQUM7QUFJekQsTUFBTSxPQUFPLGFBQWE7SUFRWjtJQUNIO0lBUlQ7Ozs7O09BS0c7SUFDSCxZQUNZLE1BQXNCLEVBQ3pCLFFBQWtCLE1BQU07UUFEckIsV0FBTSxHQUFOLE1BQU0sQ0FBZ0I7UUFDekIsVUFBSyxHQUFMLEtBQUssQ0FBbUI7SUFDOUIsQ0FBQztJQUVKOzs7T0FHRztJQUNILE1BQU0sR0FBRyxHQUFHLEVBQUU7UUFDWixRQUFRO0lBQ1YsQ0FBQyxDQUFDO0lBRUY7Ozs7Ozs7O09BUUc7SUFDSCxLQUFLLEdBQUcsQ0FBQyxHQUFHLElBQWUsRUFBRSxFQUFFO1FBQzdCLE1BQU0sRUFBRSxPQUFPLEVBQUUsR0FBRyxPQUFPLEVBQUUsR0FBRyxJQUFJLENBQUMsU0FBUyxDQUFDLEdBQUcsSUFBSSxDQUFDLENBQUM7UUFDeEQsSUFBSSxDQUFDLE1BQU0sQ0FBQyxLQUFLLENBQUMsT0FBaUIsRUFBRSxPQUFPLENBQUMsQ0FBQztJQUNoRCxDQUFDLENBQUM7SUFFRjs7Ozs7Ozs7T0FRRztJQUNILEtBQUssR0FBRyxDQUFDLEdBQUcsSUFBZSxFQUFFLEVBQUU7UUFDN0IsTUFBTSxFQUFFLE9BQU8sRUFBRSxHQUFHLE9BQU8sRUFBRSxHQUFHLElBQUksQ0FBQyxTQUFTLENBQUMsR0FBRyxJQUFJLENBQUMsQ0FBQztRQUN4RCxJQUFJLENBQUMsTUFBTSxDQUFDLEtBQUssQ0FBQyxPQUFpQixFQUFFLE9BQU8sQ0FBQyxDQUFDO0lBQ2hELENBQUMsQ0FBQztJQUVGOzs7Ozs7OztPQVFHO0lBQ0gsSUFBSSxHQUFHLENBQUMsR0FBRyxJQUFlLEVBQUUsRUFBRTtRQUM1QixNQUFNLEVBQUUsT0FBTyxFQUFFLEdBQUcsT0FBTyxFQUFFLEdBQUcsSUFBSSxD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c3RpZnknO1xuLy8gZXNsaW50LWRpc2FibGUtbmV4dC1saW5lIEB0eXBlc2NyaXB0LWVzbGludC9uby11bnVzZWQtdmFyc1xuaW1wb3J0IHR5cGUgeyBGYXN0aWZ5TG9nRm4gfSBmcm9tICdmYXN0aWZ5JztcbmltcG9ydCB7IHNlcmlhbGl6ZXJzIH0gZnJvbSAnZmFzdGlmeS9saWIvbG9nZ2VyLXBpbm8uanMnO1xuXG5pbXBvcnQgeyBBYnN0cmFjdExvZ2dlciB9IGZyb20gJ0Byb3Nlbi1icmlkZ2UvYWJzdHJhY3QtbG9nZ2VyJztcblxuZXhwb3J0IGNsYXNzIEZhc3RpZnlMb2dnZXIgaW1wbGVtZW50cyBGYXN0aWZ5QmFzZUxvZ2dlciB7XG4gIC8qKlxuICAgKiBjcmVhdGVzIGEgbmV3IGluc3RhbmNlXG4gICAqXG4gICAqIEBwYXJhbSBsb2dnZXIgLSB0aGUgdW5kZXJseWluZyBsb2dnZXIgdG8gZGVsZWdhdGUgdG9cbiAgICogQHBhcmFtIGxldmVsIC0gZm9yIEZhc3RpZnlCYXNlTG9nZ2VyIGludGVyZmFjZSBjb21wbGlhbmNlXG4gICAqL1xuICBjb25zdHJ1Y3RvcihcbiAgICBwcm90ZWN0ZWQgbG9nZ2VyOiBBYnN0cmFjdExvZ2dlcixcbiAgICBwdWJsaWMgbGV2ZWw6IExvZ0xldmVsID0gJ2luZm8nLFxuICApIHt9XG5cbiAgLyoqXG4gICAqIG5vLW9wIHNpbGVudCBsb2dnZXIgbWV0aG9kIChmb3IgUGlubyBpbnRlcmZhY2UgY29tcGxpYW5jZSlcbiAgICogbG9ncyBub3RoaW5nIHJlZ2FyZGxlc3Mgb2YgaW5wdXRcbiAgICovXG4gIHNpbGVudCA9ICgpID0+IHtcbiAgICAvLyBOby1vcFxuICB9O1xuXG4gIC8qKlxuICAgKiBsb2dzIGEgdHJhY2UtbGV2ZWwgbWVzc2FnZVxuICAgKlxuICAgKiB0aGUgTG9nRm4gdXNlZCBpbiBmYXN0aWZ5IGxvZ2dlciBoYXMgbXVsdGlwbGUgc2lnbmF0dXJlcywgZm9yXG4gICAqICBtb3JlIGluZm8gc2VlIHtAbGluayBGYXN0aWZ5TG9nRm59XG4gICAqXG4gICAqIEBwYXJhbSBvYmo6IG9iamVjdCB0byBiZSBzZXJpYWxpemVkXG4gICAqIEBwYXJhbSBtc2c6IHRoZSBsb2cgbWVzc2FnZSB0byB3cml0ZVxuICAgKi9cbiAgdHJhY2UgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgY29uc3QgeyBtZXNzYWdlLCAuLi5jb250ZXh0IH0gPSB0aGlzLnBhcnNlQXJncyguLi5hcmdzKTtcbiAgICB0aGlzLmxvZ2dlci50cmFjZShtZXNzYWdlIGFzIHN0cmluZywgY29udGV4dCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGxvZ3MgYSBkZWJ1Zy1sZXZlbCBtZXNzYWdlXG4gICAqXG4gICAqIHRoZSBMb2dGbiB1c2VkIGluIGZhc3RpZnkgbG9nZ2VyIGhhcyBtdWx0aXBsZSBzaWduYXR1cmVzLCBmb3JcbiAgICogIG1vcmUgaW5mbyBzZWUge0BsaW5rIEZhc3RpZnlMb2dGbn1cbiAgICpcbiAgICogQHBhcmFtIG9iajogb2JqZWN0IHRvIGJlIHNlcmlhbGl6ZWRcbiAgICogQHBhcmFtIG1zZzogdGhlIGxvZyBtZXNzYWdlIHRvIHdyaXRlXG4gICAqL1xuICBkZWJ1ZyA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmNvbnRleHQgfSA9IHRoaXMucGFyc2VBcmdzKC4uLmFyZ3MpO1xuICAgIHRoaXMubG9nZ2VyLmRlYnVnKG1lc3NhZ2UgYXMgc3RyaW5nLCBjb250ZXh0KTtcbiAgfTtcblxuICAvKipcbiAgICogbG9ncyBhbiBpbmZvLWxldmVsIG1lc3NhZ2VcbiAgICpcbiAgICogdGhlIExvZ0ZuIHVzZWQgaW4gZmFzdGlmeSBsb2dnZXIgaGFzIG11bHRpcGxlIHNpZ25hdHVyZXMsIGZvclxuICAgKiAgbW9yZSBpbmZvIHNlZSB7QGxpbmsgRmFzdGlmeUxvZ0ZufVxuICAgKlxuICAgKiBAcGFyYW0gb2JqOiBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICAgKiBAcGFyYW0gbXNnOiB0aGUgbG9nIG1lc3NhZ2UgdG8gd3JpdGVcbiAgICovXG4gIGluZm8gPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgY29uc3QgeyBtZXNzYWdlLCAuLi5jb250ZXh0IH0gPSB0aGlzLnBhcnNlQXJncyguLi5hcmdzKTtcbiAgICB0aGlzLmxvZ2dlci5pbmZvKG1lc3NhZ2UgYXMgc3RyaW5nLCBjb250ZXh0KTtcbiAgfTtcblxuICAvKipcbiAgICogbG9ncyBhIHdhcm5pbmctbGV2ZWwgbWVzc2FnZVxuICAgKlxuICAgKiB0aGUgTG9nRm4gdXNlZCBpbiBmYXN0aWZ5IGxvZ2dlciBoYXMgbXVsdGlwbGUgc2lnbmF0dXJlcywgZm9yXG4gICAqICBtb3JlIGluZm8gc2VlIHtAbGluayBGYXN0aWZ5TG9nRm59XG4gICAqXG4gICAqIEBwYXJhbSBvYmo6IG9iamVjdCB0byBiZSBzZXJpYWxpemVkXG4gICAqIEBwYXJhbSBtc2c6IHRoZSBsb2cgbWVzc2FnZSB0byB3cml0ZVxuICAgKi9cbiAgd2FybiA9ICguLi5hcmdzOiB1bmtub3duW10pID0+IHtcbiAgICBjb25zdCB7IG1lc3NhZ2UsIC4uLmNvbnRleHQgfSA9IHRoaXMucGFyc2VBcmdzKC4uLmFyZ3MpO1xuICAgIHRoaXMubG9nZ2VyLndhcm4obWVzc2FnZSBhcyBzdHJpbmcsIGNvbnRleHQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBsb2dzIGFuIGVycm9yLWxldmVsIG1lc3NhZ2VcbiAgICpcbiAgICogdGhlIExvZ0ZuIHVzZWQgaW4gZmFzdGlmeSBsb2dnZXIgaGFzIG11bHRpcGxlIHNpZ25hdHVyZXMsIGZvclxuICAgKiAgbW9yZSBpbmZvIHNlZSB7QGxpbmsgRmFzdGlmeUxvZ0ZufVxuICAgKlxuICAgKiBAcGFyYW0gb2JqOiBvYmplY3QgdG8gYmUgc2VyaWFsaXplZFxuICAgKiBAcGFyYW0gbXNnOiB0aGUgbG9nIG1lc3NhZ2UgdG8gd3JpdGVcbiAgICovXG4gIGVycm9yID0gKC4uLmFyZ3M6IHVua25vd25bXSkgPT4ge1xuICAgIGNvbnN0IHsgbWVzc2FnZSwgLi4uY29udGV4dCB9ID0gdGhpcy5wYXJzZUFyZ3MoLi4uYXJncyk7XG4gICAgdGhpcy5sb2dnZXIuZXJyb3IobWVzc2FnZSBhcyBzdHJpbmcsIGNvbnRleHQpO1xuICB9O1xuXG4gIC8qKlxuICAgKiBsb2dzIGEgY3JpdGljYWwvZmF0YWwtbGV2ZWwgbWVzc2FnZVxuICAgKlxuICAgKiB0aGUgTG9nRm4gdXNlZCBpbiBmYXN0aWZ5IGxvZ2dlciBoYXMgbXVsdGlwbGUgc2lnbmF0dXJlcywgZm9yXG4gICAqICBtb3JlIGluZm8gc2VlIHtAbGluayBGYXN0aWZ5TG9nRm59XG4gICAqXG4gICAqIEBwYXJhbSBvYmo6IG9iamVjdCB0byBiZSBzZXJpYWxpemVkXG4gICAqIEBwYXJhbSBtc2c6IHRoZSBsb2cgbWVzc2FnZSB0byB3cml0ZVxuICAgKi9cbiAgZmF0YWwgPSAoLi4uYXJnczogdW5rbm93bltdKSA9PiB7XG4gICAgY29uc3QgeyBtZXNzYWdlLCAuLi5jb250ZXh0IH0gPSB0aGlzLnBhcnNlQXJncyguLi5hcmdzKTtcbiAgICB0aGlzLmxvZ2dlci5jcml0aWNhbChtZXNzYWdlIGFzIHN0cmluZywgY29udGV4dCk7XG4gIH07XG5cbiAgLyoqXG4gICAqIGNyZWF0ZXMgYSBjaGlsZCBsb2dnZXIgd2l0aCBiaW5kaW5ncyBhbmQgb3B0aW9uYWwgY29uZmlndXJhdGlvblxuICAgKiBjb25mb3JtcyB0byB0aGUgUGluby9GYXN0aWZ5IGxvZ2dlciBpbnRlcmZhY2VcbiAgICpcbiAgICogQHBhcmFtIGJpbmRpbmdzIC0gS2V5LXZhbHVlIHBhaXJzIHRvIGF0dGFjaCB0byBhbGwgbG9ncyBmcm9tIHRoZSBjaGlsZCBsb2dnZXJcbiAgICogQHJldHVybnMgQSBuZXcgRmFzdGlmeUJhc2VMb2dnZXIgaW5zdGFuY2UgKGNoaWxkIGxvZ2dlcilcbiAgICovXG4gIGNoaWxkID0gKGJpbmRpbmdzOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPik6IEZhc3RpZnlCYXNlTG9nZ2VyID0+IHtcbiAgICBjb25zdCBjaGlsZExvZ2dlciA9IHRoaXMubG9nZ2VyLmNoaWxkKEpTT04uc3RyaW5naWZ5KGJpbmRpbmdzKSk7XG4gICAgcmV0dXJuIG5ldyBGYXN0aWZ5TG9nZ2VyKGNoaWxkTG9nZ2VyLCB0aGlzLmxldmVsKTtcbiAgfTtcblxuICAvKipcbiAgICogdXRpbGl0eSBmdW5jdGlvbiB0byBtYXAgYW5kIHNlcmlhbGl6ZSB0aGUgYXJndW1lbnRzIG9mIGZhc3RpZnkgbG9nZ2VyIGZ1bmN0aW9uc1xuICAgKlxuICAgKiB0aGUgTG9nRm4gdXNlZCBpbiBmYXN0aWZ5IGxvZ2dlciBoYXMgbXVsdGlwbGUgc2lnbmF0dXJlcywgZm9yXG4gICAqICBtb3JlIGluZm8gc2VlIHtAbGluayBGYXN0aWZ5TG9nRm59XG4gICAqL1xuICBwcml2YXRlIHBhcnNlQXJncyA9ICguLi5hcmdzOiB1bmtub3duW10pOiBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiA9PiB7XG4gICAgY29uc3QgW2FyZzAsIGFyZzFdID0gYXJncztcbiAgICBpZiAoIWFyZzApIHRocm93IG5ldyBFcnJvcignRmFzdGlmeSBsb2cgcGFyc2UgZmFpbGVkJyk7XG5cbiAgICBsZXQgaW5mbzogUmVjb3JkPHN0cmluZywgdW5rbm93bj4gPSB7fTtcblxuICAgIGlmICh0eXBlb2YgYXJnMCA9PT0gJ3N0cmluZycpIHtcbiAgICAgIC8vIGZvcm1hdDogbWVzc2FnZSBbLi4uc3BsYXRdXG4gICAgICBpbmZvLm1lc3NhZ2UgPSBhcmcwO1xuICAgIH0gZWxzZSB7XG4gICAgICAvLyBmb3JtYXQ6IG1ldGEgW21lc3NhZ2VdIFsuLi5zcGxhdF1cbiAgICAgIGluZm8gPSBhcmcwIGFzIFJlY29yZDxzdHJpbmcsIHVua25vd24+O1xuXG4gICAgICBpZiAoYXJnMCBpbnN0YW5jZW9mIEVycm9yKSBpbmZvID0geyBlcnI6IGFyZzAsIG1lc3NhZ2U6IGFyZzAubWVzc2FnZSB9O1xuXG4gICAgICAvLyBzZXJpYWxpemUgZmFzdGlmeSByZXEsIHJlcywgZXJyXG4gICAgICBmb3IgKGNvbnN0IGtleSBpbiBpbmZvKSB7XG4gICAgICAgIGlmIChzZXJpYWxpemVyc1trZXldKSBpbmZvW2tleV0gPSBzZXJpYWxpemVyc1trZXldKGluZm9ba2V5XSk7XG4gICAgICB9XG5cbiAgICAgIGlmIChhcmcxKSBpbmZvLm1lc3NhZ2UgPSBhcmcxO1xuICAgIH1cblxuICAgIHJldHVybiBpbmZvO1xuICB9O1xufVxuIl19
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@rosen-bridge/fastify-enhanced",
3
- "version": "3.0.0",
3
+ "version": "3.1.0-d5b86d3e",
4
4
  "description": "a wrapper around fastify web framework to make it even better",
5
5
  "repository": {
6
6
  "type": "git",
@@ -30,6 +30,7 @@
30
30
  "dependencies": {
31
31
  "@fastify/swagger": "^9.5.1",
32
32
  "@fastify/swagger-ui": "^5.2.3",
33
+ "@rosen-bridge/abstract-logger": "^4.0.0",
33
34
  "fastify": "^5.3.3",
34
35
  "fastify-zod-openapi": "^4.1.2",
35
36
  "zod-openapi": "^4.2.4"