nextlove 2.1.4 → 2.1.6

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.mjs ADDED
@@ -0,0 +1,270 @@
1
+ import {
2
+ init_esm_shims
3
+ } from "./chunk-2HL2TLDY.mjs";
4
+
5
+ // src/index.ts
6
+ init_esm_shims();
7
+ export * from "nextjs-exception-middleware";
8
+
9
+ // src/with-route-spec/index.ts
10
+ init_esm_shims();
11
+ import { withExceptionHandling } from "nextjs-exception-middleware";
12
+ import wrappers from "nextjs-middleware-wrappers";
13
+
14
+ // src/with-route-spec/middlewares/with-methods.ts
15
+ init_esm_shims();
16
+ import { MethodNotAllowedException } from "nextjs-exception-middleware";
17
+ var withMethods = (methods) => (next) => (req, res) => {
18
+ if (!methods.includes(req.method)) {
19
+ throw new MethodNotAllowedException({
20
+ type: "method_not_allowed",
21
+ message: `only ${methods.join(",")} accepted`
22
+ });
23
+ }
24
+ return next(req, res);
25
+ };
26
+ var with_methods_default = withMethods;
27
+
28
+ // src/with-route-spec/middlewares/with-validation.ts
29
+ init_esm_shims();
30
+ import { z, ZodFirstPartyTypeKind } from "zod";
31
+ import {
32
+ BadRequestException,
33
+ InternalServerErrorException
34
+ } from "nextjs-exception-middleware";
35
+ import { isEmpty } from "lodash";
36
+ var getZodObjectSchemaFromZodEffectSchema = (isZodEffect, schema) => {
37
+ if (!isZodEffect) {
38
+ return schema;
39
+ }
40
+ let currentSchema = schema;
41
+ while (currentSchema instanceof z.ZodEffects) {
42
+ currentSchema = currentSchema._def.schema;
43
+ }
44
+ return currentSchema;
45
+ };
46
+ var getZodDefFromZodSchemaHelpers = (schema) => {
47
+ const special_zod_types = [
48
+ ZodFirstPartyTypeKind.ZodOptional,
49
+ ZodFirstPartyTypeKind.ZodDefault,
50
+ ZodFirstPartyTypeKind.ZodEffects
51
+ ];
52
+ while (special_zod_types.includes(schema._def.typeName)) {
53
+ if (schema._def.typeName === ZodFirstPartyTypeKind.ZodOptional || schema._def.typeName === ZodFirstPartyTypeKind.ZodDefault) {
54
+ schema = schema._def.innerType;
55
+ continue;
56
+ }
57
+ if (schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects) {
58
+ schema = schema._def.schema;
59
+ continue;
60
+ }
61
+ }
62
+ return schema._def;
63
+ };
64
+ var parseQueryParams = (schema, input) => {
65
+ const parsed_input = Object.assign({}, input);
66
+ const isZodEffect = schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects;
67
+ const safe_schema = getZodObjectSchemaFromZodEffectSchema(isZodEffect, schema);
68
+ const isZodObject = safe_schema._def.typeName === ZodFirstPartyTypeKind.ZodObject;
69
+ if (isZodObject) {
70
+ const obj_schema = safe_schema;
71
+ for (const [key, value] of Object.entries(obj_schema.shape)) {
72
+ const def = getZodDefFromZodSchemaHelpers(value);
73
+ const isArray = def.typeName === ZodFirstPartyTypeKind.ZodArray;
74
+ if (isArray) {
75
+ const array_input = input[key];
76
+ if (typeof array_input === "string") {
77
+ parsed_input[key] = array_input.split(",");
78
+ }
79
+ const bracket_syntax_array_input = input[`${key}[]`];
80
+ if (typeof bracket_syntax_array_input === "string") {
81
+ const pre_split_array = bracket_syntax_array_input;
82
+ parsed_input[key] = pre_split_array.split(",");
83
+ }
84
+ if (Array.isArray(bracket_syntax_array_input)) {
85
+ parsed_input[key] = bracket_syntax_array_input;
86
+ }
87
+ continue;
88
+ }
89
+ const isBoolean = def.typeName === ZodFirstPartyTypeKind.ZodBoolean;
90
+ if (isBoolean) {
91
+ const boolean_input = input[key];
92
+ if (typeof boolean_input === "string") {
93
+ parsed_input[key] = boolean_input === "true";
94
+ }
95
+ }
96
+ }
97
+ }
98
+ return schema.parse(parsed_input);
99
+ };
100
+ var zodIssueToString = (issue) => {
101
+ if (issue.path.join(".") === "") {
102
+ return issue.message;
103
+ }
104
+ if (issue.message === "Required") {
105
+ return `${issue.path.join(".")} is required`;
106
+ }
107
+ return `${issue.message} for "${issue.path.join(".")}"`;
108
+ };
109
+ function validateJsonResponse(jsonResponse, res) {
110
+ const original_res_json = res.json;
111
+ const override_res_json = (json) => {
112
+ const is_success = res.statusCode >= 200 && res.statusCode < 300;
113
+ if (!is_success) {
114
+ return original_res_json(json);
115
+ }
116
+ try {
117
+ jsonResponse == null ? void 0 : jsonResponse.parse(json);
118
+ } catch (err) {
119
+ throw new InternalServerErrorException({
120
+ type: "invalid_response",
121
+ message: "the response does not match with jsonResponse",
122
+ zodError: err
123
+ });
124
+ }
125
+ return original_res_json(json);
126
+ };
127
+ res.json = override_res_json;
128
+ }
129
+ var withValidation = (input) => (next) => async (req, res) => {
130
+ var _a, _b, _c, _d;
131
+ if (input.formData && input.jsonBody || input.formData && input.commonParams) {
132
+ throw new Error("Cannot use formData with jsonBody or commonParams");
133
+ }
134
+ if ((req.method === "POST" || req.method === "PATCH") && (input.jsonBody || input.commonParams) && !((_a = req.headers["content-type"]) == null ? void 0 : _a.includes("application/json")) && !isEmpty(req.body)) {
135
+ throw new BadRequestException({
136
+ type: "invalid_content_type",
137
+ message: `${req.method} requests must have Content-Type header with "application/json"`
138
+ });
139
+ }
140
+ if (input.formData && req.method !== "GET" && !((_b = req.headers["content-type"]) == null ? void 0 : _b.includes(
141
+ "application/x-www-form-urlencoded"
142
+ ))) {
143
+ throw new BadRequestException({
144
+ type: "invalid_content_type",
145
+ message: `Must have Content-Type header with "application/x-www-form-urlencoded"`
146
+ });
147
+ }
148
+ try {
149
+ const original_combined_params = { ...req.query, ...req.body };
150
+ const willValidateRequestBody = input.shouldValidateGetRequestBody ? true : req.method !== "GET";
151
+ const isFormData = Boolean(input.formData);
152
+ if (isFormData && willValidateRequestBody) {
153
+ req.body = (_c = input.formData) == null ? void 0 : _c.parse(req.body);
154
+ }
155
+ if (!isFormData && willValidateRequestBody) {
156
+ req.body = (_d = input.jsonBody) == null ? void 0 : _d.parse(req.body);
157
+ }
158
+ if (input.queryParams) {
159
+ req.query = parseQueryParams(input.queryParams, req.query);
160
+ }
161
+ if (input.commonParams) {
162
+ ;
163
+ req.commonParams = parseQueryParams(
164
+ input.commonParams,
165
+ original_combined_params
166
+ );
167
+ }
168
+ } catch (error) {
169
+ if (error.name === "ZodError") {
170
+ let message;
171
+ if (error.issues.length === 1) {
172
+ const issue = error.issues[0];
173
+ message = zodIssueToString(issue);
174
+ } else {
175
+ const message_components = [];
176
+ for (const issue of error.issues) {
177
+ message_components.push(zodIssueToString(issue));
178
+ }
179
+ message = `${error.issues.length} Input Errors: ` + message_components.join(", ");
180
+ }
181
+ throw new BadRequestException({
182
+ type: "invalid_input",
183
+ message,
184
+ validation_errors: error.format()
185
+ });
186
+ }
187
+ throw new BadRequestException({
188
+ type: "invalid_input",
189
+ message: "Error while parsing input"
190
+ });
191
+ }
192
+ if (input.shouldValidateResponses) {
193
+ validateJsonResponse(input.jsonResponse, res);
194
+ }
195
+ return next(req, res);
196
+ };
197
+ var with_validation_default = withValidation;
198
+
199
+ // src/with-route-spec/index.ts
200
+ import { z as z2 } from "zod";
201
+ var checkRouteSpec = (spec) => spec;
202
+ var createWithRouteSpec = (setupParams) => {
203
+ const {
204
+ authMiddlewareMap = {},
205
+ globalMiddlewares = [],
206
+ shouldValidateResponses,
207
+ shouldValidateGetRequestBody = true,
208
+ exceptionHandlingMiddleware = withExceptionHandling({
209
+ addOkStatus: setupParams.addOkStatus,
210
+ exceptionHandlingOptions: {
211
+ getErrorContext: (req, error) => {
212
+ if (process.env.NODE_ENV === "production") {
213
+ return {};
214
+ }
215
+ return error;
216
+ }
217
+ }
218
+ }),
219
+ globalSchemas = setupParams.addOkStatus ? {
220
+ ok: z2.boolean()
221
+ } : {}
222
+ } = setupParams;
223
+ const withRouteSpec = (spec) => {
224
+ const createRouteExport = (userDefinedRouteFn) => {
225
+ const rootRequestHandler = async (req, res) => {
226
+ authMiddlewareMap["none"] = (next) => next;
227
+ const auth_middleware = authMiddlewareMap[spec.auth];
228
+ if (!auth_middleware)
229
+ throw new Error(`Unknown auth type: ${spec.auth}`);
230
+ return wrappers(
231
+ ...exceptionHandlingMiddleware ? [exceptionHandlingMiddleware] : [],
232
+ ...globalMiddlewares || [],
233
+ auth_middleware,
234
+ ...spec.middlewares || [],
235
+ with_methods_default(spec.methods),
236
+ with_validation_default({
237
+ jsonBody: spec.jsonBody,
238
+ queryParams: spec.queryParams,
239
+ commonParams: spec.commonParams,
240
+ formData: spec.formData,
241
+ jsonResponse: spec.jsonResponse,
242
+ shouldValidateResponses,
243
+ shouldValidateGetRequestBody
244
+ }),
245
+ userDefinedRouteFn
246
+ )(req, res);
247
+ };
248
+ rootRequestHandler._setupParams = setupParams;
249
+ rootRequestHandler._routeSpec = spec;
250
+ return rootRequestHandler;
251
+ };
252
+ createRouteExport._setupParams = setupParams;
253
+ createRouteExport._routeSpec = spec;
254
+ return createRouteExport;
255
+ };
256
+ withRouteSpec._setupParams = setupParams;
257
+ return withRouteSpec;
258
+ };
259
+
260
+ // src/index.ts
261
+ import { wrappers as wrappers2 } from "nextjs-middleware-wrappers";
262
+
263
+ // src/types/index.ts
264
+ init_esm_shims();
265
+ export {
266
+ checkRouteSpec,
267
+ createWithRouteSpec,
268
+ wrappers2 as wrappers
269
+ };
270
+ //# sourceMappingURL=data:application/json;base64,ewogICJ2ZXJzaW9uIjogMywKICAic291cmNlcyI6IFsiLi4vc3JjL2luZGV4LnRzIiwgIi4uL3NyYy93aXRoLXJvdXRlLXNwZWMvaW5kZXgudHMiLCAiLi4vc3JjL3dpdGgtcm91dGUtc3BlYy9taWRkbGV3YXJlcy93aXRoLW1ldGhvZHMudHMiLCAiLi4vc3JjL3dpdGgtcm91dGUtc3BlYy9taWRkbGV3YXJlcy93aXRoLXZhbGlkYXRpb24udHMiLCAiLi4vc3JjL3R5cGVzL2luZGV4LnRzIl0sCiAgInNvdXJjZXNDb250ZW50IjogWyJleHBvcnQgKiBmcm9tIFwibmV4dGpzLWV4Y2VwdGlvbi1taWRkbGV3YXJlXCJcbmV4cG9ydCAqIGZyb20gXCIuL3dpdGgtcm91dGUtc3BlY1wiXG5leHBvcnQgeyB3cmFwcGVycyB9IGZyb20gXCJuZXh0anMtbWlkZGxld2FyZS13cmFwcGVyc1wiXG5leHBvcnQgKiBmcm9tIFwiLi90eXBlc1wiXG4iLCAiaW1wb3J0IHsgTmV4dEFwaVJlc3BvbnNlLCBOZXh0QXBpUmVxdWVzdCB9IGZyb20gXCJuZXh0XCJcbmltcG9ydCB7IHdpdGhFeGNlcHRpb25IYW5kbGluZyB9IGZyb20gXCJuZXh0anMtZXhjZXB0aW9uLW1pZGRsZXdhcmVcIlxuaW1wb3J0IHdyYXBwZXJzLCB7IE1pZGRsZXdhcmUgfSBmcm9tIFwibmV4dGpzLW1pZGRsZXdhcmUtd3JhcHBlcnNcIlxuaW1wb3J0IHsgQ3JlYXRlV2l0aFJvdXRlU3BlY0Z1bmN0aW9uLCBSb3V0ZVNwZWMgfSBmcm9tIFwiLi4vdHlwZXNcIlxuaW1wb3J0IHdpdGhNZXRob2RzLCB7IEhUVFBNZXRob2RzIH0gZnJvbSBcIi4vbWlkZGxld2FyZXMvd2l0aC1tZXRob2RzXCJcbmltcG9ydCB3aXRoVmFsaWRhdGlvbiBmcm9tIFwiLi9taWRkbGV3YXJlcy93aXRoLXZhbGlkYXRpb25cIlxuaW1wb3J0IHsgeiB9IGZyb20gXCJ6b2RcIlxuXG50eXBlIFBhcmFtRGVmID0gei5ab2RUeXBlQW55IHwgei5ab2RFZmZlY3RzPHouWm9kVHlwZUFueT5cblxuZXhwb3J0IGNvbnN0IGNoZWNrUm91dGVTcGVjID0gPFxuICBBdXRoVHlwZSBleHRlbmRzIHN0cmluZyA9IHN0cmluZyxcbiAgTWV0aG9kcyBleHRlbmRzIEhUVFBNZXRob2RzW10gPSBIVFRQTWV0aG9kc1tdLFxuICBKc29uQm9keSBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55LFxuICBRdWVyeVBhcmFtcyBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55LFxuICBDb21tb25QYXJhbXMgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kVHlwZUFueSxcbiAgTWlkZGxld2FyZXMgZXh0ZW5kcyByZWFkb25seSBNaWRkbGV3YXJlPGFueSwgYW55PltdID0gcmVhZG9ubHkgTWlkZGxld2FyZTxcbiAgICBhbnksXG4gICAgYW55XG4gID5bXSxcbiAgRm9ybURhdGEgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kVHlwZUFueSxcbiAgU3BlYyBleHRlbmRzIFJvdXRlU3BlYzxcbiAgICBBdXRoVHlwZSxcbiAgICBNZXRob2RzLFxuICAgIEpzb25Cb2R5LFxuICAgIFF1ZXJ5UGFyYW1zLFxuICAgIENvbW1vblBhcmFtcyxcbiAgICBNaWRkbGV3YXJlcyxcbiAgICBGb3JtRGF0YVxuICA+ID0gUm91dGVTcGVjPFxuICAgIEF1dGhUeXBlLFxuICAgIE1ldGhvZHMsXG4gICAgSnNvbkJvZHksXG4gICAgUXVlcnlQYXJhbXMsXG4gICAgQ29tbW9uUGFyYW1zLFxuICAgIE1pZGRsZXdhcmVzLFxuICAgIEZvcm1EYXRhXG4gID5cbj4oXG4gIHNwZWM6IFNwZWNcbik6IHN0cmluZyBleHRlbmRzIFNwZWNbXCJhdXRoXCJdXG4gID8gYHlvdXIgcm91dGUgc3BlYyBpcyB1bmRlcnNwZWNpZmllZCwgYWRkIFwiYXMgY29uc3RcImBcbiAgOiBTcGVjID0+IHNwZWMgYXMgYW55XG5cbmV4cG9ydCBjb25zdCBjcmVhdGVXaXRoUm91dGVTcGVjOiBDcmVhdGVXaXRoUm91dGVTcGVjRnVuY3Rpb24gPSAoKFxuICBzZXR1cFBhcmFtc1xuKSA9PiB7XG4gIGNvbnN0IHtcbiAgICBhdXRoTWlkZGxld2FyZU1hcCA9IHt9LFxuICAgIGdsb2JhbE1pZGRsZXdhcmVzID0gW10sXG4gICAgc2hvdWxkVmFsaWRhdGVSZXNwb25zZXMsXG4gICAgc2hvdWxkVmFsaWRhdGVHZXRSZXF1ZXN0Qm9keSA9IHRydWUsXG4gICAgZXhjZXB0aW9uSGFuZGxpbmdNaWRkbGV3YXJlID0gd2l0aEV4Y2VwdGlvbkhhbmRsaW5nKHtcbiAgICAgIGFkZE9rU3RhdHVzOiBzZXR1cFBhcmFtcy5hZGRPa1N0YXR1cyxcbiAgICAgIGV4Y2VwdGlvbkhhbmRsaW5nT3B0aW9uczoge1xuICAgICAgICBnZXRFcnJvckNvbnRleHQ6IChyZXEsIGVycm9yKSA9PiB7XG4gICAgICAgICAgaWYgKHByb2Nlc3MuZW52Lk5PREVfRU5WID09PSBcInByb2R1Y3Rpb25cIikge1xuICAgICAgICAgICAgcmV0dXJuIHt9XG4gICAgICAgICAgfVxuXG4gICAgICAgICAgcmV0dXJuIGVycm9yXG4gICAgICAgIH0sXG4gICAgICB9LFxuICAgIH0pIGFzIGFueSxcbiAgICBnbG9iYWxTY2hlbWFzID0gc2V0dXBQYXJhbXMuYWRkT2tTdGF0dXNcbiAgICAgID8ge1xuICAgICAgICAgIG9rOiB6LmJvb2xlYW4oKSxcbiAgICAgICAgfVxuICAgICAgOiB7fSxcbiAgfSA9IHNldHVwUGFyYW1zXG5cbiAgY29uc3Qgd2l0aFJvdXRlU3BlYyA9IChzcGVjOiBSb3V0ZVNwZWMpID0+IHtcbiAgICBjb25zdCBjcmVhdGVSb3V0ZUV4cG9ydCA9ICh1c2VyRGVmaW5lZFJvdXRlRm4pID0+IHtcbiAgICAgIGNvbnN0IHJvb3RSZXF1ZXN0SGFuZGxlciA9IGFzeW5jIChcbiAgICAgICAgcmVxOiBOZXh0QXBpUmVxdWVzdCxcbiAgICAgICAgcmVzOiBOZXh0QXBpUmVzcG9uc2VcbiAgICAgICkgPT4ge1xuICAgICAgICBhdXRoTWlkZGxld2FyZU1hcFtcIm5vbmVcIl0gPSAobmV4dCkgPT4gbmV4dFxuXG4gICAgICAgIGNvbnN0IGF1dGhfbWlkZGxld2FyZSA9IGF1dGhNaWRkbGV3YXJlTWFwW3NwZWMuYXV0aF1cbiAgICAgICAgaWYgKCFhdXRoX21pZGRsZXdhcmUpIHRocm93IG5ldyBFcnJvcihgVW5rbm93biBhdXRoIHR5cGU6ICR7c3BlYy5hdXRofWApXG5cbiAgICAgICAgcmV0dXJuIHdyYXBwZXJzKFxuICAgICAgICAgIC4uLigoZXhjZXB0aW9uSGFuZGxpbmdNaWRkbGV3YXJlXG4gICAgICAgICAgICA/IFtleGNlcHRpb25IYW5kbGluZ01pZGRsZXdhcmVdXG4gICAgICAgICAgICA6IFtdKSBhcyBbYW55XSksXG4gICAgICAgICAgLi4uKChnbG9iYWxNaWRkbGV3YXJlcyB8fCBbXSkgYXMgW10pLFxuICAgICAgICAgIGF1dGhfbWlkZGxld2FyZSxcbiAgICAgICAgICAuLi4oKHNwZWMubWlkZGxld2FyZXMgfHwgW10pIGFzIFtdKSxcbiAgICAgICAgICB3aXRoTWV0aG9kcyhzcGVjLm1ldGhvZHMpLFxuICAgICAgICAgIHdpdGhWYWxpZGF0aW9uKHtcbiAgICAgICAgICAgIGpzb25Cb2R5OiBzcGVjLmpzb25Cb2R5LFxuICAgICAgICAgICAgcXVlcnlQYXJhbXM6IHNwZWMucXVlcnlQYXJhbXMsXG4gICAgICAgICAgICBjb21tb25QYXJhbXM6IHNwZWMuY29tbW9uUGFyYW1zLFxuICAgICAgICAgICAgZm9ybURhdGE6IHNwZWMuZm9ybURhdGEsXG4gICAgICAgICAgICBqc29uUmVzcG9uc2U6IHNwZWMuanNvblJlc3BvbnNlLFxuICAgICAgICAgICAgc2hvdWxkVmFsaWRhdGVSZXNwb25zZXMsXG4gICAgICAgICAgICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5LFxuICAgICAgICAgIH0pLFxuICAgICAgICAgIHVzZXJEZWZpbmVkUm91dGVGblxuICAgICAgICApKHJlcSBhcyBhbnksIHJlcylcbiAgICAgIH1cblxuICAgICAgcm9vdFJlcXVlc3RIYW5kbGVyLl9zZXR1cFBhcmFtcyA9IHNldHVwUGFyYW1zXG4gICAgICByb290UmVxdWVzdEhhbmRsZXIuX3JvdXRlU3BlYyA9IHNwZWNcblxuICAgICAgcmV0dXJuIHJvb3RSZXF1ZXN0SGFuZGxlclxuICAgIH1cblxuICAgIGNyZWF0ZVJvdXRlRXhwb3J0Ll9zZXR1cFBhcmFtcyA9IHNldHVwUGFyYW1zXG4gICAgY3JlYXRlUm91dGVFeHBvcnQuX3JvdXRlU3BlYyA9IHNwZWNcblxuICAgIHJldHVybiBjcmVhdGVSb3V0ZUV4cG9ydFxuICB9XG5cbiAgd2l0aFJvdXRlU3BlYy5fc2V0dXBQYXJhbXMgPSBzZXR1cFBhcmFtc1xuXG4gIHJldHVybiB3aXRoUm91dGVTcGVjXG59KSBhcyBhbnlcbiIsICJpbXBvcnQgeyBNZXRob2ROb3RBbGxvd2VkRXhjZXB0aW9uIH0gZnJvbSBcIm5leHRqcy1leGNlcHRpb24tbWlkZGxld2FyZVwiXG5cbmV4cG9ydCB0eXBlIEhUVFBNZXRob2RzID1cbiAgfCBcIkdFVFwiXG4gIHwgXCJQT1NUXCJcbiAgfCBcIkRFTEVURVwiXG4gIHwgXCJQVVRcIlxuICB8IFwiUEFUQ0hcIlxuICB8IFwiSEVBRFwiXG4gIHwgXCJPUFRJT05TXCJcblxuZXhwb3J0IGNvbnN0IHdpdGhNZXRob2RzID0gKG1ldGhvZHM6IEhUVFBNZXRob2RzW10pID0+IChuZXh0KSA9PiAocmVxLCByZXMpID0+IHtcbiAgaWYgKCFtZXRob2RzLmluY2x1ZGVzKHJlcS5tZXRob2QpKSB7XG4gICAgdGhyb3cgbmV3IE1ldGhvZE5vdEFsbG93ZWRFeGNlcHRpb24oe1xuICAgICAgdHlwZTogXCJtZXRob2Rfbm90X2FsbG93ZWRcIixcbiAgICAgIG1lc3NhZ2U6IGBvbmx5ICR7bWV0aG9kcy5qb2luKFwiLFwiKX0gYWNjZXB0ZWRgLFxuICAgIH0pXG4gIH1cbiAgcmV0dXJuIG5leHQocmVxLCByZXMpXG59XG5cbmV4cG9ydCBkZWZhdWx0IHdpdGhNZXRob2RzXG4iLCAiaW1wb3J0IHR5cGUgeyBOZXh0QXBpUmVxdWVzdCwgTmV4dEFwaVJlc3BvbnNlIH0gZnJvbSBcIm5leHRcIlxuaW1wb3J0IHsgeiwgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kIH0gZnJvbSBcInpvZFwiXG5pbXBvcnQge1xuICBCYWRSZXF1ZXN0RXhjZXB0aW9uLFxuICBJbnRlcm5hbFNlcnZlckVycm9yRXhjZXB0aW9uLFxufSBmcm9tIFwibmV4dGpzLWV4Y2VwdGlvbi1taWRkbGV3YXJlXCJcbmltcG9ydCB7IGlzRW1wdHkgfSBmcm9tIFwibG9kYXNoXCJcblxuY29uc3QgZ2V0Wm9kT2JqZWN0U2NoZW1hRnJvbVpvZEVmZmVjdFNjaGVtYSA9IChcbiAgaXNab2RFZmZlY3Q6IGJvb2xlYW4sXG4gIHNjaGVtYTogei5ab2RUeXBlQW55XG4pOiB6LlpvZFR5cGVBbnkgfCB6LlpvZE9iamVjdDxhbnk+ID0+IHtcbiAgaWYgKCFpc1pvZEVmZmVjdCkge1xuICAgIHJldHVybiBzY2hlbWEgYXMgei5ab2RPYmplY3Q8YW55PlxuICB9XG5cbiAgbGV0IGN1cnJlbnRTY2hlbWEgPSBzY2hlbWFcblxuICB3aGlsZSAoY3VycmVudFNjaGVtYSBpbnN0YW5jZW9mIHouWm9kRWZmZWN0cykge1xuICAgIGN1cnJlbnRTY2hlbWEgPSBjdXJyZW50U2NoZW1hLl9kZWYuc2NoZW1hXG4gIH1cblxuICByZXR1cm4gY3VycmVudFNjaGVtYSBhcyB6LlpvZE9iamVjdDxhbnk+XG59XG5cbi8qKlxuICogVGhpcyBmdW5jdGlvbiBpcyB1c2VkIHRvIGdldCB0aGUgY29ycmVjdCBzY2hlbWEgZnJvbSBhIFpvZEVmZmVjdCB8IFpvZERlZmF1bHQgfCBab2RPcHRpb25hbCBzY2hlbWEuXG4gKiBUT0RPOiB0aGlzIGZ1bmN0aW9uIHNob3VsZCBoYW5kbGUgYWxsIHNwZWNpYWwgY2FzZXMgb2YgWm9kU2NoZW1hIGFuZCBub3QganVzdCBab2RFZmZlY3QgfCBab2REZWZhdWx0IHwgWm9kT3B0aW9uYWxcbiAqL1xuY29uc3QgZ2V0Wm9kRGVmRnJvbVpvZFNjaGVtYUhlbHBlcnMgPSAoc2NoZW1hOiB6LlpvZFR5cGVBbnkpID0+IHtcbiAgY29uc3Qgc3BlY2lhbF96b2RfdHlwZXMgPSBbXG4gICAgWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZE9wdGlvbmFsLFxuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2REZWZhdWx0LFxuICAgIFpvZEZpcnN0UGFydHlUeXBlS2luZC5ab2RFZmZlY3RzLFxuICBdXG5cbiAgd2hpbGUgKHNwZWNpYWxfem9kX3R5cGVzLmluY2x1ZGVzKHNjaGVtYS5fZGVmLnR5cGVOYW1lKSkge1xuICAgIGlmIChcbiAgICAgIHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT3B0aW9uYWwgfHxcbiAgICAgIHNjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kRGVmYXVsdFxuICAgICkge1xuICAgICAgc2NoZW1hID0gc2NoZW1hLl9kZWYuaW5uZXJUeXBlXG4gICAgICBjb250aW51ZVxuICAgIH1cblxuICAgIGlmIChzY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHMpIHtcbiAgICAgIHNjaGVtYSA9IHNjaGVtYS5fZGVmLnNjaGVtYVxuICAgICAgY29udGludWVcbiAgICB9XG4gIH1cbiAgcmV0dXJuIHNjaGVtYS5fZGVmXG59XG5cbmNvbnN0IHBhcnNlUXVlcnlQYXJhbXMgPSAoXG4gIHNjaGVtYTogei5ab2RUeXBlQW55LFxuICBpbnB1dDogUmVjb3JkPHN0cmluZywgdW5rbm93bj5cbikgPT4ge1xuICBjb25zdCBwYXJzZWRfaW5wdXQgPSBPYmplY3QuYXNzaWduKHt9LCBpbnB1dClcbiAgY29uc3QgaXNab2RFZmZlY3QgPSBzY2hlbWEuX2RlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEVmZmVjdHNcbiAgY29uc3Qgc2FmZV9zY2hlbWEgPSBnZXRab2RPYmplY3RTY2hlbWFGcm9tWm9kRWZmZWN0U2NoZW1hKGlzWm9kRWZmZWN0LCBzY2hlbWEpXG4gIGNvbnN0IGlzWm9kT2JqZWN0ID1cbiAgICBzYWZlX3NjaGVtYS5fZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kT2JqZWN0XG5cbiAgaWYgKGlzWm9kT2JqZWN0KSB7XG4gICAgY29uc3Qgb2JqX3NjaGVtYSA9IHNhZmVfc2NoZW1hIGFzIHouWm9kT2JqZWN0PGFueT5cblxuICAgIGZvciAoY29uc3QgW2tleSwgdmFsdWVdIG9mIE9iamVjdC5lbnRyaWVzKG9ial9zY2hlbWEuc2hhcGUpKSB7XG4gICAgICBjb25zdCBkZWYgPSBnZXRab2REZWZGcm9tWm9kU2NoZW1hSGVscGVycyh2YWx1ZSBhcyB6LlpvZFR5cGVBbnkpXG4gICAgICBjb25zdCBpc0FycmF5ID0gZGVmLnR5cGVOYW1lID09PSBab2RGaXJzdFBhcnR5VHlwZUtpbmQuWm9kQXJyYXlcbiAgICAgIGlmIChpc0FycmF5KSB7XG4gICAgICAgIGNvbnN0IGFycmF5X2lucHV0ID0gaW5wdXRba2V5XVxuXG4gICAgICAgIGlmICh0eXBlb2YgYXJyYXlfaW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBwYXJzZWRfaW5wdXRba2V5XSA9IGFycmF5X2lucHV0LnNwbGl0KFwiLFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgY29uc3QgYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXQgPSBpbnB1dFtgJHtrZXl9W11gXVxuICAgICAgICBpZiAodHlwZW9mIGJyYWNrZXRfc3ludGF4X2FycmF5X2lucHV0ID09PSBcInN0cmluZ1wiKSB7XG4gICAgICAgICAgY29uc3QgcHJlX3NwbGl0X2FycmF5ID0gYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXRcbiAgICAgICAgICBwYXJzZWRfaW5wdXRba2V5XSA9IHByZV9zcGxpdF9hcnJheS5zcGxpdChcIixcIilcbiAgICAgICAgfVxuXG4gICAgICAgIGlmIChBcnJheS5pc0FycmF5KGJyYWNrZXRfc3ludGF4X2FycmF5X2lucHV0KSkge1xuICAgICAgICAgIHBhcnNlZF9pbnB1dFtrZXldID0gYnJhY2tldF9zeW50YXhfYXJyYXlfaW5wdXRcbiAgICAgICAgfVxuXG4gICAgICAgIGNvbnRpbnVlXG4gICAgICB9XG5cbiAgICAgIGNvbnN0IGlzQm9vbGVhbiA9IGRlZi50eXBlTmFtZSA9PT0gWm9kRmlyc3RQYXJ0eVR5cGVLaW5kLlpvZEJvb2xlYW5cbiAgICAgIGlmIChpc0Jvb2xlYW4pIHtcbiAgICAgICAgY29uc3QgYm9vbGVhbl9pbnB1dCA9IGlucHV0W2tleV1cblxuICAgICAgICBpZiAodHlwZW9mIGJvb2xlYW5faW5wdXQgPT09IFwic3RyaW5nXCIpIHtcbiAgICAgICAgICBwYXJzZWRfaW5wdXRba2V5XSA9IGJvb2xlYW5faW5wdXQgPT09IFwidHJ1ZVwiXG4gICAgICAgIH1cbiAgICAgIH1cbiAgICB9XG4gIH1cblxuICByZXR1cm4gc2NoZW1hLnBhcnNlKHBhcnNlZF9pbnB1dClcbn1cblxuZXhwb3J0IGludGVyZmFjZSBSZXF1ZXN0SW5wdXQ8XG4gIEpzb25Cb2R5IGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBRdWVyeVBhcmFtcyBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgQ29tbW9uUGFyYW1zIGV4dGVuZHMgei5ab2RUeXBlQW55LFxuICBGb3JtRGF0YSBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgSnNvblJlc3BvbnNlIGV4dGVuZHMgei5ab2RUeXBlQW55XG4+IHtcbiAganNvbkJvZHk/OiBKc29uQm9keVxuICBxdWVyeVBhcmFtcz86IFF1ZXJ5UGFyYW1zXG4gIGNvbW1vblBhcmFtcz86IENvbW1vblBhcmFtc1xuICBmb3JtRGF0YT86IEZvcm1EYXRhXG4gIGpzb25SZXNwb25zZT86IEpzb25SZXNwb25zZVxuICBzaG91bGRWYWxpZGF0ZVJlc3BvbnNlcz86IGJvb2xlYW5cbiAgc2hvdWxkVmFsaWRhdGVHZXRSZXF1ZXN0Qm9keT86IGJvb2xlYW5cbn1cblxuY29uc3Qgem9kSXNzdWVUb1N0cmluZyA9IChpc3N1ZTogei5ab2RJc3N1ZSkgPT4ge1xuICBpZiAoaXNzdWUucGF0aC5qb2luKFwiLlwiKSA9PT0gXCJcIikge1xuICAgIHJldHVybiBpc3N1ZS5tZXNzYWdlXG4gIH1cbiAgaWYgKGlzc3VlLm1lc3NhZ2UgPT09IFwiUmVxdWlyZWRcIikge1xuICAgIHJldHVybiBgJHtpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpfSBpcyByZXF1aXJlZGBcbiAgfVxuICByZXR1cm4gYCR7aXNzdWUubWVzc2FnZX0gZm9yIFwiJHtpc3N1ZS5wYXRoLmpvaW4oXCIuXCIpfVwiYFxufVxuXG5mdW5jdGlvbiB2YWxpZGF0ZUpzb25SZXNwb25zZTxKc29uUmVzcG9uc2UgZXh0ZW5kcyB6LlpvZFR5cGVBbnk+KFxuICBqc29uUmVzcG9uc2U6IEpzb25SZXNwb25zZSB8IHVuZGVmaW5lZCxcbiAgcmVzOiBOZXh0QXBpUmVzcG9uc2Vcbikge1xuICBjb25zdCBvcmlnaW5hbF9yZXNfanNvbiA9IHJlcy5qc29uXG4gIGNvbnN0IG92ZXJyaWRlX3Jlc19qc29uID0gKGpzb246IGFueSkgPT4ge1xuICAgIGNvbnN0IGlzX3N1Y2Nlc3MgPSByZXMuc3RhdHVzQ29kZSA+PSAyMDAgJiYgcmVzLnN0YXR1c0NvZGUgPCAzMDBcbiAgICBpZiAoIWlzX3N1Y2Nlc3MpIHtcbiAgICAgIHJldHVybiBvcmlnaW5hbF9yZXNfanNvbihqc29uKVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBqc29uUmVzcG9uc2U/LnBhcnNlKGpzb24pXG4gICAgfSBjYXRjaCAoZXJyKSB7XG4gICAgICB0aHJvdyBuZXcgSW50ZXJuYWxTZXJ2ZXJFcnJvckV4Y2VwdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW52YWxpZF9yZXNwb25zZVwiLFxuICAgICAgICBtZXNzYWdlOiBcInRoZSByZXNwb25zZSBkb2VzIG5vdCBtYXRjaCB3aXRoIGpzb25SZXNwb25zZVwiLFxuICAgICAgICB6b2RFcnJvcjogZXJyLFxuICAgICAgfSlcbiAgICB9XG5cbiAgICByZXR1cm4gb3JpZ2luYWxfcmVzX2pzb24oanNvbilcbiAgfVxuICByZXMuanNvbiA9IG92ZXJyaWRlX3Jlc19qc29uXG59XG5cbmV4cG9ydCBjb25zdCB3aXRoVmFsaWRhdGlvbiA9XG4gIDxcbiAgICBKc29uQm9keSBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBRdWVyeVBhcmFtcyBleHRlbmRzIHouWm9kVHlwZUFueSxcbiAgICBDb21tb25QYXJhbXMgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gICAgRm9ybURhdGEgZXh0ZW5kcyB6LlpvZFR5cGVBbnksXG4gICAgSnNvblJlc3BvbnNlIGV4dGVuZHMgei5ab2RUeXBlQW55XG4gID4oXG4gICAgaW5wdXQ6IFJlcXVlc3RJbnB1dDxcbiAgICAgIEpzb25Cb2R5LFxuICAgICAgUXVlcnlQYXJhbXMsXG4gICAgICBDb21tb25QYXJhbXMsXG4gICAgICBGb3JtRGF0YSxcbiAgICAgIEpzb25SZXNwb25zZVxuICAgID5cbiAgKSA9PlxuICAobmV4dCkgPT5cbiAgYXN5bmMgKHJlcTogTmV4dEFwaVJlcXVlc3QsIHJlczogTmV4dEFwaVJlc3BvbnNlKSA9PiB7XG4gICAgaWYgKFxuICAgICAgKGlucHV0LmZvcm1EYXRhICYmIGlucHV0Lmpzb25Cb2R5KSB8fFxuICAgICAgKGlucHV0LmZvcm1EYXRhICYmIGlucHV0LmNvbW1vblBhcmFtcylcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBFcnJvcihcIkNhbm5vdCB1c2UgZm9ybURhdGEgd2l0aCBqc29uQm9keSBvciBjb21tb25QYXJhbXNcIilcbiAgICB9XG5cbiAgICBpZiAoXG4gICAgICAocmVxLm1ldGhvZCA9PT0gXCJQT1NUXCIgfHwgcmVxLm1ldGhvZCA9PT0gXCJQQVRDSFwiKSAmJlxuICAgICAgKGlucHV0Lmpzb25Cb2R5IHx8IGlucHV0LmNvbW1vblBhcmFtcykgJiZcbiAgICAgICFyZXEuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXT8uaW5jbHVkZXMoXCJhcHBsaWNhdGlvbi9qc29uXCIpICYmXG4gICAgICAhaXNFbXB0eShyZXEuYm9keSlcbiAgICApIHtcbiAgICAgIHRocm93IG5ldyBCYWRSZXF1ZXN0RXhjZXB0aW9uKHtcbiAgICAgICAgdHlwZTogXCJpbnZhbGlkX2NvbnRlbnRfdHlwZVwiLFxuICAgICAgICBtZXNzYWdlOiBgJHtyZXEubWV0aG9kfSByZXF1ZXN0cyBtdXN0IGhhdmUgQ29udGVudC1UeXBlIGhlYWRlciB3aXRoIFwiYXBwbGljYXRpb24vanNvblwiYCxcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgaWYgKFxuICAgICAgaW5wdXQuZm9ybURhdGEgJiZcbiAgICAgIHJlcS5tZXRob2QgIT09IFwiR0VUXCIgJiZcbiAgICAgICFyZXEuaGVhZGVyc1tcImNvbnRlbnQtdHlwZVwiXT8uaW5jbHVkZXMoXG4gICAgICAgIFwiYXBwbGljYXRpb24veC13d3ctZm9ybS11cmxlbmNvZGVkXCJcbiAgICAgIClcbiAgICAgIC8vIFRPRE8gZXZlbnR1YWxseSB3ZSBzaG91bGQgc3VwcG9ydCBtdWx0aXBhcnQvZm9ybS1kYXRhXG4gICAgKSB7XG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW52YWxpZF9jb250ZW50X3R5cGVcIixcbiAgICAgICAgbWVzc2FnZTogYE11c3QgaGF2ZSBDb250ZW50LVR5cGUgaGVhZGVyIHdpdGggXCJhcHBsaWNhdGlvbi94LXd3dy1mb3JtLXVybGVuY29kZWRcImAsXG4gICAgICB9KVxuICAgIH1cblxuICAgIHRyeSB7XG4gICAgICBjb25zdCBvcmlnaW5hbF9jb21iaW5lZF9wYXJhbXMgPSB7IC4uLnJlcS5xdWVyeSwgLi4ucmVxLmJvZHkgfVxuXG4gICAgICBjb25zdCB3aWxsVmFsaWRhdGVSZXF1ZXN0Qm9keSA9IGlucHV0LnNob3VsZFZhbGlkYXRlR2V0UmVxdWVzdEJvZHlcbiAgICAgICAgPyB0cnVlXG4gICAgICAgIDogcmVxLm1ldGhvZCAhPT0gXCJHRVRcIlxuXG4gICAgICBjb25zdCBpc0Zvcm1EYXRhID0gQm9vbGVhbihpbnB1dC5mb3JtRGF0YSlcblxuICAgICAgaWYgKGlzRm9ybURhdGEgJiYgd2lsbFZhbGlkYXRlUmVxdWVzdEJvZHkpIHtcbiAgICAgICAgcmVxLmJvZHkgPSBpbnB1dC5mb3JtRGF0YT8ucGFyc2UocmVxLmJvZHkpXG4gICAgICB9XG5cbiAgICAgIGlmICghaXNGb3JtRGF0YSAmJiB3aWxsVmFsaWRhdGVSZXF1ZXN0Qm9keSkge1xuICAgICAgICByZXEuYm9keSA9IGlucHV0Lmpzb25Cb2R5Py5wYXJzZShyZXEuYm9keSlcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0LnF1ZXJ5UGFyYW1zKSB7XG4gICAgICAgIHJlcS5xdWVyeSA9IHBhcnNlUXVlcnlQYXJhbXMoaW5wdXQucXVlcnlQYXJhbXMsIHJlcS5xdWVyeSlcbiAgICAgIH1cblxuICAgICAgaWYgKGlucHV0LmNvbW1vblBhcmFtcykge1xuICAgICAgICAvKipcbiAgICAgICAgICogYXMgY29tbW9uUGFyYW1zIGluY2x1ZGVzIHF1ZXJ5IHBhcmFtcywgd2UgY2FuIHVzZSB0aGUgcGFyc2VRdWVyeVBhcmFtcyBmdW5jdGlvblxuICAgICAgICAgKi9cbiAgICAgICAgOyhyZXEgYXMgYW55KS5jb21tb25QYXJhbXMgPSBwYXJzZVF1ZXJ5UGFyYW1zKFxuICAgICAgICAgIGlucHV0LmNvbW1vblBhcmFtcyxcbiAgICAgICAgICBvcmlnaW5hbF9jb21iaW5lZF9wYXJhbXNcbiAgICAgICAgKVxuICAgICAgfVxuICAgIH0gY2F0Y2ggKGVycm9yOiBhbnkpIHtcbiAgICAgIGlmIChlcnJvci5uYW1lID09PSBcIlpvZEVycm9yXCIpIHtcbiAgICAgICAgbGV0IG1lc3NhZ2VcbiAgICAgICAgaWYgKGVycm9yLmlzc3Vlcy5sZW5ndGggPT09IDEpIHtcbiAgICAgICAgICBjb25zdCBpc3N1ZSA9IGVycm9yLmlzc3Vlc1swXVxuICAgICAgICAgIG1lc3NhZ2UgPSB6b2RJc3N1ZVRvU3RyaW5nKGlzc3VlKVxuICAgICAgICB9IGVsc2Uge1xuICAgICAgICAgIGNvbnN0IG1lc3NhZ2VfY29tcG9uZW50czogc3RyaW5nW10gPSBbXVxuICAgICAgICAgIGZvciAoY29uc3QgaXNzdWUgb2YgZXJyb3IuaXNzdWVzKSB7XG4gICAgICAgICAgICBtZXNzYWdlX2NvbXBvbmVudHMucHVzaCh6b2RJc3N1ZVRvU3RyaW5nKGlzc3VlKSlcbiAgICAgICAgICB9XG4gICAgICAgICAgbWVzc2FnZSA9XG4gICAgICAgICAgICBgJHtlcnJvci5pc3N1ZXMubGVuZ3RofSBJbnB1dCBFcnJvcnM6IGAgK1xuICAgICAgICAgICAgbWVzc2FnZV9jb21wb25lbnRzLmpvaW4oXCIsIFwiKVxuICAgICAgICB9XG5cbiAgICAgICAgdGhyb3cgbmV3IEJhZFJlcXVlc3RFeGNlcHRpb24oe1xuICAgICAgICAgIHR5cGU6IFwiaW52YWxpZF9pbnB1dFwiLFxuICAgICAgICAgIG1lc3NhZ2UsXG4gICAgICAgICAgdmFsaWRhdGlvbl9lcnJvcnM6IGVycm9yLmZvcm1hdCgpLFxuICAgICAgICB9KVxuICAgICAgfVxuXG4gICAgICB0aHJvdyBuZXcgQmFkUmVxdWVzdEV4Y2VwdGlvbih7XG4gICAgICAgIHR5cGU6IFwiaW52YWxpZF9pbnB1dFwiLFxuICAgICAgICBtZXNzYWdlOiBcIkVycm9yIHdoaWxlIHBhcnNpbmcgaW5wdXRcIixcbiAgICAgIH0pXG4gICAgfVxuXG4gICAgLyoqXG4gICAgICogdGhpcyB3aWxsIG92ZXJyaWRlIHRoZSByZXMuanNvbiBtZXRob2QgdG8gdmFsaWRhdGUgdGhlIHJlc3BvbnNlXG4gICAgICovXG4gICAgaWYgKGlucHV0LnNob3VsZFZhbGlkYXRlUmVzcG9uc2VzKSB7XG4gICAgICB2YWxpZGF0ZUpzb25SZXNwb25zZShpbnB1dC5qc29uUmVzcG9uc2UsIHJlcylcbiAgICB9XG5cbiAgICByZXR1cm4gbmV4dChyZXEsIHJlcylcbiAgfVxuXG5leHBvcnQgZGVmYXVsdCB3aXRoVmFsaWRhdGlvblxuIiwgImltcG9ydCB7IE5leHRBcGlSZXNwb25zZSwgTmV4dEFwaVJlcXVlc3QgfSBmcm9tIFwibmV4dFwiXG5pbXBvcnQgeyBNaWRkbGV3YXJlIGFzIFdyYXBwZXJNaWRkbGV3YXJlIH0gZnJvbSBcIm5leHRqcy1taWRkbGV3YXJlLXdyYXBwZXJzXCJcbmltcG9ydCB7IHogfSBmcm9tIFwiem9kXCJcbmltcG9ydCB7IEhUVFBNZXRob2RzIH0gZnJvbSBcIi4uL3dpdGgtcm91dGUtc3BlYy9taWRkbGV3YXJlcy93aXRoLW1ldGhvZHNcIlxuaW1wb3J0IHtcbiAgU2VjdXJpdHlTY2hlbWVPYmplY3QsXG4gIFNlY3VyaXR5UmVxdWlyZW1lbnRPYmplY3QsXG59IGZyb20gXCJvcGVuYXBpMy10cy9vYXMzMVwiXG5cbmV4cG9ydCB0eXBlIE1pZGRsZXdhcmU8VCwgRGVwID0ge30+ID0gV3JhcHBlck1pZGRsZXdhcmU8VCwgRGVwPiAmIHtcbiAgLyoqXG4gICAqIEBkZXByZWNhdGVkIG1vdmVkIHRvIHNldHVwUGFyYW1zXG4gICAqL1xuICBzZWN1cml0eVNjaGVtYT86IFNlY3VyaXR5U2NoZW1lT2JqZWN0XG4gIHNlY3VyaXR5T2JqZWN0cz86IFNlY3VyaXR5UmVxdWlyZW1lbnRPYmplY3RbXVxufVxuXG50eXBlIFBhcmFtRGVmID0gei5ab2RUeXBlQW55IHwgei5ab2RFZmZlY3RzPHouWm9kVHlwZUFueT5cblxuZXhwb3J0IGludGVyZmFjZSBSb3V0ZVNwZWM8XG4gIEF1dGggZXh0ZW5kcyBzdHJpbmcgPSBzdHJpbmcsXG4gIE1ldGhvZHMgZXh0ZW5kcyBIVFRQTWV0aG9kc1tdID0gYW55LFxuICBKc29uQm9keSBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RPYmplY3Q8YW55LCBhbnksIGFueSwgYW55LCBhbnk+LFxuICBRdWVyeVBhcmFtcyBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RPYmplY3Q8YW55LCBhbnksIGFueSwgYW55LCBhbnk+LFxuICBDb21tb25QYXJhbXMgZXh0ZW5kcyBQYXJhbURlZiA9IHouWm9kT2JqZWN0PGFueSwgYW55LCBhbnksIGFueSwgYW55PixcbiAgTWlkZGxld2FyZXMgZXh0ZW5kcyByZWFkb25seSBNaWRkbGV3YXJlPGFueSwgYW55PltdID0gYW55W10sXG4gIEpzb25SZXNwb25zZSBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RPYmplY3Q8YW55LCBhbnksIGFueSwgYW55LCBhbnk+LFxuICBGb3JtRGF0YSBleHRlbmRzIFBhcmFtRGVmID0gei5ab2RUeXBlQW55XG4+IHtcbiAgbWV0aG9kczogTWV0aG9kc1xuICBhdXRoOiBBdXRoXG4gIGpzb25Cb2R5PzogSnNvbkJvZHlcbiAgcXVlcnlQYXJhbXM/OiBRdWVyeVBhcmFtc1xuICBjb21tb25QYXJhbXM/OiBDb21tb25QYXJhbXNcbiAgbWlkZGxld2FyZXM/OiBNaWRkbGV3YXJlc1xuICBqc29uUmVzcG9uc2U/OiBKc29uUmVzcG9uc2VcbiAgZm9ybURhdGE/OiBGb3JtRGF0YVxufVxuXG5leHBvcnQgdHlwZSBNaWRkbGV3YXJlQ2hhaW5PdXRwdXQ8XG4gIE1XQ2hhaW4gZXh0ZW5kcyByZWFkb25seSBNaWRkbGV3YXJlPGFueSwgYW55PltdXG4+ID0gTVdDaGFpbiBleHRlbmRzIHJlYWRvbmx5IFtdXG4gID8ge31cbiAgOiBNV0NoYWluIGV4dGVuZHMgcmVhZG9ubHkgW2luZmVyIEZpcnN0LCAuLi5pbmZlciBSZXN0XVxuICA/IEZpcnN0IGV4dGVuZHMgTWlkZGxld2FyZTxpbmZlciBULCBhbnk+XG4gICAgPyBUICZcbiAgICAgICAgKFJlc3QgZXh0ZW5kcyByZWFkb25seSBNaWRkbGV3YXJlPGFueSwgYW55PltdXG4gICAgICAgICAgPyBNaWRkbGV3YXJlQ2hhaW5PdXRwdXQ8UmVzdD5cbiAgICAgICAgICA6IG5ldmVyKVxuICAgIDogbmV2ZXJcbiAgOiBuZXZlclxuXG5leHBvcnQgdHlwZSBBdXRoTWlkZGxld2FyZXMgPSB7XG4gIFthdXRoX3R5cGU6IHN0cmluZ106IE1pZGRsZXdhcmU8YW55LCBhbnk+XG59XG5cbmV4cG9ydCBpbnRlcmZhY2UgU2V0dXBQYXJhbXM8XG4gIEF1dGhNVyBleHRlbmRzIEF1dGhNaWRkbGV3YXJlcyA9IEF1dGhNaWRkbGV3YXJlcyxcbiAgR2xvYmFsTVcgZXh0ZW5kcyBNaWRkbGV3YXJlPGFueSwgYW55PltdID0gYW55W11cbj4ge1xuICBhdXRoTWlkZGxld2FyZU1hcDogQXV0aE1XXG4gIGdsb2JhbE1pZGRsZXdhcmVzOiBHbG9iYWxNV1xuICBleGNlcHRpb25IYW5kbGluZ01pZGRsZXdhcmU/OiAoKG5leHQ6IEZ1bmN0aW9uKSA9PiBGdW5jdGlvbikgfCBudWxsXG5cbiAgLy8gVGhlc2UgaW1wcm92ZSBPcGVuQVBJIGdlbmVyYXRpb25cbiAgYXBpTmFtZTogc3RyaW5nXG4gIHByb2R1Y3Rpb25TZXJ2ZXJVcmw6IHN0cmluZ1xuXG4gIGFkZE9rU3RhdHVzPzogYm9vbGVhblxuXG4gIHNob3VsZFZhbGlkYXRlUmVzcG9uc2VzPzogYm9vbGVhblxuICBzaG91bGRWYWxpZGF0ZUdldFJlcXVlc3RCb2R5PzogYm9vbGVhblxuICBzZWN1cml0eVNjaGVtYXM/OiBSZWNvcmQ8c3RyaW5nLCBTZWN1cml0eVNjaGVtZU9iamVjdD5cbiAgZ2xvYmFsU2NoZW1hcz86IFJlY29yZDxzdHJpbmcsIHouWm9kVHlwZUFueT5cbn1cblxuY29uc3QgZGVmYXVsdE1pZGRsZXdhcmVNYXAgPSB7XG4gIG5vbmU6IChuZXh0KSA9PiBuZXh0LFxufSBhcyBjb25zdFxuXG50eXBlIFNlbmQ8VD4gPSAoYm9keTogVCkgPT4gdm9pZFxudHlwZSBOZXh0QXBpUmVzcG9uc2VXaXRob3V0SnNvbkFuZFN0YXR1c01ldGhvZHMgPSBPbWl0PFxuICBOZXh0QXBpUmVzcG9uc2UsXG4gIFwianNvblwiIHwgXCJzdGF0dXNcIlxuPlxuXG50eXBlIFN1Y2Nlc3NmdWxOZXh0QXBpUmVzcG9uc2VNZXRob2RzPFQ+ID0ge1xuICBzdGF0dXM6IChcbiAgICBzdGF0dXNDb2RlOiAyMDAgfCAyMDFcbiAgKSA9PiBOZXh0QXBpUmVzcG9uc2VXaXRob3V0SnNvbkFuZFN0YXR1c01ldGhvZHMgJiB7XG4gICAganNvbjogU2VuZDxUPlxuICB9XG4gIGpzb246IFNlbmQ8VD5cbn1cblxudHlwZSBFcnJvck5leHRBcGlSZXNwb25zZU1ldGhvZHMgPSB7XG4gIHN0YXR1czogKHN0YXR1c0NvZGU6IG51bWJlcikgPT4gTmV4dEFwaVJlc3BvbnNlV2l0aG91dEpzb25BbmRTdGF0dXNNZXRob2RzICYge1xuICAgIGpzb246IFNlbmQ8YW55PlxuICB9XG4gIGpzb246IFNlbmQ8YW55PlxufVxuXG5leHBvcnQgdHlwZSBSb3V0ZUZ1bmN0aW9uPFxuICBTUCBleHRlbmRzIFNldHVwUGFyYW1zPEF1dGhNaWRkbGV3YXJlcz4sXG4gIFJTIGV4dGVuZHMgUm91dGVTcGVjXG4+ID0gKFxuICByZXE6IChTUFtcImF1dGhNaWRkbGV3YXJlTWFwXCJdICZcbiAgICB0eXBlb2YgZGVmYXVsdE1pZGRsZXdhcmVNYXApW1JTW1wiYXV0aFwiXV0gZXh0ZW5kcyBNaWRkbGV3YXJlPFxuICAgIGluZmVyIEF1dGhNV091dCxcbiAgICBhbnlcbiAgPlxuICAgID8gT21pdDxOZXh0QXBpUmVxdWVzdCwgXCJxdWVyeVwiIHwgXCJib2R5XCI+ICZcbiAgICAgICAgQXV0aE1XT3V0ICZcbiAgICAgICAgTWlkZGxld2FyZUNoYWluT3V0cHV0PFxuICAgICAgICAgIFJTW1wibWlkZGxld2FyZXNcIl0gZXh0ZW5kcyByZWFkb25seSBNaWRkbGV3YXJlPGFueSwgYW55PltdXG4gICAgICAgICAgICA/IFsuLi5TUFtcImdsb2JhbE1pZGRsZXdhcmVzXCJdLCAuLi5SU1tcIm1pZGRsZXdhcmVzXCJdXVxuICAgICAgICAgICAgOiBTUFtcImdsb2JhbE1pZGRsZXdhcmVzXCJdXG4gICAgICAgID4gJiB7XG4gICAgICAgICAgYm9keTogUlNbXCJmb3JtRGF0YVwiXSBleHRlbmRzIHouWm9kVHlwZUFueVxuICAgICAgICAgICAgPyB6LmluZmVyPFJTW1wiZm9ybURhdGFcIl0+XG4gICAgICAgICAgICA6IFJTW1wianNvbkJvZHlcIl0gZXh0ZW5kcyB6LlpvZFR5cGVBbnlcbiAgICAgICAgICAgID8gei5pbmZlcjxSU1tcImpzb25Cb2R5XCJdPlxuICAgICAgICAgICAgOiB7fVxuICAgICAgICAgIHF1ZXJ5OiBSU1tcInF1ZXJ5UGFyYW1zXCJdIGV4dGVuZHMgei5ab2RUeXBlQW55XG4gICAgICAgICAgICA/IHouaW5mZXI8UlNbXCJxdWVyeVBhcmFtc1wiXT5cbiAgICAgICAgICAgIDoge31cbiAgICAgICAgICBjb21tb25QYXJhbXM6IFJTW1wiY29tbW9uUGFyYW1zXCJdIGV4dGVuZHMgei5ab2RUeXBlQW55XG4gICAgICAgICAgICA/IHouaW5mZXI8UlNbXCJjb21tb25QYXJhbXNcIl0+XG4gICAgICAgICAgICA6IHt9XG4gICAgICAgIH1cbiAgICA6IGB1bmtub3duIGF1dGggdHlwZTogJHtSU1tcImF1dGhcIl19LiBZb3Ugc2hvdWxkIGNvbmZpZ3VyZSB0aGlzIGF1dGggdHlwZSBpbiB5b3VyIGF1dGhfbWlkZGxld2FyZXMgdy8gY3JlYXRlV2l0aFJvdXRlU3BlYywgb3IgbWF5YmUgeW91IG5lZWQgdG8gYWRkIFwiYXMgY29uc3RcIiB0byB5b3VyIHJvdXRlIHNwZWMgZGVmaW5pdGlvbi5gLFxuICByZXM6IE5leHRBcGlSZXNwb25zZVdpdGhvdXRKc29uQW5kU3RhdHVzTWV0aG9kcyAmXG4gICAgU3VjY2Vzc2Z1bE5leHRBcGlSZXNwb25zZU1ldGhvZHM8XG4gICAgICBSU1tcImpzb25SZXNwb25zZVwiXSBleHRlbmRzIHouWm9kVHlwZUFueVxuICAgICAgICA/IHouaW5mZXI8UlNbXCJqc29uUmVzcG9uc2VcIl0+XG4gICAgICAgIDogYW55XG4gICAgPiAmXG4gICAgRXJyb3JOZXh0QXBpUmVzcG9uc2VNZXRob2RzXG4pID0+IFByb21pc2U8dm9pZD5cblxuZXhwb3J0IHR5cGUgQ3JlYXRlV2l0aFJvdXRlU3BlY0Z1bmN0aW9uID0gPFxuICBTUCBleHRlbmRzIFNldHVwUGFyYW1zPEF1dGhNaWRkbGV3YXJlcywgYW55PlxuPihcbiAgc2V0dXBQYXJhbXM6IFNQXG4pID0+IDxcbiAgUlMgZXh0ZW5kcyBSb3V0ZVNwZWM8XG4gICAgc3RyaW5nLFxuICAgIGFueSxcbiAgICBhbnksXG4gICAgYW55LFxuICAgIGFueSxcbiAgICBhbnksXG4gICAgei5ab2RPYmplY3Q8YW55LCBhbnksIGFueSwgYW55LCBhbnk+LFxuICAgIGFueVxuICA+XG4+KFxuICByb3V0ZV9zcGVjOiBSU1xuKSA9PiAobmV4dDogUm91dGVGdW5jdGlvbjxTUCwgUlM+KSA9PiBhbnlcbiJdLAogICJtYXBwaW5ncyI6ICI7Ozs7O0FBQUE7QUFBQSxjQUFjOzs7QUNBZDtBQUNBLFNBQVMsNkJBQTZCO0FBQ3RDLE9BQU8sY0FBOEI7OztBQ0ZyQztBQUFBLFNBQVMsaUNBQWlDO0FBV25DLElBQU0sY0FBYyxDQUFDLFlBQTJCLENBQUMsU0FBUyxDQUFDLEtBQUssUUFBUTtBQUM3RSxNQUFJLENBQUMsUUFBUSxTQUFTLElBQUksTUFBTSxHQUFHO0FBQ2pDLFVBQU0sSUFBSSwwQkFBMEI7QUFBQSxNQUNsQyxNQUFNO0FBQUEsTUFDTixTQUFTLFFBQVEsUUFBUSxLQUFLLEdBQUc7QUFBQSxJQUNuQyxDQUFDO0FBQUEsRUFDSDtBQUNBLFNBQU8sS0FBSyxLQUFLLEdBQUc7QUFDdEI7QUFFQSxJQUFPLHVCQUFROzs7QUNyQmY7QUFDQSxTQUFTLEdBQUcsNkJBQTZCO0FBQ3pDO0FBQUEsRUFDRTtBQUFBLEVBQ0E7QUFBQSxPQUNLO0FBQ1AsU0FBUyxlQUFlO0FBRXhCLElBQU0sd0NBQXdDLENBQzVDLGFBQ0EsV0FDb0M7QUFDcEMsTUFBSSxDQUFDLGFBQWE7QUFDaEIsV0FBTztBQUFBLEVBQ1Q7QUFFQSxNQUFJLGdCQUFnQjtBQUVwQixTQUFPLHlCQUF5QixFQUFFLFlBQVk7QUFDNUMsb0JBQWdCLGNBQWMsS0FBSztBQUFBLEVBQ3JDO0FBRUEsU0FBTztBQUNUO0FBTUEsSUFBTSxnQ0FBZ0MsQ0FBQyxXQUF5QjtBQUM5RCxRQUFNLG9CQUFvQjtBQUFBLElBQ3hCLHNCQUFzQjtB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
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "nextlove",
3
- "version": "2.1.4",
3
+ "version": "2.1.6",
4
4
  "private": false,
