From 9988f394f63e94bdcecb173fee100cc5e2e1a280 Mon Sep 17 00:00:00 2001 From: Vladimir Kutepov Date: Fri, 6 Apr 2018 20:07:31 +0300 Subject: [PATCH] Update dev dependencies --- .gitattributes | 201 +----- .prettierrc | 2 +- .travis.yml | 18 +- README.md | 46 +- dist/universal-router-generate-urls.js | 154 ++--- dist/universal-router-generate-urls.js.map | 2 +- dist/universal-router.js | 764 ++++++++++----------- dist/universal-router.js.map | 2 +- package.json | 10 +- test/README.md | 13 +- test/UniversalRouter.test.js | 66 +- test/generateUrls.test.js | 6 +- tools/build.js | 2 +- tools/precommit.js | 4 +- 14 files changed, 557 insertions(+), 733 deletions(-) diff --git a/.gitattributes b/.gitattributes index c664a90..c667fa9 100644 --- a/.gitattributes +++ b/.gitattributes @@ -1,194 +1,15 @@ -## GITATTRIBUTES FOR WEB PROJECTS -# -# These settings are for any web project. -# -# Details per file setting: -# text These files should be normalized (i.e. convert CRLF to LF). -# binary These files are binary and should be left untouched. -# -# Note that binary is a macro for -text -diff. -###################################################################### +# Automatically normalize line endings for all text-based files +# https://git-scm.com/docs/gitattributes#_end_of_line_conversion -## AUTO-DETECT -## Handle line endings automatically for files detected as -## text and leave all files detected as binary untouched. -## This will handle all files NOT defined below. * text=auto -## SOURCE CODE -*.bat text eol=crlf -*.coffee text -*.css text -*.htm text -*.html text -*.inc text -*.ini text -*.js text -*.json text -*.jsx text -*.less text -*.od text -*.onlydata text -*.php text -*.pl text -*.py text -*.rb text -*.sass text -*.scm text -*.scss text -*.sh text eol=lf -*.sql text -*.styl text -*.tag text -*.ts text -*.tsx text -*.xml text -*.xhtml text +# For the following file types, normalize line endings to LF on +# checkin and prevent conversion to CRLF when they are checked out +# (this is required in order to prevent newline related issues like, +# for example, after the build script is run) -## DOCKER -*.dockerignore text -Dockerfile text - -## DOCUMENTATION -*.markdown text -*.md text -*.mdwn text -*.mdown text -*.mkd text -*.mkdn text -*.mdtxt text -*.mdtext text -*.txt text -AUTHORS text -CHANGELOG text -CHANGES text -CONTRIBUTING text -COPYING text -copyright text -*COPYRIGHT* text -INSTALL text -license text -LICENSE text -NEWS text -readme text -*README* text -TODO text - -## TEMPLATES -*.dot text -*.ejs text -*.haml text -*.handlebars text -*.hbs text -*.hbt text -*.jade text -*.latte text -*.mustache text -*.njk text -*.phtml text -*.tmpl text -*.tpl text -*.twig text - -## LINTERS -.babelrc text -.csslintrc text -.eslintrc text -.htmlhintrc text -.jscsrc text -.jshintrc text -.jshintignore text -.prettierrc text -.stylelintrc text - -## CONFIGS -*.bowerrc text -*.cnf text -*.conf text -*.config text -.browserslistrc text -.editorconfig text -.gitattributes text -.gitconfig text -.gitignore text -.htaccess text -*.npmignore text -*.yaml text -*.yml text -browserslist text -Makefile text -makefile text - -## HEROKU -Procfile text -.slugignore text - -## GRAPHICS -*.ai binary -*.bmp binary -*.eps binary -*.gif binary -*.ico binary -*.jng binary -*.jp2 binary -*.jpg binary -*.jpeg binary -*.jpx binary -*.jxr binary -*.pdf binary -*.png binary -*.psb binary -*.psd binary -*.svg text -*.svgz binary -*.tif binary -*.tiff binary -*.wbmp binary -*.webp binary - -## AUDIO -*.kar binary -*.m4a binary -*.mid binary -*.midi binary -*.mp3 binary -*.ogg binary -*.ra binary - -## VIDEO -*.3gpp binary -*.3gp binary -*.as binary -*.asf binary -*.asx binary -*.fla binary -*.flv binary -*.m4v binary -*.mng binary -*.mov binary -*.mp4 binary -*.mpeg binary -*.mpg binary -*.ogv binary -*.swc binary -*.swf binary -*.webm binary - -## ARCHIVES -*.7z binary -*.gz binary -*.jar binary -*.rar binary -*.tar binary -*.zip binary - -## FONTS -*.ttf binary -*.eot binary -*.otf binary -*.woff binary -*.woff2 binary - -## EXECUTABLES -*.exe binary -*.pyc binary +.* text eol=lf +*.js text eol=lf +*.json text eol=lf +*.md text eol=lf +*.svg text eol=lf diff --git a/.prettierrc b/.prettierrc index 2cb42cd..db8cbb7 100644 --- a/.prettierrc +++ b/.prettierrc @@ -10,5 +10,5 @@ "arrowParens": "always", "requirePragma": false, "insertPragma": false, - "proseWrap": "preserve", + "proseWrap": "preserve" } diff --git a/.travis.yml b/.travis.yml index 8bb607b..294c81b 100644 --- a/.travis.yml +++ b/.travis.yml @@ -1,22 +1,26 @@ # For more information about the configurations used # in this file, please see the Travis CI documentation: # https://docs.travis-ci.com/user/languages/javascript-with-nodejs -sudo: false + language: node_js + node_js: - - '9' # stable - - '8' # lts - - '6' # lts + - "node" + - "lts/*" before_install: - - npm i -g codecov + - npm install --global codecov install: - - npm install + - npm install --no-save script: - npm run lint - - npm run test + - npm run test -- --coverage + - npm run build after_success: - codecov + +notifications: + email: false diff --git a/README.md b/README.md index 6f20ecd..0261786 100644 --- a/README.md +++ b/README.md @@ -1,8 +1,8 @@ # Universal Router -[![NPM version](https://img.shields.io/npm/v/universal-router.svg?maxAge=3600)](https://www.npmjs.com/package/universal-router) -[![Library Size](http://img.badgesize.io/kriasoft/universal-router/master/dist/universal-router.min.js.svg?compression=gzip&label=size&maxAge=3600)](https://bundlephobia.com/result?p=universal-router) -[![NPM downloads](https://img.shields.io/npm/dm/universal-router.svg?maxAge=3600)](https://npm-stat.com/charts.html?package=universal-router) +[![NPM version](https://img.shields.io/npm/v/universal-router.svg)](https://www.npmjs.com/package/universal-router) +[![NPM downloads](https://img.shields.io/npm/dw/universal-router.svg)](https://www.npmjs.com/package/universal-router) +[![Library Size](https://img.shields.io/bundlephobia/minzip/universal-router.svg)](https://bundlephobia.com/result?p=universal-router) [![Online Chat](https://badges.gitter.im/kriasoft/universal-router.svg)](https://gitter.im/kriasoft/universal-router) @@ -177,34 +177,34 @@ Become a sponsor and get your logo on our README on Github with a link to your s [[Become a sponsor](https://opencollective.com/universal-router#sponsor)] - + - + - + - + - + - + - + - + - + - + ## Backers @@ -213,34 +213,34 @@ Support us with a monthly donation and help us continue our activities. [[Become a backer](https://opencollective.com/universal-router#backer)] - + - + - + - + - + - + - + - + - + - + ## License diff --git a/dist/universal-router-generate-urls.js b/dist/universal-router-generate-urls.js index 9b1a0ee..aca2cab 100644 --- a/dist/universal-router-generate-urls.js +++ b/dist/universal-router-generate-urls.js @@ -1,116 +1,116 @@ /*! Universal Router | MIT License | https://www.kriasoft.com/universal-router/ */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./universal-router.js')) : - typeof define === 'function' && define.amd ? define(['./universal-router.js'], factory) : - (global.generateUrls = factory(global.UniversalRouter)); + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory(require('./universal-router.js')) : + typeof define === 'function' && define.amd ? define(['./universal-router.js'], factory) : + (global.generateUrls = factory(global.UniversalRouter)); }(this, (function (UniversalRouter) { 'use strict'; -var pathToRegexp = UniversalRouter.pathToRegexp; -var cache = new Map(); + var pathToRegexp = UniversalRouter.pathToRegexp; + var cache = new Map(); -function cacheRoutes(routesByName, route, routes) { - if (routesByName.has(route.name)) { - throw new Error("Route \"" + route.name + "\" already exists"); - } - - if (route.name) { - routesByName.set(route.name, route); - } + function cacheRoutes(routesByName, route, routes) { + if (routesByName.has(route.name)) { + throw new Error("Route \"" + route.name + "\" already exists"); + } - if (routes) { - for (var i = 0; i < routes.length; i++) { - var childRoute = routes[i]; - childRoute.parent = route; - cacheRoutes(routesByName, childRoute, childRoute.children); + if (route.name) { + routesByName.set(route.name, route); } - } -} -function generateUrls(router, options) { - if (options === void 0) { - options = {}; + if (routes) { + for (var i = 0; i < routes.length; i++) { + var childRoute = routes[i]; + childRoute.parent = route; + cacheRoutes(routesByName, childRoute, childRoute.children); + } + } } - if (!(router instanceof UniversalRouter)) { - throw new TypeError('An instance of UniversalRouter is expected'); - } + function generateUrls(router, options) { + if (options === void 0) { + options = {}; + } - router.routesByName = router.routesByName || new Map(); - return function (routeName, params) { - var route = router.routesByName.get(routeName); + if (!(router instanceof UniversalRouter)) { + throw new TypeError('An instance of UniversalRouter is expected'); + } - if (!route) { - router.routesByName.clear(); - cacheRoutes(router.routesByName, router.root, router.root.children); - route = router.routesByName.get(routeName); + router.routesByName = router.routesByName || new Map(); + return function (routeName, params) { + var route = router.routesByName.get(routeName); if (!route) { - throw new Error("Route \"" + routeName + "\" not found"); + router.routesByName.clear(); + cacheRoutes(router.routesByName, router.root, router.root.children); + route = router.routesByName.get(routeName); + + if (!route) { + throw new Error("Route \"" + routeName + "\" not found"); + } } - } - var regexp = cache.get(route.fullPath); + var regexp = cache.get(route.fullPath); - if (!regexp) { - var fullPath = ''; - var rt = route; + if (!regexp) { + var fullPath = ''; + var rt = route; - while (rt) { - var path = Array.isArray(rt.path) ? rt.path[0] : rt.path; + while (rt) { + var path = Array.isArray(rt.path) ? rt.path[0] : rt.path; - if (path) { - fullPath = path + fullPath; - } + if (path) { + fullPath = path + fullPath; + } - rt = rt.parent; - } + rt = rt.parent; + } - var tokens = pathToRegexp.parse(fullPath); - var toPath = pathToRegexp.tokensToFunction(tokens); - var keys = Object.create(null); + var tokens = pathToRegexp.parse(fullPath); + var toPath = pathToRegexp.tokensToFunction(tokens); + var keys = Object.create(null); - for (var i = 0; i < tokens.length; i++) { - if (typeof tokens[i] !== 'string') { - keys[tokens[i].name] = true; + for (var i = 0; i < tokens.length; i++) { + if (typeof tokens[i] !== 'string') { + keys[tokens[i].name] = true; + } } - } - regexp = { - toPath: toPath, - keys: keys - }; - cache.set(fullPath, regexp); - route.fullPath = fullPath; - } + regexp = { + toPath: toPath, + keys: keys + }; + cache.set(fullPath, regexp); + route.fullPath = fullPath; + } - var url = router.baseUrl + regexp.toPath(params, options) || '/'; + var url = router.baseUrl + regexp.toPath(params, options) || '/'; - if (options.stringifyQueryParams && params) { - var queryParams = {}; + if (options.stringifyQueryParams && params) { + var queryParams = {}; - var _keys = Object.keys(params); + var _keys = Object.keys(params); - for (var _i = 0; _i < _keys.length; _i++) { - var key = _keys[_i]; + for (var _i = 0; _i < _keys.length; _i++) { + var key = _keys[_i]; - if (!regexp.keys[key]) { - queryParams[key] = params[key]; + if (!regexp.keys[key]) { + queryParams[key] = params[key]; + } } - } - var query = options.stringifyQueryParams(queryParams); + var query = options.stringifyQueryParams(queryParams); - if (query) { - url += query.charAt(0) === '?' ? query : "?" + query; + if (query) { + url += query.charAt(0) === '?' ? query : "?" + query; + } } - } - return url; - }; -} + return url; + }; + } -return generateUrls; + return generateUrls; }))); //# sourceMappingURL=universal-router-generate-urls.js.map diff --git a/dist/universal-router-generate-urls.js.map b/dist/universal-router-generate-urls.js.map index 96f7192..7432bb7 100644 --- a/dist/universal-router-generate-urls.js.map +++ b/dist/universal-router-generate-urls.js.map @@ -1 +1 @@ -{"version":3,"file":"universal-router-generate-urls.js","sources":["src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright (c) 2015-present Kriasoft.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport UniversalRouter from './UniversalRouter'\n\nconst { pathToRegexp } = UniversalRouter\nconst cache = new Map()\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName.has(route.name)) {\n throw new Error(`Route \"${route.name}\" already exists`)\n }\n\n if (route.name) {\n routesByName.set(route.name, route)\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i++) {\n const childRoute = routes[i]\n childRoute.parent = route\n cacheRoutes(routesByName, childRoute, childRoute.children)\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected')\n }\n\n router.routesByName = router.routesByName || new Map()\n\n return (routeName, params) => {\n let route = router.routesByName.get(routeName)\n if (!route) {\n router.routesByName.clear() // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children)\n\n route = router.routesByName.get(routeName)\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`)\n }\n }\n\n let regexp = cache.get(route.fullPath)\n if (!regexp) {\n let fullPath = ''\n let rt = route\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path\n if (path) {\n fullPath = path + fullPath\n }\n rt = rt.parent\n }\n const tokens = pathToRegexp.parse(fullPath)\n const toPath = pathToRegexp.tokensToFunction(tokens)\n const keys = Object.create(null)\n for (let i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true\n }\n }\n regexp = { toPath, keys }\n cache.set(fullPath, regexp)\n route.fullPath = fullPath\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/'\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {}\n const keys = Object.keys(params)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n if (!regexp.keys[key]) {\n queryParams[key] = params[key]\n }\n }\n const query = options.stringifyQueryParams(queryParams)\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`\n }\n }\n\n return url\n }\n}\n\nexport default generateUrls\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","has","name","Error","set","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","get","clear","root","regexp","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"universal-router-generate-urls.js","sources":["src/generateUrls.js"],"sourcesContent":["/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright (c) 2015-present Kriasoft.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport UniversalRouter from './UniversalRouter'\n\nconst { pathToRegexp } = UniversalRouter\nconst cache = new Map()\n\nfunction cacheRoutes(routesByName, route, routes) {\n if (routesByName.has(route.name)) {\n throw new Error(`Route \"${route.name}\" already exists`)\n }\n\n if (route.name) {\n routesByName.set(route.name, route)\n }\n\n if (routes) {\n for (let i = 0; i < routes.length; i++) {\n const childRoute = routes[i]\n childRoute.parent = route\n cacheRoutes(routesByName, childRoute, childRoute.children)\n }\n }\n}\n\nfunction generateUrls(router, options = {}) {\n if (!(router instanceof UniversalRouter)) {\n throw new TypeError('An instance of UniversalRouter is expected')\n }\n\n router.routesByName = router.routesByName || new Map()\n\n return (routeName, params) => {\n let route = router.routesByName.get(routeName)\n if (!route) {\n router.routesByName.clear() // clear cache\n cacheRoutes(router.routesByName, router.root, router.root.children)\n\n route = router.routesByName.get(routeName)\n if (!route) {\n throw new Error(`Route \"${routeName}\" not found`)\n }\n }\n\n let regexp = cache.get(route.fullPath)\n if (!regexp) {\n let fullPath = ''\n let rt = route\n while (rt) {\n const path = Array.isArray(rt.path) ? rt.path[0] : rt.path\n if (path) {\n fullPath = path + fullPath\n }\n rt = rt.parent\n }\n const tokens = pathToRegexp.parse(fullPath)\n const toPath = pathToRegexp.tokensToFunction(tokens)\n const keys = Object.create(null)\n for (let i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] !== 'string') {\n keys[tokens[i].name] = true\n }\n }\n regexp = { toPath, keys }\n cache.set(fullPath, regexp)\n route.fullPath = fullPath\n }\n\n let url = router.baseUrl + regexp.toPath(params, options) || '/'\n\n if (options.stringifyQueryParams && params) {\n const queryParams = {}\n const keys = Object.keys(params)\n for (let i = 0; i < keys.length; i++) {\n const key = keys[i]\n if (!regexp.keys[key]) {\n queryParams[key] = params[key]\n }\n }\n const query = options.stringifyQueryParams(queryParams)\n if (query) {\n url += query.charAt(0) === '?' ? query : `?${query}`\n }\n }\n\n return url\n }\n}\n\nexport default generateUrls\n"],"names":["pathToRegexp","UniversalRouter","cache","Map","cacheRoutes","routesByName","route","routes","has","name","Error","set","i","length","childRoute","parent","children","generateUrls","router","options","TypeError","routeName","params","get","clear","root","regexp","fullPath","rt","path","Array","isArray","tokens","parse","toPath","tokensToFunction","keys","Object","create","url","baseUrl","stringifyQueryParams","queryParams","key","query","charAt"],"mappings":";;;;;;;;MAWQA,eAAiBC,gBAAjBD;EACR,IAAME,QAAQ,IAAIC,GAAJ,EAAd;;EAEA,SAASC,WAAT,CAAqBC,YAArB,EAAmCC,KAAnC,EAA0CC,MAA1C,EAAkD;EAChD,MAAIF,aAAaG,GAAb,CAAiBF,MAAMG,IAAvB,CAAJ,EAAkC;EAChC,UAAM,IAAIC,KAAJ,cAAoBJ,MAAMG,IAA1B,uBAAN;EACD;;EAED,MAAIH,MAAMG,IAAV,EAAgB;EACdJ,iBAAaM,GAAb,CAAiBL,MAAMG,IAAvB,EAA6BH,KAA7B;EACD;;EAED,MAAIC,MAAJ,EAAY;EACV,SAAK,IAAIK,IAAI,CAAb,EAAgBA,IAAIL,OAAOM,MAA3B,EAAmCD,GAAnC,EAAwC;EACtC,UAAME,aAAaP,OAAOK,CAAP,CAAnB;EACAE,iBAAWC,MAAX,GAAoBT,KAApB;EACAF,kBAAYC,YAAZ,EAA0BS,UAA1B,EAAsCA,WAAWE,QAAjD;EACD;EACF;EACF;;EAED,SAASC,YAAT,CAAsBC,MAAtB,EAA8BC,OAA9B,EAA4C;EAAA,MAAdA,OAAc;EAAdA,WAAc,GAAJ,EAAI;EAAA;;EAC1C,MAAI,EAAED,kBAAkBjB,eAApB,CAAJ,EAA0C;EACxC,UAAM,IAAImB,SAAJ,CAAc,4CAAd,CAAN;EACD;;EAEDF,SAAOb,YAAP,GAAsBa,OAAOb,YAAP,IAAuB,IAAIF,GAAJ,EAA7C;EAEA,SAAO,UAACkB,SAAD,EAAYC,MAAZ,EAAuB;EAC5B,QAAIhB,QAAQY,OAAOb,YAAP,CAAoBkB,GAApB,CAAwBF,SAAxB,CAAZ;;EACA,QAAI,CAACf,KAAL,EAAY;EACVY,aAAOb,YAAP,CAAoBmB,KAApB;EACApB,kBAAYc,OAAOb,YAAnB,EAAiCa,OAAOO,IAAxC,EAA8CP,OAAOO,IAAP,CAAYT,QAA1D;EAEAV,cAAQY,OAAOb,YAAP,CAAoBkB,GAApB,CAAwBF,SAAxB,CAAR;;EACA,UAAI,CAACf,KAAL,EAAY;EACV,cAAM,IAAII,KAAJ,cAAoBW,SAApB,kBAAN;EACD;EACF;;EAED,QAAIK,SAASxB,MAAMqB,GAAN,CAAUjB,MAAMqB,QAAhB,CAAb;;EACA,QAAI,CAACD,MAAL,EAAa;EACX,UAAIC,WAAW,EAAf;EACA,UAAIC,KAAKtB,KAAT;;EACA,aAAOsB,EAAP,EAAW;EACT,YAAMC,OAAOC,MAAMC,OAAN,CAAcH,GAAGC,IAAjB,IAAyBD,GAAGC,IAAH,CAAQ,CAAR,CAAzB,GAAsCD,GAAGC,IAAtD;;EACA,YAAIA,IAAJ,EAAU;EACRF,qBAAWE,OAAOF,QAAlB;EACD;;EACDC,aAAKA,GAAGb,MAAR;EACD;;EACD,UAAMiB,SAAShC,aAAaiC,KAAb,CAAmBN,QAAnB,CAAf;EACA,UAAMO,SAASlC,aAAamC,gBAAb,CAA8BH,MAA9B,CAAf;EACA,UAAMI,OAAOC,OAAOC,MAAP,CAAc,IAAd,CAAb;;EACA,WAAK,IAAI1B,IAAI,CAAb,EAAgBA,IAAIoB,OAAOnB,MAA3B,EAAmCD,GAAnC,EAAwC;EACtC,YAAI,OAAOoB,OAAOpB,CAAP,CAAP,KAAqB,QAAzB,EAAmC;EACjCwB,eAAKJ,OAAOpB,CAAP,EAAUH,IAAf,IAAuB,IAAvB;EACD;EACF;;EACDiB,eAAS;EAAEQ,sBAAF;EAAUE;EAAV,OAAT;EACAlC,YAAMS,GAAN,CAAUgB,QAAV,EAAoBD,MAApB;EACApB,YAAMqB,QAAN,GAAiBA,QAAjB;EACD;;EAED,QAAIY,MAAMrB,OAAOsB,OAAP,GAAiBd,OAAOQ,MAAP,CAAcZ,MAAd,EAAsBH,OAAtB,CAAjB,IAAmD,GAA7D;;EAEA,QAAIA,QAAQsB,oBAAR,IAAgCnB,MAApC,EAA4C;EAC1C,UAAMoB,cAAc,EAApB;;EACA,UAAMN,QAAOC,OAAOD,IAAP,CAAYd,MAAZ,CAAb;;EACA,WAAK,IAAIV,KAAI,CAAb,EAAgBA,KAAIwB,MAAKvB,MAAzB,EAAiCD,IAAjC,EAAsC;EACpC,YAAM+B,MAAMP,MAAKxB,EAAL,CAAZ;;EACA,YAAI,CAACc,OAAOU,IAAP,CAAYO,GAAZ,CAAL,EAAuB;EACrBD,sBAAYC,GAAZ,IAAmBrB,OAAOqB,GAAP,CAAnB;EACD;EACF;;EACD,UAAMC,QAAQzB,QAAQsB,oBAAR,CAA6BC,WAA7B,CAAd;;EACA,UAAIE,KAAJ,EAAW;EACTL,eAAOK,MAAMC,MAAN,CAAa,CAAb,MAAoB,GAApB,GAA0BD,KAA1B,SAAsCA,KAA7C;EACD;EACF;;EAED,WAAOL,GAAP;EACD,GAtDD;EAuDD;;;;;;;;"} \ No newline at end of file diff --git a/dist/universal-router.js b/dist/universal-router.js index d09f704..d2df555 100644 --- a/dist/universal-router.js +++ b/dist/universal-router.js @@ -1,498 +1,498 @@ /*! Universal Router | MIT License | https://www.kriasoft.com/universal-router/ */ (function (global, factory) { - typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : - typeof define === 'function' && define.amd ? define(factory) : - (global.UniversalRouter = factory()); + typeof exports === 'object' && typeof module !== 'undefined' ? module.exports = factory() : + typeof define === 'function' && define.amd ? define(factory) : + (global.UniversalRouter = factory()); }(this, (function () { 'use strict'; -var pathToRegexp_1 = pathToRegexp; -var parse_1 = parse; -var compile_1 = compile; -var tokensToFunction_1 = tokensToFunction; -var tokensToRegExp_1 = tokensToRegExp; -var DEFAULT_DELIMITER = '/'; -var DEFAULT_DELIMITERS = './'; -var PATH_REGEXP = new RegExp(['(\\\\.)', '(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?'].join('|'), 'g'); - -function parse(str, options) { - var tokens = []; - var key = 0; - var index = 0; - var path = ''; - var defaultDelimiter = options && options.delimiter || DEFAULT_DELIMITER; - var delimiters = options && options.delimiters || DEFAULT_DELIMITERS; - var pathEscaped = false; - var res; - - while ((res = PATH_REGEXP.exec(str)) !== null) { - var m = res[0]; - var escaped = res[1]; - var offset = res.index; - path += str.slice(index, offset); - index = offset + m.length; - - if (escaped) { - path += escaped[1]; - pathEscaped = true; - continue; - } + var pathToRegexp_1 = pathToRegexp; + var parse_1 = parse; + var compile_1 = compile; + var tokensToFunction_1 = tokensToFunction; + var tokensToRegExp_1 = tokensToRegExp; + var DEFAULT_DELIMITER = '/'; + var DEFAULT_DELIMITERS = './'; + var PATH_REGEXP = new RegExp(['(\\\\.)', '(?:\\:(\\w+)(?:\\(((?:\\\\.|[^\\\\()])+)\\))?|\\(((?:\\\\.|[^\\\\()])+)\\))([+*?])?'].join('|'), 'g'); + + function parse(str, options) { + var tokens = []; + var key = 0; + var index = 0; + var path = ''; + var defaultDelimiter = options && options.delimiter || DEFAULT_DELIMITER; + var delimiters = options && options.delimiters || DEFAULT_DELIMITERS; + var pathEscaped = false; + var res; + + while ((res = PATH_REGEXP.exec(str)) !== null) { + var m = res[0]; + var escaped = res[1]; + var offset = res.index; + path += str.slice(index, offset); + index = offset + m.length; + + if (escaped) { + path += escaped[1]; + pathEscaped = true; + continue; + } - var prev = ''; - var next = str[index]; - var name = res[2]; - var capture = res[3]; - var group = res[4]; - var modifier = res[5]; + var prev = ''; + var next = str[index]; + var name = res[2]; + var capture = res[3]; + var group = res[4]; + var modifier = res[5]; - if (!pathEscaped && path.length) { - var k = path.length - 1; + if (!pathEscaped && path.length) { + var k = path.length - 1; - if (delimiters.indexOf(path[k]) > -1) { - prev = path[k]; - path = path.slice(0, k); + if (delimiters.indexOf(path[k]) > -1) { + prev = path[k]; + path = path.slice(0, k); + } + } + + if (path) { + tokens.push(path); + path = ''; + pathEscaped = false; } + + var partial = prev !== '' && next !== undefined && next !== prev; + var repeat = modifier === '+' || modifier === '*'; + var optional = modifier === '?' || modifier === '*'; + var delimiter = prev || defaultDelimiter; + var pattern = capture || group; + tokens.push({ + name: name || key++, + prefix: prev, + delimiter: delimiter, + optional: optional, + repeat: repeat, + partial: partial, + pattern: pattern ? escapeGroup(pattern) : '[^' + escapeString(delimiter) + ']+?' + }); } - if (path) { - tokens.push(path); - path = ''; - pathEscaped = false; + if (path || index < str.length) { + tokens.push(path + str.substr(index)); } - var partial = prev !== '' && next !== undefined && next !== prev; - var repeat = modifier === '+' || modifier === '*'; - var optional = modifier === '?' || modifier === '*'; - var delimiter = prev || defaultDelimiter; - var pattern = capture || group; - tokens.push({ - name: name || key++, - prefix: prev, - delimiter: delimiter, - optional: optional, - repeat: repeat, - partial: partial, - pattern: pattern ? escapeGroup(pattern) : '[^' + escapeString(delimiter) + ']+?' - }); + return tokens; } - if (path || index < str.length) { - tokens.push(path + str.substr(index)); + function compile(str, options) { + return tokensToFunction(parse(str, options)); } - return tokens; -} + function tokensToFunction(tokens) { + var matches = new Array(tokens.length); -function compile(str, options) { - return tokensToFunction(parse(str, options)); -} + for (var i = 0; i < tokens.length; i++) { + if (typeof tokens[i] === 'object') { + matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$'); + } + } -function tokensToFunction(tokens) { - var matches = new Array(tokens.length); + return function (data, options) { + var path = ''; + var encode = options && options.encode || encodeURIComponent; - for (var i = 0; i < tokens.length; i++) { - if (typeof tokens[i] === 'object') { - matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$'); - } - } + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; - return function (data, options) { - var path = ''; - var encode = options && options.encode || encodeURIComponent; + if (typeof token === 'string') { + path += token; + continue; + } - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; + var value = data ? data[token.name] : undefined; + var segment; - if (typeof token === 'string') { - path += token; - continue; - } + if (Array.isArray(value)) { + if (!token.repeat) { + throw new TypeError('Expected "' + token.name + '" to not repeat, but got array'); + } - var value = data ? data[token.name] : undefined; - var segment; + if (value.length === 0) { + if (token.optional) continue; + throw new TypeError('Expected "' + token.name + '" to not be empty'); + } - if (Array.isArray(value)) { - if (!token.repeat) { - throw new TypeError('Expected "' + token.name + '" to not repeat, but got array'); - } + for (var j = 0; j < value.length; j++) { + segment = encode(value[j], token); - if (value.length === 0) { - if (token.optional) continue; - throw new TypeError('Expected "' + token.name + '" to not be empty'); + if (!matches[i].test(segment)) { + throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '"'); + } + + path += (j === 0 ? token.prefix : token.delimiter) + segment; + } + + continue; } - for (var j = 0; j < value.length; j++) { - segment = encode(value[j], token); + if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { + segment = encode(String(value), token); if (!matches[i].test(segment)) { - throw new TypeError('Expected all "' + token.name + '" to match "' + token.pattern + '"'); + throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but got "' + segment + '"'); } - path += (j === 0 ? token.prefix : token.delimiter) + segment; + path += token.prefix + segment; + continue; } - continue; + if (token.optional) { + if (token.partial) path += token.prefix; + continue; + } + + throw new TypeError('Expected "' + token.name + '" to be ' + (token.repeat ? 'an array' : 'a string')); } - if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') { - segment = encode(String(value), token); + return path; + }; + } - if (!matches[i].test(segment)) { - throw new TypeError('Expected "' + token.name + '" to match "' + token.pattern + '", but got "' + segment + '"'); - } + function escapeString(str) { + return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1'); + } - path += token.prefix + segment; - continue; - } + function escapeGroup(group) { + return group.replace(/([=!:$/()])/g, '\\$1'); + } - if (token.optional) { - if (token.partial) path += token.prefix; - continue; - } + function flags(options) { + return options && options.sensitive ? '' : 'i'; + } - throw new TypeError('Expected "' + token.name + '" to be ' + (token.repeat ? 'an array' : 'a string')); + function regexpToRegexp(path, keys) { + if (!keys) return path; + var groups = path.source.match(/\((?!\?)/g); + + if (groups) { + for (var i = 0; i < groups.length; i++) { + keys.push({ + name: i, + prefix: null, + delimiter: null, + optional: false, + repeat: false, + partial: false, + pattern: null + }); + } } return path; - }; -} - -function escapeString(str) { - return str.replace(/([.+*?=^!:${}()[\]|/\\])/g, '\\$1'); -} - -function escapeGroup(group) { - return group.replace(/([=!:$/()])/g, '\\$1'); -} - -function flags(options) { - return options && options.sensitive ? '' : 'i'; -} - -function regexpToRegexp(path, keys) { - if (!keys) return path; - var groups = path.source.match(/\((?!\?)/g); - - if (groups) { - for (var i = 0; i < groups.length; i++) { - keys.push({ - name: i, - prefix: null, - delimiter: null, - optional: false, - repeat: false, - partial: false, - pattern: null - }); - } } - return path; -} + function arrayToRegexp(path, keys, options) { + var parts = []; -function arrayToRegexp(path, keys, options) { - var parts = []; + for (var i = 0; i < path.length; i++) { + parts.push(pathToRegexp(path[i], keys, options).source); + } - for (var i = 0; i < path.length; i++) { - parts.push(pathToRegexp(path[i], keys, options).source); + return new RegExp('(?:' + parts.join('|') + ')', flags(options)); } - return new RegExp('(?:' + parts.join('|') + ')', flags(options)); -} - -function stringToRegexp(path, keys, options) { - return tokensToRegExp(parse(path, options), keys, options); -} - -function tokensToRegExp(tokens, keys, options) { - options = options || {}; - var strict = options.strict; - var end = options.end !== false; - var delimiter = escapeString(options.delimiter || DEFAULT_DELIMITER); - var delimiters = options.delimiters || DEFAULT_DELIMITERS; - var endsWith = [].concat(options.endsWith || []).map(escapeString).concat('$').join('|'); - var route = ''; - var isEndDelimited = false; - - for (var i = 0; i < tokens.length; i++) { - var token = tokens[i]; - - if (typeof token === 'string') { - route += escapeString(token); - isEndDelimited = i === tokens.length - 1 && delimiters.indexOf(token[token.length - 1]) > -1; - } else { - var prefix = escapeString(token.prefix); - var capture = token.repeat ? '(?:' + token.pattern + ')(?:' + prefix + '(?:' + token.pattern + '))*' : token.pattern; - if (keys) keys.push(token); + function stringToRegexp(path, keys, options) { + return tokensToRegExp(parse(path, options), keys, options); + } + + function tokensToRegExp(tokens, keys, options) { + options = options || {}; + var strict = options.strict; + var end = options.end !== false; + var delimiter = escapeString(options.delimiter || DEFAULT_DELIMITER); + var delimiters = options.delimiters || DEFAULT_DELIMITERS; + var endsWith = [].concat(options.endsWith || []).map(escapeString).concat('$').join('|'); + var route = ''; + var isEndDelimited = false; + + for (var i = 0; i < tokens.length; i++) { + var token = tokens[i]; - if (token.optional) { - if (token.partial) { - route += prefix + '(' + capture + ')?'; + if (typeof token === 'string') { + route += escapeString(token); + isEndDelimited = i === tokens.length - 1 && delimiters.indexOf(token[token.length - 1]) > -1; + } else { + var prefix = escapeString(token.prefix); + var capture = token.repeat ? '(?:' + token.pattern + ')(?:' + prefix + '(?:' + token.pattern + '))*' : token.pattern; + if (keys) keys.push(token); + + if (token.optional) { + if (token.partial) { + route += prefix + '(' + capture + ')?'; + } else { + route += '(?:' + prefix + '(' + capture + '))?'; + } } else { - route += '(?:' + prefix + '(' + capture + '))?'; + route += prefix + '(' + capture + ')'; } - } else { - route += prefix + '(' + capture + ')'; } } - } - - if (end) { - if (!strict) route += '(?:' + delimiter + ')?'; - route += endsWith === '$' ? '$' : '(?=' + endsWith + ')'; - } else { - if (!strict) route += '(?:' + delimiter + '(?=' + endsWith + '))?'; - if (!isEndDelimited) route += '(?=' + delimiter + '|' + endsWith + ')'; - } - return new RegExp('^' + route, flags(options)); -} + if (end) { + if (!strict) route += '(?:' + delimiter + ')?'; + route += endsWith === '$' ? '$' : '(?=' + endsWith + ')'; + } else { + if (!strict) route += '(?:' + delimiter + '(?=' + endsWith + '))?'; + if (!isEndDelimited) route += '(?=' + delimiter + '|' + endsWith + ')'; + } -function pathToRegexp(path, keys, options) { - if (path instanceof RegExp) { - return regexpToRegexp(path, keys); + return new RegExp('^' + route, flags(options)); } - if (Array.isArray(path)) { - return arrayToRegexp(path, keys, options); - } + function pathToRegexp(path, keys, options) { + if (path instanceof RegExp) { + return regexpToRegexp(path, keys); + } + + if (Array.isArray(path)) { + return arrayToRegexp(path, keys, options); + } - return stringToRegexp(path, keys, options); -} -pathToRegexp_1.parse = parse_1; -pathToRegexp_1.compile = compile_1; -pathToRegexp_1.tokensToFunction = tokensToFunction_1; -pathToRegexp_1.tokensToRegExp = tokensToRegExp_1; - -var hasOwnProperty = Object.prototype.hasOwnProperty; -var cache = new Map(); - -function decodeParam(val) { - try { - return decodeURIComponent(val); - } catch (err) { - return val; + return stringToRegexp(path, keys, options); } -} - -function matchPath(route, pathname, parentKeys, parentParams) { - var end = !route.children; - var cacheKey = (route.path || '') + "|" + end; - var regexp = cache.get(cacheKey); - - if (!regexp) { - var keys = []; - regexp = { - keys: keys, - pattern: pathToRegexp_1(route.path || '', keys, { - end: end - }) - }; - cache.set(cacheKey, regexp); + pathToRegexp_1.parse = parse_1; + pathToRegexp_1.compile = compile_1; + pathToRegexp_1.tokensToFunction = tokensToFunction_1; + pathToRegexp_1.tokensToRegExp = tokensToRegExp_1; + + var hasOwnProperty = Object.prototype.hasOwnProperty; + var cache = new Map(); + + function decodeParam(val) { + try { + return decodeURIComponent(val); + } catch (err) { + return val; + } } - var m = regexp.pattern.exec(pathname); + function matchPath(route, pathname, parentKeys, parentParams) { + var end = !route.children; + var cacheKey = (route.path || '') + "|" + end; + var regexp = cache.get(cacheKey); + + if (!regexp) { + var keys = []; + regexp = { + keys: keys, + pattern: pathToRegexp_1(route.path || '', keys, { + end: end + }) + }; + cache.set(cacheKey, regexp); + } - if (!m) { - return null; - } + var m = regexp.pattern.exec(pathname); - var path = m[0]; - var params = Object.assign({}, parentParams); + if (!m) { + return null; + } - for (var i = 1; i < m.length; i++) { - var key = regexp.keys[i - 1]; - var prop = key.name; - var value = m[i]; + var path = m[0]; + var params = Object.assign({}, parentParams); - if (value !== undefined || !hasOwnProperty.call(params, prop)) { - if (key.repeat) { - params[prop] = value ? value.split(key.delimiter).map(decodeParam) : []; - } else { - params[prop] = value ? decodeParam(value) : value; - } - } - } + for (var i = 1; i < m.length; i++) { + var key = regexp.keys[i - 1]; + var prop = key.name; + var value = m[i]; - return { - path: !end && path.charAt(path.length - 1) === '/' ? path.substr(1) : path, - keys: parentKeys.concat(regexp.keys), - params: params - }; -} - -function matchRoute(route, baseUrl, pathname, parentKeys, parentParams) { - var match; - var childMatches; - var childIndex = 0; - return { - next: function next(routeToSkip) { - if (route === routeToSkip) { - return { - done: true - }; + if (value !== undefined || !hasOwnProperty.call(params, prop)) { + if (key.repeat) { + params[prop] = value ? value.split(key.delimiter).map(decodeParam) : []; + } else { + params[prop] = value ? decodeParam(value) : value; + } } + } - if (!match) { - match = matchPath(route, pathname, parentKeys, parentParams); + return { + path: !end && path.charAt(path.length - 1) === '/' ? path.substr(1) : path, + keys: parentKeys.concat(regexp.keys), + params: params + }; + } - if (match) { + function matchRoute(route, baseUrl, pathname, parentKeys, parentParams) { + var match; + var childMatches; + var childIndex = 0; + return { + next: function next(routeToSkip) { + if (route === routeToSkip) { return { - done: false, - value: { - route: route, - baseUrl: baseUrl, - path: match.path, - keys: match.keys, - params: match.params - } + done: true }; } - } - if (match && route.children) { - while (childIndex < route.children.length) { - if (!childMatches) { - var childRoute = route.children[childIndex]; - childRoute.parent = route; - childMatches = matchRoute(childRoute, baseUrl + match.path, pathname.substr(match.path.length), match.keys, match.params); - } - - var childMatch = childMatches.next(routeToSkip); + if (!match) { + match = matchPath(route, pathname, parentKeys, parentParams); - if (!childMatch.done) { + if (match) { return { done: false, - value: childMatch.value + value: { + route: route, + baseUrl: baseUrl, + path: match.path, + keys: match.keys, + params: match.params + } }; } + } + + if (match && route.children) { + while (childIndex < route.children.length) { + if (!childMatches) { + var childRoute = route.children[childIndex]; + childRoute.parent = route; + childMatches = matchRoute(childRoute, baseUrl + match.path, pathname.substr(match.path.length), match.keys, match.params); + } + + var childMatch = childMatches.next(routeToSkip); + + if (!childMatch.done) { + return { + done: false, + value: childMatch.value + }; + } - childMatches = null; - childIndex++; + childMatches = null; + childIndex++; + } } + + return { + done: true + }; } + }; + } - return { - done: true - }; + function resolveRoute(context, params) { + if (typeof context.route.action === 'function') { + return context.route.action(context, params); } - }; -} -function resolveRoute(context, params) { - if (typeof context.route.action === 'function') { - return context.route.action(context, params); + return undefined; } - return undefined; -} - -function isChildRoute(parentRoute, childRoute) { - var route = childRoute; + function isChildRoute(parentRoute, childRoute) { + var route = childRoute; - while (route) { - route = route.parent; + while (route) { + route = route.parent; - if (route === parentRoute) { - return true; + if (route === parentRoute) { + return true; + } } + + return false; } - return false; -} + var UniversalRouter = function () { + function UniversalRouter(routes, options) { + if (options === void 0) { + options = {}; + } -var UniversalRouter = function () { - function UniversalRouter(routes, options) { - if (options === void 0) { - options = {}; - } + if (Object(routes) !== routes) { + throw new TypeError('Invalid routes'); + } - if (Object(routes) !== routes) { - throw new TypeError('Invalid routes'); + this.baseUrl = options.baseUrl || ''; + this.errorHandler = options.errorHandler; + this.resolveRoute = options.resolveRoute || resolveRoute; + this.context = Object.assign({ + router: this + }, options.context); + this.root = Array.isArray(routes) ? { + path: '', + children: routes, + parent: null + } : routes; + this.root.parent = null; } - this.baseUrl = options.baseUrl || ''; - this.errorHandler = options.errorHandler; - this.resolveRoute = options.resolveRoute || resolveRoute; - this.context = Object.assign({ - router: this - }, options.context); - this.root = Array.isArray(routes) ? { - path: '', - children: routes, - parent: null - } : routes; - this.root.parent = null; - } + var _proto = UniversalRouter.prototype; - var _proto = UniversalRouter.prototype; + _proto.resolve = function resolve(pathnameOrContext) { + var _this = this; - _proto.resolve = function resolve(pathnameOrContext) { - var _this = this; + var context = Object.assign({}, this.context, typeof pathnameOrContext === 'string' ? { + pathname: pathnameOrContext + } : pathnameOrContext); + var match = matchRoute(this.root, this.baseUrl, context.pathname.substr(this.baseUrl.length), [], null); + var resolve = this.resolveRoute; + var matches = null; + var nextMatches = null; + var currentContext = context; - var context = Object.assign({}, this.context, typeof pathnameOrContext === 'string' ? { - pathname: pathnameOrContext - } : pathnameOrContext); - var match = matchRoute(this.root, this.baseUrl, context.pathname.substr(this.baseUrl.length), [], null); - var resolve = this.resolveRoute; - var matches = null; - var nextMatches = null; - var currentContext = context; + function next(resume, parent, prevResult) { + if (parent === void 0) { + parent = matches.value.route; + } - function next(resume, parent, prevResult) { - if (parent === void 0) { - parent = matches.value.route; - } + var routeToSkip = prevResult === null && matches.value.route; + matches = nextMatches || match.next(routeToSkip); + nextMatches = null; - var routeToSkip = prevResult === null && matches.value.route; - matches = nextMatches || match.next(routeToSkip); - nextMatches = null; + if (!resume) { + if (matches.done || !isChildRoute(parent, matches.value.route)) { + nextMatches = matches; + return Promise.resolve(null); + } + } - if (!resume) { - if (matches.done || !isChildRoute(parent, matches.value.route)) { - nextMatches = matches; - return Promise.resolve(null); + if (matches.done) { + var error = new Error('Page not found'); + error.context = context; + error.code = 404; + return Promise.reject(error); } - } - if (matches.done) { - var error = new Error('Page not found'); - error.context = context; - error.code = 404; - return Promise.reject(error); + currentContext = Object.assign({}, context, matches.value); + return Promise.resolve(resolve(currentContext, matches.value.params)).then(function (result) { + if (result !== null && result !== undefined) { + return result; + } + + return next(resume, parent, result); + }); } - currentContext = Object.assign({}, context, matches.value); - return Promise.resolve(resolve(currentContext, matches.value.params)).then(function (result) { - if (result !== null && result !== undefined) { - return result; + context.next = next; + return Promise.resolve().then(function () { + return next(true, _this.root); + }).catch(function (error) { + error.context = error.context || currentContext; + error.code = error.code || 500; + + if (_this.errorHandler) { + return _this.errorHandler(error); } - return next(resume, parent, result); + throw error; }); - } + }; - context.next = next; - return Promise.resolve().then(function () { - return next(true, _this.root); - }).catch(function (error) { - error.context = error.context || currentContext; - error.code = error.code || 500; + return UniversalRouter; + }(); - if (_this.errorHandler) { - return _this.errorHandler(error); - } - - throw error; - }); - }; + UniversalRouter.pathToRegexp = pathToRegexp_1; return UniversalRouter; -}(); - -UniversalRouter.pathToRegexp = pathToRegexp_1; - -return UniversalRouter; }))); //# sourceMappingURL=universal-router.js.map diff --git a/dist/universal-router.js.map b/dist/universal-router.js.map index 330bfd5..7f3765a 100644 --- a/dist/universal-router.js.map +++ b/dist/universal-router.js.map @@ -1 +1 @@ -{"version":3,"file":"universal-router.js","sources":["../node_modules/path-to-regexp/index.js","src/matchPath.js","src/matchRoute.js","src/resolveRoute.js","src/UniversalRouter.js"],"sourcesContent":["/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * Default configs.\n */\nvar DEFAULT_DELIMITER = '/'\nvar DEFAULT_DELIMITERS = './'\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n // Match escaped characters that would otherwise appear in future matches.\n // This allows the user to escape special characters that won't transform.\n '(\\\\\\\\.)',\n // Match Express-style parameters and un-named parameters with a prefix\n // and optional suffixes. Matches appear as:\n //\n // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\"]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined]\n '(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n var tokens = []\n var key = 0\n var index = 0\n var path = ''\n var defaultDelimiter = (options && options.delimiter) || DEFAULT_DELIMITER\n var delimiters = (options && options.delimiters) || DEFAULT_DELIMITERS\n var pathEscaped = false\n var res\n\n while ((res = PATH_REGEXP.exec(str)) !== null) {\n var m = res[0]\n var escaped = res[1]\n var offset = res.index\n path += str.slice(index, offset)\n index = offset + m.length\n\n // Ignore already escaped sequences.\n if (escaped) {\n path += escaped[1]\n pathEscaped = true\n continue\n }\n\n var prev = ''\n var next = str[index]\n var name = res[2]\n var capture = res[3]\n var group = res[4]\n var modifier = res[5]\n\n if (!pathEscaped && path.length) {\n var k = path.length - 1\n\n if (delimiters.indexOf(path[k]) > -1) {\n prev = path[k]\n path = path.slice(0, k)\n }\n }\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path)\n path = ''\n pathEscaped = false\n }\n\n var partial = prev !== '' && next !== undefined && next !== prev\n var repeat = modifier === '+' || modifier === '*'\n var optional = modifier === '?' || modifier === '*'\n var delimiter = prev || defaultDelimiter\n var pattern = capture || group\n\n tokens.push({\n name: name || key++,\n prefix: prev,\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n pattern: pattern ? escapeGroup(pattern) : '[^' + escapeString(delimiter) + ']+?'\n })\n }\n\n // Push any remaining characters.\n if (path || index < str.length) {\n tokens.push(path + str.substr(index))\n }\n\n return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n return tokensToFunction(parse(str, options))\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length)\n\n // Compile all the patterns before compilation.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'object') {\n matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$')\n }\n }\n\n return function (data, options) {\n var path = ''\n var encode = (options && options.encode) || encodeURIComponent\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n path += token\n continue\n }\n\n var value = data ? data[token.name] : undefined\n var segment\n\n if (Array.isArray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but got array')\n }\n\n if (value.length === 0) {\n if (token.optional) continue\n\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encode(value[j], token)\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\"')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment\n }\n\n continue\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n segment = encode(String(value), token)\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but got \"' + segment + '\"')\n }\n\n path += token.prefix + segment\n continue\n }\n\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) path += token.prefix\n\n continue\n }\n\n throw new TypeError('Expected \"' + token.name + '\" to be ' + (token.repeat ? 'an array' : 'a string'))\n }\n\n return path\n }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n return str.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n return group.replace(/([=!:$/()])/g, '\\\\$1')\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {string}\n */\nfunction flags (options) {\n return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param {!RegExp} path\n * @param {Array=} keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n if (!keys) return path\n\n // Use a negative lookahead to match only capturing groups.\n var groups = path.source.match(/\\((?!\\?)/g)\n\n if (groups) {\n for (var i = 0; i < groups.length; i++) {\n keys.push({\n name: i,\n prefix: null,\n delimiter: null,\n optional: false,\n repeat: false,\n partial: false,\n pattern: null\n })\n }\n }\n\n return path\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param {!Array} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n var parts = []\n\n for (var i = 0; i < path.length; i++) {\n parts.push(pathToRegexp(path[i], keys, options).source)\n }\n\n return new RegExp('(?:' + parts.join('|') + ')', flags(options))\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param {string} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param {!Array} tokens\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n options = options || {}\n\n var strict = options.strict\n var end = options.end !== false\n var delimiter = escapeString(options.delimiter || DEFAULT_DELIMITER)\n var delimiters = options.delimiters || DEFAULT_DELIMITERS\n var endsWith = [].concat(options.endsWith || []).map(escapeString).concat('$').join('|')\n var route = ''\n var isEndDelimited = false\n\n // Iterate over the tokens and create our regexp string.\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n route += escapeString(token)\n isEndDelimited = i === tokens.length - 1 && delimiters.indexOf(token[token.length - 1]) > -1\n } else {\n var prefix = escapeString(token.prefix)\n var capture = token.repeat\n ? '(?:' + token.pattern + ')(?:' + prefix + '(?:' + token.pattern + '))*'\n : token.pattern\n\n if (keys) keys.push(token)\n\n if (token.optional) {\n if (token.partial) {\n route += prefix + '(' + capture + ')?'\n } else {\n route += '(?:' + prefix + '(' + capture + '))?'\n }\n } else {\n route += prefix + '(' + capture + ')'\n }\n }\n }\n\n if (end) {\n if (!strict) route += '(?:' + delimiter + ')?'\n\n route += endsWith === '$' ? '$' : '(?=' + endsWith + ')'\n } else {\n if (!strict) route += '(?:' + delimiter + '(?=' + endsWith + '))?'\n if (!isEndDelimited) route += '(?=' + delimiter + '|' + endsWith + ')'\n }\n\n return new RegExp('^' + route, flags(options))\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param {(string|RegExp|Array)} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (path instanceof RegExp) {\n return regexpToRegexp(path, keys)\n }\n\n if (Array.isArray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), keys, options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), keys, options)\n}\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright (c) 2015-present Kriasoft.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport pathToRegexp from 'path-to-regexp'\n\nconst { hasOwnProperty } = Object.prototype\nconst cache = new Map()\n\nfunction decodeParam(val) {\n try {\n return decodeURIComponent(val)\n } catch (err) {\n return val\n }\n}\n\nfunction matchPath(route, pathname, parentKeys, parentParams) {\n const end = !route.children\n const cacheKey = `${route.path || ''}|${end}`\n let regexp = cache.get(cacheKey)\n\n if (!regexp) {\n const keys = []\n regexp = {\n keys,\n pattern: pathToRegexp(route.path || '', keys, { end }),\n }\n cache.set(cacheKey, regexp)\n }\n\n const m = regexp.pattern.exec(pathname)\n if (!m) {\n return null\n }\n\n const path = m[0]\n const params = Object.assign({}, parentParams)\n\n for (let i = 1; i < m.length; i++) {\n const key = regexp.keys[i - 1]\n const prop = key.name\n const value = m[i]\n if (value !== undefined || !hasOwnProperty.call(params, prop)) {\n if (key.repeat) {\n params[prop] = value ? value.split(key.delimiter).map(decodeParam) : []\n } else {\n params[prop] = value ? decodeParam(value) : value\n }\n }\n }\n\n return {\n path: !end && path.charAt(path.length - 1) === '/' ? path.substr(1) : path,\n keys: parentKeys.concat(regexp.keys),\n params,\n }\n}\n\nexport default matchPath\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright (c) 2015-present Kriasoft.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport matchPath from './matchPath'\n\nfunction matchRoute(route, baseUrl, pathname, parentKeys, parentParams) {\n let match\n let childMatches\n let childIndex = 0\n\n return {\n next(routeToSkip) {\n if (route === routeToSkip) {\n return { done: true }\n }\n\n if (!match) {\n match = matchPath(route, pathname, parentKeys, parentParams)\n\n if (match) {\n return {\n done: false,\n value: {\n route,\n baseUrl,\n path: match.path,\n keys: match.keys,\n params: match.params,\n },\n }\n }\n }\n\n if (match && route.children) {\n while (childIndex < route.children.length) {\n if (!childMatches) {\n const childRoute = route.children[childIndex]\n childRoute.parent = route\n\n childMatches = matchRoute(\n childRoute,\n baseUrl + match.path,\n pathname.substr(match.path.length),\n match.keys,\n match.params,\n )\n }\n\n const childMatch = childMatches.next(routeToSkip)\n if (!childMatch.done) {\n return {\n done: false,\n value: childMatch.value,\n }\n }\n\n childMatches = null\n childIndex++\n }\n }\n\n return { done: true }\n },\n }\n}\n\nexport default matchRoute\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright (c) 2015-present Kriasoft.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nfunction resolveRoute(context, params) {\n if (typeof context.route.action === 'function') {\n return context.route.action(context, params)\n }\n return undefined\n}\n\nexport default resolveRoute\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright (c) 2015-present Kriasoft.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport pathToRegexp from 'path-to-regexp'\nimport matchRoute from './matchRoute'\nimport resolveRoute from './resolveRoute'\n\nfunction isChildRoute(parentRoute, childRoute) {\n let route = childRoute\n while (route) {\n route = route.parent\n if (route === parentRoute) {\n return true\n }\n }\n return false\n}\n\nclass UniversalRouter {\n constructor(routes, options = {}) {\n if (Object(routes) !== routes) {\n throw new TypeError('Invalid routes')\n }\n\n this.baseUrl = options.baseUrl || ''\n this.errorHandler = options.errorHandler\n this.resolveRoute = options.resolveRoute || resolveRoute\n this.context = Object.assign({ router: this }, options.context)\n this.root = Array.isArray(routes) ? { path: '', children: routes, parent: null } : routes\n this.root.parent = null\n }\n\n resolve(pathnameOrContext) {\n const context = Object.assign(\n {},\n this.context,\n typeof pathnameOrContext === 'string' ? { pathname: pathnameOrContext } : pathnameOrContext,\n )\n const match = matchRoute(\n this.root,\n this.baseUrl,\n context.pathname.substr(this.baseUrl.length),\n [],\n null,\n )\n const resolve = this.resolveRoute\n let matches = null\n let nextMatches = null\n let currentContext = context\n\n function next(resume, parent = matches.value.route, prevResult) {\n const routeToSkip = prevResult === null && matches.value.route\n matches = nextMatches || match.next(routeToSkip)\n nextMatches = null\n\n if (!resume) {\n if (matches.done || !isChildRoute(parent, matches.value.route)) {\n nextMatches = matches\n return Promise.resolve(null)\n }\n }\n\n if (matches.done) {\n const error = new Error('Page not found')\n error.context = context\n error.code = 404\n return Promise.reject(error)\n }\n\n currentContext = Object.assign({}, context, matches.value)\n\n return Promise.resolve(resolve(currentContext, matches.value.params)).then((result) => {\n if (result !== null && result !== undefined) {\n return result\n }\n return next(resume, parent, result)\n })\n }\n\n context.next = next\n\n return Promise.resolve()\n .then(() => next(true, this.root))\n .catch((error) => {\n error.context = error.context || currentContext\n error.code = error.code || 500\n if (this.errorHandler) {\n return this.errorHandler(error)\n }\n throw error\n })\n }\n}\n\nUniversalRouter.pathToRegexp = pathToRegexp\n\nexport default UniversalRouter\n"],"names":["pathToRegexp","parse","compile","tokensToFunction","tokensToRegExp","DEFAULT_DELIMITER","DEFAULT_DELIMITERS","PATH_REGEXP","RegExp","join","str","options","tokens","key","index","path","defaultDelimiter","delimiter","delimiters","pathEscaped","res","exec","m","escaped","offset","slice","length","prev","next","name","capture","group","modifier","k","indexOf","push","partial","undefined","repeat","optional","pattern","escapeGroup","escapeString","substr","matches","Array","i","data","encode","encodeURIComponent","token","value","segment","isArray","TypeError","j","test","prefix","String","replace","flags","sensitive","regexpToRegexp","keys","groups","source","match","arrayToRegexp","parts","stringToRegexp","strict","end","endsWith","concat","map","route","isEndDelimited","hasOwnProperty","Object","prototype","cache","Map","decodeParam","val","decodeURIComponent","err","matchPath","pathname","parentKeys","parentParams","children","cacheKey","regexp","get","set","params","assign","prop","call","split","charAt","matchRoute","baseUrl","childMatches","childIndex","routeToSkip","childRoute","parent","childMatch","done","resolveRoute","context","action","isChildRoute","parentRoute","UniversalRouter","routes","errorHandler","root","resolve","pathnameOrContext","nextMatches","currentContext","resume","prevResult","Promise","error","Error","code","reject","then","result","catch"],"mappings":"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"} \ No newline at end of file +{"version":3,"file":"universal-router.js","sources":["../node_modules/path-to-regexp/index.js","src/matchPath.js","src/matchRoute.js","src/resolveRoute.js","src/UniversalRouter.js"],"sourcesContent":["/**\n * Expose `pathToRegexp`.\n */\nmodule.exports = pathToRegexp\nmodule.exports.parse = parse\nmodule.exports.compile = compile\nmodule.exports.tokensToFunction = tokensToFunction\nmodule.exports.tokensToRegExp = tokensToRegExp\n\n/**\n * Default configs.\n */\nvar DEFAULT_DELIMITER = '/'\nvar DEFAULT_DELIMITERS = './'\n\n/**\n * The main path matching regexp utility.\n *\n * @type {RegExp}\n */\nvar PATH_REGEXP = new RegExp([\n // Match escaped characters that would otherwise appear in future matches.\n // This allows the user to escape special characters that won't transform.\n '(\\\\\\\\.)',\n // Match Express-style parameters and un-named parameters with a prefix\n // and optional suffixes. Matches appear as:\n //\n // \"/:test(\\\\d+)?\" => [\"/\", \"test\", \"\\d+\", undefined, \"?\"]\n // \"/route(\\\\d+)\" => [undefined, undefined, undefined, \"\\d+\", undefined]\n '(?:\\\\:(\\\\w+)(?:\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))?|\\\\(((?:\\\\\\\\.|[^\\\\\\\\()])+)\\\\))([+*?])?'\n].join('|'), 'g')\n\n/**\n * Parse a string for the raw tokens.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!Array}\n */\nfunction parse (str, options) {\n var tokens = []\n var key = 0\n var index = 0\n var path = ''\n var defaultDelimiter = (options && options.delimiter) || DEFAULT_DELIMITER\n var delimiters = (options && options.delimiters) || DEFAULT_DELIMITERS\n var pathEscaped = false\n var res\n\n while ((res = PATH_REGEXP.exec(str)) !== null) {\n var m = res[0]\n var escaped = res[1]\n var offset = res.index\n path += str.slice(index, offset)\n index = offset + m.length\n\n // Ignore already escaped sequences.\n if (escaped) {\n path += escaped[1]\n pathEscaped = true\n continue\n }\n\n var prev = ''\n var next = str[index]\n var name = res[2]\n var capture = res[3]\n var group = res[4]\n var modifier = res[5]\n\n if (!pathEscaped && path.length) {\n var k = path.length - 1\n\n if (delimiters.indexOf(path[k]) > -1) {\n prev = path[k]\n path = path.slice(0, k)\n }\n }\n\n // Push the current path onto the tokens.\n if (path) {\n tokens.push(path)\n path = ''\n pathEscaped = false\n }\n\n var partial = prev !== '' && next !== undefined && next !== prev\n var repeat = modifier === '+' || modifier === '*'\n var optional = modifier === '?' || modifier === '*'\n var delimiter = prev || defaultDelimiter\n var pattern = capture || group\n\n tokens.push({\n name: name || key++,\n prefix: prev,\n delimiter: delimiter,\n optional: optional,\n repeat: repeat,\n partial: partial,\n pattern: pattern ? escapeGroup(pattern) : '[^' + escapeString(delimiter) + ']+?'\n })\n }\n\n // Push any remaining characters.\n if (path || index < str.length) {\n tokens.push(path + str.substr(index))\n }\n\n return tokens\n}\n\n/**\n * Compile a string to a template function for the path.\n *\n * @param {string} str\n * @param {Object=} options\n * @return {!function(Object=, Object=)}\n */\nfunction compile (str, options) {\n return tokensToFunction(parse(str, options))\n}\n\n/**\n * Expose a method for transforming tokens into the path function.\n */\nfunction tokensToFunction (tokens) {\n // Compile all the tokens into regexps.\n var matches = new Array(tokens.length)\n\n // Compile all the patterns before compilation.\n for (var i = 0; i < tokens.length; i++) {\n if (typeof tokens[i] === 'object') {\n matches[i] = new RegExp('^(?:' + tokens[i].pattern + ')$')\n }\n }\n\n return function (data, options) {\n var path = ''\n var encode = (options && options.encode) || encodeURIComponent\n\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n path += token\n continue\n }\n\n var value = data ? data[token.name] : undefined\n var segment\n\n if (Array.isArray(value)) {\n if (!token.repeat) {\n throw new TypeError('Expected \"' + token.name + '\" to not repeat, but got array')\n }\n\n if (value.length === 0) {\n if (token.optional) continue\n\n throw new TypeError('Expected \"' + token.name + '\" to not be empty')\n }\n\n for (var j = 0; j < value.length; j++) {\n segment = encode(value[j], token)\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected all \"' + token.name + '\" to match \"' + token.pattern + '\"')\n }\n\n path += (j === 0 ? token.prefix : token.delimiter) + segment\n }\n\n continue\n }\n\n if (typeof value === 'string' || typeof value === 'number' || typeof value === 'boolean') {\n segment = encode(String(value), token)\n\n if (!matches[i].test(segment)) {\n throw new TypeError('Expected \"' + token.name + '\" to match \"' + token.pattern + '\", but got \"' + segment + '\"')\n }\n\n path += token.prefix + segment\n continue\n }\n\n if (token.optional) {\n // Prepend partial segment prefixes.\n if (token.partial) path += token.prefix\n\n continue\n }\n\n throw new TypeError('Expected \"' + token.name + '\" to be ' + (token.repeat ? 'an array' : 'a string'))\n }\n\n return path\n }\n}\n\n/**\n * Escape a regular expression string.\n *\n * @param {string} str\n * @return {string}\n */\nfunction escapeString (str) {\n return str.replace(/([.+*?=^!:${}()[\\]|/\\\\])/g, '\\\\$1')\n}\n\n/**\n * Escape the capturing group by escaping special characters and meaning.\n *\n * @param {string} group\n * @return {string}\n */\nfunction escapeGroup (group) {\n return group.replace(/([=!:$/()])/g, '\\\\$1')\n}\n\n/**\n * Get the flags for a regexp from the options.\n *\n * @param {Object} options\n * @return {string}\n */\nfunction flags (options) {\n return options && options.sensitive ? '' : 'i'\n}\n\n/**\n * Pull out keys from a regexp.\n *\n * @param {!RegExp} path\n * @param {Array=} keys\n * @return {!RegExp}\n */\nfunction regexpToRegexp (path, keys) {\n if (!keys) return path\n\n // Use a negative lookahead to match only capturing groups.\n var groups = path.source.match(/\\((?!\\?)/g)\n\n if (groups) {\n for (var i = 0; i < groups.length; i++) {\n keys.push({\n name: i,\n prefix: null,\n delimiter: null,\n optional: false,\n repeat: false,\n partial: false,\n pattern: null\n })\n }\n }\n\n return path\n}\n\n/**\n * Transform an array into a regexp.\n *\n * @param {!Array} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction arrayToRegexp (path, keys, options) {\n var parts = []\n\n for (var i = 0; i < path.length; i++) {\n parts.push(pathToRegexp(path[i], keys, options).source)\n }\n\n return new RegExp('(?:' + parts.join('|') + ')', flags(options))\n}\n\n/**\n * Create a path regexp from string input.\n *\n * @param {string} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction stringToRegexp (path, keys, options) {\n return tokensToRegExp(parse(path, options), keys, options)\n}\n\n/**\n * Expose a function for taking tokens and returning a RegExp.\n *\n * @param {!Array} tokens\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction tokensToRegExp (tokens, keys, options) {\n options = options || {}\n\n var strict = options.strict\n var end = options.end !== false\n var delimiter = escapeString(options.delimiter || DEFAULT_DELIMITER)\n var delimiters = options.delimiters || DEFAULT_DELIMITERS\n var endsWith = [].concat(options.endsWith || []).map(escapeString).concat('$').join('|')\n var route = ''\n var isEndDelimited = false\n\n // Iterate over the tokens and create our regexp string.\n for (var i = 0; i < tokens.length; i++) {\n var token = tokens[i]\n\n if (typeof token === 'string') {\n route += escapeString(token)\n isEndDelimited = i === tokens.length - 1 && delimiters.indexOf(token[token.length - 1]) > -1\n } else {\n var prefix = escapeString(token.prefix)\n var capture = token.repeat\n ? '(?:' + token.pattern + ')(?:' + prefix + '(?:' + token.pattern + '))*'\n : token.pattern\n\n if (keys) keys.push(token)\n\n if (token.optional) {\n if (token.partial) {\n route += prefix + '(' + capture + ')?'\n } else {\n route += '(?:' + prefix + '(' + capture + '))?'\n }\n } else {\n route += prefix + '(' + capture + ')'\n }\n }\n }\n\n if (end) {\n if (!strict) route += '(?:' + delimiter + ')?'\n\n route += endsWith === '$' ? '$' : '(?=' + endsWith + ')'\n } else {\n if (!strict) route += '(?:' + delimiter + '(?=' + endsWith + '))?'\n if (!isEndDelimited) route += '(?=' + delimiter + '|' + endsWith + ')'\n }\n\n return new RegExp('^' + route, flags(options))\n}\n\n/**\n * Normalize the given path string, returning a regular expression.\n *\n * An empty array can be passed in for the keys, which will hold the\n * placeholder key descriptions. For example, using `/user/:id`, `keys` will\n * contain `[{ name: 'id', delimiter: '/', optional: false, repeat: false }]`.\n *\n * @param {(string|RegExp|Array)} path\n * @param {Array=} keys\n * @param {Object=} options\n * @return {!RegExp}\n */\nfunction pathToRegexp (path, keys, options) {\n if (path instanceof RegExp) {\n return regexpToRegexp(path, keys)\n }\n\n if (Array.isArray(path)) {\n return arrayToRegexp(/** @type {!Array} */ (path), keys, options)\n }\n\n return stringToRegexp(/** @type {string} */ (path), keys, options)\n}\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright (c) 2015-present Kriasoft.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport pathToRegexp from 'path-to-regexp'\n\nconst { hasOwnProperty } = Object.prototype\nconst cache = new Map()\n\nfunction decodeParam(val) {\n try {\n return decodeURIComponent(val)\n } catch (err) {\n return val\n }\n}\n\nfunction matchPath(route, pathname, parentKeys, parentParams) {\n const end = !route.children\n const cacheKey = `${route.path || ''}|${end}`\n let regexp = cache.get(cacheKey)\n\n if (!regexp) {\n const keys = []\n regexp = {\n keys,\n pattern: pathToRegexp(route.path || '', keys, { end }),\n }\n cache.set(cacheKey, regexp)\n }\n\n const m = regexp.pattern.exec(pathname)\n if (!m) {\n return null\n }\n\n const path = m[0]\n const params = Object.assign({}, parentParams)\n\n for (let i = 1; i < m.length; i++) {\n const key = regexp.keys[i - 1]\n const prop = key.name\n const value = m[i]\n if (value !== undefined || !hasOwnProperty.call(params, prop)) {\n if (key.repeat) {\n params[prop] = value ? value.split(key.delimiter).map(decodeParam) : []\n } else {\n params[prop] = value ? decodeParam(value) : value\n }\n }\n }\n\n return {\n path: !end && path.charAt(path.length - 1) === '/' ? path.substr(1) : path,\n keys: parentKeys.concat(regexp.keys),\n params,\n }\n}\n\nexport default matchPath\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright (c) 2015-present Kriasoft.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport matchPath from './matchPath'\n\nfunction matchRoute(route, baseUrl, pathname, parentKeys, parentParams) {\n let match\n let childMatches\n let childIndex = 0\n\n return {\n next(routeToSkip) {\n if (route === routeToSkip) {\n return { done: true }\n }\n\n if (!match) {\n match = matchPath(route, pathname, parentKeys, parentParams)\n\n if (match) {\n return {\n done: false,\n value: {\n route,\n baseUrl,\n path: match.path,\n keys: match.keys,\n params: match.params,\n },\n }\n }\n }\n\n if (match && route.children) {\n while (childIndex < route.children.length) {\n if (!childMatches) {\n const childRoute = route.children[childIndex]\n childRoute.parent = route\n\n childMatches = matchRoute(\n childRoute,\n baseUrl + match.path,\n pathname.substr(match.path.length),\n match.keys,\n match.params,\n )\n }\n\n const childMatch = childMatches.next(routeToSkip)\n if (!childMatch.done) {\n return {\n done: false,\n value: childMatch.value,\n }\n }\n\n childMatches = null\n childIndex++\n }\n }\n\n return { done: true }\n },\n }\n}\n\nexport default matchRoute\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright (c) 2015-present Kriasoft.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nfunction resolveRoute(context, params) {\n if (typeof context.route.action === 'function') {\n return context.route.action(context, params)\n }\n return undefined\n}\n\nexport default resolveRoute\n","/**\n * Universal Router (https://www.kriasoft.com/universal-router/)\n *\n * Copyright (c) 2015-present Kriasoft.\n *\n * This source code is licensed under the MIT license found in the\n * LICENSE.txt file in the root directory of this source tree.\n */\n\nimport pathToRegexp from 'path-to-regexp'\nimport matchRoute from './matchRoute'\nimport resolveRoute from './resolveRoute'\n\nfunction isChildRoute(parentRoute, childRoute) {\n let route = childRoute\n while (route) {\n route = route.parent\n if (route === parentRoute) {\n return true\n }\n }\n return false\n}\n\nclass UniversalRouter {\n constructor(routes, options = {}) {\n if (Object(routes) !== routes) {\n throw new TypeError('Invalid routes')\n }\n\n this.baseUrl = options.baseUrl || ''\n this.errorHandler = options.errorHandler\n this.resolveRoute = options.resolveRoute || resolveRoute\n this.context = Object.assign({ router: this }, options.context)\n this.root = Array.isArray(routes) ? { path: '', children: routes, parent: null } : routes\n this.root.parent = null\n }\n\n resolve(pathnameOrContext) {\n const context = Object.assign(\n {},\n this.context,\n typeof pathnameOrContext === 'string' ? { pathname: pathnameOrContext } : pathnameOrContext,\n )\n const match = matchRoute(\n this.root,\n this.baseUrl,\n context.pathname.substr(this.baseUrl.length),\n [],\n null,\n )\n const resolve = this.resolveRoute\n let matches = null\n let nextMatches = null\n let currentContext = context\n\n function next(resume, parent = matches.value.route, prevResult) {\n const routeToSkip = prevResult === null && matches.value.route\n matches = nextMatches || match.next(routeToSkip)\n nextMatches = null\n\n if (!resume) {\n if (matches.done || !isChildRoute(parent, matches.value.route)) {\n nextMatches = matches\n return Promise.resolve(null)\n }\n }\n\n if (matches.done) {\n const error = new Error('Page not found')\n error.context = context\n error.code = 404\n return Promise.reject(error)\n }\n\n currentContext = Object.assign({}, context, matches.value)\n\n return Promise.resolve(resolve(currentContext, matches.value.params)).then((result) => {\n if (result !== null && result !== undefined) {\n return result\n }\n return next(resume, parent, result)\n })\n }\n\n context.next = next\n\n return Promise.resolve()\n .then(() => next(true, this.root))\n .catch((error) => {\n error.context = error.context || currentContext\n error.code = error.code || 500\n if (this.errorHandler) {\n return this.errorHandler(error)\n }\n throw error\n })\n }\n}\n\nUniversalRouter.pathToRegexp = pathToRegexp\n\nexport default UniversalRouter\n"],"names":["pathToRegexp","parse","compile","tokensToFunction","tokensToRegExp","DEFAULT_DELIMITER","DEFAULT_DELIMITERS","PATH_REGEXP","RegExp","join","str","options","tokens","key","index","path","defaultDelimiter","delimiter","delimiters","pathEscaped","res","exec","m","escaped","offset","slice","length","prev","next","name","capture","group","modifier","k","indexOf","push","partial","undefined","repeat","optional","pattern","prefix","escapeGroup","escapeString","substr","matches","Array","i","data","encode","encodeURIComponent","token","value","segment","isArray","TypeError","j","test","String","replace","flags","sensitive","regexpToRegexp","keys","groups","source","match","arrayToRegexp","parts","stringToRegexp","strict","end","endsWith","concat","map","route","isEndDelimited","hasOwnProperty","Object","prototype","cache","Map","decodeParam","val","decodeURIComponent","err","matchPath","pathname","parentKeys","parentParams","children","cacheKey","regexp","get","set","params","assign","prop","call","split","charAt","matchRoute","baseUrl","childMatches","childIndex","routeToSkip","done","childRoute","parent","childMatch","resolveRoute","context","action","isChildRoute","parentRoute","UniversalRouter","routes","errorHandler","router","root","resolve","pathnameOrContext","nextMatches","currentContext","resume","prevResult","Promise","error","Error","code","reject","then","result","catch"],"mappings":"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"} \ No newline at end of file diff --git a/package.json b/package.json index 297550b..1ee4728 100644 --- a/package.json +++ b/package.json @@ -26,9 +26,9 @@ "path-to-regexp": "^2.2.0" }, "devDependencies": { - "@babel/core": "7.0.0-beta.40", - "@babel/preset-env": "7.0.0-beta.40", - "@babel/register": "7.0.0-beta.40", + "@babel/core": "7.0.0-beta.44", + "@babel/preset-env": "7.0.0-beta.44", + "@babel/register": "7.0.0-beta.44", "babel-core": "^7.0.0-0", "babel-jest": "^22.4.1", "eslint": "^4.18.2", @@ -40,7 +40,7 @@ "husky": "^0.14.3", "jest": "^22.4.2", "prettier": "^1.11.1", - "rollup": "^0.56.5", + "rollup": "^0.57.1", "rollup-plugin-babel": "4.0.0-beta.2", "rollup-plugin-commonjs": "^9.0.0", "rollup-plugin-node-resolve": "^3.2.0", @@ -48,7 +48,7 @@ }, "scripts": { "lint": "eslint src test tools", - "test": "jest --coverage", + "test": "jest", "build": "node tools/build", "precommit": "node tools/precommit" } diff --git a/test/README.md b/test/README.md index 8d8ce4c..8b4fd61 100644 --- a/test/README.md +++ b/test/README.md @@ -1,19 +1,18 @@ # Testing -[![Build Status](https://img.shields.io/travis/kriasoft/universal-router/master.svg?maxAge=3600)](https://travis-ci.org/kriasoft/universal-router) -[![Coverage Status](https://img.shields.io/codecov/c/github/kriasoft/universal-router.svg?maxAge=3600)](https://codecov.io/gh/kriasoft/universal-router) -[![Dependency Status](https://img.shields.io/david/kriasoft/universal-router.svg?maxAge=3600)](https://david-dm.org/kriasoft/universal-router) +[![Build Status](https://img.shields.io/travis/kriasoft/universal-router/master.svg)](https://travis-ci.org/kriasoft/universal-router) +[![Coverage Status](https://img.shields.io/codecov/c/github/kriasoft/universal-router.svg)](https://codecov.io/gh/kriasoft/universal-router) +[![Dependency Status](https://img.shields.io/david/kriasoft/universal-router.svg)](https://david-dm.org/kriasoft/universal-router) -Find problematic patterns in code: +Find problematic patterns in code using [ESLint](https://eslint.org/) and [Prettier](https://prettier.io/) +by following [Airbnb Style Guide](https://github.com/airbnb/javascript): ```bash npm run lint ``` -Run unit tests: +Run unit tests using [Jest](http://facebook.github.io/jest/): ```bash npm run test ``` - -For more information visit http://facebook.github.io/jest/ diff --git a/test/UniversalRouter.test.js b/test/UniversalRouter.test.js index 6e7e597..e6155a6 100644 --- a/test/UniversalRouter.test.js +++ b/test/UniversalRouter.test.js @@ -32,8 +32,8 @@ describe('new UniversalRouter(routes, options)', () => { { resolveRoute }, ) const result = await router.resolve('/a/c') - expect(resolveRoute).toHaveBeenCalledTimes(3) - expect(action).not.toHaveBeenCalled() + expect(resolveRoute.mock.calls.length).toBe(3) + expect(action.mock.calls.length).toBe(0) expect(result).toBe('c') }) @@ -42,7 +42,7 @@ describe('new UniversalRouter(routes, options)', () => { const router = new UniversalRouter([], { errorHandler }) const result = await router.resolve('/') expect(result).toBe('result') - expect(errorHandler).toHaveBeenCalled() + expect(errorHandler.mock.calls.length).toBe(1) const error = errorHandler.mock.calls[0][0] expect(error).toBeInstanceOf(Error) expect(error.message).toBe('Page not found') @@ -63,7 +63,7 @@ describe('new UniversalRouter(routes, options)', () => { const router = new UniversalRouter(route, { errorHandler }) const result = await router.resolve('/') expect(result).toBe('result') - expect(errorHandler).toHaveBeenCalled() + expect(errorHandler.mock.calls.length).toBe(1) const error = errorHandler.mock.calls[0][0] expect(error).toBeInstanceOf(Error) expect(error.message).toBe('custom') @@ -96,7 +96,7 @@ describe('router.resolve({ pathname, ...context })', () => { const action = jest.fn(() => 'b') const router = new UniversalRouter({ path: '/a', action }) const result = await router.resolve('/a') - expect(action).toHaveBeenCalled() + expect(action.mock.calls.length).toBe(1) expect(action.mock.calls[0][0]).toHaveProperty('path', '/a') expect(result).toBe('b') }) @@ -114,17 +114,17 @@ describe('router.resolve({ pathname, ...context })', () => { ]) const result = await router.resolve('/a') expect(result).toBe('c') - expect(action1).toHaveBeenCalled() - expect(action2).toHaveBeenCalled() - expect(action3).toHaveBeenCalled() - expect(action4).not.toHaveBeenCalled() + expect(action1.mock.calls.length).toBe(1) + expect(action2.mock.calls.length).toBe(1) + expect(action3.mock.calls.length).toBe(1) + expect(action4.mock.calls.length).toBe(0) }) it('should be able to pass context variables to action methods', async () => { const action = jest.fn(() => true) const router = new UniversalRouter([{ path: '/a', action }]) const result = await router.resolve({ pathname: '/a', test: 'b' }) - expect(action).toHaveBeenCalled() + expect(action.mock.calls.length).toBe(1) expect(action.mock.calls[0][0]).toHaveProperty('path', '/a') expect(action.mock.calls[0][0]).toHaveProperty('test', 'b') expect(result).toBe(true) @@ -142,7 +142,7 @@ describe('router.resolve({ pathname, ...context })', () => { expect(err).toBeInstanceOf(Error) expect(err.message).toBe('Page not found') expect(err.code).toBe(404) - expect(action).not.toHaveBeenCalled() + expect(action.mock.calls.length).toBe(0) }) it('should support asynchronous route actions', async () => { @@ -155,7 +155,7 @@ describe('router.resolve({ pathname, ...context })', () => { const action = jest.fn(() => true) const router = new UniversalRouter([{ path: '/:one/:two', action }]) const result = await router.resolve({ pathname: '/a/b' }) - expect(action).toHaveBeenCalled() + expect(action.mock.calls.length).toBe(1) expect(action.mock.calls[0][0]).toHaveProperty('params', { one: 'a', two: 'b' }) expect(result).toBe(true) }) @@ -176,9 +176,9 @@ describe('router.resolve({ pathname, ...context })', () => { }, ]) const result = await router.resolve({ pathname: '/a/b' }) - expect(action1).toHaveBeenCalled() + expect(action1.mock.calls.length).toBe(1) expect(action1.mock.calls[0][0]).toHaveProperty('params', { one: 'a' }) - expect(action2).toHaveBeenCalled() + expect(action2.mock.calls.length).toBe(1) expect(action2.mock.calls[0][0]).toHaveProperty('params', { one: 'a', two: 'b' }) expect(result).toBe(true) }) @@ -203,10 +203,10 @@ describe('router.resolve({ pathname, ...context })', () => { }, ]) const result = await router.resolve({ pathname: '/a/b' }) - expect(action1).toHaveBeenCalledTimes(2) + expect(action1.mock.calls.length).toBe(2) expect(action1.mock.calls[0][0]).toHaveProperty('params', { one: 'a' }) expect(action1.mock.calls[1][0]).toHaveProperty('params', { one: 'b' }) - expect(action2).toHaveBeenCalled() + expect(action2.mock.calls.length).toBe(1) expect(action2.mock.calls[0][0]).toHaveProperty('params', { one: 'a', two: 'b' }) expect(result).toBe(true) }) @@ -242,13 +242,13 @@ describe('router.resolve({ pathname, ...context })', () => { }, ]) const result = await router.resolve({ pathname: '/a/b' }) - expect(action1).toHaveBeenCalledTimes(2) + expect(action1.mock.calls.length).toBe(2) expect(action1.mock.calls[0][0]).toHaveProperty('params', { one: 'a' }) expect(action1.mock.calls[1][0]).toHaveProperty('params', { one: 'a', two: 'b' }) - expect(action2).toHaveBeenCalledTimes(2) + expect(action2.mock.calls.length).toBe(2) expect(action2.mock.calls[0][0]).toHaveProperty('params', { three: 'a' }) expect(action2.mock.calls[1][0]).toHaveProperty('params', { three: 'a', four: 'b' }) - expect(action3).toHaveBeenCalled() + expect(action3.mock.calls.length).toBe(1) expect(action3.mock.calls[0][0]).toHaveProperty('params', { three: 'a', five: 'b' }) expect(result).toBe(true) }) @@ -407,7 +407,7 @@ describe('router.resolve({ pathname, ...context })', () => { const action = jest.fn(() => true) const router = new UniversalRouter([{ path: '/path/:a/other/:b', action }]) const result = await router.resolve('/path/1/other/2') - expect(action).toHaveBeenCalled() + expect(action.mock.calls.length).toBe(1) expect(action.mock.calls[0][0]).toHaveProperty('params.a', '1') expect(action.mock.calls[0][0]).toHaveProperty('params.b', '2') expect(action.mock.calls[0][1]).toHaveProperty('a', '1') @@ -432,9 +432,9 @@ describe('router.resolve({ pathname, ...context })', () => { ]) const result = await router.resolve('/a') - expect(action1).toHaveBeenCalled() + expect(action1.mock.calls.length).toBe(1) expect(action1.mock.calls[0][0]).toHaveProperty('path', '') - expect(action2).toHaveBeenCalled() + expect(action2.mock.calls.length).toBe(1) expect(action2.mock.calls[0][0]).toHaveProperty('path', '/a') expect(result).toBe(true) }) @@ -456,9 +456,9 @@ describe('router.resolve({ pathname, ...context })', () => { ]) const result = await router.resolve('/a/b') - expect(action1).toHaveBeenCalled() + expect(action1.mock.calls.length).toBe(1) expect(action1.mock.calls[0][0]).toHaveProperty('path', '/a') - expect(action2).toHaveBeenCalled() + expect(action2.mock.calls.length).toBe(1) expect(action2.mock.calls[0][0]).toHaveProperty('path', '/b') expect(result).toBe(true) }) @@ -485,13 +485,13 @@ describe('router.resolve({ pathname, ...context })', () => { ]) const result = await router.resolve('/a/b') - expect(action1).toHaveBeenCalled() + expect(action1.mock.calls.length).toBe(1) expect(action1.mock.calls[0][0]).toHaveProperty('baseUrl', '') expect(action1.mock.calls[0][0]).toHaveProperty('path', '/a') - expect(action2).toHaveBeenCalled() + expect(action2.mock.calls.length).toBe(1) expect(action2.mock.calls[0][0]).toHaveProperty('baseUrl', '/a') expect(action2.mock.calls[0][0]).toHaveProperty('path', '/b') - expect(action3).toHaveBeenCalled() + expect(action3.mock.calls.length).toBe(1) expect(action3.mock.calls[0][0]).toHaveProperty('baseUrl', '') expect(action3.mock.calls[0][0]).toHaveProperty('path', '/a/b') expect(result).toBe(true) @@ -529,7 +529,7 @@ describe('router.resolve({ pathname, ...context })', () => { } const router = new UniversalRouter(routes, { baseUrl: '/base' }) const result = await router.resolve('/base/a/b/c') - expect(action).toHaveBeenCalled() + expect(action.mock.calls.length).toBe(1) expect(action.mock.calls[0][0]).toHaveProperty('pathname', '/base/a/b/c') expect(action.mock.calls[0][0]).toHaveProperty('path', '/c') expect(action.mock.calls[0][0]).toHaveProperty('baseUrl', '/base/a/b') @@ -543,7 +543,7 @@ describe('router.resolve({ pathname, ...context })', () => { } catch (e) { err = e } - expect(action).toHaveBeenCalled() + expect(action.mock.calls.length).toBe(1) expect(err).toBeInstanceOf(Error) expect(err.message).toBe('Page not found') expect(err.code).toBe(404) @@ -584,8 +584,8 @@ describe('router.resolve({ pathname, ...context })', () => { const result = await router.resolve('/match') expect(result).toBe(404) - expect(action).not.toHaveBeenCalled() - expect(middleware).toHaveBeenCalled() + expect(action.mock.calls.length).toBe(0) + expect(middleware.mock.calls.length).toBe(1) }) it('should match nested routes when middleware route returns undefined', async () => { @@ -605,7 +605,7 @@ describe('router.resolve({ pathname, ...context })', () => { const result = await router.resolve('/match') expect(result).toBe(404) - expect(action).toHaveBeenCalled() - expect(middleware).toHaveBeenCalled() + expect(action.mock.calls.length).toBe(1) + expect(middleware.mock.calls.length).toBe(1) }) }) diff --git a/test/generateUrls.test.js b/test/generateUrls.test.js index f2a6a4b..f7262ef 100644 --- a/test/generateUrls.test.js +++ b/test/generateUrls.test.js @@ -199,7 +199,7 @@ describe('generateUrls(router, options)(routeName, params)', () => { const url = generateUrls(router, { stringifyQueryParams }) expect(url('user', { user: 'tj', busy: 1 })).toBe('/tj?qs') - expect(stringifyQueryParams).toHaveBeenCalled() + expect(stringifyQueryParams.mock.calls.length).toBe(1) expect(stringifyQueryParams.mock.calls[0][0]).toEqual({ busy: 1 }) }) @@ -210,7 +210,7 @@ describe('generateUrls(router, options)(routeName, params)', () => { const url = generateUrls(router, { stringifyQueryParams }) expect(url('user', { username: 'tj', busy: 1 })).toBe('/user/tj') - expect(stringifyQueryParams).toHaveBeenCalled() + expect(stringifyQueryParams.mock.calls.length).toBe(1) expect(stringifyQueryParams.mock.calls[0][0]).toEqual({ busy: 1 }) }) @@ -221,7 +221,7 @@ describe('generateUrls(router, options)(routeName, params)', () => { const url = generateUrls(router, { stringifyQueryParams }) expect(url('me', { x: 'i', y: 'j', z: 'k' })).toBe('/me?x=i&y=j&z=k') - expect(stringifyQueryParams).toHaveBeenCalled() + expect(stringifyQueryParams.mock.calls.length).toBe(1) expect(stringifyQueryParams.mock.calls[0][0]).toEqual({ x: 'i', y: 'j', z: 'k' }) }) }) diff --git a/tools/build.js b/tools/build.js index 5680840..d25e1c3 100644 --- a/tools/build.js +++ b/tools/build.js @@ -84,7 +84,7 @@ const files = [ async function build() { // Clean up the output directory - await fs.remove('dist') + await fs.emptyDir('dist') // Copy source code, readme and license await Promise.all([ diff --git a/tools/precommit.js b/tools/precommit.js index 9a39639..48e8aee 100644 --- a/tools/precommit.js +++ b/tools/precommit.js @@ -26,8 +26,8 @@ function spawn(command, args) { } async function precommit() { - await spawn('npm', ['run', '-s', 'lint']) - await spawn('npm', ['run', '-s', 'test']) + await spawn('npm', ['run', '--silent', 'lint']) + await spawn('npm', ['run', '--silent', 'test']) } module.exports = precommit()