1 | "use strict";
|
2 | Object.defineProperty(exports, "__esModule", { value: true });
|
3 | const errors_1 = require("../errors");
|
4 | const http_1 = require("../http");
|
5 | const util_1 = require("../util");
|
6 | const parser_helpers_1 = require("./parser-helpers");
|
7 | const type_parser_1 = require("./type-parser");
|
8 | function parseHeaders(parameter, typeTable, lociTable) {
|
9 | var _a;
|
10 | parameter.getDecoratorOrThrow("headers");
|
11 | if (parameter.hasQuestionToken()) {
|
12 | return util_1.err(new errors_1.OptionalNotAllowedError("@headers parameter cannot be optional", {
|
13 | file: parameter.getSourceFile().getFilePath(),
|
14 | position: parameter.getQuestionTokenNodeOrThrow().getPos()
|
15 | }));
|
16 | }
|
17 | const headerTypeLiteral = parser_helpers_1.getParameterTypeAsTypeLiteralOrThrow(parameter);
|
18 | const headers = [];
|
19 | for (const propertySignature of headerTypeLiteral.getProperties()) {
|
20 | const nameResult = extractHeaderName(propertySignature);
|
21 | if (nameResult.isErr())
|
22 | return nameResult;
|
23 | const name = nameResult.unwrap();
|
24 | const typeResult = extractHeaderType(propertySignature, typeTable, lociTable);
|
25 | if (typeResult.isErr())
|
26 | return typeResult;
|
27 | const type = typeResult.unwrap();
|
28 | const description = (_a = parser_helpers_1.getJsDoc(propertySignature)) === null || _a === void 0 ? void 0 : _a.getDescription().trim();
|
29 | const optional = propertySignature.hasQuestionToken();
|
30 | headers.push({ name, type, description, optional });
|
31 | }
|
32 | return util_1.ok(headers.sort((a, b) => (b.name > a.name ? -1 : 1)));
|
33 | }
|
34 | exports.parseHeaders = parseHeaders;
|
35 | function extractHeaderName(propertySignature) {
|
36 | const name = parser_helpers_1.getPropertyName(propertySignature);
|
37 | if (!/^[\w-]*$/.test(name)) {
|
38 | return util_1.err(new errors_1.ParserError("@headers field name may only contain alphanumeric, underscore and hyphen characters", {
|
39 | file: propertySignature.getSourceFile().getFilePath(),
|
40 | position: propertySignature.getPos()
|
41 | }));
|
42 | }
|
43 | if (name.length === 0) {
|
44 | return util_1.err(new errors_1.ParserError("@headers field name must not be empty", {
|
45 | file: propertySignature.getSourceFile().getFilePath(),
|
46 | position: propertySignature.getPos()
|
47 | }));
|
48 | }
|
49 | return util_1.ok(name);
|
50 | }
|
51 | function extractHeaderType(propertySignature, typeTable, lociTable) {
|
52 | const typeResult = type_parser_1.parseType(propertySignature.getTypeNodeOrThrow(), typeTable, lociTable);
|
53 | if (typeResult.isErr())
|
54 | return typeResult;
|
55 | if (!http_1.isHeaderTypeSafe(typeResult.unwrap(), typeTable)) {
|
56 | return util_1.err(new errors_1.ParserError("header type may only derive from string or number types", {
|
57 | file: propertySignature.getSourceFile().getFilePath(),
|
58 | position: propertySignature.getPos()
|
59 | }));
|
60 | }
|
61 | return typeResult;
|
62 | }
|