diff options
author | Samy Pesse <samypesse@gmail.com> | 2016-10-03 00:59:26 +0200 |
---|---|---|
committer | Samy Pesse <samypesse@gmail.com> | 2016-10-03 00:59:26 +0200 |
commit | 3ae72bb47c146212d40fc74d857880fa0616ae57 (patch) | |
tree | 28986218bb512580272f9709fbdee01f6ede52dd /packages/gitbook-core/src/models | |
parent | cd2d5e5101edb466b13ada19b09ea42ef726ad96 (diff) | |
download | gitbook-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.js | 73 |
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; |