Skip to content

Commit

Permalink
refactor: extract compileRoute to separate file
Browse files Browse the repository at this point in the history
  • Loading branch information
Guria committed Mar 7, 2016
1 parent b9406ba commit 613c82c
Show file tree
Hide file tree
Showing 3 changed files with 87 additions and 83 deletions.
2 changes: 1 addition & 1 deletion README.md
Original file line number Diff line number Diff line change
Expand Up @@ -197,7 +197,7 @@ options | `Any` | `Optional`. Passed to `compileFn` as second argument.

For each route mapper would call `compileFn(route, options)` and cache result internally.
`compileFn` should return `parse(url)` and `stringify(values)` methods for any given route.
See [default implementation](/index.js#L6) for reference.
See [default implementation](/compileRoute.js) for reference.

##### Returns

Expand Down
85 changes: 85 additions & 0 deletions compileRoute.js
Original file line number Diff line number Diff line change
@@ -0,0 +1,85 @@
'use strict'
var URLON = require('urlon')
var pathToRegexp = require('path-to-regexp')

function compileRoute (route, options) {
var re
var compiled
var keys = []
var querySeparator = options.querySeparator || '?'

re = pathToRegexp(route, keys)
keys = keys.map(function (key) { return key.name.toString() })
compiled = pathToRegexp.compile(route)

return {
parse: function (url) {
var path = url
var result = {}

if (~path.indexOf('#') && !~querySeparator.indexOf('#')) {
path = path.split('#')[0]
}

if (~path.indexOf(querySeparator)) {
if (options.query) {
var queryString = '_' + path.slice(path.indexOf(querySeparator) + querySeparator.length)
result = URLON.parse(queryString)
}
path = path.split(querySeparator)[0]
}

var match = re.exec(path)
if (!match) return null

for (var i = 1; i < match.length; ++i) {
var key = keys[i - 1]
var value = decodeURIComponent(match[i])
if (value[0] === ':') {
result[key] = URLON.parse(value)
} else {
result[key] = value
}
}

return result
},

stringify: function (values) {
var pathParams = {}
var queryParams = {}

Object.keys(values).forEach(function (key) {
if (~keys.indexOf(key)) {
switch (typeof values[key]) {
case 'boolean':
case 'number':
pathParams[key] = URLON.stringify(values[key])
break

case 'object':
throw new Error('URL Mapper - objects are not allowed to be stringified as part of path')

default:
pathParams[key] = values[key]
}
} else {
if (typeof values[key] !== 'undefined') queryParams[key] = values[key]
}
})

var path = compiled(pathParams)
var queryString = ''

if (options.query) {
if (Object.keys(queryParams).length) {
queryString = querySeparator + URLON.stringify(queryParams).slice(1)
}
}

return path + queryString
}
}
}

module.exports = compileRoute
83 changes: 1 addition & 82 deletions index.js
Original file line number Diff line number Diff line change
@@ -1,87 +1,6 @@
'use strict'
var mapper = require('./mapper')
var URLON = require('urlon')
var pathToRegexp = require('path-to-regexp')

function compileRoute (route, options) {
var re
var compiled
var keys = []
var querySeparator = options.querySeparator || '?'

re = pathToRegexp(route, keys)
keys = keys.map(function (key) { return key.name.toString() })
compiled = pathToRegexp.compile(route)

return {
parse: function (url) {
var path = url
var result = {}

if (~path.indexOf('#') && !~querySeparator.indexOf('#')) {
path = path.split('#')[0]
}

if (~path.indexOf(querySeparator)) {
if (options.query) {
var queryString = '_' + path.slice(path.indexOf(querySeparator) + querySeparator.length)
result = URLON.parse(queryString)
}
path = path.split(querySeparator)[0]
}

var match = re.exec(path)
if (!match) return null

for (var i = 1; i < match.length; ++i) {
var key = keys[i - 1]
var value = decodeURIComponent(match[i])
if (value[0] === ':') {
result[key] = URLON.parse(value)
} else {
result[key] = value
}
}

return result
},

stringify: function (values) {
var pathParams = {}
var queryParams = {}

Object.keys(values).forEach(function (key) {
if (~keys.indexOf(key)) {
switch (typeof values[key]) {
case 'boolean':
case 'number':
pathParams[key] = URLON.stringify(values[key])
break

case 'object':
throw new Error('URL Mapper - objects are not allowed to be stringified as part of path')

default:
pathParams[key] = values[key]
}
} else {
if (typeof values[key] !== 'undefined') queryParams[key] = values[key]
}
})

var path = compiled(pathParams)
var queryString = ''

if (options.query) {
if (Object.keys(queryParams).length) {
queryString = querySeparator + URLON.stringify(queryParams).slice(1)
}
}

return path + queryString
}
}
}
var compileRoute = require('./compileRoute')

module.exports = function urlMapper (options) {
return mapper(compileRoute, options)
Expand Down

0 comments on commit 613c82c

Please sign in to comment.