@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.
Files changed (186) hide show
  1. package/README.md +1 -1
  2. package/assets/bundle/distribute/package.json +2 -2
  3. package/assets/bundle/distribute/tsconfig.json +15 -105
  4. package/lib/INestiaConfig.d.ts +19 -10
  5. package/lib/NestiaSdkApplication.js +58 -27
  6. package/lib/NestiaSdkApplication.js.map +1 -1
  7. package/lib/NestiaSwaggerComposer.js +11 -10
  8. package/lib/NestiaSwaggerComposer.js.map +1 -1
  9. package/lib/analyses/ConfigAnalyzer.js +4 -4
  10. package/lib/analyses/ConfigAnalyzer.js.map +1 -1
  11. package/lib/analyses/ParameterNameAnalyzer.d.ts +20 -0
  12. package/lib/analyses/ParameterNameAnalyzer.js +48 -0
  13. package/lib/analyses/ParameterNameAnalyzer.js.map +1 -0
  14. package/lib/analyses/PathAnalyzer.d.ts +30 -0
  15. package/lib/analyses/PathAnalyzer.js +108 -16
  16. package/lib/analyses/PathAnalyzer.js.map +1 -1
  17. package/lib/analyses/ReflectControllerAnalyzer.js +2 -1
  18. package/lib/analyses/ReflectControllerAnalyzer.js.map +1 -1
  19. package/lib/analyses/ReflectHttpOperationAnalyzer.js +7 -7
  20. package/lib/analyses/ReflectHttpOperationAnalyzer.js.map +1 -1
  21. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js +122 -23
  22. package/lib/analyses/ReflectHttpOperationParameterAnalyzer.js.map +1 -1
  23. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js +5 -2
  24. package/lib/analyses/ReflectHttpOperationResponseAnalyzer.js.map +1 -1
  25. package/lib/analyses/ReflectMcpOperationAnalyzer.js +5 -2
  26. package/lib/analyses/ReflectMcpOperationAnalyzer.js.map +1 -1
  27. package/lib/analyses/ReflectWebSocketOperationAnalyzer.js +6 -3
  28. package/lib/analyses/ReflectWebSocketOperationAnalyzer.js.map +1 -1
  29. package/lib/analyses/SecurityAnalyzer.d.ts +10 -0
  30. package/lib/analyses/SecurityAnalyzer.js +24 -19
  31. package/lib/analyses/SecurityAnalyzer.js.map +1 -1
  32. package/lib/analyses/SwaggerExampleAnalyzer.d.ts +15 -0
  33. package/lib/analyses/SwaggerExampleAnalyzer.js +20 -0
  34. package/lib/analyses/SwaggerExampleAnalyzer.js.map +1 -0
  35. package/lib/analyses/TypedHttpRouteAnalyzer.js +30 -21
  36. package/lib/analyses/TypedHttpRouteAnalyzer.js.map +1 -1
  37. package/lib/analyses/TypedWebSocketRouteAnalyzer.js +1 -1
  38. package/lib/analyses/TypedWebSocketRouteAnalyzer.js.map +1 -1
  39. package/lib/executable/internal/NestiaSdkWatcher.js +3 -3
  40. package/lib/executable/internal/NestiaSdkWatcher.js.map +1 -1
  41. package/lib/executable/sdk.js +16 -1
  42. package/lib/executable/sdk.js.map +1 -1
  43. package/lib/factories/ExpressionFactory.d.ts +3 -0
  44. package/lib/factories/ExpressionFactory.js +6 -2
  45. package/lib/factories/ExpressionFactory.js.map +1 -1
  46. package/lib/factories/LiteralFactory.js +3 -1
  47. package/lib/factories/LiteralFactory.js.map +1 -1
  48. package/lib/generates/SdkGenerator.js +3 -3
  49. package/lib/generates/SdkGenerator.js.map +1 -1
  50. package/lib/generates/SwaggerGenerator.js +135 -27
  51. package/lib/generates/SwaggerGenerator.js.map +1 -1
  52. package/lib/generates/internal/FilePrinter.d.ts +14 -0
  53. package/lib/generates/internal/FilePrinter.js +31 -0
  54. package/lib/generates/internal/FilePrinter.js.map +1 -1
  55. package/lib/generates/internal/ImportDictionary.d.ts +2 -0
  56. package/lib/generates/internal/ImportDictionary.js +13 -0
  57. package/lib/generates/internal/ImportDictionary.js.map +1 -1
  58. package/lib/generates/internal/SdkAliasCollection.d.ts +2 -1
  59. package/lib/generates/internal/SdkAliasCollection.js +8 -4
  60. package/lib/generates/internal/SdkAliasCollection.js.map +1 -1
  61. package/lib/generates/internal/SdkDistributionComposer.js +72 -14
  62. package/lib/generates/internal/SdkDistributionComposer.js.map +1 -1
  63. package/lib/generates/internal/SdkFileProgrammer.js +83 -12
  64. package/lib/generates/internal/SdkFileProgrammer.js.map +1 -1
  65. package/lib/generates/internal/SdkHttpFunctionProgrammer.js +21 -23
  66. package/lib/generates/internal/SdkHttpFunctionProgrammer.js.map +1 -1
  67. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js +27 -34
  68. package/lib/generates/internal/SdkHttpNamespaceProgrammer.js.map +1 -1
  69. package/lib/generates/internal/SdkHttpParameterProgrammer.d.ts +40 -1
  70. package/lib/generates/internal/SdkHttpParameterProgrammer.js +105 -6
  71. package/lib/generates/internal/SdkHttpParameterProgrammer.js.map +1 -1
  72. package/lib/generates/internal/SdkHttpRouteProgrammer.js +16 -32
  73. package/lib/generates/internal/SdkHttpRouteProgrammer.js.map +1 -1
  74. package/lib/generates/internal/SdkHttpSimulationProgrammer.js +18 -14
  75. package/lib/generates/internal/SdkHttpSimulationProgrammer.js.map +1 -1
  76. package/lib/generates/internal/SdkMcpRouteProgrammer.js +39 -11
  77. package/lib/generates/internal/SdkMcpRouteProgrammer.js.map +1 -1
  78. package/lib/generates/internal/SdkPathTemplate.d.ts +21 -0
  79. package/lib/generates/internal/SdkPathTemplate.js +50 -0
  80. package/lib/generates/internal/SdkPathTemplate.js.map +1 -0
  81. package/lib/generates/internal/SdkTypeProgrammer.js +15 -15
  82. package/lib/generates/internal/SdkTypeProgrammer.js.map +1 -1
  83. package/lib/generates/internal/SdkTypeTagProgrammer.d.ts +20 -1
  84. package/lib/generates/internal/SdkTypeTagProgrammer.js +386 -67
  85. package/lib/generates/internal/SdkTypeTagProgrammer.js.map +1 -1
  86. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js +27 -36
  87. package/lib/generates/internal/SdkWebSocketNamespaceProgrammer.js.map +1 -1
  88. package/lib/generates/internal/SdkWebSocketParameterProgrammer.d.ts +35 -1
  89. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js +72 -5
  90. package/lib/generates/internal/SdkWebSocketParameterProgrammer.js.map +1 -1
  91. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js +57 -33
  92. package/lib/generates/internal/SdkWebSocketRouteProgrammer.js.map +1 -1
  93. package/lib/generates/internal/SwaggerOperationComposer.js +19 -8
  94. package/lib/generates/internal/SwaggerOperationComposer.js.map +1 -1
  95. package/lib/generates/internal/SwaggerOperationParameterComposer.d.ts +1 -1
  96. package/lib/generates/internal/SwaggerOperationParameterComposer.js +201 -19
  97. package/lib/generates/internal/SwaggerOperationParameterComposer.js.map +1 -1
  98. package/lib/generates/internal/SwaggerOperationResponseComposer.d.ts +2 -0
  99. package/lib/generates/internal/SwaggerOperationResponseComposer.js +39 -7
  100. package/lib/generates/internal/SwaggerOperationResponseComposer.js.map +1 -1
  101. package/lib/internal/legacy.d.ts +49 -18
  102. package/lib/internal/legacy.js +84 -25
  103. package/lib/internal/legacy.js.map +1 -1
  104. package/lib/structures/IOperationMetadata.d.ts +22 -0
  105. package/lib/structures/IReflectHttpOperationException.d.ts +3 -2
  106. package/lib/structures/IReflectHttpOperationParameter.d.ts +8 -3
  107. package/lib/structures/IReflectHttpOperationSuccess.d.ts +4 -3
  108. package/lib/structures/ITypedHttpRoute.d.ts +8 -0
  109. package/lib/structures/ITypedHttpRouteException.d.ts +3 -1
  110. package/lib/structures/ITypedHttpRouteParameter.d.ts +3 -1
  111. package/lib/structures/ITypedHttpRouteSuccess.d.ts +3 -1
  112. package/lib/structures/ITypedWebSocketRoute.d.ts +8 -0
  113. package/lib/utils/SourceFinder.d.ts +10 -0
  114. package/lib/utils/SourceFinder.js +27 -4
  115. package/lib/utils/SourceFinder.js.map +1 -1
  116. package/lib/utils/VersioningStrategy.d.ts +13 -1
  117. package/lib/utils/VersioningStrategy.js +24 -12
  118. package/lib/utils/VersioningStrategy.js.map +1 -1
  119. package/native/go.mod +1 -1
  120. package/native/go.sum +2 -2
  121. package/native/sdk/sdk_http_rules.go +210 -0
  122. package/native/sdk/sdk_metadata_json.go +73 -3
  123. package/native/sdk/sdk_transform.go +801 -49
  124. package/package.json +6 -6
  125. package/src/INestiaConfig.ts +19 -10
  126. package/src/NestiaSdkApplication.ts +63 -34
  127. package/src/NestiaSwaggerComposer.ts +11 -8
  128. package/src/analyses/ConfigAnalyzer.ts +3 -3
  129. package/src/analyses/ParameterNameAnalyzer.ts +51 -0
  130. package/src/analyses/PathAnalyzer.ts +106 -14
  131. package/src/analyses/ReflectControllerAnalyzer.ts +2 -1
  132. package/src/analyses/ReflectHttpOperationAnalyzer.ts +4 -4
  133. package/src/analyses/ReflectHttpOperationParameterAnalyzer.ts +122 -39
  134. package/src/analyses/ReflectHttpOperationResponseAnalyzer.ts +6 -7
  135. package/src/analyses/ReflectMcpOperationAnalyzer.ts +6 -2
  136. package/src/analyses/ReflectWebSocketOperationAnalyzer.ts +7 -3
  137. package/src/analyses/SecurityAnalyzer.ts +30 -20
  138. package/src/analyses/SwaggerExampleAnalyzer.ts +23 -0
  139. package/src/analyses/TypedHttpRouteAnalyzer.ts +29 -20
  140. package/src/analyses/TypedWebSocketRouteAnalyzer.ts +1 -0
  141. package/src/executable/internal/NestiaSdkWatcher.ts +2 -2
  142. package/src/executable/sdk.ts +24 -1
  143. package/src/factories/ExpressionFactory.ts +8 -2
  144. package/src/factories/LiteralFactory.ts +7 -2
  145. package/src/generates/SdkGenerator.ts +3 -3
  146. package/src/generates/SwaggerGenerator.ts +173 -32
  147. package/src/generates/internal/FilePrinter.ts +28 -0
  148. package/src/generates/internal/ImportDictionary.ts +11 -0
  149. package/src/generates/internal/SdkAliasCollection.ts +11 -4
  150. package/src/generates/internal/SdkDistributionComposer.ts +89 -15
  151. package/src/generates/internal/SdkFileProgrammer.ts +108 -16
  152. package/src/generates/internal/SdkHttpFunctionProgrammer.ts +28 -30
  153. package/src/generates/internal/SdkHttpNamespaceProgrammer.ts +34 -64
  154. package/src/generates/internal/SdkHttpParameterProgrammer.ts +193 -13
  155. package/src/generates/internal/SdkHttpRouteProgrammer.ts +17 -31
  156. package/src/generates/internal/SdkHttpSimulationProgrammer.ts +51 -14
  157. package/src/generates/internal/SdkMcpRouteProgrammer.ts +112 -15
  158. package/src/generates/internal/SdkPathTemplate.ts +73 -0
  159. package/src/generates/internal/SdkTypeProgrammer.ts +19 -22
  160. package/src/generates/internal/SdkTypeTagProgrammer.ts +506 -78
  161. package/src/generates/internal/SdkWebSocketNamespaceProgrammer.ts +43 -68
  162. package/src/generates/internal/SdkWebSocketParameterProgrammer.ts +126 -5
  163. package/src/generates/internal/SdkWebSocketRouteProgrammer.ts +71 -48
  164. package/src/generates/internal/SwaggerOperationComposer.ts +20 -6
  165. package/src/generates/internal/SwaggerOperationParameterComposer.ts +279 -30
  166. package/src/generates/internal/SwaggerOperationResponseComposer.ts +55 -11
  167. package/src/internal/legacy.ts +114 -26
  168. package/src/structures/IOperationMetadata.ts +28 -0
  169. package/src/structures/IReflectHttpOperationException.ts +7 -2
  170. package/src/structures/IReflectHttpOperationParameter.ts +9 -2
  171. package/src/structures/IReflectHttpOperationSuccess.ts +8 -3
  172. package/src/structures/ITypedHttpRoute.ts +8 -0
  173. package/src/structures/ITypedHttpRouteException.ts +4 -1
  174. package/src/structures/ITypedHttpRouteParameter.ts +3 -1
  175. package/src/structures/ITypedHttpRouteSuccess.ts +4 -1
  176. package/src/structures/ITypedWebSocketRoute.ts +8 -0
  177. package/src/utils/SourceFinder.ts +25 -4
  178. package/src/utils/VersioningStrategy.ts +28 -13
  179. package/lib/validators/HttpHeadersValidator.d.ts +0 -11
  180. package/lib/validators/HttpHeadersValidator.js +0 -15
  181. package/lib/validators/HttpHeadersValidator.js.map +0 -1
  182. package/lib/validators/HttpQueryValidator.d.ts +0 -10
  183. package/lib/validators/HttpQueryValidator.js +0 -14
  184. package/lib/validators/HttpQueryValidator.js.map +0 -1
  185. package/src/validators/HttpHeadersValidator.ts +0 -12
  186. 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
