@decaf-ts/decorator-validation 1.7.3 → 1.7.5
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/LICENSE.md +21 -157
- package/dist/decorator-validation.cjs +461 -265
- package/dist/decorator-validation.esm.cjs +459 -265
- package/lib/constants/errors.cjs +19 -0
- package/lib/constants/errors.d.ts +11 -0
- package/lib/constants/index.cjs +2 -1
- package/lib/constants/index.d.ts +1 -0
- package/lib/esm/constants/errors.d.ts +11 -0
- package/lib/esm/constants/errors.js +16 -0
- package/lib/esm/constants/index.d.ts +1 -0
- package/lib/esm/constants/index.js +3 -2
- package/lib/esm/index.d.ts +1 -1
- package/lib/esm/index.js +6 -6
- package/lib/esm/mcp/ModelContextProtocol.d.ts +31 -0
- package/lib/esm/mcp/ModelContextProtocol.js +66 -0
- package/lib/esm/mcp/mcp1.d.ts +0 -0
- package/lib/esm/mcp/mcp1.js +405 -0
- package/lib/esm/mcp/tools/createModel.tool.d.ts +0 -0
- package/lib/esm/mcp/tools/createModel.tool.js +67 -0
- package/lib/esm/mcp/tools/validateModel.tool.d.ts +0 -0
- package/lib/esm/mcp/tools/validateModel.tool.js +2 -0
- package/lib/esm/mcp/types.d.ts +3 -0
- package/lib/esm/mcp/types.js +2 -0
- package/lib/esm/model/Builder.d.ts +0 -0
- package/lib/esm/model/Builder.js +130 -0
- package/lib/esm/model/Model.d.ts +1 -0
- package/lib/esm/model/Model.js +19 -9
- package/lib/esm/model/construction.js +2 -2
- package/lib/esm/model/decorators.d.ts +10 -0
- package/lib/esm/model/decorators.js +16 -4
- package/lib/esm/model/index.js +9 -9
- package/lib/esm/model/utils.js +2 -2
- package/lib/esm/model/validation.js +16 -13
- package/lib/esm/utils/Decoration.js +2 -2
- package/lib/esm/utils/PathProxy.d.ts +43 -0
- package/lib/esm/utils/PathProxy.js +89 -0
- package/lib/esm/utils/constants.d.ts +1 -0
- package/lib/esm/utils/constants.js +2 -1
- package/lib/esm/utils/dates.js +3 -3
- package/lib/esm/utils/decorators.js +2 -2
- package/lib/esm/utils/index.d.ts +1 -0
- package/lib/esm/utils/index.js +11 -10
- package/lib/esm/utils/serialization.js +4 -4
- package/lib/esm/validation/Validation.d.ts +3 -0
- package/lib/esm/validation/Validation.js +14 -3
- package/lib/esm/validation/Validators/DateValidator.js +4 -4
- package/lib/esm/validation/Validators/DiffValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/DiffValidator.js +8 -8
- package/lib/esm/validation/Validators/EmailValidator.js +4 -4
- package/lib/esm/validation/Validators/EqualsValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/EqualsValidator.js +8 -8
- package/lib/esm/validation/Validators/GreaterThanOrEqualValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/GreaterThanOrEqualValidator.js +9 -8
- package/lib/esm/validation/Validators/GreaterThanValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/GreaterThanValidator.js +9 -8
- package/lib/esm/validation/Validators/LessThanOrEqualValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/LessThanOrEqualValidator.js +9 -8
- package/lib/esm/validation/Validators/LessThanValidator.d.ts +4 -2
- package/lib/esm/validation/Validators/LessThanValidator.js +9 -8
- package/lib/esm/validation/Validators/ListValidator.js +4 -4
- package/lib/esm/validation/Validators/MaxLengthValidator.js +4 -4
- package/lib/esm/validation/Validators/MaxValidator.js +4 -4
- package/lib/esm/validation/Validators/MinLengthValidator.js +4 -4
- package/lib/esm/validation/Validators/MinValidator.js +4 -4
- package/lib/esm/validation/Validators/PasswordValidator.js +4 -4
- package/lib/esm/validation/Validators/PatternValidator.js +4 -4
- package/lib/esm/validation/Validators/RequiredValidator.js +4 -4
- package/lib/esm/validation/Validators/StepValidator.js +4 -4
- package/lib/esm/validation/Validators/TypeValidator.js +6 -6
- package/lib/esm/validation/Validators/URLValidator.js +4 -4
- package/lib/esm/validation/Validators/Validator.d.ts +3 -2
- package/lib/esm/validation/Validators/Validator.js +3 -3
- package/lib/esm/validation/Validators/ValidatorRegistry.js +2 -2
- package/lib/esm/validation/Validators/constants.d.ts +0 -13
- package/lib/esm/validation/Validators/constants.js +2 -15
- package/lib/esm/validation/Validators/decorators.js +3 -3
- package/lib/esm/validation/Validators/index.js +25 -25
- package/lib/esm/validation/Validators/utils.d.ts +0 -14
- package/lib/esm/validation/Validators/utils.js +69 -56
- package/lib/esm/validation/decorators.d.ts +26 -3
- package/lib/esm/validation/decorators.js +107 -58
- package/lib/esm/validation/index.js +5 -5
- package/lib/esm/validation/types.d.ts +11 -5
- package/lib/esm/validation/types.js +2 -2
- package/lib/index.cjs +1 -1
- package/lib/index.d.ts +1 -1
- package/lib/mcp/ModelContextProtocol.cjs +70 -0
- package/lib/mcp/ModelContextProtocol.d.ts +31 -0
- package/lib/mcp/mcp1.cjs +405 -0
- package/lib/mcp/mcp1.d.ts +0 -0
- package/lib/mcp/tools/createModel.tool.cjs +67 -0
- package/lib/mcp/tools/createModel.tool.d.ts +0 -0
- package/lib/mcp/tools/validateModel.tool.cjs +2 -0
- package/lib/mcp/tools/validateModel.tool.d.ts +0 -0
- package/lib/mcp/types.cjs +3 -0
- package/lib/mcp/types.d.ts +3 -0
- package/lib/model/Builder.cjs +130 -0
- package/lib/model/Builder.d.ts +0 -0
- package/lib/model/Model.cjs +12 -2
- package/lib/model/Model.d.ts +1 -0
- package/lib/model/decorators.cjs +14 -1
- package/lib/model/decorators.d.ts +10 -0
- package/lib/model/validation.cjs +8 -5
- package/lib/utils/PathProxy.cjs +93 -0
- package/lib/utils/PathProxy.d.ts +43 -0
- package/lib/utils/constants.cjs +2 -1
- package/lib/utils/constants.d.ts +1 -0
- package/lib/utils/index.cjs +2 -1
- package/lib/utils/index.d.ts +1 -0
- package/lib/validation/Validation.cjs +12 -1
- package/lib/validation/Validation.d.ts +3 -0
- package/lib/validation/Validators/DiffValidator.cjs +5 -5
- package/lib/validation/Validators/DiffValidator.d.ts +4 -2
- package/lib/validation/Validators/EqualsValidator.cjs +5 -5
- package/lib/validation/Validators/EqualsValidator.d.ts +4 -2
- package/lib/validation/Validators/GreaterThanOrEqualValidator.cjs +5 -4
- package/lib/validation/Validators/GreaterThanOrEqualValidator.d.ts +4 -2
- package/lib/validation/Validators/GreaterThanValidator.cjs +5 -4
- package/lib/validation/Validators/GreaterThanValidator.d.ts +4 -2
- package/lib/validation/Validators/LessThanOrEqualValidator.cjs +5 -4
- package/lib/validation/Validators/LessThanOrEqualValidator.d.ts +4 -2
- package/lib/validation/Validators/LessThanValidator.cjs +5 -4
- package/lib/validation/Validators/LessThanValidator.d.ts +4 -2
- package/lib/validation/Validators/Validator.cjs +1 -1
- package/lib/validation/Validators/Validator.d.ts +3 -2
- package/lib/validation/Validators/constants.cjs +2 -15
- package/lib/validation/Validators/constants.d.ts +0 -13
- package/lib/validation/Validators/utils.cjs +79 -67
- package/lib/validation/Validators/utils.d.ts +0 -14
- package/lib/validation/decorators.cjs +102 -52
- package/lib/validation/decorators.d.ts +26 -3
- package/lib/validation/types.cjs +1 -1
- package/lib/validation/types.d.ts +11 -5
- package/package.json +16 -5
package/lib/mcp/mcp1.cjs
ADDED
|
@@ -0,0 +1,405 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import { FastMCP } from "fastmcp";
|
|
3
|
+
// import { z } from "zod";
|
|
4
|
+
// import { version } from "../../package.json";
|
|
5
|
+
// import { ModelContextProtocol } from "./ModelContextProtocol";
|
|
6
|
+
// import { Model } from "../model";
|
|
7
|
+
// import {
|
|
8
|
+
// email,
|
|
9
|
+
// max,
|
|
10
|
+
// maxlength,
|
|
11
|
+
// min,
|
|
12
|
+
// minlength,
|
|
13
|
+
// pattern,
|
|
14
|
+
// required,
|
|
15
|
+
// } from "../validation";
|
|
16
|
+
// import { createModelTool } from "./tools/createModel.tool";
|
|
17
|
+
//
|
|
18
|
+
// const DecoratorValidatonMCP = ModelContextProtocol.builder
|
|
19
|
+
// .setName("decaf-validation-server")
|
|
20
|
+
// .setVersion(version)
|
|
21
|
+
// .addTool(createModelTool)
|
|
22
|
+
// .build();
|
|
23
|
+
//
|
|
24
|
+
// // Initialize FastMCP server
|
|
25
|
+
// const server = new FastMCP({
|
|
26
|
+
// name: "decaf-validation-server",
|
|
27
|
+
// // @ts-ignore
|
|
28
|
+
// version: version,
|
|
29
|
+
// });
|
|
30
|
+
//
|
|
31
|
+
// // Model registry for dynamic model management
|
|
32
|
+
// const modelRegistry = new Map<string, any>();
|
|
33
|
+
//
|
|
34
|
+
// // Tool: Validate a model instance
|
|
35
|
+
// server.addTool({
|
|
36
|
+
// name: "validate-model",
|
|
37
|
+
// description: "Validate a model instance against its decorators",
|
|
38
|
+
// parameters: z.object({
|
|
39
|
+
// modelName: z.string().describe("Name of the model class"),
|
|
40
|
+
// data: z.record(z.any()).describe("Data to validate"),
|
|
41
|
+
// options: z
|
|
42
|
+
// .object({
|
|
43
|
+
// partial: z.boolean().optional().describe("Allow partial validation"),
|
|
44
|
+
// })
|
|
45
|
+
// .optional(),
|
|
46
|
+
// }),
|
|
47
|
+
// execute: async (args) => {
|
|
48
|
+
// const { modelName, data, options } = args;
|
|
49
|
+
//
|
|
50
|
+
// const ModelClass = modelRegistry.get(modelName) || Model.get(modelName);
|
|
51
|
+
// if (!ModelClass) {
|
|
52
|
+
// throw new Error(`Model "${modelName}" not found`);
|
|
53
|
+
// }
|
|
54
|
+
//
|
|
55
|
+
// try {
|
|
56
|
+
// const instance = new ModelClass(data);
|
|
57
|
+
// const errors = instance.hasErrors();
|
|
58
|
+
//
|
|
59
|
+
// return {
|
|
60
|
+
// isValid: !errors,
|
|
61
|
+
// errors: errors || null,
|
|
62
|
+
// validatedData: errors ? null : instance.serialize(),
|
|
63
|
+
// };
|
|
64
|
+
// } catch (error) {
|
|
65
|
+
// return {
|
|
66
|
+
// isValid: false,
|
|
67
|
+
// errors: [{ message: error.message }],
|
|
68
|
+
// validatedData: null,
|
|
69
|
+
// };
|
|
70
|
+
// }
|
|
71
|
+
// },
|
|
72
|
+
// });
|
|
73
|
+
//
|
|
74
|
+
// // Tool: Get model schema information
|
|
75
|
+
// server.addTool({
|
|
76
|
+
// name: "get-model-schema",
|
|
77
|
+
// description: "Get the validation schema for a model",
|
|
78
|
+
// parameters: z.object({
|
|
79
|
+
// modelName: z.string().describe("Name of the model class"),
|
|
80
|
+
// }),
|
|
81
|
+
// execute: async (args) => {
|
|
82
|
+
// const { modelName } = args;
|
|
83
|
+
//
|
|
84
|
+
// const ModelClass = modelRegistry.get(modelName) || Model.get(modelName);
|
|
85
|
+
// if (!ModelClass) {
|
|
86
|
+
// throw new Error(`Model "${modelName}" not found`);
|
|
87
|
+
// }
|
|
88
|
+
//
|
|
89
|
+
// // Extract validation metadata
|
|
90
|
+
// const instance = new ModelClass();
|
|
91
|
+
// const metadata = Reflect.getMetadata("validation", instance) || {};
|
|
92
|
+
//
|
|
93
|
+
// return {
|
|
94
|
+
// modelName,
|
|
95
|
+
// properties: Object.keys(metadata).map((key) => ({
|
|
96
|
+
// name: key,
|
|
97
|
+
// validators: metadata[key] || [],
|
|
98
|
+
// })),
|
|
99
|
+
// capabilities: {
|
|
100
|
+
// serialization: !!instance.serialize,
|
|
101
|
+
// hashing: !!instance.hash,
|
|
102
|
+
// comparison: !!instance.equals,
|
|
103
|
+
// },
|
|
104
|
+
// };
|
|
105
|
+
// },
|
|
106
|
+
// });
|
|
107
|
+
//
|
|
108
|
+
// // Tool: Serialize model
|
|
109
|
+
// server.addTool({
|
|
110
|
+
// name: "serialize-model",
|
|
111
|
+
// description: "Serialize a model instance to string",
|
|
112
|
+
// parameters: z.object({
|
|
113
|
+
// modelName: z.string().describe("Name of the model class"),
|
|
114
|
+
// data: z.record(z.any()).describe("Model data to serialize"),
|
|
115
|
+
// format: z.enum(["json", "yaml"]).optional().default("json"),
|
|
116
|
+
// }),
|
|
117
|
+
// execute: async (args) => {
|
|
118
|
+
// const { modelName, data, format } = args;
|
|
119
|
+
//
|
|
120
|
+
// const ModelClass = modelRegistry.get(modelName) || Model.get(modelName);
|
|
121
|
+
// if (!ModelClass) {
|
|
122
|
+
// throw new Error(`Model "${modelName}" not found`);
|
|
123
|
+
// }
|
|
124
|
+
//
|
|
125
|
+
// const instance = new ModelClass(data);
|
|
126
|
+
// const errors = instance.hasErrors();
|
|
127
|
+
//
|
|
128
|
+
// if (errors) {
|
|
129
|
+
// throw new Error(
|
|
130
|
+
// `Cannot serialize invalid model: ${JSON.stringify(errors)}`
|
|
131
|
+
// );
|
|
132
|
+
// }
|
|
133
|
+
//
|
|
134
|
+
// return {
|
|
135
|
+
// serialized: instance.serialize(),
|
|
136
|
+
// format,
|
|
137
|
+
// modelName,
|
|
138
|
+
// };
|
|
139
|
+
// },
|
|
140
|
+
// });
|
|
141
|
+
//
|
|
142
|
+
// // Tool: Deserialize model
|
|
143
|
+
// server.addTool({
|
|
144
|
+
// name: "deserialize-model",
|
|
145
|
+
// description: "Deserialize a string to model instance",
|
|
146
|
+
// parameters: z.object({
|
|
147
|
+
// serializedData: z.string().describe("Serialized model data"),
|
|
148
|
+
// modelName: z
|
|
149
|
+
// .string()
|
|
150
|
+
// .optional()
|
|
151
|
+
// .describe("Expected model name for validation"),
|
|
152
|
+
// }),
|
|
153
|
+
// execute: async (args) => {
|
|
154
|
+
// const { serializedData, modelName } = args;
|
|
155
|
+
//
|
|
156
|
+
// try {
|
|
157
|
+
// const instance = Model.deserialize(serializedData);
|
|
158
|
+
//
|
|
159
|
+
// if (modelName && instance.constructor.name !== modelName) {
|
|
160
|
+
// throw new Error(
|
|
161
|
+
// `Expected model "${modelName}", got "${instance.constructor.name}"`
|
|
162
|
+
// );
|
|
163
|
+
// }
|
|
164
|
+
//
|
|
165
|
+
// return {
|
|
166
|
+
// modelName: instance.constructor.name,
|
|
167
|
+
// data: JSON.parse(instance.serialize()),
|
|
168
|
+
// isValid: !instance.hasErrors(),
|
|
169
|
+
// };
|
|
170
|
+
// } catch (error) {
|
|
171
|
+
// throw new Error(`Deserialization failed: ${error.message}`);
|
|
172
|
+
// }
|
|
173
|
+
// },
|
|
174
|
+
// });
|
|
175
|
+
//
|
|
176
|
+
// // Tool: Compare models
|
|
177
|
+
// server.addTool({
|
|
178
|
+
// name: "compare-models",
|
|
179
|
+
// description: "Compare two model instances for equality",
|
|
180
|
+
// parameters: z.object({
|
|
181
|
+
// modelName: z.string().describe("Name of the model class"),
|
|
182
|
+
// data1: z.record(z.any()).describe("First model data"),
|
|
183
|
+
// data2: z.record(z.any()).describe("Second model data"),
|
|
184
|
+
// excludeFields: z
|
|
185
|
+
// .array(z.string())
|
|
186
|
+
// .optional()
|
|
187
|
+
// .describe("Fields to exclude from comparison"),
|
|
188
|
+
// }),
|
|
189
|
+
// execute: async (args) => {
|
|
190
|
+
// const { modelName, data1, data2, excludeFields } = args;
|
|
191
|
+
//
|
|
192
|
+
// const ModelClass = modelRegistry.get(modelName) || Model.get(modelName);
|
|
193
|
+
// if (!ModelClass) {
|
|
194
|
+
// throw new Error(`Model "${modelName}" not found`);
|
|
195
|
+
// }
|
|
196
|
+
//
|
|
197
|
+
// const instance1 = new ModelClass(data1);
|
|
198
|
+
// const instance2 = new ModelClass(data2);
|
|
199
|
+
//
|
|
200
|
+
// const isEqual = excludeFields
|
|
201
|
+
// ? instance1.equals(instance2, ...excludeFields)
|
|
202
|
+
// : instance1.equals(instance2);
|
|
203
|
+
//
|
|
204
|
+
// return {
|
|
205
|
+
// isEqual,
|
|
206
|
+
// hash1: instance1.hash(),
|
|
207
|
+
// hash2: instance2.hash(),
|
|
208
|
+
// differences: isEqual ? null : await findDifferences(instance1, instance2),
|
|
209
|
+
// };
|
|
210
|
+
// },
|
|
211
|
+
// });
|
|
212
|
+
//
|
|
213
|
+
// // Tool: List available decorators
|
|
214
|
+
// server.addTool({
|
|
215
|
+
// name: "list-decorators",
|
|
216
|
+
// description: "List all available validation decorators",
|
|
217
|
+
// parameters: z.object({
|
|
218
|
+
// category: z
|
|
219
|
+
// .enum(["basic", "type-specific", "comparison", "all"])
|
|
220
|
+
// .optional()
|
|
221
|
+
// .default("all"),
|
|
222
|
+
// }),
|
|
223
|
+
// execute: async (args) => {
|
|
224
|
+
// const { category } = args;
|
|
225
|
+
//
|
|
226
|
+
// const decorators = {
|
|
227
|
+
// basic: [
|
|
228
|
+
// {
|
|
229
|
+
// name: "required",
|
|
230
|
+
// description: "Marks field as required",
|
|
231
|
+
// args: ["message?"],
|
|
232
|
+
// },
|
|
233
|
+
// {
|
|
234
|
+
// name: "min",
|
|
235
|
+
// description: "Minimum value validation",
|
|
236
|
+
// args: ["value", "message?"],
|
|
237
|
+
// },
|
|
238
|
+
// {
|
|
239
|
+
// name: "max",
|
|
240
|
+
// description: "Maximum value validation",
|
|
241
|
+
// args: ["value", "message?"],
|
|
242
|
+
// },
|
|
243
|
+
// {
|
|
244
|
+
// name: "minlength",
|
|
245
|
+
// description: "Minimum length validation",
|
|
246
|
+
// args: ["length", "message?"],
|
|
247
|
+
// },
|
|
248
|
+
// {
|
|
249
|
+
// name: "maxlength",
|
|
250
|
+
// description: "Maximum length validation",
|
|
251
|
+
// args: ["length", "message?"],
|
|
252
|
+
// },
|
|
253
|
+
// {
|
|
254
|
+
// name: "pattern",
|
|
255
|
+
// description: "Regex pattern validation",
|
|
256
|
+
// args: ["pattern", "message?"],
|
|
257
|
+
// },
|
|
258
|
+
// {
|
|
259
|
+
// name: "step",
|
|
260
|
+
// description: "Step value validation",
|
|
261
|
+
// args: ["step", "message?"],
|
|
262
|
+
// },
|
|
263
|
+
// ],
|
|
264
|
+
// "type-specific": [
|
|
265
|
+
// {
|
|
266
|
+
// name: "email",
|
|
267
|
+
// description: "Email format validation",
|
|
268
|
+
// args: ["message?"],
|
|
269
|
+
// },
|
|
270
|
+
// {
|
|
271
|
+
// name: "url",
|
|
272
|
+
// description: "URL format validation",
|
|
273
|
+
// args: ["message?"],
|
|
274
|
+
// },
|
|
275
|
+
// {
|
|
276
|
+
// name: "date",
|
|
277
|
+
// description: "Date format validation",
|
|
278
|
+
// args: ["format?", "message?"],
|
|
279
|
+
// },
|
|
280
|
+
// {
|
|
281
|
+
// name: "password",
|
|
282
|
+
// description: "Password strength validation",
|
|
283
|
+
// args: ["message?"],
|
|
284
|
+
// },
|
|
285
|
+
// {
|
|
286
|
+
// name: "type",
|
|
287
|
+
// description: "Type validation",
|
|
288
|
+
// args: ["type", "message?"],
|
|
289
|
+
// },
|
|
290
|
+
// {
|
|
291
|
+
// name: "list",
|
|
292
|
+
// description: "Array validation",
|
|
293
|
+
// args: ["itemType", "message?"],
|
|
294
|
+
// },
|
|
295
|
+
// {
|
|
296
|
+
// name: "set",
|
|
297
|
+
// description: "Set validation",
|
|
298
|
+
// args: ["itemType", "message?"],
|
|
299
|
+
// },
|
|
300
|
+
// ],
|
|
301
|
+
// comparison: [
|
|
302
|
+
// {
|
|
303
|
+
// name: "eq",
|
|
304
|
+
// description: "Equal to another field",
|
|
305
|
+
// args: ["fieldName", "message?"],
|
|
306
|
+
// },
|
|
307
|
+
// {
|
|
308
|
+
// name: "diff",
|
|
309
|
+
// description: "Different from another field",
|
|
310
|
+
// args: ["fieldName", "message?"],
|
|
311
|
+
// },
|
|
312
|
+
// {
|
|
313
|
+
// name: "lt",
|
|
314
|
+
// description: "Less than another field",
|
|
315
|
+
// args: ["fieldName", "message?"],
|
|
316
|
+
// },
|
|
317
|
+
// {
|
|
318
|
+
// name: "lte",
|
|
319
|
+
// description: "Less than or equal to another field",
|
|
320
|
+
// args: ["fieldName", "message?"],
|
|
321
|
+
// },
|
|
322
|
+
// {
|
|
323
|
+
// name: "gt",
|
|
324
|
+
// description: "Greater than another field",
|
|
325
|
+
// args: ["fieldName", "message?"],
|
|
326
|
+
// },
|
|
327
|
+
// {
|
|
328
|
+
// name: "gte",
|
|
329
|
+
// description: "Greater than or equal to another field",
|
|
330
|
+
// args: ["fieldName", "message?"],
|
|
331
|
+
// },
|
|
332
|
+
// ],
|
|
333
|
+
// };
|
|
334
|
+
//
|
|
335
|
+
// if (category === "all") {
|
|
336
|
+
// return {
|
|
337
|
+
// categories: decorators,
|
|
338
|
+
// total: Object.values(decorators).reduce(
|
|
339
|
+
// (sum, arr) => sum + arr.length,
|
|
340
|
+
// 0
|
|
341
|
+
// ),
|
|
342
|
+
// };
|
|
343
|
+
// }
|
|
344
|
+
//
|
|
345
|
+
// return {
|
|
346
|
+
// category,
|
|
347
|
+
// decorators: decorators[category] || [],
|
|
348
|
+
// count: decorators[category]?.length || 0,
|
|
349
|
+
// };
|
|
350
|
+
// },
|
|
351
|
+
// });
|
|
352
|
+
//
|
|
353
|
+
// // Utility function to get decorator function by name
|
|
354
|
+
// function getDecoratorFunction(name: string): Function | null {
|
|
355
|
+
// const decoratorMap = {
|
|
356
|
+
// required,
|
|
357
|
+
// email,
|
|
358
|
+
// min,
|
|
359
|
+
// max,
|
|
360
|
+
// minlength,
|
|
361
|
+
// maxlength,
|
|
362
|
+
// pattern,
|
|
363
|
+
// url,
|
|
364
|
+
// date,
|
|
365
|
+
// password,
|
|
366
|
+
// list,
|
|
367
|
+
// set,
|
|
368
|
+
// eq,
|
|
369
|
+
// diff,
|
|
370
|
+
// lt,
|
|
371
|
+
// lte,
|
|
372
|
+
// gt,
|
|
373
|
+
// gte,
|
|
374
|
+
// type,
|
|
375
|
+
// step,
|
|
376
|
+
// };
|
|
377
|
+
// return decoratorMap[name] || null;
|
|
378
|
+
// }
|
|
379
|
+
//
|
|
380
|
+
// // Utility function to find differences between models
|
|
381
|
+
// async function findDifferences(instance1: any, instance2: any): Promise<any[]> {
|
|
382
|
+
// const differences = [];
|
|
383
|
+
// const serialized1 = JSON.parse(instance1.serialize());
|
|
384
|
+
// const serialized2 = JSON.parse(instance2.serialize());
|
|
385
|
+
//
|
|
386
|
+
// for (const key in serialized1) {
|
|
387
|
+
// if (serialized1[key] !== serialized2[key]) {
|
|
388
|
+
// differences.push({
|
|
389
|
+
// field: key,
|
|
390
|
+
// value1: serialized1[key],
|
|
391
|
+
// value2: serialized2[key],
|
|
392
|
+
// });
|
|
393
|
+
// }
|
|
394
|
+
// }
|
|
395
|
+
//
|
|
396
|
+
// return differences;
|
|
397
|
+
// }
|
|
398
|
+
//
|
|
399
|
+
// // Start the server
|
|
400
|
+
// server.start({
|
|
401
|
+
// transportType: "stdio",
|
|
402
|
+
// });
|
|
403
|
+
//
|
|
404
|
+
// export { server };
|
|
405
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoibWNwMS5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uL3NyYy9tY3AvbWNwMS50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEscUNBQXFDO0FBQ3JDLDJCQUEyQjtBQUMzQixnREFBZ0Q7QUFDaEQsaUVBQWlFO0FBQ2pFLG9DQUFvQztBQUNwQyxXQUFXO0FBQ1gsV0FBVztBQUNYLFNBQVM7QUFDVCxlQUFlO0FBQ2YsU0FBUztBQUNULGVBQWU7QUFDZixhQUFhO0FBQ2IsY0FBYztBQUNkLDBCQUEwQjtBQUMxQiw4REFBOEQ7QUFDOUQsRUFBRTtBQUNGLDZEQUE2RDtBQUM3RCx3Q0FBd0M7QUFDeEMseUJBQXlCO0FBQ3pCLDhCQUE4QjtBQUM5QixjQUFjO0FBQ2QsRUFBRTtBQUNGLCtCQUErQjtBQUMvQiwrQkFBK0I7QUFDL0IscUNBQXFDO0FBQ3JDLGtCQUFrQjtBQUNsQixzQkFBc0I7QUFDdEIsTUFBTTtBQUNOLEVBQUU7QUFDRixpREFBaUQ7QUFDakQsZ0RBQWdEO0FBQ2hELEVBQUU7QUFDRixxQ0FBcUM7QUFDckMsbUJBQW1CO0FBQ25CLDRCQUE0QjtBQUM1QixxRUFBcUU7QUFDckUsMkJBQTJCO0FBQzNCLGlFQUFpRTtBQUNqRSw0REFBNEQ7QUFDNUQsaUJBQWlCO0FBQ2pCLGtCQUFrQjtBQUNsQixnRkFBZ0Y7QUFDaEYsV0FBVztBQUNYLHFCQUFxQjtBQUNyQixRQUFRO0FBQ1IsK0JBQStCO0FBQy9CLGlEQUFpRDtBQUNqRCxFQUFFO0FBQ0YsK0VBQStFO0FBQy9FLHlCQUF5QjtBQUN6QiwyREFBMkQ7QUFDM0QsUUFBUTtBQUNSLEVBQUU7QUFDRixZQUFZO0FBQ1osK0NBQStDO0FBQy9DLDZDQUE2QztBQUM3QyxFQUFFO0FBQ0YsaUJBQWlCO0FBQ2pCLDRCQUE0QjtBQUM1QixrQ0FBa0M7QUFDbEMsK0RBQStEO0FBQy9ELFdBQVc7QUFDWCx3QkFBd0I7QUFDeEIsaUJBQWlCO0FBQ2pCLDBCQUEwQjtBQUMxQixnREFBZ0Q7QUFD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QUFXO0FBQ1gsWUFBWTtBQUNaLFlBQVk7QUFDWixPQUFPO0FBQ1AsdUNBQXVDO0FBQ3ZDLElBQUk7QUFDSixFQUFFO0FBQ0YseURBQXlEO0FBQ3pELG1GQUFtRjtBQUNuRiw0QkFBNEI7QUFDNUIsMkRBQTJEO0FBQzNELDJEQUEyRDtBQUMzRCxFQUFFO0FBQ0YscUNBQXFDO0FBQ3JDLG1EQUFtRDtBQUNuRCwyQkFBMkI7QUFDM0Isc0JBQXNCO0FBQ3RCLG9DQUFvQztBQUNwQyxvQ0FBb0M7QUFDcEMsWUFBWTtBQUNaLFFBQVE7QUFDUixNQUFNO0FBQ04sRUFBRTtBQUNGLHdCQUF3QjtBQUN4QixJQUFJO0FBQ0osRUFBRTtBQUNGLHNCQUFzQjtBQUN0QixpQkFBaUI7QUFDakIsNEJBQTRCO0FBQzVCLE1BQU07QUFDTixFQUFFO0FBQ0YscUJBQXFCIiwic291cmNlc0NvbnRlbnQiOlsiLy8gaW1wb3J0IHsgRmFzdE1DUCB9IGZyb20gXCJmYXN0bWNwXCI7XG4vLyBpbXBvcnQgeyB6IH0gZnJvbSBcInpvZFwiO1xuLy8gaW1wb3J0IHsgdmVyc2lvbiB9IGZyb20gXCIuLi8uLi9wYWNrYWdlLmpzb25cIjtcbi8vIGltcG9ydCB7IE1vZGVsQ29udGV4dFByb3RvY29sIH0gZnJvbSBcIi4vTW9kZWxDb250ZXh0UHJvdG9jb2xcIjtcbi8vIGltcG9ydCB7IE1vZGVsIH0gZnJvbSBcIi4uL21vZGVsXCI7XG4vLyBpbXBvcnQge1xuLy8gICBlbWFpbCxcbi8vICAgbWF4LFxuLy8gICBtYXhsZW5ndGgsXG4vLyAgIG1pbixcbi8vICAgbWlubGVuZ3RoLFxuLy8gICBwYXR0ZXJuLFxuLy8gICByZXF1aXJlZCxcbi8vIH0gZnJvbSBcIi4uL3ZhbGlkYXRpb25cIjtcbi8vIGltcG9ydCB7IGNyZWF0ZU1vZGVsVG9vbCB9IGZyb20gXCIuL3Rvb2xzL2NyZWF0ZU1vZGVsLnRvb2xcIjtcbi8vXG4vLyBjb25zdCBEZWNvcmF0b3JWYWxpZGF0b25NQ1AgPSBNb2RlbENvbnRleHRQcm90b2NvbC5idWlsZGVyXG4vLyAgIC5zZXROYW1lKFwiZGVjYWYtdmFsaWRhdGlvbi1zZXJ2ZXJcIilcbi8vICAgLnNldFZlcnNpb24odmVyc2lvbilcbi8vICAgLmFkZFRvb2woY3JlYXRlTW9kZWxUb29sKVxuLy8gICAuYnVpbGQoKTtcbi8vXG4vLyAvLyBJbml0aWFsaXplIEZhc3RNQ1Agc2VydmVyXG4vLyBjb25zdCBzZXJ2ZXIgPSBuZXcgRmFzdE1DUCh7XG4vLyAgIG5hbWU6IFwiZGVjYWYtdmFsaWRhdGlvbi1zZXJ2ZXJcIixcbi8vICAgLy8gQHRzLWlnbm9yZVxuLy8gICB2ZXJzaW9uOiB2ZXJzaW9uLFxuLy8gfSk7XG4vL1xuLy8gLy8gTW9kZWwgcmVnaXN0cnkgZm9yIGR5bmFtaWMgbW9kZWwgbWFuYWdlbWVudFxuLy8gY29uc3QgbW9kZWxSZWdpc3RyeSA9IG5ldyBNYXA8c3RyaW5nLCBhbnk+KCk7XG4vL1xuLy8gLy8gVG9vbDogVmFsaWRhdGUgYSBtb2RlbCBpbnN0YW5jZVxuLy8gc2VydmVyLmFkZFRvb2woe1xuLy8gICBuYW1lOiBcInZhbGlkYXRlLW1vZGVsXCIsXG4vLyAgIGRlc2NyaXB0aW9uOiBcIlZhbGlkYXRlIGEgbW9kZWwgaW5zdGFuY2UgYWdhaW5zdCBpdHMgZGVjb3JhdG9yc1wiLFxuLy8gICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4vLyAgICAgbW9kZWxOYW1lOiB6LnN0cmluZygpLmRlc2NyaWJlKFwiTmFtZSBvZiB0aGUgbW9kZWwgY2xhc3NcIiksXG4vLyAgICAgZGF0YTogei5yZWNvcmQoei5hbnkoKSkuZGVzY3JpYmUoXCJEYXRhIHRvIHZhbGlkYXRlXCIpLFxuLy8gICAgIG9wdGlvbnM6IHpcbi8vICAgICAgIC5vYmplY3Qoe1xuLy8gICAgICAgICBwYXJ0aWFsOiB6LmJvb2xlYW4oKS5vcHRpb25hbCgpLmRlc2NyaWJlKFwiQWxsb3cgcGFydGlhbCB2YWxpZGF0aW9uXCIpLFxuLy8gICAgICAgfSlcbi8vICAgICAgIC5vcHRpb25hbCgpLFxuLy8gICB9KSxcbi8vICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MpID0+IHtcbi8vICAgICBjb25zdCB7IG1vZGVsTmFtZSwgZGF0YSwgb3B0aW9ucyB9ID0gYXJncztcbi8vXG4vLyAgICAgY29uc3QgTW9kZWxDbGFzcyA9IG1vZGVsUmVnaXN0cnkuZ2V0KG1vZGVsTmFtZSkgfHwgTW9kZWwuZ2V0KG1vZGVsTmFtZSk7XG4vLyAgICAgaWYgKCFNb2RlbENsYXNzKSB7XG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIFwiJHttb2RlbE5hbWV9XCIgbm90IGZvdW5kYCk7XG4vLyAgICAgfVxuLy9cbi8vICAgICB0cnkge1xuLy8gICAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTW9kZWxDbGFzcyhkYXRhKTtcbi8vICAgICAgIGNvbnN0IGVycm9ycyA9IGluc3RhbmNlLmhhc0Vycm9ycygpO1xuLy9cbi8vICAgICAgIHJldHVybiB7XG4vLyAgICAgICAgIGlzVmFsaWQ6ICFlcnJvcnMsXG4vLyAgICAgICAgIGVycm9yczogZXJyb3JzIHx8IG51bGwsXG4vLyAgICAgICAgIHZhbGlkYXRlZERhdGE6IGVycm9ycyA/IG51bGwgOiBpbnN0YW5jZS5zZXJpYWxpemUoKSxcbi8vICAgICAgIH07XG4vLyAgICAgfSBjYXRjaCAoZXJyb3IpIHtcbi8vICAgICAgIHJldHVybiB7XG4vLyAgICAgICAgIGlzVmFsaWQ6IGZhbHNlLFxuLy8gICAgICAgICBlcnJvcnM6IFt7IG1lc3NhZ2U6IGVycm9yLm1lc3NhZ2UgfV0sXG4vLyAgICAgICAgIHZhbGlkYXRlZERhdGE6IG51bGwsXG4vLyAgICAgICB9O1xuLy8gICAgIH1cbi8vICAgfSxcbi8vIH0pO1xuLy9cbi8vIC8vIFRvb2w6IEdldCBtb2RlbCBzY2hlbWEgaW5mb3JtYXRpb25cbi8vIHNlcnZlci5hZGRUb29sKHtcbi8vICAgbmFtZTogXCJnZXQtbW9kZWwtc2NoZW1hXCIsXG4vLyAgIGRlc2NyaXB0aW9uOiBcIkdldCB0aGUgdmFsaWRhdGlvbiBzY2hlbWEgZm9yIGEgbW9kZWxcIixcbi8vICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuLy8gICAgIG1vZGVsTmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcIk5hbWUgb2YgdGhlIG1vZGVsIGNsYXNzXCIpLFxuLy8gICB9KSxcbi8vICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MpID0+IHtcbi8vICAgICBjb25zdCB7IG1vZGVsTmFtZSB9ID0gYXJncztcbi8vXG4vLyAgICAgY29uc3QgTW9kZWxDbGFzcyA9IG1vZGVsUmVnaXN0cnkuZ2V0KG1vZGVsTmFtZSkgfHwgTW9kZWwuZ2V0KG1vZGVsTmFtZSk7XG4vLyAgICAgaWYgKCFNb2RlbENsYXNzKSB7XG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoYE1vZGVsIFwiJHttb2RlbE5hbWV9XCIgbm90IGZvdW5kYCk7XG4vLyAgICAgfVxuLy9cbi8vICAgICAvLyBFeHRyYWN0IHZhbGlkYXRpb24gbWV0YWRhdGFcbi8vICAgICBjb25zdCBpbnN0YW5jZSA9IG5ldyBNb2RlbENsYXNzKCk7XG4vLyAgICAgY29uc3QgbWV0YWRhdGEgPSBSZWZsZWN0LmdldE1ldGFkYXRhKFwidmFsaWRhdGlvblwiLCBpbnN0YW5jZSkgfHwge307XG4vL1xuLy8gICAgIHJldHVybiB7XG4vLyAgICAgICBtb2RlbE5hbWUsXG4vLyAgICAgICBwcm9wZXJ0aWVzOiBPYmplY3Qua2V5cyhtZXRhZGF0YSkubWFwKChrZXkpID0+ICh7XG4vLyAgICAgICAgIG5hbWU6IGtleSxcbi8vICAgICAgICAgdmFsaWRhdG9yczogbWV0YWRhdGFba2V5XSB8fCBbXSxcbi8vICAgICAgIH0pKSxcbi8vICAgICAgIGNhcGFiaWxpdGllczoge1xuLy8gICAgICAgICBzZXJpYWxpemF0aW9uOiAhIWluc3RhbmNlLnNlcmlhbGl6ZSxcbi8vICAgICAgICAgaGFzaGluZzogISFpbnN0YW5jZS5oYXNoLFxuLy8gICAgICAgICBjb21wYXJpc29uOiAhIWluc3RhbmNlLmVxdWFscyxcbi8vICAgICAgIH0sXG4vLyAgICAgfTtcbi8vICAgfSxcbi8vIH0pO1xuLy9cbi8vIC8vIFRvb2w6IFNlcmlhbGl6ZSBtb2RlbFxuLy8gc2VydmVyLmFkZFRvb2woe1xuLy8gICBuYW1lOiBcInNlcmlhbGl6ZS1tb2RlbFwiLFxuLy8gICBkZXNjcmlwdGlvbjogXCJTZXJpYWxpemUgYSBtb2RlbCBpbnN0YW5jZSB0byBzdHJpbmdcIixcbi8vICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuLy8gICAgIG1vZGVsTmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcIk5hbWUgb2YgdGhlIG1vZGVsIGNsYXNzXCIpLFxuLy8gICAgIGRhdGE6IHoucmVjb3JkKHouYW55KCkpLmRlc2NyaWJlKFwiTW9kZWwgZGF0YSB0byBzZXJpYWxpemVcIiksXG4vLyAgICAgZm9ybWF0OiB6LmVudW0oW1wianNvblwiLCBcInlhbWxcIl0pLm9wdGlvbmFsKCkuZGVmYXVsdChcImpzb25cIiksXG4vLyAgIH0pLFxuLy8gICBleGVjdXRlOiBhc3luYyAoYXJncykgPT4ge1xuLy8gICAgIGNvbnN0IHsgbW9kZWxOYW1lLCBkYXRhLCBmb3JtYXQgfSA9IGFyZ3M7XG4vL1xuLy8gICAgIGNvbnN0IE1vZGVsQ2xhc3MgPSBtb2RlbFJlZ2lzdHJ5LmdldChtb2RlbE5hbWUpIHx8IE1vZGVsLmdldChtb2RlbE5hbWUpO1xuLy8gICAgIGlmICghTW9kZWxDbGFzcykge1xuLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKGBNb2RlbCBcIiR7bW9kZWxOYW1lfVwiIG5vdCBmb3VuZGApO1xuLy8gICAgIH1cbi8vXG4vLyAgICAgY29uc3QgaW5zdGFuY2UgPSBuZXcgTW9kZWxDbGFzcyhkYXRhKTtcbi8vICAgICBjb25zdCBlcnJvcnMgPSBpbnN0YW5jZS5oYXNFcnJvcnMoKTtcbi8vXG4vLyAgICAgaWYgKGVycm9ycykge1xuLy8gICAgICAgdGhyb3cgbmV3IEVycm9yKFxuLy8gICAgICAgICBgQ2Fubm90IHNlcmlhbGl6ZSBpbnZhbGlkIG1vZGVsOiAke0pTT04uc3RyaW5naWZ5KGVycm9ycyl9YFxuLy8gICAgICAgKTtcbi8vICAgICB9XG4vL1xuLy8gICAgIHJldHVybiB7XG4vLyAgICAgICBzZXJpYWxpemVkOiBpbnN0YW5jZS5zZXJpYWxpemUoKSxcbi8vICAgICAgIGZvcm1hdCxcbi8vICAgICAgIG1vZGVsTmFtZSxcbi8vICAgICB9O1xuLy8gICB9LFxuLy8gfSk7XG4vL1xuLy8gLy8gVG9vbDogRGVzZXJpYWxpemUgbW9kZWxcbi8vIHNlcnZlci5hZGRUb29sKHtcbi8vICAgbmFtZTogXCJkZXNlcmlhbGl6ZS1tb2RlbFwiLFxuLy8gICBkZXNjcmlwdGlvbjogXCJEZXNlcmlhbGl6ZSBhIHN0cmluZyB0byBtb2RlbCBpbnN0YW5jZVwiLFxuLy8gICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4vLyAgICAgc2VyaWFsaXplZERhdGE6IHouc3RyaW5nKCkuZGVzY3JpYmUoXCJTZXJpYWxpemVkIG1vZGVsIGRhdGFcIiksXG4vLyAgICAgbW9kZWxOYW1lOiB6XG4vLyAgICAgICAuc3RyaW5nKClcbi8vICAgICAgIC5vcHRpb25hbCgpXG4vLyAgICAgICAuZGVzY3JpYmUoXCJFeHBlY3RlZCBtb2RlbCBuYW1lIGZvciB2YWxpZGF0aW9uXCIpLFxuLy8gICB9KSxcbi8vICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MpID0+IHtcbi8vICAgICBjb25zdCB7IHNlcmlhbGl6ZWREYXRhLCBtb2RlbE5hbWUgfSA9IGFyZ3M7XG4vL1xuLy8gICAgIHRyeSB7XG4vLyAgICAgICBjb25zdCBpbnN0YW5jZSA9IE1vZGVsLmRlc2VyaWFsaXplKHNlcmlhbGl6ZWREYXRhKTtcbi8vXG4vLyAgICAgICBpZiAobW9kZWxOYW1lICYmIGluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUgIT09IG1vZGVsTmFtZSkge1xuLy8gICAgICAgICB0aHJvdyBuZXcgRXJyb3IoXG4vLyAgICAgICAgICAgYEV4cGVjdGVkIG1vZGVsIFwiJHttb2RlbE5hbWV9XCIsIGdvdCBcIiR7aW5zdGFuY2UuY29uc3RydWN0b3IubmFtZX1cImBcbi8vICAgICAgICAgKTtcbi8vICAgICAgIH1cbi8vXG4vLyAgICAgICByZXR1cm4ge1xuLy8gICAgICAgICBtb2RlbE5hbWU6IGluc3RhbmNlLmNvbnN0cnVjdG9yLm5hbWUsXG4vLyAgICAgICAgIGRhdGE6IEpTT04ucGFyc2UoaW5zdGFuY2Uuc2VyaWFsaXplKCkpLFxuLy8gICAgICAgICBpc1ZhbGlkOiAhaW5zdGFuY2UuaGFzRXJyb3JzKCksXG4vLyAgICAgICB9O1xuLy8gICAgIH0gY2F0Y2ggKGVycm9yKSB7XG4vLyAgICAgICB0aHJvdyBuZXcgRXJyb3IoYERlc2VyaWFsaXphdGlvbiBmYWlsZWQ6ICR7ZXJyb3IubWVzc2FnZX1gKTtcbi8vICAgICB9XG4vLyAgIH0sXG4vLyB9KTtcbi8vXG4vLyAvLyBUb29sOiBDb21wYXJlIG1vZGVsc1xuLy8gc2VydmVyLmFkZFRvb2woe1xuLy8gICBuYW1lOiBcImNvbXBhcmUtbW9kZWxzXCIsXG4vLyAgIGRlc2NyaXB0aW9uOiBcIkNvbXBhcmUgdHdvIG1vZGVsIGluc3RhbmNlcyBmb3IgZXF1YWxpdHlcIixcbi8vICAgcGFyYW1ldGVyczogei5vYmplY3Qoe1xuLy8gICAgIG1vZGVsTmFtZTogei5zdHJpbmcoKS5kZXNjcmliZShcIk5hbWUgb2YgdGhlIG1vZGVsIGNsYXNzXCIpLFxuLy8gICAgIGRhdGExOiB6LnJlY29yZCh6LmFueSgpKS5kZXNjcmliZShcIkZpcnN0IG1vZGVsIGRhdGFcIiksXG4vLyAgICAgZGF0YTI6IHoucmVjb3JkKHouYW55KCkpLmRlc2NyaWJlKFwiU2Vjb25kIG1vZGVsIGRhdGFcIiksXG4vLyAgICAgZXhjbHVkZUZpZWxkczogelxuLy8gICAgICAgLmFycmF5KHouc3RyaW5nKCkpXG4vLyAgICAgICAub3B0aW9uYWwoKVxuLy8gICAgICAgLmRlc2NyaWJlKFwiRmllbGRzIHRvIGV4Y2x1ZGUgZnJvbSBjb21wYXJpc29uXCIpLFxuLy8gICB9KSxcbi8vICAgZXhlY3V0ZTogYXN5bmMgKGFyZ3MpID0+IHtcbi8vICAgICBjb25zdCB7IG1vZGVsTmFtZSwgZGF0YTEsIGRhdGEyLCBleGNsdWRlRmllbGRzIH0gPSBhcmdzO1xuLy9cbi8vICAgICBjb25zdCBNb2RlbENsYXNzID0gbW9kZWxSZWdpc3RyeS5nZXQobW9kZWxOYW1lKSB8fCBNb2RlbC5nZXQobW9kZWxOYW1lKTtcbi8vICAgICBpZiAoIU1vZGVsQ2xhc3MpIHtcbi8vICAgICAgIHRocm93IG5ldyBFcnJvcihgTW9kZWwgXCIke21vZGVsTmFtZX1cIiBub3QgZm91bmRgKTtcbi8vICAgICB9XG4vL1xuLy8gICAgIGNvbnN0IGluc3RhbmNlMSA9IG5ldyBNb2RlbENsYXNzKGRhdGExKTtcbi8vICAgICBjb25zdCBpbnN0YW5jZTIgPSBuZXcgTW9kZWxDbGFzcyhkYXRhMik7XG4vL1xuLy8gICAgIGNvbnN0IGlzRXF1YWwgPSBleGNsdWRlRmllbGRzXG4vLyAgICAgICA/IGluc3RhbmNlMS5lcXVhbHMoaW5zdGFuY2UyLCAuLi5leGNsdWRlRmllbGRzKVxuLy8gICAgICAgOiBpbnN0YW5jZTEuZXF1YWxzKGluc3RhbmNlMik7XG4vL1xuLy8gICAgIHJldHVybiB7XG4vLyAgICAgICBpc0VxdWFsLFxuLy8gICAgICAgaGFzaDE6IGluc3RhbmNlMS5oYXNoKCksXG4vLyAgICAgICBoYXNoMjogaW5zdGFuY2UyLmhhc2goKSxcbi8vICAgICAgIGRpZmZlcmVuY2VzOiBpc0VxdWFsID8gbnVsbCA6IGF3YWl0IGZpbmREaWZmZXJlbmNlcyhpbnN0YW5jZTEsIGluc3RhbmNlMiksXG4vLyAgICAgfTtcbi8vICAgfSxcbi8vIH0pO1xuLy9cbi8vIC8vIFRvb2w6IExpc3QgYXZhaWxhYmxlIGRlY29yYXRvcnNcbi8vIHNlcnZlci5hZGRUb29sKHtcbi8vICAgbmFtZTogXCJsaXN0LWRlY29yYXRvcnNcIixcbi8vICAgZGVzY3JpcHRpb246IFwiTGlzdCBhbGwgYXZhaWxhYmxlIHZhbGlkYXRpb24gZGVjb3JhdG9yc1wiLFxuLy8gICBwYXJhbWV0ZXJzOiB6Lm9iamVjdCh7XG4vLyAgICAgY2F0ZWdvcnk6IHpcbi8vICAgICAgIC5lbnVtKFtcImJhc2ljXCIsIFwidHlwZS1zcGVjaWZpY1wiLCBcImNvbXBhcmlzb25cIiwgXCJhbGxcIl0pXG4vLyAgICAgICAub3B0aW9uYWwoKVxuLy8gICAgICAgLmRlZmF1bHQoXCJhbGxcIiksXG4vLyAgIH0pLFxuLy8gICBleGVjdXRlOiBhc3luYyAoYXJncykgPT4ge1xuLy8gICAgIGNvbnN0IHsgY2F0ZWdvcnkgfSA9IGFyZ3M7XG4vL1xuLy8gICAgIGNvbnN0IGRlY29yYXRvcnMgPSB7XG4vLyAgICAgICBiYXNpYzogW1xuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJyZXF1aXJlZFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk1hcmtzIGZpZWxkIGFzIHJlcXVpcmVkXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcIm1pblwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk1pbmltdW0gdmFsdWUgdmFsaWRhdGlvblwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcInZhbHVlXCIsIFwibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcIm1heFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk1heGltdW0gdmFsdWUgdmFsaWRhdGlvblwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcInZhbHVlXCIsIFwibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcIm1pbmxlbmd0aFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIk1pbmltdW0gbGVuZ3RoIHZhbGlkYXRpb25cIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJsZW5ndGhcIiwgXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwibWF4bGVuZ3RoXCIsXG4vLyAgICAgICAgICAgZGVzY3JpcHRpb246IFwiTWF4aW11bSBsZW5ndGggdmFsaWRhdGlvblwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcImxlbmd0aFwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJwYXR0ZXJuXCIsXG4vLyAgICAgICAgICAgZGVzY3JpcHRpb246IFwiUmVnZXggcGF0dGVybiB2YWxpZGF0aW9uXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wicGF0dGVyblwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJzdGVwXCIsXG4vLyAgICAgICAgICAgZGVzY3JpcHRpb246IFwiU3RlcCB2YWx1ZSB2YWxpZGF0aW9uXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wic3RlcFwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgXSxcbi8vICAgICAgIFwidHlwZS1zcGVjaWZpY1wiOiBbXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcImVtYWlsXCIsXG4vLyAgICAgICAgICAgZGVzY3JpcHRpb246IFwiRW1haWwgZm9ybWF0IHZhbGlkYXRpb25cIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwidXJsXCIsXG4vLyAgICAgICAgICAgZGVzY3JpcHRpb246IFwiVVJMIGZvcm1hdCB2YWxpZGF0aW9uXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcImRhdGVcIixcbi8vICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJEYXRlIGZvcm1hdCB2YWxpZGF0aW9uXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wiZm9ybWF0P1wiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJwYXNzd29yZFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlBhc3N3b3JkIHN0cmVuZ3RoIHZhbGlkYXRpb25cIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwidHlwZVwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIlR5cGUgdmFsaWRhdGlvblwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcInR5cGVcIiwgXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwibGlzdFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkFycmF5IHZhbGlkYXRpb25cIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJpdGVtVHlwZVwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJzZXRcIixcbi8vICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJTZXQgdmFsaWRhdGlvblwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcIml0ZW1UeXBlXCIsIFwibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICBdLFxuLy8gICAgICAgY29tcGFyaXNvbjogW1xuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJlcVwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkVxdWFsIHRvIGFub3RoZXIgZmllbGRcIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJmaWVsZE5hbWVcIiwgXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwiZGlmZlwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkRpZmZlcmVudCBmcm9tIGFub3RoZXIgZmllbGRcIixcbi8vICAgICAgICAgICBhcmdzOiBbXCJmaWVsZE5hbWVcIiwgXCJtZXNzYWdlP1wiXSxcbi8vICAgICAgICAgfSxcbi8vICAgICAgICAge1xuLy8gICAgICAgICAgIG5hbWU6IFwibHRcIixcbi8vICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMZXNzIHRoYW4gYW5vdGhlciBmaWVsZFwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcImZpZWxkTmFtZVwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJsdGVcIixcbi8vICAgICAgICAgICBkZXNjcmlwdGlvbjogXCJMZXNzIHRoYW4gb3IgZXF1YWwgdG8gYW5vdGhlciBmaWVsZFwiLFxuLy8gICAgICAgICAgIGFyZ3M6IFtcImZpZWxkTmFtZVwiLCBcIm1lc3NhZ2U/XCJdLFxuLy8gICAgICAgICB9LFxuLy8gICAgICAgICB7XG4vLyAgICAgICAgICAgbmFtZTogXCJndFwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkdyZWF0ZXIgdGhhbiBhbm90aGVyIGZpZWxkXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wiZmllbGROYW1lXCIsIFwibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICAgIHtcbi8vICAgICAgICAgICBuYW1lOiBcImd0ZVwiLFxuLy8gICAgICAgICAgIGRlc2NyaXB0aW9uOiBcIkdyZWF0ZXIgdGhhbiBvciBlcXVhbCB0byBhbm90aGVyIGZpZWxkXCIsXG4vLyAgICAgICAgICAgYXJnczogW1wiZmllbGROYW1lXCIsIFwibWVzc2FnZT9cIl0sXG4vLyAgICAgICAgIH0sXG4vLyAgICAgICBdLFxuLy8gICAgIH07XG4vL1xuLy8gICAgIGlmIChjYXRlZ29yeSA9PT0gXCJhbGxcIikge1xuLy8gICAgICAgcmV0dXJuIHtcbi8vICAgICAgICAgY2F0ZWdvcmllczogZGVjb3JhdG9ycyxcbi8vICAgICAgICAgdG90YWw6IE9iamVjdC52YWx1ZXMoZGVjb3JhdG9ycykucmVkdWNlKFxuLy8gICAgICAgICAgIChzdW0sIGFycikgPT4gc3VtICsgYXJyLmxlbmd0aCxcbi8vICAgICAgICAgICAwXG4vLyAgICAgICAgICksXG4vLyAgICAgICB9O1xuLy8gICAgIH1cbi8vXG4vLyAgICAgcmV0dXJuIHtcbi8vICAgICAgIGNhdGVnb3J5LFxuLy8gICAgICAgZGVjb3JhdG9yczogZGVjb3JhdG9yc1tjYXRlZ29yeV0gfHwgW10sXG4vLyAgICAgICBjb3VudDogZGVjb3JhdG9yc1tjYXRlZ29yeV0/Lmxlbmd0aCB8fCAwLFxuLy8gICAgIH07XG4vLyAgIH0sXG4vLyB9KTtcbi8vXG4vLyAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGdldCBkZWNvcmF0b3IgZnVuY3Rpb24gYnkgbmFtZVxuLy8gZnVuY3Rpb24gZ2V0RGVjb3JhdG9yRnVuY3Rpb24obmFtZTogc3RyaW5nKTogRnVuY3Rpb24gfCBudWxsIHtcbi8vICAgY29uc3QgZGVjb3JhdG9yTWFwID0ge1xuLy8gICAgIHJlcXVpcmVkLFxuLy8gICAgIGVtYWlsLFxuLy8gICAgIG1pbixcbi8vICAgICBtYXgsXG4vLyAgICAgbWlubGVuZ3RoLFxuLy8gICAgIG1heGxlbmd0aCxcbi8vICAgICBwYXR0ZXJuLFxuLy8gICAgIHVybCxcbi8vICAgICBkYXRlLFxuLy8gICAgIHBhc3N3b3JkLFxuLy8gICAgIGxpc3QsXG4vLyAgICAgc2V0LFxuLy8gICAgIGVxLFxuLy8gICAgIGRpZmYsXG4vLyAgICAgbHQsXG4vLyAgICAgbHRlLFxuLy8gICAgIGd0LFxuLy8gICAgIGd0ZSxcbi8vICAgICB0eXBlLFxuLy8gICAgIHN0ZXAsXG4vLyAgIH07XG4vLyAgIHJldHVybiBkZWNvcmF0b3JNYXBbbmFtZV0gfHwgbnVsbDtcbi8vIH1cbi8vXG4vLyAvLyBVdGlsaXR5IGZ1bmN0aW9uIHRvIGZpbmQgZGlmZmVyZW5jZXMgYmV0d2VlbiBtb2RlbHNcbi8vIGFzeW5jIGZ1bmN0aW9uIGZpbmREaWZmZXJlbmNlcyhpbnN0YW5jZTE6IGFueSwgaW5zdGFuY2UyOiBhbnkpOiBQcm9taXNlPGFueVtdPiB7XG4vLyAgIGNvbnN0IGRpZmZlcmVuY2VzID0gW107XG4vLyAgIGNvbnN0IHNlcmlhbGl6ZWQxID0gSlNPTi5wYXJzZShpbnN0YW5jZTEuc2VyaWFsaXplKCkpO1xuLy8gICBjb25zdCBzZXJpYWxpemVkMiA9IEpTT04ucGFyc2UoaW5zdGFuY2UyLnNlcmlhbGl6ZSgpKTtcbi8vXG4vLyAgIGZvciAoY29uc3Qga2V5IGluIHNlcmlhbGl6ZWQxKSB7XG4vLyAgICAgaWYgKHNlcmlhbGl6ZWQxW2tleV0gIT09IHNlcmlhbGl6ZWQyW2tleV0pIHtcbi8vICAgICAgIGRpZmZlcmVuY2VzLnB1c2goe1xuLy8gICAgICAgICBmaWVsZDoga2V5LFxuLy8gICAgICAgICB2YWx1ZTE6IHNlcmlhbGl6ZWQxW2tleV0sXG4vLyAgICAgICAgIHZhbHVlMjogc2VyaWFsaXplZDJba2V5XSxcbi8vICAgICAgIH0pO1xuLy8gICAgIH1cbi8vICAgfVxuLy9cbi8vICAgcmV0dXJuIGRpZmZlcmVuY2VzO1xuLy8gfVxuLy9cbi8vIC8vIFN0YXJ0IHRoZSBzZXJ2ZXJcbi8vIHNlcnZlci5zdGFydCh7XG4vLyAgIHRyYW5zcG9ydFR5cGU6IFwic3RkaW9cIixcbi8vIH0pO1xuLy9cbi8vIGV4cG9ydCB7IHNlcnZlciB9O1xuIl19
|
|
File without changes
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
// import { z } from "zod/index";
|
|
3
|
+
// import { hashedBy, Model, ModelArg, serializedBy } from "../../model";
|
|
4
|
+
// import { Tool, ToolParameters } from "fastmcp";
|
|
5
|
+
//
|
|
6
|
+
// export const createModelParameters = z
|
|
7
|
+
// .array(
|
|
8
|
+
// z.object({
|
|
9
|
+
// name: z.string(),
|
|
10
|
+
// type: z.enum(["string", "number", "boolean", "Date"]),
|
|
11
|
+
// decorators: z.array(
|
|
12
|
+
// z.object({
|
|
13
|
+
// name: z.string(),
|
|
14
|
+
// args: z.array(z.any()).optional(),
|
|
15
|
+
// })
|
|
16
|
+
// ),
|
|
17
|
+
// })
|
|
18
|
+
// )
|
|
19
|
+
// .describe("Model properties with their decorators");
|
|
20
|
+
//
|
|
21
|
+
// type T = z.infer<typeof createModelParameters> & ToolParameters;
|
|
22
|
+
//
|
|
23
|
+
// export const createModelTool: Tool<undefined, T> = {
|
|
24
|
+
// name: "create-model",
|
|
25
|
+
// description: "Create a new model class with validation decorators",
|
|
26
|
+
// parameters: createModelParameters,
|
|
27
|
+
// execute: async (args: T) => {
|
|
28
|
+
// const { name, properties, options } = args;
|
|
29
|
+
//
|
|
30
|
+
// // Create dynamic model class
|
|
31
|
+
// const dynamicModel = class extends Model {
|
|
32
|
+
// constructor(data?: ModelArg<typeof dynamicModel>) {
|
|
33
|
+
// super(data);
|
|
34
|
+
// Model.fromModel(this, data);
|
|
35
|
+
// }
|
|
36
|
+
// };
|
|
37
|
+
//
|
|
38
|
+
// // Apply model-level decorators
|
|
39
|
+
// if (options?.hashAlgorithm) {
|
|
40
|
+
// hashedBy(options.hashAlgorithm)(dynamicModel);
|
|
41
|
+
// }
|
|
42
|
+
// if (options?.serializer) {
|
|
43
|
+
// serializedBy(options.serializer)(dynamicModel);
|
|
44
|
+
// }
|
|
45
|
+
//
|
|
46
|
+
// // Apply property decorators
|
|
47
|
+
// properties.forEach((prop) => {
|
|
48
|
+
// prop.decorators.forEach((decorator) => {
|
|
49
|
+
// const decoratorFn = getDecoratorFunction(decorator.name);
|
|
50
|
+
// if (decoratorFn) {
|
|
51
|
+
// decoratorFn(...(decorator.args || []))(
|
|
52
|
+
// dynamicModel.prototype,
|
|
53
|
+
// prop.name
|
|
54
|
+
// );
|
|
55
|
+
// }
|
|
56
|
+
// });
|
|
57
|
+
// });
|
|
58
|
+
//
|
|
59
|
+
// // Register the model
|
|
60
|
+
// Object.defineProperty(dynamicModel, "name", { value: name });
|
|
61
|
+
// Model.register(dynamicModel);
|
|
62
|
+
// modelRegistry.set(name, dynamicModel);
|
|
63
|
+
//
|
|
64
|
+
// return `Model "${name}" created and registered successfully`;
|
|
65
|
+
// },
|
|
66
|
+
// };
|
|
67
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoiY3JlYXRlTW9kZWwudG9vbC5qcyIsInNvdXJjZVJvb3QiOiIiLCJzb3VyY2VzIjpbIi4uLy4uLy4uL3NyYy9tY3AvdG9vbHMvY3JlYXRlTW9kZWwudG9vbC50cyJdLCJuYW1lcyI6W10sIm1hcHBpbmdzIjoiO0FBQUEsaUNBQWlDO0FBQ2pDLHlFQUF5RTtBQUN6RSxrREFBa0Q7QUFDbEQsRUFBRTtBQUNGLHlDQUF5QztBQUN6QyxZQUFZO0FBQ1osaUJBQWlCO0FBQ2pCLDBCQUEwQjtBQUMxQiwrREFBK0Q7QUFDL0QsNkJBQTZCO0FBQzdCLHFCQUFxQjtBQUNyQiw4QkFBOEI7QUFDOUIsK0NBQStDO0FBQy9DLGFBQWE7QUFDYixXQUFXO0FBQ1gsU0FBUztBQUNULE1BQU07QUFDTix5REFBeUQ7QUFDekQsRUFBRTtBQUNGLG1FQUFtRTtBQUNuRSxFQUFFO0FBQ0YsdURBQXVEO0FBQ3ZELDBCQUEwQjtBQUMxQix3RUFBd0U7QUFDeEUsdUNBQXVDO0FBQ3ZDLGtDQUFrQztBQUNsQyxrREFBa0Q7QUFDbEQsRUFBRTtBQUNGLG9DQUFvQztBQUNwQyxpREFBaUQ7QUFDakQsNERBQTREO0FBQzVELHVCQUF1QjtBQUN2Qix1Q0FBdUM7QUFDdkMsVUFBVTtBQUNWLFNBQVM7QUFDVCxFQUFFO0FBQ0Ysc0NBQXNDO0FBQ3RDLG9DQUFvQztBQUNwQyx1REFBdUQ7QUFDdkQsUUFBUTtBQUNSLGlDQUFpQztBQUNqQyx3REFBd0Q7QUFDeEQsUUFBUTtBQUNSLEVBQUU7QUFDRixtQ0FBbUM7QUFDbkMscUNBQXFDO0FBQ3JDLGlEQUFpRDtBQUNqRCxvRUFBb0U7QUFDcEUsNkJBQTZCO0FBQzdCLG9EQUFvRDtBQUNwRCxzQ0FBc0M7QUFDdEMsd0JBQXdCO0FBQ3hCLGVBQWU7QUFDZixZQUFZO0FBQ1osWUFBWTtBQUNaLFVBQVU7QUFDVixFQUFFO0FBQ0YsNEJBQTRCO0FBQzVCLG9FQUFvRTtBQUNwRSxvQ0FBb0M7QUFDcEMsNkNBQTZDO0FBQzdDLEVBQUU7QUFDRixvRUFBb0U7QUFDcEUsT0FBTztBQUNQLEtBQUsiLCJzb3VyY2VzQ29udGVudCI6WyIvLyBpbXBvcnQgeyB6IH0gZnJvbSBcInpvZC9pbmRleFwiO1xuLy8gaW1wb3J0IHsgaGFzaGVkQnksIE1vZGVsLCBNb2RlbEFyZywgc2VyaWFsaXplZEJ5IH0gZnJvbSBcIi4uLy4uL21vZGVsXCI7XG4vLyBpbXBvcnQgeyBUb29sLCBUb29sUGFyYW1ldGVycyB9IGZyb20gXCJmYXN0bWNwXCI7XG4vL1xuLy8gZXhwb3J0IGNvbnN0IGNyZWF0ZU1vZGVsUGFyYW1ldGVycyA9IHpcbi8vICAgLmFycmF5KFxuLy8gICAgIHoub2JqZWN0KHtcbi8vICAgICAgIG5hbWU6IHouc3RyaW5nKCksXG4vLyAgICAgICB0eXBlOiB6LmVudW0oW1wic3RyaW5nXCIsIFwibnVtYmVyXCIsIFwiYm9vbGVhblwiLCBcIkRhdGVcIl0pLFxuLy8gICAgICAgZGVjb3JhdG9yczogei5hcnJheShcbi8vICAgICAgICAgei5vYmplY3Qoe1xuLy8gICAgICAgICAgIG5hbWU6IHouc3RyaW5nKCksXG4vLyAgICAgICAgICAgYXJnczogei5hcnJheSh6LmFueSgpKS5vcHRpb25hbCgpLFxuLy8gICAgICAgICB9KVxuLy8gICAgICAgKSxcbi8vICAgICB9KVxuLy8gICApXG4vLyAgIC5kZXNjcmliZShcIk1vZGVsIHByb3BlcnRpZXMgd2l0aCB0aGVpciBkZWNvcmF0b3JzXCIpO1xuLy9cbi8vIHR5cGUgVCA9IHouaW5mZXI8dHlwZW9mIGNyZWF0ZU1vZGVsUGFyYW1ldGVycz4gJiBUb29sUGFyYW1ldGVycztcbi8vXG4vLyBleHBvcnQgY29uc3QgY3JlYXRlTW9kZWxUb29sOiBUb29sPHVuZGVmaW5lZCwgVD4gPSB7XG4vLyAgIG5hbWU6IFwiY3JlYXRlLW1vZGVsXCIsXG4vLyAgIGRlc2NyaXB0aW9uOiBcIkNyZWF0ZSBhIG5ldyBtb2RlbCBjbGFzcyB3aXRoIHZhbGlkYXRpb24gZGVjb3JhdG9yc1wiLFxuLy8gICBwYXJhbWV0ZXJzOiBjcmVhdGVNb2RlbFBhcmFtZXRlcnMsXG4vLyAgIGV4ZWN1dGU6IGFzeW5jIChhcmdzOiBUKSA9PiB7XG4vLyAgICAgY29uc3QgeyBuYW1lLCBwcm9wZXJ0aWVzLCBvcHRpb25zIH0gPSBhcmdzO1xuLy9cbi8vICAgICAvLyBDcmVhdGUgZHluYW1pYyBtb2RlbCBjbGFzc1xuLy8gICAgIGNvbnN0IGR5bmFtaWNNb2RlbCA9IGNsYXNzIGV4dGVuZHMgTW9kZWwge1xuLy8gICAgICAgY29uc3RydWN0b3IoZGF0YT86IE1vZGVsQXJnPHR5cGVvZiBkeW5hbWljTW9kZWw+KSB7XG4vLyAgICAgICAgIHN1cGVyKGRhdGEpO1xuLy8gICAgICAgICBNb2RlbC5mcm9tTW9kZWwodGhpcywgZGF0YSk7XG4vLyAgICAgICB9XG4vLyAgICAgfTtcbi8vXG4vLyAgICAgLy8gQXBwbHkgbW9kZWwtbGV2ZWwgZGVjb3JhdG9yc1xuLy8gICAgIGlmIChvcHRpb25zPy5oYXNoQWxnb3JpdGhtKSB7XG4vLyAgICAgICBoYXNoZWRCeShvcHRpb25zLmhhc2hBbGdvcml0aG0pKGR5bmFtaWNNb2RlbCk7XG4vLyAgICAgfVxuLy8gICAgIGlmIChvcHRpb25zPy5zZXJpYWxpemVyKSB7XG4vLyAgICAgICBzZXJpYWxpemVkQnkob3B0aW9ucy5zZXJpYWxpemVyKShkeW5hbWljTW9kZWwpO1xuLy8gICAgIH1cbi8vXG4vLyAgICAgLy8gQXBwbHkgcHJvcGVydHkgZGVjb3JhdG9yc1xuLy8gICAgIHByb3BlcnRpZXMuZm9yRWFjaCgocHJvcCkgPT4ge1xuLy8gICAgICAgcHJvcC5kZWNvcmF0b3JzLmZvckVhY2goKGRlY29yYXRvcikgPT4ge1xuLy8gICAgICAgICBjb25zdCBkZWNvcmF0b3JGbiA9IGdldERlY29yYXRvckZ1bmN0aW9uKGRlY29yYXRvci5uYW1lKTtcbi8vICAgICAgICAgaWYgKGRlY29yYXRvckZuKSB7XG4vLyAgICAgICAgICAgZGVjb3JhdG9yRm4oLi4uKGRlY29yYXRvci5hcmdzIHx8IFtdKSkoXG4vLyAgICAgICAgICAgICBkeW5hbWljTW9kZWwucHJvdG90eXBlLFxuLy8gICAgICAgICAgICAgcHJvcC5uYW1lXG4vLyAgICAgICAgICAgKTtcbi8vICAgICAgICAgfVxuLy8gICAgICAgfSk7XG4vLyAgICAgfSk7XG4vL1xuLy8gICAgIC8vIFJlZ2lzdGVyIHRoZSBtb2RlbFxuLy8gICAgIE9iamVjdC5kZWZpbmVQcm9wZXJ0eShkeW5hbWljTW9kZWwsIFwibmFtZVwiLCB7IHZhbHVlOiBuYW1lIH0pO1xuLy8gICAgIE1vZGVsLnJlZ2lzdGVyKGR5bmFtaWNNb2RlbCk7XG4vLyAgICAgbW9kZWxSZWdpc3RyeS5zZXQobmFtZSwgZHluYW1pY01vZGVsKTtcbi8vXG4vLyAgICAgcmV0dXJuIGBNb2RlbCBcIiR7bmFtZX1cIiBjcmVhdGVkIGFuZCByZWdpc3RlcmVkIHN1Y2Nlc3NmdWxseWA7XG4vLyAgIH0sXG4vLyB9O1xuIl19
|
|
File without changes
|
|
@@ -0,0 +1,2 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidmFsaWRhdGVNb2RlbC50b29sLmpzIiwic291cmNlUm9vdCI6IiIsInNvdXJjZXMiOlsiLi4vLi4vLi4vc3JjL21jcC90b29scy92YWxpZGF0ZU1vZGVsLnRvb2wudHMiXSwibmFtZXMiOltdLCJtYXBwaW5ncyI6IiIsInNvdXJjZXNDb250ZW50IjpbIiJdfQ==
|
|
File without changes
|
|
@@ -0,0 +1,3 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
//# sourceMappingURL=data:application/json;base64,eyJ2ZXJzaW9uIjozLCJmaWxlIjoidHlwZXMuanMiLCJzb3VyY2VSb290IjoiIiwic291cmNlcyI6WyIuLi8uLi9zcmMvbWNwL3R5cGVzLnRzIl0sIm5hbWVzIjpbXSwibWFwcGluZ3MiOiIiLCJzb3VyY2VzQ29udGVudCI6WyJpbXBvcnQgeyBUb29sLCBUb29sUGFyYW1ldGVycyB9IGZyb20gXCJmYXN0bWNwXCI7XG5cbmV4cG9ydCB0eXBlIFRvb2xQYXJhbWV0ZXJzVHlwZTxcbiAgVCBleHRlbmRzIEZhc3RNQ1BTZXNzaW9uQXV0aCxcbiAgUGFyYW1zIGV4dGVuZHMgVG9vbFBhcmFtZXRlcnMsXG4+ID0gVG9vbDxULCBQYXJhbXM+O1xuXG5leHBvcnQgdHlwZSBGYXN0TUNQU2Vzc2lvbkF1dGggPSBSZWNvcmQ8c3RyaW5nLCB1bmtub3duPiB8IHVuZGVmaW5lZDtcbiJdfQ==
|