@rosen-bridge/fastify-enhanced 0.1.0 → 1.0.0

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.
Files changed (47) hide show
  1. package/CHANGELOG.md +17 -0
  2. package/dist/dataTypes.d.ts +206 -428
  3. package/dist/dataTypes.d.ts.map +1 -1
  4. package/dist/dataTypes.js +3 -4
  5. package/dist/error.d.ts +5 -0
  6. package/dist/error.d.ts.map +1 -0
  7. package/dist/error.js +9 -0
  8. package/dist/fastify.d.ts +8 -38
  9. package/dist/fastify.d.ts.map +1 -1
  10. package/dist/fastify.js +19 -153
  11. package/dist/index.d.ts +3 -3
  12. package/dist/index.d.ts.map +1 -1
  13. package/dist/index.js +2 -2
  14. package/dist/jsonParser.d.ts +4 -0
  15. package/dist/jsonParser.d.ts.map +1 -0
  16. package/dist/jsonParser.js +18 -0
  17. package/dist/serializerCompiler.d.ts +14 -0
  18. package/dist/serializerCompiler.d.ts.map +1 -0
  19. package/dist/serializerCompiler.js +27 -0
  20. package/dist/swagger.d.ts +6 -0
  21. package/dist/swagger.d.ts.map +1 -0
  22. package/dist/swagger.js +42 -0
  23. package/dist/types.d.ts +8 -15
  24. package/dist/types.d.ts.map +1 -1
  25. package/dist/types.js +1 -1
  26. package/dist/utils.d.ts +2 -0
  27. package/dist/utils.d.ts.map +1 -0
  28. package/dist/utils.js +4 -0
  29. package/lib/error.ts +9 -0
  30. package/lib/fastify.ts +22 -166
  31. package/lib/index.ts +2 -2
  32. package/lib/jsonParser.ts +23 -0
  33. package/lib/serializerCompiler.ts +42 -0
  34. package/lib/swagger.ts +52 -0
  35. package/lib/types.ts +3 -3
  36. package/lib/utils.ts +6 -0
  37. package/package.json +18 -19
  38. package/tests/bin.ts +13 -0
  39. package/tests/e2e.spec.ts +74 -0
  40. package/tests/mockRoute.ts +104 -0
  41. package/tests/testData.ts +101 -0
  42. package/tsconfig.build.json +2 -1
  43. package/tsconfig.build.tsbuildinfo +1 -1
  44. package/tsconfig.json +2 -1
  45. package/vitest.config.ts +9 -1
  46. package/dist/tsconfig.tsbuildinfo +0 -1
  47. package/lib/dataTypes.ts +0 -7
