glass-easel-miniprogram-adapter 0.1.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 (50) hide show
  1. package/README.md +49 -0
  2. package/dist/glass_easel_miniprogram_adapter.d.ts +1 -0
  3. package/dist/glass_easel_miniprogram_adapter.js +2 -0
  4. package/dist/glass_easel_miniprogram_adapter.js.map +1 -0
  5. package/dist/types/src/backend.d.ts +51 -0
  6. package/dist/types/src/backend.d.ts.map +1 -0
  7. package/dist/types/src/behavior.d.ts +35 -0
  8. package/dist/types/src/behavior.d.ts.map +1 -0
  9. package/dist/types/src/component.d.ts +160 -0
  10. package/dist/types/src/component.d.ts.map +1 -0
  11. package/dist/types/src/index.d.ts +58 -0
  12. package/dist/types/src/index.d.ts.map +1 -0
  13. package/dist/types/src/selector_query.d.ts +98 -0
  14. package/dist/types/src/selector_query.d.ts.map +1 -0
  15. package/dist/types/src/space.d.ts +369 -0
  16. package/dist/types/src/space.d.ts.map +1 -0
  17. package/dist/types/src/types.d.ts +77 -0
  18. package/dist/types/src/types.d.ts.map +1 -0
  19. package/dist/types/src/utils.d.ts +2 -0
  20. package/dist/types/src/utils.d.ts.map +1 -0
  21. package/dist/types/tests/base/env.d.ts +3 -0
  22. package/dist/types/tests/base/env.d.ts.map +1 -0
  23. package/dist/types/tests/data_update.test.d.ts +2 -0
  24. package/dist/types/tests/data_update.test.d.ts.map +1 -0
  25. package/dist/types/tests/env.test.d.ts +2 -0
  26. package/dist/types/tests/env.test.d.ts.map +1 -0
  27. package/dist/types/tests/selector.test.d.ts +2 -0
  28. package/dist/types/tests/selector.test.d.ts.map +1 -0
  29. package/dist/types/tests/space.test.d.ts +2 -0
  30. package/dist/types/tests/space.test.d.ts.map +1 -0
  31. package/dist/types/tests/trait_behavior.test.d.ts +2 -0
  32. package/dist/types/tests/trait_behavior.test.d.ts.map +1 -0
  33. package/jest.config.js +13 -0
  34. package/package.json +32 -0
  35. package/src/backend.ts +106 -0
  36. package/src/behavior.ts +101 -0
  37. package/src/component.ts +476 -0
  38. package/src/index.ts +82 -0
  39. package/src/selector_query.ts +356 -0
  40. package/src/space.ts +1514 -0
  41. package/src/types.ts +85 -0
  42. package/src/utils.ts +3 -0
  43. package/tests/base/env.ts +20 -0
  44. package/tests/data_update.test.ts +92 -0
  45. package/tests/env.test.ts +141 -0
  46. package/tests/selector.test.ts +407 -0
  47. package/tests/space.test.ts +953 -0
  48. package/tests/trait_behavior.test.ts +141 -0
  49. package/tsconfig.json +11 -0
  50. package/webpack.config.js +78 -0
