@spcsn/taro-runtime 0.1.1 → 1.0.0

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.
Files changed (110) hide show
  1. package/README.md +16 -39
  2. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/assertClassBrand.js +7 -0
  3. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/checkPrivateRedeclaration.js +6 -0
  4. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateFieldGet2.js +7 -0
  5. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateFieldInitSpec.js +7 -0
  6. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateFieldSet2.js +7 -0
  7. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateMethodInitSpec.js +7 -0
  8. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/defineProperty.js +12 -0
  9. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/objectSpread2.js +25 -0
  10. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/toPrimitive.js +14 -0
  11. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/toPropertyKey.js +9 -0
  12. package/dist/_virtual/_@oxc-project_runtime@0.130.0/helpers/typeof.js +11 -0
  13. package/dist/bom/{URL.js → URL2.js} +39 -30
  14. package/dist/bom/URL2.js.map +1 -0
  15. package/dist/bom/document.d.ts +0 -1
  16. package/dist/bom/document.js +1 -54
  17. package/dist/bom/document.js.map +1 -1
  18. package/dist/bom/get-computed-style.js +8 -0
  19. package/dist/bom/get-computed-style.js.map +1 -0
  20. package/dist/bom/history.d.ts +1 -5
  21. package/dist/bom/history.js +53 -40
  22. package/dist/bom/history.js.map +1 -1
  23. package/dist/bom/location.d.ts +1 -11
  24. package/dist/bom/location.js +103 -93
  25. package/dist/bom/location.js.map +1 -1
  26. package/dist/bom/navigator.js +1 -2
  27. package/dist/bom/navigator.js.map +1 -1
  28. package/dist/bom/raf.d.ts +2 -2
  29. package/dist/bom/raf.js +2 -2
  30. package/dist/bom/raf.js.map +1 -1
  31. package/dist/bom/url-search-params.d.ts +14 -0
  32. package/dist/bom/{URLSearchParams.js → url-search-params.js} +26 -25
  33. package/dist/bom/url-search-params.js.map +1 -0
  34. package/dist/bom/{URL.d.ts → url.d.ts} +2 -6
  35. package/dist/bom/url.js +196 -0
  36. package/dist/bom/url.js.map +1 -0
  37. package/dist/bom/window.d.ts +3 -3
  38. package/dist/bom/window.js +3 -3
  39. package/dist/bom/window.js.map +1 -1
  40. package/dist/current.d.ts +3 -0
  41. package/dist/current.js +10 -1
  42. package/dist/current.js.map +1 -1
  43. package/dist/dom/anchor-element.js +17 -9
  44. package/dist/dom/anchor-element.js.map +1 -1
  45. package/dist/dom/class-list.js +2 -1
  46. package/dist/dom/class-list.js.map +1 -1
  47. package/dist/dom/document.js.map +1 -1
  48. package/dist/dom/element.js +9 -8
  49. package/dist/dom/element.js.map +1 -1
  50. package/dist/dom/event-target.js +2 -4
  51. package/dist/dom/event-target.js.map +1 -1
  52. package/dist/dom/event.d.ts +1 -1
  53. package/dist/dom/event.js +19 -28
  54. package/dist/dom/event.js.map +1 -1
  55. package/dist/dom/form.js +3 -2
  56. package/dist/dom/form.js.map +1 -1
  57. package/dist/dom/node.d.ts +4 -3
  58. package/dist/dom/node.js +23 -13
  59. package/dist/dom/node.js.map +1 -1
  60. package/dist/dom/root.js +4 -6
  61. package/dist/dom/root.js.map +1 -1
  62. package/dist/dom/{style_properties.js → style-properties.js} +2 -2
  63. package/dist/dom/{style_properties.js.map → style-properties.js.map} +1 -1
  64. package/dist/dom/style.js +1 -1
  65. package/dist/dom/style.js.map +1 -1
  66. package/dist/dom/text.d.ts +1 -1
  67. package/dist/dom/text.js.map +1 -1
  68. package/dist/dom/transfer.js.map +1 -1
  69. package/dist/dom/tree.js +1 -1
  70. package/dist/dom/tree.js.map +1 -1
  71. package/dist/dom-external/mutation-observer/implements.js +1 -1
  72. package/dist/dom-external/mutation-observer/implements.js.map +1 -1
  73. package/dist/dsl/common.js +45 -63
  74. package/dist/dsl/common.js.map +1 -1
  75. package/dist/env.js +2 -2
  76. package/dist/env.js.map +1 -1
  77. package/dist/hydrate.js +11 -8
  78. package/dist/hydrate.js.map +1 -1
  79. package/dist/index.cjs.d.ts +4 -4
  80. package/dist/index.cjs.js +670 -911
  81. package/dist/index.cjs.js.map +1 -1
  82. package/dist/index.d.ts +4 -4
  83. package/dist/index.js +6 -6
  84. package/dist/next-tick.js +1 -4
  85. package/dist/next-tick.js.map +1 -1
  86. package/dist/perf.d.ts +1 -1
  87. package/dist/perf.js +10 -6
  88. package/dist/perf.js.map +1 -1
  89. package/dist/polyfill/index.js +1 -6
  90. package/dist/polyfill/index.js.map +1 -1
  91. package/dist/runtime.esm.d.ts +4 -4
  92. package/dist/runtime.esm.js +669 -911
  93. package/dist/runtime.esm.js.map +1 -1
  94. package/dist/utils/cache.js.map +1 -1
  95. package/dist/utils/index.js +9 -6
  96. package/dist/utils/index.js.map +1 -1
  97. package/dist/utils/router.js +2 -1
  98. package/dist/utils/router.js.map +1 -1
  99. package/package.json +26 -20
  100. package/LICENSE +0 -174
  101. package/dist/bom/URL.js.map +0 -1
  102. package/dist/bom/URLSearchParams.d.ts +0 -1
  103. package/dist/bom/URLSearchParams.js.map +0 -1
  104. package/dist/bom/getComputedStyle.js +0 -9
  105. package/dist/bom/getComputedStyle.js.map +0 -1
  106. package/dist/polyfill/intersection-observer.js +0 -494
  107. package/dist/polyfill/intersection-observer.js.map +0 -1
  108. /package/dist/bom/{getComputedStyle.d.ts → get-computed-style.d.ts} +0 -0
  109. /package/dist/dom/{node_types.d.ts → node-types.d.ts} +0 -0
  110. /package/dist/dom/{style_properties.d.ts → style-properties.d.ts} +0 -0
@@ -1,6 +1,7 @@
1
- import env from "../env.js";
1
+ import { _classPrivateFieldInitSpec } from "../_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateFieldInitSpec.js";
2
+ import { _classPrivateFieldGet2 } from "../_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateFieldGet2.js";
2
3
  import { isArray } from "@spcsn/taro-shared";
