@tarojs/runtime 4.0.0-canary.8 → 4.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 (177) hide show
  1. package/LICENSE +17 -3
  2. package/dist/bom/URL.d.ts +54 -0
  3. package/dist/bom/URL.js +221 -0
  4. package/dist/bom/URL.js.map +1 -0
  5. package/dist/bom/URLSearchParams.d.ts +2 -0
  6. package/dist/bom/URLSearchParams.js +131 -0
  7. package/dist/bom/URLSearchParams.js.map +1 -0
  8. package/dist/bom/document.d.ts +3 -0
  9. package/dist/bom/document.js +39 -0
  10. package/dist/bom/document.js.map +1 -0
  11. package/dist/bom/getComputedStyle.d.ts +5 -0
  12. package/dist/bom/getComputedStyle.js +8 -0
  13. package/dist/bom/getComputedStyle.js.map +1 -0
  14. package/dist/bom/history.d.ts +32 -0
  15. package/dist/bom/history.js +121 -0
  16. package/dist/bom/history.js.map +1 -0
  17. package/dist/bom/location.d.ts +39 -0
  18. package/dist/bom/location.js +240 -0
  19. package/dist/bom/location.js.map +1 -0
  20. package/dist/bom/navigator.d.ts +2 -0
  21. package/dist/bom/navigator.js +24 -0
  22. package/dist/bom/navigator.js.map +1 -0
  23. package/dist/bom/raf.d.ts +5 -0
  24. package/dist/bom/raf.js +33 -0
  25. package/dist/bom/raf.js.map +1 -0
  26. package/dist/bom/window.d.ts +26 -0
  27. package/dist/bom/window.js +92 -0
  28. package/dist/bom/window.js.map +1 -0
  29. package/dist/constants/index.d.ts +60 -0
  30. package/dist/constants/index.js +63 -0
  31. package/dist/constants/index.js.map +1 -0
  32. package/dist/current.d.ts +19 -0
  33. package/dist/current.js +9 -0
  34. package/dist/current.js.map +1 -0
  35. package/dist/dom/anchor-element.d.ts +14 -0
  36. package/dist/dom/anchor-element.js +54 -0
  37. package/dist/dom/anchor-element.js.map +1 -0
  38. package/dist/dom/class-list.d.ts +17 -0
  39. package/dist/dom/class-list.js +92 -0
  40. package/dist/dom/class-list.js.map +1 -0
  41. package/dist/dom/document.d.ts +25 -0
  42. package/dist/dom/document.js +80 -0
  43. package/dist/dom/document.js.map +1 -0
  44. package/dist/dom/element.d.ts +40 -0
  45. package/dist/dom/element.js +315 -0
  46. package/dist/dom/element.js.map +1 -0
  47. package/dist/dom/event-source.d.ts +7 -0
  48. package/dist/dom/event-source.js +17 -0
  49. package/dist/dom/event-source.js.map +1 -0
  50. package/dist/dom/event-target.d.ts +8 -0
  51. package/dist/dom/event-target.js +78 -0
  52. package/dist/dom/event-target.js.map +1 -0
  53. package/dist/dom/event.d.ts +24 -0
  54. package/dist/dom/event.js +152 -0
  55. package/dist/dom/event.js.map +1 -0
  56. package/dist/dom/form.d.ts +10 -0
  57. package/dist/dom/form.js +38 -0
  58. package/dist/dom/form.js.map +1 -0
  59. package/dist/dom/node.d.ts +107 -0
  60. package/dist/dom/node.js +292 -0
  61. package/dist/dom/node.js.map +1 -0
  62. package/dist/dom/root.d.ts +16 -0
  63. package/dist/dom/root.js +169 -0
  64. package/dist/dom/root.js.map +1 -0
  65. package/dist/dom/style.d.ts +15 -0
  66. package/dist/dom/style.js +168 -0
  67. package/dist/dom/style.js.map +1 -0
  68. package/dist/dom/style_properties.d.ts +3 -0
  69. package/dist/dom/style_properties.js +186 -0
  70. package/dist/dom/style_properties.js.map +1 -0
  71. package/dist/dom/svg.d.ts +4 -0
  72. package/dist/dom/svg.js +8 -0
  73. package/dist/dom/svg.js.map +1 -0
  74. package/dist/dom/text.d.ts +15 -0
  75. package/dist/dom/text.js +41 -0
  76. package/dist/dom/text.js.map +1 -0
  77. package/dist/dom/transfer.d.ts +8 -0
  78. package/dist/dom/transfer.js +15 -0
  79. package/dist/dom/transfer.js.map +1 -0
  80. package/dist/dom/tree.d.ts +4 -0
  81. package/dist/dom/tree.js +38 -0
  82. package/dist/dom/tree.js.map +1 -0
  83. package/dist/dom-external/element.d.ts +4 -0
  84. package/dist/dom-external/element.js +29 -0
  85. package/dist/dom-external/element.js.map +1 -0
  86. package/dist/dom-external/index.d.ts +1 -0
  87. package/dist/dom-external/index.js +38 -0
  88. package/dist/dom-external/index.js.map +1 -0
  89. package/dist/dom-external/inner-html/html.d.ts +3 -0
  90. package/dist/dom-external/inner-html/html.js +28 -0
  91. package/dist/dom-external/inner-html/html.js.map +1 -0
  92. package/dist/dom-external/inner-html/parser.d.ts +25 -0
  93. package/dist/dom-external/inner-html/parser.js +216 -0
  94. package/dist/dom-external/inner-html/parser.js.map +1 -0
  95. package/dist/dom-external/inner-html/scaner.d.ts +30 -0
  96. package/dist/dom-external/inner-html/scaner.js +304 -0
  97. package/dist/dom-external/inner-html/scaner.js.map +1 -0
  98. package/dist/dom-external/inner-html/style.d.ts +27 -0
  99. package/dist/dom-external/inner-html/style.js +235 -0
  100. package/dist/dom-external/inner-html/style.js.map +1 -0
  101. package/dist/dom-external/inner-html/tags.d.ts +9 -0
  102. package/dist/dom-external/inner-html/tags.js +26 -0
  103. package/dist/dom-external/inner-html/tags.js.map +1 -0
  104. package/dist/dom-external/inner-html/utils.d.ts +2 -0
  105. package/dist/dom-external/inner-html/utils.js +12 -0
  106. package/dist/dom-external/inner-html/utils.js.map +1 -0
  107. package/dist/dom-external/mutation-observer/implements.d.ts +71 -0
  108. package/dist/dom-external/mutation-observer/implements.js +108 -0
  109. package/dist/dom-external/mutation-observer/implements.js.map +1 -0
  110. package/dist/dom-external/mutation-observer/index.d.ts +12 -0
  111. package/dist/dom-external/mutation-observer/index.js +35 -0
  112. package/dist/dom-external/mutation-observer/index.js.map +1 -0
  113. package/dist/dom-external/node.d.ts +12 -0
  114. package/dist/dom-external/node.js +75 -0
  115. package/dist/dom-external/node.js.map +1 -0
  116. package/dist/dsl/common.d.ts +16 -0
  117. package/dist/dsl/common.js +337 -0
  118. package/dist/dsl/common.js.map +1 -0
  119. package/dist/emitter/emitter.d.ts +4 -0
  120. package/dist/emitter/emitter.js +7 -0
  121. package/dist/emitter/emitter.js.map +1 -0
  122. package/dist/env.d.ts +7 -0
  123. package/dist/env.js +9 -0
  124. package/dist/env.js.map +1 -0
  125. package/dist/hydrate.d.ts +11 -0
  126. package/dist/hydrate.js +91 -0
  127. package/dist/hydrate.js.map +1 -0
  128. package/dist/index-26658829.d.ts +23 -0
  129. package/dist/{runtime.cjs.d.ts → index.cjs.d.ts} +108 -102
  130. package/dist/{runtime.h5.js → index.cjs.js} +4301 -2495
  131. package/dist/index.cjs.js.map +1 -0
  132. package/dist/index.d.ts +34 -0
  133. package/dist/index.js +35 -0
  134. package/dist/index.js.map +1 -0
  135. package/dist/instance-4c64b022.d.ts +85 -0
  136. package/dist/next-tick.d.ts +3 -0
  137. package/dist/next-tick.js +47 -0
  138. package/dist/next-tick.js.map +1 -0
  139. package/dist/node_types-9ac5b4dd.d.ts +11 -0
  140. package/dist/options-4c64b022.d.ts +17 -0
  141. package/dist/options.d.ts +3 -0
  142. package/dist/options.js +7 -0
  143. package/dist/options.js.map +1 -0
  144. package/dist/perf.d.ts +9 -0
  145. package/dist/perf.js +49 -0
  146. package/dist/perf.js.map +1 -0
  147. package/dist/polyfill/array.d.ts +3 -0
  148. package/dist/polyfill/array.js +56 -0
  149. package/dist/polyfill/array.js.map +1 -0
  150. package/dist/polyfill/index.d.ts +2 -0
  151. package/dist/polyfill/index.js +34 -0
  152. package/dist/polyfill/index.js.map +1 -0
  153. package/dist/polyfill/intersection-observer.d.ts +2 -0
  154. package/dist/polyfill/intersection-observer.js +600 -0
  155. package/dist/polyfill/intersection-observer.js.map +1 -0
  156. package/dist/polyfill/object.d.ts +4 -0
  157. package/dist/polyfill/object.js +102 -0
  158. package/dist/polyfill/object.js.map +1 -0
  159. package/dist/record-32b054d8.d.ts +25 -0
  160. package/dist/runtime.esm.d.ts +108 -102
  161. package/dist/runtime.esm.js +4126 -3320
  162. package/dist/runtime.esm.js.map +1 -1
  163. package/dist/utils/cache.d.ts +13 -0
  164. package/dist/utils/cache.js +27 -0
  165. package/dist/utils/cache.js.map +1 -0
  166. package/dist/utils/index.d.ts +26 -0
  167. package/dist/utils/index.js +99 -0
  168. package/dist/utils/index.js.map +1 -0
  169. package/dist/utils/lodash.d.ts +3 -0
  170. package/dist/utils/lodash.js +32 -0
  171. package/dist/utils/lodash.js.map +1 -0
  172. package/dist/utils/router.d.ts +8 -0
  173. package/dist/utils/router.js +24 -0
  174. package/dist/utils/router.js.map +1 -0
  175. package/package.json +23 -26
  176. package/dist/runtime.cjs.js +0 -4628
  177. package/dist/runtime.h5.d.ts +0 -800
