@tarojs/shared 3.5.0-canary.0 → 3.5.0-theta.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/dist/template.js CHANGED
@@ -2,444 +2,720 @@
2
2
 
3
3
  Object.defineProperty(exports, '__esModule', { value: true });
4
4
 
5
- const DEFAULT_EMPTY_ARRAY = '[]';
6
- const NO_DEFAULT_VALUE = '';
7
- const DEFAULT_TRUE = 'true';
8
- const DEFAULT_FALSE = 'false';
9
- const touchEvents = {
10
- bindTouchStart: NO_DEFAULT_VALUE,
11
- bindTouchMove: NO_DEFAULT_VALUE,
12
- bindTouchEnd: NO_DEFAULT_VALUE,
13
- bindTouchCancel: NO_DEFAULT_VALUE,
14
- bindLongTap: NO_DEFAULT_VALUE
15
- };
16
- const animation = {
17
- animation: NO_DEFAULT_VALUE,
18
- bindAnimationStart: NO_DEFAULT_VALUE,
19
- bindAnimationIteration: NO_DEFAULT_VALUE,
20
- bindAnimationEnd: NO_DEFAULT_VALUE,
21
- bindTransitionEnd: NO_DEFAULT_VALUE
22
- };
23
- function singleQuote(s) {
24
- return `'${s}'`;
25
- }
26
- const View = Object.assign(Object.assign({ 'hover-class': singleQuote('none'), 'hover-stop-propagation': DEFAULT_FALSE, 'hover-start-time': '50', 'hover-stay-time': '400' }, touchEvents), animation);
27
- const Icon = {
28
- type: NO_DEFAULT_VALUE,
29
- size: '23',
30
- color: NO_DEFAULT_VALUE
31
- };
32
- const MapComp = Object.assign({ longitude: NO_DEFAULT_VALUE, latitude: NO_DEFAULT_VALUE, scale: '16', markers: DEFAULT_EMPTY_ARRAY, covers: NO_DEFAULT_VALUE, polyline: DEFAULT_EMPTY_ARRAY, circles: DEFAULT_EMPTY_ARRAY, controls: DEFAULT_EMPTY_ARRAY, 'include-points': DEFAULT_EMPTY_ARRAY, 'show-location': NO_DEFAULT_VALUE, 'layer-style': '1', bindMarkerTap: NO_DEFAULT_VALUE, bindControlTap: NO_DEFAULT_VALUE, bindCalloutTap: NO_DEFAULT_VALUE, bindUpdated: NO_DEFAULT_VALUE }, touchEvents);
33
- const Progress = {
34
- percent: NO_DEFAULT_VALUE,
35
- 'stroke-width': '6',
36
- color: singleQuote('#09BB07'),
37
- activeColor: singleQuote('#09BB07'),
38
- backgroundColor: singleQuote('#EBEBEB'),
39
- active: DEFAULT_FALSE,
40
- 'active-mode': singleQuote('backwards'),
41
- 'show-info': DEFAULT_FALSE
42
- };
43
- const RichText = {
44
- nodes: DEFAULT_EMPTY_ARRAY
45
- };
46
- const Text = {
47
- selectable: DEFAULT_FALSE,
48
- space: NO_DEFAULT_VALUE,
49
- decode: DEFAULT_FALSE
50
- };
51
- const Button = Object.assign({ size: singleQuote('default'), type: NO_DEFAULT_VALUE, plain: DEFAULT_FALSE, disabled: NO_DEFAULT_VALUE, loading: DEFAULT_FALSE, 'form-type': NO_DEFAULT_VALUE, 'open-type': NO_DEFAULT_VALUE, 'hover-class': singleQuote('button-hover'), 'hover-stop-propagation': DEFAULT_FALSE, 'hover-start-time': '20', 'hover-stay-time': '70', name: NO_DEFAULT_VALUE }, touchEvents);
52
- const Checkbox = {
53
- value: NO_DEFAULT_VALUE,
54
- disabled: NO_DEFAULT_VALUE,
55
- checked: DEFAULT_FALSE,
56
- color: singleQuote('#09BB07'),
57
- name: NO_DEFAULT_VALUE
58
- };
59
- const CheckboxGroup = {
60
- bindChange: NO_DEFAULT_VALUE,
61
- name: NO_DEFAULT_VALUE
62
- };
63
- const Form = {
64
- 'report-submit': DEFAULT_FALSE,
65
- bindSubmit: NO_DEFAULT_VALUE,
66
- bindReset: NO_DEFAULT_VALUE,
67
- name: NO_DEFAULT_VALUE
68
- };
69
- const Input = {
70
- value: NO_DEFAULT_VALUE,
71
- type: singleQuote(NO_DEFAULT_VALUE),
72
- password: DEFAULT_FALSE,
73
- placeholder: NO_DEFAULT_VALUE,
74
- 'placeholder-style': NO_DEFAULT_VALUE,
75
- 'placeholder-class': singleQuote('input-placeholder'),
76
- disabled: NO_DEFAULT_VALUE,
77
- maxlength: '140',
78
- 'cursor-spacing': '0',
79
- focus: DEFAULT_FALSE,
80
- 'confirm-type': singleQuote('done'),
81
- 'confirm-hold': DEFAULT_FALSE,
82
- cursor: 'i.value.length',
83
- 'selection-start': '-1',
84
- 'selection-end': '-1',
85
- bindInput: NO_DEFAULT_VALUE,
86
- bindFocus: NO_DEFAULT_VALUE,
87
- bindBlur: NO_DEFAULT_VALUE,
88
- bindConfirm: NO_DEFAULT_VALUE,
89
- name: NO_DEFAULT_VALUE
90
- };
91
- const Label = {
92
- for: NO_DEFAULT_VALUE,
93
- name: NO_DEFAULT_VALUE
94
- };
95
- const Picker = {
96
- mode: singleQuote('selector'),
97
- disabled: NO_DEFAULT_VALUE,
98
- range: NO_DEFAULT_VALUE,
99
- 'range-key': NO_DEFAULT_VALUE,
100
- value: NO_DEFAULT_VALUE,
101
- start: NO_DEFAULT_VALUE,
102
- end: NO_DEFAULT_VALUE,
103
- fields: singleQuote('day'),
104
- 'custom-item': NO_DEFAULT_VALUE,
105
- name: NO_DEFAULT_VALUE,
106
- bindCancel: NO_DEFAULT_VALUE,
107
- bindChange: NO_DEFAULT_VALUE,
108
- bindColumnChange: NO_DEFAULT_VALUE
109
- };
110
- const PickerView = {
111
- value: NO_DEFAULT_VALUE,
112
- 'indicator-style': NO_DEFAULT_VALUE,
113
- 'indicator-class': NO_DEFAULT_VALUE,
114
- 'mask-style': NO_DEFAULT_VALUE,
115
- 'mask-class': NO_DEFAULT_VALUE,
116
- bindChange: NO_DEFAULT_VALUE,
117
- name: NO_DEFAULT_VALUE
118
- };
119
- const PickerViewColumn = {
120
- name: NO_DEFAULT_VALUE
121
- };
122
- const Radio = {
123
- value: NO_DEFAULT_VALUE,
124
- checked: DEFAULT_FALSE,
125
- disabled: NO_DEFAULT_VALUE,
126
- color: singleQuote('#09BB07'),
127
- name: NO_DEFAULT_VALUE
128
- };
129
- const RadioGroup = {
130
- bindChange: NO_DEFAULT_VALUE,
131
- name: NO_DEFAULT_VALUE
132
- };
133
- const Slider = {
134
- min: '0',
135
- max: '100',
136
- step: '1',
137
- disabled: NO_DEFAULT_VALUE,
138
- value: '0',
139
- activeColor: singleQuote('#1aad19'),
140
- backgroundColor: singleQuote('#e9e9e9'),
141
- 'block-size': '28',
142
- 'block-color': singleQuote('#ffffff'),
143
- 'show-value': DEFAULT_FALSE,
144
- bindChange: NO_DEFAULT_VALUE,
145
- bindChanging: NO_DEFAULT_VALUE,
146
- name: NO_DEFAULT_VALUE
147
- };
148
- const Switch = {
149
- checked: DEFAULT_FALSE,
150
- disabled: NO_DEFAULT_VALUE,
151
- type: singleQuote('switch'),
152
- color: singleQuote('#04BE02'),
153
- bindChange: NO_DEFAULT_VALUE,
154
- name: NO_DEFAULT_VALUE
155
- };
156
- const Textarea = {
157
- value: NO_DEFAULT_VALUE,
158
- placeholder: NO_DEFAULT_VALUE,
159
- 'placeholder-style': NO_DEFAULT_VALUE,
160
- 'placeholder-class': singleQuote('textarea-placeholder'),
161
- disabled: NO_DEFAULT_VALUE,
162
- maxlength: '140',
163
- 'auto-focus': DEFAULT_FALSE,
164
- focus: DEFAULT_FALSE,
165
- 'auto-height': DEFAULT_FALSE,
166
- fixed: DEFAULT_FALSE,
167
- 'cursor-spacing': '0',
168
- cursor: '-1',
169
- 'selection-start': '-1',
170
- 'selection-end': '-1',
171
- bindFocus: NO_DEFAULT_VALUE,
172
- bindBlur: NO_DEFAULT_VALUE,
173
- bindLineChange: NO_DEFAULT_VALUE,
174
- bindInput: NO_DEFAULT_VALUE,
175
- bindConfirm: NO_DEFAULT_VALUE,
176
- name: NO_DEFAULT_VALUE
177
- };
178
- const CoverImage = {
179
- src: NO_DEFAULT_VALUE,
180
- bindLoad: 'eh',
181
- bindError: 'eh'
182
- };
183
- const CoverView = Object.assign({ 'scroll-top': DEFAULT_FALSE }, touchEvents);
184
- const MovableArea = {
185
- 'scale-area': DEFAULT_FALSE
186
- };
187
- const MovableView = Object.assign(Object.assign({ direction: 'none', inertia: DEFAULT_FALSE, 'out-of-bounds': DEFAULT_FALSE, x: NO_DEFAULT_VALUE, y: NO_DEFAULT_VALUE, damping: '20', friction: '2', disabled: NO_DEFAULT_VALUE, scale: DEFAULT_FALSE, 'scale-min': '0.5', 'scale-max': '10', 'scale-value': '1', bindChange: NO_DEFAULT_VALUE, bindScale: NO_DEFAULT_VALUE, bindHTouchMove: NO_DEFAULT_VALUE, bindVTouchMove: NO_DEFAULT_VALUE, width: singleQuote('10px'), height: singleQuote('10px') }, touchEvents), animation);
188
- const ScrollView = Object.assign(Object.assign({ 'scroll-x': DEFAULT_FALSE, 'scroll-y': DEFAULT_FALSE, 'upper-threshold': '50', 'lower-threshold': '50', 'scroll-top': NO_DEFAULT_VALUE, 'scroll-left': NO_DEFAULT_VALUE, 'scroll-into-view': NO_DEFAULT_VALUE, 'scroll-with-animation': DEFAULT_FALSE, 'enable-back-to-top': DEFAULT_FALSE, bindScrollToUpper: NO_DEFAULT_VALUE, bindScrollToLower: NO_DEFAULT_VALUE, bindScroll: NO_DEFAULT_VALUE }, touchEvents), animation);
189
- const Swiper = Object.assign({ 'indicator-dots': DEFAULT_FALSE, 'indicator-color': singleQuote('rgba(0, 0, 0, .3)'), 'indicator-active-color': singleQuote('#000000'), autoplay: DEFAULT_FALSE, current: '0', interval: '5000', duration: '500', circular: DEFAULT_FALSE, vertical: DEFAULT_FALSE, 'previous-margin': singleQuote('0px'), 'next-margin': singleQuote('0px'), 'display-multiple-items': '1', bindChange: NO_DEFAULT_VALUE, bindTransition: NO_DEFAULT_VALUE, bindAnimationFinish: NO_DEFAULT_VALUE }, touchEvents);
190
- const SwiperItem = {
191
- 'item-id': NO_DEFAULT_VALUE
192
- };
193
- const Navigator = {
194
- url: NO_DEFAULT_VALUE,
195
- 'open-type': singleQuote('navigate'),
196
- delta: '1',
197
- 'hover-class': singleQuote('navigator-hover'),
198
- 'hover-stop-propagation': DEFAULT_FALSE,
199
- 'hover-start-time': '50',
200
- 'hover-stay-time': '600',
201
- bindSuccess: NO_DEFAULT_VALUE,
202
- bindFail: NO_DEFAULT_VALUE,
203
- bindComplete: NO_DEFAULT_VALUE
204
- };
205
- const Audio = {
206
- id: NO_DEFAULT_VALUE,
207
- src: NO_DEFAULT_VALUE,
208
- loop: DEFAULT_FALSE,
209
- controls: DEFAULT_FALSE,
210
- poster: NO_DEFAULT_VALUE,
211
- name: NO_DEFAULT_VALUE,
212
- author: NO_DEFAULT_VALUE,
213
- bindError: NO_DEFAULT_VALUE,
214
- bindPlay: NO_DEFAULT_VALUE,
215
- bindPause: NO_DEFAULT_VALUE,
216
- bindTimeUpdate: NO_DEFAULT_VALUE,
217
- bindEnded: NO_DEFAULT_VALUE
218
- };
219
- const Camera = {
220
- 'device-position': singleQuote('back'),
221
- flash: singleQuote('auto'),
222
- bindStop: NO_DEFAULT_VALUE,
223
- bindError: NO_DEFAULT_VALUE
224
- };
225
- const Image = Object.assign({ src: NO_DEFAULT_VALUE, mode: singleQuote('scaleToFill'), 'lazy-load': DEFAULT_FALSE, bindError: NO_DEFAULT_VALUE, bindLoad: NO_DEFAULT_VALUE }, touchEvents);
226
- const LivePlayer = Object.assign({ src: NO_DEFAULT_VALUE, autoplay: DEFAULT_FALSE, muted: DEFAULT_FALSE, orientation: singleQuote('vertical'), 'object-fit': singleQuote('contain'), 'background-mute': DEFAULT_FALSE, 'min-cache': '1', 'max-cache': '3', bindStateChange: NO_DEFAULT_VALUE, bindFullScreenChange: NO_DEFAULT_VALUE, bindNetStatus: NO_DEFAULT_VALUE }, animation);
227
- const Video = Object.assign({ src: NO_DEFAULT_VALUE, duration: NO_DEFAULT_VALUE, controls: DEFAULT_TRUE, 'danmu-list': NO_DEFAULT_VALUE, 'danmu-btn': NO_DEFAULT_VALUE, 'enable-danmu': NO_DEFAULT_VALUE, autoplay: DEFAULT_FALSE, loop: DEFAULT_FALSE, muted: DEFAULT_FALSE, 'initial-time': '0', 'page-gesture': DEFAULT_FALSE, direction: NO_DEFAULT_VALUE, 'show-progress': DEFAULT_TRUE, 'show-fullscreen-btn': DEFAULT_TRUE, 'show-play-btn': DEFAULT_TRUE, 'show-center-play-btn': DEFAULT_TRUE, 'enable-progress-gesture': DEFAULT_TRUE, 'object-fit': singleQuote('contain'), poster: NO_DEFAULT_VALUE, 'show-mute-btn': DEFAULT_FALSE, bindPlay: NO_DEFAULT_VALUE, bindPause: NO_DEFAULT_VALUE, bindEnded: NO_DEFAULT_VALUE, bindTimeUpdate: NO_DEFAULT_VALUE, bindFullScreenChange: NO_DEFAULT_VALUE, bindWaiting: NO_DEFAULT_VALUE, bindError: NO_DEFAULT_VALUE }, animation);
228
- const Canvas = Object.assign({ 'canvas-id': NO_DEFAULT_VALUE, 'disable-scroll': DEFAULT_FALSE, bindError: NO_DEFAULT_VALUE }, touchEvents);
229
- const Ad = {
230
- 'unit-id': NO_DEFAULT_VALUE,
231
- 'ad-intervals': NO_DEFAULT_VALUE,
232
- bindLoad: NO_DEFAULT_VALUE,
233
- bindError: NO_DEFAULT_VALUE,
234
- bindClose: NO_DEFAULT_VALUE
235
- };
236
- const WebView = {
237
- src: NO_DEFAULT_VALUE,
238
- bindMessage: NO_DEFAULT_VALUE,
239
- bindLoad: NO_DEFAULT_VALUE,
240
- bindError: NO_DEFAULT_VALUE
241
- };
242
- const Block = {};
243
- // For Vue,因为 slot 标签被 vue 占用了
244
- const SlotView = {
245
- name: NO_DEFAULT_VALUE
246
- };
247
- // For React
248
- // Slot 和 SlotView 最终都会编译成 <view slot={{ i.name }} />
249
- // 因为 <slot name="{{ i.name }}" /> 适用性没有前者高(无法添加类和样式)
250
- // 不给 View 直接加 slot 属性的原因是性能损耗
251
- const Slot = {
252
- name: NO_DEFAULT_VALUE
253
- };
254
- const internalComponents = {
255
- View,
256
- Icon,
257
- Progress,
258
- RichText,
259
- Text,
260
- Button,
261
- Checkbox,
262
- CheckboxGroup,
263
- Form,
264
- Input,
265
- Label,
266
- Picker,
267
- PickerView,
268
- PickerViewColumn,
269
- Radio,
270
- RadioGroup,
271
- Slider,
272
- Switch,
273
- CoverImage,
274
- Textarea,
275
- CoverView,
276
- MovableArea,
277
- MovableView,
278
- ScrollView,
279
- Swiper,
280
- SwiperItem,
281
- Navigator,
282
- Audio,
283
- Camera,
284
- Image,
285
- LivePlayer,
286
- Video,
287
- Canvas,
288
- Ad,
289
- WebView,
290
- Block,
291
- Map: MapComp,
292
- Slot,
293
- SlotView
294
- };
295
- const focusComponents = new Set([
296
- 'input',
297
- 'textarea'
298
- ]);
299
- const voidElements = new Set([
300
- 'progress',
301
- 'icon',
302
- 'rich-text',
303
- 'input',
304
- 'textarea',
305
- 'slider',
306
- 'switch',
307
- 'audio',
308
- 'ad',
309
- 'official-account',
310
- 'open-data',
311
- 'navigation-bar'
312
- ]);
313
- const nestElements = new Map([
314
- ['view', -1],
315
- ['catch-view', -1],
316
- ['cover-view', -1],
317
- ['static-view', -1],
318
- ['pure-view', -1],
319
- ['block', -1],
320
- ['text', -1],
321
- ['static-text', 6],
322
- ['slot', 8],
323
- ['slot-view', 8],
324
- ['label', 6],
325
- ['form', 4],
326
- ['scroll-view', 4],
327
- ['swiper', 4],
328
- ['swiper-item', 4]
5
+ const DEFAULT_EMPTY_ARRAY = '[]';
6
+ const NO_DEFAULT_VALUE = '';
7
+ const DEFAULT_TRUE = '!0';
8
+ const DEFAULT_FALSE = '!1';
9
+ const touchEvents = {
10
+ bindTouchStart: NO_DEFAULT_VALUE,
11
+ bindTouchMove: NO_DEFAULT_VALUE,
12
+ bindTouchEnd: NO_DEFAULT_VALUE,
13
+ bindTouchCancel: NO_DEFAULT_VALUE,
14
+ bindLongTap: NO_DEFAULT_VALUE
15
+ };
16
+ const animation = {
17
+ animation: NO_DEFAULT_VALUE,
18
+ bindAnimationStart: NO_DEFAULT_VALUE,
19
+ bindAnimationIteration: NO_DEFAULT_VALUE,
20
+ bindAnimationEnd: NO_DEFAULT_VALUE,
21
+ bindTransitionEnd: NO_DEFAULT_VALUE
22
+ };
23
+ function singleQuote(s) {
24
+ return `'${s}'`;
25
+ }
26
+ const View = Object.assign(Object.assign({ 'hover-class': singleQuote('none'), 'hover-stop-propagation': DEFAULT_FALSE, 'hover-start-time': '50', 'hover-stay-time': '400' }, touchEvents), animation);
27
+ const Icon = {
28
+ type: NO_DEFAULT_VALUE,
29
+ size: '23',
30
+ color: NO_DEFAULT_VALUE
31
+ };
32
+ const MapComp = Object.assign({ longitude: NO_DEFAULT_VALUE, latitude: NO_DEFAULT_VALUE, scale: '16', markers: DEFAULT_EMPTY_ARRAY, covers: NO_DEFAULT_VALUE, polyline: DEFAULT_EMPTY_ARRAY, circles: DEFAULT_EMPTY_ARRAY, controls: DEFAULT_EMPTY_ARRAY, 'include-points': DEFAULT_EMPTY_ARRAY, 'show-location': NO_DEFAULT_VALUE, 'layer-style': '1', bindMarkerTap: NO_DEFAULT_VALUE, bindControlTap: NO_DEFAULT_VALUE, bindCalloutTap: NO_DEFAULT_VALUE, bindUpdated: NO_DEFAULT_VALUE }, touchEvents);
33
+ const Progress = {
34
+ percent: NO_DEFAULT_VALUE,
35
+ 'stroke-width': '6',
36
+ color: singleQuote('#09BB07'),
37
+ activeColor: singleQuote('#09BB07'),
38
+ backgroundColor: singleQuote('#EBEBEB'),
39
+ active: DEFAULT_FALSE,
40
+ 'active-mode': singleQuote('backwards'),
41
+ 'show-info': DEFAULT_FALSE
42
+ };
43
+ const RichText = {
44
+ nodes: DEFAULT_EMPTY_ARRAY
45
+ };
46
+ const Text = {
47
+ selectable: DEFAULT_FALSE,
48
+ space: NO_DEFAULT_VALUE,
49
+ decode: DEFAULT_FALSE
50
+ };
51
+ const Button = Object.assign({ size: singleQuote('default'), type: NO_DEFAULT_VALUE, plain: DEFAULT_FALSE, disabled: NO_DEFAULT_VALUE, loading: DEFAULT_FALSE, 'form-type': NO_DEFAULT_VALUE, 'open-type': NO_DEFAULT_VALUE, 'hover-class': singleQuote('button-hover'), 'hover-stop-propagation': DEFAULT_FALSE, 'hover-start-time': '20', 'hover-stay-time': '70', name: NO_DEFAULT_VALUE }, touchEvents);
52
+ const Checkbox = {
53
+ value: NO_DEFAULT_VALUE,
54
+ disabled: NO_DEFAULT_VALUE,
55
+ checked: DEFAULT_FALSE,
56
+ color: singleQuote('#09BB07'),
57
+ name: NO_DEFAULT_VALUE
58
+ };
59
+ const CheckboxGroup = {
60
+ bindChange: NO_DEFAULT_VALUE,
61
+ name: NO_DEFAULT_VALUE
62
+ };
63
+ const Form = {
64
+ 'report-submit': DEFAULT_FALSE,
65
+ bindSubmit: NO_DEFAULT_VALUE,
66
+ bindReset: NO_DEFAULT_VALUE,
67
+ name: NO_DEFAULT_VALUE
68
+ };
69
+ const Input = {
70
+ value: NO_DEFAULT_VALUE,
71
+ type: singleQuote(NO_DEFAULT_VALUE),
72
+ password: DEFAULT_FALSE,
73
+ placeholder: NO_DEFAULT_VALUE,
74
+ 'placeholder-style': NO_DEFAULT_VALUE,
75
+ 'placeholder-class': singleQuote('input-placeholder'),
76
+ disabled: NO_DEFAULT_VALUE,
77
+ maxlength: '140',
78
+ 'cursor-spacing': '0',
79
+ focus: DEFAULT_FALSE,
80
+ 'confirm-type': singleQuote('done'),
81
+ 'confirm-hold': DEFAULT_FALSE,
82
+ cursor: 'i.value.length',
83
+ 'selection-start': '-1',
84
+ 'selection-end': '-1',
85
+ bindInput: NO_DEFAULT_VALUE,
86
+ bindFocus: NO_DEFAULT_VALUE,
87
+ bindBlur: NO_DEFAULT_VALUE,
88
+ bindConfirm: NO_DEFAULT_VALUE,
89
+ name: NO_DEFAULT_VALUE
90
+ };
91
+ const Label = {
92
+ for: NO_DEFAULT_VALUE,
93
+ name: NO_DEFAULT_VALUE
94
+ };
95
+ const Picker = {
96
+ mode: singleQuote('selector'),
97
+ disabled: NO_DEFAULT_VALUE,
98
+ range: NO_DEFAULT_VALUE,
99
+ 'range-key': NO_DEFAULT_VALUE,
100
+ value: NO_DEFAULT_VALUE,
101
+ start: NO_DEFAULT_VALUE,
102
+ end: NO_DEFAULT_VALUE,
103
+ fields: singleQuote('day'),
104
+ 'custom-item': NO_DEFAULT_VALUE,
105
+ name: NO_DEFAULT_VALUE,
106
+ bindCancel: NO_DEFAULT_VALUE,
107
+ bindChange: NO_DEFAULT_VALUE,
108
+ bindColumnChange: NO_DEFAULT_VALUE
109
+ };
110
+ const PickerView = {
111
+ value: NO_DEFAULT_VALUE,
112
+ 'indicator-style': NO_DEFAULT_VALUE,
113
+ 'indicator-class': NO_DEFAULT_VALUE,
114
+ 'mask-style': NO_DEFAULT_VALUE,
115
+ 'mask-class': NO_DEFAULT_VALUE,
116
+ bindChange: NO_DEFAULT_VALUE,
117
+ name: NO_DEFAULT_VALUE
118
+ };
119
+ const PickerViewColumn = {
120
+ name: NO_DEFAULT_VALUE
121
+ };
122
+ const Radio = {
123
+ value: NO_DEFAULT_VALUE,
124
+ checked: DEFAULT_FALSE,
125
+ disabled: NO_DEFAULT_VALUE,
126
+ color: singleQuote('#09BB07'),
127
+ name: NO_DEFAULT_VALUE
128
+ };
129
+ const RadioGroup = {
130
+ bindChange: NO_DEFAULT_VALUE,
131
+ name: NO_DEFAULT_VALUE
132
+ };
133
+ const Slider = {
134
+ min: '0',
135
+ max: '100',
136
+ step: '1',
137
+ disabled: NO_DEFAULT_VALUE,
138
+ value: '0',
139
+ activeColor: singleQuote('#1aad19'),
140
+ backgroundColor: singleQuote('#e9e9e9'),
141
+ 'block-size': '28',
142
+ 'block-color': singleQuote('#ffffff'),
143
+ 'show-value': DEFAULT_FALSE,
144
+ bindChange: NO_DEFAULT_VALUE,
145
+ bindChanging: NO_DEFAULT_VALUE,
146
+ name: NO_DEFAULT_VALUE
147
+ };
148
+ const Switch = {
149
+ checked: DEFAULT_FALSE,
150
+ disabled: NO_DEFAULT_VALUE,
151
+ type: singleQuote('switch'),
152
+ color: singleQuote('#04BE02'),
153
+ bindChange: NO_DEFAULT_VALUE,
154
+ name: NO_DEFAULT_VALUE
155
+ };
156
+ const Textarea = {
157
+ value: NO_DEFAULT_VALUE,
158
+ placeholder: NO_DEFAULT_VALUE,
159
+ 'placeholder-style': NO_DEFAULT_VALUE,
160
+ 'placeholder-class': singleQuote('textarea-placeholder'),
161
+ disabled: NO_DEFAULT_VALUE,
162
+ maxlength: '140',
163
+ 'auto-focus': DEFAULT_FALSE,
164
+ focus: DEFAULT_FALSE,
165
+ 'auto-height': DEFAULT_FALSE,
166
+ fixed: DEFAULT_FALSE,
167
+ 'cursor-spacing': '0',
168
+ cursor: '-1',
169
+ 'selection-start': '-1',
170
+ 'selection-end': '-1',
171
+ bindFocus: NO_DEFAULT_VALUE,
172
+ bindBlur: NO_DEFAULT_VALUE,
173
+ bindLineChange: NO_DEFAULT_VALUE,
174
+ bindInput: NO_DEFAULT_VALUE,
175
+ bindConfirm: NO_DEFAULT_VALUE,
176
+ name: NO_DEFAULT_VALUE
177
+ };
178
+ const CoverImage = {
179
+ src: NO_DEFAULT_VALUE,
180
+ bindLoad: 'eh',
181
+ bindError: 'eh'
182
+ };
183
+ const CoverView = Object.assign({ 'scroll-top': DEFAULT_FALSE }, touchEvents);
184
+ const MovableArea = {
185
+ 'scale-area': DEFAULT_FALSE
186
+ };
187
+ const MovableView = Object.assign(Object.assign({ direction: 'none', inertia: DEFAULT_FALSE, 'out-of-bounds': DEFAULT_FALSE, x: NO_DEFAULT_VALUE, y: NO_DEFAULT_VALUE, damping: '20', friction: '2', disabled: NO_DEFAULT_VALUE, scale: DEFAULT_FALSE, 'scale-min': '0.5', 'scale-max': '10', 'scale-value': '1', bindChange: NO_DEFAULT_VALUE, bindScale: NO_DEFAULT_VALUE, bindHTouchMove: NO_DEFAULT_VALUE, bindVTouchMove: NO_DEFAULT_VALUE, width: singleQuote('10px'), height: singleQuote('10px') }, touchEvents), animation);
188
+ const ScrollView = Object.assign(Object.assign({ 'scroll-x': DEFAULT_FALSE, 'scroll-y': DEFAULT_FALSE, 'upper-threshold': '50', 'lower-threshold': '50', 'scroll-top': NO_DEFAULT_VALUE, 'scroll-left': NO_DEFAULT_VALUE, 'scroll-into-view': NO_DEFAULT_VALUE, 'scroll-with-animation': DEFAULT_FALSE, 'enable-back-to-top': DEFAULT_FALSE, bindScrollToUpper: NO_DEFAULT_VALUE, bindScrollToLower: NO_DEFAULT_VALUE, bindScroll: NO_DEFAULT_VALUE }, touchEvents), animation);
189
+ const Swiper = Object.assign({ 'indicator-dots': DEFAULT_FALSE, 'indicator-color': singleQuote('rgba(0, 0, 0, .3)'), 'indicator-active-color': singleQuote('#000000'), autoplay: DEFAULT_FALSE, current: '0', interval: '5000', duration: '500', circular: DEFAULT_FALSE, vertical: DEFAULT_FALSE, 'previous-margin': singleQuote('0px'), 'next-margin': singleQuote('0px'), 'display-multiple-items': '1', bindChange: NO_DEFAULT_VALUE, bindTransition: NO_DEFAULT_VALUE, bindAnimationFinish: NO_DEFAULT_VALUE }, touchEvents);
190
+ const SwiperItem = {
191
+ 'item-id': NO_DEFAULT_VALUE
192
+ };
193
+ const Navigator = {
194
+ url: NO_DEFAULT_VALUE,
195
+ 'open-type': singleQuote('navigate'),
196
+ delta: '1',
197
+ 'hover-class': singleQuote('navigator-hover'),
198
+ 'hover-stop-propagation': DEFAULT_FALSE,
199
+ 'hover-start-time': '50',
200
+ 'hover-stay-time': '600',
201
+ bindSuccess: NO_DEFAULT_VALUE,
202
+ bindFail: NO_DEFAULT_VALUE,
203
+ bindComplete: NO_DEFAULT_VALUE
204
+ };
205
+ const Audio = {
206
+ id: NO_DEFAULT_VALUE,
207
+ src: NO_DEFAULT_VALUE,
208
+ loop: DEFAULT_FALSE,
209
+ controls: DEFAULT_FALSE,
210
+ poster: NO_DEFAULT_VALUE,
211
+ name: NO_DEFAULT_VALUE,
212
+ author: NO_DEFAULT_VALUE,
213
+ bindError: NO_DEFAULT_VALUE,
214
+ bindPlay: NO_DEFAULT_VALUE,
215
+ bindPause: NO_DEFAULT_VALUE,
216
+ bindTimeUpdate: NO_DEFAULT_VALUE,
217
+ bindEnded: NO_DEFAULT_VALUE
218
+ };
219
+ const Camera = {
220
+ 'device-position': singleQuote('back'),
221
+ flash: singleQuote('auto'),
222
+ bindStop: NO_DEFAULT_VALUE,
223
+ bindError: NO_DEFAULT_VALUE
224
+ };
225
+ const Image = Object.assign({ src: NO_DEFAULT_VALUE, mode: singleQuote('scaleToFill'), 'lazy-load': DEFAULT_FALSE, bindError: NO_DEFAULT_VALUE, bindLoad: NO_DEFAULT_VALUE }, touchEvents);
226
+ const LivePlayer = Object.assign({ src: NO_DEFAULT_VALUE, autoplay: DEFAULT_FALSE, muted: DEFAULT_FALSE, orientation: singleQuote('vertical'), 'object-fit': singleQuote('contain'), 'background-mute': DEFAULT_FALSE, 'min-cache': '1', 'max-cache': '3', bindStateChange: NO_DEFAULT_VALUE, bindFullScreenChange: NO_DEFAULT_VALUE, bindNetStatus: NO_DEFAULT_VALUE }, animation);
227
+ const Video = Object.assign({ src: NO_DEFAULT_VALUE, duration: NO_DEFAULT_VALUE, controls: DEFAULT_TRUE, 'danmu-list': NO_DEFAULT_VALUE, 'danmu-btn': NO_DEFAULT_VALUE, 'enable-danmu': NO_DEFAULT_VALUE, autoplay: DEFAULT_FALSE, loop: DEFAULT_FALSE, muted: DEFAULT_FALSE, 'initial-time': '0', 'page-gesture': DEFAULT_FALSE, direction: NO_DEFAULT_VALUE, 'show-progress': DEFAULT_TRUE, 'show-fullscreen-btn': DEFAULT_TRUE, 'show-play-btn': DEFAULT_TRUE, 'show-center-play-btn': DEFAULT_TRUE, 'enable-progress-gesture': DEFAULT_TRUE, 'object-fit': singleQuote('contain'), poster: NO_DEFAULT_VALUE, 'show-mute-btn': DEFAULT_FALSE, bindPlay: NO_DEFAULT_VALUE, bindPause: NO_DEFAULT_VALUE, bindEnded: NO_DEFAULT_VALUE, bindTimeUpdate: NO_DEFAULT_VALUE, bindFullScreenChange: NO_DEFAULT_VALUE, bindWaiting: NO_DEFAULT_VALUE, bindError: NO_DEFAULT_VALUE }, animation);
228
+ const Canvas = Object.assign({ 'canvas-id': NO_DEFAULT_VALUE, 'disable-scroll': DEFAULT_FALSE, bindError: NO_DEFAULT_VALUE }, touchEvents);
229
+ const Ad = {
230
+ 'unit-id': NO_DEFAULT_VALUE,
231
+ 'ad-intervals': NO_DEFAULT_VALUE,
232
+ bindLoad: NO_DEFAULT_VALUE,
233
+ bindError: NO_DEFAULT_VALUE,
234
+ bindClose: NO_DEFAULT_VALUE
235
+ };
236
+ const WebView = {
237
+ src: NO_DEFAULT_VALUE,
238
+ bindMessage: NO_DEFAULT_VALUE,
239
+ bindLoad: NO_DEFAULT_VALUE,
240
+ bindError: NO_DEFAULT_VALUE
241
+ };
242
+ const Block = {};
243
+ // For Vue,因为 slot 标签被 vue 占用了
244
+ const SlotView = {
245
+ name: NO_DEFAULT_VALUE
246
+ };
247
+ // For React
248
+ // Slot 和 SlotView 最终都会编译成 <view slot={{ i.name }} />
249
+ // 因为 <slot name="{{ i.name }}" /> 适用性没有前者高(无法添加类和样式)
250
+ // 不给 View 直接加 slot 属性的原因是性能损耗
251
+ const Slot = {
252
+ name: NO_DEFAULT_VALUE
253
+ };
254
+ const internalComponents = {
255
+ View,
256
+ Icon,
257
+ Progress,
258
+ RichText,
259
+ Text,
260
+ Button,
261
+ Checkbox,
262
+ CheckboxGroup,
263
+ Form,
264
+ Input,
265
+ Label,
266
+ Picker,
267
+ PickerView,
268
+ PickerViewColumn,
269
+ Radio,
270
+ RadioGroup,
271
+ Slider,
272
+ Switch,
273
+ CoverImage,
274
+ Textarea,
275
+ CoverView,
276
+ MovableArea,
277
+ MovableView,
278
+ ScrollView,
279
+ Swiper,
280
+ SwiperItem,
281
+ Navigator,
282
+ Audio,
283
+ Camera,
284
+ Image,
285
+ LivePlayer,
286
+ Video,
287
+ Canvas,
288
+ Ad,
289
+ WebView,
290
+ Block,
291
+ Map: MapComp,
292
+ Slot,
293
+ SlotView
294
+ };
295
+ const focusComponents = new Set([
296
+ 'input',
297
+ 'textarea'
298
+ ]);
299
+ const voidElements = new Set([
300
+ 'progress',
301
+ 'icon',
302
+ 'rich-text',
303
+ 'input',
304
+ 'textarea',
305
+ 'slider',
306
+ 'switch',
307
+ 'audio',
308
+ 'ad',
309
+ 'official-account',
310
+ 'open-data',
311
+ 'navigation-bar'
312
+ ]);
313
+ const nestElements = new Map([
314
+ ['view', -1],
315
+ ['catch-view', -1],
316
+ ['cover-view', -1],
317
+ ['static-view', -1],
318
+ ['pure-view', -1],
319
+ ['block', -1],
320
+ ['text', -1],
321
+ ['static-text', 6],
322
+ ['slot', 8],
323
+ ['slot-view', 8],
324
+ ['label', 6],
325
+ ['form', 4],
326
+ ['scroll-view', 4],
327
+ ['swiper', 4],
328
+ ['swiper-item', 4]
329
329
  ]);
330
330
 
331
- function isFunction(o) {
332
- return typeof o === 'function';
333
- }
334
- function isNumber(o) {
335
- return typeof o === 'number';
336
- }
337
- function isBooleanStringLiteral(o) {
338
- return o === 'true' || o === 'false';
331
+ function isString(o) {
332
+ return typeof o === 'string';
333
+ }
334
+ function isFunction(o) {
335
+ return typeof o === 'function';
336
+ }
337
+ function isNumber(o) {
338
+ return typeof o === 'number';
339
+ }
340
+ function isBooleanStringLiteral(o) {
341
+ return o === 'true' || o === 'false';
339
342
  }
340
343
 
341
- function toDashed(s) {
342
- return s.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
343
- }
344
- function toCamelCase(s) {
345
- let camel = '';
346
- let nextCap = false;
347
- for (let i = 0; i < s.length; i++) {
348
- if (s[i] !== '-') {
349
- camel += nextCap ? s[i].toUpperCase() : s[i];
350
- nextCap = false;
351
- }
352
- else {
353
- nextCap = true;
354
- }
355
- }
356
- return camel;
357
- }
358
- const toKebabCase = function (string) {
359
- return string.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
360
- };
361
- function capitalize(s) {
362
- return s.charAt(0).toUpperCase() + s.slice(1);
363
- }
364
- const hasOwnProperty = Object.prototype.hasOwnProperty;
365
- const hasOwn = (val, key) => hasOwnProperty.call(val, key);
366
- (new Date()).getTime().toString();
367
- function indent(str, size) {
368
- return str.split('\n')
369
- .map((line, index) => {
370
- const indent = index === 0 ? '' : Array(size).fill(' ').join('');
371
- return indent + line;
372
- })
373
- .join('\n');
344
+ class Events {
345
+ constructor(opts) {
346
+ var _a;
347
+ this.callbacks = (_a = opts === null || opts === void 0 ? void 0 : opts.callbacks) !== null && _a !== void 0 ? _a : {};
348
+ }
349
+ on(eventName, callback, context) {
350
+ let event, node, tail, list;
351
+ if (!callback) {
352
+ return this;
353
+ }
354
+ eventName = eventName.split(Events.eventSplitter);
355
+ this.callbacks || (this.callbacks = {});
356
+ const calls = this.callbacks;
357
+ while ((event = eventName.shift())) {
358
+ list = calls[event];
359
+ node = list ? list.tail : {};
360
+ node.next = tail = {};
361
+ node.context = context;
362
+ node.callback = callback;
363
+ calls[event] = {
364
+ tail,
365
+ next: list ? list.next : node
366
+ };
367
+ }
368
+ return this;
369
+ }
370
+ once(events, callback, context) {
371
+ const wrapper = (...args) => {
372
+ callback.apply(this, args);
373
+ this.off(events, wrapper, context);
374
+ };
375
+ this.on(events, wrapper, context);
376
+ return this;
377
+ }
378
+ off(events, callback, context) {
379
+ let event, calls, node, tail, cb, ctx;
380
+ if (!(calls = this.callbacks)) {
381
+ return this;
382
+ }
383
+ if (!(events || callback || context)) {
384
+ delete this.callbacks;
385
+ return this;
386
+ }
387
+ events = events ? events.split(Events.eventSplitter) : Object.keys(calls);
388
+ while ((event = events.shift())) {
389
+ node = calls[event];
390
+ delete calls[event];
391
+ if (!node || !(callback || context)) {
392
+ continue;
393
+ }
394
+ tail = node.tail;
395
+ while ((node = node.next) !== tail) {
396
+ cb = node.callback;
397
+ ctx = node.context;
398
+ if ((callback && cb !== callback) || (context && ctx !== context)) {
399
+ this.on(event, cb, ctx);
400
+ }
401
+ }
402
+ }
403
+ return this;
404
+ }
405
+ trigger(events) {
406
+ let event, node, calls, tail;
407
+ if (!(calls = this.callbacks)) {
408
+ return this;
409
+ }
410
+ events = events.split(Events.eventSplitter);
411
+ const rest = [].slice.call(arguments, 1);
412
+ while ((event = events.shift())) {
413
+ if ((node = calls[event])) {
414
+ tail = node.tail;
415
+ while ((node = node.next) !== tail) {
416
+ node.callback.apply(node.context || this, rest);
417
+ }
418
+ }
419
+ }
420
+ return this;
421
+ }
374
422
  }
423
+ Events.eventSplitter = /\s+/;
375
424
 
376
- /**
377
- * 这里我们需要关心的小程序种类有两类:
378
- * 1. 模板递归:
379
- * - 支持:tmpl0 tmpl0
380
- * - 不支持:这就使得我们必须生成多级的模板,tmpl0 tmpl1,tmpl1 套 tmpl2……
381
- * 直到超过阈值 N (N = config.miniapp.baseLevel) tmplN 会套组件 comp,组件 comp 重新再套 tmpl0。
382
- * 2. 小程序脚本语言(wxs, sjs, etc...):
383
- * - 支持:可以在模板使用函数缩减模板大小或提高性能(存疑),例如判断一个值是不是假值(falsy value)。
384
- * 将来或许会把数据序列化^1 的操作也放到小程序脚本语言里。
385
- * - 不支持:使用纯 *xml 语法
386
- *
387
- * ^1: packages/taro-runtime/src/hydrate.ts
388
- */
389
- const styles = {
390
- style: `i.${"st" /* Style */}`,
391
- class: `i.${"cl" /* Class */}`
392
- };
393
- const events = {
394
- bindtap: 'eh'
395
- };
396
- const weixinAdapter = {
397
- if: 'wx:if',
398
- else: 'wx:else',
399
- elseif: 'wx:elif',
400
- for: 'wx:for',
401
- forItem: 'wx:for-item',
402
- forIndex: 'wx:for-index',
403
- key: 'wx:key',
404
- xs: 'wxs',
405
- type: 'weapp'
406
- };
407
- class BaseTemplate {
408
- constructor() {
409
- this.exportExpr = 'module.exports =';
410
- this.supportXS = false;
411
- this.Adapter = weixinAdapter;
412
- /** 组件列表 */
413
- this.internalComponents = internalComponents;
414
- /** 可以 focus 聚焦的组件 */
415
- this.focusComponents = focusComponents;
416
- /** 不需要渲染子节点的元素 */
417
- this.voidElements = voidElements;
418
- /** 可以递归调用自身的组件 */
419
- this.nestElements = nestElements;
420
- this.buildPageTemplate = (baseTempPath) => {
425
+ var HOOK_TYPE;
426
+ (function (HOOK_TYPE) {
427
+ HOOK_TYPE[HOOK_TYPE["SINGLE"] = 0] = "SINGLE";
428
+ HOOK_TYPE[HOOK_TYPE["MULTI"] = 1] = "MULTI";
429
+ HOOK_TYPE[HOOK_TYPE["WATERFALL"] = 2] = "WATERFALL";
430
+ })(HOOK_TYPE || (HOOK_TYPE = {}));
431
+ const defaultMiniLifecycle = {
432
+ app: [
433
+ 'onLaunch',
434
+ 'onShow',
435
+ 'onHide'
436
+ ],
437
+ page: [
438
+ 'onLoad',
439
+ 'onUnload',
440
+ 'onReady',
441
+ 'onShow',
442
+ 'onHide',
443
+ [
444
+ 'onPullDownRefresh',
445
+ 'onReachBottom',
446
+ 'onPageScroll',
447
+ 'onResize',
448
+ 'onTabItemTap',
449
+ 'onTitleClick',
450
+ 'onOptionMenuClick',
451
+ 'onPopMenuClick',
452
+ 'onPullIntercept',
453
+ 'onAddToFavorites'
454
+ ]
455
+ ]
456
+ };
457
+ function TaroHook(type, initial) {
458
+ return {
459
+ type,
460
+ initial: initial || null
461
+ };
462
+ }
463
+ class TaroHooks extends Events {
464
+ constructor(hooks, opts) {
465
+ super(opts);
466
+ this.hooks = hooks;
467
+ for (const hookName in hooks) {
468
+ const { initial } = hooks[hookName];
469
+ if (isFunction(initial)) {
470
+ this.on(hookName, initial);
471
+ }
472
+ }
473
+ }
474
+ tapOneOrMany(hookName, callback) {
475
+ const list = isFunction(callback) ? [callback] : callback;
476
+ list.forEach(cb => this.on(hookName, cb));
477
+ }
478
+ tap(hookName, callback) {
479
+ const hooks = this.hooks;
480
+ const { type, initial } = hooks[hookName];
481
+ if (type === HOOK_TYPE.SINGLE) {
482
+ this.off(hookName);
483
+ this.on(hookName, isFunction(callback) ? callback : callback[callback.length - 1]);
484
+ }
485
+ else {
486
+ initial && this.off(hookName, initial);
487
+ this.tapOneOrMany(hookName, callback);
488
+ }
489
+ }
490
+ call(hookName, ...rest) {
491
+ var _a;
492
+ const hook = this.hooks[hookName];
493
+ if (!hook)
494
+ return;
495
+ const { type } = hook;
496
+ const calls = this.callbacks;
497
+ if (!calls)
498
+ return;
499
+ const list = calls[hookName];
500
+ if (list) {
501
+ const tail = list.tail;
502
+ let node = list.next;
503
+ let args = rest;
504
+ let res;
505
+ while (node !== tail) {
506
+ res = (_a = node.callback) === null || _a === void 0 ? void 0 : _a.apply(node.context || this, args);
507
+ if (type === HOOK_TYPE.WATERFALL) {
508
+ const params = [res];
509
+ args = params;
510
+ }
511
+ node = node.next;
512
+ }
513
+ return res;
514
+ }
515
+ }
516
+ isExist(hookName) {
517
+ var _a;
518
+ return Boolean((_a = this.callbacks) === null || _a === void 0 ? void 0 : _a[hookName]);
519
+ }
520
+ }
521
+ new TaroHooks({
522
+ getMiniLifecycle: TaroHook(HOOK_TYPE.SINGLE, defaultConfig => defaultConfig),
523
+ getMiniLifecycleImpl: TaroHook(HOOK_TYPE.SINGLE, function () {
524
+ return this.call('getMiniLifecycle', defaultMiniLifecycle);
525
+ }),
526
+ getLifecycle: TaroHook(HOOK_TYPE.SINGLE, (instance, lifecycle) => instance[lifecycle]),
527
+ getPathIndex: TaroHook(HOOK_TYPE.SINGLE, indexOfNode => `[${indexOfNode}]`),
528
+ getEventCenter: TaroHook(HOOK_TYPE.SINGLE, Events => new Events()),
529
+ isBubbleEvents: TaroHook(HOOK_TYPE.SINGLE, eventName => {
530
+ /**
531
+ * 支持冒泡的事件, 除 支付宝小程序外,其余的可冒泡事件都和微信保持一致
532
+ * 详见 见 https://developers.weixin.qq.com/miniprogram/dev/framework/view/wxml/event.html
533
+ */
534
+ const BUBBLE_EVENTS = new Set([
535
+ 'touchstart',
536
+ 'touchmove',
537
+ 'touchcancel',
538
+ 'touchend',
539
+ 'touchforcechange',
540
+ 'tap',
541
+ 'longpress',
542
+ 'longtap',
543
+ 'transitionend',
544
+ 'animationstart',
545
+ 'animationiteration',
546
+ 'animationend'
547
+ ]);
548
+ return BUBBLE_EVENTS.has(eventName);
549
+ }),
550
+ getSpecialNodes: TaroHook(HOOK_TYPE.SINGLE, () => ['view', 'text', 'image']),
551
+ onRemoveAttribute: TaroHook(HOOK_TYPE.SINGLE),
552
+ batchedEventUpdates: TaroHook(HOOK_TYPE.SINGLE),
553
+ mergePageInstance: TaroHook(HOOK_TYPE.SINGLE),
554
+ modifyPageObject: TaroHook(HOOK_TYPE.SINGLE),
555
+ createPullDownComponent: TaroHook(HOOK_TYPE.SINGLE),
556
+ getDOMNode: TaroHook(HOOK_TYPE.SINGLE),
557
+ modifyHydrateData: TaroHook(HOOK_TYPE.SINGLE),
558
+ modifySetAttrPayload: TaroHook(HOOK_TYPE.SINGLE),
559
+ modifyRmAttrPayload: TaroHook(HOOK_TYPE.SINGLE),
560
+ onAddEvent: TaroHook(HOOK_TYPE.SINGLE),
561
+ modifyMpEvent: TaroHook(HOOK_TYPE.MULTI),
562
+ modifyMpEventImpl: TaroHook(HOOK_TYPE.SINGLE, function (e) {
563
+ try {
564
+ // 有些小程序的事件对象的某些属性只读
565
+ this.call('modifyMpEvent', e);
566
+ }
567
+ catch (error) {
568
+ console.warn('[Taro modifyMpEvent hook Error]: ', error);
569
+ }
570
+ }),
571
+ modifyTaroEvent: TaroHook(HOOK_TYPE.MULTI),
572
+ modifyDispatchEvent: TaroHook(HOOK_TYPE.MULTI),
573
+ initNativeApi: TaroHook(HOOK_TYPE.MULTI),
574
+ patchElement: TaroHook(HOOK_TYPE.MULTI)
575
+ });
576
+
577
+ function toDashed(s) {
578
+ return s.replace(/([a-z0-9])([A-Z])/g, '$1-$2').toLowerCase();
579
+ }
580
+ function toCamelCase(s) {
581
+ let camel = '';
582
+ let nextCap = false;
583
+ for (let i = 0; i < s.length; i++) {
584
+ if (s[i] !== '-') {
585
+ camel += nextCap ? s[i].toUpperCase() : s[i];
586
+ nextCap = false;
587
+ }
588
+ else {
589
+ nextCap = true;
590
+ }
591
+ }
592
+ return camel;
593
+ }
594
+ const toKebabCase = function (string) {
595
+ return string.replace(/([a-z])([A-Z])/g, '$1-$2').toLowerCase();
596
+ };
597
+ function capitalize(s) {
598
+ return s.charAt(0).toUpperCase() + s.slice(1);
599
+ }
600
+ const hasOwnProperty = Object.prototype.hasOwnProperty;
601
+ const hasOwn = (val, key) => hasOwnProperty.call(val, key);
602
+ (new Date()).getTime().toString();
603
+ function getComponentsAlias(origin) {
604
+ const mapping = {};
605
+ const viewAttrs = origin.View;
606
+ const extraList = {
607
+ '#text': {},
608
+ StaticView: viewAttrs,
609
+ StaticImage: origin.Image,
610
+ StaticText: origin.Text,
611
+ PureView: viewAttrs,
612
+ CatchView: viewAttrs
613
+ };
614
+ origin = Object.assign(Object.assign({}, origin), extraList);
615
+ Object.keys(origin)
616
+ .sort((a, b) => {
617
+ const reg = /^(Static|Pure|Catch)*(View|Image|Text)$/;
618
+ if (reg.test(a)) {
619
+ return -1;
620
+ }
621
+ else if (reg.test(b)) {
622
+ return 1;
623
+ }
624
+ else {
625
+ return a >= b ? 1 : -1;
626
+ }
627
+ })
628
+ .forEach((key, num) => {
629
+ const obj = {
630
+ _num: String(num)
631
+ };
632
+ Object.keys(origin[key])
633
+ .filter(attr => !(/^bind/.test(attr)) && !['focus', 'blur'].includes(attr))
634
+ .sort()
635
+ .forEach((attr, index) => {
636
+ obj[toCamelCase(attr)] = 'p' + index;
637
+ });
638
+ mapping[toDashed(key)] = obj;
639
+ });
640
+ return mapping;
641
+ }
642
+ function indent(str, size) {
643
+ return str.split('\n')
644
+ .map((line, index) => {
645
+ const indent = index === 0 ? '' : Array(size).fill(' ').join('');
646
+ return indent + line;
647
+ })
648
+ .join('\n');
649
+ }
650
+
651
+ /**
652
+ * 这里我们需要关心的小程序种类有两类:
653
+ * 1. 模板递归:
654
+ * - 支持:tmpl0 套 tmpl0
655
+ * - 不支持:这就使得我们必须生成多级的模板,tmpl0 套 tmpl1,tmpl1 套 tmpl2……
656
+ * 直到超过阈值 N (N = config.miniapp.baseLevel) tmplN 会套组件 comp,组件 comp 重新再套 tmpl0。
657
+ * 2. 小程序脚本语言(wxs, sjs, etc...):
658
+ * - 支持:可以在模板使用函数缩减模板大小或提高性能(存疑),例如判断一个值是不是假值(falsy value)。
659
+ * 将来或许会把数据序列化^1 的操作也放到小程序脚本语言里。
660
+ * - 不支持:使用纯 *xml 语法
661
+ *
662
+ * ^1: packages/taro-runtime/src/hydrate.ts
663
+ */
664
+ const styles = {
665
+ style: `i.${"st" /* Style */}`,
666
+ class: `i.${"cl" /* Class */}`
667
+ };
668
+ const events = {
669
+ bindtap: 'eh'
670
+ };
671
+ const weixinAdapter = {
672
+ if: 'wx:if',
673
+ else: 'wx:else',
674
+ elseif: 'wx:elif',
675
+ for: 'wx:for',
676
+ forItem: 'wx:for-item',
677
+ forIndex: 'wx:for-index',
678
+ key: 'wx:key',
679
+ xs: 'wxs',
680
+ type: 'weapp'
681
+ };
682
+ class BaseTemplate {
683
+ constructor() {
684
+ this.exportExpr = 'module.exports =';
685
+ this.supportXS = false;
686
+ this.thirdPartyPatcher = {};
687
+ this.Adapter = weixinAdapter;
688
+ /** 组件列表 */
689
+ this.internalComponents = internalComponents;
690
+ /** 可以 focus 聚焦的组件 */
691
+ this.focusComponents = focusComponents;
692
+ /** 不需要渲染子节点的元素 */
693
+ this.voidElements = voidElements;
694
+ /** 可以递归调用自身的组件 */
695
+ this.nestElements = nestElements;
696
+ this.buildPageTemplate = (baseTempPath) => {
421
697
  const template = `<import src="${baseTempPath}"/>
422
- <template is="taro_tmpl" data="{{${this.dataKeymap('root:root')}}}" />`;
423
- return template;
424
- };
425
- this.buildBaseComponentTemplate = (ext) => {
426
- const data = !this.isSupportRecursive && this.supportXS
427
- ? this.dataKeymap('i:i,l:l')
428
- : this.dataKeymap('i:i');
698
+ <template is="taro_tmpl" data="{{${this.dataKeymap('root:root')}}}" />`;
699
+ return template;
700
+ };
701
+ this.buildBaseComponentTemplate = (ext) => {
702
+ const data = !this.isSupportRecursive && this.supportXS
703
+ ? this.dataKeymap('i:i,l:l')
704
+ : this.dataKeymap('i:i');
429
705
  return `<import src="./base${ext}" />
430
- <template is="tmpl_0_${"container" /* Container */}" data="{{${data}}}" />`;
431
- };
432
- this.buildCustomComponentTemplate = (ext) => {
433
- const Adapter = this.Adapter;
434
- const data = !this.isSupportRecursive && this.supportXS
435
- ? `${this.dataKeymap('i:item,l:\'\'')}`
436
- : this.dataKeymap('i:item');
706
+ <template is="tmpl_0_${"container" /* Container */}" data="{{${data}}}" />`;
707
+ };
708
+ this.buildCustomComponentTemplate = (ext) => {
709
+ const Adapter = this.Adapter;
710
+ const data = !this.isSupportRecursive && this.supportXS
711
+ ? `${this.dataKeymap('i:item,l:\'\'')}`
712
+ : this.dataKeymap('i:item');
437
713
  return `<import src="./base${ext}" />
438
- <block ${Adapter.for}="{{i.${"cn" /* Childnodes */}}}" ${Adapter.key}="uid">
714
+ <block ${Adapter.for}="{{i.${"cn" /* Childnodes */}}}" ${Adapter.key}="sid">
439
715
  <template is="tmpl_0_container" data="{{${data}}}" />
440
- </block>`;
441
- };
442
- this.buildXScript = () => {
716
+ </block>`;
717
+ };
718
+ this.buildXScript = () => {
443
719
  return `${this.exportExpr} {
444
720
  a: ${this.buildXSTmplName()},
445
721
  b: function (a, b) {
@@ -453,423 +729,458 @@ class BaseTemplate {
453
729
  return 'tmpl_' + n + '_${"container" /* Container */}'
454
730
  },
455
731
  ${this.buildXSTmpExtra()}
456
- }`;
457
- };
458
- }
459
- buildAttribute(attrs, nodeName) {
460
- return Object.keys(attrs)
461
- .map(k => `${k}="${k.startsWith('bind') || k.startsWith('on') || k.startsWith('catch') ? attrs[k] : `{${this.getAttrValue(attrs[k], k, nodeName)}}`}" `)
462
- .join('');
463
- }
464
- replacePropName(name, value, _componentName) {
465
- if (value === 'eh')
466
- return name.toLowerCase();
467
- return name;
468
- }
469
- createMiniComponents(components) {
470
- const result = Object.create(null);
471
- for (const key in components) {
472
- if (hasOwn(components, key)) {
473
- let component = components[key];
474
- const compName = toDashed(key);
475
- const newComp = Object.create(null);
476
- if (isFunction(this.modifyCompProps)) {
477
- component = this.modifyCompProps(compName, component);
478
- }
479
- for (let prop in component) {
480
- if (hasOwn(component, prop)) {
481
- let propValue = component[prop];
482
- if (prop.startsWith('bind')) {
483
- propValue = 'eh';
484
- }
485
- else if (propValue === '') {
486
- propValue = `i.${toCamelCase(prop)}`;
487
- }
488
- else if (isBooleanStringLiteral(propValue) || isNumber(+propValue)) {
489
- propValue = this.supportXS
490
- ? `xs.b(i.${toCamelCase(prop)},${propValue})`
491
- : `i.${toCamelCase(prop)}===undefined?${propValue}:i.${toCamelCase(prop)}`;
492
- }
493
- else {
494
- propValue = `i.${toCamelCase(prop)}||${propValue || singleQuote('')}`;
495
- }
496
- prop = this.replacePropName(prop, propValue, compName);
497
- newComp[prop] = propValue;
498
- }
499
- }
500
- if (compName !== 'block') {
501
- Object.assign(newComp, styles, this.getEvents());
502
- }
503
- if (compName === 'swiper-item') {
504
- delete newComp.style;
505
- }
506
- if (compName === 'view') {
507
- const reg = /^(bind|on)(touchmove|TouchMove)$/;
508
- const comp = Object.assign({}, newComp);
509
- Object.keys(comp).forEach(originKey => {
510
- if (!reg.test(originKey))
511
- return;
512
- const key = originKey.replace(reg, 'catch$2');
513
- comp[key] = comp[originKey];
514
- delete comp[originKey];
515
- });
516
- result['catch-view'] = comp;
517
- }
518
- if (compName === 'view' || compName === 'text' || compName === 'image') {
519
- const comp = {};
520
- Object.keys(newComp).forEach(key => {
521
- const value = newComp[key];
522
- if (value !== 'eh')
523
- comp[key] = value;
524
- });
525
- result[`static-${compName}`] = comp;
526
- if (compName === 'view') {
527
- result['pure-view'] = {
528
- style: comp.style,
529
- class: comp.class
530
- };
531
- }
532
- }
533
- if (compName === 'slot' || compName === 'slot-view') {
534
- result[compName] = {
535
- slot: 'i.name'
536
- };
537
- }
538
- else {
539
- result[compName] = newComp;
540
- }
541
- }
542
- }
543
- return result;
544
- }
545
- buildBaseTemplate() {
546
- const Adapter = this.Adapter;
547
- const data = !this.isSupportRecursive && this.supportXS
548
- ? `${this.dataKeymap('i:item,l:\'\'')}`
549
- : this.dataKeymap('i:item');
732
+ }`;
733
+ };
734
+ }
735
+ buildAttribute(attrs, nodeName) {
736
+ return Object.keys(attrs)
737
+ .map(k => `${k}="${k.startsWith('bind') || k.startsWith('on') || k.startsWith('catch') ? attrs[k] : `{${this.getAttrValue(attrs[k], k, nodeName)}}`}" `)
738
+ .join('');
739
+ }
740
+ replacePropName(name, value, _componentName, _componentAlias) {
741
+ if (value === 'eh')
742
+ return name.toLowerCase();
743
+ return name;
744
+ }
745
+ createMiniComponents(components) {
746
+ const result = Object.create(null);
747
+ for (const key in components) {
748
+ if (hasOwn(components, key)) {
749
+ let component = components[key];
750
+ const compName = toDashed(key);
751
+ const newComp = Object.create(null);
752
+ const componentAlias = this.componentsAlias[compName];
753
+ if (isFunction(this.modifyCompProps)) {
754
+ component = this.modifyCompProps(compName, component);
755
+ }
756
+ for (let prop in component) {
757
+ if (hasOwn(component, prop)) {
758
+ let propValue = component[prop];
759
+ if (prop.startsWith('bind') || propValue === 'eh') {
760
+ propValue = 'eh';
761
+ }
762
+ else if (propValue === '') {
763
+ const propInCamelCase = toCamelCase(prop);
764
+ const propAlias = componentAlias[propInCamelCase] || propInCamelCase;
765
+ propValue = `i.${propAlias}`;
766
+ }
767
+ else if (isBooleanStringLiteral(propValue) || isNumber(+propValue)) {
768
+ const propInCamelCase = toCamelCase(prop);
769
+ const propAlias = componentAlias[propInCamelCase] || propInCamelCase;
770
+ propValue = this.supportXS
771
+ ? `xs.b(i.${propAlias},${propValue})`
772
+ : `i.${propAlias}===undefined?${propValue}:i.${propAlias}`;
773
+ }
774
+ else {
775
+ const propInCamelCase = toCamelCase(prop);
776
+ const propAlias = componentAlias[propInCamelCase] || propInCamelCase;
777
+ propValue = `i.${propAlias}||${propValue || singleQuote('')}`;
778
+ }
779
+ prop = this.replacePropName(prop, propValue, compName, componentAlias);
780
+ newComp[prop] = propValue;
781
+ }
782
+ }
783
+ if (compName !== 'block') {
784
+ Object.assign(newComp, styles, this.getEvents());
785
+ }
786
+ if (compName === 'swiper-item') {
787
+ delete newComp.style;
788
+ }
789
+ if (compName === 'view') {
790
+ const reg = /^(bind|on)(touchmove|TouchMove)$/;
791
+ const comp = Object.assign({}, newComp);
792
+ Object.keys(comp).forEach(originKey => {
793
+ if (!reg.test(originKey))
794
+ return;
795
+ const key = originKey.replace(reg, 'catch$2');
796
+ comp[key] = comp[originKey];
797
+ delete comp[originKey];
798
+ });
799
+ result['catch-view'] = comp;
800
+ }
801
+ if (compName === 'view' || compName === 'text' || compName === 'image') {
802
+ const comp = {};
803
+ Object.keys(newComp).forEach(key => {
804
+ const value = newComp[key];
805
+ if (value !== 'eh')
806
+ comp[key] = value;
807
+ });
808
+ result[`static-${compName}`] = comp;
809
+ if (compName === 'view') {
810
+ result['pure-view'] = {
811
+ style: comp.style,
812
+ class: comp.class
813
+ };
814
+ }
815
+ }
816
+ if (compName === 'slot' || compName === 'slot-view') {
817
+ result[compName] = Object.assign({ slot: 'i.name' }, styles);
818
+ }
819
+ else {
820
+ result[compName] = newComp;
821
+ }
822
+ }
823
+ }
824
+ return result;
825
+ }
826
+ buildBaseTemplate() {
827
+ const Adapter = this.Adapter;
828
+ const data = !this.isSupportRecursive && this.supportXS
829
+ ? `${this.dataKeymap('i:item,l:\'\'')}`
830
+ : this.dataKeymap('i:item');
550
831
  return `${this.buildXsTemplate()}
551
832
  <template name="taro_tmpl">
552
- <block ${Adapter.for}="{{root.cn}}" ${Adapter.key}="uid">
833
+ <block ${Adapter.for}="{{root.cn}}" ${Adapter.key}="sid">
553
834
  <template is="tmpl_0_${"container" /* Container */}" data="{{${data}}}" />
554
835
  </block>
555
836
  </template>
556
- `;
557
- }
558
- buildThirdPartyAttr(attrs) {
559
- return Array.from(attrs).reduce((str, attr) => {
560
- if (attr.startsWith('@')) {
561
- // vue2
562
- let value = attr.slice(1);
563
- if (value.indexOf('-') > -1) {
564
- value = `:${value}`;
565
- }
566
- return str + `bind${value}="eh" `;
567
- }
568
- else if (attr.startsWith('bind')) {
569
- return str + `${attr}="eh" `;
570
- }
571
- else if (attr.startsWith('on')) {
572
- // react, vue3
573
- let value = toKebabCase(attr.slice(2));
574
- if (value.indexOf('-') > -1) {
575
- // 兼容如 vant 某些组件的 bind:a-b 这类属性
576
- value = `:${value}`;
577
- }
578
- return str + `bind${value}="eh" `;
579
- }
580
- return str + `${attr}="{{i.${toCamelCase(attr)}}}" `;
581
- }, '');
582
- }
583
- buildComponentTemplate(comp, level) {
584
- return this.focusComponents.has(comp.nodeName)
585
- ? this.buildFocusComponentTemplte(comp, level)
586
- : this.buildStandardComponentTemplate(comp, level);
587
- }
588
- getChildren(comp, level) {
589
- const { isSupportRecursive, Adapter, supportXS } = this;
590
- const nextLevel = isSupportRecursive ? 0 : level + 1;
591
- const data = !this.isSupportRecursive && supportXS
592
- ? `${this.dataKeymap('i:item,l:l')}`
593
- : this.dataKeymap('i:item');
594
- let child = supportXS
595
- ? `<template is="{{xs.e(${isSupportRecursive ? 0 : 'cid+1'})}}" data="{{${data}}}" />`
596
- : `<template is="tmpl_${nextLevel}_${"container" /* Container */}" data="{{${data}}}" />`;
597
- if (isFunction(this.modifyLoopBody)) {
598
- child = this.modifyLoopBody(child, comp.nodeName);
599
- }
600
- let children = this.voidElements.has(comp.nodeName)
601
- ? ''
837
+ `;
838
+ }
839
+ buildThirdPartyAttr(attrs, patcher = {}) {
840
+ return Array.from(attrs).reduce((str, attr) => {
841
+ if (attr.startsWith('@')) {
842
+ // vue2
843
+ let value = attr.slice(1);
844
+ if (value.indexOf('-') > -1) {
845
+ value = `:${value}`;
846
+ }
847
+ return str + `bind${value}="eh" `;
848
+ }
849
+ else if (attr.startsWith('bind')) {
850
+ return str + `${attr}="eh" `;
851
+ }
852
+ else if (attr.startsWith('on')) {
853
+ // react, vue3
854
+ let value = toKebabCase(attr.slice(2));
855
+ if (value.indexOf('-') > -1) {
856
+ // 兼容如 vant 某些组件的 bind:a-b 这类属性
857
+ value = `:${value}`;
858
+ }
859
+ return str + `bind${value}="eh" `;
860
+ }
861
+ else if (attr === 'class') {
862
+ return str + `class="{{i.${"cl" /* Class */}}}" `;
863
+ }
864
+ else if (attr === 'style') {
865
+ return str + `style="{{i.${"st" /* Style */}}}" `;
866
+ }
867
+ const patchValue = patcher[attr];
868
+ if (isBooleanStringLiteral(patchValue) || isNumber(patchValue) || isString(patchValue)) {
869
+ const propValue = this.supportXS
870
+ ? `xs.b(i.${toCamelCase(attr)},${patchValue})`
871
+ : `i.${toCamelCase(attr)}===undefined?${patchValue}:i.${toCamelCase(attr)}`;
872
+ return str + `${attr}="{{${propValue}}}" `;
873
+ }
874
+ return str + `${attr}="{{i.${toCamelCase(attr)}}}" `;
875
+ }, '');
876
+ }
877
+ buildComponentTemplate(comp, level) {
878
+ return this.focusComponents.has(comp.nodeName)
879
+ ? this.buildFocusComponentTemplte(comp, level)
880
+ : this.buildStandardComponentTemplate(comp, level);
881
+ }
882
+ getChildren(comp, level) {
883
+ const { isSupportRecursive, Adapter, supportXS } = this;
884
+ const nextLevel = isSupportRecursive ? 0 : level + 1;
885
+ const data = !this.isSupportRecursive && supportXS
886
+ ? `${this.dataKeymap('i:item,l:l')}`
887
+ : this.dataKeymap('i:item');
888
+ let child = supportXS
889
+ ? `<template is="{{xs.e(${isSupportRecursive ? 0 : 'cid+1'})}}" data="{{${data}}}" />`
890
+ : `<template is="tmpl_${nextLevel}_${"container" /* Container */}" data="{{${data}}}" />`;
891
+ if (isFunction(this.modifyLoopBody)) {
892
+ child = this.modifyLoopBody(child, comp.nodeName);
893
+ }
894
+ let children = this.voidElements.has(comp.nodeName)
895
+ ? ''
602
896
  : `
603
- <block ${Adapter.for}="{{i.${"cn" /* Childnodes */}}}" ${Adapter.key}="uid">
897
+ <block ${Adapter.for}="{{i.${"cn" /* Childnodes */}}}" ${Adapter.key}="sid">
604
898
  ${indent(child, 6)}
605
899
  </block>
606
- `;
607
- if (isFunction(this.modifyLoopContainer)) {
608
- children = this.modifyLoopContainer(children, comp.nodeName);
609
- }
610
- return children;
611
- }
612
- buildFocusComponentTemplte(comp, level) {
613
- const children = this.getChildren(comp, level);
614
- const attrs = Object.assign({}, comp.attributes);
615
- const templateName = this.supportXS
616
- ? `xs.c(i, 'tmpl_${level}_')`
617
- : `i.focus ? 'tmpl_${level}_${comp.nodeName}_focus' : 'tmpl_${level}_${comp.nodeName}_blur'`;
618
- delete attrs.focus;
900
+ `;
901
+ if (isFunction(this.modifyLoopContainer)) {
902
+ children = this.modifyLoopContainer(children, comp.nodeName);
903
+ }
904
+ return children;
905
+ }
906
+ buildFocusComponentTemplte(comp, level) {
907
+ const children = this.getChildren(comp, level);
908
+ const nodeName = comp.nodeName;
909
+ const nodeAlias = comp.nodeAlias;
910
+ const attrs = Object.assign({}, comp.attributes);
911
+ const templateName = this.supportXS
912
+ ? `xs.c(i, 'tmpl_${level}_')`
913
+ : `i.focus ? 'tmpl_${level}_${nodeAlias}_focus' : 'tmpl_${level}_${nodeAlias}_blur'`;
914
+ delete attrs.focus;
619
915
  let res = `
620
- <template name="tmpl_${level}_${comp.nodeName}">
916
+ <template name="tmpl_${level}_${nodeAlias}">
621
917
  <template is="{{${templateName}}}" data="{{${this.dataKeymap('i:i')}${children ? ',cid:cid' : ''}}}" />
622
918
  </template>
623
919
 
624
- <template name="tmpl_${level}_${comp.nodeName}_focus">
625
- <${comp.nodeName} ${this.buildAttribute(comp.attributes, comp.nodeName)} id="{{i.uid}}">${children}</${comp.nodeName}>
920
+ <template name="tmpl_${level}_${nodeAlias}_focus">
921
+ <${nodeName} ${this.buildAttribute(comp.attributes, nodeName)} id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">${children}</${nodeName}>
626
922
  </template>
627
923
 
628
- <template name="tmpl_${level}_${comp.nodeName}_blur">
629
- <${comp.nodeName} ${this.buildAttribute(attrs, comp.nodeName)} id="{{i.uid}}">${children}</${comp.nodeName}>
924
+ <template name="tmpl_${level}_${nodeAlias}_blur">
925
+ <${nodeName} ${this.buildAttribute(attrs, nodeName)} id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">${children}</${nodeName}>
630
926
  </template>
631
- `;
632
- if (isFunction(this.modifyTemplateResult)) {
633
- res = this.modifyTemplateResult(res, comp.nodeName, level, children);
634
- }
635
- return res;
636
- }
637
- buildStandardComponentTemplate(comp, level) {
638
- const children = this.getChildren(comp, level);
639
- let nodeName = '';
640
- switch (comp.nodeName) {
641
- case 'slot':
642
- case 'slot-view':
643
- case 'catch-view':
644
- case 'static-view':
645
- case 'pure-view':
646
- nodeName = 'view';
647
- break;
648
- case 'static-text':
649
- nodeName = 'text';
650
- break;
651
- case 'static-image':
652
- nodeName = 'image';
653
- break;
654
- default:
655
- nodeName = comp.nodeName;
656
- break;
657
- }
927
+ `;
928
+ if (isFunction(this.modifyTemplateResult)) {
929
+ res = this.modifyTemplateResult(res, nodeName, level, children);
930
+ }
931
+ return res;
932
+ }
933
+ buildStandardComponentTemplate(comp, level) {
934
+ const children = this.getChildren(comp, level);
935
+ const nodeAlias = comp.nodeAlias;
936
+ let nodeName = '';
937
+ switch (comp.nodeName) {
938
+ case 'slot':
939
+ case 'slot-view':
940
+ case 'catch-view':
941
+ case 'static-view':
942
+ case 'pure-view':
943
+ nodeName = 'view';
944
+ break;
945
+ case 'static-text':
946
+ nodeName = 'text';
947
+ break;
948
+ case 'static-image':
949
+ nodeName = 'image';
950
+ break;
951
+ default:
952
+ nodeName = comp.nodeName;
953
+ break;
954
+ }
658
955
  let res = `
659
- <template name="tmpl_${level}_${comp.nodeName}">
660
- <${nodeName} ${this.buildAttribute(comp.attributes, comp.nodeName)} id="{{i.uid}}">${children}</${nodeName}>
956
+ <template name="tmpl_${level}_${nodeAlias}">
957
+ <${nodeName} ${this.buildAttribute(comp.attributes, comp.nodeName)} id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">${children}</${nodeName}>
661
958
  </template>
662
- `;
663
- if (isFunction(this.modifyTemplateResult)) {
664
- res = this.modifyTemplateResult(res, comp.nodeName, level, children);
665
- }
666
- return res;
667
- }
668
- buildPlainTextTemplate(level) {
959
+ `;
960
+ if (isFunction(this.modifyTemplateResult)) {
961
+ res = this.modifyTemplateResult(res, comp.nodeName, level, children);
962
+ }
963
+ return res;
964
+ }
965
+ buildPlainTextTemplate(level) {
669
966
  return `
670
- <template name="tmpl_${level}_#text" data="{{${this.dataKeymap('i:i')}}}">
967
+ <template name="tmpl_${level}_${this.componentsAlias['#text']._num}">
671
968
  <block>{{i.${"v" /* Text */}}}</block>
672
969
  </template>
673
- `;
674
- }
675
- buildThirdPartyTemplate(level, componentConfig) {
676
- const { Adapter, isSupportRecursive, supportXS, nestElements } = this;
677
- const nextLevel = isSupportRecursive ? 0 : level + 1;
678
- let template = '';
679
- const data = !isSupportRecursive && supportXS
680
- ? `${this.dataKeymap('i:item,l:l')}`
681
- : this.dataKeymap('i:item');
682
- componentConfig.thirdPartyComponents.forEach((attrs, compName) => {
683
- if (compName === 'custom-wrapper') {
970
+ `;
971
+ }
972
+ buildThirdPartyTemplate(level, componentConfig) {
973
+ const { Adapter, isSupportRecursive, supportXS, nestElements } = this;
974
+ const nextLevel = isSupportRecursive ? 0 : level + 1;
975
+ let template = '';
976
+ const data = !isSupportRecursive && supportXS
977
+ ? `${this.dataKeymap('i:item,l:l')}`
978
+ : this.dataKeymap('i:item');
979
+ componentConfig.thirdPartyComponents.forEach((attrs, compName) => {
980
+ if (compName === 'custom-wrapper') {
684
981
  template += `
685
982
  <template name="tmpl_${level}_${compName}">
686
- <${compName} i="{{i}}" l="{{l}}" id="{{i.uid}}">
983
+ <${compName} i="{{i}}" l="{{l}}" id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
687
984
  </${compName}>
688
985
  </template>
689
- `;
690
- }
691
- else {
692
- if (!isSupportRecursive && supportXS && nestElements.has(compName) && level + 1 > nestElements.get(compName))
693
- return;
694
- const child = supportXS
695
- ? `<template is="{{xs.e(${isSupportRecursive ? 0 : 'cid+1'})}}" data="{{${data}}}" />`
696
- : `<template is="tmpl_${nextLevel}_${"container" /* Container */}" data="{{${data}}}" />`;
986
+ `;
987
+ }
988
+ else {
989
+ if (!isSupportRecursive && supportXS && nestElements.has(compName) && level + 1 > nestElements.get(compName))
990
+ return;
991
+ let child = supportXS
992
+ ? `<template is="{{xs.e(${isSupportRecursive ? 0 : 'cid+1'})}}" data="{{${data}}}" />`
993
+ : `<template is="tmpl_${nextLevel}_${"container" /* Container */}" data="{{${data}}}" />`;
994
+ if (isFunction(this.modifyThirdPartyLoopBody)) {
995
+ child = this.modifyThirdPartyLoopBody(child, compName);
996
+ }
697
997
  template += `
698
998
  <template name="tmpl_${level}_${compName}">
699
- <${compName} ${this.buildThirdPartyAttr(attrs)} id="{{i.uid}}">
700
- <block ${Adapter.for}="{{i.${"cn" /* Childnodes */}}}" ${Adapter.key}="uid">
999
+ <${compName} ${this.buildThirdPartyAttr(attrs, this.thirdPartyPatcher[compName] || {})} id="{{i.uid||i.sid}}" data-sid="{{i.sid}}">
1000
+ <block ${Adapter.for}="{{i.${"cn" /* Childnodes */}}}" ${Adapter.key}="sid">
701
1001
  ${child}
702
1002
  </block>
703
1003
  </${compName}>
704
1004
  </template>
705
- `;
706
- }
707
- });
708
- return template;
709
- }
710
- buildContainerTemplate(level, restart = false) {
711
- let tmpl = '';
712
- if (restart) {
1005
+ `;
1006
+ }
1007
+ });
1008
+ return template;
1009
+ }
1010
+ buildContainerTemplate(level, restart = false) {
1011
+ let tmpl = '';
1012
+ if (restart) {
713
1013
  tmpl = `<block ${this.Adapter.if}="{{i.nn === '#text'}}">
714
1014
  <template is="tmpl_0_#text" data="{{i:i}}" />
715
1015
  </block>
716
1016
  <block ${this.Adapter.else}>
717
1017
  ${!this.isSupportRecursive && this.supportXS ? '<comp i="{{i}}" l="{{l}}" />' : '<comp i="{{i}}" />'}
718
- </block>`;
719
- }
720
- else {
721
- const xs = !this.isSupportRecursive
722
- ? `xs.a(${level}, i.${"nn" /* NodeName */}, l)`
723
- : `xs.a(${level}, i.${"nn" /* NodeName */})`;
724
- const data = !this.isSupportRecursive
725
- ? `${this.dataKeymap(`i:i,cid:${level},l:xs.f(l,i.${"nn" /* NodeName */})`)}`
726
- : `${this.dataKeymap('i:i')}`;
727
- tmpl = this.supportXS
728
- ? `<template is="{{${xs}}}" data="{{${data}}}" />`
729
- : `<template is="{{'tmpl_${level}_' + i.${"nn" /* NodeName */}}}" data="{{${this.dataKeymap('i:i')}}}" />`;
730
- }
1018
+ </block>`;
1019
+ }
1020
+ else {
1021
+ const xs = !this.isSupportRecursive
1022
+ ? `xs.a(${level}, i.${"nn" /* NodeName */}, l)`
1023
+ : `xs.a(${level}, i.${"nn" /* NodeName */})`;
1024
+ const data = !this.isSupportRecursive
1025
+ ? `${this.dataKeymap(`i:i,cid:${level},l:xs.f(l,i.${"nn" /* NodeName */})`)}`
1026
+ : `${this.dataKeymap('i:i')}`;
1027
+ tmpl = this.supportXS
1028
+ ? `<template is="{{${xs}}}" data="{{${data}}}" />`
1029
+ : `<template is="{{'tmpl_${level}_' + i.${"nn" /* NodeName */}}}" data="{{${this.dataKeymap('i:i')}}}" />`;
1030
+ }
731
1031
  return `
732
1032
  <template name="tmpl_${level}_${"container" /* Container */}">
733
1033
  ${tmpl}
734
1034
  </template>
735
- `;
736
- }
737
- dataKeymap(keymap) {
738
- return keymap;
739
- }
740
- getEvents() {
741
- return events;
742
- }
743
- getAttrValue(value, _key, _nodeName) {
744
- return `{${value}}`;
745
- }
746
- buildXsTemplate() {
747
- return '';
748
- }
749
- mergeComponents(ctx, patch) {
750
- ctx.helper.recursiveMerge(this.internalComponents, patch);
751
- }
752
- buildXSTmplName() {
1035
+ `;
1036
+ }
1037
+ dataKeymap(keymap) {
1038
+ return keymap;
1039
+ }
1040
+ getEvents() {
1041
+ return events;
1042
+ }
1043
+ getAttrValue(value, _key, _nodeName) {
1044
+ return `{${value}}`;
1045
+ }
1046
+ buildXsTemplate() {
1047
+ return '';
1048
+ }
1049
+ mergeComponents(ctx, patch) {
1050
+ ctx.helper.recursiveMerge(this.internalComponents, patch);
1051
+ }
1052
+ mergeThirdPartyComponents(patch) {
1053
+ this.thirdPartyPatcher = patch;
1054
+ }
1055
+ buildXSTmplName() {
753
1056
  return `function (l, n) {
754
1057
  return 'tmpl_' + l + '_' + n
755
- }`;
756
- }
757
- buildXSTepFocus(nn) {
1058
+ }`;
1059
+ }
1060
+ buildXSTepFocus(nn) {
758
1061
  return `function(i, prefix) {
759
1062
  var s = i.focus !== undefined ? 'focus' : 'blur'
760
1063
  return prefix + i.${nn} + '_' + s
761
- }`;
762
- }
763
- buildXSTmpExtra() {
764
- return '';
765
- }
766
- }
767
- class RecursiveTemplate extends BaseTemplate {
768
- constructor() {
769
- super(...arguments);
770
- this.isSupportRecursive = true;
771
- this.buildTemplate = (componentConfig) => {
772
- let template = this.buildBaseTemplate();
773
- if (!this.miniComponents) {
774
- this.miniComponents = this.createMiniComponents(this.internalComponents);
775
- }
776
- const ZERO_FLOOR = 0;
777
- const components = Object.keys(this.miniComponents)
778
- .filter(c => componentConfig.includes.size && !componentConfig.includeAll ? componentConfig.includes.has(c) : true);
779
- template = components.reduce((current, nodeName) => {
780
- const attributes = this.miniComponents[nodeName];
781
- return current + this.buildComponentTemplate({ nodeName, attributes }, ZERO_FLOOR);
782
- }, template);
783
- template += this.buildPlainTextTemplate(ZERO_FLOOR);
784
- template += this.buildThirdPartyTemplate(ZERO_FLOOR, componentConfig);
785
- template += this.buildContainerTemplate(ZERO_FLOOR);
786
- return template;
787
- };
788
- }
789
- }
790
- class UnRecursiveTemplate extends BaseTemplate {
791
- constructor() {
792
- super(...arguments);
793
- this.isSupportRecursive = false;
794
- this._baseLevel = 16;
795
- this.buildTemplate = (componentConfig) => {
796
- this.componentConfig = componentConfig;
797
- if (!this.miniComponents) {
798
- this.miniComponents = this.createMiniComponents(this.internalComponents);
799
- }
800
- const components = Object.keys(this.miniComponents)
801
- .filter(c => componentConfig.includes.size && !componentConfig.includeAll ? componentConfig.includes.has(c) : true);
802
- let template = this.buildBaseTemplate();
803
- for (let i = 0; i < this.baseLevel; i++) {
804
- template += this.supportXS
805
- ? this.buildOptimizeFloor(i, components, this.baseLevel === i + 1)
806
- : this.buildFloor(i, components, this.baseLevel === i + 1);
807
- }
808
- return template;
809
- };
810
- }
811
- set baseLevel(lv) {
812
- this._baseLevel = lv;
813
- }
814
- get baseLevel() {
815
- return this._baseLevel;
816
- }
817
- buildFloor(level, components, restart = false) {
818
- if (restart)
819
- return this.buildContainerTemplate(level, restart);
820
- let template = components.reduce((current, nodeName) => {
821
- const attributes = this.miniComponents[nodeName];
822
- return current + this.buildComponentTemplate({ nodeName, attributes }, level);
823
- }, '');
824
- template += this.buildPlainTextTemplate(level);
825
- template += this.buildThirdPartyTemplate(level, this.componentConfig);
826
- template += this.buildContainerTemplate(level, restart);
827
- return template;
828
- }
829
- buildOptimizeFloor(level, components, restart = false) {
830
- if (restart)
831
- return this.buildContainerTemplate(level, restart);
832
- let template = components.reduce((current, nodeName) => {
833
- if (level !== 0) {
834
- if (!this.nestElements.has(nodeName)) {
835
- // 不可嵌套自身的组件只需输出一层模板
836
- return current;
837
- }
838
- else {
839
- // 部分可嵌套自身的组件实际上不会嵌套过深,这里按阈值限制层数
840
- const max = this.nestElements.get(nodeName);
841
- if (max > 0 && level >= max) {
842
- return current;
843
- }
844
- }
845
- }
846
- const attributes = this.miniComponents[nodeName];
847
- return current + this.buildComponentTemplate({ nodeName, attributes }, level);
848
- }, '');
849
- if (level === 0)
850
- template += this.buildPlainTextTemplate(level);
851
- template += this.buildThirdPartyTemplate(level, this.componentConfig);
852
- template += this.buildContainerTemplate(level);
853
- return template;
854
- }
855
- buildXSTmplName() {
856
- const isLoopComps = [
857
- ...Array.from(this.nestElements.keys()),
858
- ...Array.from(this.componentConfig.thirdPartyComponents.keys())
859
- ];
860
- const isLoopCompsSet = new Set(isLoopComps);
861
- const hasMaxComps = [];
862
- this.nestElements.forEach((max, comp) => {
863
- if (max > 1) {
864
- hasMaxComps.push(comp);
865
- }
866
- else if (max === 1 && isLoopCompsSet.has(comp)) {
867
- isLoopCompsSet.delete(comp);
868
- }
869
- });
1064
+ }`;
1065
+ }
1066
+ buildXSTmpExtra() {
1067
+ return '';
1068
+ }
1069
+ }
1070
+ class RecursiveTemplate extends BaseTemplate {
1071
+ constructor() {
1072
+ super(...arguments);
1073
+ this.isSupportRecursive = true;
1074
+ this.buildTemplate = (componentConfig) => {
1075
+ let template = this.buildBaseTemplate();
1076
+ if (!this.miniComponents) {
1077
+ this.componentsAlias = getComponentsAlias(this.internalComponents);
1078
+ this.miniComponents = this.createMiniComponents(this.internalComponents);
1079
+ }
1080
+ const ZERO_FLOOR = 0;
1081
+ const components = Object.keys(this.miniComponents)
1082
+ .filter(c => componentConfig.includes.size && !componentConfig.includeAll ? componentConfig.includes.has(c) : true);
1083
+ template = components.reduce((current, nodeName) => {
1084
+ const attributes = this.miniComponents[nodeName];
1085
+ const nodeAlias = this.componentsAlias[nodeName]._num;
1086
+ return current + this.buildComponentTemplate({ nodeName, nodeAlias, attributes }, ZERO_FLOOR);
1087
+ }, template);
1088
+ template += this.buildPlainTextTemplate(ZERO_FLOOR);
1089
+ template += this.buildThirdPartyTemplate(ZERO_FLOOR, componentConfig);
1090
+ template += this.buildContainerTemplate(ZERO_FLOOR);
1091
+ return template;
1092
+ };
1093
+ }
1094
+ }
1095
+ class UnRecursiveTemplate extends BaseTemplate {
1096
+ constructor() {
1097
+ super(...arguments);
1098
+ this.isSupportRecursive = false;
1099
+ this._baseLevel = 16;
1100
+ this.buildTemplate = (componentConfig) => {
1101
+ this.componentConfig = componentConfig;
1102
+ if (!this.miniComponents) {
1103
+ this.componentsAlias = getComponentsAlias(this.internalComponents);
1104
+ this.miniComponents = this.createMiniComponents(this.internalComponents);
1105
+ }
1106
+ const components = Object.keys(this.miniComponents)
1107
+ .filter(c => componentConfig.includes.size && !componentConfig.includeAll ? componentConfig.includes.has(c) : true);
1108
+ let template = this.buildBaseTemplate();
1109
+ for (let i = 0; i < this.baseLevel; i++) {
1110
+ template += this.supportXS
1111
+ ? this.buildOptimizeFloor(i, components, this.baseLevel === i + 1)
1112
+ : this.buildFloor(i, components, this.baseLevel === i + 1);
1113
+ }
1114
+ return template;
1115
+ };
1116
+ }
1117
+ set baseLevel(lv) {
1118
+ this._baseLevel = lv;
1119
+ }
1120
+ get baseLevel() {
1121
+ return this._baseLevel;
1122
+ }
1123
+ buildFloor(level, components, restart = false) {
1124
+ if (restart)
1125
+ return this.buildContainerTemplate(level, restart);
1126
+ let template = components.reduce((current, nodeName) => {
1127
+ const attributes = this.miniComponents[nodeName];
1128
+ const nodeAlias = this.componentsAlias[nodeName]._num;
1129
+ return current + this.buildComponentTemplate({ nodeName, nodeAlias, attributes }, level);
1130
+ }, '');
1131
+ template += this.buildPlainTextTemplate(level);
1132
+ template += this.buildThirdPartyTemplate(level, this.componentConfig);
1133
+ template += this.buildContainerTemplate(level, restart);
1134
+ return template;
1135
+ }
1136
+ buildOptimizeFloor(level, components, restart = false) {
1137
+ if (restart)
1138
+ return this.buildContainerTemplate(level, restart);
1139
+ let template = components.reduce((current, nodeName) => {
1140
+ if (level !== 0) {
1141
+ if (!this.nestElements.has(nodeName)) {
1142
+ // 不可嵌套自身的组件只需输出一层模板
1143
+ return current;
1144
+ }
1145
+ else {
1146
+ // 部分可嵌套自身的组件实际上不会嵌套过深,这里按阈值限制层数
1147
+ const max = this.nestElements.get(nodeName);
1148
+ if (max > 0 && level >= max) {
1149
+ return current;
1150
+ }
1151
+ }
1152
+ }
1153
+ const attributes = this.miniComponents[nodeName];
1154
+ const nodeAlias = this.componentsAlias[nodeName]._num;
1155
+ return current + this.buildComponentTemplate({ nodeName, nodeAlias, attributes }, level);
1156
+ }, '');
1157
+ if (level === 0)
1158
+ template += this.buildPlainTextTemplate(level);
1159
+ template += this.buildThirdPartyTemplate(level, this.componentConfig);
1160
+ template += this.buildContainerTemplate(level);
1161
+ return template;
1162
+ }
1163
+ buildXSTmplName() {
1164
+ const isLoopComps = [
1165
+ ...Array.from(this.nestElements.keys()),
1166
+ ...Array.from(this.componentConfig.thirdPartyComponents.keys())
1167
+ ];
1168
+ const isLoopCompsSet = new Set(isLoopComps);
1169
+ const hasMaxComps = [];
1170
+ this.nestElements.forEach((max, comp) => {
1171
+ if (max > 1) {
1172
+ hasMaxComps.push(comp);
1173
+ }
1174
+ else if (max === 1 && isLoopCompsSet.has(comp)) {
1175
+ isLoopCompsSet.delete(comp);
1176
+ }
1177
+ });
1178
+ const componentsAlias = this.componentsAlias;
1179
+ const listA = Array.from(isLoopCompsSet).map(item => { var _a; return ((_a = componentsAlias[item]) === null || _a === void 0 ? void 0 : _a._num) || item; });
1180
+ const listB = hasMaxComps.map(item => { var _a; return ((_a = componentsAlias[item]) === null || _a === void 0 ? void 0 : _a._num) || item; });
870
1181
  return `function (l, n, s) {
871
- var a = ${JSON.stringify(Array.from(isLoopCompsSet))}
872
- var b = ${JSON.stringify(hasMaxComps)}
1182
+ var a = ${JSON.stringify(listA)}
1183
+ var b = ${JSON.stringify(listB)}
873
1184
  if (a.indexOf(n) === -1) {
874
1185
  l = 0
875
1186
  }
@@ -882,23 +1193,25 @@ class UnRecursiveTemplate extends BaseTemplate {
882
1193
  l = depth
883
1194
  }
884
1195
  return 'tmpl_' + l + '_' + n
885
- }`;
886
- }
887
- buildXSTmpExtra() {
888
- const hasMaxComps = [];
889
- this.nestElements.forEach((max, comp) => {
890
- if (max > 1)
891
- hasMaxComps.push(comp);
892
- });
1196
+ }`;
1197
+ }
1198
+ buildXSTmpExtra() {
1199
+ const hasMaxComps = [];
1200
+ this.nestElements.forEach((max, comp) => {
1201
+ if (max > 1)
1202
+ hasMaxComps.push(comp);
1203
+ });
1204
+ const componentsAlias = this.componentsAlias;
1205
+ const listA = hasMaxComps.map(item => { var _a; return ((_a = componentsAlias[item]) === null || _a === void 0 ? void 0 : _a._num) || item; });
893
1206
  return `f: function (l, n) {
894
- var b = ${JSON.stringify(hasMaxComps)}
1207
+ var b = ${JSON.stringify(listA)}
895
1208
  if (b.indexOf(n) > -1) {
896
1209
  if (l) l += ','
897
1210
  l += n
898
1211
  }
899
1212
  return l
900
- }`;
901
- }
1213
+ }`;
1214
+ }
902
1215
  }
903
1216
 
904
1217
  exports.BaseTemplate = BaseTemplate;