5
5
  "repository": "https://github.com/seamapi/nextlove",
6
6
  "files": [
@@ -15,10 +15,24 @@
15
15
  "nextlove": "bin.js"
16
16
  },
17
17
  "main": "./dist/index.js",
18
+ "module": "dist/index.mjs",
19
+ "types": "dist/index.d.ts",
20
+ "exports": {
21
+ ".": {
22
+ "types": "./dist/index.d.ts",
23
+ "import": "./dist/index.mjs",
24
+ "require": "./dist/index.js"
25
+ },
26
+ "./generators": {
27
+ "types": "./dist/generators/index.d.ts",
28
+ "import": "./dist/generators/index.mjs",
29
+ "require": "./dist/generators/index.js"
30
+ }
31
+ },
18
32
  "scripts": {
19
33
  "test": "npm run typecheck",
20
34
  "typecheck": "tsc --noEmit",
21
- "build": "tsup --dts --sourcemap inline src",
35
+ "build": "tsup --dts --sourcemap inline src/index.ts src/generators/index.ts --format cjs,esm",
22
36
  "yalc": "npm run build && yalc push"
23
37
  },
24
38
  "peerDependencies": {
@@ -31,28 +45,26 @@
31
45
  "prettier": "^2.0.0 || ^3.0.0"
32
46
  },
