UNPKG

2.93 kBJavaScriptView Raw
1"use strict";
2Object.defineProperty(exports, "__esModule", { value: true });
3const errors_1 = require("../errors");
4const http_1 = require("../http");
5const util_1 = require("../util");
6const parser_helpers_1 = require("./parser-helpers");
7const type_parser_1 = require("./type-parser");
8function 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}
34exports.parseHeaders = parseHeaders;
35function 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}
51function 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}