tspace-spear 1.2.5 → 1.2.6-beta.2

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 (44) hide show
  1. package/README.md +300 -26
  2. package/dist/cli/app.d.ts +1 -0
  3. package/dist/cli/app.js +24 -0
  4. package/dist/cli/app.js.map +1 -0
  5. package/dist/cli/controller.d.ts +1 -0
  6. package/dist/cli/controller.js +158 -0
  7. package/dist/cli/controller.js.map +1 -0
  8. package/dist/cli/index.d.ts +2 -0
  9. package/dist/cli/index.js +138 -0
  10. package/dist/cli/index.js.map +1 -0
  11. package/dist/lib/core/client/index.d.ts +82 -0
  12. package/dist/lib/core/client/index.js +142 -0
  13. package/dist/lib/core/client/index.js.map +1 -0
  14. package/dist/lib/core/compiler/generator.d.ts +18 -0
  15. package/dist/lib/core/compiler/generator.js +365 -0
  16. package/dist/lib/core/compiler/generator.js.map +1 -0
  17. package/dist/lib/core/compiler/index.d.ts +14 -0
  18. package/dist/lib/core/compiler/index.js +12 -0
  19. package/dist/lib/core/compiler/index.js.map +1 -0
  20. package/dist/lib/core/compiler/pre-routes.d.ts +61 -0
  21. package/dist/lib/core/compiler/pre-routes.js +18 -0
  22. package/dist/lib/core/compiler/pre-routes.js.map +1 -0
  23. package/dist/lib/core/compiler/types.d.ts +14 -0
  24. package/dist/lib/core/compiler/types.js +3 -0
  25. package/dist/lib/core/compiler/types.js.map +1 -0
  26. package/dist/lib/core/decorators/context.d.ts +50 -1
  27. package/dist/lib/core/decorators/context.js +87 -3
  28. package/dist/lib/core/decorators/context.js.map +1 -1
  29. package/dist/lib/core/decorators/swagger.d.ts +1 -1
  30. package/dist/lib/core/decorators/swagger.js +1 -1
  31. package/dist/lib/core/decorators/swagger.js.map +1 -1
  32. package/dist/lib/core/server/fast-router.js +11 -2
  33. package/dist/lib/core/server/fast-router.js.map +1 -1
  34. package/dist/lib/core/server/index.d.ts +16 -0
  35. package/dist/lib/core/server/index.js +118 -38
  36. package/dist/lib/core/server/index.js.map +1 -1
  37. package/dist/lib/core/server/parser-factory.d.ts +2 -2
  38. package/dist/lib/core/server/parser-factory.js +236 -4
  39. package/dist/lib/core/server/parser-factory.js.map +1 -1
  40. package/dist/lib/core/types/index.d.ts +13 -9
  41. package/dist/tests/e2e..test.d.ts +1 -0
  42. package/dist/tests/e2e..test.js +16 -0
  43. package/dist/tests/e2e..test.js.map +1 -0
  44. package/package.json +32 -4
