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;
  }
}