@@ -0,0 +1,407 @@
1
+ import * as glassEasel from 'glass-easel'
2
+ import { tmpl } from './base/env'
3
+ import {
4
+ MiniProgramEnv,
5
+ } from '../src'
6
+
7
+ const domHtml = (elem: glassEasel.Element): string => {
8
+ const domElem = elem.getBackendElement() as unknown as Element
9
+ return domElem.innerHTML
10
+ }
11
+
12
+ describe('selector query', () => {
13
+ test('select single component (without custom export)', () => {
14
+ const env = new MiniProgramEnv()
15
+ const codeSpace = env.createCodeSpace('', true)
16
+
17
+ codeSpace.addComponentStaticConfig('child/comp', {
18
+ component: true,
19
+ })
20
+ codeSpace.addCompiledTemplate('child/comp', tmpl('{{a}}'))
21
+ // eslint-disable-next-line arrow-body-style
22
+ const childDef = codeSpace.componentEnv('child/comp', ({ Component }) => {
23
+ return Component()
24
+ .lifetime('attached', function () {
25
+ // eslint-disable-next-line no-use-before-define
26
+ const owner = this.selectOwnerComponent(selfDef)!
27
+ owner.update()
28
+ expect(this.selectOwnerComponent()).toBe(owner)
29
+ // eslint-disable-next-line no-use-before-define
30
+ expect(owner.general().asInstanceOf(selfDef)).toBe(owner)
31
+ expect(owner.general().asInstanceOf(childDef)).toBe(null)
32
+ expect(this.selectOwnerComponent(childDef)).toBe(null)
33
+ })
34
+ .data(() => ({
35
+ a: 123,
36
+ }))
37
+ .register()
38
+ })
39
+
40
+ codeSpace.addComponentStaticConfig('path/to/comp', {
41
+ usingComponents: {
42
+ child: '/child/comp',
43
+ },
44
+ })
45
+ codeSpace.addCompiledTemplate('path/to/comp', tmpl(`
46
+ <div>
47
+ <child id="c1" />
48
+ <child id="c2" data-a="A" />
49
+ </div>
50
+ `))
51
+ // eslint-disable-next-line arrow-body-style
52
+ const selfDef = codeSpace.componentEnv('path/to/comp', ({ Component }) => {
53
+ return Component()
54
+ .methods({
55
+ update() {
56
+ // eslint-disable-next-line
57
+ this.selectComponent('#c1').setData({ a: 456 })
58
+ const c2 = this.selectComponent('#c2', childDef)!
59
+ expect(c2.is).toBe('child/comp')
60
+ expect(c2.id).toBe('c2')
61
+ expect(c2.dataset).toStrictEqual({ a: 'A' })
62
+ c2.setData({ a: 789 })
63
+ expect(this.selectComponent('#c2', selfDef)).toBe(null)
64
+ expect(this.selectComponent('#c3')).toBe(null)
65
+ expect(this.selectOwnerComponent()).toBe(null)
66
+ },
67
+ })
68
+ .register()
69
+ })
70
+
71
+ const ab = env.associateBackend()
72
+ const root = ab.createRoot('body', codeSpace, 'path/to/comp')
73
+ glassEasel.Element.pretendAttached(root.getComponent())
74
+ expect(domHtml(root.getComponent())).toBe('<div><child>456</child><child>789</child></div>')
75
+ })
76
+
77
+ test('select single component (with custom export)', () => {
78
+ const env = new MiniProgramEnv()
79
+ const codeSpace = env.createCodeSpace('', true)
80
+
81
+ codeSpace.addComponentStaticConfig('child/comp', {
82
+ component: true,
83
+ })
84
+ codeSpace.addCompiledTemplate('child/comp', tmpl('{{a}}'))
85
+ // eslint-disable-next-line arrow-body-style
86
+ const childDef = codeSpace.componentEnv('child/comp', ({ Component }) => {
87
+ return Component()
88
+ .data(() => ({
89
+ a: 123,
90
+ }))
91
+ .export(function () {
92
+ return {
93
+ set: (d: { a: number }) => {
94
+ this.setData(d)
95
+ },
96
+ }
97
+ })
98
+ .register()
99
+ })
100
+
101
+ codeSpace.addComponentStaticConfig('path/to/comp', {
102
+ usingComponents: {
103
+ child: '/child/comp',
104
+ },
105
+ })
106
+ codeSpace.addCompiledTemplate('path/to/comp', tmpl(`
107
+ <div id="d">
108
+ <child id="c1" />
109
+ <child id="c2" />
110
+ </div>
111
+ `))
112
+ codeSpace.componentEnv('path/to/comp', ({ Component }) => {
113
+ const selfDef = Component()
114
+ .lifetime('attached', function () {
115
+ // eslint-disable-next-line
116
+ this.selectComponent('#c1').set({ a: 456 })
117
+ this.selectComponent('#c2', childDef)!.set({ a: 789 })
118
+ expect(this.selectComponent('#c2', selfDef)).toBe(null)
119
+ expect(this.selectComponent('#d')).toBe(null)
120
+ })
121
+ .register()
122
+ })
123
+
124
+ const ab = env.associateBackend()
125
+ const root = ab.createRoot('body', codeSpace, 'path/to/comp')
126
+ glassEasel.Element.pretendAttached(root.getComponent())
127
+ expect(domHtml(root.getComponent())).toBe('<div><child>456</child><child>789</child></div>')
128
+ })
129
+
130
+ test('select all components', () => {
131
+ const env = new MiniProgramEnv()
132
+ const codeSpace = env.createCodeSpace('', true)
133
+
134
+ codeSpace.addComponentStaticConfig('child/comp', {
135
+ component: true,
136
+ })
137
+ codeSpace.addCompiledTemplate('child/comp', tmpl('{{a}}'))
138
+ // eslint-disable-next-line arrow-body-style
139
+ const childDef = codeSpace.componentEnv('child/comp', ({ Component }) => {
140
+ return Component()
141
+ .data(() => ({
142
+ a: 123,
143
+ }))
144
+ .register()
145
+ })
146
+
147
+ codeSpace.addComponentStaticConfig('child/comp2', {
148
+ component: true,
149
+ })
150
+ codeSpace.addCompiledTemplate('child/comp2', tmpl('{{a}}'))
151
+ // eslint-disable-next-line arrow-body-style
152
+ codeSpace.componentEnv('child/comp2', ({ Component }) => {
153
+ Component()
154
+ .data(() => ({
155
+ a: 456,
156
+ }))
157
+ .register()
158
+ })
159
+
160
+ codeSpace.addComponentStaticConfig('path/to/comp', {
161
+ usingComponents: {
162
+ child: '/child/comp',
163
+ 'child-b': '/child/comp2',
164
+ },
165
+ })
166
+ codeSpace.addCompiledTemplate('path/to/comp', tmpl(`
167
+ <div id="d">
168
+ <child class="c" />
169
+ <child class="c" />
170
+ <child-b class="c" />
171
+ </div>
172
+ `))
173
+ codeSpace.componentEnv('path/to/comp', ({ Component }) => {
174
+ const selfDef = Component()
175
+ .lifetime('attached', function () {
176
+ // eslint-disable-next-line
177
+ this.selectAllComponents('.c').forEach((item, i) => item.setData({ a: i }))
178
+ this.selectAllComponents('.c', childDef).forEach((item, i) => item.setData({ a: i }))
179
+ expect(this.selectAllComponents('.c', childDef).length).toBe(2)
180
+ expect(this.selectAllComponents('.c', selfDef)).toStrictEqual([])
181
+ })
182
+ .register()
183
+ })
184
+
185
+ const ab = env.associateBackend()
186
+ const root = ab.createRoot('body', codeSpace, 'path/to/comp')
187
+ glassEasel.Element.pretendAttached(root.getComponent())
188
+ expect(domHtml(root.getComponent()))
189
+ .toBe('<div><child class="c">0</child><child class="c">1</child><child-b class="c">2</child-b></div>')
190
+ })
191
+
192
+ test('query single element info', () => new Promise<any[]>((resolve) => {
193
+ const env = new MiniProgramEnv()
194
+ const codeSpace = env.createCodeSpace('', true)
195
+ const resList = [] as any[]
196
+
197
+ codeSpace.addComponentStaticConfig('child/comp', {
198
+ component: true,
199
+ })
200
+ codeSpace.addCompiledTemplate('child/comp', tmpl('{{a}}'))
201
+ codeSpace.componentEnv('child/comp', ({ Component }) => {
202
+ Component()
203
+ .property('p', String)
204
+ .register()
205
+ })
206
+
207
+ codeSpace.addComponentStaticConfig('path/to/comp', {
208
+ usingComponents: {
209
+ child: '/child/comp',
210
+ },
211
+ })
212
+ codeSpace.addCompiledTemplate('path/to/comp', tmpl(`
213
+ <div data-a="{{ 1 }}" mark:a="a2">
214
+ <span id="bb" class="s" data-b="{{ 1 }}" mark:b="b2" />
215
+ <child id="cc" class="s" data-c="{{ 1 }}" mark:c="c2" p="123" />
216
+ </div>
217
+ `))
218
+ codeSpace.componentEnv('path/to/comp', ({ Component }) => {
219
+ Component()
220
+ .lifetime('attached', function () {
221
+ this.createSelectorQuery()
222
+ .select('.invalid')
223
+ .fields({})
224
+ .select('.s')
225
+ .boundingClientRect((res) => {
226
+ expect(res.id).toBe('bb')
227
+ expect(res.dataset).toStrictEqual({ b: 1 })
228
+ expect(typeof res.left).toBe('number')
229
+ expect(typeof res.top).toBe('number')
230
+ expect(typeof res.right).toBe('number')
231
+ expect(typeof res.bottom).toBe('number')
232
+ expect(typeof res.width).toBe('number')
233
+ expect(typeof res.height).toBe('number')
234
+ resList.push(res)
235
+ })
236
+ .select('#bb')
237
+ .scrollOffset((res) => {
238
+ expect(res.id).toBe('bb')
239
+ expect(res.dataset).toStrictEqual({ b: 1 })
240
+ expect(typeof res.scrollLeft).toBe('number')
241
+ expect(typeof res.scrollTop).toBe('number')
242
+ expect(typeof res.scrollWidth).toBe('number')
243
+ expect(typeof res.scrollHeight).toBe('number')
244
+ resList.push(res)
245
+ })
246
+ .select('#cc')
247
+ .fields({
248
+ mark: true,
249
+ rect: true,
250
+ size: true,
251
+ scrollOffset: true,
252
+ properties: ['p'],
253
+ }, (res) => {
254
+ expect(res.id).toBe(undefined)
255
+ expect(res.dataset).toBe(undefined)
256
+ expect(res.mark).toStrictEqual({ a: 'a2', c: 'c2' })
257
+ expect(typeof res.left).toBe('number')
258
+ expect(typeof res.top).toBe('number')
259
+ expect(typeof res.right).toBe('number')
260
+ expect(typeof res.bottom).toBe('number')
261
+ expect(typeof res.width).toBe('number')
262
+ expect(typeof res.height).toBe('number')
263
+ expect(typeof res.scrollLeft).toBe('number')
264
+ expect(typeof res.scrollTop).toBe('number')
265
+ expect(typeof res.scrollWidth).toBe('number')
266
+ expect(typeof res.scrollHeight).toBe('number')
267
+ expect(res.p).toBe('123')
268
+ resList.push(res)
269
+ })
270
+ .in(this.selectComponent('#cc'))
271
+ .select('#cc')
272
+ .boundingClientRect((res) => {
273
+ expect(res).toBe(null)
274
+ })
275
+ .exec((r) => {
276
+ r.shift()
277
+ r.pop()
278
+ expect(r).toStrictEqual(resList)
279
+ this.createSelectorQuery()
280
+ .exec(() => {
281
+ resolve(resList)
282
+ })
283
+ })
284
+ })
285
+ .register()
286
+ })
287
+
288
+ const ab = env.associateBackend()
289
+ const root = ab.createRoot('body', codeSpace, 'path/to/comp')
290
+ glassEasel.Element.pretendAttached(root.getComponent())
291
+ }).then((resList: any[]) => {
292
+ expect(resList.length).toBe(3)
293
+ return undefined
294
+ }))
295
+
296
+ test('query multiple element info', () => new Promise<undefined>((resolve) => {
297
+ const env = new MiniProgramEnv()
298
+ const codeSpace = env.createCodeSpace('', true)
299
+
300
+ codeSpace.addComponentStaticConfig('child/comp', {
301
+ component: true,
302
+ })
303
+ codeSpace.addCompiledTemplate('child/comp', tmpl('{{a}}'))
304
+ codeSpace.componentEnv('child/comp', ({ Component }) => {
305
+ Component()
306
+ .options({
307
+ propertyPassingDeepCopy: glassEasel.DeepCopyKind.None,
308
+ })
309
+ .property('p', {
310
+ type: Array,
311
+ value: [1, 2, 3],
312
+ })
313
+ .register()
314
+ })
315
+
316
+ codeSpace.addComponentStaticConfig('path/to/comp', {
317
+ usingComponents: {
318
+ child: '/child/comp',
319
+ },
320
+ })
321
+ codeSpace.addCompiledTemplate('path/to/comp', tmpl(`
322
+ <div data-a="{{ 1 }}" mark:a="a2">
323
+ <span id="bb" class="s" data-b="{{ 1 }}" mark:b="b2" />
324
+ <child id="cc" class="s" data-c="{{ 1 }}" mark:c="c2" />
325
+ </div>
326
+ `))
327
+ codeSpace.componentEnv('path/to/comp', ({ Component }) => {
328
+ Component()
329
+ .lifetime('attached', function () {
330
+ this.createSelectorQuery()
331
+ .selectAll('.s')
332
+ .fields({
333
+ mark: true,
334
+ properties: ['p'],
335
+ }, (res) => {
336
+ expect(res).toStrictEqual([{
337
+ mark: {
338
+ a: 'a2',
339
+ b: 'b2',
340
+ },
341
+ }, {
342
+ mark: {
343
+ a: 'a2',
344
+ c: 'c2',
345
+ },
346
+ p: [1, 2, 3],
347
+ }])
348
+ // eslint-disable-next-line @typescript-eslint/no-unsafe-member-access
349
+ expect(res[1]!.p).toBe(this.selectComponent('#cc').data.p)
350
+ resolve(undefined)
351
+ })
352
+ .exec()
353
+ })
354
+ .register()
355
+ })
356
+
357
+ const ab = env.associateBackend()
358
+ const root = ab.createRoot('body', codeSpace, 'path/to/comp')
359
+ glassEasel.Element.pretendAttached(root.getComponent())
360
+ }))
361
+
362
+ test('query viewport info', () => new Promise<undefined>((resolve) => {
363
+ const env = new MiniProgramEnv()
364
+ const codeSpace = env.createCodeSpace('', true)
365
+
366
+ codeSpace.addComponentStaticConfig('path/to/comp', {})
367
+ codeSpace.addCompiledTemplate('path/to/comp', tmpl(''))
368
+ codeSpace.componentEnv('path/to/comp', ({ Component }) => {
369
+ Component()
370
+ .lifetime('attached', function () {
371
+ this.createSelectorQuery()
372
+ .selectViewport()
373
+ .fields({
374
+ id: true,
375
+ dataset: true,
376
+ mark: true,
377
+ rect: true,
378
+ size: true,
379
+ scrollOffset: true,
380
+ properties: ['p'],
381
+ }, (res) => {
382
+ expect(res.id).toBe('')
383
+ expect(res.dataset).toStrictEqual({})
384
+ expect(res.mark).toStrictEqual({})
385
+ expect(typeof res.left).toBe('number')
386
+ expect(typeof res.top).toBe('number')
387
+ expect(typeof res.right).toBe('number')
388
+ expect(typeof res.bottom).toBe('number')
389
+ expect(typeof res.width).toBe('number')
390
+ expect(typeof res.height).toBe('number')
391
+ expect(typeof res.scrollLeft).toBe('number')
392
+ expect(typeof res.scrollTop).toBe('number')
393
+ expect(typeof res.scrollWidth).toBe('number')
394
+ expect(typeof res.scrollHeight).toBe('number')
395
+ expect(res.p).toBe(undefined)
396
+ resolve(undefined)
397
+ })
398
+ .exec()
399
+ })
400
+ .register()
401
+ })
402
+
403
+ const ab = env.associateBackend()
404
+ const root = ab.createRoot('body', codeSpace, 'path/to/comp')
405
+ glassEasel.Element.pretendAttached(root.getComponent())
406
+ }))
407
+ })