@@ -1 +1 @@
1
- {"version":3,"file":"dataTypes.d.ts","sourceRoot":"","sources":["../lib/dataTypes.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,KAAK;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAIjB,CAAC"}
1
+ {"version":3,"file":"dataTypes.d.ts","sourceRoot":"","sources":["../lib/dataTypes.ts"],"names":[],"mappings":"AAAA,OAAO,GAAG,MAAM,KAAK,CAAC;AAEtB,eAAO,MAAM,KAAK;;;gBAKkh9C,CAAC;0BAAiD,CAAC;sBAAwC,CAAC;mBAAqC,CAAC;;cAAsC,CAAC;;;gBAAqG,CAAC;0BAAiD,CAAC;sBAAwC,CAAC;mBAAqC,CAAC;;cAAsC,CAAC;;;gBAAub,CAAC;0BAAiD,CAAC;sBAAwC,CAAC;mBAAqC,CAAC;;cAAsC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;qBAA5wH,CAAC,8CAA8C,CAAC;;;;aAA+D,CAAC;;;;kEAAgM,CAAC;;;;uBAAmkP,CAAC;oBAAqB,CAAC;8BAAqD,CAAC;0BAA4C,CAAC;uBAAyC,CAAC;;kBAA8C,CAAC;;uBAAyE,CAAC;oBAAqB,CAAC;8BAAqD,CAAC;0BAA4C,CAAC;uBAAyC,CAAC;;kBAA8C,CAAC;;wBAA6E,CAAC;oBAAqB,CAAC;8BAAqD,CAAC;0BAA4C,CAAC;uBAAyC,CAAC;;kBAA8C,CAAC;;uBAA6E,CAAC;oBAAqB,CAAC;8BAAqD,CAAC;0BAA4C,CAAC;uBAAyC,CAAC;;kBAA8C,CAAC;;qBAA0E,CAAC;oBAAqB,CAAC;8BAAqD,CAAC;0BAA4C,CAAC;uBAAyC,CAAC;;kBAA8C,CAAC;;;;;;gBAA70K,CAAC;0BAAiD,CAAC;sBAAwC,CAAC;mBAAqC,CAAC;;cAAsC,CAAC;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;CAD10/C,CAAC"}
package/dist/dataTypes.js CHANGED
@@ -1,7 +1,6 @@
1
1
  import zod from 'zod';
2
2
  export const types = {
3
- ...zod,
4
- bigint: () =>
5
- zod.union([zod.number(), zod.bigint()]).pipe(zod.coerce.bigint()),
3
+ ...zod,
4
+ bigint: () => zod.union([zod.number(), zod.bigint()]).pipe(zod.coerce.bigint()),
6
5
  };
7
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YVR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2RhdGFUeXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFFdEIsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHO0lBQ25CLEdBQUksR0FBa0M7SUFDdEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUNYLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHpvZCBmcm9tICd6b2QnO1xuXG5leHBvcnQgY29uc3QgdHlwZXMgPSB7XG4gIC4uLih6b2QgYXMgT21pdDx0eXBlb2Ygem9kLCAnYmlnaW50Jz4pLFxuICBiaWdpbnQ6ICgpID0+XG4gICAgem9kLnVuaW9uKFt6b2QubnVtYmVyKCksIHpvZC5iaWdpbnQoKV0pLnBpcGUoem9kLmNvZXJjZS5iaWdpbnQoKSksXG59O1xuIl19
6
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZGF0YVR5cGVzLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL2RhdGFUeXBlcy50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFBQSxPQUFPLEdBQUcsTUFBTSxLQUFLLENBQUM7QUFFdEIsTUFBTSxDQUFDLE1BQU0sS0FBSyxHQUFHO0lBQ25CLEdBQUksR0FBa0M7SUFDdEMsTUFBTSxFQUFFLEdBQUcsRUFBRSxDQUNYLEdBQUcsQ0FBQyxLQUFLLENBQUMsQ0FBQyxHQUFHLENBQUMsTUFBTSxFQUFFLEVBQUUsR0FBRyxDQUFDLE1BQU0sRUFBRSxDQUFDLENBQUMsQ0FBQyxJQUFJLENBQUMsR0FBRyxDQUFDLE1BQU0sQ0FBQyxNQUFNLEVBQUUsQ0FBQztDQUNwRSxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHpvZCBmcm9tICd6b2QnO1xuXG5leHBvcnQgY29uc3QgdHlwZXMgPSB7XG4gIC4uLih6b2QgYXMgT21pdDx0eXBlb2Ygem9kLCAnYmlnaW50Jz4pLFxuICBiaWdpbnQ6ICgpID0+XG4gICAgem9kLnVuaW9uKFt6b2QubnVtYmVyKCksIHpvZC5iaWdpbnQoKV0pLnBpcGUoem9kLmNvZXJjZS5iaWdpbnQoKSksXG59O1xuIl19
@@ -0,0 +1,5 @@
1
+ export declare class ResponseValidationError extends Error {
2
+ details: Record<string, any>;
3
+ constructor(validationResult: Record<string, any>);
4
+ }
5
+ //# sourceMappingURL=error.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"error.d.ts","sourceRoot":"","sources":["../lib/error.ts"],"names":[],"mappings":"AAAA,qBAAa,uBAAwB,SAAQ,KAAK;IACzC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;gBAExB,gBAAgB,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC;CAKlD"}
package/dist/error.js ADDED
@@ -0,0 +1,9 @@
1
+ export class ResponseValidationError extends Error {
2
+ details;
3
+ constructor(validationResult) {
4
+ super("Response doesn't match the schema");
5
+ this.name = 'ResponseValidationError';
6
+ this.details = validationResult.error;
7
+ }
8
+ }
9
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZXJyb3IuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvZXJyb3IudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxPQUFPLHVCQUF3QixTQUFRLEtBQUs7SUFDekMsT0FBTyxDQUFzQjtJQUVwQyxZQUFZLGdCQUFxQztRQUMvQyxLQUFLLENBQUMsbUNBQW1DLENBQUMsQ0FBQztRQUMzQyxJQUFJLENBQUMsSUFBSSxHQUFHLHlCQUF5QixDQUFDO1FBQ3RDLElBQUksQ0FBQyxPQUFPLEdBQUcsZ0JBQWdCLENBQUMsS0FBSyxDQUFDO0lBQ3hDLENBQUM7Q0FDRiIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjbGFzcyBSZXNwb25zZVZhbGlkYXRpb25FcnJvciBleHRlbmRzIEVycm9yIHtcbiAgcHVibGljIGRldGFpbHM6IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgY29uc3RydWN0b3IodmFsaWRhdGlvblJlc3VsdDogUmVjb3JkPHN0cmluZywgYW55Pikge1xuICAgIHN1cGVyKFwiUmVzcG9uc2UgZG9lc24ndCBtYXRjaCB0aGUgc2NoZW1hXCIpO1xuICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZVZhbGlkYXRpb25FcnJvcic7XG4gICAgdGhpcy5kZXRhaWxzID0gdmFsaWRhdGlvblJlc3VsdC5lcnJvcjtcbiAgfVxufVxuIl19
package/dist/fastify.d.ts CHANGED
@@ -1,46 +1,16 @@
1
+ import 'zod-openapi/extend';
1
2
  import { FastifyWithZod, SwaggerOpts } from './types';
2
3
  /**
3
4
  * creates an instance of Fastify with Zod validation library as validator and
4
5
  * type provider
5
- *
6
- * @param {string} [swaggerPath='/swagger']
7
- * @param {boolean} [jsonHandler=JsonBigIntFactory({
8
- * alwaysParseAsBig: false,
9
- * useNativeBigInt: true,
10
- * })]
11
- * @param {*} [opts={ logger: true }]
12
- * @return {Promise<
13
- * FastifyInstance<
14
- * http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>,
15
- * http.IncomingMessage,
16
- * http.ServerResponse<http.IncomingMessage>,
17
- * FastifyBaseLogger,
18
- * ZodTypeProvider
19
- * >
20
- * >}
21
6
  */
22
- export declare const createFastify: (
23
- swaggerOpts?: SwaggerOpts,
24
- opts?: {
7
+ export declare const makeFastify: (swaggerOpts?: SwaggerOpts, opts?: {
25
8
  logger: boolean;
26
- },
27
- jsonHandler?: {
28
- parse: (
29
- text: string,
30
- reviver?: ((this: any, key: string, value: any) => any) | undefined
31
- ) => any;
9
+ }, jsonHandler?: {
10
+ parse: (text: string, reviver?: (this: any, key: string, value: any) => any) => any;
32
11
  stringify: {
33
- (
34
- value: any,
35
- replacer?: ((this: any, key: string, value: any) => any) | undefined,
36
- space?: string | number | undefined
37
- ): string;
38
- (
39
- value: any,
40
- replacer?: (string | number)[] | null | undefined,
41
- space?: string | number | undefined
42
- ): string;
12
+ (value: any, replacer?: (this: any, key: string, value: any) => any, space?: string | number): string;
13
+ (value: any, replacer?: (number | string)[] | null, space?: string | number): string;
43
14
  };
44
- }
45
- ) => Promise<FastifyWithZod>;
46
- //# sourceMappingURL=fastify.d.ts.map
15
+ }) => Promise<FastifyWithZod>;
16
+ //# sourceMappingURL=fastify.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../lib/fastify.ts"],"names":[],"mappings":"AAYA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtD;;;;;;;;;;;;;;;;;;;GAmBG;AACH,eAAO,MAAM,aAAa,iBACX,WAAW;;;;;;;;MAWvB,QAAQ,cAAc,CA8BxB,CAAC"}
1
+ {"version":3,"file":"fastify.d.ts","sourceRoot":"","sources":["../lib/fastify.ts"],"names":[],"mappings":"AAAA,OAAO,oBAAoB,CAAC;AAU5B,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAKtD;;;GAGG;AACH,eAAO,MAAM,WAAW,GACtB,cAAa,WAKZ,EACD;;CAAuB,EACvB;;;;;;CAIE,KACD,OAAO,CAAC,cAAc,CAoBxB,CAAC"}
package/dist/fastify.js CHANGED
@@ -1,165 +1,31 @@
1
- import swagger from '@fastify/swagger';
2
- import swaggerUi from '@fastify/swagger-ui';
1
+ import 'zod-openapi/extend';
2
+ import { fastifyZodOpenApiPlugin, validatorCompiler, } from 'fastify-zod-openapi';
3
3
  import Fastify from 'fastify';
4
- import {
5
- jsonSchemaTransform,
6
- validatorCompiler,
7
- } from 'fastify-type-provider-zod';
8
4
  import JsonBigIntFactory from 'json-bigint';
5
+ import { registerSwagger } from './swagger';
6
+ import { makeJsonParser } from './jsonParser';
7
+ import { makeSerializerCompiler } from './serializerCompiler';
9
8
  /**
10
9
  * creates an instance of Fastify with Zod validation library as validator and
11
10
  * type provider
12
- *
13
- * @param {string} [swaggerPath='/swagger']
14
- * @param {boolean} [jsonHandler=JsonBigIntFactory({
15
- * alwaysParseAsBig: false,
16
- * useNativeBigInt: true,
17
- * })]
18
- * @param {*} [opts={ logger: true }]
19
- * @return {Promise<
20
- * FastifyInstance<
21
- * http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>,
22
- * http.IncomingMessage,
23
- * http.ServerResponse<http.IncomingMessage>,
24
- * FastifyBaseLogger,
25
- * ZodTypeProvider
26
- * >
27
- * >}
28
11
  */
29
- export const createFastify = async (
30
- swaggerOpts = {
12
+ export const makeFastify = async (swaggerOpts = {
31
13
  path: '/swagger',
32
- title: '',
14
+ title: 'api',
33
15
  description: '',
34
16
  version: '0.0.1',
35
- },
36
- opts = { logger: true },
37
- jsonHandler = JsonBigIntFactory({
17
+ }, opts = { logger: true }, jsonHandler = JsonBigIntFactory({
38
18
  alwaysParseAsBig: false,
39
19
  useNativeBigInt: true,
40
- })
41
- ) => {
42
- const fastify = Fastify(opts).withTypeProvider();
43
- fastify.setValidatorCompiler(validatorCompiler);
44
- const serializerCompiler = getSerializerCompiler(jsonHandler);
45
- fastify.setSerializerCompiler(serializerCompiler);
46
- fastify.addContentTypeParser(
47
- 'application/json',
48
- { parseAs: 'string' },
49
- function (req, body, done) {
50
- try {
51
- const json = jsonHandler.parse(body);
52
- done(null, json);
53
- } catch (err) {
54
- if (err instanceof Error || err === null) {
55
- done(err, undefined);
56
- } else {
57
- const wrappedErr = new Error(
58
- `An unexpected error occurred while trying to parse request body`,
59
- { cause: err }
60
- );
61
- done(wrappedErr, undefined);
62
- }
63
- }
64
- }
65
- );
66
- await addSwaggerRoute(fastify, swaggerOpts);
67
- return fastify;
20
+ storeAsString: true,
21
+ })) => {
22
+ const fastify = Fastify(opts).withTypeProvider();
23
+ fastify.setValidatorCompiler(validatorCompiler);
24
+ const serializerCompiler = makeSerializerCompiler(jsonHandler);
25
+ fastify.setSerializerCompiler(serializerCompiler);
26
+ await fastify.register(fastifyZodOpenApiPlugin);
27
+ fastify.addContentTypeParser('application/json', { parseAs: 'string' }, makeJsonParser(jsonHandler));
28
+ await registerSwagger(fastify, swaggerOpts);
29
+ return fastify;
68
30
  };
69
- /**
70
- * creates a Fastify serializer compiler based on Zod validation library and
71
- * using the passed json parser/serializer
72
- *
73
- * @param {typeof JSON} jsonHandler
74
- * @return {(FastifySerializerCompiler<
75
- * | ZodAny
76
- * | {
77
- * properties: ZodAny;
78
- * }
79
- * >)}
80
- */
81
- const getSerializerCompiler = (jsonHandler) => {
82
- const hasOwnProperty = (obj, prop) => {
83
- return Object.prototype.hasOwnProperty.call(obj, prop);
84
- };
85
- /**
86
- * resolve the right schema to be used
87
- *
88
- * @param {(ZodAny | { properties: ZodAny })} maybeSchema
89
- * @return {Pick<ZodAny, 'safeParse'>}
90
- */
91
- function resolveSchema(maybeSchema) {
92
- if (hasOwnProperty(maybeSchema, 'safeParse')) {
93
- return maybeSchema;
94
- }
95
- if (hasOwnProperty(maybeSchema, 'properties')) {
96
- return maybeSchema.properties;
97
- }
98
- throw new Error(`Invalid schema passed: ${JSON.stringify(maybeSchema)}`);
99
- }
100
- class ResponseValidationError extends Error {
101
- details;
102
- constructor(validationResult) {
103
- super("Response doesn't match the schema");
104
- this.name = 'ResponseValidationError';
105
- this.details = validationResult.error;
106
- }
107
- }
108
- /**
109
- * creates a serializer compiler based on Zod library
110
- *
111
- * @param { schema: maybeSchema }
112
- */
113
- const serializerCompiler =
114
- ({ schema: maybeSchema }) =>
115
- (data) => {
116
- const schema = resolveSchema(maybeSchema);
117
- const result = schema.safeParse(data);
118
- if (result.success) {
119
- return jsonHandler.stringify(result.data);
120
- }
121
- throw new ResponseValidationError(result);
122
- };
123
- return serializerCompiler;
124
- };
125
- /**
126
- * adds swagger to the fastify instance
127
- *
128
- * @param {Awaited<ReturnType<typeof createFastify>>} fastify
129
- * @param {string} path
130
- */
131
- const addSwaggerRoute = async (fastify, opts) => {
132
- fastify.register(swagger, {
133
- openapi: {
134
- info: {
135
- title: opts.title,
136
- description: opts.description,
137
- version: opts.version,
138
- },
139
- servers: [],
140
- },
141
- transform: jsonSchemaTransform,
142
- });
143
- fastify.register(swaggerUi, {
144
- routePrefix: opts.path,
145
- uiConfig: {
146
- docExpansion: 'full',
147
- deepLinking: false,
148
- },
149
- uiHooks: {
150
- onRequest: function (request, reply, next) {
151
- next();
152
- },
153
- preHandler: function (request, reply, next) {
154
- next();
155
- },
156
- },
157
- staticCSP: true,
158
- transformStaticCSP: (header) => header,
159
- transformSpecification: (swaggerObject, request, reply) => {
160
- return swaggerObject;
161
- },
162
- transformSpecificationClone: true,
163
- });
164
- };
165
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFzdGlmeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9mYXN0aWZ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZDLE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sT0FBK0MsTUFBTSxTQUFTLENBQUM7QUFDdEUsT0FBTyxFQUVMLG1CQUFtQixFQUNuQixpQkFBaUIsR0FDbEIsTUFBTSwyQkFBMkIsQ0FBQztBQUduQyxPQUFPLGlCQUFpQixNQUFNLGFBQWEsQ0FBQztBQUk1Qzs7Ozs7Ozs7Ozs7Ozs7Ozs7OztHQW1CRztBQUNILE1BQU0sQ0FBQyxNQUFNLGFBQWEsR0FBRyxLQUFLLEVBQ2hDLGNBQTJCO0lBQ3pCLElBQUksRUFBRSxVQUFVO0lBQ2hCLEtBQUssRUFBRSxFQUFFO0lBQ1QsV0FBVyxFQUFFLEVBQUU7SUFDZixPQUFPLEVBQUUsT0FBTztDQUNqQixFQUNELElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDdkIsV0FBVyxHQUFHLGlCQUFpQixDQUFDO0lBQzlCLGdCQUFnQixFQUFFLEtBQUs7SUFDdkIsZUFBZSxFQUFFLElBQUk7Q0FDdEIsQ0FBQyxFQUN1QixFQUFFO0lBQzNCLE1BQU0sT0FBTyxHQUFHLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsRUFBbUIsQ0FBQztJQUNsRSxPQUFPLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVoRCxNQUFNLGtCQUFrQixHQUFHLHFCQUFxQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQzlELE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRWxELE9BQU8sQ0FBQyxvQkFBb0IsQ0FDMUIsa0JBQWtCLEVBQ2xCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUNyQixVQUFVLEdBQUcsRUFBRSxJQUFJLEVBQUUsSUFBSTtR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Q2pCLFdBQVcsRUFBRSxJQUFJLENBQUMsV0FBVztnQkFDN0IsT0FBTyxFQUFFLElBQUksQ0FBQyxPQUFPO2FBQ3RCO1lBQ0QsT0FBTyxFQUFFLEVBQUU7U0FDWjtRQUNELFNBQVMsRUFBRSxtQkFBbUI7S0FDL0IsQ0FBQyxDQUFDO0lBRUgsT0FBTyxDQUFDLFFBQVEsQ0FBQyxTQUFTLEVBQUU7UUFDMUIsV0FBVyxFQUFFLElBQUksQ0FBQyxJQUFJO1FBQ3RCLFFBQVEsRUFBRTtZQUNSLFlBQVksRUFBRSxNQUFNO1lBQ3BCLFdBQVcsRUFBRSxLQUFLO1NBQ25CO1FBQ0QsT0FBTyxFQUFFO1lBQ1AsU0FBUyxFQUFFLFVBQVUsT0FBWSxFQUFFLEtBQVUsRUFBRSxJQUFnQjtnQkFDN0QsSUFBSSxFQUFFLENBQUM7WUFDVCxDQUFDO1lBQ0QsVUFBVSxFQUFFLFVBQVUsT0FBWSxFQUFFLEtBQVUsRUFBRSxJQUFnQjtnQkFDOUQsSUFBSSxFQUFFLENBQUM7WUFDVCxDQUFDO1NBQ0Y7UUFDRCxTQUFTLEVBQUUsSUFBSTtRQUNmLGtCQUFrQixFQUFFLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNO1FBQzNDLHNCQUFzQixFQUFFLENBQUMsYUFBa0IsRUFBRSxPQUFZLEVBQUUsS0FBVSxFQUFFLEVBQUU7WUFDdkUsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUNELDJCQUEyQixFQUFFLElBQUk7S0FDbEMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHN3YWdnZXIgZnJvbSAnQGZhc3RpZnkvc3dhZ2dlcic7XG5pbXBvcnQgc3dhZ2dlclVpIGZyb20gJ0BmYXN0aWZ5L3N3YWdnZXItdWknO1xuaW1wb3J0IEZhc3RpZnksIHsgRmFzdGlmeUJhc2VMb2dnZXIsIEZhc3RpZnlJbnN0YW5jZSB9IGZyb20gJ2Zhc3RpZnknO1xuaW1wb3J0IHtcbiAgWm9kVHlwZVByb3ZpZGVyLFxuICBqc29uU2NoZW1hVHJhbnNmb3JtLFxuICB2YWxpZGF0b3JDb21waWxlcixcbn0gZnJvbSAnZmFzdGlmeS10eXBlLXByb3ZpZGVyLXpvZCc7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlTZXJpYWxpemVyQ29tcGlsZXIgfSBmcm9tICdmYXN0aWZ5L3R5cGVzL3NjaGVtYSc7XG5pbXBvcnQgKiBhcyBodHRwIGZyb20gJ2h0dHAnO1xuaW1wb3J0IEpzb25CaWdJbnRGYWN0b3J5IGZyb20gJ2pzb24tYmlnaW50JztcbmltcG9ydCB0eXBlIHsgWm9kQW55IH0gZnJvbSAnem9kJztcbmltcG9ydCB7IEZhc3RpZnlXaXRoWm9kLCBTd2FnZ2VyT3B0cyB9IGZyb20gJy4vdHlwZXMnO1xuXG4vKipcbiAqIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRmFzdGlmeSB3aXRoIFpvZCB2YWxpZGF0aW9uIGxpYnJhcnkgYXMgdmFsaWRhdG9yIGFuZFxuICogdHlwZSBwcm92aWRlclxuICpcbiAqIEBwYXJhbSB7c3RyaW5nfSBbc3dhZ2dlclBhdGg9Jy9zd2FnZ2VyJ11cbiAqIEBwYXJhbSB7Ym9vbGVhbn0gW2pzb25IYW5kbGVyPUpzb25CaWdJbnRGYWN0b3J5KHtcbiAqICAgICBhbHdheXNQYXJzZUFzQmlnOiBmYWxzZSxcbiAqICAgICB1c2VOYXRpdmVCaWdJbnQ6IHRydWUsXG4gKiAgIH0pXVxuICogQHBhcmFtIHsqfSBbb3B0cz17IGxvZ2dlcjogdHJ1ZSB9XVxuICogQHJldHVybiB7UHJvbWlzZTxcbiAqICAgRmFzdGlmeUluc3RhbmNlPFxuICogICAgIGh0dHAuU2VydmVyPHR5cGVvZiBodHRwLkluY29taW5nTWVzc2FnZSwgdHlwZW9mIGh0dHAuU2VydmVyUmVzcG9uc2U+LFxuICogICAgIGh0dHAuSW5jb21pbmdNZXNzYWdlLFxuICogICAgIGh0dHAuU2VydmVyUmVzcG9uc2U8aHR0cC5JbmNvbWluZ01lc3NhZ2U+LFxuICogICAgIEZhc3RpZnlCYXNlTG9nZ2VyLFxuICogICAgIFpvZFR5cGVQcm92aWRlclxuICogICA+XG4gKiA+fVxuICovXG5leHBvcnQgY29uc3QgY3JlYXRlRmFzdGlmeSA9IGFzeW5jIChcbiAgc3dhZ2dlck9wdHM6IFN3YWdnZXJPcHRzID0ge1xuICAgIHBhdGg6ICcvc3dhZ2dlcicsXG4gICAgdGl0bGU6ICcnLFxuICAgIGRlc2NyaXB0aW9uOiAnJyxcbiAgICB2ZXJzaW9uOiAnMC4wLjEnLFxuICB9LFxuICBvcHRzID0geyBsb2dnZXI6IHRydWUgfSxcbiAganNvbkhhbmRsZXIgPSBKc29uQmlnSW50RmFjdG9yeSh7XG4gICAgYWx3YXlzUGFyc2VBc0JpZzogZmFsc2UsXG4gICAgdXNlTmF0aXZlQmlnSW50OiB0cnVlLFxuICB9KVxuKTogUHJvbWlzZTxGYXN0aWZ5V2l0aFpvZD4gPT4ge1xuICBjb25zdCBmYXN0aWZ5ID0gRmFzdGlmeShvcHRzKS53aXRoVHlwZVByb3ZpZGVyPFpvZFR5cGVQcm92aWRlcj4oKTtcbiAgZmFzdGlmeS5zZXRWYWxpZGF0b3JDb21waWxlcih2YWxpZGF0b3JDb21waWxlcik7XG5cbiAgY29uc3Qgc2VyaWFsaXplckNvbXBpbGVyID0gZ2V0U2VyaWFsaXplckNvbXBpbGVyKGpzb25IYW5kbGVyKTtcbiAgZmFzdGlmeS5zZXRTZXJpYWxpemVyQ29tcGlsZXIoc2VyaWFsaXplckNvbXBpbGVyKTtcblxuICBmYXN0aWZ5LmFkZENvbnRlbnRUeXBlUGFyc2VyPHN0cmluZz4oXG4gICAgJ2FwcGxpY2F0aW9uL2pzb24nLFxuICAgIHsgcGFyc2VBczogJ3N0cmluZycgfSxcbiAgICBmdW5jdGlvbiAocmVxLCBib2R5LCBkb25lKSB7XG4gICAgICB0cnkge1xuICAgICAgICBjb25zdCBqc29uID0ganNvbkhhbmRsZXIucGFyc2UoYm9keSk7XG4gICAgICAgIGRvbmUobnVsbCwganNvbik7XG4gICAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgICAgaWYgKGVyciBpbnN0YW5jZW9mIEVycm9yIHx8IGVyciA9PT0gbnVsbCkge1xuICAgICAgICAgIGRvbmUoZXJyLCB1bmRlZmluZWQpO1xuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IHdyYXBwZWRFcnIgPSBuZXcgRXJyb3IoXG4gICAgICAgICAgICBgQW4gdW5leHBlY3RlZCBlcnJvciBvY2N1cnJlZCB3aGlsZSB0cnlpbmcgdG8gcGFyc2UgcmVxdWVzdCBib2R5YCxcbiAgICAgICAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgICAgICAgKTtcbiAgICAgICAgICBkb25lKHdyYXBwZWRFcnIsIHVuZGVmaW5lZCk7XG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gICk7XG5cbiAgYXdhaXQgYWRkU3dhZ2dlclJvdXRlKGZhc3RpZnksIHN3YWdnZXJPcHRzKTtcbiAgcmV0dXJuIGZhc3RpZnk7XG59O1xuXG4vKipcbiAqIGNyZWF0ZXMgYSBGYXN0aWZ5IHNlcmlhbGl6ZXIgY29tcGlsZXIgYmFzZWQgb24gWm9kIHZhbGlkYXRpb24gbGlicmFyeSBhbmRcbiAqIHVzaW5nIHRoZSBwYXNzZWQganNvbiBwYXJzZXIvc2VyaWFsaXplclxuICpcbiAqIEBwYXJhbSB7dHlwZW9mIEpTT059IGpzb25IYW5kbGVyXG4gKiBAcmV0dXJuIHsoRmFzdGlmeVNlcmlhbGl6ZXJDb21waWxlcjxcbiAqICAgfCBab2RBbnlcbiAqICAgfCB7XG4gKiAgICAgICBwcm9wZXJ0aWVzOiBab2RBbnk7XG4gKiAgICAgfVxuICogPil9XG4gKi9cbmNvbnN0IGdldFNlcmlhbGl6ZXJDb21waWxlciA9IChcbiAganNvbkhhbmRsZXI6IFJldHVyblR5cGU8dHlwZW9mIEpzb25CaWdJbnRGYWN0b3J5PlxuKTogRmFzdGlmeVNlcmlhbGl6ZXJDb21waWxlcjxcbiAgfCBab2RBbnlcbiAgfCB7XG4gICAgICBwcm9wZXJ0aWVzOiBab2RBbnk7XG4gICAgfVxuPiA9PiB7XG4gIGNvbnN0IGhhc093blByb3BlcnR5ID0gPFQsIEsgZXh0ZW5kcyBQcm9wZXJ0eUtleT4oXG4gICAgb2JqOiBULFxuICAgIHByb3A6IEtcbiAgKTogb2JqIGlzIFQgJiBSZWNvcmQ8SywgYW55PiA9PiB7XG4gICAgcmV0dXJuIE9iamVjdC5wcm90b3R5cGUuaGFzT3duUHJvcGVydHkuY2FsbChvYmosIHByb3ApO1xuICB9O1xuXG4gIC8qKlxuICAgKiByZXNvbHZlIHRoZSByaWdodCBzY2hlbWEgdG8gYmUgdXNlZFxuICAgKlxuICAgKiBAcGFyYW0geyhab2RBbnkgfCB7IHByb3BlcnRpZXM6IFpvZEFueSB9KX0gbWF5YmVTY2hlbWFcbiAgICogQHJldHVybiB7UGljazxab2RBbnksICdzYWZlUGFyc2UnPn1cbiAgICovXG4gIGZ1bmN0aW9uIHJlc29sdmVTY2hlbWEoXG4gICAgbWF5YmVTY2hlbWE6IFpvZEFueSB8IHsgcHJvcGVydGllczogWm9kQW55IH1cbiAgKTogUGljazxab2RBbnksICdzYWZlUGFyc2UnPiB7XG4gICAgaWYgKGhhc093blByb3BlcnR5KG1heWJlU2NoZW1hLCAnc2FmZVBhcnNlJykpIHtcbiAgICAgIHJldHVybiBtYXliZVNjaGVtYTtcbiAgICB9XG4gICAgaWYgKGhhc093blByb3BlcnR5KG1heWJlU2NoZW1hLCAncHJvcGVydGllcycpKSB7XG4gICAgICByZXR1cm4gbWF5YmVTY2hlbWEucHJvcGVydGllcztcbiAgICB9XG4gICAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNjaGVtYSBwYXNzZWQ6ICR7SlNPTi5zdHJpbmdpZnkobWF5YmVTY2hlbWEpfWApO1xuICB9XG5cbiAgY2xhc3MgUmVzcG9uc2VWYWxpZGF0aW9uRXJyb3IgZXh0ZW5kcyBFcnJvciB7XG4gICAgcHVibGljIGRldGFpbHM6IFJlY29yZDxzdHJpbmcsIGFueT47XG5cbiAgICBjb25zdHJ1Y3Rvcih2YWxpZGF0aW9uUmVzdWx0OiBSZWNvcmQ8c3RyaW5nLCBhbnk+KSB7XG4gICAgICBzdXBlcihcIlJlc3BvbnNlIGRvZXNuJ3QgbWF0Y2ggdGhlIHNjaGVtYVwiKTtcbiAgICAgIHRoaXMubmFtZSA9ICdSZXNwb25zZVZhbGlkYXRpb25FcnJvcic7XG4gICAgICB0aGlzLmRldGFpbHMgPSB2YWxpZGF0aW9uUmVzdWx0LmVycm9yO1xuICAgIH1cbiAgfVxuXG4gIC8qKlxuICAgKiBjcmVhdGVzIGEgc2VyaWFsaXplciBjb21waWxlciBiYXNlZCBvbiBab2QgbGlicmFyeVxuICAgKlxuICAgKiBAcGFyYW0geyBzY2hlbWE6IG1heWJlU2NoZW1hIH1cbiAgICovXG4gIGNvbnN0IHNlcmlhbGl6ZXJDb21waWxlcjogRmFzdGlmeVNlcmlhbGl6ZXJDb21waWxlcjxcbiAgICBab2RBbnkgfCB7IHByb3BlcnRpZXM6IFpvZEFueSB9XG4gID4gPVxuICAgICh7IHNjaGVtYTogbWF5YmVTY2hlbWEgfSkgPT5cbiAgICAoZGF0YSkgPT4ge1xuICAgICAgY29uc3Qgc2NoZW1hOiBQaWNrPFpvZEFueSwgJ3NhZmVQYXJzZSc+ID0gcmVzb2x2ZVNjaGVtYShtYXliZVNjaGVtYSk7XG5cbiAgICAgIGNvbnN0IHJlc3VsdCA9IHNjaGVtYS5zYWZlUGFyc2UoZGF0YSk7XG4gICAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgICAgcmV0dXJuIGpzb25IYW5kbGVyLnN0cmluZ2lmeShyZXN1bHQuZGF0YSk7XG4gICAgICB9XG5cbiAgICAgIHRocm93IG5ldyBSZXNwb25zZVZhbGlkYXRpb25FcnJvcihyZXN1bHQpO1xuICAgIH07XG5cbiAgcmV0dXJuIHNlcmlhbGl6ZXJDb21waWxlcjtcbn07XG5cbi8qKlxuICogYWRkcyBzd2FnZ2VyIHRvIHRoZSBmYXN0aWZ5IGluc3RhbmNlXG4gKlxuICogQHBhcmFtIHtBd2FpdGVkPFJldHVyblR5cGU8dHlwZW9mIGNyZWF0ZUZhc3RpZnk+Pn0gZmFzdGlmeVxuICogQHBhcmFtIHtzdHJpbmd9IHBhdGhcbiAqL1xuY29uc3QgYWRkU3dhZ2dlclJvdXRlID0gYXN5bmMgKGZhc3RpZnk6IEZhc3RpZnlXaXRoWm9kLCBvcHRzOiBTd2FnZ2VyT3B0cykgPT4ge1xuICBmYXN0aWZ5LnJlZ2lzdGVyKHN3YWdnZXIsIHtcbiAgICBvcGVuYXBpOiB7XG4gICAgICBpbmZvOiB7XG4gICAgICAgIHRpdGxlOiBvcHRzLnRpdGxlLFxuICAgICAgICBkZXNjcmlwdGlvbjogb3B0cy5kZXNjcmlwdGlvbixcbiAgICAgICAgdmVyc2lvbjogb3B0cy52ZXJzaW9uLFxuICAgICAgfSxcbiAgICAgIHNlcnZlcnM6IFtdLFxuICAgIH0sXG4gICAgdHJhbnNmb3JtOiBqc29uU2NoZW1hVHJhbnNmb3JtLFxuICB9KTtcblxuICBmYXN0aWZ5LnJlZ2lzdGVyKHN3YWdnZXJVaSwge1xuICAgIHJvdXRlUHJlZml4OiBvcHRzLnBhdGgsXG4gICAgdWlDb25maWc6IHtcbiAgICAgIGRvY0V4cGFuc2lvbjogJ2Z1bGwnLFxuICAgICAgZGVlcExpbmtpbmc6IGZhbHNlLFxuICAgIH0sXG4gICAgdWlIb29rczoge1xuICAgICAgb25SZXF1ZXN0OiBmdW5jdGlvbiAocmVxdWVzdDogYW55LCByZXBseTogYW55LCBuZXh0OiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIG5leHQoKTtcbiAgICAgIH0sXG4gICAgICBwcmVIYW5kbGVyOiBmdW5jdGlvbiAocmVxdWVzdDogYW55LCByZXBseTogYW55LCBuZXh0OiAoKSA9PiB2b2lkKSB7XG4gICAgICAgIG5leHQoKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzdGF0aWNDU1A6IHRydWUsXG4gICAgdHJhbnNmb3JtU3RhdGljQ1NQOiAoaGVhZGVyOiBhbnkpID0+IGhlYWRlcixcbiAgICB0cmFuc2Zvcm1TcGVjaWZpY2F0aW9uOiAoc3dhZ2dlck9iamVjdDogYW55LCByZXF1ZXN0OiBhbnksIHJlcGx5OiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBzd2FnZ2VyT2JqZWN0O1xuICAgIH0sXG4gICAgdHJhbnNmb3JtU3BlY2lmaWNhdGlvbkNsb25lOiB0cnVlLFxuICB9KTtcbn07XG4iXX0=
31
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiZmFzdGlmeS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9mYXN0aWZ5LnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sb0JBQW9CLENBQUM7QUFFNUIsT0FBTyxFQUVMLHVCQUF1QixFQUN2QixpQkFBaUIsR0FDbEIsTUFBTSxxQkFBcUIsQ0FBQztBQUM3QixPQUFPLE9BQU8sTUFBTSxTQUFTLENBQUM7QUFDOUIsT0FBTyxpQkFBaUIsTUFBTSxhQUFhLENBQUM7QUFHNUMsT0FBTyxFQUFFLGVBQWUsRUFBRSxNQUFNLFdBQVcsQ0FBQztBQUM1QyxPQUFPLEVBQUUsY0FBYyxFQUFFLE1BQU0sY0FBYyxDQUFDO0FBQzlDLE9BQU8sRUFBRSxzQkFBc0IsRUFBRSxNQUFNLHNCQUFzQixDQUFDO0FBRTlEOzs7R0FHRztBQUNILE1BQU0sQ0FBQyxNQUFNLFdBQVcsR0FBRyxLQUFLLEVBQzlCLGNBQTJCO0lBQ3pCLElBQUksRUFBRSxVQUFVO0lBQ2hCLEtBQUssRUFBRSxLQUFLO0lBQ1osV0FBVyxFQUFFLEVBQUU7SUFDZixPQUFPLEVBQUUsT0FBTztDQUNqQixFQUNELElBQUksR0FBRyxFQUFFLE1BQU0sRUFBRSxJQUFJLEVBQUUsRUFDdkIsV0FBVyxHQUFHLGlCQUFpQixDQUFDO0lBQzlCLGdCQUFnQixFQUFFLEtBQUs7SUFDdkIsZUFBZSxFQUFFLElBQUk7SUFDckIsYUFBYSxFQUFFLElBQUk7Q0FDcEIsQ0FBQyxFQUN1QixFQUFFO0lBQzNCLE1BQU0sT0FBTyxHQUNYLE9BQU8sQ0FBQyxJQUFJLENBQUMsQ0FBQyxnQkFBZ0IsRUFBaUMsQ0FBQztJQUVsRSxPQUFPLENBQUMsb0JBQW9CLENBQUMsaUJBQWlCLENBQUMsQ0FBQztJQUVoRCxNQUFNLGtCQUFrQixHQUFHLHNCQUFzQixDQUFDLFdBQVcsQ0FBQyxDQUFDO0lBQy9ELE9BQU8sQ0FBQyxxQkFBcUIsQ0FBQyxrQkFBa0IsQ0FBQyxDQUFDO0lBRWxELE1BQU0sT0FBTyxDQUFDLFFBQVEsQ0FBQyx1QkFBdUIsQ0FBQyxDQUFDO0lBRWhELE9BQU8sQ0FBQyxvQkFBb0IsQ0FDMUIsa0JBQWtCLEVBQ2xCLEVBQUUsT0FBTyxFQUFFLFFBQVEsRUFBRSxFQUNyQixjQUFjLENBQUMsV0FBVyxDQUFDLENBQzVCLENBQUM7SUFFRixNQUFNLGVBQWUsQ0FBQyxPQUFPLEVBQUUsV0FBVyxDQUFDLENBQUM7SUFFNUMsT0FBTyxPQUFPLENBQUM7QUFDakIsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0ICd6b2Qtb3BlbmFwaS9leHRlbmQnO1xuXG5pbXBvcnQge1xuICB0eXBlIEZhc3RpZnlab2RPcGVuQXBpVHlwZVByb3ZpZGVyLFxuICBmYXN0aWZ5Wm9kT3BlbkFwaVBsdWdpbixcbiAgdmFsaWRhdG9yQ29tcGlsZXIsXG59IGZyb20gJ2Zhc3RpZnktem9kLW9wZW5hcGknO1xuaW1wb3J0IEZhc3RpZnkgZnJvbSAnZmFzdGlmeSc7XG5pbXBvcnQgSnNvbkJpZ0ludEZhY3RvcnkgZnJvbSAnanNvbi1iaWdpbnQnO1xuXG5pbXBvcnQgeyBGYXN0aWZ5V2l0aFpvZCwgU3dhZ2dlck9wdHMgfSBmcm9tICcuL3R5cGVzJztcbmltcG9ydCB7IHJlZ2lzdGVyU3dhZ2dlciB9IGZyb20gJy4vc3dhZ2dlcic7XG5pbXBvcnQgeyBtYWtlSnNvblBhcnNlciB9IGZyb20gJy4vanNvblBhcnNlcic7XG5pbXBvcnQgeyBtYWtlU2VyaWFsaXplckNvbXBpbGVyIH0gZnJvbSAnLi9zZXJpYWxpemVyQ29tcGlsZXInO1xuXG4vKipcbiAqIGNyZWF0ZXMgYW4gaW5zdGFuY2Ugb2YgRmFzdGlmeSB3aXRoIFpvZCB2YWxpZGF0aW9uIGxpYnJhcnkgYXMgdmFsaWRhdG9yIGFuZFxuICogdHlwZSBwcm92aWRlclxuICovXG5leHBvcnQgY29uc3QgbWFrZUZhc3RpZnkgPSBhc3luYyAoXG4gIHN3YWdnZXJPcHRzOiBTd2FnZ2VyT3B0cyA9IHtcbiAgICBwYXRoOiAnL3N3YWdnZXInLFxuICAgIHRpdGxlOiAnYXBpJyxcbiAgICBkZXNjcmlwdGlvbjogJycsXG4gICAgdmVyc2lvbjogJzAuMC4xJyxcbiAgfSxcbiAgb3B0cyA9IHsgbG9nZ2VyOiB0cnVlIH0sXG4gIGpzb25IYW5kbGVyID0gSnNvbkJpZ0ludEZhY3Rvcnkoe1xuICAgIGFsd2F5c1BhcnNlQXNCaWc6IGZhbHNlLFxuICAgIHVzZU5hdGl2ZUJpZ0ludDogdHJ1ZSxcbiAgICBzdG9yZUFzU3RyaW5nOiB0cnVlLFxuICB9KVxuKTogUHJvbWlzZTxGYXN0aWZ5V2l0aFpvZD4gPT4ge1xuICBjb25zdCBmYXN0aWZ5ID1cbiAgICBGYXN0aWZ5KG9wdHMpLndpdGhUeXBlUHJvdmlkZXI8RmFzdGlmeVpvZE9wZW5BcGlUeXBlUHJvdmlkZXI+KCk7XG5cbiAgZmFzdGlmeS5zZXRWYWxpZGF0b3JDb21waWxlcih2YWxpZGF0b3JDb21waWxlcik7XG5cbiAgY29uc3Qgc2VyaWFsaXplckNvbXBpbGVyID0gbWFrZVNlcmlhbGl6ZXJDb21waWxlcihqc29uSGFuZGxlcik7XG4gIGZhc3RpZnkuc2V0U2VyaWFsaXplckNvbXBpbGVyKHNlcmlhbGl6ZXJDb21waWxlcik7XG5cbiAgYXdhaXQgZmFzdGlmeS5yZWdpc3RlcihmYXN0aWZ5Wm9kT3BlbkFwaVBsdWdpbik7XG5cbiAgZmFzdGlmeS5hZGRDb250ZW50VHlwZVBhcnNlcjxzdHJpbmc+KFxuICAgICdhcHBsaWNhdGlvbi9qc29uJyxcbiAgICB7IHBhcnNlQXM6ICdzdHJpbmcnIH0sXG4gICAgbWFrZUpzb25QYXJzZXIoanNvbkhhbmRsZXIpXG4gICk7XG5cbiAgYXdhaXQgcmVnaXN0ZXJTd2FnZ2VyKGZhc3RpZnksIHN3YWdnZXJPcHRzKTtcblxuICByZXR1cm4gZmFzdGlmeTtcbn07XG4iXX0=
package/dist/index.d.ts CHANGED
@@ -1,4 +1,4 @@
1
- export { ZodTypeProvider } from 'fastify-type-provider-zod';
2
- export * from './dataTypes';
1
+ export type { FastifyZodOpenApiTypeProvider } from 'fastify-zod-openapi';
3
2
  export * from './fastify';
4
- //# sourceMappingURL=index.d.ts.map
3
+ export * from './types';
4
+ //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../lib/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,cAAc,aAAa,CAAC;AAC5B,cAAc,WAAW,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"}
package/dist/index.js CHANGED
@@ -1,3 +1,3 @@
1
- export * from './dataTypes';
2
1
  export * from './fastify';
3
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsY0FBYyxhQUFhLENBQUM7QUFDNUIsY0FBYyxXQUFXLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgeyBab2RUeXBlUHJvdmlkZXIgfSBmcm9tICdmYXN0aWZ5LXR5cGUtcHJvdmlkZXItem9kJztcbmV4cG9ydCAqIGZyb20gJy4vZGF0YVR5cGVzJztcbmV4cG9ydCAqIGZyb20gJy4vZmFzdGlmeSc7XG4iXX0=
2
+ export * from './types';
3
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiaW5kZXguanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvaW5kZXgudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQ0EsY0FBYyxXQUFXLENBQUM7QUFDMUIsY0FBYyxTQUFTLENBQUMiLCJzb3VyY2VzQ29udGVudCI6WyJleHBvcnQgdHlwZSB7IEZhc3RpZnlab2RPcGVuQXBpVHlwZVByb3ZpZGVyIH0gZnJvbSAnZmFzdGlmeS16b2Qtb3BlbmFwaSc7XG5leHBvcnQgKiBmcm9tICcuL2Zhc3RpZnknO1xuZXhwb3J0ICogZnJvbSAnLi90eXBlcyc7XG4iXX0=
@@ -0,0 +1,4 @@
1
+ import { ContentTypeParserDoneFunction } from 'fastify/types/content-type-parser';
2
+ import JsonBigIntFactory from 'json-bigint';
3
+ export declare const makeJsonParser: (jsonHandler: ReturnType<typeof JsonBigIntFactory>) => (req: unknown, body: string, done: ContentTypeParserDoneFunction) => void;
4
+ //# sourceMappingURL=jsonParser.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"jsonParser.d.ts","sourceRoot":"","sources":["../lib/jsonParser.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,6BAA6B,EAAE,MAAM,mCAAmC,CAAC;AAClF,OAAO,iBAAiB,MAAM,aAAa,CAAC;AAE5C,eAAO,MAAM,cAAc,GACzB,aAAa,UAAU,CAAC,OAAO,iBAAiB,CAAC,MAEzC,KAAK,OAAO,EAAE,MAAM,MAAM,EAAE,MAAM,6BAA6B,SAgBxE,CAAC"}
@@ -0,0 +1,18 @@
1
+ export const makeJsonParser = (jsonHandler) => {
2
+ return (req, body, done) => {
3
+ try {
4
+ const json = jsonHandler.parse(body);
5
+ done(null, json);
6
+ }
7
+ catch (err) {
8
+ if (err instanceof Error || err === null) {
9
+ done(err, undefined);
10
+ }
11
+ else {
12
+ const wrappedErr = new Error(`An unexpected error occurred while trying to parse request body`, { cause: err });
13
+ done(wrappedErr, undefined);
14
+ }
15
+ }
16
+ };
17
+ };
18
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoianNvblBhcnNlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9qc29uUGFyc2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUdBLE1BQU0sQ0FBQyxNQUFNLGNBQWMsR0FBRyxDQUM1QixXQUFpRCxFQUNqRCxFQUFFO0lBQ0YsT0FBTyxDQUFDLEdBQVksRUFBRSxJQUFZLEVBQUUsSUFBbUMsRUFBRSxFQUFFO1FBQ3pFLElBQUksQ0FBQztZQUNILE1BQU0sSUFBSSxHQUFHLFdBQVcsQ0FBQyxLQUFLLENBQUMsSUFBSSxDQUFDLENBQUM7WUFDckMsSUFBSSxDQUFDLElBQUksRUFBRSxJQUFJLENBQUMsQ0FBQztRQUNuQixDQUFDO1FBQUMsT0FBTyxHQUFHLEVBQUUsQ0FBQztZQUNiLElBQUksR0FBRyxZQUFZLEtBQUssSUFBSSxHQUFHLEtBQUssSUFBSSxFQUFFLENBQUM7Z0JBQ3pDLElBQUksQ0FBQyxHQUFHLEVBQUUsU0FBUyxDQUFDLENBQUM7WUFDdkIsQ0FBQztpQkFBTSxDQUFDO2dCQUNOLE1BQU0sVUFBVSxHQUFHLElBQUksS0FBSyxDQUMxQixpRUFBaUUsRUFDakUsRUFBRSxLQUFLLEVBQUUsR0FBRyxFQUFFLENBQ2YsQ0FBQztnQkFDRixJQUFJLENBQUMsVUFBVSxFQUFFLFNBQVMsQ0FBQyxDQUFDO1lBQzlCLENBQUM7UUFDSCxDQUFDO0lBQ0gsQ0FBQyxDQUFDO0FBQ0osQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgQ29udGVudFR5cGVQYXJzZXJEb25lRnVuY3Rpb24gfSBmcm9tICdmYXN0aWZ5L3R5cGVzL2NvbnRlbnQtdHlwZS1wYXJzZXInO1xuaW1wb3J0IEpzb25CaWdJbnRGYWN0b3J5IGZyb20gJ2pzb24tYmlnaW50JztcblxuZXhwb3J0IGNvbnN0IG1ha2VKc29uUGFyc2VyID0gKFxuICBqc29uSGFuZGxlcjogUmV0dXJuVHlwZTx0eXBlb2YgSnNvbkJpZ0ludEZhY3Rvcnk+XG4pID0+IHtcbiAgcmV0dXJuIChyZXE6IHVua25vd24sIGJvZHk6IHN0cmluZywgZG9uZTogQ29udGVudFR5cGVQYXJzZXJEb25lRnVuY3Rpb24pID0+IHtcbiAgICB0cnkge1xuICAgICAgY29uc3QganNvbiA9IGpzb25IYW5kbGVyLnBhcnNlKGJvZHkpO1xuICAgICAgZG9uZShudWxsLCBqc29uKTtcbiAgICB9IGNhdGNoIChlcnIpIHtcbiAgICAgIGlmIChlcnIgaW5zdGFuY2VvZiBFcnJvciB8fCBlcnIgPT09IG51bGwpIHtcbiAgICAgICAgZG9uZShlcnIsIHVuZGVmaW5lZCk7XG4gICAgICB9IGVsc2Uge1xuICAgICAgICBjb25zdCB3cmFwcGVkRXJyID0gbmV3IEVycm9yKFxuICAgICAgICAgIGBBbiB1bmV4cGVjdGVkIGVycm9yIG9jY3VycmVkIHdoaWxlIHRyeWluZyB0byBwYXJzZSByZXF1ZXN0IGJvZHlgLFxuICAgICAgICAgIHsgY2F1c2U6IGVyciB9XG4gICAgICAgICk7XG4gICAgICAgIGRvbmUod3JhcHBlZEVyciwgdW5kZWZpbmVkKTtcbiAgICAgIH1cbiAgICB9XG4gIH07XG59O1xuIl19
@@ -0,0 +1,14 @@
1
+ import { FastifySerializerCompiler } from 'fastify/types/schema';
2
+ import { ZodAny } from 'zod';
3
+ import JsonBigIntFactory from 'json-bigint';
4
+ type SerType = FastifySerializerCompiler<ZodAny | {
5
+ properties: ZodAny;
6
+ }>;
7
+ type JsonHandler = ReturnType<typeof JsonBigIntFactory>;
8
+ /**
9
+ * creates a Fastify serializer compiler based on Zod validation library and
10
+ * using the passed json parser/serializer
11
+ */
12
+ export declare const makeSerializerCompiler: (jsonHandler: JsonHandler) => SerType;
13
+ export {};
14
+ //# sourceMappingURL=serializerCompiler.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"serializerCompiler.d.ts","sourceRoot":"","sources":["../lib/serializerCompiler.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,yBAAyB,EAAE,MAAM,sBAAsB,CAAC;AACjE,OAAO,EAAE,MAAM,EAAE,MAAM,KAAK,CAAC;AAC7B,OAAO,iBAAiB,MAAM,aAAa,CAAC;AAK5C,KAAK,OAAO,GAAG,yBAAyB,CAAC,MAAM,GAAG;IAAE,UAAU,EAAE,MAAM,CAAA;CAAE,CAAC,CAAC;AAC1E,KAAK,WAAW,GAAG,UAAU,CAAC,OAAO,iBAAiB,CAAC,CAAC;AAExD;;;GAGG;AACH,eAAO,MAAM,sBAAsB,GAChC,aAAa,WAAW,KAAG,OAW3B,CAAC"}
@@ -0,0 +1,27 @@
1
+ import { ResponseValidationError } from './error';
2
+ import { hasOwnProperty } from './utils';
3
+ /**
4
+ * creates a Fastify serializer compiler based on Zod validation library and
5
+ * using the passed json parser/serializer
6
+ */
7
+ export const makeSerializerCompiler = (jsonHandler) => (schemaDef) => (data) => {
8
+ const schema = resolveSchema(schemaDef.schema);
9
+ const result = schema.safeParse(data);
10
+ if (result.success) {
11
+ return jsonHandler.stringify(result.data);
12
+ }
13
+ throw new ResponseValidationError(result);
14
+ };
15
+ /**
16
+ * resolve the right schema to be used
17
+ */
18
+ const resolveSchema = (maybeSchema) => {
19
+ if (hasOwnProperty(maybeSchema, 'safeParse')) {
20
+ return maybeSchema;
21
+ }
22
+ if (hasOwnProperty(maybeSchema, 'properties')) {
23
+ return maybeSchema.properties;
24
+ }
25
+ throw new Error(`Invalid schema passed: ${JSON.stringify(maybeSchema)}`);
26
+ };
27
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic2VyaWFsaXplckNvbXBpbGVyLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vbGliL3NlcmlhbGl6ZXJDb21waWxlci50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiQUFJQSxPQUFPLEVBQUUsdUJBQXVCLEVBQUUsTUFBTSxTQUFTLENBQUM7QUFDbEQsT0FBTyxFQUFFLGNBQWMsRUFBRSxNQUFNLFNBQVMsQ0FBQztBQUt6Qzs7O0dBR0c7QUFDSCxNQUFNLENBQUMsTUFBTSxzQkFBc0IsR0FDakMsQ0FBQyxXQUF3QixFQUFXLEVBQUUsQ0FDdEMsQ0FBQyxTQUFTLEVBQUUsRUFBRSxDQUNkLENBQUMsSUFBSSxFQUFFLEVBQUU7SUFDUCxNQUFNLE1BQU0sR0FBOEIsYUFBYSxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsQ0FBQztJQUUxRSxNQUFNLE1BQU0sR0FBRyxNQUFNLENBQUMsU0FBUyxDQUFDLElBQUksQ0FBQyxDQUFDO0lBQ3RDLElBQUksTUFBTSxDQUFDLE9BQU8sRUFBRSxDQUFDO1FBQ25CLE9BQU8sV0FBVyxDQUFDLFNBQVMsQ0FBQyxNQUFNLENBQUMsSUFBSSxDQUFDLENBQUM7SUFDNUMsQ0FBQztJQUVELE1BQU0sSUFBSSx1QkFBdUIsQ0FBQyxNQUFNLENBQUMsQ0FBQztBQUM1QyxDQUFDLENBQUM7QUFFSjs7R0FFRztBQUNILE1BQU0sYUFBYSxHQUFHLENBQ3BCLFdBQTRDLEVBQ2pCLEVBQUU7SUFDN0IsSUFBSSxjQUFjLENBQUMsV0FBVyxFQUFFLFdBQVcsQ0FBQyxFQUFFLENBQUM7UUFDN0MsT0FBTyxXQUFXLENBQUM7SUFDckIsQ0FBQztJQUNELElBQUksY0FBYyxDQUFDLFdBQVcsRUFBRSxZQUFZLENBQUMsRUFBRSxDQUFDO1FBQzlDLE9BQU8sV0FBVyxDQUFDLFVBQVUsQ0FBQztJQUNoQyxDQUFDO0lBQ0QsTUFBTSxJQUFJLEtBQUssQ0FBQywwQkFBMEIsSUFBSSxDQUFDLFNBQVMsQ0FBQyxXQUFXLENBQUMsRUFBRSxDQUFDLENBQUM7QUFDM0UsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHsgRmFzdGlmeVNlcmlhbGl6ZXJDb21waWxlciB9IGZyb20gJ2Zhc3RpZnkvdHlwZXMvc2NoZW1hJztcbmltcG9ydCB7IFpvZEFueSB9IGZyb20gJ3pvZCc7XG5pbXBvcnQgSnNvbkJpZ0ludEZhY3RvcnkgZnJvbSAnanNvbi1iaWdpbnQnO1xuXG5pbXBvcnQgeyBSZXNwb25zZVZhbGlkYXRpb25FcnJvciB9IGZyb20gJy4vZXJyb3InO1xuaW1wb3J0IHsgaGFzT3duUHJvcGVydHkgfSBmcm9tICcuL3V0aWxzJztcblxudHlwZSBTZXJUeXBlID0gRmFzdGlmeVNlcmlhbGl6ZXJDb21waWxlcjxab2RBbnkgfCB7IHByb3BlcnRpZXM6IFpvZEFueSB9PjtcbnR5cGUgSnNvbkhhbmRsZXIgPSBSZXR1cm5UeXBlPHR5cGVvZiBKc29uQmlnSW50RmFjdG9yeT47XG5cbi8qKlxuICogY3JlYXRlcyBhIEZhc3RpZnkgc2VyaWFsaXplciBjb21waWxlciBiYXNlZCBvbiBab2QgdmFsaWRhdGlvbiBsaWJyYXJ5IGFuZFxuICogdXNpbmcgdGhlIHBhc3NlZCBqc29uIHBhcnNlci9zZXJpYWxpemVyXG4gKi9cbmV4cG9ydCBjb25zdCBtYWtlU2VyaWFsaXplckNvbXBpbGVyID1cbiAgKGpzb25IYW5kbGVyOiBKc29uSGFuZGxlcik6IFNlclR5cGUgPT5cbiAgKHNjaGVtYURlZikgPT5cbiAgKGRhdGEpID0+IHtcbiAgICBjb25zdCBzY2hlbWE6IFBpY2s8Wm9kQW55LCAnc2FmZVBhcnNlJz4gPSByZXNvbHZlU2NoZW1hKHNjaGVtYURlZi5zY2hlbWEpO1xuXG4gICAgY29uc3QgcmVzdWx0ID0gc2NoZW1hLnNhZmVQYXJzZShkYXRhKTtcbiAgICBpZiAocmVzdWx0LnN1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiBqc29uSGFuZGxlci5zdHJpbmdpZnkocmVzdWx0LmRhdGEpO1xuICAgIH1cblxuICAgIHRocm93IG5ldyBSZXNwb25zZVZhbGlkYXRpb25FcnJvcihyZXN1bHQpO1xuICB9O1xuXG4vKipcbiAqIHJlc29sdmUgdGhlIHJpZ2h0IHNjaGVtYSB0byBiZSB1c2VkXG4gKi9cbmNvbnN0IHJlc29sdmVTY2hlbWEgPSAoXG4gIG1heWJlU2NoZW1hOiBab2RBbnkgfCB7IHByb3BlcnRpZXM6IFpvZEFueSB9XG4pOiBQaWNrPFpvZEFueSwgJ3NhZmVQYXJzZSc+ID0+IHtcbiAgaWYgKGhhc093blByb3BlcnR5KG1heWJlU2NoZW1hLCAnc2FmZVBhcnNlJykpIHtcbiAgICByZXR1cm4gbWF5YmVTY2hlbWE7XG4gIH1cbiAgaWYgKGhhc093blByb3BlcnR5KG1heWJlU2NoZW1hLCAncHJvcGVydGllcycpKSB7XG4gICAgcmV0dXJuIG1heWJlU2NoZW1hLnByb3BlcnRpZXM7XG4gIH1cbiAgdGhyb3cgbmV3IEVycm9yKGBJbnZhbGlkIHNjaGVtYSBwYXNzZWQ6ICR7SlNPTi5zdHJpbmdpZnkobWF5YmVTY2hlbWEpfWApO1xufTtcbiJdfQ==
@@ -0,0 +1,6 @@
1
+ import { FastifyWithZod, SwaggerOpts } from './types';
2
+ /**
3
+ * adds swagger to the fastify instance
4
+ */
5
+ export declare const registerSwagger: (fastify: FastifyWithZod, opts: SwaggerOpts) => Promise<void>;
6
+ //# sourceMappingURL=swagger.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"swagger.d.ts","sourceRoot":"","sources":["../lib/swagger.ts"],"names":[],"mappings":"AAQA,OAAO,EAAE,cAAc,EAAE,WAAW,EAAE,MAAM,SAAS,CAAC;AAEtD;;GAEG;AACH,eAAO,MAAM,eAAe,GAC1B,SAAS,cAAc,EACvB,MAAM,WAAW,kBAoClB,CAAC"}
@@ -0,0 +1,42 @@
1
+ import swagger from '@fastify/swagger';
2
+ import swaggerUi from '@fastify/swagger-ui';
3
+ import { fastifyZodOpenApiTransform, fastifyZodOpenApiTransformObject, } from 'fastify-zod-openapi';
4
+ /**
5
+ * adds swagger to the fastify instance
6
+ */
7
+ export const registerSwagger = async (fastify, opts) => {
8
+ await fastify.register(swagger, {
9
+ openapi: {
10
+ openapi: '3.1.0',
11
+ info: {
12
+ title: opts.title,
13
+ description: opts.description,
14
+ version: opts.version,
15
+ },
16
+ },
17
+ transform: fastifyZodOpenApiTransform,
18
+ transformObject: fastifyZodOpenApiTransformObject,
19
+ });
20
+ await fastify.register(swaggerUi, {
21
+ routePrefix: opts.path,
22
+ uiConfig: {
23
+ docExpansion: 'full',
24
+ deepLinking: false,
25
+ },
26
+ uiHooks: {
27
+ onRequest: (request, reply, next) => {
28
+ next();
29
+ },
30
+ preHandler: (request, reply, next) => {
31
+ next();
32
+ },
33
+ },
34
+ staticCSP: true,
35
+ transformStaticCSP: (header) => header,
36
+ transformSpecification: (swaggerObject, request, reply) => {
37
+ return swaggerObject;
38
+ },
39
+ transformSpecificationClone: true,
40
+ });
41
+ };
42
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoic3dhZ2dlci5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uL2xpYi9zd2FnZ2VyLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiJBQUFBLE9BQU8sT0FBTyxNQUFNLGtCQUFrQixDQUFDO0FBQ3ZDLE9BQU8sU0FBUyxNQUFNLHFCQUFxQixDQUFDO0FBQzVDLE9BQU8sRUFDTCwwQkFBMEIsRUFDMUIsZ0NBQWdDLEdBQ2pDLE1BQU0scUJBQXFCLENBQUM7QUFLN0I7O0dBRUc7QUFDSCxNQUFNLENBQUMsTUFBTSxlQUFlLEdBQUcsS0FBSyxFQUNsQyxPQUF1QixFQUN2QixJQUFpQixFQUNqQixFQUFFO0lBQ0YsTUFBTSxPQUFPLENBQUMsUUFBUSxDQUFDLE9BQU8sRUFBRTtRQUM5QixPQUFPLEVBQUU7WUFDUCxPQUFPLEVBQUUsT0FBNEI7WUFDckMsSUFBSSxFQUFFO2dCQUNKLEtBQUssRUFBRSxJQUFJLENBQUMsS0FBSztnQkFDakIsV0FBVyxFQUFFLElBQUksQ0FBQyxXQUFXO2dCQUM3QixPQUFPLEVBQUUsSUFBSSxDQUFDLE9BQU87YUFDdEI7U0FDRjtRQUNELFNBQVMsRUFBRSwwQkFBMEI7UUFDckMsZUFBZSxFQUFFLGdDQUFnQztLQUNsRCxDQUFDLENBQUM7SUFFSCxNQUFNLE9BQU8sQ0FBQyxRQUFRLENBQUMsU0FBUyxFQUFFO1FBQ2hDLFdBQVcsRUFBRSxJQUFJLENBQUMsSUFBSTtRQUN0QixRQUFRLEVBQUU7WUFDUixZQUFZLEVBQUUsTUFBTTtZQUNwQixXQUFXLEVBQUUsS0FBSztTQUNuQjtRQUNELE9BQU8sRUFBRTtZQUNQLFNBQVMsRUFBRSxDQUFDLE9BQVksRUFBRSxLQUFVLEVBQUUsSUFBZ0IsRUFBRSxFQUFFO2dCQUN4RCxJQUFJLEVBQUUsQ0FBQztZQUNULENBQUM7WUFDRCxVQUFVLEVBQUUsQ0FBQyxPQUFZLEVBQUUsS0FBVSxFQUFFLElBQWdCLEVBQUUsRUFBRTtnQkFDekQsSUFBSSxFQUFFLENBQUM7WUFDVCxDQUFDO1NBQ0Y7UUFDRCxTQUFTLEVBQUUsSUFBSTtRQUNmLGtCQUFrQixFQUFFLENBQUMsTUFBVyxFQUFFLEVBQUUsQ0FBQyxNQUFNO1FBQzNDLHNCQUFzQixFQUFFLENBQUMsYUFBa0IsRUFBRSxPQUFZLEVBQUUsS0FBVSxFQUFFLEVBQUU7WUFDdkUsT0FBTyxhQUFhLENBQUM7UUFDdkIsQ0FBQztRQUNELDJCQUEyQixFQUFFLElBQUk7S0FDbEMsQ0FBQyxDQUFDO0FBQ0wsQ0FBQyxDQUFDIiwic291cmNlc0NvbnRlbnQiOlsiaW1wb3J0IHN3YWdnZXIgZnJvbSAnQGZhc3RpZnkvc3dhZ2dlcic7XG5pbXBvcnQgc3dhZ2dlclVpIGZyb20gJ0BmYXN0aWZ5L3N3YWdnZXItdWknO1xuaW1wb3J0IHtcbiAgZmFzdGlmeVpvZE9wZW5BcGlUcmFuc2Zvcm0sXG4gIGZhc3RpZnlab2RPcGVuQXBpVHJhbnNmb3JtT2JqZWN0LFxufSBmcm9tICdmYXN0aWZ5LXpvZC1vcGVuYXBpJztcbmltcG9ydCB7IFpvZE9wZW5BcGlWZXJzaW9uIH0gZnJvbSAnem9kLW9wZW5hcGknO1xuXG5pbXBvcnQgeyBGYXN0aWZ5V2l0aFpvZCwgU3dhZ2dlck9wdHMgfSBmcm9tICcuL3R5cGVzJztcblxuLyoqXG4gKiBhZGRzIHN3YWdnZXIgdG8gdGhlIGZhc3RpZnkgaW5zdGFuY2VcbiAqL1xuZXhwb3J0IGNvbnN0IHJlZ2lzdGVyU3dhZ2dlciA9IGFzeW5jIChcbiAgZmFzdGlmeTogRmFzdGlmeVdpdGhab2QsXG4gIG9wdHM6IFN3YWdnZXJPcHRzXG4pID0+IHtcbiAgYXdhaXQgZmFzdGlmeS5yZWdpc3Rlcihzd2FnZ2VyLCB7XG4gICAgb3BlbmFwaToge1xuICAgICAgb3BlbmFwaTogJzMuMS4wJyBhcyBab2RPcGVuQXBpVmVyc2lvbixcbiAgICAgIGluZm86IHtcbiAgICAgICAgdGl0bGU6IG9wdHMudGl0bGUsXG4gICAgICAgIGRlc2NyaXB0aW9uOiBvcHRzLmRlc2NyaXB0aW9uLFxuICAgICAgICB2ZXJzaW9uOiBvcHRzLnZlcnNpb24sXG4gICAgICB9LFxuICAgIH0sXG4gICAgdHJhbnNmb3JtOiBmYXN0aWZ5Wm9kT3BlbkFwaVRyYW5zZm9ybSxcbiAgICB0cmFuc2Zvcm1PYmplY3Q6IGZhc3RpZnlab2RPcGVuQXBpVHJhbnNmb3JtT2JqZWN0LFxuICB9KTtcblxuICBhd2FpdCBmYXN0aWZ5LnJlZ2lzdGVyKHN3YWdnZXJVaSwge1xuICAgIHJvdXRlUHJlZml4OiBvcHRzLnBhdGgsXG4gICAgdWlDb25maWc6IHtcbiAgICAgIGRvY0V4cGFuc2lvbjogJ2Z1bGwnLFxuICAgICAgZGVlcExpbmtpbmc6IGZhbHNlLFxuICAgIH0sXG4gICAgdWlIb29rczoge1xuICAgICAgb25SZXF1ZXN0OiAocmVxdWVzdDogYW55LCByZXBseTogYW55LCBuZXh0OiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgIG5leHQoKTtcbiAgICAgIH0sXG4gICAgICBwcmVIYW5kbGVyOiAocmVxdWVzdDogYW55LCByZXBseTogYW55LCBuZXh0OiAoKSA9PiB2b2lkKSA9PiB7XG4gICAgICAgIG5leHQoKTtcbiAgICAgIH0sXG4gICAgfSxcbiAgICBzdGF0aWNDU1A6IHRydWUsXG4gICAgdHJhbnNmb3JtU3RhdGljQ1NQOiAoaGVhZGVyOiBhbnkpID0+IGhlYWRlcixcbiAgICB0cmFuc2Zvcm1TcGVjaWZpY2F0aW9uOiAoc3dhZ2dlck9iamVjdDogYW55LCByZXF1ZXN0OiBhbnksIHJlcGx5OiBhbnkpID0+IHtcbiAgICAgIHJldHVybiBzd2FnZ2VyT2JqZWN0O1xuICAgIH0sXG4gICAgdHJhbnNmb3JtU3BlY2lmaWNhdGlvbkNsb25lOiB0cnVlLFxuICB9KTtcbn07XG4iXX0=
package/dist/types.d.ts CHANGED
@@ -1,18 +1,11 @@
1
- /// <reference types="node" />
2
- import { FastifyBaseLogger, FastifyInstance } from 'fastify';
3
- import { ZodTypeProvider } from 'fastify-type-provider-zod';
4
1
  import * as http from 'http';
5
- export type FastifyWithZod = FastifyInstance<
6
- http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>,
7
- http.IncomingMessage,
8
- http.ServerResponse<http.IncomingMessage>,
9
- FastifyBaseLogger,
10
- ZodTypeProvider
11
- >;
2
+ import { FastifyBaseLogger, FastifyInstance } from 'fastify';
3
+ import type { FastifyZodOpenApiTypeProvider } from 'fastify-zod-openapi';
4
+ export type FastifyWithZod = FastifyInstance<http.Server<typeof http.IncomingMessage, typeof http.ServerResponse>, http.IncomingMessage, http.ServerResponse<http.IncomingMessage>, FastifyBaseLogger, FastifyZodOpenApiTypeProvider>;
12
5
  export interface SwaggerOpts {
13
- path: string;
14
- title: string;
15
- description: string;
16
- version: string;
6
+ path: string;
7
+ title: string;
8
+ description: string;
9
+ version: string;
17
10
  }
18
- //# sourceMappingURL=types.d.ts.map
11
+ //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":";AAAA,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,EAAE,eAAe,EAAE,MAAM,2BAA2B,CAAC;AAC5D,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAE7B,MAAM,MAAM,cAAc,GAAG,eAAe,CAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,eAAe,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,EACpE,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,EACzC,iBAAiB,EACjB,eAAe,CAChB,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../lib/types.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,IAAI,MAAM,MAAM,CAAC;AAC7B,OAAO,EAAE,iBAAiB,EAAE,eAAe,EAAE,MAAM,SAAS,CAAC;AAC7D,OAAO,KAAK,EAAE,6BAA6B,EAAE,MAAM,qBAAqB,CAAC;AAEzE,MAAM,MAAM,cAAc,GAAG,eAAe,CAC1C,IAAI,CAAC,MAAM,CAAC,OAAO,IAAI,CAAC,eAAe,EAAE,OAAO,IAAI,CAAC,cAAc,CAAC,EACpE,IAAI,CAAC,eAAe,EACpB,IAAI,CAAC,cAAc,CAAC,IAAI,CAAC,eAAe,CAAC,EACzC,iBAAiB,EACjB,6BAA6B,CAC9B,CAAC;AAEF,MAAM,WAAW,WAAW;IAC1B,IAAI,EAAE,MAAM,CAAC;IACb,KAAK,EAAE,MAAM,CAAC;IACd,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;CACjB"}
package/dist/types.js CHANGED
@@ -1,2 +1,2 @@
1
1
  export {};
2
- //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCB7IEZhc3RpZnlCYXNlTG9nZ2VyLCBGYXN0aWZ5SW5zdGFuY2UgfSBmcm9tICdmYXN0aWZ5JztcbmltcG9ydCB7IFpvZFR5cGVQcm92aWRlciB9IGZyb20gJ2Zhc3RpZnktdHlwZS1wcm92aWRlci16b2QnO1xuaW1wb3J0ICogYXMgaHR0cCBmcm9tICdodHRwJztcblxuZXhwb3J0IHR5cGUgRmFzdGlmeVdpdGhab2QgPSBGYXN0aWZ5SW5zdGFuY2U8XG4gIGh0dHAuU2VydmVyPHR5cGVvZiBodHRwLkluY29taW5nTWVzc2FnZSwgdHlwZW9mIGh0dHAuU2VydmVyUmVzcG9uc2U+LFxuICBodHRwLkluY29taW5nTWVzc2FnZSxcbiAgaHR0cC5TZXJ2ZXJSZXNwb25zZTxodHRwLkluY29taW5nTWVzc2FnZT4sXG4gIEZhc3RpZnlCYXNlTG9nZ2VyLFxuICBab2RUeXBlUHJvdmlkZXJcbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlck9wdHMge1xuICBwYXRoOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cbiJdfQ==
2
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvdHlwZXMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbImltcG9ydCAqIGFzIGh0dHAgZnJvbSAnaHR0cCc7XG5pbXBvcnQgeyBGYXN0aWZ5QmFzZUxvZ2dlciwgRmFzdGlmeUluc3RhbmNlIH0gZnJvbSAnZmFzdGlmeSc7XG5pbXBvcnQgdHlwZSB7IEZhc3RpZnlab2RPcGVuQXBpVHlwZVByb3ZpZGVyIH0gZnJvbSAnZmFzdGlmeS16b2Qtb3BlbmFwaSc7XG5cbmV4cG9ydCB0eXBlIEZhc3RpZnlXaXRoWm9kID0gRmFzdGlmeUluc3RhbmNlPFxuICBodHRwLlNlcnZlcjx0eXBlb2YgaHR0cC5JbmNvbWluZ01lc3NhZ2UsIHR5cGVvZiBodHRwLlNlcnZlclJlc3BvbnNlPixcbiAgaHR0cC5JbmNvbWluZ01lc3NhZ2UsXG4gIGh0dHAuU2VydmVyUmVzcG9uc2U8aHR0cC5JbmNvbWluZ01lc3NhZ2U+LFxuICBGYXN0aWZ5QmFzZUxvZ2dlcixcbiAgRmFzdGlmeVpvZE9wZW5BcGlUeXBlUHJvdmlkZXJcbj47XG5cbmV4cG9ydCBpbnRlcmZhY2UgU3dhZ2dlck9wdHMge1xuICBwYXRoOiBzdHJpbmc7XG4gIHRpdGxlOiBzdHJpbmc7XG4gIGRlc2NyaXB0aW9uOiBzdHJpbmc7XG4gIHZlcnNpb246IHN0cmluZztcbn1cbiJdfQ==
@@ -0,0 +1,2 @@
1
+ export declare const hasOwnProperty: <T, K extends PropertyKey>(obj: T, prop: K) => obj is T & Record<K, any>;
2
+ //# sourceMappingURL=utils.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"utils.d.ts","sourceRoot":"","sources":["../lib/utils.ts"],"names":[],"mappings":"AAAA,eAAO,MAAM,cAAc,GAAI,CAAC,EAAE,CAAC,SAAS,WAAW,EACrD,KAAK,CAAC,EACN,MAAM,CAAC,KACN,GAAG,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,EAAE,GAAG,CAE1B,CAAC"}
package/dist/utils.js ADDED
@@ -0,0 +1,4 @@
1
+ export const hasOwnProperty = (obj, prop) => {
2
+ return Object.prototype.hasOwnProperty.call(obj, prop);
3
+ };
4
+ //# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidXRpbHMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi9saWIvdXRpbHMudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IkFBQUEsTUFBTSxDQUFDLE1BQU0sY0FBYyxHQUFHLENBQzVCLEdBQU0sRUFDTixJQUFPLEVBQ29CLEVBQUU7SUFDN0IsT0FBTyxNQUFNLENBQUMsU0FBUyxDQUFDLGNBQWMsQ0FBQyxJQUFJLENBQUMsR0FBRyxFQUFFLElBQUksQ0FBQyxDQUFDO0FBQ3pELENBQUMsQ0FBQyIsInNvdXJjZXNDb250ZW50IjpbImV4cG9ydCBjb25zdCBoYXNPd25Qcm9wZXJ0eSA9IDxULCBLIGV4dGVuZHMgUHJvcGVydHlLZXk+KFxuICBvYmo6IFQsXG4gIHByb3A6IEtcbik6IG9iaiBpcyBUICYgUmVjb3JkPEssIGFueT4gPT4ge1xuICByZXR1cm4gT2JqZWN0LnByb3RvdHlwZS5oYXNPd25Qcm9wZXJ0eS5jYWxsKG9iaiwgcHJvcCk7XG59O1xuIl19
package/lib/error.ts ADDED
@@ -0,0 +1,9 @@
1
+ export class ResponseValidationError extends Error {
2
+ public details: Record<string, any>;
3
+
4
+ constructor(validationResult: Record<string, any>) {
5
+ super("Response doesn't match the schema");
6
+ this.name = 'ResponseValidationError';
7
+ this.details = validationResult.error;
8
+ }
9
+ }