@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.
- package/dist/bom/URL.d.ts +6 -1
- package/dist/bom/URL.js +26 -27
- package/dist/bom/URL.js.map +1 -1
- package/dist/bom/URLSearchParams.js +11 -11
- package/dist/bom/URLSearchParams.js.map +1 -1
- package/dist/bom/history.d.ts +5 -1
- package/dist/bom/history.js +34 -36
- package/dist/bom/history.js.map +1 -1
- package/dist/bom/location.d.ts +11 -1
- package/dist/bom/location.js +62 -63
- package/dist/bom/location.js.map +1 -1
- package/dist/index.cjs.js +135 -139
- package/dist/index.cjs.js.map +1 -1
- package/dist/perf.d.ts +1 -1
- package/dist/perf.js +2 -2
- package/dist/perf.js.map +1 -1
- package/dist/runtime.esm.js +135 -139
- package/dist/runtime.esm.js.map +1 -1
- package/package.json +2 -2
package/dist/bom/location.js
CHANGED
|
@@ -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
|
|
18
|
-
this
|
|
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
|
|
21
|
-
const lastHash = this
|
|
22
|
-
this
|
|
23
|
-
if (lastHash !== this
|
|
24
|
-
this
|
|
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
|
|
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
|
|
36
|
-
this
|
|
37
|
-
this
|
|
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
|
-
|
|
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
|
|
52
|
+
this._url = new TaroURLProvider(url);
|
|
54
53
|
this.trigger("__reset_history__", this.href);
|
|
55
54
|
}
|
|
56
55
|
}
|
|
57
|
-
|
|
58
|
-
return this
|
|
56
|
+
_getPreValue() {
|
|
57
|
+
return this._url._toRaw();
|
|
59
58
|
}
|
|
60
|
-
|
|
61
|
-
this
|
|
59
|
+
_rollBack(href) {
|
|
60
|
+
this._url.href = href;
|
|
62
61
|
}
|
|
63
|
-
|
|
62
|
+
_recordHistory() {
|
|
64
63
|
this.trigger("__record_history__", this.href);
|
|
65
64
|
}
|
|
66
65
|
/**
|
|
67
66
|
* 校验url的变化,是否需要更新history
|
|
68
67
|
*/
|
|
69
|
-
|
|
70
|
-
if (this
|
|
71
|
-
const { protocol, hostname, port, pathname, search, hash } = this
|
|
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
|
|
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
|
|
78
|
+
this._window.trigger("hashchange");
|
|
80
79
|
return true;
|
|
81
80
|
}
|
|
82
|
-
this
|
|
81
|
+
this._rollBack(preValue.href);
|
|
83
82
|
return false;
|
|
84
83
|
}
|
|
85
84
|
get protocol() {
|
|
86
|
-
return this
|
|
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
|
|
92
|
-
this
|
|
93
|
-
if (this
|
|
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
|
|
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
|
|
102
|
-
this
|
|
103
|
-
if (this
|
|
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
|
|
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
|
|
112
|
-
this
|
|
113
|
-
if (this
|
|
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
|
|
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
|
|
122
|
-
this
|
|
123
|
-
if (this
|
|
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
|
|
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
|
|
132
|
-
this
|
|
133
|
-
if (this
|
|
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
|
|
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
|
|
143
|
-
this
|
|
144
|
-
if (this
|
|
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
|
|
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
|
|
154
|
-
this
|
|
155
|
-
if (this
|
|
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
|
|
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
|
|
163
|
-
this
|
|
164
|
-
if (this
|
|
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
|
|
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
|
|
172
|
-
this
|
|
173
|
-
if (this
|
|
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()无效.");
|
package/dist/bom/location.js.map
CHANGED
|
@@ -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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"}
|