Skip to content

Instantly share code, notes, and snippets.

@honewatson
Created August 17, 2017 06:39
Show Gist options
  • Save honewatson/ef026c48a4ecc045db3d7271570f944c to your computer and use it in GitHub Desktop.
Save honewatson/ef026c48a4ecc045db3d7271570f944c to your computer and use it in GitHub Desktop.
HyperApp 0.11.0 Router
/**
mixins: [
Router(view)
],
*/
export function Router(appView) {
return function router(emit, view) {
return {
state: {
router: match(location.pathname)
},
actions: {
router: {
match: function (state, actions, data) {
return {
router: emit("route", match(data))
}
},
go: function (state, actions, data) {
history.pushState({}, "", data)
actions.router.match(data.split("?")[0])
}
}
},
events: {
load: function (state, actions) {
addEventListener("popstate", match)
function match() {
actions.router.match(location.pathname)
}
},
render: function () {
return view
}
}
}
function match(data) {
for (var match, params = {}, i = 0, len = appView.length; i < len; i++) {
var route = appView[i][0]
var keys = []
if (!match) {
data.replace(
RegExp(
route === "*"
? "." + route
: "^" +
route
.replace(/\//g, "\\/")
.replace(/:([\w]+)/g, function (_, key) {
keys.push(key)
return "([-\\.%\\w]+)"
}) +
"/?$",
"g"
),
function () {
for (var j = 1; j < arguments.length - 2;) {
params[keys.shift()] = arguments[j++]
}
match = route
view = appView[i][1]
}
)
}
}
return {
match: match,
params: params
}
}
}
}
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment