@nestia/sdk 14.0.0 → 14.0.1
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/README.md +1 -1
- package/assets/bundle/distribute/package.json +2 -2
- package/assets/bundle/distribute/tsconfig.json +15 -105
- package/lib/INestiaConfig.d.ts +19 -10
- package/lib/NestiaSdkApplication.js +58 -27
- package/lib/NestiaSdkApplication.js.map +1 -1
- package/lib/NestiaSwaggerComposer.js +11 -10
- package/lib/NestiaSwaggerComposer.js.map +1 -1
- package/lib/analyses/ConfigAnalyzer.js +4 -4
- package/lib/analyses/ConfigAnalyzer.js.map +1 -1
- package/lib/analyses/ParameterNameAnalyzer.d.ts +20 -0
- package/lib/analyses/ParameterNameAnalyzer.js +48 -0
- package/lib/analyses/ParameterNameAnalyzer.js.map +1 -0
- package/lib/analyses/PathAnalyzer.d.ts +30 -0
- package/lib/analyses/PathAnalyzer.js +108 -16
- package/lib/analyses/PathAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectControllerAnalyzer.js +2 -1
- package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationAnalyzer.js +7 -7
- package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js +122 -23
- package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +5 -2
- package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectMcpOperationAnalyzer.js +5 -2
- package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -1
- package/lib/analyses/ReflectWebSocketOperationAnalyzer.js +6 -3
- package/lib/analyses/ReflectWebSocketOperationAnalyzer.js.map +1 -1
- package/lib/analyses/SecurityAnalyzer.d.ts +10 -0
- package/lib/analyses/SecurityAnalyzer.js +24 -19
- package/lib/analyses/SecurityAnalyzer.js.map +1 -1
- package/lib/analyses/SwaggerExampleAnalyzer.d.ts +15 -0
- package/lib/analyses/SwaggerExampleAnalyzer.js +20 -0
- package/lib/analyses/SwaggerExampleAnalyzer.js.map +1 -0
- package/lib/analyses/TypedHttpRouteAnalyzer.js +30 -21
- package/lib/analyses/TypedHttpRouteAnalyzer.js.map +1 -1
- package/lib/analyses/TypedWebSocketRouteAnalyzer.js +1 -1
- package/lib/analyses/TypedWebSocketRouteAnalyzer.js.map +1 -1
- package/lib/executable/internal/NestiaSdkWatcher.js +3 -3
- package/lib/executable/internal/NestiaSdkWatcher.js.map +1 -1
- package/lib/executable/sdk.js +16 -1
- package/lib/executable/sdk.js.map +1 -1
- package/lib/factories/ExpressionFactory.d.ts +3 -0
- package/lib/factories/ExpressionFactory.js +6 -2
- package/lib/factories/ExpressionFactory.js.map +1 -1
- package/lib/factories/LiteralFactory.js +3 -1
- package/lib/factories/LiteralFactory.js.map +1 -1
- package/lib/generates/SdkGenerator.js +3 -3
- package/lib/generates/SdkGenerator.js.map +1 -1
- package/lib/generates/SwaggerGenerator.js +135 -27
- package/lib/generates/SwaggerGenerator.js.map +1 -1
- package/lib/generates/internal/FilePrinter.d.ts +14 -0
- package/lib/generates/internal/FilePrinter.js +31 -0
- package/lib/generates/internal/FilePrinter.js.map +1 -1
- package/lib/generates/internal/ImportDictionary.d.ts +2 -0
- package/lib/generates/internal/ImportDictionary.js +13 -0
- package/lib/generates/internal/ImportDictionary.js.map +1 -1
- package/lib/generates/internal/SdkAliasCollection.d.ts +2 -1
- package/lib/generates/internal/SdkAliasCollection.js +8 -4
- package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
- package/lib/generates/internal/SdkDistributionComposer.js +72 -14
- package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
- package/lib/generates/internal/SdkFileProgrammer.js +83 -12
- package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpFunctionProgrammer.js +21 -23
- package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +27 -34
- package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpParameterProgrammer.d.ts +40 -1
- package/lib/generates/internal/SdkHttpParameterProgrammer.js +105 -6
- package/lib/generates/internal/SdkHttpParameterProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpRouteProgrammer.js +16 -32
- package/lib/generates/internal/SdkHttpRouteProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkHttpSimulationProgrammer.js +18 -14
- package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkMcpRouteProgrammer.js +39 -11
- package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkPathTemplate.d.ts +21 -0
- package/lib/generates/internal/SdkPathTemplate.js +50 -0
- package/lib/generates/internal/SdkPathTemplate.js.map +1 -0
- package/lib/generates/internal/SdkTypeProgrammer.js +15 -15
- package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +20 -1
- package/lib/generates/internal/SdkTypeTagProgrammer.js +386 -67
- package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +27 -36
- package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketParameterProgrammer.d.ts +35 -1
- package/lib/generates/internal/SdkWebSocketParameterProgrammer.js +72 -5
- package/lib/generates/internal/SdkWebSocketParameterProgrammer.js.map +1 -1
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +57 -33
- package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationComposer.js +19 -8
- package/lib/generates/internal/SwaggerOperationComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationParameterComposer.d.ts +1 -1
- package/lib/generates/internal/SwaggerOperationParameterComposer.js +201 -19
- package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
- package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +2 -0
- package/lib/generates/internal/SwaggerOperationResponseComposer.js +39 -7
- package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
- package/lib/internal/legacy.d.ts +49 -18
- package/lib/internal/legacy.js +84 -25
- package/lib/internal/legacy.js.map +1 -1
- package/lib/structures/IOperationMetadata.d.ts +22 -0
- package/lib/structures/IReflectHttpOperationException.d.ts +3 -2
- package/lib/structures/IReflectHttpOperationParameter.d.ts +8 -3
- package/lib/structures/IReflectHttpOperationSuccess.d.ts +4 -3
- package/lib/structures/ITypedHttpRoute.d.ts +8 -0
- package/lib/structures/ITypedHttpRouteException.d.ts +3 -1
- package/lib/structures/ITypedHttpRouteParameter.d.ts +3 -1
- package/lib/structures/ITypedHttpRouteSuccess.d.ts +3 -1
- package/lib/structures/ITypedWebSocketRoute.d.ts +8 -0
- package/lib/utils/SourceFinder.d.ts +10 -0
- package/lib/utils/SourceFinder.js +27 -4
- package/lib/utils/SourceFinder.js.map +1 -1
- package/lib/utils/VersioningStrategy.d.ts +13 -1
- package/lib/utils/VersioningStrategy.js +24 -12
- package/lib/utils/VersioningStrategy.js.map +1 -1
- package/native/go.mod +1 -1
- package/native/go.sum +2 -2
- package/native/sdk/sdk_http_rules.go +210 -0
- package/native/sdk/sdk_metadata_json.go +73 -3
- package/native/sdk/sdk_transform.go +801 -49
- package/package.json +6 -6
- package/src/INestiaConfig.ts +19 -10
- package/src/NestiaSdkApplication.ts +63 -34
- package/src/NestiaSwaggerComposer.ts +11 -8
- package/src/analyses/ConfigAnalyzer.ts +3 -3
- package/src/analyses/ParameterNameAnalyzer.ts +51 -0
- package/src/analyses/PathAnalyzer.ts +106 -14
- package/src/analyses/ReflectControllerAnalyzer.ts +2 -1
- package/src/analyses/ReflectHttpOperationAnalyzer.ts +4 -4
- package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +122 -39
- package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +6 -7
- package/src/analyses/ReflectMcpOperationAnalyzer.ts +6 -2
- package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +7 -3
- package/src/analyses/SecurityAnalyzer.ts +30 -20
- package/src/analyses/SwaggerExampleAnalyzer.ts +23 -0
- package/src/analyses/TypedHttpRouteAnalyzer.ts +29 -20
- package/src/analyses/TypedWebSocketRouteAnalyzer.ts +1 -0
- package/src/executable/internal/NestiaSdkWatcher.ts +2 -2
- package/src/executable/sdk.ts +24 -1
- package/src/factories/ExpressionFactory.ts +8 -2
- package/src/factories/LiteralFactory.ts +7 -2
- package/src/generates/SdkGenerator.ts +3 -3
- package/src/generates/SwaggerGenerator.ts +173 -32
- package/src/generates/internal/FilePrinter.ts +28 -0
- package/src/generates/internal/ImportDictionary.ts +11 -0
- package/src/generates/internal/SdkAliasCollection.ts +11 -4
- package/src/generates/internal/SdkDistributionComposer.ts +89 -15
- package/src/generates/internal/SdkFileProgrammer.ts +108 -16
- package/src/generates/internal/SdkHttpFunctionProgrammer.ts +28 -30
- package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +34 -64
- package/src/generates/internal/SdkHttpParameterProgrammer.ts +193 -13
- package/src/generates/internal/SdkHttpRouteProgrammer.ts +17 -31
- package/src/generates/internal/SdkHttpSimulationProgrammer.ts +51 -14
- package/src/generates/internal/SdkMcpRouteProgrammer.ts +112 -15
- package/src/generates/internal/SdkPathTemplate.ts +73 -0
- package/src/generates/internal/SdkTypeProgrammer.ts +19 -22
- package/src/generates/internal/SdkTypeTagProgrammer.ts +506 -78
- package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +43 -68
- package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +126 -5
- package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +71 -48
- package/src/generates/internal/SwaggerOperationComposer.ts +20 -6
- package/src/generates/internal/SwaggerOperationParameterComposer.ts +279 -30
- package/src/generates/internal/SwaggerOperationResponseComposer.ts +55 -11
- package/src/internal/legacy.ts +114 -26
- package/src/structures/IOperationMetadata.ts +28 -0
- package/src/structures/IReflectHttpOperationException.ts +7 -2
- package/src/structures/IReflectHttpOperationParameter.ts +9 -2
- package/src/structures/IReflectHttpOperationSuccess.ts +8 -3
- package/src/structures/ITypedHttpRoute.ts +8 -0
- package/src/structures/ITypedHttpRouteException.ts +4 -1
- package/src/structures/ITypedHttpRouteParameter.ts +3 -1
- package/src/structures/ITypedHttpRouteSuccess.ts +4 -1
- package/src/structures/ITypedWebSocketRoute.ts +8 -0
- package/src/utils/SourceFinder.ts +25 -4
- package/src/utils/VersioningStrategy.ts +28 -13
- package/lib/validators/HttpHeadersValidator.d.ts +0 -11
- package/lib/validators/HttpHeadersValidator.js +0 -15
- package/lib/validators/HttpHeadersValidator.js.map +0 -1
- package/lib/validators/HttpQueryValidator.d.ts +0 -10
- package/lib/validators/HttpQueryValidator.js +0 -14
- package/lib/validators/HttpQueryValidator.js.map +0 -1
- package/src/validators/HttpHeadersValidator.ts +0 -12
- package/src/validators/HttpQueryValidator.ts +0 -11
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.ParameterNameAnalyzer = void 0;
|
|
4
|
+
const utils_1 = require("@typia/utils");
|
|
5
|
+
const StringUtil_1 = require("../utils/StringUtil");
|
|
6
|
+
var ParameterNameAnalyzer;
|
|
7
|
+
(function (ParameterNameAnalyzer) {
|
|
8
|
+
/**
|
|
9
|
+
* Names every parameter that declares no name of its own.
|
|
10
|
+
*
|
|
11
|
+
* A destructured parameter, `@TypedBody() { title }: IBody`, binds names but
|
|
12
|
+
* is not one, so the SDK's metadata carries it with an empty name. Its source
|
|
13
|
+
* text is no identifier the SDK could declare, and passing it as one would
|
|
14
|
+
* send `{ title }` alone. It is named after what it carries instead: its
|
|
15
|
+
* field when that is an identifier, or reads as one with its separators
|
|
16
|
+
* dropped in camel case, otherwise its category, such as `body` or `query`.
|
|
17
|
+
* The name yields to every other parameter's, which are the user's and are
|
|
18
|
+
* kept.
|
|
19
|
+
*/
|
|
20
|
+
ParameterNameAnalyzer.name = (parameters) => {
|
|
21
|
+
const taken = parameters
|
|
22
|
+
.map((p) => p.name)
|
|
23
|
+
.filter((name) => name.length !== 0);
|
|
24
|
+
return parameters.map((p) => {
|
|
25
|
+
if (p.name.length !== 0)
|
|
26
|
+
return p;
|
|
27
|
+
const name = StringUtil_1.StringUtil.escapeDuplicate(taken)(candidate(p));
|
|
28
|
+
taken.push(name);
|
|
29
|
+
return Object.assign(Object.assign({}, p), { name });
|
|
30
|
+
});
|
|
31
|
+
};
|
|
32
|
+
const candidate = (p) => {
|
|
33
|
+
if (p.field !== undefined && p.field !== null && p.field.length !== 0) {
|
|
34
|
+
if (utils_1.NamingConvention.variable(p.field))
|
|
35
|
+
return p.field;
|
|
36
|
+
// `x-tenant` as `xTenant`
|
|
37
|
+
const camel = p.field
|
|
38
|
+
.split(/[^A-Za-z0-9_$]+/)
|
|
39
|
+
.filter((word) => word.length !== 0)
|
|
40
|
+
.map((word, i) => i === 0 ? word : word.charAt(0).toUpperCase() + word.slice(1))
|
|
41
|
+
.join("");
|
|
42
|
+
if (utils_1.NamingConvention.variable(camel))
|
|
43
|
+
return camel;
|
|
44
|
+
}
|
|
45
|
+
return p.category;
|
|
46
|
+
};
|
|
47
|
+
})(ParameterNameAnalyzer || (exports.ParameterNameAnalyzer = ParameterNameAnalyzer = {}));
|
|
48
|
+
//# sourceMappingURL=ParameterNameAnalyzer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"ParameterNameAnalyzer.js","sourceRoot":"","sources":["../../src/analyses/ParameterNameAnalyzer.ts"],"names":[],"mappings":";;;AAAA,wCAAgD;AAEhD,oDAAiD;AAEjD,IAAiB,qBAAqB,CA8CrC;AA9CD,WAAiB,qBAAqB;IAOpC;;;;;;;;;;;OAWG;IACU,0BAAI,GAAG,CAAuB,UAAe,EAAO,EAAE;QACjE,MAAM,KAAK,GAAa,UAAU;aAC/B,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC;aAClB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC,CAAC;QACvC,OAAO,UAAU,CAAC,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE;YAC1B,IAAI,CAAC,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC;YAClC,MAAM,IAAI,GAAW,uBAAU,CAAC,eAAe,CAAC,KAAK,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC;YACrE,KAAK,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC;YACjB,uCAAY,CAAC,KAAE,IAAI,IAAG;QACxB,CAAC,CAAC,CAAC;IACL,CAAC,CAAC;IAEF,MAAM,SAAS,GAAG,CAAC,CAAa,EAAU,EAAE;QAC1C,IAAI,CAAC,CAAC,KAAK,KAAK,SAAS,IAAI,CAAC,CAAC,KAAK,KAAK,IAAI,IAAI,CAAC,CAAC,KAAK,CAAC,MAAM,KAAK,CAAC,EAAE,CAAC;YACtE,IAAI,wBAAgB,CAAC,QAAQ,CAAC,CAAC,CAAC,KAAK,CAAC;gBAAE,OAAO,CAAC,CAAC,KAAK,CAAC;YACvD,0BAA0B;YAC1B,MAAM,KAAK,GAAW,CAAC,CAAC,KAAK;iBAC1B,KAAK,CAAC,iBAAiB,CAAC;iBACxB,MAAM,CAAC,CAAC,IAAI,EAAE,EAAE,CAAC,IAAI,CAAC,MAAM,KAAK,CAAC,CAAC;iBACnC,GAAG,CAAC,CAAC,IAAI,EAAE,CAAC,EAAE,EAAE,CACf,CAAC,KAAK,CAAC,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,MAAM,CAAC,CAAC,CAAC,CAAC,WAAW,EAAE,GAAG,IAAI,CAAC,KAAK,CAAC,CAAC,CAAC,CAC9D;iBACA,IAAI,CAAC,EAAE,CAAC,CAAC;YACZ,IAAI,wBAAgB,CAAC,QAAQ,CAAC,KAAK,CAAC;gBAAE,OAAO,KAAK,CAAC;QACrD,CAAC;QACD,OAAO,CAAC,CAAC,QAAQ,CAAC;IACpB,CAAC,CAAC;AACJ,CAAC,EA9CgB,qBAAqB,aAArB,qBAAqB,GAArB,qBAAqB,QA8CrC"}
|
|
@@ -1,5 +1,10 @@
|
|
|
1
1
|
import { RequestMethod } from "@nestjs/common";
|
|
2
2
|
export declare namespace PathAnalyzer {
|
|
3
|
+
/**
|
|
4
|
+
* The route paths joined as the router joins them: one `/` between them, and
|
|
5
|
+
* none doubled. A route path is router syntax, never a file path, so a
|
|
6
|
+
* backslash stays the escape of the character after it (`items\\:batchGet`).
|
|
7
|
+
*/
|
|
3
8
|
export const join: (...args: string[]) => string;
|
|
4
9
|
export const joinWithGlobalPrefix: (props: {
|
|
5
10
|
globalPrefix: string;
|
|
@@ -9,6 +14,31 @@ export declare namespace PathAnalyzer {
|
|
|
9
14
|
path: string;
|
|
10
15
|
}) => string;
|
|
11
16
|
export const escape: (str: string) => string | null;
|
|
17
|
+
/**
|
|
18
|
+
* Whether a route path holds a wildcard: a `*` not escaped as the literal
|
|
19
|
+
* character (`\\*`), which a route path may hold since #1713.
|
|
20
|
+
*/
|
|
21
|
+
export const wildcard: (str: string) => boolean;
|
|
22
|
+
/**
|
|
23
|
+
* The literal text and parameters of a path, in order, as path-to-regexp
|
|
24
|
+
* reads it: `/files/:id.json` is `/files/`, the parameter `id`, then `.json`,
|
|
25
|
+
* and `/range/:from-:to` holds two parameters parted by `-`. Every generator
|
|
26
|
+
* that writes a path with its parameters filled in reads it from here, never
|
|
27
|
+
* by splitting the text at `:` or `/`. `null` for a path it cannot parse.
|
|
28
|
+
*/
|
|
29
|
+
export const segments: (str: string) => ISegment[] | null;
|
|
30
|
+
/**
|
|
31
|
+
* The path in OpenAPI's template syntax, each parameter written `{name}`:
|
|
32
|
+
* `/files/:id.json` is `/files/{id}.json`.
|
|
33
|
+
*/
|
|
34
|
+
export const toOpenApi: (str: string) => string;
|
|
35
|
+
export type ISegment = {
|
|
36
|
+
type: "literal";
|
|
37
|
+
value: string;
|
|
38
|
+
} | {
|
|
39
|
+
type: "param";
|
|
40
|
+
name: string;
|
|
41
|
+
};
|
|
12
42
|
export const parameters: (str: string) => string[] | null;
|
|
13
43
|
interface IGlobalPrefixExclude {
|
|
14
44
|
path: string;
|
|
@@ -1,19 +1,21 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
-
var __importDefault = (this && this.__importDefault) || function (mod) {
|
|
3
|
-
return (mod && mod.__esModule) ? mod : { "default": mod };
|
|
4
|
-
};
|
|
5
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
6
3
|
exports.PathAnalyzer = void 0;
|
|
7
4
|
const common_1 = require("@nestjs/common");
|
|
8
|
-
const path_1 = __importDefault(require("path"));
|
|
9
5
|
const path_to_regexp_1 = require("path-to-regexp");
|
|
10
6
|
var PathAnalyzer;
|
|
11
7
|
(function (PathAnalyzer) {
|
|
8
|
+
/**
|
|
9
|
+
* The route paths joined as the router joins them: one `/` between them, and
|
|
10
|
+
* none doubled. A route path is router syntax, never a file path, so a
|
|
11
|
+
* backslash stays the escape of the character after it (`items\\:batchGet`).
|
|
12
|
+
*/
|
|
12
13
|
PathAnalyzer.join = (...args) => "/" +
|
|
13
|
-
|
|
14
|
-
.join(
|
|
15
|
-
.split("
|
|
16
|
-
.
|
|
14
|
+
args
|
|
15
|
+
.join("/")
|
|
16
|
+
.split("/")
|
|
17
|
+
.filter((str) => str.length !== 0)
|
|
18
|
+
.join("/");
|
|
17
19
|
PathAnalyzer.joinWithGlobalPrefix = (props) => { var _a; return PathAnalyzer.join(isGlobalPrefixExcluded(props.exclude, (_a = props.excludePath) !== null && _a !== void 0 ? _a : props.path, props.method)
|
|
18
20
|
? ""
|
|
19
21
|
: props.globalPrefix, props.path); };
|
|
@@ -26,21 +28,77 @@ var PathAnalyzer;
|
|
|
26
28
|
.map((arg) => (arg.type === "param" ? `:${arg.value}` : arg.value))
|
|
27
29
|
.join("/"));
|
|
28
30
|
};
|
|
31
|
+
/**
|
|
32
|
+
* Whether a route path holds a wildcard: a `*` not escaped as the literal
|
|
33
|
+
* character (`\\*`), which a route path may hold since #1713.
|
|
34
|
+
*/
|
|
35
|
+
PathAnalyzer.wildcard = (str) => /(^|[^\\])\*/.test(str);
|
|
36
|
+
/**
|
|
37
|
+
* The literal text and parameters of a path, in order, as path-to-regexp
|
|
38
|
+
* reads it: `/files/:id.json` is `/files/`, the parameter `id`, then `.json`,
|
|
39
|
+
* and `/range/:from-:to` holds two parameters parted by `-`. Every generator
|
|
40
|
+
* that writes a path with its parameters filled in reads it from here, never
|
|
41
|
+
* by splitting the text at `:` or `/`. `null` for a path it cannot parse.
|
|
42
|
+
*/
|
|
43
|
+
PathAnalyzer.segments = (str) => {
|
|
44
|
+
const tokens = _Tokenize(str);
|
|
45
|
+
if (tokens === null)
|
|
46
|
+
return null;
|
|
47
|
+
const output = [];
|
|
48
|
+
const literal = (value) => {
|
|
49
|
+
if (value.length === 0)
|
|
50
|
+
return;
|
|
51
|
+
const last = output[output.length - 1];
|
|
52
|
+
if ((last === null || last === void 0 ? void 0 : last.type) === "literal")
|
|
53
|
+
last.value += value;
|
|
54
|
+
else
|
|
55
|
+
output.push({ type: "literal", value });
|
|
56
|
+
};
|
|
57
|
+
for (const token of tokens)
|
|
58
|
+
if (typeof token === "string")
|
|
59
|
+
literal(token);
|
|
60
|
+
else if (typeof token.name === "number")
|
|
61
|
+
return null;
|
|
62
|
+
else {
|
|
63
|
+
literal(token.prefix);
|
|
64
|
+
output.push({ type: "param", name: token.name });
|
|
65
|
+
literal(token.suffix);
|
|
66
|
+
}
|
|
67
|
+
return output;
|
|
68
|
+
};
|
|
69
|
+
/**
|
|
70
|
+
* The path in OpenAPI's template syntax, each parameter written `{name}`:
|
|
71
|
+
* `/files/:id.json` is `/files/{id}.json`.
|
|
72
|
+
*/
|
|
73
|
+
PathAnalyzer.toOpenApi = (str) => {
|
|
74
|
+
const list = PathAnalyzer.segments(str);
|
|
75
|
+
return list === null
|
|
76
|
+
? str
|
|
77
|
+
: list
|
|
78
|
+
.map((s) => (s.type === "literal" ? s.value : `{${s.name}}`))
|
|
79
|
+
.join("");
|
|
80
|
+
};
|
|
29
81
|
PathAnalyzer.parameters = (str) => {
|
|
30
82
|
const args = _Parse(str);
|
|
31
83
|
if (args === null)
|
|
32
84
|
return null;
|
|
33
85
|
return args.filter((arg) => arg.type === "param").map((arg) => arg.value);
|
|
34
86
|
};
|
|
87
|
+
/**
|
|
88
|
+
* The route's tokens, its literal text unescaped. Both routers' spellings of
|
|
89
|
+
* a literal colon are read: path-to-regexp's (Express) `\\:`, and
|
|
90
|
+
* find-my-way's (Fastify) `::`, which path-to-regexp would reject.
|
|
91
|
+
*/
|
|
92
|
+
function _Tokenize(str) {
|
|
93
|
+
try {
|
|
94
|
+
return (0, path_to_regexp_1.parse)(fromFastifyColons(PathAnalyzer.join(str)));
|
|
95
|
+
}
|
|
96
|
+
catch (_a) {
|
|
97
|
+
return null;
|
|
98
|
+
}
|
|
99
|
+
}
|
|
35
100
|
function _Parse(str) {
|
|
36
|
-
const tokens = (
|
|
37
|
-
try {
|
|
38
|
-
return (0, path_to_regexp_1.parse)(path_1.default.join(str).split("\\").join("/"));
|
|
39
|
-
}
|
|
40
|
-
catch (_a) {
|
|
41
|
-
return null;
|
|
42
|
-
}
|
|
43
|
-
})();
|
|
101
|
+
const tokens = _Tokenize(str);
|
|
44
102
|
if (tokens === null)
|
|
45
103
|
return null;
|
|
46
104
|
const output = [];
|
|
@@ -96,4 +154,38 @@ const REQUEST_METHODS = {
|
|
|
96
154
|
POST: common_1.RequestMethod.POST,
|
|
97
155
|
PUT: common_1.RequestMethod.PUT,
|
|
98
156
|
};
|
|
157
|
+
/**
|
|
158
|
+
* A route with find-my-way's (Fastify) literal colon `::` spelled as
|
|
159
|
+
* path-to-regexp's `\:`. find-my-way reads `::` as a colon in static text
|
|
160
|
+
* alone: after a parameter it is part of the parameter's name, so it is left as
|
|
161
|
+
* is there, and path-to-regexp then rejects the route, as no parameter of that
|
|
162
|
+
* name is what the handler reads.
|
|
163
|
+
*
|
|
164
|
+
* @internal
|
|
165
|
+
*/
|
|
166
|
+
const fromFastifyColons = (route) => {
|
|
167
|
+
let output = "";
|
|
168
|
+
for (let i = 0; i < route.length;) {
|
|
169
|
+
if (route[i] === "\\") {
|
|
170
|
+
output += route.slice(i, i + 2);
|
|
171
|
+
i += 2;
|
|
172
|
+
}
|
|
173
|
+
else if (route.startsWith("::", i)) {
|
|
174
|
+
output += "\\:";
|
|
175
|
+
i += 2;
|
|
176
|
+
}
|
|
177
|
+
else if (route[i] === ":") {
|
|
178
|
+
const name = /^:[A-Za-z0-9_$]*/.exec(route.slice(i))[0];
|
|
179
|
+
output += name;
|
|
180
|
+
i += name.length;
|
|
181
|
+
if (route.startsWith("::", i)) {
|
|
182
|
+
output += "::";
|
|
183
|
+
i += 2;
|
|
184
|
+
}
|
|
185
|
+
}
|
|
186
|
+
else
|
|
187
|
+
output += route[i++];
|
|
188
|
+
}
|
|
189
|
+
return output;
|
|
190
|
+
};
|
|
99
191
|
//# sourceMappingURL=PathAnalyzer.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"PathAnalyzer.js","sourceRoot":"","sources":["../../src/analyses/PathAnalyzer.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"PathAnalyzer.js","sourceRoot":"","sources":["../../src/analyses/PathAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.ReflectControllerAnalyzer = void 0;
|
|
4
4
|
const constants_1 = require("@nestjs/common/constants");
|
|
5
5
|
const ArrayUtil_1 = require("../utils/ArrayUtil");
|
|
6
|
+
const PathAnalyzer_1 = require("./PathAnalyzer");
|
|
6
7
|
const ReflectHttpOperationAnalyzer_1 = require("./ReflectHttpOperationAnalyzer");
|
|
7
8
|
const ReflectMcpOperationAnalyzer_1 = require("./ReflectMcpOperationAnalyzer");
|
|
8
9
|
const ReflectMetadataAnalyzer_1 = require("./ReflectMetadataAnalyzer");
|
|
@@ -24,7 +25,7 @@ var ReflectControllerAnalyzer;
|
|
|
24
25
|
operations: [],
|
|
25
26
|
prefixes: props.controller.prefixes,
|
|
26
27
|
paths: ReflectMetadataAnalyzer_1.ReflectMetadataAnalyzer.paths(props.controller.class).filter((str) => {
|
|
27
|
-
if (
|
|
28
|
+
if (PathAnalyzer_1.PathAnalyzer.wildcard(str)) {
|
|
28
29
|
props.project.warnings.push({
|
|
29
30
|
file: props.controller.location,
|
|
30
31
|
class: props.controller.class.name,
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReflectControllerAnalyzer.js","sourceRoot":"","sources":["../../src/analyses/ReflectControllerAnalyzer.ts"],"names":[],"mappings":";;;AAAA,wDAIkC;AASlC,kDAA+C;AAC/C,iFAA8E;AAC9E,+EAA4E;AAC5E,uEAAoE;AACpE,2FAAwF;AAExF,IAAiB,yBAAyB,CAqGzC;AArGD,WAAiB,yBAAyB;IAMxC;;gEAE4D;IAC/C,iCAAO,GAAG,CAAC,KAAa,EAA6B,EAAE;;QAClE,oDAAoD;QACpD,IACE,qBAAS,CAAC,GAAG,CACX,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,EAC/C,yBAAa,EACb,yBAAa,EACb,kCAAsB,CACvB,KAAK,KAAK;YAEX,OAAO,IAAI,CAAC;QAEd,aAAa;QACb,MAAM,UAAU,GAAuB;YACrC,KAAK,EAAE,KAAK,CAAC,UAAU,CAAC,KAAK;YAC7B,IAAI,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ;YAC/B,UAAU,EAAE,EAAE;YACd,QAAQ,EAAE,KAAK,CAAC,UAAU,CAAC,QAAQ;YACnC,KAAK,EAAE,iDAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,UAAU,CAAC,KAAK,CAAC,CAAC,MAAM,CACjE,CAAC,GAAG,EAAE,EAAE;gBACN,IAAI,
|
|
1
|
+
{"version":3,"file":"ReflectControllerAnalyzer.js","sourceRoot":"","sources":["../../src/analyses/ReflectControllerAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -13,8 +13,8 @@ const ReflectMetadataAnalyzer_1 = require("./ReflectMetadataAnalyzer");
|
|
|
13
13
|
var ReflectHttpOperationAnalyzer;
|
|
14
14
|
(function (ReflectHttpOperationAnalyzer) {
|
|
15
15
|
ReflectHttpOperationAnalyzer.analyze = (props) => {
|
|
16
|
-
var _a, _b, _c, _d
|
|
17
|
-
var
|
|
16
|
+
var _a, _b, _c, _d;
|
|
17
|
+
var _e;
|
|
18
18
|
if (ArrayUtil_1.ArrayUtil.has(Reflect.getMetadataKeys(props.function), constants_1.PATH_METADATA, constants_1.METHOD_METADATA) === false)
|
|
19
19
|
return null;
|
|
20
20
|
const errors = [];
|
|
@@ -58,7 +58,7 @@ var ReflectHttpOperationAnalyzer;
|
|
|
58
58
|
name: props.name,
|
|
59
59
|
method: method === "ALL" ? "POST" : method,
|
|
60
60
|
paths: ReflectMetadataAnalyzer_1.ReflectMetadataAnalyzer.paths(props.function).filter((str) => {
|
|
61
|
-
if (
|
|
61
|
+
if (PathAnalyzer_1.PathAnalyzer.wildcard(str)) {
|
|
62
62
|
props.project.warnings.push({
|
|
63
63
|
file: props.controller.file,
|
|
64
64
|
class: props.controller.class.name,
|
|
@@ -82,7 +82,7 @@ var ReflectHttpOperationAnalyzer;
|
|
|
82
82
|
metadata: props.metadata,
|
|
83
83
|
errors,
|
|
84
84
|
}),
|
|
85
|
-
tags: (
|
|
85
|
+
tags: (_e = Reflect.getMetadata("swagger/apiUseTags", props.function)) !== null && _e !== void 0 ? _e : [],
|
|
86
86
|
imports: ImportAnalyzer_1.ImportAnalyzer.merge([
|
|
87
87
|
...props.metadata.parameters
|
|
88
88
|
.filter((x) => parameters.some((y) => x.index === y.index))
|
|
@@ -94,8 +94,8 @@ var ReflectHttpOperationAnalyzer;
|
|
|
94
94
|
].flat()),
|
|
95
95
|
description: props.metadata.description,
|
|
96
96
|
jsDocTags: props.metadata.jsDocTags,
|
|
97
|
-
operationId: (
|
|
98
|
-
.find(({ name }) => name === "operationId")) === null || _b === void 0 ? void 0 : _b.text) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.text.split(
|
|
97
|
+
operationId: (_d = (_c = (_b = props.metadata.jsDocTags
|
|
98
|
+
.find(({ name }) => name === "operationId")) === null || _b === void 0 ? void 0 : _b.text) === null || _c === void 0 ? void 0 : _c[0]) === null || _d === void 0 ? void 0 : _d.text.trim().split(/\s+/)[0],
|
|
99
99
|
extensions: ReflectMetadataAnalyzer_1.ReflectMetadataAnalyzer.extensions(props.function),
|
|
100
100
|
};
|
|
101
101
|
// VALIDATE PATH ARGUMENTS
|
|
@@ -103,7 +103,7 @@ var ReflectHttpOperationAnalyzer;
|
|
|
103
103
|
for (const metaLocation of operation.paths) {
|
|
104
104
|
// NORMALIZE LOCATION
|
|
105
105
|
const location = PathAnalyzer_1.PathAnalyzer.join(controllerLocation, metaLocation);
|
|
106
|
-
if (
|
|
106
|
+
if (PathAnalyzer_1.PathAnalyzer.wildcard(location))
|
|
107
107
|
continue;
|
|
108
108
|
// LIST UP PARAMETERS
|
|
109
109
|
const binded = PathAnalyzer_1.PathAnalyzer.parameters(location);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"ReflectHttpOperationAnalyzer.js","sourceRoot":"","sources":["../../src/analyses/ReflectHttpOperationAnalyzer.ts"],"names":[],"mappings":";;;AAAA,wDAA0E;AAC1E,+BAA8B;AAS9B,kDAA+C;AAC/C,qDAAkD;AAClD,iDAA8C;AAC9C,mGAAgG;AAChG,mGAAgG;AAChG,iGAA8F;AAC9F,uEAAoE;AAEpE,IAAiB,4BAA4B,CA2J5C;AA3JD,WAAiB,4BAA4B;IAS9B,oCAAO,GAAG,CAAC,KAAa,EAAgC,EAAE;;;QACrE,IACE,qBAAS,CAAC,GAAG,CACX,OAAO,CAAC,eAAe,CAAC,KAAK,CAAC,QAAQ,CAAC,EACvC,yBAAa,EACb,2BAAe,CAChB,KAAK,KAAK;YAEX,OAAO,IAAI,CAAC;QAEd,MAAM,MAAM,GAA6B,EAAE,CAAC;QAC5C,MAAM,MAAM,GACV,OAAO,CAAC,OAAO,CAAC,WAAW,CAAC,2BAAe,EAAE,KAAK,CAAC,QAAQ,CAAC,CAAE,CAAC;QACjE,IAAI,MAAM,KAAK,SAAS,IAAI,MAAM,KAAK,SAAS;YAAE,OAAO,IAAI,CAAC;QAE9D,MAAM,UAAU,GACd,6EAAqC,CAAC,OAAO,CAAC;YAC5C,UAAU,EAAE,KAAK,CAAC,UAAU;YAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,UAAU,EAAE,MAAM;YAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,YAAY,EAAE,KAAK,CAAC,IAAI;YACxB,MAAM;SACP,CAAC,CAAC;QACL,MAAM,OAAO,GAAwC,CAAC,GAAG,EAAE;YACzD,MAAM,WAAW,GAA6B,EAAE,CAAC;YACjD,MAAM,OAAO,GAAG,2EAAoC,CAAC,OAAO,CAAC;gBAC3D,UAAU,EAAE,KAAK,CAAC,UAAU;gBAC5B,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,YAAY,EAAE,KAAK,CAAC,IAAI;gBACxB,UAAU,EAAE,MAAM;gBAClB,QAAQ,EAAE,KAAK,CAAC,QAAQ;gBACxB,MAAM;aACP,CAAC,CAAC;YACH,IAAI,WAAW,CAAC,MAAM,EAAE,CAAC;gBACvB,MAAM,CAAC,IAAI,CAAC,GAAG,WAAW,CAAC,CAAC;gBAC5B,OAAO,IAAI,CAAC;YACd,CAAC;YACD,OAAO,OAAO,CAAC;QACjB,CAAC,CAAC,EAAE,CAAC;QACL,IAAI,MAAM,CAAC,MAAM,EAAE,CAAC;YAClB,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC;YACrC,OAAO,IAAI,CAAC;QACd,CAAC;aAAM,IAAI,OAAO,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAEzC,eAAe;QACf,MAAM,SAAS,GAA0B;YACvC,QAAQ,EAAE,MAAM;YAChB,QAAQ,EAAE,KAAK,CAAC,QAAQ;YACxB,IAAI,EAAE,KAAK,CAAC,IAAI;YAChB,MAAM,EAAE,MAAM,KAAK,KAAK,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,MAAM;YAC1C,KAAK,EAAE,iDAAuB,CAAC,KAAK,CAAC,KAAK,CAAC,QAAQ,CAAC,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE;gBAClE,IAAI,
|
|
1
|
+
{"version":3,"file":"ReflectHttpOperationAnalyzer.js","sourceRoot":"","sources":["../../src/analyses/ReflectHttpOperationAnalyzer.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,23 @@
|
|
|
1
1
|
"use strict";
|
|
2
|
+
var __rest = (this && this.__rest) || function (s, e) {
|
|
3
|
+
var t = {};
|
|
4
|
+
for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p) && e.indexOf(p) < 0)
|
|
5
|
+
t[p] = s[p];
|
|
6
|
+
if (s != null && typeof Object.getOwnPropertySymbols === "function")
|
|
7
|
+
for (var i = 0, p = Object.getOwnPropertySymbols(s); i < p.length; i++) {
|
|
8
|
+
if (e.indexOf(p[i]) < 0 && Object.prototype.propertyIsEnumerable.call(s, p[i]))
|
|
9
|
+
t[p[i]] = s[p[i]];
|
|
10
|
+
}
|
|
11
|
+
return t;
|
|
12
|
+
};
|
|
2
13
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
14
|
exports.ReflectHttpOperationParameterAnalyzer = void 0;
|
|
4
15
|
const constants_1 = require("@nestjs/common/constants");
|
|
5
16
|
const route_paramtypes_enum_1 = require("@nestjs/common/enums/route-paramtypes.enum");
|
|
6
17
|
const legacy_1 = require("../internal/legacy");
|
|
7
|
-
const HttpHeadersValidator_1 = require("../validators/HttpHeadersValidator");
|
|
8
|
-
const HttpQueryValidator_1 = require("../validators/HttpQueryValidator");
|
|
9
18
|
const TextPlainValidator_1 = require("../validators/TextPlainValidator");
|
|
19
|
+
const ParameterNameAnalyzer_1 = require("./ParameterNameAnalyzer");
|
|
20
|
+
const SwaggerExampleAnalyzer_1 = require("./SwaggerExampleAnalyzer");
|
|
10
21
|
var ReflectHttpOperationParameterAnalyzer;
|
|
11
22
|
(function (ReflectHttpOperationParameterAnalyzer) {
|
|
12
23
|
ReflectHttpOperationParameterAnalyzer.analyze = (ctx) => {
|
|
@@ -44,7 +55,9 @@ var ReflectHttpOperationParameterAnalyzer;
|
|
|
44
55
|
if (isUnique(preconfigured
|
|
45
56
|
.filter((x) => x.category === "headers")
|
|
46
57
|
.map((x) => x.field)
|
|
47
|
-
.filter((field) => field !== undefined)
|
|
58
|
+
.filter((field) => field !== undefined)
|
|
59
|
+
// NestJS reads `req.headers[name.toLowerCase()]`
|
|
60
|
+
.map((field) => field.toLowerCase())) === false)
|
|
48
61
|
contradict(`Duplicated field names of headers are not allowed.`);
|
|
49
62
|
if (contradictErrors.length)
|
|
50
63
|
errors.push({
|
|
@@ -57,9 +70,10 @@ var ReflectHttpOperationParameterAnalyzer;
|
|
|
57
70
|
//----
|
|
58
71
|
// COMPOSE PARAMETERS
|
|
59
72
|
//----
|
|
60
|
-
const
|
|
73
|
+
const declared = preconfigured
|
|
61
74
|
.map((p) => {
|
|
62
|
-
var _a
|
|
75
|
+
var _a;
|
|
76
|
+
var _b, _c, _d, _e;
|
|
63
77
|
// METADATA INFO
|
|
64
78
|
const pErrorContents = [];
|
|
65
79
|
const matched = ctx.metadata.parameters.find((x) => x.index === p.index);
|
|
@@ -68,7 +82,8 @@ var ReflectHttpOperationParameterAnalyzer;
|
|
|
68
82
|
file: ctx.controller.file,
|
|
69
83
|
class: ctx.controller.class.name,
|
|
70
84
|
function: ctx.functionName,
|
|
71
|
-
|
|
85
|
+
// a destructured parameter has no name to report
|
|
86
|
+
from: `parameter ${(matched === null || matched === void 0 ? void 0 : matched.name) ? JSON.stringify(matched.name) : `of ${p.index} th`}`,
|
|
72
87
|
contents: pErrorContents,
|
|
73
88
|
});
|
|
74
89
|
return null;
|
|
@@ -79,55 +94,138 @@ var ReflectHttpOperationParameterAnalyzer;
|
|
|
79
94
|
else if (matched.type === null)
|
|
80
95
|
pErrorContents.push(`Failed to get the type info.`);
|
|
81
96
|
// CONSIDER KIND
|
|
82
|
-
const
|
|
97
|
+
const pipe = (() => {
|
|
83
98
|
if (matched === undefined)
|
|
84
99
|
return null;
|
|
85
|
-
|
|
100
|
+
return p.category === "body" &&
|
|
86
101
|
(p.contentType === "application/json" || p.encrypted === true)
|
|
87
102
|
? matched.primitive
|
|
88
103
|
: matched.resolved;
|
|
89
|
-
return result.success ? result.data : null;
|
|
90
104
|
})();
|
|
105
|
+
const schema = (pipe === null || pipe === void 0 ? void 0 : pipe.success) === true ? pipe.data : null;
|
|
106
|
+
// A type the metadata analysis could not read has no SDK or Swagger
|
|
107
|
+
// form; dropping the parameter would leave a function that cannot
|
|
108
|
+
// send what the route requires.
|
|
109
|
+
if ((pipe === null || pipe === void 0 ? void 0 : pipe.success) === false)
|
|
110
|
+
pErrorContents.push(...pipe.errors);
|
|
91
111
|
if (p.category === "body" && p.field !== undefined)
|
|
92
112
|
pErrorContents.push(`@Body() must not have a field name.`);
|
|
93
113
|
else if (p.category === "param" && p.field === undefined)
|
|
94
114
|
pErrorContents.push(`@Param() must have a field name.`);
|
|
115
|
+
// The wire rules of the parameter's HTTP input: a type they reject
|
|
116
|
+
// cannot be carried as a query string, headers, a path segment, or a
|
|
117
|
+
// form, so the SDK would send garbage and the document would lie.
|
|
118
|
+
const rule = httpRuleOf(p);
|
|
119
|
+
if (rule !== null && schema !== null)
|
|
120
|
+
pErrorContents.push(...((_b = (_a = schema.http) === null || _a === void 0 ? void 0 : _a[rule]) !== null && _b !== void 0 ? _b : []));
|
|
95
121
|
if (pErrorContents.length)
|
|
96
122
|
return report();
|
|
97
123
|
else if (matched === undefined ||
|
|
98
124
|
matched.type === null ||
|
|
99
125
|
schema === null)
|
|
100
126
|
return null; // unreachable
|
|
101
|
-
const
|
|
127
|
+
const { http: _http } = schema, shape = __rest(schema, ["http"]);
|
|
128
|
+
const example = ((_c = Reflect.getMetadata("nestia/SwaggerExample/Parameters", ctx.controller.class.prototype, ctx.functionName)) !== null && _c !== void 0 ? _c : []).find((x) => x.index === matched.index);
|
|
102
129
|
// COMPOSITION
|
|
103
130
|
if (p.category === "param")
|
|
104
|
-
return Object.assign({ category: p.category, index: p.index, field: p.field, name: matched.name, type: matched.type,
|
|
131
|
+
return Object.assign({ category: p.category, index: p.index, field: p.field, name: matched.name, type: matched.type, description: matched.description, jsDocTags: matched.jsDocTags, example: example === null || example === void 0 ? void 0 : example.example, examples: SwaggerExampleAnalyzer_1.SwaggerExampleAnalyzer.examples(example) }, shape);
|
|
105
132
|
else if (p.category === "query")
|
|
106
|
-
return Object.assign({ category: p.category, index: p.index, field: (
|
|
107
|
-
? HttpQueryValidator_1.HttpQueryValidator.validate
|
|
108
|
-
: legacy_1.HttpQueryProgrammer.validate, description: matched.description, jsDocTags: matched.jsDocTags, example: example === null || example === void 0 ? void 0 : example.example, examples: example === null || example === void 0 ? void 0 : example.examples }, schema);
|
|
133
|
+
return Object.assign({ category: p.category, index: p.index, field: (_d = p.field) !== null && _d !== void 0 ? _d : null, name: matched.name, type: matched.type, description: matched.description, jsDocTags: matched.jsDocTags, example: example === null || example === void 0 ? void 0 : example.example, examples: SwaggerExampleAnalyzer_1.SwaggerExampleAnalyzer.examples(example) }, shape);
|
|
109
134
|
else if (p.category === "headers")
|
|
110
|
-
return Object.assign({ category: p.category, index: p.index, field: (
|
|
111
|
-
? HttpHeadersValidator_1.HttpHeadersValidator.validate
|
|
112
|
-
: legacy_1.HttpHeadersProgrammer.validate, description: matched.description, jsDocTags: matched.jsDocTags, example: example === null || example === void 0 ? void 0 : example.example, examples: example === null || example === void 0 ? void 0 : example.examples }, schema);
|
|
135
|
+
return Object.assign({ category: p.category, index: p.index, field: (_e = p.field) !== null && _e !== void 0 ? _e : null, name: matched.name, type: matched.type, description: matched.description, jsDocTags: matched.jsDocTags, example: example === null || example === void 0 ? void 0 : example.example, examples: SwaggerExampleAnalyzer_1.SwaggerExampleAnalyzer.examples(example) }, shape);
|
|
113
136
|
else if (p.category === "body")
|
|
114
137
|
return Object.assign({ category: p.category, index: p.index, encrypted: !!p.encrypted, contentType: p.contentType, name: matched.name, type: matched.type, validate: p.contentType === "application/json" || p.encrypted === true
|
|
115
138
|
? legacy_1.JsonMetadataFactory.validate
|
|
116
|
-
: p.contentType === "
|
|
117
|
-
?
|
|
118
|
-
:
|
|
119
|
-
? legacy_1.HttpFormDataProgrammer.validate
|
|
120
|
-
: TextPlainValidator_1.TextPlainValidator.validate, description: matched.description, jsDocTags: matched.jsDocTags, example: example === null || example === void 0 ? void 0 : example.example, examples: example === null || example === void 0 ? void 0 : example.examples }, schema);
|
|
139
|
+
: p.contentType === "text/plain"
|
|
140
|
+
? TextPlainValidator_1.TextPlainValidator.validate
|
|
141
|
+
: undefined, description: matched.description, jsDocTags: matched.jsDocTags, example: example === null || example === void 0 ? void 0 : example.example, examples: SwaggerExampleAnalyzer_1.SwaggerExampleAnalyzer.examples(example) }, shape);
|
|
121
142
|
else {
|
|
122
143
|
pErrorContents.push(`Unknown kind of the parameter.`);
|
|
123
144
|
return report();
|
|
124
145
|
}
|
|
125
146
|
})
|
|
126
147
|
.filter((x) => x !== null);
|
|
148
|
+
// a destructured parameter declares no name, so it is given one
|
|
149
|
+
const parameters = ParameterNameAnalyzer_1.ParameterNameAnalyzer.name(declared);
|
|
150
|
+
const duplicated = findDuplicatedKeys(parameters);
|
|
151
|
+
if (duplicated.length)
|
|
152
|
+
errors.push({
|
|
153
|
+
file: ctx.controller.file,
|
|
154
|
+
class: ctx.controller.class.name,
|
|
155
|
+
function: ctx.functionName,
|
|
156
|
+
from: "",
|
|
157
|
+
contents: duplicated,
|
|
158
|
+
});
|
|
127
159
|
if (errors.length)
|
|
128
160
|
ctx.errors.push(...errors);
|
|
129
161
|
return parameters;
|
|
130
162
|
};
|
|
163
|
+
/**
|
|
164
|
+
* The HTTP input rules a parameter's type must satisfy, or `null` for a JSON
|
|
165
|
+
* or text body, whose policies are checked on the TypeScript side.
|
|
166
|
+
*
|
|
167
|
+
* The rules are typia's, baked per parameter by the SDK transform (see
|
|
168
|
+
* `nestiaSDKHttpRules`), because only this analyzer knows the decorator. A
|
|
169
|
+
* typed decorator was already held to them by the core transform, so the
|
|
170
|
+
* verdict is only news for a vanilla `@Query()`, `@Headers()`, or `@Param()`,
|
|
171
|
+
* which no transform touches.
|
|
172
|
+
*/
|
|
173
|
+
const httpRuleOf = (p) => {
|
|
174
|
+
if (p.category === "param")
|
|
175
|
+
return "param";
|
|
176
|
+
else if (p.category === "query")
|
|
177
|
+
return p.field !== undefined ? "field" : "query";
|
|
178
|
+
else if (p.category === "headers")
|
|
179
|
+
return p.field !== undefined ? "field" : "headers";
|
|
180
|
+
else if (p.contentType === "application/x-www-form-urlencoded")
|
|
181
|
+
return "query";
|
|
182
|
+
else if (p.contentType === "multipart/form-data")
|
|
183
|
+
return "formData";
|
|
184
|
+
return null;
|
|
185
|
+
};
|
|
186
|
+
/**
|
|
187
|
+
* Reports a query key or header both a field parameter and the object
|
|
188
|
+
* parameter of its category declare.
|
|
189
|
+
*
|
|
190
|
+
* On the wire they are one key: NestJS hands both parameters the same
|
|
191
|
+
* `req.query.keyword`, and header names match case-insensitively, as NestJS
|
|
192
|
+
* lowercases the name a `@Headers("X-Tenant")` reads. Documenting both lists
|
|
193
|
+
* one `name` + `in` pair twice, which OpenAPI forbids, and the SDK would ask
|
|
194
|
+
* its caller for the same key twice and send one of the two values. Like two
|
|
195
|
+
* field parameters of the same name, the declaration is contradictory.
|
|
196
|
+
*/
|
|
197
|
+
const findDuplicatedKeys = (parameters) => {
|
|
198
|
+
const messages = [];
|
|
199
|
+
for (const [category, normalize, noun] of [
|
|
200
|
+
["query", (key) => key, "Query key"],
|
|
201
|
+
["headers", (key) => key.toLowerCase(), "Header"],
|
|
202
|
+
]) {
|
|
203
|
+
const fields = new Map();
|
|
204
|
+
for (const p of parameters)
|
|
205
|
+
if (p.category === category && p.field !== null)
|
|
206
|
+
fields.set(normalize(p.field), p.field);
|
|
207
|
+
for (const p of parameters) {
|
|
208
|
+
if (p.category !== category || p.field !== null)
|
|
209
|
+
continue;
|
|
210
|
+
for (const key of objectKeys(p)) {
|
|
211
|
+
const field = fields.get(normalize(key));
|
|
212
|
+
if (field !== undefined)
|
|
213
|
+
messages.push(`${noun} ${JSON.stringify(field)} is declared both by a field parameter and by the ${category} object.`);
|
|
214
|
+
}
|
|
215
|
+
}
|
|
216
|
+
}
|
|
217
|
+
return messages;
|
|
218
|
+
};
|
|
219
|
+
/** Literal property keys of an object parameter's object type. */
|
|
220
|
+
const objectKeys = (p) => {
|
|
221
|
+
var _a;
|
|
222
|
+
var _b;
|
|
223
|
+
const name = (_a = p.metadata.objects[0]) === null || _a === void 0 ? void 0 : _a.name;
|
|
224
|
+
const object = p.components.objects.find((o) => o.name === name);
|
|
225
|
+
return ((_b = object === null || object === void 0 ? void 0 : object.properties) !== null && _b !== void 0 ? _b : [])
|
|
226
|
+
.map((property) => { var _a, _b; return (_b = (_a = property.key.constants[0]) === null || _a === void 0 ? void 0 : _a.values[0]) === null || _b === void 0 ? void 0 : _b.value; })
|
|
227
|
+
.filter((key) => typeof key === "string");
|
|
228
|
+
};
|
|
131
229
|
const analyzePreconfigured = (props) => {
|
|
132
230
|
const dict = Reflect.getMetadata(constants_1.ROUTE_ARGS_METADATA, props.controller.class, props.functionName);
|
|
133
231
|
if (dict === undefined)
|
|
@@ -141,7 +239,8 @@ var ReflectHttpOperationParameterAnalyzer;
|
|
|
141
239
|
const symbol = key.split(":")[0];
|
|
142
240
|
if (symbol.indexOf("__custom") !== -1)
|
|
143
241
|
return analyzeCustomParameter(param);
|
|
144
|
-
|
|
242
|
+
// the whole number: `RAW_BODY` is 12, which the first digit misread as 1
|
|
243
|
+
const category = getNestParamType(Number(symbol));
|
|
145
244
|
if (category === null)
|
|
146
245
|
return null;
|
|
147
246
|
if (category === "body")
|