@spcsn/taro-runtime 0.1.0 → 0.1.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -9,22 +9,21 @@ import { isNumber, isString, warn } from "@spcsn/taro-shared";
9
9
  const INIT_URL = "https://taro.com";
10
10
  const cache = new RuntimeCache("location");
11
11
  var TaroLocation = class extends Events {
12
- #url = new TaroURLProvider(INIT_URL);
13
- #noCheckUrl = false;
14
- #window;
15
12
  constructor(options) {
16
13
  super();
17
- this.#window = options.window;
18
- this.#reset();
14
+ this._url = new TaroURLProvider(INIT_URL);
15
+ this._noCheckUrl = false;
16
+ this._window = options.window;
17
+ this._reset();
19
18
  this.on("__set_href_without_history__", (href) => {
20
- this.#noCheckUrl = true;
21
- const lastHash = this.#url.hash;
22
- this.#url.href = generateFullUrl(href);
23
- if (lastHash !== this.#url.hash) this.#window.trigger("hashchange");
24
- this.#noCheckUrl = false;
19
+ this._noCheckUrl = true;
20
+ const lastHash = this._url.hash;
21
+ this._url.href = generateFullUrl(href);
22
+ if (lastHash !== this._url.hash) this._window.trigger("hashchange");
23
+ this._noCheckUrl = false;
25
24
  }, null);
26
25
  this.on("0", () => {
27
- this.#reset();
26
+ this._reset();
28
27
  }, null);
29
28
  this.on("1", (pageId) => {
30
29
  cache.set(pageId, { lastHref: this.href });
@@ -32,16 +31,16 @@ var TaroLocation = class extends Events {
32
31
  this.on("2", (pageId) => {
33
32
  if (cache.has(pageId)) {
34
33
  const ctx = cache.get(pageId);
35
- this.#noCheckUrl = true;
36
- this.#url.href = ctx.lastHref;
37
- this.#noCheckUrl = false;
34
+ this._noCheckUrl = true;
35
+ this._url.href = ctx.lastHref;
36
+ this._noCheckUrl = false;
38
37
  }
39
38
  }, null);
40
39
  this.on("3", (pageId) => {
41
40
  cache.delete(pageId);
42
41
  }, null);
43
42
  }
44
- #reset() {
43
+ _reset() {
45
44
  const router = getCurrentInstance().router;
46
45
  if (router) {
47
46
  const { path, params } = router;
@@ -50,127 +49,127 @@ var TaroLocation = class extends Events {
50
49
  });
51
50
  const searchStr = searchArr.length > 0 ? "?" + searchArr.join("&") : "";
52
51
  const url = `${INIT_URL}${path.startsWith("/") ? path : "/" + path}${searchStr}`;
53
- this.#url = new TaroURLProvider(url);
52
+ this._url = new TaroURLProvider(url);
54
53
  this.trigger("__reset_history__", this.href);
55
54
  }
56
55
  }
57
- #getPreValue() {
58
- return this.#url._toRaw();
56
+ _getPreValue() {
57
+ return this._url._toRaw();
59
58
  }
60
- #rollBack(href) {
61
- this.#url.href = href;
59
+ _rollBack(href) {
60
+ this._url.href = href;
62
61
  }
63
- #recordHistory() {
62
+ _recordHistory() {
64
63
  this.trigger("__record_history__", this.href);
65
64
  }
66
65
  /**
67
66
  * 校验url的变化,是否需要更新history
68
67
  */
69
- #checkUrlChange(preValue) {
70
- if (this.#noCheckUrl) return false;
71
- const { protocol, hostname, port, pathname, search, hash } = this.#url._toRaw();
68
+ _checkUrlChange(preValue) {
69
+ if (this._noCheckUrl) return false;
70
+ const { protocol, hostname, port, pathname, search, hash } = this._url._toRaw();
72
71
  if (protocol !== preValue.protocol || hostname !== preValue.hostname || port !== preValue.port) {
73
- this.#rollBack(preValue.href);
72
+ this._rollBack(preValue.href);
74
73
  return false;
75
74
  }
76
75
  if (pathname !== preValue.pathname) return true;
77
76
  if (search !== preValue.search) return true;
78
77
  if (hash !== preValue.hash) {
79
- this.#window.trigger("hashchange");
78
+ this._window.trigger("hashchange");
80
79
  return true;
81
80
  }
82
- this.#rollBack(preValue.href);
81
+ this._rollBack(preValue.href);
83
82
  return false;
84
83
  }
85
84
  get protocol() {
86
- return this.#url.protocol;
85
+ return this._url.protocol;
87
86
  }
88
87
  set protocol(val) {
89
88
  if (!val || !isString(val) || !/^(http|https):$/i.test(val.trim())) return;
90
89
  val = val.trim();
91
- const preValue = this.#getPreValue();
92
- this.#url.protocol = val;
93
- if (this.#checkUrlChange(preValue)) this.#recordHistory();
90
+ const preValue = this._getPreValue();
91
+ this._url.protocol = val;
92
+ if (this._checkUrlChange(preValue)) this._recordHistory();
94
93
  }
95
94
  get host() {
96
- return this.#url.host;
95
+ return this._url.host;
97
96
  }
98
97
  set host(val) {
99
98
  if (!val || !isString(val)) return;
100
99
  val = val.trim();
101
- const preValue = this.#getPreValue();
102
- this.#url.host = val;
103
- if (this.#checkUrlChange(preValue)) this.#recordHistory();
100
+ const preValue = this._getPreValue();
101
+ this._url.host = val;
102
+ if (this._checkUrlChange(preValue)) this._recordHistory();
104
103
  }
105
104
  get hostname() {
106
- return this.#url.hostname;
105
+ return this._url.hostname;
107
106
  }
108
107
  set hostname(val) {
109
108
  if (!val || !isString(val)) return;
110
109
  val = val.trim();
111
- const preValue = this.#getPreValue();
112
- this.#url.hostname = val;
113
- if (this.#checkUrlChange(preValue)) this.#recordHistory();
110
+ const preValue = this._getPreValue();
111
+ this._url.hostname = val;
112
+ if (this._checkUrlChange(preValue)) this._recordHistory();
114
113
  }
115
114
  get port() {
116
- return this.#url.port;
115
+ return this._url.port;
117
116
  }
118
117
  set port(val) {
119
118
  const xVal = Number(val = val.trim());
120
119
  if (!isNumber(xVal) || xVal <= 0) return;
121
- const preValue = this.#getPreValue();
122
- this.#url.port = val;
123
- if (this.#checkUrlChange(preValue)) this.#recordHistory();
120
+ const preValue = this._getPreValue();
121
+ this._url.port = val;
122
+ if (this._checkUrlChange(preValue)) this._recordHistory();
124
123
  }
125
124
  get pathname() {
126
- return this.#url.pathname;
125
+ return this._url.pathname;
127
126
  }
128
127
  set pathname(val) {
129
128
  if (!val || !isString(val)) return;
130
129
  val = val.trim();
131
- const preValue = this.#getPreValue();
132
- this.#url.pathname = val;
133
- if (this.#checkUrlChange(preValue)) this.#recordHistory();
130
+ const preValue = this._getPreValue();
131
+ this._url.pathname = val;
132
+ if (this._checkUrlChange(preValue)) this._recordHistory();
134
133
  }
135
134
  get search() {
136
- return this.#url.search;
135
+ return this._url.search;
137
136
  }
138
137
  set search(val) {
139
138
  if (!val || !isString(val)) return;
140
139
  val = val.trim();
141
140
  val = val.startsWith("?") ? val : `?${val}`;
142
- const preValue = this.#getPreValue();
143
- this.#url.search = val;
144
- if (this.#checkUrlChange(preValue)) this.#recordHistory();
141
+ const preValue = this._getPreValue();
142
+ this._url.search = val;
143
+ if (this._checkUrlChange(preValue)) this._recordHistory();
145
144
  }
146
145
  get hash() {
147
- return this.#url.hash;
146
+ return this._url.hash;
148
147
  }
149
148
  set hash(val) {
150
149
  if (!val || !isString(val)) return;
151
150
  val = val.trim();
152
151
  val = val.startsWith("#") ? val : `#${val}`;
153
- const preValue = this.#getPreValue();
154
- this.#url.hash = val;
155
- if (this.#checkUrlChange(preValue)) this.#recordHistory();
152
+ const preValue = this._getPreValue();
153
+ this._url.hash = val;
154
+ if (this._checkUrlChange(preValue)) this._recordHistory();
156
155
  }
157
156
  get href() {
158
- return this.#url.href;
157
+ return this._url.href;
159
158
  }
160
159
  set href(val) {
161
160
  if (!val || !isString(val) || !/^(http:|https:)?\/\/.+/.test(val = val.trim())) return;
162
- const preValue = this.#getPreValue();
163
- this.#url.href = val;
164
- if (this.#checkUrlChange(preValue)) this.#recordHistory();
161
+ const preValue = this._getPreValue();
162
+ this._url.href = val;
163
+ if (this._checkUrlChange(preValue)) this._recordHistory();
165
164
  }
166
165
  get origin() {
167
- return this.#url.origin;
166
+ return this._url.origin;
168
167
  }
169
168
  set origin(val) {
170
169
  if (!val || !isString(val) || !/^(http:|https:)?\/\/.+/.test(val = val.trim())) return;
171
- const preValue = this.#getPreValue();
172
- this.#url.origin = val;
173
- if (this.#checkUrlChange(preValue)) this.#recordHistory();
170
+ const preValue = this._getPreValue();
171
+ this._url.origin = val;
172
+ if (this._checkUrlChange(preValue)) this._recordHistory();
174
173
  }
175
174
  assign() {
176
175
  warn(true, "小程序环境中调用location.assign()无效.");
@@ -1 +1 @@
1
- {"version":3,"file":"location.js","names":["#window","#reset","#noCheckUrl","#url","#rollBack","#getPreValue","#checkUrlChange","#recordHistory"],"sources":["../../src/bom/location.ts"],"sourcesContent":["import { isNumber, isString, warn } from '@spcsn/taro-shared';\n\nimport { CONTEXT_ACTIONS } from '../constants';\nimport { getCurrentInstance } from '../current';\nimport { Events } from '../emitter/emitter';\nimport env from '../env';\nimport { RuntimeCache } from '../utils/cache';\nimport { TaroURLProvider } from './URL';\n\ntype PreValue = ReturnType<typeof TaroURLProvider.prototype._toRaw>;\n\ntype Options = {\n window: any;\n};\ntype LocationContext = {\n lastHref: string;\n};\n\nconst INIT_URL = 'https://taro.com';\nconst cache = new RuntimeCache<LocationContext>('location');\n\nclass TaroLocation extends Events {\n /* private property */\n #url = new TaroURLProvider(INIT_URL);\n #noCheckUrl = false;\n #window: any;\n\n constructor(options: Options) {\n super();\n\n this.#window = options.window;\n\n this.#reset();\n\n this.on(\n '__set_href_without_history__',\n (href: string) => {\n this.#noCheckUrl = true;\n\n const lastHash = this.#url.hash;\n this.#url.href = generateFullUrl(href);\n\n if (lastHash !== this.#url.hash) {\n this.#window.trigger('hashchange');\n }\n\n this.#noCheckUrl = false;\n },\n null,\n );\n\n // 切换上下文行为\n this.on(\n CONTEXT_ACTIONS.INIT,\n () => {\n this.#reset();\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.RESTORE,\n (pageId: string) => {\n cache.set(pageId, {\n lastHref: this.href,\n });\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.RECOVER,\n (pageId: string) => {\n // 数据恢复时,不需要执行跳转\n if (cache.has(pageId)) {\n const ctx = cache.get(pageId)!;\n this.#noCheckUrl = true;\n this.#url.href = ctx.lastHref;\n this.#noCheckUrl = false;\n }\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.DESTROY,\n (pageId: string) => {\n cache.delete(pageId);\n },\n null,\n );\n }\n\n /* private method */\n #reset() {\n const Current = getCurrentInstance();\n const router = Current.router;\n if (router) {\n const { path, params } = router;\n const searchArr = Object.keys(params).map((key) => {\n return `${key}=${params[key]}`;\n });\n const searchStr = searchArr.length > 0 ? '?' + searchArr.join('&') : '';\n const url = `${INIT_URL}${path.startsWith('/') ? path : '/' + path}${searchStr}`;\n\n this.#url = new TaroURLProvider(url);\n\n this.trigger('__reset_history__', this.href);\n }\n }\n\n #getPreValue(): PreValue {\n return this.#url._toRaw();\n }\n\n #rollBack(href: string) {\n this.#url.href = href;\n }\n\n #recordHistory() {\n this.trigger('__record_history__', this.href);\n }\n\n /**\n * 校验url的变化,是否需要更新history\n */\n #checkUrlChange(preValue: PreValue): boolean {\n if (this.#noCheckUrl) {\n return false;\n }\n\n const { protocol, hostname, port, pathname, search, hash } = this.#url._toRaw();\n\n // 跨域三要素不允许修改\n if (protocol !== preValue.protocol || hostname !== preValue.hostname || port !== preValue.port) {\n this.#rollBack(preValue.href);\n return false;\n }\n\n // pathname\n if (pathname !== preValue.pathname) {\n return true;\n }\n\n // search\n if (search !== preValue.search) {\n return true;\n }\n\n // hashchange\n if (hash !== preValue.hash) {\n this.#window.trigger('hashchange');\n return true;\n }\n\n this.#rollBack(preValue.href);\n return false;\n }\n\n /* public property */\n get protocol() {\n return this.#url.protocol;\n }\n\n set protocol(val: string) {\n const REG = /^(http|https):$/i;\n if (!val || !isString(val) || !REG.test(val.trim())) return;\n\n val = val.trim();\n const preValue = this.#getPreValue();\n this.#url.protocol = val;\n\n if (this.#checkUrlChange(preValue)) this.#recordHistory();\n }\n\n get host() {\n return this.#url.host;\n }\n\n set host(val: string) {\n if (!val || !isString(val)) return;\n val = val.trim();\n\n const preValue = this.#getPreValue();\n this.#url.host = val;\n\n if (this.#checkUrlChange(preValue)) this.#recordHistory();\n }\n\n get hostname() {\n return this.#url.hostname;\n }\n\n set hostname(val: string) {\n if (!val || !isString(val)) return;\n val = val.trim();\n\n const preValue = this.#getPreValue();\n this.#url.hostname = val;\n\n if (this.#checkUrlChange(preValue)) this.#recordHistory();\n }\n\n get port() {\n return this.#url.port;\n }\n\n set port(val: string) {\n const xVal = Number((val = val.trim()));\n if (!isNumber(xVal) || xVal <= 0) return;\n\n const preValue = this.#getPreValue();\n this.#url.port = val;\n\n if (this.#checkUrlChange(preValue)) this.#recordHistory();\n }\n\n get pathname() {\n return this.#url.pathname;\n }\n\n set pathname(val: string) {\n if (!val || !isString(val)) return;\n val = val.trim();\n\n const preValue = this.#getPreValue();\n this.#url.pathname = val;\n\n if (this.#checkUrlChange(preValue)) this.#recordHistory();\n }\n\n get search() {\n return this.#url.search;\n }\n\n set search(val: string) {\n if (!val || !isString(val)) return;\n val = val.trim();\n val = val.startsWith('?') ? val : `?${val}`;\n\n const preValue = this.#getPreValue();\n this.#url.search = val;\n\n if (this.#checkUrlChange(preValue)) this.#recordHistory();\n }\n\n get hash() {\n return this.#url.hash;\n }\n\n // 小程序的navigateTo存在截断hash字符串的问题\n set hash(val: string) {\n if (!val || !isString(val)) return;\n val = val.trim();\n val = val.startsWith('#') ? val : `#${val}`;\n\n const preValue = this.#getPreValue();\n this.#url.hash = val;\n\n if (this.#checkUrlChange(preValue)) this.#recordHistory();\n }\n\n get href() {\n return this.#url.href;\n }\n\n set href(val: string) {\n const REG = /^(http:|https:)?\\/\\/.+/;\n if (!val || !isString(val) || !REG.test((val = val.trim()))) return;\n\n const preValue = this.#getPreValue();\n this.#url.href = val;\n\n if (this.#checkUrlChange(preValue)) this.#recordHistory();\n }\n\n get origin() {\n return this.#url.origin;\n }\n\n set origin(val: string) {\n const REG = /^(http:|https:)?\\/\\/.+/;\n if (!val || !isString(val) || !REG.test((val = val.trim()))) return;\n\n const preValue = this.#getPreValue();\n this.#url.origin = val;\n\n if (this.#checkUrlChange(preValue)) this.#recordHistory();\n }\n\n /* public method */\n assign() {\n warn(true, '小程序环境中调用location.assign()无效.');\n }\n\n reload() {\n warn(true, '小程序环境中调用location.reload()无效.');\n }\n\n replace(url: string) {\n this.trigger('__set_href_without_history__', url);\n }\n\n toString() {\n return this.href;\n }\n\n // For debug\n get cache() {\n return cache;\n }\n}\n\nexport type { TaroLocation };\nexport const Location: typeof TaroLocation = process.env.TARO_PLATFORM === 'web' ? env.window.Location : TaroLocation;\n\nfunction generateFullUrl(val = '') {\n const origin = INIT_URL;\n if (/^[/?#]/.test(val)) {\n return origin + val;\n }\n return val;\n}\n"],"mappings":"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"}
1
+ {"version":3,"file":"location.js","names":[],"sources":["../../src/bom/location.ts"],"sourcesContent":["import { isNumber, isString, warn } from '@spcsn/taro-shared';\n\nimport { CONTEXT_ACTIONS } from '../constants';\nimport { getCurrentInstance } from '../current';\nimport { Events } from '../emitter/emitter';\nimport env from '../env';\nimport { RuntimeCache } from '../utils/cache';\nimport { TaroURLProvider } from './URL';\n\ntype PreValue = ReturnType<typeof TaroURLProvider.prototype._toRaw>;\n\ntype Options = {\n window: any;\n};\ntype LocationContext = {\n lastHref: string;\n};\n\nconst INIT_URL = 'https://taro.com';\nconst cache = new RuntimeCache<LocationContext>('location');\n\nclass TaroLocation extends Events {\n /* private property */\n private _url = new TaroURLProvider(INIT_URL);\n private _noCheckUrl = false;\n private _window: any;\n\n constructor(options: Options) {\n super();\n\n this._window = options.window;\n\n this._reset();\n\n this.on(\n '__set_href_without_history__',\n (href: string) => {\n this._noCheckUrl = true;\n\n const lastHash = this._url.hash;\n this._url.href = generateFullUrl(href);\n\n if (lastHash !== this._url.hash) {\n this._window.trigger('hashchange');\n }\n\n this._noCheckUrl = false;\n },\n null,\n );\n\n // 切换上下文行为\n this.on(\n CONTEXT_ACTIONS.INIT,\n () => {\n this._reset();\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.RESTORE,\n (pageId: string) => {\n cache.set(pageId, {\n lastHref: this.href,\n });\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.RECOVER,\n (pageId: string) => {\n // 数据恢复时,不需要执行跳转\n if (cache.has(pageId)) {\n const ctx = cache.get(pageId)!;\n this._noCheckUrl = true;\n this._url.href = ctx.lastHref;\n this._noCheckUrl = false;\n }\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.DESTROY,\n (pageId: string) => {\n cache.delete(pageId);\n },\n null,\n );\n }\n\n /* private method */\n private _reset() {\n const Current = getCurrentInstance();\n const router = Current.router;\n if (router) {\n const { path, params } = router;\n const searchArr = Object.keys(params).map((key) => {\n return `${key}=${params[key]}`;\n });\n const searchStr = searchArr.length > 0 ? '?' + searchArr.join('&') : '';\n const url = `${INIT_URL}${path.startsWith('/') ? path : '/' + path}${searchStr}`;\n\n this._url = new TaroURLProvider(url);\n\n this.trigger('__reset_history__', this.href);\n }\n }\n\n private _getPreValue(): PreValue {\n return this._url._toRaw();\n }\n\n private _rollBack(href: string) {\n this._url.href = href;\n }\n\n private _recordHistory() {\n this.trigger('__record_history__', this.href);\n }\n\n /**\n * 校验url的变化,是否需要更新history\n */\n private _checkUrlChange(preValue: PreValue): boolean {\n if (this._noCheckUrl) {\n return false;\n }\n\n const { protocol, hostname, port, pathname, search, hash } = this._url._toRaw();\n\n // 跨域三要素不允许修改\n if (protocol !== preValue.protocol || hostname !== preValue.hostname || port !== preValue.port) {\n this._rollBack(preValue.href);\n return false;\n }\n\n // pathname\n if (pathname !== preValue.pathname) {\n return true;\n }\n\n // search\n if (search !== preValue.search) {\n return true;\n }\n\n // hashchange\n if (hash !== preValue.hash) {\n this._window.trigger('hashchange');\n return true;\n }\n\n this._rollBack(preValue.href);\n return false;\n }\n\n /* public property */\n get protocol() {\n return this._url.protocol;\n }\n\n set protocol(val: string) {\n const REG = /^(http|https):$/i;\n if (!val || !isString(val) || !REG.test(val.trim())) return;\n\n val = val.trim();\n const preValue = this._getPreValue();\n this._url.protocol = val;\n\n if (this._checkUrlChange(preValue)) this._recordHistory();\n }\n\n get host() {\n return this._url.host;\n }\n\n set host(val: string) {\n if (!val || !isString(val)) return;\n val = val.trim();\n\n const preValue = this._getPreValue();\n this._url.host = val;\n\n if (this._checkUrlChange(preValue)) this._recordHistory();\n }\n\n get hostname() {\n return this._url.hostname;\n }\n\n set hostname(val: string) {\n if (!val || !isString(val)) return;\n val = val.trim();\n\n const preValue = this._getPreValue();\n this._url.hostname = val;\n\n if (this._checkUrlChange(preValue)) this._recordHistory();\n }\n\n get port() {\n return this._url.port;\n }\n\n set port(val: string) {\n const xVal = Number((val = val.trim()));\n if (!isNumber(xVal) || xVal <= 0) return;\n\n const preValue = this._getPreValue();\n this._url.port = val;\n\n if (this._checkUrlChange(preValue)) this._recordHistory();\n }\n\n get pathname() {\n return this._url.pathname;\n }\n\n set pathname(val: string) {\n if (!val || !isString(val)) return;\n val = val.trim();\n\n const preValue = this._getPreValue();\n this._url.pathname = val;\n\n if (this._checkUrlChange(preValue)) this._recordHistory();\n }\n\n get search() {\n return this._url.search;\n }\n\n set search(val: string) {\n if (!val || !isString(val)) return;\n val = val.trim();\n val = val.startsWith('?') ? val : `?${val}`;\n\n const preValue = this._getPreValue();\n this._url.search = val;\n\n if (this._checkUrlChange(preValue)) this._recordHistory();\n }\n\n get hash() {\n return this._url.hash;\n }\n\n // 小程序的navigateTo存在截断hash字符串的问题\n set hash(val: string) {\n if (!val || !isString(val)) return;\n val = val.trim();\n val = val.startsWith('#') ? val : `#${val}`;\n\n const preValue = this._getPreValue();\n this._url.hash = val;\n\n if (this._checkUrlChange(preValue)) this._recordHistory();\n }\n\n get href() {\n return this._url.href;\n }\n\n set href(val: string) {\n const REG = /^(http:|https:)?\\/\\/.+/;\n if (!val || !isString(val) || !REG.test((val = val.trim()))) return;\n\n const preValue = this._getPreValue();\n this._url.href = val;\n\n if (this._checkUrlChange(preValue)) this._recordHistory();\n }\n\n get origin() {\n return this._url.origin;\n }\n\n set origin(val: string) {\n const REG = /^(http:|https:)?\\/\\/.+/;\n if (!val || !isString(val) || !REG.test((val = val.trim()))) return;\n\n const preValue = this._getPreValue();\n this._url.origin = val;\n\n if (this._checkUrlChange(preValue)) this._recordHistory();\n }\n\n /* public method */\n assign() {\n warn(true, '小程序环境中调用location.assign()无效.');\n }\n\n reload() {\n warn(true, '小程序环境中调用location.reload()无效.');\n }\n\n replace(url: string) {\n this.trigger('__set_href_without_history__', url);\n }\n\n toString() {\n return this.href;\n }\n\n // For debug\n get cache() {\n return cache;\n }\n}\n\nexport type { TaroLocation };\nexport const Location: typeof TaroLocation = process.env.TARO_PLATFORM === 'web' ? env.window.Location : TaroLocation;\n\nfunction generateFullUrl(val = '') {\n const origin = INIT_URL;\n if (/^[/?#]/.test(val)) {\n return origin + val;\n }\n return val;\n}\n"],"mappings":"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"}