summaryrefslogtreecommitdiffstats
path: root/packages/gitbook-core/src/models
diff options
context:
space:
mode:
authorSamy Pesse <samypesse@gmail.com>2016-10-03 00:59:26 +0200
committerSamy Pesse <samypesse@gmail.com>2016-10-03 00:59:26 +0200
commit3ae72bb47c146212d40fc74d857880fa0616ae57 (patch)
tree28986218bb512580272f9709fbdee01f6ede52dd /packages/gitbook-core/src/models
parentcd2d5e5101edb466b13ada19b09ea42ef726ad96 (diff)
downloadgitbook-3ae72bb47c146212d40fc74d857880fa0616ae57.zip
gitbook-3ae72bb47c146212d40fc74d857880fa0616ae57.tar.gz
gitbook-3ae72bb47c146212d40fc74d857880fa0616ae57.tar.bz2
Sync search with querystring
Diffstat (limited to 'packages/gitbook-core/src/models')
-rw-r--r--packages/gitbook-core/src/models/Location.js73
1 files changed, 73 insertions, 0 deletions
diff --git a/packages/gitbook-core/src/models/Location.js b/packages/gitbook-core/src/models/Location.js
new file mode 100644
index 0000000..3b62bef
--- /dev/null
+++ b/packages/gitbook-core/src/models/Location.js
@@ -0,0 +1,73 @@
+const { Record, Map } = require('immutable');
+const querystring = require('querystring');
+
+const DEFAULTS = {
+ pathname: String(''),
+ // Hash without the #
+ hash: String(''),
+ // If query is a non empty map
+ query: Map()
+};
+
+class Location extends Record(DEFAULTS) {
+ get search() {
+ const { query } = this;
+ return query.size === 0 ?
+ '' :
+ '?' + querystring.stringify(query.toJS());
+ }
+
+ /**
+ * Convert this location to a string.
+ * @return {String}
+ */
+ toString() {
+
+ }
+
+ /**
+ * Convert this immutable instance to an object
+ * for "history".
+ * @return {Object}
+ */
+ toNative() {
+ return {
+ pathname: this.pathname,
+ hash: this.hash ? `#${this.hash}` : '',
+ search: this.search
+ };
+ }
+
+ /**
+ * Convert an instance from "history" to Location.
+ * @param {Object|String} location
+ * @return {Location}
+ */
+ static fromNative(location) {
+ if (typeof location === 'string') {
+ location = { pathname: location };
+ }
+
+ const pathname = location.pathname;
+ let hash = location.hash || '';
+ let search = location.search || '';
+ let query = location.query;
+
+ hash = hash[0] === '#' ? hash.slice(1) : hash;
+ search = search[0] === '?' ? search.slice(1) : search;
+
+ if (query) {
+ query = Map(query);
+ } else {
+ query = Map(querystring.parse(search));
+ }
+
+ return new Location({
+ pathname,
+ hash,
+ query
+ });
+ }
+}
+
+module.exports = Location;