@@ -0,0 +1,152 @@
1
+ import { EMPTY_OBJ, hooks, isUndefined } from '@tarojs/shared';
2
+ import { CURRENT_TARGET, TARGET, TYPE, TIME_STAMP, CONFIRM, INPUT, KEY_CODE, TOUCHMOVE, EVENT_CALLBACK_RESULT } from '../constants/index.js';
3
+ import env from '../env.js';
4
+ import { isParentBinded } from '../utils/index.js';
5
+
6
+ // Taro 事件对象。以 Web 标准的事件对象为基础,加入小程序事件对象中携带的部分信息,并模拟实现事件冒泡。
7
+ class TaroEvent {
8
+ constructor(type, opts, event) {
9
+ this._stop = false;
10
+ this._end = false;
11
+ this.defaultPrevented = false;
12
+ // Mouse Event botton property, it's used in 3rd lib, like react-router. default 0 in general
13
+ this.button = 0;
14
+ // timestamp can either be hi-res ( relative to page load) or low-res (relative to UNIX epoch)
15
+ // here use hi-res timestamp
16
+ this.timeStamp = Date.now();
17
+ this.type = type.toLowerCase();
18
+ this.mpEvent = event;
19
+ this.bubbles = Boolean(opts && opts.bubbles);
20
+ this.cancelable = Boolean(opts && opts.cancelable);
21
+ }
22
+ stopPropagation() {
23
+ this._stop = true;
24
+ }
25
+ stopImmediatePropagation() {
26
+ this._end = this._stop = true;
27
+ }
28
+ preventDefault() {
29
+ this.defaultPrevented = true;
30
+ }
31
+ get target() {
32
+ var _a, _b, _c, _d, _e;
33
+ const cacheTarget = this.cacheTarget;
34
+ if (!cacheTarget) {
35
+ const target = Object.create(((_a = this.mpEvent) === null || _a === void 0 ? void 0 : _a.target) || null);
36
+ const currentEle = env.document.getElementById(((_b = target.dataset) === null || _b === void 0 ? void 0 : _b.sid) || target.id || null);
37
+ // Note:优先判断冒泡场景alipay的targetDataset的sid, 不然冒泡场景target属性吐出不对,其余拿取当前绑定id
38
+ const element = env.document.getElementById(((_c = target.targetDataset) === null || _c === void 0 ? void 0 : _c.sid) || ((_d = target.dataset) === null || _d === void 0 ? void 0 : _d.sid) || target.id || null);
39
+ target.dataset = Object.assign(Object.assign({}, (currentEle !== null ? currentEle.dataset : EMPTY_OBJ)), (element !== null ? element.dataset : EMPTY_OBJ));
40
+ for (const key in (_e = this.mpEvent) === null || _e === void 0 ? void 0 : _e.detail) {
41
+ target[key] = this.mpEvent.detail[key];
42
+ }
43
+ this.cacheTarget = target;
44
+ return target;
45
+ }
46
+ else {
47
+ return cacheTarget;
48
+ }
49
+ }
50
+ get currentTarget() {
51
+ var _a, _b, _c, _d, _e, _f, _g, _h;
52
+ const cacheCurrentTarget = this.cacheCurrentTarget;
53
+ if (!cacheCurrentTarget) {
54
+ const doc = env.document;
55
+ const currentTarget = Object.create(((_a = this.mpEvent) === null || _a === void 0 ? void 0 : _a.currentTarget) || null);
56
+ const element = doc.getElementById(((_b = currentTarget.dataset) === null || _b === void 0 ? void 0 : _b.sid) || currentTarget.id || null);
57
+ const targetElement = doc.getElementById(((_e = (_d = (_c = this.mpEvent) === null || _c === void 0 ? void 0 : _c.target) === null || _d === void 0 ? void 0 : _d.dataset) === null || _e === void 0 ? void 0 : _e.sid) || ((_g = (_f = this.mpEvent) === null || _f === void 0 ? void 0 : _f.target) === null || _g === void 0 ? void 0 : _g.id) || null);
58
+ if (element === null || (element && element === targetElement)) {
59
+ this.cacheCurrentTarget = this.target;
60
+ return this.target;
61
+ }
62
+ currentTarget.dataset = element.dataset;
63
+ for (const key in (_h = this.mpEvent) === null || _h === void 0 ? void 0 : _h.detail) {
64
+ currentTarget[key] = this.mpEvent.detail[key];
65
+ }
66
+ this.cacheCurrentTarget = currentTarget;
67
+ return currentTarget;
68
+ }
69
+ else {
70
+ return cacheCurrentTarget;
71
+ }
72
+ }
73
+ }
74
+ function createEvent(event, node) {
75
+ if (typeof event === 'string') {
76
+ // For Vue3 using document.createEvent
77
+ return new TaroEvent(event, { bubbles: true, cancelable: true });
78
+ }
79
+ const domEv = new TaroEvent(event.type, { bubbles: true, cancelable: true }, event);
80
+ for (const key in event) {
81
+ if (key === CURRENT_TARGET || key === TARGET || key === TYPE || key === TIME_STAMP) {
82
+ continue;
83
+ }
84
+ else {
85
+ domEv[key] = event[key];
86
+ }
87
+ }
88
+ if (domEv.type === CONFIRM && (node === null || node === void 0 ? void 0 : node.nodeName) === INPUT) {
89
+ // eslint-disable-next-line dot-notation
90
+ domEv[KEY_CODE] = 13;
91
+ }
92
+ return domEv;
93
+ }
94
+ const eventsBatch = {};
95
+ function getEventCBResult(event) {
96
+ const result = event[EVENT_CALLBACK_RESULT];
97
+ if (!isUndefined(result)) {
98
+ delete event[EVENT_CALLBACK_RESULT];
99
+ }
100
+ return result;
101
+ }
102
+ // 小程序的事件代理回调函数
103
+ function eventHandler(event) {
104
+ var _a, _b;
105
+ // Note: ohos 上事件没有设置 type、detail 类型 setter 方法,且部分事件(例如 load 等)缺失 target 导致事件错误
106
+ event.type === undefined && Object.defineProperty(event, 'type', {
107
+ value: event._type // ohos only
108
+ });
109
+ event.detail === undefined && Object.defineProperty(event, 'detail', {
110
+ value: event._detail || Object.assign({}, event) // ohos only
111
+ });
112
+ event.currentTarget = event.currentTarget || event.target || Object.assign({}, event);
113
+ hooks.call('modifyMpEventImpl', event);
114
+ const currentTarget = event.currentTarget;
115
+ const id = ((_a = currentTarget.dataset) === null || _a === void 0 ? void 0 : _a.sid /** sid */) || currentTarget.id /** uid */ || ((_b = event.detail) === null || _b === void 0 ? void 0 : _b.id) || '';
116
+ const node = env.document.getElementById(id);
117
+ if (node) {
118
+ const dispatch = () => {
119
+ const e = createEvent(event, node);
120
+ hooks.call('modifyTaroEvent', e, node);
121
+ hooks.call('dispatchTaroEvent', e, node);
122
+ hooks.call('dispatchTaroEventFinish', e, node);
123
+ };
124
+ if (hooks.isExist('batchedEventUpdates')) {
125
+ const type = event.type;
126
+ if (!hooks.call('isBubbleEvents', type) ||
127
+ !isParentBinded(node, type) ||
128
+ (type === TOUCHMOVE && !!node.props.catchMove)) {
129
+ // 最上层组件统一 batchUpdate
130
+ hooks.call('batchedEventUpdates', () => {
131
+ if (eventsBatch[type]) {
132
+ eventsBatch[type].forEach(fn => fn());
133
+ delete eventsBatch[type];
134
+ }
135
+ dispatch();
136
+ });
137
+ return getEventCBResult(event);
138
+ }
139
+ else {
140
+ // 如果上层组件也有绑定同类型的组件,委托给上层组件调用事件回调
141
+ (eventsBatch[type] || (eventsBatch[type] = [])).push(dispatch);
142
+ }
143
+ }
144
+ else {
145
+ dispatch();
146
+ return getEventCBResult(event);
147
+ }
148
+ }
149
+ }
150
+
151
+ export { TaroEvent, createEvent, eventHandler };
152
+ //# sourceMappingURL=event.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"event.js","sources":["../../src/dom/event.ts"],"sourcesContent":["import { EMPTY_OBJ, hooks, isUndefined } from '@tarojs/shared'\n\nimport {\n CONFIRM,\n CURRENT_TARGET,\n EVENT_CALLBACK_RESULT,\n INPUT,\n KEY_CODE,\n TARGET,\n TIME_STAMP,\n TOUCHMOVE,\n TYPE\n} from '../constants'\nimport env from '../env'\nimport { isParentBinded } from '../utils'\n\nimport type { EventOptions, MpEvent } from '../interface'\nimport type { TaroElement } from './element'\n\n// Taro 事件对象。以 Web 标准的事件对象为基础,加入小程序事件对象中携带的部分信息,并模拟实现事件冒泡。\nexport class TaroEvent {\n private cacheTarget\n private cacheCurrentTarget\n\n public type: string\n\n public bubbles: boolean\n\n public cancelable: boolean\n\n public _stop = false\n\n public _end = false\n\n public defaultPrevented = false\n\n // Mouse Event botton property, it's used in 3rd lib, like react-router. default 0 in general\n public button = 0\n\n // timestamp can either be hi-res ( relative to page load) or low-res (relative to UNIX epoch)\n // here use hi-res timestamp\n public timeStamp = Date.now()\n\n public mpEvent: MpEvent | undefined\n\n public constructor (type: string, opts: EventOptions, event?: MpEvent) {\n this.type = type.toLowerCase()\n this.mpEvent = event\n this.bubbles = Boolean(opts && opts.bubbles)\n this.cancelable = Boolean(opts && opts.cancelable)\n }\n\n public stopPropagation () {\n this._stop = true\n }\n\n public stopImmediatePropagation () {\n this._end = this._stop = true\n }\n\n public preventDefault () {\n this.defaultPrevented = true\n }\n\n get target () {\n const cacheTarget = this.cacheTarget\n if (!cacheTarget) {\n const target = Object.create(this.mpEvent?.target || null)\n const currentEle = env.document.getElementById(target.dataset?.sid || target.id || null)\n // Note:优先判断冒泡场景alipay的targetDataset的sid, 不然冒泡场景target属性吐出不对,其余拿取当前绑定id\n const element = env.document.getElementById(target.targetDataset?.sid || target.dataset?.sid || target.id || null)\n\n target.dataset = {\n ...(currentEle !== null ? currentEle.dataset : EMPTY_OBJ),\n ...(element !== null ? element.dataset : EMPTY_OBJ)\n }\n\n for (const key in this.mpEvent?.detail) {\n target[key] = this.mpEvent!.detail[key]\n }\n\n this.cacheTarget = target\n\n return target\n } else {\n return cacheTarget\n }\n }\n\n get currentTarget () {\n const cacheCurrentTarget = this.cacheCurrentTarget\n if (!cacheCurrentTarget) {\n const doc = env.document\n\n const currentTarget = Object.create(this.mpEvent?.currentTarget || null)\n\n const element = doc.getElementById(currentTarget.dataset?.sid || currentTarget.id || null)\n const targetElement = doc.getElementById(this.mpEvent?.target?.dataset?.sid as string || this.mpEvent?.target?.id as string || null)\n\n if (element === null || (element && element === targetElement)) {\n this.cacheCurrentTarget = this.target\n return this.target\n }\n\n currentTarget.dataset = element.dataset\n\n for (const key in this.mpEvent?.detail) {\n currentTarget[key] = this.mpEvent!.detail[key]\n }\n\n this.cacheCurrentTarget = currentTarget\n\n return currentTarget\n } else {\n return cacheCurrentTarget\n }\n }\n}\n\nexport function createEvent (event: MpEvent | string, node?: TaroElement) {\n if (typeof event === 'string') {\n // For Vue3 using document.createEvent\n return new TaroEvent(event, { bubbles: true, cancelable: true })\n }\n\n const domEv = new TaroEvent(event.type, { bubbles: true, cancelable: true }, event)\n\n for (const key in event) {\n if (key === CURRENT_TARGET || key === TARGET || key === TYPE || key === TIME_STAMP) {\n continue\n } else {\n domEv[key] = event[key]\n }\n }\n\n if (domEv.type === CONFIRM && node?.nodeName === INPUT) {\n // eslint-disable-next-line dot-notation\n domEv[KEY_CODE] = 13\n }\n\n return domEv\n}\n\nconst eventsBatch = {}\n\nfunction getEventCBResult (event: MpEvent) {\n const result = event[EVENT_CALLBACK_RESULT]\n if (!isUndefined(result)) {\n delete event[EVENT_CALLBACK_RESULT]\n }\n return result\n}\n\n// 小程序的事件代理回调函数\nexport function eventHandler (event: MpEvent) {\n // Note: ohos 上事件没有设置 type、detail 类型 setter 方法,且部分事件(例如 load 等)缺失 target 导致事件错误\n event.type === undefined && Object.defineProperty(event, 'type', {\n value: (event as any)._type // ohos only\n })\n event.detail === undefined && Object.defineProperty(event, 'detail', {\n value: (event as any)._detail || { ...event } // ohos only\n })\n event.currentTarget = event.currentTarget || event.target || { ...event }\n hooks.call('modifyMpEventImpl', event)\n\n const currentTarget = event.currentTarget\n const id = currentTarget.dataset?.sid as string /** sid */ || currentTarget.id /** uid */ || event.detail?.id as string || ''\n\n const node = env.document.getElementById(id)\n if (node) {\n const dispatch = () => {\n const e = createEvent(event, node)\n\n hooks.call('modifyTaroEvent', e, node)\n hooks.call('dispatchTaroEvent', e, node)\n hooks.call('dispatchTaroEventFinish', e, node)\n }\n if (hooks.isExist('batchedEventUpdates')) {\n const type = event.type\n\n if (\n !hooks.call('isBubbleEvents', type) ||\n !isParentBinded(node, type) ||\n (type === TOUCHMOVE && !!node.props.catchMove)\n ) {\n // 最上层组件统一 batchUpdate\n hooks.call('batchedEventUpdates', () => {\n if (eventsBatch[type]) {\n eventsBatch[type].forEach(fn => fn())\n delete eventsBatch[type]\n }\n dispatch()\n })\n return getEventCBResult(event)\n } else {\n // 如果上层组件也有绑定同类型的组件,委托给上层组件调用事件回调\n (eventsBatch[type] ||= []).push(dispatch)\n }\n } else {\n dispatch()\n return getEventCBResult(event)\n }\n }\n}\n"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ import { TaroElement } from "./element.js";
2
+ import { TaroEvent } from "./event.js";
3
+ declare class FormElement extends TaroElement {
4
+ get type(): string;
5
+ set type(val: string);
6
+ get value(): string | boolean | number | any[];
7
+ set value(val: string | boolean | number | any[]);
8
+ dispatchEvent(event: TaroEvent): boolean;
9
+ }
10
+ export { FormElement };
@@ -0,0 +1,38 @@
1
+ import { TYPE, VALUE, CHANGE, INPUT } from '../constants/index.js';
2
+ import { TaroElement } from './element.js';
3
+
4
+ class FormElement extends TaroElement {
5
+ get type() {
6
+ var _a;
7
+ return (_a = this.props[TYPE]) !== null && _a !== void 0 ? _a : '';
8
+ }
9
+ set type(val) {
10
+ this.setAttribute(TYPE, val);
11
+ }
12
+ get value() {
13
+ // eslint-disable-next-line dot-notation
14
+ const val = this.props[VALUE];
15
+ return val == null ? '' : val;
16
+ }
17
+ set value(val) {
18
+ this.setAttribute(VALUE, val);
19
+ }
20
+ dispatchEvent(event) {
21
+ if (event.mpEvent) {
22
+ const val = event.mpEvent.detail.value;
23
+ if (event.type === CHANGE) {
24
+ this.props.value = val;
25
+ }
26
+ else if (event.type === INPUT) {
27
+ // Web 规范中表单组件的 value 应该跟着输入改变
28
+ // 只是改 this.props.value 的话不会进行 setData,因此这里修改 this.value。
29
+ // 只测试了 React、Vue3 input 组件的 onInput 事件,onChange 事件不确定有没有副作用,所以暂不修改。
30
+ this.value = val;
31
+ }
32
+ }
33
+ return super.dispatchEvent(event);
34
+ }
35
+ }
36
+
37
+ export { FormElement };
38
+ //# sourceMappingURL=form.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"form.js","sources":["../../src/dom/form.ts"],"sourcesContent":["import {\n CHANGE,\n INPUT,\n TYPE,\n VALUE\n} from '../constants'\nimport { TaroElement } from './element'\n\nimport type { TaroEvent } from './event'\n\nexport class FormElement extends TaroElement {\n public get type () {\n return this.props[TYPE] ?? ''\n }\n\n public set type (val: string) {\n this.setAttribute(TYPE, val)\n }\n\n public get value () {\n // eslint-disable-next-line dot-notation\n const val = this.props[VALUE]\n return val == null ? '' : val\n }\n\n public set value (val: string | boolean | number | any[]) {\n this.setAttribute(VALUE, val)\n }\n\n public dispatchEvent (event: TaroEvent) {\n if (event.mpEvent) {\n const val = event.mpEvent.detail.value\n if (event.type === CHANGE) {\n this.props.value = val as string\n } else if (event.type === INPUT) {\n // Web 规范中表单组件的 value 应该跟着输入改变\n // 只是改 this.props.value 的话不会进行 setData,因此这里修改 this.value。\n // 只测试了 React、Vue3 input 组件的 onInput 事件,onChange 事件不确定有没有副作用,所以暂不修改。\n this.value = val as string\n }\n }\n\n return super.dispatchEvent(event)\n }\n}\n"],"names":[],"mappings":";;;AAUM,MAAO,WAAY,SAAQ,WAAW,CAAA;AAC1C,IAAA,IAAW,IAAI,GAAA;;QACb,OAAO,CAAA,EAAA,GAAA,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,MAAI,IAAA,IAAA,EAAA,KAAA,KAAA,CAAA,GAAA,EAAA,GAAA,EAAE,CAAA;KAC9B;IAED,IAAW,IAAI,CAAE,GAAW,EAAA;AAC1B,QAAA,IAAI,CAAC,YAAY,CAAC,IAAI,EAAE,GAAG,CAAC,CAAA;KAC7B;AAED,IAAA,IAAW,KAAK,GAAA;;QAEd,MAAM,GAAG,GAAG,IAAI,CAAC,KAAK,CAAC,KAAK,CAAC,CAAA;QAC7B,OAAO,GAAG,IAAI,IAAI,GAAG,EAAE,GAAG,GAAG,CAAA;KAC9B;IAED,IAAW,KAAK,CAAE,GAAsC,EAAA;AACtD,QAAA,IAAI,CAAC,YAAY,CAAC,KAAK,EAAE,GAAG,CAAC,CAAA;KAC9B;AAEM,IAAA,aAAa,CAAE,KAAgB,EAAA;AACpC,QAAA,IAAI,KAAK,CAAC,OAAO,EAAE;YACjB,MAAM,GAAG,GAAG,KAAK,CAAC,OAAO,CAAC,MAAM,CAAC,KAAK,CAAA;AACtC,YAAA,IAAI,KAAK,CAAC,IAAI,KAAK,MAAM,EAAE;AACzB,gBAAA,IAAI,CAAC,KAAK,CAAC,KAAK,GAAG,GAAa,CAAA;aACjC;AAAM,iBAAA,IAAI,KAAK,CAAC,IAAI,KAAK,KAAK,EAAE;;;;AAI/B,gBAAA,IAAI,CAAC,KAAK,GAAG,GAAa,CAAA;aAC3B;SACF;AAED,QAAA,OAAO,KAAK,CAAC,aAAa,CAAC,KAAK,CAAC,CAAA;KAClC;AACF;;;;"}
@@ -0,0 +1,107 @@
1
+ import { TaroEventTarget } from "./event-target.js";
2
+ import { NodeType } from "../node_types-9ac5b4dd.js";
3
+ import { TFunc, UpdatePayload } from "../index-26658829.js";
4
+ import { TaroDocument } from "./document.js";
5
+ import { TaroElement } from "./element.js";
6
+ import { TaroRootElement } from "./root.js";
7
+ interface RemoveChildOptions {
8
+ cleanRef?: boolean;
9
+ doUpdate?: boolean;
10
+ }
11
+ declare class TaroNode extends TaroEventTarget {
12
+ uid: string;
13
+ sid: string;
14
+ nodeType: NodeType;
15
+ nodeName: string;
16
+ parentNode: TaroNode | null;
17
+ childNodes: TaroNode[];
18
+ constructor();
19
+ private hydrate;
20
+ private updateChildNodes;
21
+ private updateSingleChild;
22
+ get _root(): TaroRootElement | null;
23
+ protected findIndex(refChild: TaroNode): number;
24
+ get _path(): string;
25
+ get nextSibling(): TaroNode | null;
26
+ get previousSibling(): TaroNode | null;
27
+ get parentElement(): TaroElement | null;
28
+ get firstChild(): TaroNode | null;
29
+ get lastChild(): TaroNode | null;
30
+ /**
31
+ * @textContent 目前只能置空子元素
32
+ * @TODO 等待完整 innerHTML 实现
33
+ */
34
+ set textContent(text: string);
35
+ /**
36
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore
37
+ * @scenario
38
+ * [A,B,C]
39
+ * 1. insert D before C, D has no parent
40
+ * 2. insert D before C, D has the same parent of C
41
+ * 3. insert D before C, D has the different parent of C
42
+ */
43
+ /**
44
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore
45
+ * @scenario
46
+ * [A,B,C]
47
+ * 1. insert D before C, D has no parent
48
+ * 2. insert D before C, D has the same parent of C
49
+ * 3. insert D before C, D has the different parent of C
50
+ */
51
+ insertBefore<T extends TaroNode>(newChild: T, refChild?: TaroNode | null, isReplace?: boolean): T;
52
+ /**
53
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/appendChild
54
+ * @scenario
55
+ * [A,B,C]
56
+ * 1. append C, C has no parent
57
+ * 2. append C, C has the same parent of B
58
+ * 3. append C, C has the different parent of B
59
+ */
60
+ /**
61
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/appendChild
62
+ * @scenario
63
+ * [A,B,C]
64
+ * 1. append C, C has no parent
65
+ * 2. append C, C has the same parent of B
66
+ * 3. append C, C has the different parent of B
67
+ */
68
+ appendChild(newChild: TaroNode): TaroNode;
69
+ /**
70
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/replaceChild
71
+ * @scenario
72
+ * [A,B,C]
73
+ * 1. replace B with C, C has no parent
74
+ * 2. replace B with C, C has no parent, C has the same parent of B
75
+ * 3. replace B with C, C has no parent, C has the different parent of B
76
+ */
77
+ /**
78
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/replaceChild
79
+ * @scenario
80
+ * [A,B,C]
81
+ * 1. replace B with C, C has no parent
82
+ * 2. replace B with C, C has no parent, C has the same parent of B
83
+ * 3. replace B with C, C has no parent, C has the different parent of B
84
+ */
85
+ replaceChild(newChild: TaroNode, oldChild: TaroNode): TaroNode | undefined;
86
+ /**
87
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/removeChild
88
+ * @scenario
89
+ * [A,B,C]
90
+ * 1. remove A or B
91
+ * 2. remove C
92
+ */
93
+ /**
94
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/removeChild
95
+ * @scenario
96
+ * [A,B,C]
97
+ * 1. remove A or B
98
+ * 2. remove C
99
+ */
100
+ removeChild<T extends TaroNode>(child: T, options?: RemoveChildOptions): T;
101
+ remove(options?: RemoveChildOptions): void;
102
+ hasChildNodes(): boolean;
103
+ enqueueUpdate(payload: UpdatePayload): void;
104
+ get ownerDocument(): TaroDocument;
105
+ static extend(methodName: string, options: TFunc | Record<string, any>): void;
106
+ }
107
+ export { TaroNode };
@@ -0,0 +1,292 @@
1
+ import { ensure, hooks } from '@tarojs/shared';
2
+ import { DOCUMENT_FRAGMENT } from '../constants/index.js';
3
+ import { MutationObserver } from '../dom-external/mutation-observer/index.js';
4
+ import env from '../env.js';
5
+ import { hydrate } from '../hydrate.js';
6
+ import { incrementId, isComment, extend } from '../utils/index.js';
7
+ import { eventSource } from './event-source.js';
8
+ import { TaroEventTarget } from './event-target.js';
9
+
10
+ const CHILDNODES = "cn" /* Shortcuts.Childnodes */;
11
+ const nodeId = incrementId();
12
+ class TaroNode extends TaroEventTarget {
13
+ constructor() {
14
+ super();
15
+ this.parentNode = null;
16
+ this.childNodes = [];
17
+ this.hydrate = (node) => () => hydrate(node);
18
+ this.uid = '_' + nodeId(); // dom 节点 id,开发者可修改
19
+ this.sid = this.uid; // dom 节点全局唯一 id,不可被修改
20
+ eventSource.set(this.sid, this);
21
+ }
22
+ updateChildNodes(isClean) {
23
+ const cleanChildNodes = () => [];
24
+ const rerenderChildNodes = () => {
25
+ const childNodes = this.childNodes.filter(node => !isComment(node));
26
+ return childNodes.map(hydrate);
27
+ };
28
+ this.enqueueUpdate({
29
+ path: `${this._path}.${CHILDNODES}`,
30
+ value: isClean ? cleanChildNodes : rerenderChildNodes
31
+ });
32
+ }
33
+ updateSingleChild(index) {
34
+ this.childNodes.forEach((child, childIndex) => {
35
+ if (isComment(child))
36
+ return;
37
+ if (index && childIndex < index)
38
+ return;
39
+ this.enqueueUpdate({
40
+ path: child._path,
41
+ value: this.hydrate(child)
42
+ });
43
+ });
44
+ }
45
+ get _root() {
46
+ var _a;
47
+ return ((_a = this.parentNode) === null || _a === void 0 ? void 0 : _a._root) || null;
48
+ }
49
+ findIndex(refChild) {
50
+ const index = this.childNodes.indexOf(refChild);
51
+ ensure(index !== -1, 'The node to be replaced is not a child of this node.');
52
+ return index;
53
+ }
54
+ get _path() {
55
+ const parentNode = this.parentNode;
56
+ if (parentNode) {
57
+ // 计算路径时,先过滤掉 comment 节点
58
+ const list = parentNode.childNodes.filter(node => !isComment(node));
59
+ const indexOfNode = list.indexOf(this);
60
+ const index = hooks.call('getPathIndex', indexOfNode);
61
+ return `${parentNode._path}.${CHILDNODES}.${index}`;
62
+ }
63
+ return '';
64
+ }
65
+ get nextSibling() {
66
+ const parentNode = this.parentNode;
67
+ return (parentNode === null || parentNode === void 0 ? void 0 : parentNode.childNodes[parentNode.findIndex(this) + 1]) || null;
68
+ }
69
+ get previousSibling() {
70
+ const parentNode = this.parentNode;
71
+ return (parentNode === null || parentNode === void 0 ? void 0 : parentNode.childNodes[parentNode.findIndex(this) - 1]) || null;
72
+ }
73
+ get parentElement() {
74
+ const parentNode = this.parentNode;
75
+ if ((parentNode === null || parentNode === void 0 ? void 0 : parentNode.nodeType) === 1 /* NodeType.ELEMENT_NODE */) {
76
+ return parentNode;
77
+ }
78
+ return null;
79
+ }
80
+ get firstChild() {
81
+ return this.childNodes[0] || null;
82
+ }
83
+ get lastChild() {
84
+ const childNodes = this.childNodes;
85
+ return childNodes[childNodes.length - 1] || null;
86
+ }
87
+ /**
88
+ * @textContent 目前只能置空子元素
89
+ * @TODO 等待完整 innerHTML 实现
90
+ */
91
+ // eslint-disable-next-line accessor-pairs
92
+ set textContent(text) {
93
+ const removedNodes = this.childNodes.slice();
94
+ const addedNodes = [];
95
+ // Handle old children' data structure & ref
96
+ while (this.firstChild) {
97
+ this.removeChild(this.firstChild, { doUpdate: false });
98
+ }
99
+ if (text === '') {
100
+ this.updateChildNodes(true);
101
+ }
102
+ else {
103
+ const newText = env.document.createTextNode(text);
104
+ addedNodes.push(newText);
105
+ this.appendChild(newText);
106
+ this.updateChildNodes();
107
+ }
108
+ // @Todo: appendChild 会多触发一次
109
+ MutationObserver.record({
110
+ type: "childList" /* MutationRecordType.CHILD_LIST */,
111
+ target: this,
112
+ removedNodes,
113
+ addedNodes
114
+ });
115
+ }
116
+ /**
117
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/insertBefore
118
+ * @scenario
119
+ * [A,B,C]
120
+ * 1. insert D before C, D has no parent
121
+ * 2. insert D before C, D has the same parent of C
122
+ * 3. insert D before C, D has the different parent of C
123
+ */
124
+ insertBefore(newChild, refChild, isReplace) {
125
+ if (newChild.nodeName === DOCUMENT_FRAGMENT) {
126
+ newChild.childNodes.reduceRight((previousValue, currentValue) => {
127
+ this.insertBefore(currentValue, previousValue);
128
+ return currentValue;
129
+ }, refChild);
130
+ return newChild;
131
+ }
132
+ // Parent release newChild
133
+ // - cleanRef: false (No need to clean eventSource, because newChild is about to be inserted)
134
+ // - update: true (Need to update parent.childNodes, because parent.childNodes is reordered)
135
+ newChild.remove({ cleanRef: false });
136
+ let index = 0;
137
+ // Data structure
138
+ newChild.parentNode = this;
139
+ if (refChild) {
140
+ // insertBefore & replaceChild
141
+ index = this.findIndex(refChild);
142
+ this.childNodes.splice(index, 0, newChild);
143
+ }
144
+ else {
145
+ // appendChild
146
+ this.childNodes.push(newChild);
147
+ }
148
+ const childNodesLength = this.childNodes.length;
149
+ // Serialization
150
+ if (this._root) {
151
+ if (!refChild) {
152
+ // appendChild
153
+ const isOnlyChild = childNodesLength === 1;
154
+ if (isOnlyChild) {
155
+ this.updateChildNodes();
156
+ }
157
+ else {
158
+ this.enqueueUpdate({
159
+ path: newChild._path,
160
+ value: this.hydrate(newChild)
161
+ });
162
+ }
163
+ }
164
+ else if (isReplace) {
165
+ // replaceChild
166
+ this.enqueueUpdate({
167
+ path: newChild._path,
168
+ value: this.hydrate(newChild)
169
+ });
170
+ }
171
+ else {
172
+ // insertBefore 有两种更新模式
173
+ // 比方说有 A B C 三个节点,现在要在 C 前插入 D
174
+ // 1. 插入 D,然后更新整个父节点的 childNodes 数组
175
+ // setData({ cn: [A, B, D, C] })
176
+ // 2. 插入 D,然后更新 D 以及 D 之后每个节点的数据
177
+ // setData ({
178
+ // cn.[2]: D,
179
+ // cn.[3]: C,
180
+ // })
181
+ // 由于微信解析 ’cn.[2]‘ 这些路径的时候也需要消耗时间,
182
+ // 所以根据 insertBefore 插入的位置来做不同的处理
183
+ const mark = childNodesLength * 2 / 3;
184
+ if (mark > index) {
185
+ // 如果 insertBefore 的位置在 childNodes 的 2/3 前,则为了避免解析路径消耗过多的时间,采用第一种方式
186
+ this.updateChildNodes();
187
+ }
188
+ else {
189
+ // 如果 insertBefore 的位置在 childNodes 的 2/3 之后,则采用第二种方式,避免 childNodes 的全量更新
190
+ this.updateSingleChild(index);
191
+ }
192
+ }
193
+ }
194
+ MutationObserver.record({
195
+ type: "childList" /* MutationRecordType.CHILD_LIST */,
196
+ target: this,
197
+ addedNodes: [newChild],
198
+ removedNodes: isReplace
199
+ ? [refChild] /** replaceChild */
200
+ : [],
201
+ nextSibling: isReplace
202
+ ? refChild.nextSibling /** replaceChild */
203
+ : (refChild || null), /** insertBefore & appendChild */
204
+ previousSibling: newChild.previousSibling
205
+ });
206
+ return newChild;
207
+ }
208
+ /**
209
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/appendChild
210
+ * @scenario
211
+ * [A,B,C]
212
+ * 1. append C, C has no parent
213
+ * 2. append C, C has the same parent of B
214
+ * 3. append C, C has the different parent of B
215
+ */
216
+ appendChild(newChild) {
217
+ return this.insertBefore(newChild);
218
+ }
219
+ /**
220
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/replaceChild
221
+ * @scenario
222
+ * [A,B,C]
223
+ * 1. replace B with C, C has no parent
224
+ * 2. replace B with C, C has no parent, C has the same parent of B
225
+ * 3. replace B with C, C has no parent, C has the different parent of B
226
+ */
227
+ replaceChild(newChild, oldChild) {
228
+ if (oldChild.parentNode !== this)
229
+ return;
230
+ // Insert the newChild
231
+ this.insertBefore(newChild, oldChild, true);
232
+ // Destroy the oldChild
233
+ // - cleanRef: true (Need to clean eventSource, because the oldChild was detached from the DOM tree)
234
+ // - update: false (No need to update parent.childNodes, because replace will not cause the parent.childNodes being reordered)
235
+ oldChild.remove({ doUpdate: false });
236
+ return oldChild;
237
+ }
238
+ /**
239
+ * @doc https://developer.mozilla.org/zh-CN/docs/Web/API/Node/removeChild
240
+ * @scenario
241
+ * [A,B,C]
242
+ * 1. remove A or B
243
+ * 2. remove C
244
+ */
245
+ removeChild(child, options = {}) {
246
+ const { cleanRef, doUpdate } = options;
247
+ if (cleanRef !== false && doUpdate !== false) {
248
+ // appendChild/replaceChild/insertBefore 不应该触发
249
+ // @Todo: 但其实如果 newChild 的父节点是另一颗子树的节点,应该是要触发的
250
+ MutationObserver.record({
251
+ type: "childList" /* MutationRecordType.CHILD_LIST */,
252
+ target: this,
253
+ removedNodes: [child],
254
+ nextSibling: child.nextSibling,
255
+ previousSibling: child.previousSibling
256
+ });
257
+ }
258
+ // Data Structure
259
+ const index = this.findIndex(child);
260
+ this.childNodes.splice(index, 1);
261
+ child.parentNode = null;
262
+ // Set eventSource
263
+ if (cleanRef !== false) {
264
+ eventSource.removeNodeTree(child);
265
+ }
266
+ // Serialization
267
+ if (this._root && doUpdate !== false) {
268
+ this.updateChildNodes();
269
+ }
270
+ return child;
271
+ }
272
+ remove(options) {
273
+ var _a;
274
+ (_a = this.parentNode) === null || _a === void 0 ? void 0 : _a.removeChild(this, options);
275
+ }
276
+ hasChildNodes() {
277
+ return this.childNodes.length > 0;
278
+ }
279
+ enqueueUpdate(payload) {
280
+ var _a;
281
+ (_a = this._root) === null || _a === void 0 ? void 0 : _a.enqueueUpdate(payload);
282
+ }
283
+ get ownerDocument() {
284
+ return env.document;
285
+ }
286
+ static extend(methodName, options) {
287
+ extend(TaroNode, methodName, options);
288
+ }
289
+ }
290
+
291
+ export { TaroNode };
292
+ //# sourceMappingURL=node.js.map