@@ -0,0 +1,365 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.generateRoutes = generateRoutes;
7
+ const ts_morph_1 = require("ts-morph");
8
+ const typescript_1 = __importDefault(require("typescript"));
9
+ const fs_1 = __importDefault(require("fs"));
10
+ const path_1 = __importDefault(require("path"));
11
+ const HTTP_METHODS = {
12
+ Get: "GET",
13
+ Post: "POST",
14
+ Put: "PUT",
15
+ Patch: "PATCH",
16
+ Delete: "DELETE",
17
+ Options: "OPTIONS",
18
+ Head: "HEAD",
19
+ };
20
+ function normalizePath(p) {
21
+ return ("/" +
22
+ p
23
+ .replace(/['"`]/g, "")
24
+ .replace(/\/+/g, "/")
25
+ .replace(/\/$/, "")
26
+ .replace(/^\//, ""));
27
+ }
28
+ function splitTopLevel(input) {
29
+ const parts = [];
30
+ let current = "";
31
+ let depth = 0;
32
+ for (const char of input) {
33
+ if (char === "{")
34
+ depth++;
35
+ if (char === "}")
36
+ depth--;
37
+ if (char === ";" && depth === 0) {
38
+ parts.push(current.trim());
39
+ current = "";
40
+ continue;
41
+ }
42
+ current += char;
43
+ }
44
+ if (current.trim()) {
45
+ parts.push(current.trim());
46
+ }
47
+ return parts;
48
+ }
49
+ function parseType(type) {
50
+ type = type.trim();
51
+ if (type === "never") {
52
+ return null;
53
+ }
54
+ if (type.startsWith("Record<")) {
55
+ return {};
56
+ }
57
+ if (type.startsWith("Partial<")) {
58
+ const inner = type
59
+ .replace(/^Partial</, "")
60
+ .replace(/>$/, "");
61
+ const parsed = parseType(inner);
62
+ if (parsed &&
63
+ typeof parsed === "object" &&
64
+ !Array.isArray(parsed)) {
65
+ for (const key in parsed) {
66
+ parsed[key] =
67
+ parsed[key] + " | null";
68
+ }
69
+ }
70
+ return parsed;
71
+ }
72
+ if (type.startsWith("Promise<")) {
73
+ const inner = type
74
+ .replace(/^Promise</, "")
75
+ .replace(/>$/, "");
76
+ return parseType(inner);
77
+ }
78
+ if (type.endsWith("[]")) {
79
+ return [parseType(type.slice(0, -2))];
80
+ }
81
+ if (type.startsWith("{") &&
82
+ type.endsWith("}")) {
83
+ const result = {};
84
+ const content = type.slice(1, -1);
85
+ const fields = splitTopLevel(content)
86
+ .map((x) => x.trim())
87
+ .filter(Boolean);
88
+ for (const field of fields) {
89
+ const match = field.match(/^(\w+)(\??):\s*(.+)$/);
90
+ if (!match)
91
+ continue;
92
+ const [, key, optional, value] = match;
93
+ let parsed;
94
+ if (value === "string") {
95
+ parsed = optional
96
+ ? "string | null"
97
+ : "string";
98
+ }
99
+ else if (value === "number") {
100
+ parsed = optional
101
+ ? "number | null"
102
+ : "number";
103
+ }
104
+ else if (value === "boolean") {
105
+ parsed = optional
106
+ ? "boolean | null"
107
+ : "boolean";
108
+ }
109
+ else {
110
+ parsed = parseType(value);
111
+ }
112
+ result[key] = parsed;
113
+ }
114
+ return result;
115
+ }
116
+ if (type === "string")
117
+ return "string";
118
+ if (type === "number")
119
+ return "number";
120
+ if (type === "boolean")
121
+ return "boolean";
122
+ if (type === "date")
123
+ return "date";
124
+ if (type === "string | undefined")
125
+ return "string";
126
+ if (type === "number | undefined")
127
+ return "number";
128
+ if (type === "boolean | undefined")
129
+ return "boolean";
130
+ if (type === "date | undefined")
131
+ return "date";
132
+ if (type.includes("| undefined")) {
133
+ return type;
134
+ }
135
+ if (type.includes("| null")) {
136
+ return type;
137
+ }
138
+ if (type.includes(" | ") && !type.startsWith("{")) {
139
+ return type.replace(/"/g, "");
140
+ }
141
+ // fallback
142
+ return {
143
+ $ref: type
144
+ };
145
+ }
146
+ function resolveType(type) {
147
+ if (type.getSymbol()?.getName() === "Promise") {
148
+ type = type.getTypeArguments()[0];
149
+ }
150
+ if (type.isString())
151
+ return "string";
152
+ if (type.isNumber())
153
+ return "number";
154
+ if (type.isBoolean())
155
+ return "boolean";
156
+ if (type.isNull())
157
+ return "null";
158
+ if (type.isUndefined())
159
+ return "undefined";
160
+ if (type.isAny())
161
+ return "any";
162
+ if (type.isUnknown())
163
+ return "unknown";
164
+ if (type.isUnion())
165
+ return type.getText();
166
+ if (type.isArray()) {
167
+ const el = type.getArrayElementTypeOrThrow();
168
+ return `${resolveType(el)}[]`;
169
+ }
170
+ const props = type.getProperties();
171
+ if (props.length) {
172
+ const obj = [];
173
+ for (const prop of props) {
174
+ const decl = prop.getDeclarations()[0];
175
+ if (!decl)
176
+ continue;
177
+ const propType = prop.getTypeAtLocation(decl);
178
+ const text = propType.getText(decl);
179
+ const key = prop.getName();
180
+ let value = resolveType(propType);
181
+ if (/^\s*(\(.*\)\s*=>|function\b)/.test(value)) {
182
+ continue;
183
+ }
184
+ if (text.includes('[x: string]')) {
185
+ value = text;
186
+ }
187
+ ;
188
+ let colon = ":";
189
+ const maybeOptional = value.includes(" | undefined");
190
+ if (maybeOptional) {
191
+ value = value.replace(" | undefined", "");
192
+ colon = "?:";
193
+ }
194
+ obj.push(`${key}${colon} ${value}`);
195
+ }
196
+ return `{ ${obj.join("; ")} }`;
197
+ }
198
+ return type.getText();
199
+ }
200
+ function extractPropertyType(type, key, node) {
201
+ const prop = type.getProperty(key);
202
+ if (!prop)
203
+ return "never";
204
+ const t = prop.getTypeAtLocation(node);
205
+ const text = t.getText(node);
206
+ if (text.includes('[x: string]'))
207
+ return text;
208
+ if (!text || text.includes("undefined"))
209
+ return "never";
210
+ return resolveType(t) ?? "never";
211
+ }
212
+ async function generateRoutes(options) {
213
+ const project = new ts_morph_1.Project({
214
+ tsConfigFilePath: path_1.default.resolve(process.cwd(), "tsconfig.json"),
215
+ });
216
+ project.addSourceFilesAtPaths(path_1.default.join(options.controllers.folder, "**/*"));
217
+ const files = project.getSourceFiles();
218
+ if (!files.length) {
219
+ console.log("No controller files found");
220
+ return;
221
+ }
222
+ const routes = [];
223
+ for (const file of files) {
224
+ const filename = file.getBaseName();
225
+ if (!options.controllers.name.test(filename))
226
+ continue;
227
+ for (const cls of file.getClasses()) {
228
+ const controller = cls.getDecorator("Controller");
229
+ if (!controller)
230
+ continue;
231
+ const basePath = controller.getArguments()[0]
232
+ ?.getText()
233
+ .replace(/['"`]/g, "") || "";
234
+ for (const method of cls.getMethods()) {
235
+ for (const [decName, http] of Object.entries(HTTP_METHODS)) {
236
+ const decorator = method.getDecorator(decName);
237
+ if (!decorator)
238
+ continue;
239
+ const methodPath = decorator
240
+ .getArguments()[0]
241
+ ?.getText()
242
+ .replace(/['"`]/g, "") || "";
243
+ const fullPath = normalizePath(`${basePath}/${methodPath}`);
244
+ const response = resolveType(method.getReturnType());
245
+ let body = "never";
246
+ let params = "never";
247
+ let query = "never";
248
+ let files = "never";
249
+ const firstParam = method.getParameters()[0];
250
+ if (firstParam) {
251
+ const type = firstParam.getType();
252
+ body = extractPropertyType(type, "body", firstParam);
253
+ params = extractPropertyType(type, "params", firstParam);
254
+ query = extractPropertyType(type, "query", firstParam);
255
+ files = extractPropertyType(type, "files", firstParam);
256
+ }
257
+ routes.push({
258
+ method: http,
259
+ path: fullPath,
260
+ response,
261
+ body,
262
+ params,
263
+ query,
264
+ files,
265
+ });
266
+ }
267
+ }
268
+ }
269
+ }
270
+ const groupedTypes = routes.reduce((acc, r) => {
271
+ acc[r.path] ??= {};
272
+ acc[r.path][r.method] = {
273
+ response: r.response,
274
+ body: r.body,
275
+ params: r.params,
276
+ query: r.query,
277
+ files: r.files,
278
+ };
279
+ return acc;
280
+ }, {});
281
+ const routeMapTypes = Object.entries(groupedTypes)
282
+ .map(([path, methods]) => {
283
+ const methodBlock = Object.entries(methods)
284
+ .map(([method, c]) => `
285
+ ${method}: {
286
+ params: ${c.params}
287
+ query: ${c.query}
288
+ body: ${c.body}
289
+ files: ${c.files}
290
+ response: ${c.response}
291
+ }`).join("\n");
292
+ return `
293
+ "${path}": {
294
+ ${methodBlock}
295
+ }`;
296
+ })
297
+ .join("\n");
298
+ const formatValue = (v) => {
299
+ if (typeof v === "string")
300
+ return v;
301
+ return JSON.stringify(v);
302
+ };
303
+ const groupedValues = routes.reduce((acc, route) => {
304
+ if (!acc[route.path]) {
305
+ acc[route.path] = {};
306
+ }
307
+ acc[route.path][route.method] = {
308
+ params: parseType(route.params),
309
+ query: parseType(route.query),
310
+ body: parseType(route.body),
311
+ files: parseType(route.files),
312
+ response: parseType(route.response),
313
+ };
314
+ return acc;
315
+ }, {});
316
+ const routerMapValues = Object.entries(groupedValues)
317
+ .map(([path, methods]) => {
318
+ const methodBlock = Object.entries(methods)
319
+ .map(([method, c]) => `
320
+ ${method}: {
321
+ params: ${formatValue(c.params)},
322
+ query: ${formatValue(c.query)},
323
+ body: ${formatValue(c.body)},
324
+ files: ${formatValue(c.files)},
325
+ response: ${formatValue(c.response)}
326
+ }`).join(",\n");
327
+ return `
328
+ "${path}": {
329
+ ${methodBlock}
330
+ }`;
331
+ })
332
+ .join(",\n");
333
+ const output = `
334
+ // @ts-nocheck
335
+ // AUTO GENERATED FILE
336
+ // DO NOT EDIT
337
+
338
+ export const appRoutes = {
339
+ ${routerMapValues}
340
+ }
341
+
342
+ export interface AppRoutes {
343
+ ${routeMapTypes}
344
+ }
345
+
346
+ export type AppRoute = keyof AppRoutes
347
+ `;
348
+ const outPath = options.output
349
+ ? `${__dirname}/${options.output}/pre-routes.ts`
350
+ : `${__dirname}/pre-routes.ts`;
351
+ await fs_1.default.promises.mkdir(path_1.default.dirname(outPath), {
352
+ recursive: true,
353
+ });
354
+ await fs_1.default.promises.writeFile(outPath, output);
355
+ const compiled = typescript_1.default.transpileModule(output, {
356
+ compilerOptions: {
357
+ module: typescript_1.default.ModuleKind.CommonJS,
358
+ target: typescript_1.default.ScriptTarget.ES2020,
359
+ },
360
+ });
361
+ const jsPath = outPath.replace(/\.ts$/, ".js");
362
+ await fs_1.default.promises.writeFile(jsPath, compiled.outputText, "utf8");
363
+ return routes;
364
+ }
365
+ //# sourceMappingURL=generator.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"generator.js","sourceRoot":"","sources":["../../../../src/lib/core/compiler/generator.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,14 @@
1
+ export declare class Compiler {
2
+ generateRoutes(options: {
3
+ folder: string;
4
+ name: RegExp;
5
+ }): Promise<void | {
6
+ method: string;
7
+ path: string;
8
+ response: string;
9
+ body: string;
10
+ params: string;
11
+ query: string;
12
+ files: string;
13
+ }[] | undefined>;
14
+ }
@@ -0,0 +1,12 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.Compiler = void 0;
4
+ const generator_1 = require("./generator");
5
+ class Compiler {
6
+ async generateRoutes(options) {
7
+ return await (0, generator_1.generateRoutes)({ controllers: options })
8
+ .catch(err => console.log(err));
9
+ }
10
+ }
11
+ exports.Compiler = Compiler;
12
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../../../src/lib/core/compiler/index.ts"],"names":[],"mappings":";;;AAAA,2CAA4C;AAC5C,MAAa,QAAQ;IACV,KAAK,CAAC,cAAc,CAAE,OAG5B;QACG,OAAO,MAAM,IAAA,0BAAc,EAAC,EAAE,WAAW,EAAG,OAAO,EAAE,CAAC;aACrD,KAAK,CAAC,GAAG,CAAC,EAAE,CAAC,OAAO,CAAC,GAAG,CAAC,GAAG,CAAC,CAAC,CAAA;IACnC,CAAC;CACJ;AARD,4BAQC"}
@@ -0,0 +1,61 @@
1
+ export declare const appRoutes: {
2
+ "/cats": {
3
+ POST: {
4
+ params: null;
5
+ query: {
6
+ v: string;
7
+ };
8
+ body: {
9
+ name: string;
10
+ age: string;
11
+ };
12
+ files: null;
13
+ response: {
14
+ cat: string;
15
+ body: {
16
+ name: string;
17
+ age: string;
18
+ };
19
+ query: {
20
+ v: string;
21
+ };
22
+ cats: {
23
+ id: string;
24
+ name: string;
25
+ age: string;
26
+ }[];
27
+ };
28
+ };
29
+ };
30
+ };
31
+ export interface AppRoutes {
32
+ "/cats": {
33
+ POST: {
34
+ params: never;
35
+ query: {
36
+ v: string;
37
+ };
38
+ body: {
39
+ name: string;
40
+ age: number;
41
+ };
42
+ files: never;
43
+ response: {
44
+ cat: "cat1" | "cat2" | "cat3";
45
+ body: {
46
+ name: string;
47
+ age: number;
48
+ };
49
+ query: {
50
+ v: string;
51
+ };
52
+ cats: {
53
+ id: number;
54
+ name: string;
55
+ age: number;
56
+ }[];
57
+ };
58
+ };
59
+ };
60
+ }
61
+ export type AppRoute = keyof AppRoutes;
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ // @ts-nocheck
3
+ // AUTO GENERATED FILE
4
+ // DO NOT EDIT
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.appRoutes = void 0;
7
+ exports.appRoutes = {
8
+ "/cats": {
9
+ POST: {
10
+ params: null,
11
+ query: { "v": "string" },
12
+ body: { "name": "string", "age": "number" },
13
+ files: null,
14
+ response: { "cat": "cat1 | cat2 | cat3", "body": { "name": "string", "age": "number" }, "query": { "v": "string" }, "cats": [{ "id": "number", "name": "string", "age": "number" }] }
15
+ }
16
+ }
17
+ };
18
+ //# sourceMappingURL=pre-routes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"pre-routes.js","sourceRoot":"","sources":["../../../../src/lib/core/compiler/pre-routes.ts"],"names":[],"mappings":";AACA,cAAc;AACd,sBAAsB;AACtB,cAAc;;;AAED,QAAA,SAAS,GAAG;IAEvB,OAAO,EAAE;QAEP,IAAI,EAAE;YACJ,MAAM,EAAE,IAAI;YACZ,KAAK,EAAE,EAAC,GAAG,EAAC,QAAQ,EAAC;YACrB,IAAI,EAAE,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,QAAQ,EAAC;YACtC,KAAK,EAAE,IAAI;YACX,QAAQ,EAAE,EAAC,KAAK,EAAC,oBAAoB,EAAC,MAAM,EAAC,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,QAAQ,EAAC,EAAC,OAAO,EAAC,EAAC,GAAG,EAAC,QAAQ,EAAC,EAAC,MAAM,EAAC,CAAC,EAAC,IAAI,EAAC,QAAQ,EAAC,MAAM,EAAC,QAAQ,EAAC,KAAK,EAAC,QAAQ,EAAC,CAAC,EAAC;SAC9J;KACF;CACF,CAAA"}
@@ -0,0 +1,14 @@
1
+ export type AnyRoutes = {
2
+ [key: string]: any;
3
+ };
4
+ export type RoutesWithMethod<TRoutes extends AnyRoutes, TMethod extends string> = {
5
+ [K in keyof TRoutes]: TMethod extends keyof TRoutes[K] ? K : never;
6
+ }[keyof TRoutes];
7
+ export type ExtractFrom<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath], Key extends string> = TRoutes[TPath][TMethod] extends Record<Key, infer R> ? R : never;
8
+ export type RequestBody<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath]> = ExtractFrom<TRoutes, TPath, TMethod, "body">;
9
+ export type RequestQuery<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath]> = ExtractFrom<TRoutes, TPath, TMethod, "query">;
10
+ export type RequestParams<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath]> = ExtractFrom<TRoutes, TPath, TMethod, "params">;
11
+ export type RequestFiles<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath]> = ExtractFrom<TRoutes, TPath, TMethod, "files">;
12
+ export type ResponseType<TRoutes extends AnyRoutes, TPath extends keyof TRoutes, TMethod extends keyof TRoutes[TPath]> = TRoutes[TPath][TMethod] extends {
13
+ response: infer R;
14
+ } ? Awaited<R> : never;
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../../../../src/lib/core/compiler/types.ts"],"names":[],"mappings":""}
@@ -20,7 +20,7 @@ export declare function createContextDecorator(hook: (ctx: T.Context, next: T.Ne
20
20
  * }
21
21
  * ```
22
22
  *
23
- * @param {...string} bodyParms - Body field names to extract.
23
+ * @param {...string} keys - Body field names to extract.
24
24
  * @returns {MethodDecorator}
25
25
  */
26
26
  export declare const Body: (...keys: string[]) => MethodDecorator;
@@ -96,3 +96,52 @@ export declare const Query: (...keys: string[]) => MethodDecorator;
96
96
  * @returns {MethodDecorator}
97
97
  */
98
98
  export declare const Cookies: (...keys: string[]) => MethodDecorator;
99
+ /**
100
+ * Validates required fields from a request target.
101
+ *
102
+ * @param keys - List of required field names.
103
+ * @param options - Validation options.
104
+ * @param options.target - Request source to validate.
105
+ * Defaults to `"body"`.
106
+ *
107
+ * @param options.required - Enables required-value validation.
108
+ *
109
+ * - `true`
110
+ * - Rejects `null`
111
+ * - Rejects empty strings (`""`)
112
+ *
113
+ * - `object`
114
+ * - Allows customizing required rules.
115
+ *
116
+ * @param options.required.allowNull - Allow `null` values.
117
+ * Default: `false`
118
+ *
119
+ * @param options.required.allowEmptyString - Allow empty string values.
120
+ * Default: `false`
121
+ * @returns {MethodDecorator}
122
+ *
123
+ * @throws {Object} Throws a validation error object when
124
+ * one or more required fields are missing.
125
+ *
126
+ * @example
127
+ * ```ts
128
+ * \@Validate(["email", "password"], {
129
+ * required: {
130
+ * allowEmptyString : true,
131
+ * allowNull : false
132
+ * }
133
+ * });
134
+ * ```
135
+ *
136
+ * @example
137
+ * ```ts
138
+ * \@Validate(["id"], { target: "query" });
139
+ * ```
140
+ */
141
+ export declare const Validate: (keys: string[], { target, required }?: {
142
+ target?: "params" | "query" | "body" | "files";
143
+ required?: boolean | {
144
+ allowNull?: boolean;
145
+ allowEmptyString?: boolean;
146
+ };
147
+ }) => MethodDecorator;