react-view-router
Version:
react-view-router
114 lines (113 loc) • 3.95 kB
JavaScript
import "core-js/modules/es6.object.to-string.js";
import "core-js/modules/es6.regexp.to-string.js";
import "core-js/modules/es6.regexp.replace.js";
import "core-js/modules/es6.regexp.split.js";
import "core-js/modules/es6.array.sort.js";
import "core-js/modules/es6.array.filter.js";
import "core-js/modules/es6.array.map.js";
var encodeReserveRE = /[!'()*]/g;
var encodeReserveReplacer = c => '%' + c.charCodeAt(0).toString(16);
var commaRE = /%2C/g;
// fixed encodeURIComponent which is more conformant to RFC3986:
// - escapes [!'()*]
// - preserve commas
var encode = str => encodeURIComponent(str).replace(encodeReserveRE, encodeReserveReplacer).replace(commaRE, ',');
var decode = decodeURIComponent;
function parseQuery(query, props = {}) {
var res = {};
query = query.trim().replace(/^(\?|#|&)/, '');
if (!query) {
return res;
}
query.split('&').forEach(param => {
var parts = param.replace(/\+/g, ' ').split('=');
var key = decode(parts.shift() || '');
var val = parts.length > 0 ? decode(parts.join('=')) : null;
if (val === 'true') val = true;else if (val === 'false') val = false;else if (val === 'null') val = null;else if (val === 'undefined') val = undefined;else if (val === 'NaN') val = NaN;else if ((val || '').indexOf('[object ') !== 0 && /^(\{.*\})|(\[.*\])$/.test(val)) {
try {
val = JSON.parse(val);
} catch (e) {/* empty */}
} else if (props[key]) {
try {
val = props[key](val, key, query);
} catch (e) {
console.error(e);
}
}
if (res[key] === undefined) {
res[key] = val;
} else if (Array.isArray(res[key])) {
res[key].push(val);
} else {
res[key] = [res[key], val];
}
});
return Object.keys(res).sort().reduce((p, key) => {
p[key] = res[key];
return p;
}, {});
}
function stringifyQuery(obj, prefix = '?') {
var res = obj ? Object.keys(obj).sort().map(key => {
var val = obj[key];
if (val === undefined) return '';
if (val === null || val === undefined) return encode(key);
if (Array.isArray(val)) {
var result = [];
val.forEach(val2 => {
if (val2 === undefined) return;
if (val2 === null) {
result.push(encode(key));
} else {
if (typeof val2 === 'object') val2 = JSON.stringify(val2);
result.push(encode(key) + '=' + encode(val2));
}
});
return result.join('&');
}
if (typeof val === 'object') val = JSON.stringify(val);
return encode(key) + '=' + encode(val);
}).filter(x => x.length > 0).join('&') : null;
return res ? `${prefix}${res}` : '';
}
export { parseQuery, stringifyQuery };
var config = {
_parseQuery: parseQuery,
_stringifyQuery: stringifyQuery,
inheritProps: false,
zIndexStart: 0,
zIndexStep: 1,
get parseQuery() {
return this._parseQuery;
},
get stringifyQuery() {
return this._stringifyQuery;
},
createMergeStrategies(router) {
return function routeMergeStrategies(parent, child, vm) {
if (vm._isVuelikeRoot) {
if (router.Apps.some(App => vm instanceof App)) {
router.apps.push(vm);
vm.$on('componentDidUnmount', () => {
var idx = router.apps.indexOf(vm);
if (~idx) router.apps.splice(idx, 1);
});
}
return parent;
}
vm.$computed(vm, '$route', function () {
return this.$root ? this.$root.$route : null;
});
vm.$computed(vm, '$routeIndex', function () {
if (this._routeIndex !== undefined) return this._routeIndex;
var routeView = router.getHostRouterView(this, v => !v._isVuelikeRoot);
return this._routeIndex = routeView ? routeView.state.depth : -1;
});
vm.$computed(vm, '$matchedRoute', function () {
return this.$route && this.$route.matched[this.$routeIndex] || null;
});
};
}
};
export default config;
//# sourceMappingURL=config.js.map