- _Trim(path_1.default
14
- .join(...args.filter((s) => !!s.length))
15
- .split("\\")
16
- .join("/"));
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":"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"}
1
+ {"version":3,"file":"PathAnalyzer.js","sourceRoot":"","sources":["../../src/analyses/PathAnalyzer.ts"],"names":[],"mappings":";;;AAAA,2CAA+C;AAC/C,mDAA8C;AAE9C,IAAiB,YAAY,CAiL5B;AAjLD,WAAiB,YAAY;IAC3B;;;;OAIG;IACU,iBAAI,GAAG,CAAC,GAAG,IAAc,EAAE,EAAE,CACxC,GAAG;QACH,IAAI;aACD,IAAI,CAAC,GAAG,CAAC;aACT,KAAK,CAAC,GAAG,CAAC;aACV,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,MAAM,KAAK,CAAC,CAAC;aACjC,IAAI,CAAC,GAAG,CAAC,CAAC;IAEF,iCAAoB,GAAG,CAAC,KAMpC,EAAU,EAAE,kBACX,iBAAI,CACF,sBAAsB,CACpB,KAAK,CAAC,OAAO,QACb,KAAK,CAAC,WAAW,mCAAI,KAAK,CAAC,IAAI,EAC/B,KAAK,CAAC,MAAM,CACb;QACC,CAAC,CAAC,EAAE;QACJ,CAAC,CAAC,KAAK,CAAC,YAAY,EACtB,KAAK,CAAC,IAAI,CACX,GAAA,CAAC;IAES,mBAAM,GAAG,CAAC,GAAW,EAAiB,EAAE;QACnD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,CACL,GAAG;YACH,IAAI;iBACD,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,CAAC,IAAI,GAAG,CAAC,KAAK,EAAE,CAAC,CAAC,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;iBAClE,IAAI,CAAC,GAAG,CAAC,CACb,CAAC;IACJ,CAAC,CAAC;IAEF;;;OAGG;IACU,qBAAQ,GAAG,CAAC,GAAW,EAAW,EAAE,CAAC,aAAa,CAAC,IAAI,CAAC,GAAG,CAAC,CAAC;IAE1E;;;;;;OAMG;IACU,qBAAQ,GAAG,CAAC,GAAW,EAAqB,EAAE;QACzD,MAAM,MAAM,GAAmB,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QACjC,MAAM,MAAM,GAAe,EAAE,CAAC;QAC9B,MAAM,OAAO,GAAG,CAAC,KAAa,EAAQ,EAAE;YACtC,IAAI,KAAK,CAAC,MAAM,KAAK,CAAC;gBAAE,OAAO;YAC/B,MAAM,IAAI,GAAyB,MAAM,CAAC,MAAM,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;YAC7D,IAAI,CAAA,IAAI,aAAJ,IAAI,uBAAJ,IAAI,CAAE,IAAI,MAAK,SAAS;gBAAE,IAAI,CAAC,KAAK,IAAI,KAAK,CAAC;;gBAC7C,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,SAAS,EAAE,KAAK,EAAE,CAAC,CAAC;QAC/C,CAAC,CAAC;QACF,KAAK,MAAM,KAAK,IAAI,MAAM;YACxB,IAAI,OAAO,KAAK,KAAK,QAAQ;gBAAE,OAAO,CAAC,KAAK,CAAC,CAAC;iBACzC,IAAI,OAAO,KAAK,CAAC,IAAI,KAAK,QAAQ;gBAAE,OAAO,IAAI,CAAC;iBAChD,CAAC;gBACJ,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;gBACtB,MAAM,CAAC,IAAI,CAAC,EAAE,IAAI,EAAE,OAAO,EAAE,IAAI,EAAE,KAAK,CAAC,IAAI,EAAE,CAAC,CAAC;gBACjD,OAAO,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;YACxB,CAAC;QACH,OAAO,MAAM,CAAC;IAChB,CAAC,CAAC;IAEF;;;OAGG;IACU,sBAAS,GAAG,CAAC,GAAW,EAAU,EAAE;QAC/C,MAAM,IAAI,GAAsB,qBAAQ,CAAC,GAAG,CAAC,CAAC;QAC9C,OAAO,IAAI,KAAK,IAAI;YAClB,CAAC,CAAC,GAAG;YACL,CAAC,CAAC,IAAI;iBACD,GAAG,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,CAAC,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,IAAI,GAAG,CAAC,CAAC;iBAC5D,IAAI,CAAC,EAAE,CAAC,CAAC;IAClB,CAAC,CAAC;IAMW,uBAAU,GAAG,CAAC,GAAW,EAAmB,EAAE;QACzD,MAAM,IAAI,GAAG,MAAM,CAAC,GAAG,CAAC,CAAC;QACzB,IAAI,IAAI,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAC/B,OAAO,IAAI,CAAC,MAAM,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,IAAI,KAAK,OAAO,CAAC,CAAC,GAAG,CAAC,CAAC,GAAG,EAAE,EAAE,CAAC,GAAG,CAAC,KAAK,CAAC,CAAC;IAC5E,CAAC,CAAC;IAEF;;;;OAIG;IACH,SAAS,SAAS,CAAC,GAAW;QAC5B,IAAI,CAAC;YACH,OAAO,IAAA,sBAAK,EAAC,iBAAiB,CAAC,iBAAI,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;QAC7C,CAAC;mBAAO,CAAC;YACP,OAAO,IAAI,CAAC;QACd,CAAC;IACH,CAAC;IAED,SAAS,MAAM,CAAC,GAAW;QACzB,MAAM,MAAM,GAAmB,SAAS,CAAC,GAAG,CAAC,CAAC;QAC9C,IAAI,MAAM,KAAK,IAAI;YAAE,OAAO,IAAI,CAAC;QAEjC,MAAM,MAAM,GAAgB,EAAE,CAAC;QAC/B,KAAK,MAAM,GAAG,IAAI,MAAM,EAAE,CAAC;YACzB,IAAI,OAAO,GAAG,KAAK,QAAQ;gBACzB,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,MAAM;oBACZ,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC;iBAClB,CAAC,CAAC;iBACA,IAAI,OAAO,GAAG,CAAC,IAAI,KAAK,QAAQ,IAAI,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,EAAE;gBAC7D,OAAO,IAAI,CAAC;;gBAEZ,MAAM,CAAC,IAAI,CAAC;oBACV,IAAI,EAAE,OAAO;oBACb,KAAK,EAAE,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC;iBACvB,CAAC,CAAC;QACP,CAAC;QACD,OAAO,MAAM,CAAC;IAChB,CAAC;IAED,SAAS,KAAK,CAAC,GAAW;QACxB,IAAI,GAAG,CAAC,CAAC,CAAC,KAAK,GAAG;YAAE,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,CAAC,CAAC;QAC3C,IAAI,GAAG,CAAC,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,GAAG;YAAE,GAAG,GAAG,GAAG,CAAC,SAAS,CAAC,CAAC,EAAE,GAAG,CAAC,MAAM,GAAG,CAAC,CAAC,CAAC;QACxE,OAAO,GAAG,CAAC;IACb,CAAC;IAED,SAAS,sBAAsB,CAC7B,OAA2C,EAC3C,IAAY,EACZ,MAAc;QAEd,IAAI,OAAO,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QACxC,MAAM,aAAa,GAA8B,eAAe,CAAC,MAAM,CAAC,CAAC;QACzE,IAAI,aAAa,KAAK,SAAS;YAAE,OAAO,KAAK,CAAC;QAE9C,MAAM,QAAQ,GAAW,iBAAI,CAAC,IAAI,CAAC,CAAC;QACpC,OAAO,OAAO,CAAC,IAAI,CAAC,CAAC,KAAK,EAAE,EAAE;;YAC5B,MAAM,WAAW,SACf,KAAK,CAAC,aAAa,mCAAI,KAAK,CAAC,MAAM,CAAC;YACtC,IACE,WAAW,KAAK,SAAS;gBACzB,WAAW,KAAK,sBAAa,CAAC,GAAG;gBACjC,WAAW,KAAK,aAAa;gBAE7B,OAAO,KAAK,CAAC;YACf,IAAI,KAAK,CAAC,SAAS,YAAY,MAAM;gBACnC,OAAO,KAAK,CAAC,SAAS,CAAC,IAAI,CAAC,iBAAI,CAAC,QAAQ,CAAC,CAAC,CAAC;YAC9C,OAAO,iBAAI,CAAC,KAAK,CAAC,IAAI,CAAC,KAAK,QAAQ,CAAC;QACvC,CAAC,CAAC,CAAC;IACL,CAAC;AAaH,CAAC,EAjLgB,YAAY,aAAZ,YAAY,GAAZ,YAAY,QAiL5B;AAED,MAAM,eAAe,GAAkC;IACrD,MAAM,EAAE,sBAAa,CAAC,MAAM;IAC5B,GAAG,EAAE,sBAAa,CAAC,GAAG;IACtB,IAAI,EAAE,sBAAa,CAAC,IAAI;IACxB,OAAO,EAAE,sBAAa,CAAC,OAAO;IAC9B,KAAK,EAAE,sBAAa,CAAC,KAAK;IAC1B,IAAI,EAAE,sBAAa,CAAC,IAAI;IACxB,GAAG,EAAE,sBAAa,CAAC,GAAG;CACvB,CAAC;AAEF;;;;;;;;GAQG;AACH,MAAM,iBAAiB,GAAG,CAAC,KAAa,EAAU,EAAE;IAClD,IAAI,MAAM,GAAW,EAAE,CAAC;IACxB,KAAK,IAAI,CAAC,GAAW,CAAC,EAAE,CAAC,GAAG,KAAK,CAAC,MAAM,GAAI,CAAC;QAC3C,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,IAAI,EAAE,CAAC;YACtB,MAAM,IAAI,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC;YAChC,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;YACrC,MAAM,IAAI,KAAK,CAAC;YAChB,CAAC,IAAI,CAAC,CAAC;QACT,CAAC;aAAM,IAAI,KAAK,CAAC,CAAC,CAAC,KAAK,GAAG,EAAE,CAAC;YAC5B,MAAM,IAAI,GAAW,kBAAkB,CAAC,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC,CAAC,CAAE,CAAC,CAAC,CAAC,CAAC;YACjE,MAAM,IAAI,IAAI,CAAC;YACf,CAAC,IAAI,IAAI,CAAC,MAAM,CAAC;YACjB,IAAI,KAAK,CAAC,UAAU,CAAC,IAAI,EAAE,CAAC,CAAC,EAAE,CAAC;gBAC9B,MAAM,IAAI,IAAI,CAAC;gBACf,CAAC,IAAI,CAAC,CAAC;YACT,CAAC;QACH,CAAC;;YAAM,MAAM,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC;IAC9B,CAAC;IACD,OAAO,MAAM,CAAC;AAChB,CAAC,CAAC"}
@@ -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 (str.includes("*") === true) {
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":"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"}
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, _e;
17
- var _f;
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 (str.includes("*") === true) {
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: (_f = Reflect.getMetadata("swagger/apiUseTags", props.function)) !== null && _f !== void 0 ? _f : [],
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: (_e = (_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.split(" ")[0]) === null || _e === void 0 ? void 0 : _e.trim(),
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 (location.includes("*"))
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":"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"}
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)) === false)
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 parameters = preconfigured
73
+ const declared = preconfigured
61
74
  .map((p) => {
62
- var _a, _b, _c;
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
- from: `parameter ${matched ? JSON.stringify(matched.name) : `of ${p.index} th`}`,
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 schema = (() => {
97
+ const pipe = (() => {
83
98
  if (matched === undefined)
84
99
  return null;
85
- const result = p.category === "body" &&
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 example = ((_a = Reflect.getMetadata("nestia/SwaggerExample/Parameters", ctx.controller.class.prototype, ctx.functionName)) !== null && _a !== void 0 ? _a : []).find((x) => x.index === matched.index);
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, validate: legacy_1.HttpParameterProgrammer.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);
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: (_b = p.field) !== null && _b !== void 0 ? _b : null, name: matched.name, type: matched.type, validate: p.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: (_c = p.field) !== null && _c !== void 0 ? _c : null, name: matched.name, type: matched.type, validate: p.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 === "application/x-www-form-urlencoded"
117
- ? legacy_1.HttpQueryProgrammer.validate
118
- : p.contentType === "multipart/form-data"
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
- const category = getNestParamType(Number(symbol[0]));
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")