@ionic/core
Version:
Base components for Ionic
84 lines (83 loc) • 2.22 kB
JavaScript
import { ROUTER_INTENT_FORWARD } from './constants';
export function generatePath(segments) {
const path = segments
.filter(s => s.length > 0)
.join('/');
return '/' + path;
}
export function chainToPath(chain) {
const path = [];
for (const route of chain) {
for (const segment of route.path) {
if (segment[0] === ':') {
const param = route.params && route.params[segment.slice(1)];
if (!param) {
return null;
}
path.push(param);
}
else if (segment !== '') {
path.push(segment);
}
}
}
return path;
}
export function writePath(history, root, useHash, path, direction, state) {
let url = generatePath([
...parsePath(root),
...path
]);
if (useHash) {
url = '#' + url;
}
if (direction === ROUTER_INTENT_FORWARD) {
history.pushState(state, '', url);
}
else {
history.replaceState(state, '', url);
}
}
export function removePrefix(prefix, path) {
if (prefix.length > path.length) {
return null;
}
if (prefix.length <= 1 && prefix[0] === '') {
return path;
}
for (let i = 0; i < prefix.length; i++) {
if (prefix[i].length > 0 && prefix[i] !== path[i]) {
return null;
}
}
if (path.length === prefix.length) {
return [''];
}
return path.slice(prefix.length);
}
export function readPath(loc, root, useHash) {
let pathname = loc.pathname;
if (useHash) {
const hash = loc.hash;
pathname = (hash[0] === '#')
? hash.slice(1)
: '';
}
const prefix = parsePath(root);
const path = parsePath(pathname);
return removePrefix(prefix, path);
}
export function parsePath(path) {
if (path == null) {
return [''];
}
const segments = path.split('/')
.map(s => s.trim())
.filter(s => s.length > 0);
if (segments.length === 0) {
return [''];
}
else {
return segments;
}
}