uri-template
Version:
Parse and expand URI templates as defined by http://tools.ietf.org/html/rfc6570
60 lines (51 loc) • 1.26 kB
text/typescript
import { abort } from "process";
export interface Template {
type: "template";
parts: (Literal | Expression)[];
}
export interface Literal {
type: "literal";
value: string;
}
export interface Expression {
type: "expression";
operator: Operator;
variables: Variable[];
}
export type Operator = "/" | ";" | "." | "?" | "&" | "+" | "#" | "";
export interface Variable {
type: "variable";
name: string;
modifier?: SubstrModifier | ExplodeModifier;
extension?: string;
}
export interface ExplodeModifier {
type: "explode";
}
export interface SubstrModifier {
type: "substr";
length: number;
}
export function toString(
node: Template | Literal | Expression | Variable
): string {
switch (node.type) {
case "template":
return node.parts.map(toString).join("");
case "literal":
return node.value;
case "expression":
return `{${node.operator}${node.variables.map(toString).join(",")}}`;
case "variable":
let out = node.name;
if (node.modifier?.type == "explode") {
out += "*";
} else if (node.modifier?.type == "substr") {
out += `:${node.modifier.length}`;
}
if (node.extension) {
out += `(${node.extension})`;
}
return out;
}
}