Merge branch 'v1.2-dev' as v1.2.10
[squeep-api-dingus] / lib / router / index.js
index a13ac47d62f083e588d047f7d556f7502f4b91e4..1585065e14ce79b804cd6de967965951ab0d535a 100644 (file)
@@ -61,17 +61,43 @@ class Router {
   _pathToRoutePath(rawPath) {
     const routePath = rawPath
       .split('/')
-      .map((p) => p.startsWith(this.paramPrefix) ? new PathParameter(p.slice(this.paramPrefix.length)) : p);
+      .map((p) => this._pathPartMunge(p));
+
     if (this.ignoreTrailingSlash
     &&  routePath[routePath.length - 1] === '') {
       routePath.pop();
     }
+
     routePath[kPathMethods] = {};
+
+    Object.defineProperty(routePath, 'path', {
+      enumerable: false,
+      value: rawPath,
+    });
+
     Object.freeze(routePath);
     return routePath;
   }
 
 
+  /*
+   * Convert a path part string to parameter if needed.
+   * Remove escape from an escaped parameter.
+   * @param {String} part
+   * @returns {PathParameter|String}
+   * @private
+   */
+  _pathPartMunge(part) {
+    if (part.startsWith(this.paramPrefix)) {
+      return new PathParameter(part.slice(this.paramPrefix.length));
+    }
+    if (part.startsWith('\\' + this.paramPrefix)) {
+      return part.slice(1);
+    }
+    return part;
+  }
+
+
   /**
    * Compare checkPath to fixedPath, no param substitution, params must match.
    * @param {Router~RoutePath} routePath 
@@ -233,7 +259,7 @@ class Router {
     const { matchedPath, pathParams } = this._pathFind(pathParts);
     ctx.params = pathParams;
     if (matchedPath) {
-      ctx.matchedPath = matchedPath;
+      ctx.matchedPath = matchedPath.path;
       if (method in matchedPath[kPathMethods]) {
         return matchedPath[kPathMethods][method];
       }