33
47
  "dependencies": {
48
+ "@anatine/zod-openapi": "^2.0.1",
34
49
  "lodash": "^4.17.21",
35
50
  "nextjs-exception-middleware": "^2.0.1",
36
51
  "nextjs-middleware-wrappers": "^1.3.0",
37
- "openapi3-ts": "^3.1.1",
38
- "zod-to-ts": "^1.1.1"
52
+ "openapi3-ts": "^4.1.2",
53
+ "zod-to-ts": "^1.1.4"
39
54
  },
40
55
  "devDependencies": {
41
- "@anatine/zod-openapi": "^1.10.0",
42
56
  "@types/lodash": "^4.14.182",
43
57
  "@types/node": "18.0.0",
44
58
  "@types/prettier": "^2.7.1",
45
59
  "@types/react": "18.0.14",
46
60
  "@types/react-dom": "18.0.5",
47
- "chalk": "^5.1.2",
61
+ "chalk": "^5.3.0",
48
62
  "esbuild": "^0.14.7",
49
63
  "esbuild-register": "^3.3.3",
50
64
  "esbuild-runner": "^2.2.1",
51
65
  "eslint": "8.18.0",
52
66
  "eslint-config-next": "12.2.0",
53
67
  "expect-type": "^0.15.0",
54
- "globby": "11.1.0",
55
- "minimist": "^1.2.7",
56
68
  "next": "12.2.0",
57
69
  "nextjs-middleware-wrappers": "^1.3.0",
58
70
  "nextjs-server-modules": "^2.1.0",
@@ -64,6 +76,6 @@
64
76
  "turbo": "^1.3.1",
65
77
  "type-fest": "^3.1.0",
66
78
  "typescript": "4.7.4",
67
- "zod": "^3.17.3"
79
+ "zod": "^3.21.4"
68
80
  }
69
81
  }