3
- //#region src/bom/URLSearchParams.ts
4
+ //#region src/bom/url-search-params.ts
4
5
  const findReg = /[!'()~]|%20|%00/g;
5
6
  const plusReg = /\+/g;
6
7
  const replaceCharMap = {
@@ -20,20 +21,19 @@ function appendTo(dict, name, value) {
20
21
  if (name in dict) dict[name].push(res);
21
22
  else dict[name] = [res];
22
23
  }
23
- function addEach(value, key) {
24
- appendTo(this, key, value);
25
- }
26
24
  function decode(str) {
27
25
  return decodeURIComponent(str.replace(plusReg, " "));
28
26
  }
29
27
  function encode(str) {
30
28
  return encodeURIComponent(str).replace(findReg, replacer);
31
29
  }
32
- const URLSearchParams = process.env.TARO_PLATFORM === "web" ? env.window.URLSearchParams : class {
30
+ var _dict = /* @__PURE__ */ new WeakMap();
31
+ var URLSearchParams = class {
33
32
  constructor(query) {
34
- this._dict = Object.create(null);
35
- query ??= "";
36
- const dict = this._dict;
33
+ var _query;
34
+ _classPrivateFieldInitSpec(this, _dict, Object.create(null));
35
+ (_query = query) !== null && _query !== void 0 || (query = "");
36
+ const dict = _classPrivateFieldGet2(_dict, this);
37
37
  if (typeof query === "string") {
38
38
  if (query.charAt(0) === "?") query = query.slice(1);
39
39
  for (let pairs = query.split("&"), i = 0, length = pairs.length; i < length; i++) {
@@ -50,45 +50,46 @@ const URLSearchParams = process.env.TARO_PLATFORM === "web" ? env.window.URLSear
50
50
  const value = query[i];
51
51
  appendTo(dict, value[0], value[1]);
52
52
  }
53
- else if (query.forEach) query.forEach(addEach, dict);
53
+ else if (query.forEach) query.forEach((value, key) => appendTo(dict, key, value));
54
54
  else for (const key in query) appendTo(dict, key, query[key]);
55
55
  }
56
56
  append(name, value) {
57
- appendTo(this._dict, name, value);
57
+ appendTo(_classPrivateFieldGet2(_dict, this), name, value);
58
58
  }
59
59
  delete(name) {
60
- delete this._dict[name];
60
+ delete _classPrivateFieldGet2(_dict, this)[name];
61
61
  }
62
62
  get(name) {
63
- const dict = this._dict;
63
+ const dict = _classPrivateFieldGet2(_dict, this);
64
64
  return name in dict ? dict[name][0] : null;
65
65
  }
66
66
  getAll(name) {
67
- const dict = this._dict;
67
+ const dict = _classPrivateFieldGet2(_dict, this);
68
68
  return name in dict ? dict[name].slice(0) : [];
69
69
  }
70
70
  has(name) {
71
- return name in this._dict;
71
+ return name in _classPrivateFieldGet2(_dict, this);
72
72
  }
73
73
  keys() {
74
- return Object.keys(this._dict);
74
+ return Object.keys(_classPrivateFieldGet2(_dict, this));
75
75
  }
76
76
  set(name, value) {
77
- this._dict[name] = ["" + value];
77
+ _classPrivateFieldGet2(_dict, this)[name] = ["" + value];
78
78
  }
79
79
  forEach(callback, thisArg) {
80
- const dict = this._dict;
81
- Object.getOwnPropertyNames(dict).forEach(function(name) {
82
- dict[name].forEach(function(value) {
83
- callback.call(thisArg, value, name, this);
84
- }, this);
85
- }, this);
80
+ const dict = _classPrivateFieldGet2(_dict, this);
81
+ const searchParams = this;
82
+ Object.getOwnPropertyNames(dict).forEach((name) => {
83
+ dict[name].forEach((value) => {
84
+ callback.call(thisArg, value, name, searchParams);
85
+ });
86
+ });
86
87
  }
87
88
  toJSON() {
88
89
  return {};
89
90
  }
90
91
  toString() {
91
- const dict = this._dict;
92
+ const dict = _classPrivateFieldGet2(_dict, this);
92
93
  const query = [];
93
94
  for (const key in dict) {
94
95
  const name = encode(key);
@@ -100,4 +101,4 @@ const URLSearchParams = process.env.TARO_PLATFORM === "web" ? env.window.URLSear
100
101
  //#endregion
101
102
  export { URLSearchParams };
102
103
 
103
- //# sourceMappingURL=URLSearchParams.js.map
104
+ //# sourceMappingURL=url-search-params.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url-search-params.js","names":[],"sources":["../../src/bom/url-search-params.ts"],"sourcesContent":["import { isArray } from '@spcsn/taro-shared';\n\nconst findReg = /[!'()~]|%20|%00/g;\nconst plusReg = /\\+/g;\nconst replaceCharMap = {\n '!': '%21',\n \"'\": '%27',\n '(': '%28',\n ')': '%29',\n '~': '%7E',\n '%20': '+',\n '%00': '\\x00',\n};\n\nfunction replacer(match: string) {\n return replaceCharMap[match];\n}\n\nfunction appendTo(dict: Record<string, string[]>, name: string, value: string) {\n const res = isArray(value) ? value.join(',') : value;\n if (name in dict) dict[name].push(res);\n else dict[name] = [res];\n}\n\nfunction decode(str: string) {\n return decodeURIComponent(str.replace(plusReg, ' '));\n}\n\nfunction encode(str: string) {\n return encodeURIComponent(str).replace(findReg, replacer);\n}\n\nexport class URLSearchParams {\n #dict = Object.create(null);\n\n constructor(query) {\n query ??= '';\n\n const dict = this.#dict;\n\n if (typeof query === 'string') {\n if (query.charAt(0) === '?') {\n query = query.slice(1);\n }\n for (let pairs = query.split('&'), i = 0, length = pairs.length; i < length; i++) {\n const value = pairs[i];\n const index = value.indexOf('=');\n\n // 针对不规范的 url 参数做容错处理,如:word=你%好\n try {\n if (index > -1) {\n appendTo(dict, decode(value.slice(0, index)), decode(value.slice(index + 1)));\n } else if (value.length) {\n appendTo(dict, decode(value), '');\n }\n } catch (err) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[Taro warn] URL 参数 ${value} decode 异常`);\n }\n }\n }\n } else {\n if (isArray(query)) {\n for (let i = 0, length = query.length; i < length; i++) {\n const value = query[i];\n appendTo(dict, value[0], value[1]);\n }\n } else if (query.forEach) {\n query.forEach((value: string, key: string) => appendTo(dict, key, value));\n } else {\n for (const key in query) {\n appendTo(dict, key, query[key]);\n }\n }\n }\n }\n\n append(name: string, value: string) {\n appendTo(this.#dict, name, value);\n }\n\n delete(name: string) {\n delete this.#dict[name];\n }\n\n get(name: string) {\n const dict = this.#dict;\n return name in dict ? dict[name][0] : null;\n }\n\n getAll(name: string) {\n const dict = this.#dict;\n return name in dict ? dict[name].slice(0) : [];\n }\n\n has(name: string) {\n return name in this.#dict;\n }\n\n keys() {\n return Object.keys(this.#dict);\n }\n\n set(name: string, value: string) {\n this.#dict[name] = ['' + value];\n }\n\n forEach(callback, thisArg) {\n const dict = this.#dict;\n const searchParams = this;\n Object.getOwnPropertyNames(dict).forEach((name) => {\n dict[name].forEach((value: string) => {\n callback.call(thisArg, value, name, searchParams);\n });\n });\n }\n\n toJSON() {\n return {};\n }\n\n toString() {\n const dict = this.#dict;\n const query: any[] = [];\n for (const key in dict) {\n const name = encode(key);\n for (let i = 0, value = dict[key]; i < value.length; i++) {\n query.push(name + '=' + encode(value[i]));\n }\n }\n return query.join('&');\n }\n}\n"],"mappings":"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"}
@@ -1,12 +1,8 @@
1
+ import { URLSearchParams } from './url-search-params';
1
2
  declare class TaroURL {
3
+ #private;
2
4
  static createObjectURL(): void;
3
5
  static revokeObjectURL(): void;
4
- private _hash;
5
- private _hostname;
6
- private _pathname;
7
- private _port;
8
- private _protocol;
9
- private _search;
10
6
  constructor(url: string, base?: string);
11
7
  get protocol(): string;
12
8
  set protocol(val: string);
@@ -0,0 +1,196 @@
1
+ import { _classPrivateFieldInitSpec } from "../_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateFieldInitSpec.js";
2
+ import { _classPrivateFieldSet2 } from "../_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateFieldSet2.js";
3
+ import { _classPrivateFieldGet2 } from "../_virtual/_@oxc-project_runtime@0.130.0/helpers/classPrivateFieldGet2.js";
4
+ import { URLSearchParams } from "./url-search-params.js";
5
+ import { isString, isUndefined } from "@spcsn/taro-shared";
6
+ //#region src/bom/url.ts
7
+ var _hash = /* @__PURE__ */ new WeakMap();
8
+ var _hostname = /* @__PURE__ */ new WeakMap();
9
+ var _pathname = /* @__PURE__ */ new WeakMap();
10
+ var _port = /* @__PURE__ */ new WeakMap();
11
+ var _protocol = /* @__PURE__ */ new WeakMap();
12
+ var _search = /* @__PURE__ */ new WeakMap();
13
+ var TaroURL = class {
14
+ static createObjectURL() {
15
+ throw new Error("Oops, not support URL.createObjectURL() in miniprogram.");
16
+ }
17
+ static revokeObjectURL() {
18
+ throw new Error("Oops, not support URL.revokeObjectURL() in miniprogram.");
19
+ }
20
+ constructor(url, base) {
21
+ _classPrivateFieldInitSpec(this, _hash, "");
22
+ _classPrivateFieldInitSpec(this, _hostname, "");
23
+ _classPrivateFieldInitSpec(this, _pathname, "");
24
+ _classPrivateFieldInitSpec(this, _port, "");
25
+ _classPrivateFieldInitSpec(this, _protocol, "");
26
+ _classPrivateFieldInitSpec(this, _search, void 0);
27
+ if (!isString(url)) url = String(url);
28
+ const { hash, hostname, pathname, port, protocol, search } = parseUrlBase(url, base);
29
+ _classPrivateFieldSet2(_hash, this, hash);
30
+ _classPrivateFieldSet2(_hostname, this, hostname);
31
+ _classPrivateFieldSet2(_pathname, this, pathname || "/");
32
+ _classPrivateFieldSet2(_port, this, port);
33
+ _classPrivateFieldSet2(_protocol, this, protocol);
34
+ _classPrivateFieldSet2(_search, this, new URLSearchParams(search));
35
+ }
36
+ get protocol() {
37
+ return _classPrivateFieldGet2(_protocol, this);
38
+ }
39
+ set protocol(val) {
40
+ isString(val) && _classPrivateFieldSet2(_protocol, this, val.trim());
41
+ }
42
+ get host() {
43
+ return this.hostname + (this.port ? ":" + this.port : "");
44
+ }
45
+ set host(val) {
46
+ if (val && isString(val)) {
47
+ val = val.trim();
48
+ const { hostname, port } = parseUrl(`//${val}`);
49
+ this.hostname = hostname;
50
+ this.port = port;
51
+ }
52
+ }
53
+ get hostname() {
54
+ return _classPrivateFieldGet2(_hostname, this);
55
+ }
56
+ set hostname(val) {
57
+ val && isString(val) && _classPrivateFieldSet2(_hostname, this, val.trim());
58
+ }
59
+ get port() {
60
+ return _classPrivateFieldGet2(_port, this);
61
+ }
62
+ set port(val) {
63
+ isString(val) && _classPrivateFieldSet2(_port, this, val.trim());
64
+ }
65
+ get pathname() {
66
+ return _classPrivateFieldGet2(_pathname, this);
67
+ }
68
+ set pathname(val) {
69
+ if (isString(val)) {
70
+ val = val.trim();
71
+ const HEAD_REG = /^(\/|\.\/|\.\.\/)/;
72
+ let temp = val;
73
+ while (HEAD_REG.test(temp)) temp = temp.replace(HEAD_REG, "");
74
+ if (temp) _classPrivateFieldSet2(_pathname, this, "/" + temp);
75
+ else _classPrivateFieldSet2(_pathname, this, "/");
76
+ }
77
+ }
78
+ get search() {
79
+ const val = _classPrivateFieldGet2(_search, this).toString();
80
+ return val.length === 0 || val.startsWith("?") ? val : `?${val}`;
81
+ }
82
+ set search(val) {
83
+ if (isString(val)) {
84
+ val = val.trim();
85
+ _classPrivateFieldSet2(_search, this, new URLSearchParams(val));
86
+ }
87
+ }
88
+ get hash() {
89
+ return _classPrivateFieldGet2(_hash, this);
90
+ }
91
+ set hash(val) {
92
+ if (isString(val)) {
93
+ val = val.trim();
94
+ if (val) _classPrivateFieldSet2(_hash, this, val.startsWith("#") ? val : `#${val}`);
95
+ else _classPrivateFieldSet2(_hash, this, "");
96
+ }
97
+ }
98
+ get href() {
99
+ return `${this.protocol}//${this.host}${this.pathname}${this.search}${this.hash}`;
100
+ }
101
+ set href(val) {
102
+ if (val && isString(val)) {
103
+ val = val.trim();
104
+ const { protocol, hostname, port, hash, search, pathname } = parseUrl(val);
105
+ this.protocol = protocol;
106
+ this.hostname = hostname;
107
+ this.pathname = pathname;
108
+ this.port = port;
109
+ this.hash = hash;
110
+ this.search = search;
111
+ }
112
+ }
113
+ get origin() {
114
+ return `${this.protocol}//${this.host}`;
115
+ }
116
+ set origin(val) {
117
+ if (val && isString(val)) {
118
+ val = val.trim();
119
+ const { protocol, hostname, port } = parseUrl(val);
120
+ this.protocol = protocol;
121
+ this.hostname = hostname;
122
+ this.port = port;
123
+ }
124
+ }
125
+ get searchParams() {
126
+ return _classPrivateFieldGet2(_search, this);
127
+ }
128
+ toString() {
129
+ return this.href;
130
+ }
131
+ toJSON() {
132
+ return this.toString();
133
+ }
134
+ _toRaw() {
135
+ return {
136
+ protocol: this.protocol,
137
+ port: this.port,
138
+ host: this.host,
139
+ hostname: this.hostname,
140
+ pathname: this.pathname,
141
+ hash: this.hash,
142
+ search: this.search,
143
+ origin: this.origin,
144
+ href: this.href
145
+ };
146
+ }
147
+ };
148
+ const TaroURLProvider = TaroURL;
149
+ function parseUrl(url = "") {
150
+ const result = {
151
+ href: "",
152
+ origin: "",
153
+ protocol: "",
154
+ hostname: "",
155
+ host: "",
156
+ port: "",
157
+ pathname: "",
158
+ search: "",
159
+ hash: ""
160
+ };
161
+ if (!url || !isString(url)) return result;
162
+ url = url.trim();
163
+ const matches = url.match(/^(([^:/?#]+):)?\/\/(([^/?#]+):(.+)@)?([^/?#:]*)(:(\d+))?([^?#]*)(\?([^#]*))?(#(.*))?/);
164
+ if (!matches) return result;
165
+ result.protocol = matches[1] || "https:";
166
+ result.hostname = matches[6] || "taro.com";
167
+ result.port = matches[8] || "";
168
+ result.pathname = matches[9] || "/";
169
+ result.search = matches[10] || "";
170
+ result.hash = matches[12] || "";
171
+ result.href = url;
172
+ result.origin = result.protocol + "//" + result.hostname + (result.port ? `:${result.port}` : "");
173
+ result.host = result.hostname + (result.port ? `:${result.port}` : "");
174
+ return result;
175
+ }
176
+ function parseUrlBase(url, base) {
177
+ const VALID_URL = /^(https?:)\/\//i;
178
+ let fullUrl = "";
179
+ let parsedBase = null;
180
+ if (!isUndefined(base)) {
181
+ base = String(base).trim();
182
+ if (!VALID_URL.test(base)) throw new TypeError(`Failed to construct 'URL': Invalid base URL`);
183
+ parsedBase = parseUrl(base);
184
+ }
185
+ url = String(url).trim();
186
+ if (VALID_URL.test(url)) fullUrl = url;
187
+ else if (parsedBase) if (url) if (url.startsWith("//")) fullUrl = parsedBase.protocol + url;
188
+ else fullUrl = parsedBase.origin + (url.startsWith("/") ? url : `/${url}`);
189
+ else fullUrl = parsedBase.href;
190
+ else throw new TypeError(`Failed to construct 'URL': Invalid URL`);
191
+ return parseUrl(fullUrl);
192
+ }
193
+ //#endregion
194
+ export { TaroURLProvider };
195
+
196
+ //# sourceMappingURL=url.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"url.js","names":[],"sources":["../../src/bom/url.ts"],"sourcesContent":["import { isString, isUndefined } from '@spcsn/taro-shared';\n\nimport { URLSearchParams } from './url-search-params';\n\nclass TaroURL {\n static createObjectURL() {\n throw new Error('Oops, not support URL.createObjectURL() in miniprogram.');\n }\n\n static revokeObjectURL() {\n throw new Error('Oops, not support URL.revokeObjectURL() in miniprogram.');\n }\n\n /* private property */\n #hash = '';\n #hostname = '';\n #pathname = '';\n #port = '';\n #protocol = '';\n #search: URLSearchParams;\n\n constructor(url: string, base?: string) {\n if (!isString(url)) url = String(url);\n\n const parseResult = parseUrlBase(url, base);\n const { hash, hostname, pathname, port, protocol, search } = parseResult;\n\n this.#hash = hash;\n this.#hostname = hostname;\n this.#pathname = pathname || '/';\n this.#port = port;\n this.#protocol = protocol;\n this.#search = new URLSearchParams(search);\n }\n\n /* public property */\n get protocol() {\n return this.#protocol;\n }\n\n set protocol(val: string) {\n isString(val) && (this.#protocol = val.trim());\n }\n\n get host() {\n return this.hostname + (this.port ? ':' + this.port : '');\n }\n\n set host(val: string) {\n if (val && isString(val)) {\n val = val.trim();\n const { hostname, port } = parseUrl(`//${val}`);\n this.hostname = hostname;\n this.port = port;\n }\n }\n\n get hostname() {\n return this.#hostname;\n }\n\n set hostname(val: string) {\n val && isString(val) && (this.#hostname = val.trim());\n }\n\n get port() {\n return this.#port;\n }\n\n set port(val: string) {\n isString(val) && (this.#port = val.trim());\n }\n\n get pathname() {\n return this.#pathname;\n }\n\n set pathname(val: string) {\n if (isString(val)) {\n val = val.trim();\n const HEAD_REG = /^(\\/|\\.\\/|\\.\\.\\/)/;\n let temp = val;\n while (HEAD_REG.test(temp)) {\n temp = temp.replace(HEAD_REG, '');\n }\n if (temp) this.#pathname = '/' + temp;\n else this.#pathname = '/';\n }\n }\n\n get search() {\n const val = this.#search.toString();\n return val.length === 0 || val.startsWith('?') ? val : `?${val}`;\n }\n\n set search(val: string) {\n if (isString(val)) {\n val = val.trim();\n this.#search = new URLSearchParams(val);\n }\n }\n\n get hash() {\n return this.#hash;\n }\n\n set hash(val: string) {\n if (isString(val)) {\n val = val.trim();\n if (val) this.#hash = val.startsWith('#') ? val : `#${val}`;\n else this.#hash = '';\n }\n }\n\n get href() {\n return `${this.protocol}//${this.host}${this.pathname}${this.search}${this.hash}`;\n }\n\n set href(val: string) {\n if (val && isString(val)) {\n val = val.trim();\n const { protocol, hostname, port, hash, search, pathname } = parseUrl(val);\n this.protocol = protocol;\n this.hostname = hostname;\n this.pathname = pathname;\n this.port = port;\n this.hash = hash;\n this.search = search;\n }\n }\n\n get origin() {\n return `${this.protocol}//${this.host}`;\n }\n\n set origin(val: string) {\n if (val && isString(val)) {\n val = val.trim();\n const { protocol, hostname, port } = parseUrl(val);\n this.protocol = protocol;\n this.hostname = hostname;\n this.port = port;\n }\n }\n\n get searchParams() {\n return this.#search;\n }\n\n // public method\n toString() {\n return this.href;\n }\n\n toJSON() {\n return this.toString();\n }\n\n // convenient for deconstructor\n _toRaw() {\n return {\n protocol: this.protocol,\n port: this.port,\n host: this.host,\n hostname: this.hostname,\n pathname: this.pathname,\n hash: this.hash,\n search: this.search,\n origin: this.origin,\n href: this.href,\n };\n }\n}\n\nexport type { TaroURL };\n\n// Note: 小程序端 vite 打包成 commonjs,const URL = xxx 会报错,所以把 URL 改为 TaroURLProvider\nexport const TaroURLProvider: typeof TaroURL = TaroURL;\n\nexport function parseUrl(url = '') {\n const result = {\n href: '',\n origin: '',\n protocol: '',\n hostname: '',\n host: '',\n port: '',\n pathname: '',\n search: '',\n hash: '',\n };\n if (!url || !isString(url)) return result;\n\n url = url.trim();\n const PATTERN = /^(([^:/?#]+):)?\\/\\/(([^/?#]+):(.+)@)?([^/?#:]*)(:(\\d+))?([^?#]*)(\\?([^#]*))?(#(.*))?/;\n const matches = url.match(PATTERN);\n\n if (!matches) return result;\n\n // TODO: username & password ?\n result.protocol = matches[1] || 'https:';\n result.hostname = matches[6] || 'taro.com';\n result.port = matches[8] || '';\n result.pathname = matches[9] || '/';\n result.search = matches[10] || '';\n result.hash = matches[12] || '';\n result.href = url;\n result.origin = result.protocol + '//' + result.hostname + (result.port ? `:${result.port}` : '');\n result.host = result.hostname + (result.port ? `:${result.port}` : '');\n\n return result;\n}\n\nfunction parseUrlBase(url: string, base?: string) {\n const VALID_URL = /^(https?:)\\/\\//i;\n\n let fullUrl = '';\n let parsedBase: ReturnType<typeof parseUrl> | null = null;\n\n if (!isUndefined(base)) {\n base = String(base).trim();\n if (!VALID_URL.test(base)) throw new TypeError(`Failed to construct 'URL': Invalid base URL`);\n parsedBase = parseUrl(base);\n }\n\n url = String(url).trim();\n\n if (VALID_URL.test(url)) {\n fullUrl = url;\n } else if (parsedBase) {\n if (url) {\n if (url.startsWith('//')) {\n fullUrl = parsedBase.protocol + url;\n } else {\n fullUrl = parsedBase.origin + (url.startsWith('/') ? url : `/${url}`);\n }\n } else {\n fullUrl = parsedBase.href;\n }\n } else {\n throw new TypeError(`Failed to construct 'URL': Invalid URL`);\n }\n\n return parseUrl(fullUrl);\n}\n"],"mappings":"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"}
@@ -3,9 +3,9 @@ import type { TaroHistory } from './history';
3
3
  import type { TaroLocation } from './location';
4
4
  export declare class TaroWindow extends Events {
5
5
  navigator: Navigator;
6
- requestAnimationFrame: typeof requestAnimationFrame | ((callback: any) => NodeJS.Timeout);
7
- cancelAnimationFrame: typeof cancelAnimationFrame;
8
- getComputedStyle: import("./getComputedStyle").TGetComputedStyle;
6
+ requestAnimationFrame: (callback: any) => NodeJS.Timeout;
7
+ cancelAnimationFrame: (seed: any) => void;
8
+ getComputedStyle: import("./get-computed-style").TGetComputedStyle;
9
9
  Date: DateConstructor;
10
10
  location: TaroLocation;
11
11
  history: TaroHistory;
@@ -1,7 +1,7 @@
1
1
  import "../constants/index.js";
2
2
  import { Events } from "../emitter/emitter.js";
3
3
  import env from "../env.js";
4
- import { taroGetComputedStyleProvider } from "./getComputedStyle.js";
4
+ import { taroGetComputedStyleProvider } from "./get-computed-style.js";
5
5
  import { History } from "./history.js";
6
6
  import { Location } from "./location.js";
7
7
  import { nav } from "./navigator.js";
@@ -23,7 +23,7 @@ var TaroWindow = class extends Events {
23
23
  console.warn(`[Taro warn] window.${String(property)} 在赋值到 window 时报错`);
24
24
  }
25
25
  });
26
- this.Date ||= Date;
26
+ this.Date || (this.Date = Date);
27
27
  this.location = new Location({ window: this });
28
28
  this.history = new History(this.location, { window: this });
29
29
  this.initEvent();
@@ -65,7 +65,7 @@ var TaroWindow = class extends Events {
65
65
  return clearTimeout(...args);
66
66
  }
67
67
  };
68
- const taroWindowProvider = process.env.TARO_PLATFORM === "web" ? env.window : env.window = new TaroWindow();
68
+ const taroWindowProvider = env.window = new TaroWindow();
69
69
  const taroLocationProvider = taroWindowProvider.location;
70
70
  const taroHistoryProvider = taroWindowProvider.history;
71
71
  //#endregion
@@ -1 +1 @@
1
- {"version":3,"file":"window.js","names":["navigator","raf","caf"],"sources":["../../src/bom/window.ts"],"sourcesContent":["import { isString } from '@spcsn/taro-shared';\n\nimport { CONTEXT_ACTIONS } from '../constants';\nimport { Events } from '../emitter/emitter';\nimport env from '../env';\nimport { taroGetComputedStyleProvider } from './getComputedStyle';\nimport { History } from './history';\nimport { Location } from './location';\nimport { nav as navigator } from './navigator';\nimport { caf, raf } from './raf';\n\nimport type { TaroHistory } from './history';\nimport type { TaroLocation } from './location';\n\nexport class TaroWindow extends Events {\n navigator = navigator;\n requestAnimationFrame = raf;\n cancelAnimationFrame = caf;\n getComputedStyle = taroGetComputedStyleProvider;\n Date: DateConstructor;\n\n location: TaroLocation;\n history: TaroHistory;\n XMLHttpRequest?: Partial<XMLHttpRequest>;\n\n constructor() {\n super();\n\n const globalProperties = [\n ...Object.getOwnPropertyNames(global || {}),\n ...Object.getOwnPropertySymbols(global || {}),\n ];\n\n globalProperties.forEach((property) => {\n if (property === 'atob' || property === 'document') return;\n if (!Object.prototype.hasOwnProperty.call(this, property)) {\n // 防止小程序环境下,window 上的某些 get 属性在赋值时报错\n try {\n this[property] = global[property];\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[Taro warn] window.${String(property)} 在赋值到 window 时报错`);\n }\n }\n }\n });\n\n this.Date ||= Date;\n\n // 应用启动时,提供给需要读取历史信息的库使用\n this.location = new Location({ window: this }) as any;\n // @ts-ignore\n this.history = new History(this.location, { window: this });\n\n this.initEvent();\n }\n\n initEvent() {\n const _location = this.location;\n const _history = this.history;\n\n this.on(\n CONTEXT_ACTIONS.INIT,\n (pageId: string) => {\n // 页面 onload,为该页面建立新的上下文信息\n _location.trigger(CONTEXT_ACTIONS.INIT, pageId);\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.RECOVER,\n (pageId: string) => {\n // 页面 onshow,恢复当前页面的上下文信息\n _location.trigger(CONTEXT_ACTIONS.RECOVER, pageId);\n _history.trigger(CONTEXT_ACTIONS.RECOVER, pageId);\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.RESTORE,\n (pageId: string) => {\n // 页面 onhide,缓存当前页面的上下文信息\n _location.trigger(CONTEXT_ACTIONS.RESTORE, pageId);\n _history.trigger(CONTEXT_ACTIONS.RESTORE, pageId);\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.DESTROY,\n (pageId: string) => {\n // 页面 onunload,清除当前页面的上下文信息\n _location.trigger(CONTEXT_ACTIONS.DESTROY, pageId);\n _history.trigger(CONTEXT_ACTIONS.DESTROY, pageId);\n },\n null,\n );\n }\n\n get document() {\n return env.document;\n }\n\n addEventListener(event: string, callback: (arg: any) => void) {\n if (!isString(event)) return;\n this.on(event, callback, null);\n }\n\n removeEventListener(event: string, callback: (arg: any) => void) {\n if (!isString(event)) return;\n this.off(event, callback, null);\n }\n\n setTimeout(...args: Parameters<typeof setTimeout>) {\n return setTimeout(...args);\n }\n\n clearTimeout(...args: Parameters<typeof clearTimeout>) {\n return clearTimeout(...args);\n }\n}\n\n// Note: 小程序端 vite 打包成 commonjs,const window = xxx 会报错,所以把 window 改为 taroWindowProvider,location 和 history 同理\nexport const taroWindowProvider: TaroWindow =\n process.env.TARO_PLATFORM === 'web' ? env.window : (env.window = new TaroWindow());\nexport const taroLocationProvider = taroWindowProvider.location;\nexport const taroHistoryProvider = taroWindowProvider.history;\n"],"mappings":";;;;;;;;;;AAcA,IAAa,aAAb,cAAgC,OAAO;CAWrC,cAAc;EACZ,MAAM;mBAXIA;+BACYC;8BACDC;0BACJ;EAejB,CAJE,GAAG,OAAO,oBAAoB,UAAU,CAAC,CAAC,GAC1C,GAAG,OAAO,sBAAsB,UAAU,CAAC,CAAC,CAG/B,EAAE,SAAS,aAAa;GACrC,IAAI,aAAa,UAAU,aAAa,YAAY;GACpD,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,QAAQ,GAEtD,IAAI;IACF,KAAK,YAAY,OAAO;GAC1B,SAAS,GAAG;IAER,QAAQ,KAAK,sBAAsB,OAAO,QAAQ,EAAE,iBAAiB;GAEzE;EAEJ,CAAC;EAED,KAAK,SAAS;EAGd,KAAK,WAAW,IAAI,SAAS,EAAE,QAAQ,KAAK,CAAC;EAE7C,KAAK,UAAU,IAAI,QAAQ,KAAK,UAAU,EAAE,QAAQ,KAAK,CAAC;EAE1D,KAAK,UAAU;CACjB;CAEA,YAAY;EACV,MAAM,YAAY,KAAK;EACvB,MAAM,WAAW,KAAK;EAEtB,KAAK,GAAA,MAEF,WAAmB;GAElB,UAAU,QAAA,KAA8B,MAAM;EAChD,GACA,IACF;EAEA,KAAK,GAAA,MAEF,WAAmB;GAElB,UAAU,QAAA,KAAiC,MAAM;GACjD,SAAS,QAAA,KAAiC,MAAM;EAClD,GACA,IACF;EAEA,KAAK,GAAA,MAEF,WAAmB;GAElB,UAAU,QAAA,KAAiC,MAAM;GACjD,SAAS,QAAA,KAAiC,MAAM;EAClD,GACA,IACF;EAEA,KAAK,GAAA,MAEF,WAAmB;GAElB,UAAU,QAAA,KAAiC,MAAM;GACjD,SAAS,QAAA,KAAiC,MAAM;EAClD,GACA,IACF;CACF;CAEA,IAAI,WAAW;EACb,OAAO,IAAI;CACb;CAEA,iBAAiB,OAAe,UAA8B;EAC5D,IAAI,CAAC,SAAS,KAAK,GAAG;EACtB,KAAK,GAAG,OAAO,UAAU,IAAI;CAC/B;CAEA,oBAAoB,OAAe,UAA8B;EAC/D,IAAI,CAAC,SAAS,KAAK,GAAG;EACtB,KAAK,IAAI,OAAO,UAAU,IAAI;CAChC;CAEA,WAAW,GAAG,MAAqC;EACjD,OAAO,WAAW,GAAG,IAAI;CAC3B;CAEA,aAAa,GAAG,MAAuC;EACrD,OAAO,aAAa,GAAG,IAAI;CAC7B;AACF;AAGA,MAAa,qBACX,QAAQ,IAAI,kBAAkB,QAAQ,IAAI,SAAU,IAAI,SAAS,IAAI,WAAW;AAClF,MAAa,uBAAuB,mBAAmB;AACvD,MAAa,sBAAsB,mBAAmB"}
1
+ {"version":3,"file":"window.js","names":["navigator","raf","caf"],"sources":["../../src/bom/window.ts"],"sourcesContent":["import { isString } from '@spcsn/taro-shared';\n\nimport { CONTEXT_ACTIONS } from '../constants';\nimport { Events } from '../emitter/emitter';\nimport env from '../env';\nimport { taroGetComputedStyleProvider } from './get-computed-style';\nimport { History } from './history';\nimport { Location } from './location';\nimport { nav as navigator } from './navigator';\nimport { caf, raf } from './raf';\n\nimport type { TaroHistory } from './history';\nimport type { TaroLocation } from './location';\n\nexport class TaroWindow extends Events {\n navigator = navigator;\n requestAnimationFrame = raf;\n cancelAnimationFrame = caf;\n getComputedStyle = taroGetComputedStyleProvider;\n Date: DateConstructor;\n\n location: TaroLocation;\n history: TaroHistory;\n XMLHttpRequest?: Partial<XMLHttpRequest>;\n\n constructor() {\n super();\n\n const globalProperties = [\n ...Object.getOwnPropertyNames(global || {}),\n ...Object.getOwnPropertySymbols(global || {}),\n ];\n\n globalProperties.forEach((property) => {\n if (property === 'atob' || property === 'document') return;\n if (!Object.prototype.hasOwnProperty.call(this, property)) {\n // 防止小程序环境下,window 上的某些 get 属性在赋值时报错\n try {\n this[property] = global[property];\n } catch (e) {\n if (process.env.NODE_ENV !== 'production') {\n console.warn(`[Taro warn] window.${String(property)} 在赋值到 window 时报错`);\n }\n }\n }\n });\n\n this.Date ||= Date;\n\n // 应用启动时,提供给需要读取历史信息的库使用\n this.location = new Location({ window: this });\n this.history = new History(this.location, { window: this });\n\n this.initEvent();\n }\n\n initEvent() {\n const _location = this.location;\n const _history = this.history;\n\n this.on(\n CONTEXT_ACTIONS.INIT,\n (pageId: string) => {\n // 页面 onload,为该页面建立新的上下文信息\n _location.trigger(CONTEXT_ACTIONS.INIT, pageId);\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.RECOVER,\n (pageId: string) => {\n // 页面 onshow,恢复当前页面的上下文信息\n _location.trigger(CONTEXT_ACTIONS.RECOVER, pageId);\n _history.trigger(CONTEXT_ACTIONS.RECOVER, pageId);\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.RESTORE,\n (pageId: string) => {\n // 页面 onhide,缓存当前页面的上下文信息\n _location.trigger(CONTEXT_ACTIONS.RESTORE, pageId);\n _history.trigger(CONTEXT_ACTIONS.RESTORE, pageId);\n },\n null,\n );\n\n this.on(\n CONTEXT_ACTIONS.DESTROY,\n (pageId: string) => {\n // 页面 onunload,清除当前页面的上下文信息\n _location.trigger(CONTEXT_ACTIONS.DESTROY, pageId);\n _history.trigger(CONTEXT_ACTIONS.DESTROY, pageId);\n },\n null,\n );\n }\n\n get document() {\n return env.document;\n }\n\n addEventListener(event: string, callback: (arg: any) => void) {\n if (!isString(event)) return;\n this.on(event, callback, null);\n }\n\n removeEventListener(event: string, callback: (arg: any) => void) {\n if (!isString(event)) return;\n this.off(event, callback, null);\n }\n\n setTimeout(...args: Parameters<typeof setTimeout>) {\n return setTimeout(...args);\n }\n\n clearTimeout(...args: Parameters<typeof clearTimeout>) {\n return clearTimeout(...args);\n }\n}\n\n// Note: 小程序端 vite 打包成 commonjs,const window = xxx 会报错,所以把 window 改为 taroWindowProvider,location 和 history 同理\nexport const taroWindowProvider: TaroWindow = (env.window = new TaroWindow());\nexport const taroLocationProvider = taroWindowProvider.location;\nexport const taroHistoryProvider = taroWindowProvider.history;\n"],"mappings":";;;;;;;;;;AAcA,IAAa,aAAb,cAAgC,OAAO;CAWrC,cAAc;EACZ,MAAM;EAXR,KAAA,YAAYA;EACZ,KAAA,wBAAwBC;EACxB,KAAA,uBAAuBC;EACvB,KAAA,mBAAmB;EAejB,CAJE,GAAG,OAAO,oBAAoB,UAAU,CAAC,CAAC,GAC1C,GAAG,OAAO,sBAAsB,UAAU,CAAC,CAAC,CAG/B,EAAE,SAAS,aAAa;GACrC,IAAI,aAAa,UAAU,aAAa,YAAY;GACpD,IAAI,CAAC,OAAO,UAAU,eAAe,KAAK,MAAM,QAAQ,GAEtD,IAAI;IACF,KAAK,YAAY,OAAO;GAC1B,SAAS,GAAG;IAER,QAAQ,KAAK,sBAAsB,OAAO,QAAQ,EAAE,iBAAiB;GAEzE;EAEJ,CAAC;EAED,KAAK,SAAA,KAAA,OAAS;EAGd,KAAK,WAAW,IAAI,SAAS,EAAE,QAAQ,KAAK,CAAC;EAC7C,KAAK,UAAU,IAAI,QAAQ,KAAK,UAAU,EAAE,QAAQ,KAAK,CAAC;EAE1D,KAAK,UAAU;CACjB;CAEA,YAAY;EACV,MAAM,YAAY,KAAK;EACvB,MAAM,WAAW,KAAK;EAEtB,KAAK,GAAA,MAEF,WAAmB;GAElB,UAAU,QAAA,KAA8B,MAAM;EAChD,GACA,IACF;EAEA,KAAK,GAAA,MAEF,WAAmB;GAElB,UAAU,QAAA,KAAiC,MAAM;GACjD,SAAS,QAAA,KAAiC,MAAM;EAClD,GACA,IACF;EAEA,KAAK,GAAA,MAEF,WAAmB;GAElB,UAAU,QAAA,KAAiC,MAAM;GACjD,SAAS,QAAA,KAAiC,MAAM;EAClD,GACA,IACF;EAEA,KAAK,GAAA,MAEF,WAAmB;GAElB,UAAU,QAAA,KAAiC,MAAM;GACjD,SAAS,QAAA,KAAiC,MAAM;EAClD,GACA,IACF;CACF;CAEA,IAAI,WAAW;EACb,OAAO,IAAI;CACb;CAEA,iBAAiB,OAAe,UAA8B;EAC5D,IAAI,CAAC,SAAS,KAAK,GAAG;EACtB,KAAK,GAAG,OAAO,UAAU,IAAI;CAC/B;CAEA,oBAAoB,OAAe,UAA8B;EAC/D,IAAI,CAAC,SAAS,KAAK,GAAG;EACtB,KAAK,IAAI,OAAO,UAAU,IAAI;CAChC;CAEA,WAAW,GAAG,MAAqC;EACjD,OAAO,WAAW,GAAG,IAAI;CAC3B;CAEA,aAAa,GAAG,MAAuC;EACrD,OAAO,aAAa,GAAG,IAAI;CAC7B;AACF;AAGA,MAAa,qBAAkC,IAAI,SAAS,IAAI,WAAW;AAC3E,MAAa,uBAAuB,mBAAmB;AACvD,MAAa,sBAAsB,mBAAmB"}
package/dist/current.d.ts CHANGED
@@ -15,5 +15,8 @@ interface Current {
15
15
  preloadData?: any;
16
16
  }
17
17
  export declare const Current: Current;
18
+ type AppReadyCallback = (app: AppInstance) => void;
19
+ export declare function setCurrentApp(app: AppInstance): void;
20
+ export declare function whenAppReady(callback: AppReadyCallback): void;
18
21
  export declare const getCurrentInstance: () => Current;
19
22
  export {};
package/dist/current.js CHANGED
@@ -4,8 +4,17 @@ const Current = {
4
4
  router: null,
5
5
  page: null
6
6
  };
7
+ const appReadyCallbacks = [];
8
+ function setCurrentApp(app) {
9
+ Current.app = app;
10
+ while (appReadyCallbacks.length) appReadyCallbacks.shift()(app);
11
+ }
12
+ function whenAppReady(callback) {
13
+ if (Current.app) callback(Current.app);
14
+ else appReadyCallbacks.push(callback);
15
+ }
7
16
  const getCurrentInstance = () => Current;
8
17
  //#endregion
9
- export { Current, getCurrentInstance };
18
+ export { Current, getCurrentInstance, setCurrentApp, whenAppReady };
10
19
 
11
20
  //# sourceMappingURL=current.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"current.js","names":[],"sources":["../src/current.ts"],"sourcesContent":["import { AppInstance, PageInstance } from './dsl/instance';\n\nexport interface Router {\n params: Record<string, unknown>;\n path: string;\n $taroPath: string;\n onReady: string;\n onHide: string;\n onShow: string;\n exitState?: any;\n}\n\ninterface Current {\n app: AppInstance | null;\n router: Router | null;\n page: PageInstance | null;\n preloadData?: any;\n}\n\nexport const Current: Current = {\n app: null,\n router: null,\n page: null,\n};\n\nexport const getCurrentInstance = () => Current;\n"],"mappings":";AAmBA,MAAa,UAAmB;CAC9B,KAAK;CACL,QAAQ;CACR,MAAM;AACR;AAEA,MAAa,2BAA2B"}
1
+ {"version":3,"file":"current.js","names":[],"sources":["../src/current.ts"],"sourcesContent":["import { AppInstance, PageInstance } from './dsl/instance';\n\nexport interface Router {\n params: Record<string, unknown>;\n path: string;\n $taroPath: string;\n onReady: string;\n onHide: string;\n onShow: string;\n exitState?: any;\n}\n\ninterface Current {\n app: AppInstance | null;\n router: Router | null;\n page: PageInstance | null;\n preloadData?: any;\n}\n\nexport const Current: Current = {\n app: null,\n router: null,\n page: null,\n};\n\ntype AppReadyCallback = (app: AppInstance) => void;\n\nconst appReadyCallbacks: AppReadyCallback[] = [];\n\nexport function setCurrentApp(app: AppInstance) {\n Current.app = app;\n\n while (appReadyCallbacks.length) {\n appReadyCallbacks.shift()!(app);\n }\n}\n\nexport function whenAppReady(callback: AppReadyCallback) {\n if (Current.app) {\n callback(Current.app);\n } else {\n appReadyCallbacks.push(callback);\n }\n}\n\nexport const getCurrentInstance = () => Current;\n"],"mappings":";AAmBA,MAAa,UAAmB;CAC9B,KAAK;CACL,QAAQ;CACR,MAAM;AACR;AAIA,MAAM,oBAAwC,CAAC;AAE/C,SAAgB,cAAc,KAAkB;CAC9C,QAAQ,MAAM;CAEd,OAAO,kBAAkB,QACvB,kBAAkB,MAAM,EAAG,GAAG;AAElC;AAEA,SAAgB,aAAa,UAA4B;CACvD,IAAI,QAAQ,KACV,SAAS,QAAQ,GAAG;MAEpB,kBAAkB,KAAK,QAAQ;AAEnC;AAEA,MAAa,2BAA2B"}
@@ -1,33 +1,41 @@
1
- import { parseUrl } from "../bom/URL.js";
2
1
  import { TaroElement } from "./element.js";
2
+ import { parseUrl } from "../bom/URL2.js";
3
3
  //#region src/dom/anchor-element.ts
4
4
  var AnchorElement = class extends TaroElement {
5
5
  get href() {
6
- return this.props["href"] ?? "";
6
+ var _this$props$AnchorEle;
7
+ return (_this$props$AnchorEle = this.props["href"]) !== null && _this$props$AnchorEle !== void 0 ? _this$props$AnchorEle : "";
7
8
  }
8
9
  set href(val) {
9
10
  this.setAttribute("href", val);
10
11
  }
11
12
  get protocol() {
12
- return this.props["protocol"] ?? "";
13
+ var _this$props$AnchorEle2;
14
+ return (_this$props$AnchorEle2 = this.props["protocol"]) !== null && _this$props$AnchorEle2 !== void 0 ? _this$props$AnchorEle2 : "";
13
15
  }
14
16
  get host() {
15
- return this.props["host"] ?? "";
17
+ var _this$props$AnchorEle3;
18
+ return (_this$props$AnchorEle3 = this.props["host"]) !== null && _this$props$AnchorEle3 !== void 0 ? _this$props$AnchorEle3 : "";
16
19
  }
17
20
  get search() {
18
- return this.props["search"] ?? "";
21
+ var _this$props$AnchorEle4;
22
+ return (_this$props$AnchorEle4 = this.props["search"]) !== null && _this$props$AnchorEle4 !== void 0 ? _this$props$AnchorEle4 : "";
19
23
  }
20
24
  get hash() {
21
- return this.props["hash"] ?? "";
25
+ var _this$props$AnchorEle5;
26
+ return (_this$props$AnchorEle5 = this.props["hash"]) !== null && _this$props$AnchorEle5 !== void 0 ? _this$props$AnchorEle5 : "";
22
27
  }
23
28
  get hostname() {
24
- return this.props["hostname"] ?? "";
29
+ var _this$props$AnchorEle6;
30
+ return (_this$props$AnchorEle6 = this.props["hostname"]) !== null && _this$props$AnchorEle6 !== void 0 ? _this$props$AnchorEle6 : "";
25
31
  }
26
32
  get port() {
27
- return this.props["port"] ?? "";
33
+ var _this$props$AnchorEle7;
34
+ return (_this$props$AnchorEle7 = this.props["port"]) !== null && _this$props$AnchorEle7 !== void 0 ? _this$props$AnchorEle7 : "";
28
35
  }
29
36
  get pathname() {
30
- return this.props["pathname"] ?? "";
37
+ var _this$props$AnchorEle8;
38
+ return (_this$props$AnchorEle8 = this.props["pathname"]) !== null && _this$props$AnchorEle8 !== void 0 ? _this$props$AnchorEle8 : "";
31
39
  }
32
40
  setAttribute(qualifiedName, value) {
33
41
  if (qualifiedName === "href") {
@@ -1 +1 @@
1
- {"version":3,"file":"anchor-element.js","names":[],"sources":["../../src/dom/anchor-element.ts"],"sourcesContent":["import { parseUrl } from '../bom/URL';\nimport { TaroElement } from './element';\n\nconst enum AnchorElementAttrs {\n HREF = 'href',\n PROTOCOL = 'protocol',\n HOST = 'host',\n SEARCH = 'search',\n HASH = 'hash',\n HOSTNAME = 'hostname',\n PORT = 'port',\n PATHNAME = 'pathname',\n}\n\nexport class AnchorElement extends TaroElement {\n public get href() {\n return this.props[AnchorElementAttrs.HREF] ?? '';\n }\n\n public set href(val: string) {\n this.setAttribute(AnchorElementAttrs.HREF, val);\n }\n\n get protocol() {\n return this.props[AnchorElementAttrs.PROTOCOL] ?? '';\n }\n\n get host() {\n return this.props[AnchorElementAttrs.HOST] ?? '';\n }\n\n get search() {\n return this.props[AnchorElementAttrs.SEARCH] ?? '';\n }\n\n get hash() {\n return this.props[AnchorElementAttrs.HASH] ?? '';\n }\n\n get hostname() {\n return this.props[AnchorElementAttrs.HOSTNAME] ?? '';\n }\n\n get port() {\n return this.props[AnchorElementAttrs.PORT] ?? '';\n }\n\n get pathname() {\n return this.props[AnchorElementAttrs.PATHNAME] ?? '';\n }\n\n public setAttribute(qualifiedName: string, value: any): void {\n if (qualifiedName === AnchorElementAttrs.HREF) {\n const willSetAttr = parseUrl(value);\n for (const k in willSetAttr) {\n super.setAttribute(k, willSetAttr[k]);\n }\n } else {\n super.setAttribute(qualifiedName, value);\n }\n }\n}\n"],"mappings":";;;AAcA,IAAa,gBAAb,cAAmC,YAAY;CAC7C,IAAW,OAAO;EAChB,OAAO,KAAK,MAAA,WAAkC;CAChD;CAEA,IAAW,KAAK,KAAa;EAC3B,KAAK,aAAA,QAAsC,GAAG;CAChD;CAEA,IAAI,WAAW;EACb,OAAO,KAAK,MAAA,eAAsC;CACpD;CAEA,IAAI,OAAO;EACT,OAAO,KAAK,MAAA,WAAkC;CAChD;CAEA,IAAI,SAAS;EACX,OAAO,KAAK,MAAA,aAAoC;CAClD;CAEA,IAAI,OAAO;EACT,OAAO,KAAK,MAAA,WAAkC;CAChD;CAEA,IAAI,WAAW;EACb,OAAO,KAAK,MAAA,eAAsC;CACpD;CAEA,IAAI,OAAO;EACT,OAAO,KAAK,MAAA,WAAkC;CAChD;CAEA,IAAI,WAAW;EACb,OAAO,KAAK,MAAA,eAAsC;CACpD;CAEA,aAAoB,eAAuB,OAAkB;EAC3D,IAAI,kBAAA,QAA2C;GAC7C,MAAM,cAAc,SAAS,KAAK;GAClC,KAAK,MAAM,KAAK,aACd,MAAM,aAAa,GAAG,YAAY,EAAE;EAExC,OACE,MAAM,aAAa,eAAe,KAAK;CAE3C;AACF"}
1
+ {"version":3,"file":"anchor-element.js","names":[],"sources":["../../src/dom/anchor-element.ts"],"sourcesContent":["import { parseUrl } from '../bom/URL';\nimport { TaroElement } from './element';\n\nconst enum AnchorElementAttrs {\n HREF = 'href',\n PROTOCOL = 'protocol',\n HOST = 'host',\n SEARCH = 'search',\n HASH = 'hash',\n HOSTNAME = 'hostname',\n PORT = 'port',\n PATHNAME = 'pathname',\n}\n\nexport class AnchorElement extends TaroElement {\n public get href() {\n return this.props[AnchorElementAttrs.HREF] ?? '';\n }\n\n public set href(val: string) {\n this.setAttribute(AnchorElementAttrs.HREF, val);\n }\n\n get protocol() {\n return this.props[AnchorElementAttrs.PROTOCOL] ?? '';\n }\n\n get host() {\n return this.props[AnchorElementAttrs.HOST] ?? '';\n }\n\n get search() {\n return this.props[AnchorElementAttrs.SEARCH] ?? '';\n }\n\n get hash() {\n return this.props[AnchorElementAttrs.HASH] ?? '';\n }\n\n get hostname() {\n return this.props[AnchorElementAttrs.HOSTNAME] ?? '';\n }\n\n get port() {\n return this.props[AnchorElementAttrs.PORT] ?? '';\n }\n\n get pathname() {\n return this.props[AnchorElementAttrs.PATHNAME] ?? '';\n }\n\n public setAttribute(qualifiedName: string, value: any): void {\n if (qualifiedName === AnchorElementAttrs.HREF) {\n const willSetAttr = parseUrl(value);\n for (const k in willSetAttr) {\n super.setAttribute(k, willSetAttr[k]);\n }\n } else {\n super.setAttribute(qualifiedName, value);\n }\n }\n}\n"],"mappings":";;;AAcA,IAAa,gBAAb,cAAmC,YAAY;CAC7C,IAAW,OAAO;;EAChB,QAAA,wBAAO,KAAK,MAAA,aAAA,QAAA,0BAAA,KAAA,IAAA,wBAAkC;CAChD;CAEA,IAAW,KAAK,KAAa;EAC3B,KAAK,aAAA,QAAsC,GAAG;CAChD;CAEA,IAAI,WAAW;;EACb,QAAA,yBAAO,KAAK,MAAA,iBAAA,QAAA,2BAAA,KAAA,IAAA,yBAAsC;CACpD;CAEA,IAAI,OAAO;;EACT,QAAA,yBAAO,KAAK,MAAA,aAAA,QAAA,2BAAA,KAAA,IAAA,yBAAkC;CAChD;CAEA,IAAI,SAAS;;EACX,QAAA,yBAAO,KAAK,MAAA,eAAA,QAAA,2BAAA,KAAA,IAAA,yBAAoC;CAClD;CAEA,IAAI,OAAO;;EACT,QAAA,yBAAO,KAAK,MAAA,aAAA,QAAA,2BAAA,KAAA,IAAA,yBAAkC;CAChD;CAEA,IAAI,WAAW;;EACb,QAAA,yBAAO,KAAK,MAAA,iBAAA,QAAA,2BAAA,KAAA,IAAA,yBAAsC;CACpD;CAEA,IAAI,OAAO;;EACT,QAAA,yBAAO,KAAK,MAAA,aAAA,QAAA,2BAAA,KAAA,IAAA,yBAAkC;CAChD;CAEA,IAAI,WAAW;;EACb,QAAA,yBAAO,KAAK,MAAA,iBAAA,QAAA,2BAAA,KAAA,IAAA,yBAAsC;CACpD;CAEA,aAAoB,eAAuB,OAAkB;EAC3D,IAAI,kBAAA,QAA2C;GAC7C,MAAM,cAAc,SAAS,KAAK;GAClC,KAAK,MAAM,KAAK,aACd,MAAM,aAAa,GAAG,YAAY,EAAE;EAExC,OACE,MAAM,aAAa,eAAe,KAAK;CAE3C;AACF"}
@@ -50,7 +50,8 @@ var ClassList = class {
50
50
  toggle(token, force) {
51
51
  const result = this.contains(token);
52
52
  const method = result ? force !== true && "remove" : force !== false && "add";
53
- if (method) this[method](token);
53
+ if (method === "add") this.add(token);
54
+ if (method === "remove") this.remove(token);
54
55
  if (force === true || force === false) return force;
55
56
  else return !result;
56
57
  }
@@ -1 +1 @@
1
- {"version":3,"file":"class-list.js","names":[],"sources":["../../src/dom/class-list.ts"],"sourcesContent":["import type { TaroElement } from './element';\n\nexport class ClassList {\n private el: TaroElement;\n\n private tokenList: string[] = [];\n\n constructor(className: string, el: TaroElement) {\n this.el = el;\n className\n .trim()\n .split(/\\s+/)\n .forEach((token) => this.tokenList.push(token));\n }\n\n public get value() {\n return this.toString();\n }\n\n public get length() {\n return this.tokenList.length;\n }\n\n add() {\n let index = 0;\n let updated = false;\n\n const tokens = arguments;\n const length = tokens.length;\n const tokenList = this.tokenList;\n\n do {\n const token: string = tokens[index];\n\n if (this.checkTokenIsValid(token) && !~tokenList.indexOf(token)) {\n tokenList.push(token);\n\n updated = true;\n }\n } while (++index < length);\n\n if (updated) {\n this._update();\n }\n }\n\n remove() {\n let i = 0;\n let updated = false;\n\n const tokens = arguments;\n const length = tokens.length;\n const tokenList = this.tokenList;\n\n do {\n const token = tokens[i] + '';\n\n if (!this.checkTokenIsValid(token)) continue;\n\n const index = tokenList.indexOf(token);\n\n if (~tokenList.indexOf(token)) {\n tokenList.splice(index, 1);\n\n updated = true;\n }\n } while (++i < length);\n\n if (updated) {\n this._update();\n }\n }\n\n contains(token: string) {\n if (!this.checkTokenIsValid(token)) return false;\n\n return !!~this.tokenList.indexOf(token);\n }\n\n toggle(token: string, force: boolean) {\n const result = this.contains(token);\n const method = result ? force !== true && 'remove' : force !== false && 'add';\n\n if (method) {\n // @ts-ignore\n this[method](token);\n }\n\n if (force === true || force === false) {\n return force;\n } else {\n return !result;\n }\n }\n\n replace(token: string, replacement_token: string) {\n if (!this.checkTokenIsValid(token) || !this.checkTokenIsValid(replacement_token)) return;\n\n const index = this.tokenList.indexOf(token);\n\n if (~index) {\n this.tokenList.splice(index, 1, replacement_token);\n this._update();\n }\n }\n\n toString() {\n return this.tokenList.filter((v) => v !== '').join(' ');\n }\n\n private checkTokenIsValid(token: string) {\n if (token === '' || /\\s/.test(token)) return false;\n\n return true;\n }\n\n private _update() {\n this.el.className = this.value;\n }\n}\n"],"mappings":";AAEA,IAAa,YAAb,MAAuB;CAKrB,YAAY,WAAmB,IAAiB;mBAFlB,CAAC;EAG7B,KAAK,KAAK;EACV,UACG,KAAK,EACL,MAAM,KAAK,EACX,SAAS,UAAU,KAAK,UAAU,KAAK,KAAK,CAAC;CAClD;CAEA,IAAW,QAAQ;EACjB,OAAO,KAAK,SAAS;CACvB;CAEA,IAAW,SAAS;EAClB,OAAO,KAAK,UAAU;CACxB;CAEA,MAAM;EACJ,IAAI,QAAQ;EACZ,IAAI,UAAU;EAEd,MAAM,SAAS;EACf,MAAM,SAAS,OAAO;EACtB,MAAM,YAAY,KAAK;EAEvB,GAAG;GACD,MAAM,QAAgB,OAAO;GAE7B,IAAI,KAAK,kBAAkB,KAAK,KAAK,CAAC,CAAC,UAAU,QAAQ,KAAK,GAAG;IAC/D,UAAU,KAAK,KAAK;IAEpB,UAAU;GACZ;EACF,SAAS,EAAE,QAAQ;EAEnB,IAAI,SACF,KAAK,QAAQ;CAEjB;CAEA,SAAS;EACP,IAAI,IAAI;EACR,IAAI,UAAU;EAEd,MAAM,SAAS;EACf,MAAM,SAAS,OAAO;EACtB,MAAM,YAAY,KAAK;EAEvB,GAAG;GACD,MAAM,QAAQ,OAAO,KAAK;GAE1B,IAAI,CAAC,KAAK,kBAAkB,KAAK,GAAG;GAEpC,MAAM,QAAQ,UAAU,QAAQ,KAAK;GAErC,IAAI,CAAC,UAAU,QAAQ,KAAK,GAAG;IAC7B,UAAU,OAAO,OAAO,CAAC;IAEzB,UAAU;GACZ;EACF,SAAS,EAAE,IAAI;EAEf,IAAI,SACF,KAAK,QAAQ;CAEjB;CAEA,SAAS,OAAe;EACtB,IAAI,CAAC,KAAK,kBAAkB,KAAK,GAAG,OAAO;EAE3C,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,QAAQ,KAAK;CACxC;CAEA,OAAO,OAAe,OAAgB;EACpC,MAAM,SAAS,KAAK,SAAS,KAAK;EAClC,MAAM,SAAS,SAAS,UAAU,QAAQ,WAAW,UAAU,SAAS;EAExE,IAAI,QAEF,KAAK,QAAQ,KAAK;EAGpB,IAAI,UAAU,QAAQ,UAAU,OAC9B,OAAO;OAEP,OAAO,CAAC;CAEZ;CAEA,QAAQ,OAAe,mBAA2B;EAChD,IAAI,CAAC,KAAK,kBAAkB,KAAK,KAAK,CAAC,KAAK,kBAAkB,iBAAiB,GAAG;EAElF,MAAM,QAAQ,KAAK,UAAU,QAAQ,KAAK;EAE1C,IAAI,CAAC,OAAO;GACV,KAAK,UAAU,OAAO,OAAO,GAAG,iBAAiB;GACjD,KAAK,QAAQ;EACf;CACF;CAEA,WAAW;EACT,OAAO,KAAK,UAAU,QAAQ,MAAM,MAAM,EAAE,EAAE,KAAK,GAAG;CACxD;CAEA,kBAA0B,OAAe;EACvC,IAAI,UAAU,MAAM,KAAK,KAAK,KAAK,GAAG,OAAO;EAE7C,OAAO;CACT;CAEA,UAAkB;EAChB,KAAK,GAAG,YAAY,KAAK;CAC3B;AACF"}
1
+ {"version":3,"file":"class-list.js","names":[],"sources":["../../src/dom/class-list.ts"],"sourcesContent":["import type { TaroElement } from './element';\n\nexport class ClassList {\n private el: TaroElement;\n\n private tokenList: string[] = [];\n\n constructor(className: string, el: TaroElement) {\n this.el = el;\n className\n .trim()\n .split(/\\s+/)\n .forEach((token) => this.tokenList.push(token));\n }\n\n public get value() {\n return this.toString();\n }\n\n public get length() {\n return this.tokenList.length;\n }\n\n add() {\n let index = 0;\n let updated = false;\n\n const tokens = arguments;\n const length = tokens.length;\n const tokenList = this.tokenList;\n\n do {\n const token: string = tokens[index];\n\n if (this.checkTokenIsValid(token) && !~tokenList.indexOf(token)) {\n tokenList.push(token);\n\n updated = true;\n }\n } while (++index < length);\n\n if (updated) {\n this._update();\n }\n }\n\n remove() {\n let i = 0;\n let updated = false;\n\n const tokens = arguments;\n const length = tokens.length;\n const tokenList = this.tokenList;\n\n do {\n const token = tokens[i] + '';\n\n if (!this.checkTokenIsValid(token)) continue;\n\n const index = tokenList.indexOf(token);\n\n if (~tokenList.indexOf(token)) {\n tokenList.splice(index, 1);\n\n updated = true;\n }\n } while (++i < length);\n\n if (updated) {\n this._update();\n }\n }\n\n contains(token: string) {\n if (!this.checkTokenIsValid(token)) return false;\n\n return !!~this.tokenList.indexOf(token);\n }\n\n toggle(token: string, force: boolean) {\n const result = this.contains(token);\n const method = result ? force !== true && 'remove' : force !== false && 'add';\n\n if (method === 'add') {\n this.add(token);\n }\n\n if (method === 'remove') {\n this.remove(token);\n }\n\n if (force === true || force === false) {\n return force;\n } else {\n return !result;\n }\n }\n\n replace(token: string, replacement_token: string) {\n if (!this.checkTokenIsValid(token) || !this.checkTokenIsValid(replacement_token)) return;\n\n const index = this.tokenList.indexOf(token);\n\n if (~index) {\n this.tokenList.splice(index, 1, replacement_token);\n this._update();\n }\n }\n\n toString() {\n return this.tokenList.filter((v) => v !== '').join(' ');\n }\n\n private checkTokenIsValid(token: string) {\n if (token === '' || /\\s/.test(token)) return false;\n\n return true;\n }\n\n private _update() {\n this.el.className = this.value;\n }\n}\n"],"mappings":";AAEA,IAAa,YAAb,MAAuB;CAKrB,YAAY,WAAmB,IAAiB;EAFhD,KAAQ,YAAsB,CAAC;EAG7B,KAAK,KAAK;EACV,UACG,KAAK,EACL,MAAM,KAAK,EACX,SAAS,UAAU,KAAK,UAAU,KAAK,KAAK,CAAC;CAClD;CAEA,IAAW,QAAQ;EACjB,OAAO,KAAK,SAAS;CACvB;CAEA,IAAW,SAAS;EAClB,OAAO,KAAK,UAAU;CACxB;CAEA,MAAM;EACJ,IAAI,QAAQ;EACZ,IAAI,UAAU;EAEd,MAAM,SAAS;EACf,MAAM,SAAS,OAAO;EACtB,MAAM,YAAY,KAAK;EAEvB,GAAG;GACD,MAAM,QAAgB,OAAO;GAE7B,IAAI,KAAK,kBAAkB,KAAK,KAAK,CAAC,CAAC,UAAU,QAAQ,KAAK,GAAG;IAC/D,UAAU,KAAK,KAAK;IAEpB,UAAU;GACZ;EACF,SAAS,EAAE,QAAQ;EAEnB,IAAI,SACF,KAAK,QAAQ;CAEjB;CAEA,SAAS;EACP,IAAI,IAAI;EACR,IAAI,UAAU;EAEd,MAAM,SAAS;EACf,MAAM,SAAS,OAAO;EACtB,MAAM,YAAY,KAAK;EAEvB,GAAG;GACD,MAAM,QAAQ,OAAO,KAAK;GAE1B,IAAI,CAAC,KAAK,kBAAkB,KAAK,GAAG;GAEpC,MAAM,QAAQ,UAAU,QAAQ,KAAK;GAErC,IAAI,CAAC,UAAU,QAAQ,KAAK,GAAG;IAC7B,UAAU,OAAO,OAAO,CAAC;IAEzB,UAAU;GACZ;EACF,SAAS,EAAE,IAAI;EAEf,IAAI,SACF,KAAK,QAAQ;CAEjB;CAEA,SAAS,OAAe;EACtB,IAAI,CAAC,KAAK,kBAAkB,KAAK,GAAG,OAAO;EAE3C,OAAO,CAAC,CAAC,CAAC,KAAK,UAAU,QAAQ,KAAK;CACxC;CAEA,OAAO,OAAe,OAAgB;EACpC,MAAM,SAAS,KAAK,SAAS,KAAK;EAClC,MAAM,SAAS,SAAS,UAAU,QAAQ,WAAW,UAAU,SAAS;EAExE,IAAI,WAAW,OACb,KAAK,IAAI,KAAK;EAGhB,IAAI,WAAW,UACb,KAAK,OAAO,KAAK;EAGnB,IAAI,UAAU,QAAQ,UAAU,OAC9B,OAAO;OAEP,OAAO,CAAC;CAEZ;CAEA,QAAQ,OAAe,mBAA2B;EAChD,IAAI,CAAC,KAAK,kBAAkB,KAAK,KAAK,CAAC,KAAK,kBAAkB,iBAAiB,GAAG;EAElF,MAAM,QAAQ,KAAK,UAAU,QAAQ,KAAK;EAE1C,IAAI,CAAC,OAAO;GACV,KAAK,UAAU,OAAO,OAAO,GAAG,iBAAiB;GACjD,KAAK,QAAQ;EACf;CACF;CAEA,WAAW;EACT,OAAO,KAAK,UAAU,QAAQ,MAAM,MAAM,EAAE,EAAE,KAAK,GAAG;CACxD;CAEA,kBAA0B,OAAe;EACvC,IAAI,UAAU,MAAM,KAAK,KAAK,KAAK,GAAG,OAAO;EAE7C,OAAO;CACT;CAEA,UAAkB;EAChB,KAAK,GAAG,YAAY,KAAK;CAC3B;AACF"}
@@ -1 +1 @@
1
- {"version":3,"file":"document.js","names":[],"sources":["../../src/dom/document.ts"],"sourcesContent":["import { controlledComponent, isUndefined, toCamelCase } from '@spcsn/taro-shared';\n\nimport { A, COMMENT, DOCUMENT_ELEMENT_NAME, ROOT_STR } from '../constants';\nimport { TaroElement } from '../dom/element';\nimport { createEvent } from '../dom/event';\nimport { eventSource } from '../dom/event-source';\nimport { FormElement } from '../dom/form';\nimport { NodeType } from '../dom/node_types';\nimport { TaroRootElement } from '../dom/root';\nimport { TaroText } from '../dom/text';\nimport env from '../env';\nimport { AnchorElement } from './anchor-element';\nimport { TransferElement } from './transfer';\n\nexport class TaroDocument extends TaroElement {\n public documentElement: TaroElement;\n public head: TaroElement;\n public body: TaroElement;\n public createEvent = createEvent;\n cookie?: string;\n\n public constructor() {\n super();\n this.nodeType = NodeType.DOCUMENT_NODE;\n this.nodeName = DOCUMENT_ELEMENT_NAME;\n }\n\n public createElement(type: string): TaroElement | TaroRootElement | FormElement {\n const nodeName = type.toLowerCase();\n\n let element: TaroElement;\n switch (true) {\n case nodeName === ROOT_STR:\n element = new TaroRootElement();\n return element;\n case controlledComponent.has(nodeName):\n element = new FormElement();\n break;\n case nodeName === A:\n element = new AnchorElement();\n break;\n case nodeName === 'page-meta':\n case nodeName === 'navigation-bar':\n element = new TransferElement(toCamelCase(nodeName));\n break;\n default:\n element = new TaroElement();\n break;\n }\n\n element.nodeName = nodeName;\n element.tagName = type.toUpperCase();\n\n return element;\n }\n\n // Minimal createElementNS shim — kept as no-op for renderers that\n // attempt to mount into an SVG container before falling back.\n public createElementNS(_svgNS: string, type: string): TaroElement | TaroRootElement | FormElement {\n return this.createElement(type);\n }\n\n public createTextNode(text: string): TaroText {\n return new TaroText(text);\n }\n\n public getElementById<T extends TaroElement>(id: string | undefined | null): T | null {\n const el = eventSource.get(id);\n return isUndefined(el) ? null : (el as T);\n }\n\n public querySelector<T extends TaroElement>(query: string): T | null {\n // Minimal id-selector shim — only `#id` is supported.\n if (/^#/.test(query)) {\n return this.getElementById<T>(query.slice(1));\n }\n return null;\n }\n\n public querySelectorAll() {\n // fake hack\n return [];\n }\n\n // @TODO: @PERF: 在 hydrate 移除掉空的 node\n public createComment(): TaroText {\n const textnode = new TaroText('');\n textnode.nodeName = COMMENT;\n return textnode;\n }\n\n get defaultView() {\n return env.window;\n }\n}\n"],"mappings":";;;;;;;;;;;;AAcA,IAAa,eAAb,cAAkC,YAAY;CAO5C,cAAqB;EACnB,MAAM;qBAJa;EAKnB,KAAK,WAAA;EACL,KAAK,WAAW;CAClB;CAEA,cAAqB,MAA2D;EAC9E,MAAM,WAAW,KAAK,YAAY;EAElC,IAAI;EACJ,QAAQ,MAAR;GACE,KAAK,aAAa;IAChB,UAAU,IAAI,gBAAgB;IAC9B,OAAO;GACT,KAAK,oBAAoB,IAAI,QAAQ;IACnC,UAAU,IAAI,YAAY;IAC1B;GACF,KAAK,aAAA;IACH,UAAU,IAAI,cAAc;IAC5B;GACF,KAAK,aAAa;GAClB,KAAK,aAAa;IAChB,UAAU,IAAI,gBAAgB,YAAY,QAAQ,CAAC;IACnD;GACF;IACE,UAAU,IAAI,YAAY;IAC1B;EACJ;EAEA,QAAQ,WAAW;EACnB,QAAQ,UAAU,KAAK,YAAY;EAEnC,OAAO;CACT;CAIA,gBAAuB,QAAgB,MAA2D;EAChG,OAAO,KAAK,cAAc,IAAI;CAChC;CAEA,eAAsB,MAAwB;EAC5C,OAAO,IAAI,SAAS,IAAI;CAC1B;CAEA,eAA6C,IAAyC;EACpF,MAAM,KAAK,YAAY,IAAI,EAAE;EAC7B,OAAO,YAAY,EAAE,IAAI,OAAQ;CACnC;CAEA,cAA4C,OAAyB;EAEnE,IAAI,KAAK,KAAK,KAAK,GACjB,OAAO,KAAK,eAAkB,MAAM,MAAM,CAAC,CAAC;EAE9C,OAAO;CACT;CAEA,mBAA0B;EAExB,OAAO,CAAC;CACV;CAGA,gBAAiC;EAC/B,MAAM,WAAW,IAAI,SAAS,EAAE;EAChC,SAAS,WAAW;EACpB,OAAO;CACT;CAEA,IAAI,cAAc;EAChB,OAAO,IAAI;CACb;AACF"}
1
+ {"version":3,"file":"document.js","names":[],"sources":["../../src/dom/document.ts"],"sourcesContent":["import { controlledComponent, isUndefined, toCamelCase } from '@spcsn/taro-shared';\n\nimport { A, COMMENT, DOCUMENT_ELEMENT_NAME, ROOT_STR } from '../constants';\nimport { TaroElement } from '../dom/element';\nimport { createEvent } from '../dom/event';\nimport { eventSource } from '../dom/event-source';\nimport { FormElement } from '../dom/form';\nimport { NodeType } from '../dom/node-types';\nimport { TaroRootElement } from '../dom/root';\nimport { TaroText } from '../dom/text';\nimport env from '../env';\nimport { AnchorElement } from './anchor-element';\nimport { TransferElement } from './transfer';\n\nexport class TaroDocument extends TaroElement {\n public documentElement: TaroElement;\n public head: TaroElement;\n public body: TaroElement;\n public createEvent = createEvent;\n cookie?: string;\n\n public constructor() {\n super();\n this.nodeType = NodeType.DOCUMENT_NODE;\n this.nodeName = DOCUMENT_ELEMENT_NAME;\n }\n\n public createElement(type: string): TaroElement | TaroRootElement | FormElement {\n const nodeName = type.toLowerCase();\n\n let element: TaroElement;\n switch (true) {\n case nodeName === ROOT_STR:\n element = new TaroRootElement();\n return element;\n case controlledComponent.has(nodeName):\n element = new FormElement();\n break;\n case nodeName === A:\n element = new AnchorElement();\n break;\n case nodeName === 'page-meta':\n case nodeName === 'navigation-bar':\n element = new TransferElement(toCamelCase(nodeName));\n break;\n default:\n element = new TaroElement();\n break;\n }\n\n element.nodeName = nodeName;\n element.tagName = type.toUpperCase();\n\n return element;\n }\n\n // Minimal createElementNS shim — kept as no-op for renderers that\n // attempt to mount into an SVG container before falling back.\n public createElementNS(_svgNS: string, type: string): TaroElement | TaroRootElement | FormElement {\n return this.createElement(type);\n }\n\n public createTextNode(text: string): TaroText {\n return new TaroText(text);\n }\n\n public getElementById<T extends TaroElement>(id: string | undefined | null): T | null {\n const el = eventSource.get(id);\n return isUndefined(el) ? null : (el as T);\n }\n\n public querySelector<T extends TaroElement>(query: string): T | null {\n // Minimal id-selector shim — only `#id` is supported.\n if (/^#/.test(query)) {\n return this.getElementById<T>(query.slice(1));\n }\n return null;\n }\n\n public querySelectorAll() {\n // fake hack\n return [];\n }\n\n // @TODO: @PERF: 在 hydrate 移除掉空的 node\n public createComment(): TaroText {\n const textnode = new TaroText('');\n textnode.nodeName = COMMENT;\n return textnode;\n }\n\n get defaultView() {\n return env.window;\n }\n}\n"],"mappings":";;;;;;;;;;;;AAcA,IAAa,eAAb,cAAkC,YAAY;CAO5C,cAAqB;EACnB,MAAM;EAJR,KAAO,cAAc;EAKnB,KAAK,WAAA;EACL,KAAK,WAAW;CAClB;CAEA,cAAqB,MAA2D;EAC9E,MAAM,WAAW,KAAK,YAAY;EAElC,IAAI;EACJ,QAAQ,MAAR;GACE,KAAK,aAAa;IAChB,UAAU,IAAI,gBAAgB;IAC9B,OAAO;GACT,KAAK,oBAAoB,IAAI,QAAQ;IACnC,UAAU,IAAI,YAAY;IAC1B;GACF,KAAK,aAAA;IACH,UAAU,IAAI,cAAc;IAC5B;GACF,KAAK,aAAa;GAClB,KAAK,aAAa;IAChB,UAAU,IAAI,gBAAgB,YAAY,QAAQ,CAAC;IACnD;GACF;IACE,UAAU,IAAI,YAAY;IAC1B;EACJ;EAEA,QAAQ,WAAW;EACnB,QAAQ,UAAU,KAAK,YAAY;EAEnC,OAAO;CACT;CAIA,gBAAuB,QAAgB,MAA2D;EAChG,OAAO,KAAK,cAAc,IAAI;CAChC;CAEA,eAAsB,MAAwB;EAC5C,OAAO,IAAI,SAAS,IAAI;CAC1B;CAEA,eAA6C,IAAyC;EACpF,MAAM,KAAK,YAAY,IAAI,EAAE;EAC7B,OAAO,YAAY,EAAE,IAAI,OAAQ;CACnC;CAEA,cAA4C,OAAyB;EAEnE,IAAI,KAAK,KAAK,KAAK,GACjB,OAAO,KAAK,eAAkB,MAAM,MAAM,CAAC,CAAC;EAE9C,OAAO;CACT;CAEA,mBAA0B;EAExB,OAAO,CAAC;CACV;CAGA,gBAAiC;EAC/B,MAAM,WAAW,IAAI,SAAS,EAAE;EAChC,SAAS,WAAW;EACpB,OAAO;CACT;CAEA,IAAI,cAAc;EAChB,OAAO,IAAI;CACb;AACF"}
@@ -18,14 +18,14 @@ var TaroElement = class TaroElement extends TaroNode {
18
18
  hooks.call("patchElement", this);
19
19
  }
20
20
  _stopPropagation(event) {
21
- let target = this;
22
- while (target = target.parentNode) {
23
- const listeners = target.__handlers[event.type];
24
- if (!isArray(listeners)) continue;
25
- for (let i = listeners.length; i--;) {
26
- const l = listeners[i];
27
- l._stop = true;
21
+ let parentNode = this.parentNode;
22
+ while (parentNode) {
23
+ const listeners = parentNode.__handlers[event.type];
24
+ if (isArray(listeners)) for (let i = listeners.length; i--;) {
25
+ const listener = listeners[i];
26
+ listener._stop = true;
28
27
  }
28
+ parentNode = parentNode.parentNode;
29
29
  }
30
30
  }
31
31
  get id() {
@@ -185,7 +185,8 @@ var TaroElement = class TaroElement extends TaroNode {
185
185
  }
186
186
  }
187
187
  getAttribute(qualifiedName) {
188
- return (qualifiedName === "style" ? this.style.cssText : this.props[qualifiedName]) ?? "";
188
+ const attr = qualifiedName === "style" ? this.style.cssText : this.props[qualifiedName];
189
+ return attr !== null && attr !== void 0 ? attr : "";
189
190
  }
190
191
  getElementsByTagName(tagName) {
191
192
  return treeToArray(this, (el) => {