@knowark/componarkjs 1.13.3 → 1.14.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/lib/base/component/component.js +17 -1
  2. package/lib/base/component/component.test.js +475 -389
  3. package/lib/base/utils/define.js +28 -6
  4. package/lib/base/utils/define.test.js +129 -42
  5. package/lib/base/utils/format.test.js +16 -16
  6. package/lib/base/utils/helpers.js +11 -4
  7. package/lib/base/utils/helpers.test.js +134 -115
  8. package/lib/base/utils/slots.test.js +38 -38
  9. package/lib/base/utils/uuid.test.js +13 -13
  10. package/lib/components/audio/components/audio.js +22 -3
  11. package/lib/components/audio/components/audio.test.js +120 -90
  12. package/lib/components/camera/components/camera.js +8 -3
  13. package/lib/components/camera/components/camera.test.js +96 -91
  14. package/lib/components/capture/components/capture.js +33 -5
  15. package/lib/components/capture/components/capture.test.js +165 -97
  16. package/lib/components/droparea/components/droparea-preview.js +66 -15
  17. package/lib/components/droparea/components/droparea-preview.test.js +262 -78
  18. package/lib/components/droparea/components/droparea.js +47 -8
  19. package/lib/components/droparea/components/droparea.test.js +309 -298
  20. package/lib/components/emit/components/emit.js +24 -4
  21. package/lib/components/emit/components/emit.test.js +192 -134
  22. package/lib/components/index.js +1 -1
  23. package/lib/components/list/components/{list.item.js → item.js} +1 -1
  24. package/lib/components/list/components/item.test.js +70 -69
  25. package/lib/components/list/components/list.js +35 -5
  26. package/lib/components/list/components/list.test.js +358 -227
  27. package/lib/components/list/index.js +1 -1
  28. package/lib/components/paginator/components/paginator.js +3 -2
  29. package/lib/components/paginator/components/paginator.test.js +146 -143
  30. package/lib/components/spinner/components/spinner.js +1 -1
  31. package/lib/components/spinner/components/spinner.test.js +36 -41
  32. package/lib/components/splitview/components/splitview.detail.js +1 -1
  33. package/lib/components/splitview/components/splitview.detail.test.js +78 -74
  34. package/lib/components/splitview/components/splitview.js +40 -10
  35. package/lib/components/splitview/components/splitview.master.js +29 -3
  36. package/lib/components/splitview/components/splitview.master.test.js +52 -52
  37. package/lib/components/splitview/components/splitview.test.js +136 -32
  38. package/lib/components/translate/components/translate.js +32 -10
  39. package/lib/components/translate/components/translate.test.js +492 -133
  40. package/package.json +7 -27
  41. package/scripts/node-test-setup.js +94 -0
  42. package/showcase/components/index.html +1 -1
  43. package/{jsconfig.json → tsconfig.json} +6 -4
  44. package/types/base/component/component.d.ts +48 -0
  45. package/types/base/component/component.d.ts.map +1 -0
  46. package/types/base/component/component.test.d.ts +2 -0
  47. package/types/base/component/component.test.d.ts.map +1 -0
  48. package/types/base/component/index.d.ts +8 -0
  49. package/types/base/component/index.d.ts.map +1 -0
  50. package/types/base/index.d.ts +2 -0
  51. package/types/base/index.d.ts.map +1 -0
  52. package/types/base/styles/index.d.ts +3 -0
  53. package/types/base/styles/index.d.ts.map +1 -0
  54. package/types/base/styles/styles.d.ts +3 -0
  55. package/types/base/styles/styles.d.ts.map +1 -0
  56. package/types/base/utils/define.d.ts +5 -0
  57. package/types/base/utils/define.d.ts.map +1 -0
  58. package/types/base/utils/define.test.d.ts +2 -0
  59. package/types/base/utils/define.test.d.ts.map +1 -0
  60. package/types/base/utils/format.d.ts +13 -0
  61. package/types/base/utils/format.d.ts.map +1 -0
  62. package/types/base/utils/format.test.d.ts +2 -0
  63. package/types/base/utils/format.test.d.ts.map +1 -0
  64. package/types/base/utils/helpers.d.ts +11 -0
  65. package/types/base/utils/helpers.d.ts.map +1 -0
  66. package/types/base/utils/helpers.test.d.ts +2 -0
  67. package/types/base/utils/helpers.test.d.ts.map +1 -0
  68. package/types/base/utils/index.d.ts +6 -0
  69. package/types/base/utils/index.d.ts.map +1 -0
  70. package/types/base/utils/slots.d.ts +15 -0
  71. package/types/base/utils/slots.d.ts.map +1 -0
  72. package/types/base/utils/slots.test.d.ts +2 -0
  73. package/types/base/utils/slots.test.d.ts.map +1 -0
  74. package/types/base/utils/uuid.d.ts +3 -0
  75. package/types/base/utils/uuid.d.ts.map +1 -0
  76. package/types/base/utils/uuid.test.d.ts +2 -0
  77. package/types/base/utils/uuid.test.d.ts.map +1 -0
  78. package/types/components/audio/components/audio.d.ts +18 -0
  79. package/types/components/audio/components/audio.d.ts.map +1 -0
  80. package/types/components/audio/components/audio.test.d.ts +2 -0
  81. package/types/components/audio/components/audio.test.d.ts.map +1 -0
  82. package/types/components/audio/index.d.ts +2 -0
  83. package/types/components/audio/index.d.ts.map +1 -0
  84. package/types/components/audio/styles/ark.css.d.ts +3 -0
  85. package/types/components/audio/styles/ark.css.d.ts.map +1 -0
  86. package/types/components/audio/styles/index.d.ts +3 -0
  87. package/types/components/audio/styles/index.d.ts.map +1 -0
  88. package/types/components/camera/components/camera.d.ts +18 -0
  89. package/types/components/camera/components/camera.d.ts.map +1 -0
  90. package/types/components/camera/components/camera.test.d.ts +2 -0
  91. package/types/components/camera/components/camera.test.d.ts.map +1 -0
  92. package/types/components/camera/index.d.ts +2 -0
  93. package/types/components/camera/index.d.ts.map +1 -0
  94. package/types/components/camera/styles/ark.css.d.ts +3 -0
  95. package/types/components/camera/styles/ark.css.d.ts.map +1 -0
  96. package/types/components/camera/styles/index.d.ts +3 -0
  97. package/types/components/camera/styles/index.d.ts.map +1 -0
  98. package/types/components/capture/components/capture.d.ts +10 -0
  99. package/types/components/capture/components/capture.d.ts.map +1 -0
  100. package/types/components/capture/components/capture.test.d.ts +2 -0
  101. package/types/components/capture/components/capture.test.d.ts.map +1 -0
  102. package/types/components/capture/index.d.ts +2 -0
  103. package/types/components/capture/index.d.ts.map +1 -0
  104. package/types/components/droparea/components/droparea-preview.d.ts +21 -0
  105. package/types/components/droparea/components/droparea-preview.d.ts.map +1 -0
  106. package/types/components/droparea/components/droparea-preview.test.d.ts +2 -0
  107. package/types/components/droparea/components/droparea-preview.test.d.ts.map +1 -0
  108. package/types/components/droparea/components/droparea.d.ts +32 -0
  109. package/types/components/droparea/components/droparea.d.ts.map +1 -0
  110. package/types/components/droparea/components/droparea.test.d.ts +2 -0
  111. package/types/components/droparea/components/droparea.test.d.ts.map +1 -0
  112. package/types/components/droparea/index.d.ts +2 -0
  113. package/types/components/droparea/index.d.ts.map +1 -0
  114. package/types/components/droparea/styles/ark.css.d.ts +3 -0
  115. package/types/components/droparea/styles/ark.css.d.ts.map +1 -0
  116. package/types/components/droparea/styles/index.d.ts +3 -0
  117. package/types/components/droparea/styles/index.d.ts.map +1 -0
  118. package/types/components/emit/components/emit.d.ts +10 -0
  119. package/types/components/emit/components/emit.d.ts.map +1 -0
  120. package/types/components/emit/components/emit.test.d.ts +2 -0
  121. package/types/components/emit/components/emit.test.d.ts.map +1 -0
  122. package/types/components/emit/index.d.ts +2 -0
  123. package/types/components/emit/index.d.ts.map +1 -0
  124. package/types/components/index.d.ts +10 -0
  125. package/types/components/index.d.ts.map +1 -0
  126. package/types/components/list/components/item.d.ts +8 -0
  127. package/types/components/list/components/item.d.ts.map +1 -0
  128. package/types/components/list/components/item.test.d.ts +2 -0
  129. package/types/components/list/components/item.test.d.ts.map +1 -0
  130. package/types/components/list/components/list.d.ts +13 -0
  131. package/types/components/list/components/list.d.ts.map +1 -0
  132. package/types/components/list/components/list.test.d.ts +2 -0
  133. package/types/components/list/components/list.test.d.ts.map +1 -0
  134. package/types/components/list/index.d.ts +3 -0
  135. package/types/components/list/index.d.ts.map +1 -0
  136. package/types/components/paginator/components/paginator.d.ts +32 -0
  137. package/types/components/paginator/components/paginator.d.ts.map +1 -0
  138. package/types/components/paginator/components/paginator.test.d.ts +2 -0
  139. package/types/components/paginator/components/paginator.test.d.ts.map +1 -0
  140. package/types/components/paginator/index.d.ts +2 -0
  141. package/types/components/paginator/index.d.ts.map +1 -0
  142. package/types/components/paginator/styles/ark.css.d.ts +3 -0
  143. package/types/components/paginator/styles/ark.css.d.ts.map +1 -0
  144. package/types/components/paginator/styles/index.d.ts +3 -0
  145. package/types/components/paginator/styles/index.d.ts.map +1 -0
  146. package/types/components/spinner/components/spinner.d.ts +11 -0
  147. package/types/components/spinner/components/spinner.d.ts.map +1 -0
  148. package/types/components/spinner/components/spinner.test.d.ts +2 -0
  149. package/types/components/spinner/components/spinner.test.d.ts.map +1 -0
  150. package/types/components/spinner/index.d.ts +2 -0
  151. package/types/components/spinner/index.d.ts.map +1 -0
  152. package/types/components/spinner/styles/ark.css.d.ts +3 -0
  153. package/types/components/spinner/styles/ark.css.d.ts.map +1 -0
  154. package/types/components/spinner/styles/index.d.ts +3 -0
  155. package/types/components/spinner/styles/index.d.ts.map +1 -0
  156. package/types/components/splitview/components/splitview.d.ts +12 -0
  157. package/types/components/splitview/components/splitview.d.ts.map +1 -0
  158. package/types/components/splitview/components/splitview.detail.d.ts +10 -0
  159. package/types/components/splitview/components/splitview.detail.d.ts.map +1 -0
  160. package/types/components/splitview/components/splitview.detail.test.d.ts +2 -0
  161. package/types/components/splitview/components/splitview.detail.test.d.ts.map +1 -0
  162. package/types/components/splitview/components/splitview.master.d.ts +8 -0
  163. package/types/components/splitview/components/splitview.master.d.ts.map +1 -0
  164. package/types/components/splitview/components/splitview.master.test.d.ts +2 -0
  165. package/types/components/splitview/components/splitview.master.test.d.ts.map +1 -0
  166. package/types/components/splitview/components/splitview.test.d.ts +2 -0
  167. package/types/components/splitview/components/splitview.test.d.ts.map +1 -0
  168. package/types/components/splitview/index.d.ts +4 -0
  169. package/types/components/splitview/index.d.ts.map +1 -0
  170. package/types/components/translate/components/translate.d.ts +18 -0
  171. package/types/components/translate/components/translate.d.ts.map +1 -0
  172. package/types/components/translate/components/translate.test.d.ts +2 -0
  173. package/types/components/translate/components/translate.test.d.ts.map +1 -0
  174. package/types/components/translate/index.d.ts +2 -0
  175. package/types/components/translate/index.d.ts.map +1 -0
  176. package/types/index.d.ts +3 -0
  177. package/types/index.d.ts.map +1 -0
@@ -1,264 +1,395 @@
1
+ import { it } from 'node:test';
2
+ import assert from 'node:assert/strict';
1
3
  import './list.js'
2
4
 
3
- describe('List', () => {
4
- let container = null
5
+ let container = null
5
6
 
6
- beforeEach(() => {
7
- container = document.createElement('div')
8
- document.body.appendChild(container)
9
- })
7
+ const setup = () => {
8
+ document.body.innerHTML = '';
9
+ container = document.createElement('div')
10
+ document.body.appendChild(container)
11
+ };
10
12
 
11
- afterEach(() => {
12
- container.remove()
13
- container = null
14
- })
13
+ it('can be instantiated', () => {
14
+ setup();
15
+ container.innerHTML = `
16
+ <ark-list></ark-list>
17
+ `
15
18
 
16
- it('can be instantiated', () => {
17
- container.innerHTML = `
18
- <ark-list></ark-list>
19
- `
19
+ const list = container.querySelector('ark-list')
20
+ assert.deepStrictEqual(list, list.init())
21
+ })
20
22
 
21
- const list = container.querySelector('ark-list')
22
- expect(list).toEqual(list.init())
23
- })
23
+ it('can be instantiated with items', async () => {
24
+ setup();
25
+ container.innerHTML = `
26
+ <ark-list></ark-list>
27
+ `
24
28
 
25
- it('can be instantiated with items', async () => {
26
- container.innerHTML = `
27
- <ark-list></ark-list>
28
- `
29
+ const list = container.querySelector('ark-list')
30
+ list.source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
31
+ list.render()
29
32
 
30
- const list = container.querySelector('ark-list')
31
- list.source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
32
- list.render()
33
+ const items = list.selectAll('ark-list-item')
33
34
 
34
- const items = list.selectAll('ark-list-item')
35
+ assert.deepStrictEqual(items.length, 4)
36
+ assert.deepStrictEqual(items[0].textContent.trim(), 'Colombia')
37
+ assert.deepStrictEqual(items[1].textContent.trim(), 'Uruguay')
38
+ assert.deepStrictEqual(items[2].textContent.trim(), 'Brasil')
39
+ assert.deepStrictEqual(items[3].textContent.trim(), 'Perú')
40
+ })
35
41
 
36
- expect(items.length).toEqual(4)
37
- expect(items[0].textContent.trim()).toEqual('Colombia')
38
- expect(items[1].textContent.trim()).toEqual('Uruguay')
39
- expect(items[2].textContent.trim()).toEqual('Brasil')
40
- expect(items[3].textContent.trim()).toEqual('Perú')
42
+ it('can be instantiated with items click-disabled', () => {
43
+ setup();
44
+ container.innerHTML = `
45
+ <ark-list click-disabled></ark-list
46
+ `
47
+
48
+ const list = container.querySelector('ark-list')
49
+ list.source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
50
+ list.render()
51
+ const items = list.selectAll('ark-list-item')
52
+
53
+ assert.deepStrictEqual(items.length, 4)
54
+ assert.deepStrictEqual(items[0].textContent.trim(), 'Colombia')
55
+ assert.deepStrictEqual(items[1].textContent.trim(), 'Uruguay')
56
+ assert.deepStrictEqual(items[2].textContent.trim(), 'Brasil')
57
+ assert.deepStrictEqual(items[3].textContent.trim(), 'Perú')
58
+
59
+ list.addEventListener('list-selected', event => {
60
+ assert.strictEqual(true, false) // never reached
41
61
  })
62
+ items[0].click()
63
+ })
42
64
 
43
- it('can be instantiated with items click-disabled', () => {
44
- expect.assertions(5)
45
- container.innerHTML = `
46
- <ark-list click-disabled></ark-list
47
- `
48
-
49
- const list = container.querySelector('ark-list')
50
- list.source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
51
- list.render()
52
- const items = list.selectAll('ark-list-item')
53
-
54
- expect(items.length).toEqual(4)
55
- expect(items[0].textContent.trim()).toEqual('Colombia')
56
- expect(items[1].textContent.trim()).toEqual('Uruguay')
57
- expect(items[2].textContent.trim()).toEqual('Brasil')
58
- expect(items[3].textContent.trim()).toEqual('Perú')
59
-
60
- list.addEventListener('list-selected', event => {
61
- expect(true).toBe(false) // never reached
62
- })
63
- items[0].click()
64
- })
65
+ it('can delete', async () => {
66
+ setup();
67
+ container.innerHTML = `
68
+ <ark-list click-disabled></ark-list
69
+ `
70
+
71
+ const list = container.querySelector('ark-list')
72
+ list.source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
73
+ list.render()
74
+
75
+ list.delete(1)
76
+ let items = list.selectAll('ark-list-item')
77
+ assert.deepStrictEqual(items.length, 3)
78
+ assert.deepStrictEqual(items[1].textContent.trim(), 'Brasil')
79
+
80
+ list.delete(0, 2)
81
+ items = list.selectAll('ark-list-item')
82
+ assert.deepStrictEqual(items.length, 1)
83
+ assert.deepStrictEqual(items[0].textContent.trim(), 'Perú')
84
+ })
65
85
 
66
- it('can delete', async () => {
67
- container.innerHTML = `
68
- <ark-list click-disabled></ark-list
69
- `
86
+ it('can select an item when it is clicked', async () => {
87
+ setup()
88
+ container.innerHTML = `
89
+ <ark-list></ark-list
90
+ `
70
91
 
71
- const list = container.querySelector('ark-list')
72
- list.source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
73
- list.render()
92
+ const list = container.querySelector('ark-list')
93
+ list.source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
94
+ list.render()
74
95
 
75
- list.delete(1)
76
- let items = list.selectAll('ark-list-item')
77
- expect(items.length).toEqual(3)
78
- expect(items[1].textContent.trim()).toEqual('Brasil')
96
+ const items = list.selectAll('ark-list-item')
97
+ assert.deepStrictEqual(items.length, 4)
79
98
 
80
- list.delete(0, 2)
81
- items = list.selectAll('ark-list-item')
82
- expect(items.length).toEqual(1)
83
- expect(items[0].textContent.trim()).toEqual('Perú')
99
+ const selected = new Promise((resolve) => {
100
+ list.addEventListener('list-selected', resolve, { once: true })
84
101
  })
85
102
 
86
- it('can select an item when it is clicked', (done) => {
87
- expect.assertions(2)
88
- container.innerHTML = `
89
- <ark-list></ark-list
90
- `
103
+ items[2].click()
104
+ const event = await selected
105
+ assert.deepStrictEqual(event.detail.data, 'Brasil')
106
+ })
91
107
 
92
- const list = container.querySelector('ark-list')
93
- list.source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
94
- list.render()
108
+ it('can be declaratively instantiated with JSON source', async () => {
109
+ setup();
110
+ const source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
95
111
 
96
- const items = list.selectAll('ark-list-item')
97
- expect(items.length).toEqual(4)
112
+ container.innerHTML = `
113
+ <ark-list>
114
+ <data>${JSON.stringify(source)}</data>
115
+ </ark-list>
116
+ `
98
117
 
99
- list.addEventListener('list-selected', event => {
100
- expect(event.detail.data).toEqual('Brasil')
101
- done()
102
- })
118
+ const list = container.querySelector('ark-list')
103
119
 
104
- items[2].click()
105
- })
120
+ const items = list.selectAll('ark-list-item')
106
121
 
107
- it('can be declaratively instantiated with JSON source', async () => {
108
- const source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
122
+ assert.deepStrictEqual(items.length, 4)
123
+ assert.deepStrictEqual(items[0].textContent.trim(), 'Colombia')
124
+ assert.deepStrictEqual(items[1].textContent.trim(), 'Uruguay')
125
+ assert.deepStrictEqual(items[2].textContent.trim(), 'Brasil')
126
+ assert.deepStrictEqual(items[3].textContent.trim(), 'Perú')
127
+ })
109
128
 
110
- container.innerHTML = `
111
- <ark-list>
112
- <data>${JSON.stringify(source)}</data>
113
- </ark-list>
114
- `
129
+ it('can be provided with a list item template', async () => {
130
+ setup();
131
+ const source = [
132
+ { name: 'Colombia', code: 'CO' },
133
+ { name: 'Uruguay', code: 'UY' },
134
+ { name: 'Brasil', code: 'BR' },
135
+ { name: 'Perú', code: 'PE' }
136
+ ]
137
+
138
+ container.innerHTML = `
139
+ <ark-list>
140
+ <data hidden>${JSON.stringify(source)}</data>
141
+ <template>
142
+ <dl>
143
+ <div>
144
+ <dt>Name</dt>
145
+ <dd>\${this.name}</dd>
146
+ </div>
147
+ <div>
148
+ <dt>Code</dt>
149
+ <dd>\${this.code}</dd>
150
+ </div>
151
+ </dl>
152
+ </template>
153
+ </ark-list>
154
+ `
155
+
156
+ const list = container.querySelector('ark-list')
157
+
158
+ const items = list.selectAll('ark-list-item')
159
+
160
+ assert.deepStrictEqual(items.length, 4)
161
+ assert.deepStrictEqual(
162
+ items[0].innerHTML.replace(/\s/g, ''),
163
+ '<dl><div><dt>Name</dt><dd>Colombia</dd></div>' +
164
+ '<div><dt>Code</dt><dd>CO</dd></div></dl>'
165
+ )
166
+ assert.deepStrictEqual(
167
+ items[1].innerHTML.replace(/\s/g, ''),
168
+ '<dl><div><dt>Name</dt><dd>Uruguay</dd></div>' +
169
+ '<div><dt>Code</dt><dd>UY</dd></div></dl>'
170
+ )
171
+ assert.deepStrictEqual(
172
+ items[2].innerHTML.replace(/\s/g, ''),
173
+ '<dl><div><dt>Name</dt><dd>Brasil</dd></div>' +
174
+ '<div><dt>Code</dt><dd>BR</dd></div></dl>'
175
+ )
176
+ assert.deepStrictEqual(
177
+ items[3].innerHTML.replace(/\s/g, ''),
178
+ '<dl><div><dt>Name</dt><dd>Perú</dd></div>' +
179
+ '<div><dt>Code</dt><dd>PE</dd></div></dl>'
180
+ )
181
+ })
115
182
 
116
- const list = container.querySelector('ark-list')
183
+ it('can be render simple lists with an item template', async () => {
184
+ setup();
185
+ const source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
186
+
187
+ container.innerHTML = `
188
+ <ark-list>
189
+ <data hidden>${JSON.stringify(source)}</data>
190
+ <template>
191
+ <span><strong>\${this}</strong></span>
192
+ </template>
193
+ </ark-list>
194
+ `
195
+
196
+ const list = container.querySelector('ark-list')
197
+
198
+ const items = list.selectAll('ark-list-item')
199
+
200
+ assert.deepStrictEqual(items.length, 4)
201
+ assert.deepStrictEqual(
202
+ items[0].innerHTML.replace(/\s/g, ''),
203
+ '<span><strong>Colombia</strong></span>'
204
+ )
205
+ assert.deepStrictEqual(
206
+ items[1].innerHTML.replace(/\s/g, ''),
207
+ '<span><strong>Uruguay</strong></span>'
208
+ )
209
+ assert.deepStrictEqual(
210
+ items[2].innerHTML.replace(/\s/g, ''),
211
+ '<span><strong>Brasil</strong></span>'
212
+ )
213
+ assert.deepStrictEqual(
214
+ items[3].innerHTML.replace(/\s/g, ''),
215
+ '<span><strong>Perú</strong></span>'
216
+ )
217
+ })
117
218
 
118
- const items = list.selectAll('ark-list-item')
219
+ it('can be rendered again given a new array through init', async () => {
220
+ setup();
221
+ let source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
222
+ container.innerHTML = `
223
+ <ark-list>
224
+ <data hidden>${JSON.stringify(source)}</data>
225
+ <template>
226
+ <span><strong>\${this}</strong></span>
227
+ </template>
228
+ </ark-list>
229
+ `
230
+ const list = container.querySelector('ark-list')
231
+ let items = list.selectAll('ark-list-item')
232
+ assert.deepStrictEqual(items.length, 4)
233
+ assert.deepStrictEqual(
234
+ items[0].innerHTML.replace(/\s/g, ''),
235
+ '<span><strong>Colombia</strong></span>'
236
+ )
237
+ assert.deepStrictEqual(
238
+ items[1].innerHTML.replace(/\s/g, ''),
239
+ '<span><strong>Uruguay</strong></span>'
240
+ )
241
+ assert.deepStrictEqual(
242
+ items[2].innerHTML.replace(/\s/g, ''),
243
+ '<span><strong>Brasil</strong></span>'
244
+ )
245
+ assert.deepStrictEqual(
246
+ items[3].innerHTML.replace(/\s/g, ''),
247
+ '<span><strong>Perú</strong></span>'
248
+ )
249
+
250
+ source = ['Ecuador', 'Panama', 'Venezuela', 'USA']
251
+ list.init({ source }).render()
252
+ items = list.selectAll('ark-list-item')
253
+
254
+ assert.deepStrictEqual(items.length, 4)
255
+ assert.deepStrictEqual(
256
+ items[0].innerHTML.replace(/\s/g, ''),
257
+ '<span><strong>Ecuador</strong></span>'
258
+ )
259
+ assert.deepStrictEqual(
260
+ items[1].innerHTML.replace(/\s/g, ''),
261
+ '<span><strong>Panama</strong></span>'
262
+ )
263
+ assert.deepStrictEqual(
264
+ items[2].innerHTML.replace(/\s/g, ''),
265
+ '<span><strong>Venezuela</strong></span>'
266
+ )
267
+ assert.deepStrictEqual(items[3].innerHTML.replace(/\s/g, ''), '<span><strong>USA</strong></span>')
268
+ })
119
269
 
120
- expect(items.length).toEqual(4)
121
- expect(items[0].textContent.trim()).toEqual('Colombia')
122
- expect(items[1].textContent.trim()).toEqual('Uruguay')
123
- expect(items[2].textContent.trim()).toEqual('Brasil')
124
- expect(items[3].textContent.trim()).toEqual('Perú')
270
+ it('listens to delete events to remove its items', () => {
271
+ setup();
272
+ const source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
273
+ container.innerHTML = `
274
+ <ark-list>
275
+ <data hidden>${JSON.stringify(source)}</data>
276
+ <template>
277
+ <span>
278
+ <strong>\${this}</strong></span>
279
+ <button data-\${this}>
280
+ DELETE
281
+ </button>
282
+ </template>
283
+ </ark-list>
284
+ `
285
+ const list = container.querySelector('ark-list')
286
+ let button = list.querySelector('[data-colombia]')
287
+
288
+ let items = list.selectAll('ark-list-item')
289
+ assert.deepStrictEqual(items.length, 4)
290
+
291
+ button.dispatchEvent(new CustomEvent('delete', { bubbles: true }))
292
+
293
+ button = list.querySelector('[data-colombia]')
294
+ items = list.selectAll('ark-list-item')
295
+
296
+ assert.deepStrictEqual(items.length, 3)
297
+ assert.strictEqual(button, null)
298
+ })
299
+
300
+ it('emits error when declarative source JSON is invalid', () => {
301
+ setup()
302
+ const list = document.createElement('ark-list')
303
+ list.innerHTML = `
304
+ <data>{ invalid json }</data>
305
+ `
306
+ let errorEvent = null
307
+ list.addEventListener('error', (event) => {
308
+ errorEvent = event
125
309
  })
126
310
 
127
- it('can be provided with a list item template', async () => {
128
- const source = [
129
- { name: 'Colombia', code: 'CO' },
130
- { name: 'Uruguay', code: 'UY' },
131
- { name: 'Brasil', code: 'BR' },
132
- { name: 'Perú', code: 'PE' }
133
- ]
134
-
135
- container.innerHTML = `
136
- <ark-list>
137
- <data hidden>${JSON.stringify(source)}</data>
138
- <template>
139
- <dl>
140
- <div>
141
- <dt>Name</dt>
142
- <dd>\${this.name}</dd>
143
- </div>
144
- <div>
145
- <dt>Code</dt>
146
- <dd>\${this.code}</dd>
147
- </div>
148
- </dl>
149
- </template>
150
- </ark-list>
151
- `
152
-
153
- const list = container.querySelector('ark-list')
154
-
155
- const items = list.selectAll('ark-list-item')
156
-
157
- expect(items.length).toEqual(4)
158
- expect(items[0].innerHTML.replace(/\s/g, '')).toEqual(
159
- '<dl><div><dt>Name</dt><dd>Colombia</dd></div>' +
160
- '<div><dt>Code</dt><dd>CO</dd></div></dl>')
161
- expect(items[1].innerHTML.replace(/\s/g, '')).toEqual(
162
- '<dl><div><dt>Name</dt><dd>Uruguay</dd></div>' +
163
- '<div><dt>Code</dt><dd>UY</dd></div></dl>')
164
- expect(items[2].innerHTML.replace(/\s/g, '')).toEqual(
165
- '<dl><div><dt>Name</dt><dd>Brasil</dd></div>' +
166
- '<div><dt>Code</dt><dd>BR</dd></div></dl>')
167
- expect(items[3].innerHTML.replace(/\s/g, '')).toEqual(
168
- '<dl><div><dt>Name</dt><dd>Perú</dd></div>' +
169
- '<div><dt>Code</dt><dd>PE</dd></div></dl>')
311
+ list.render()
312
+
313
+ assert.ok(errorEvent)
314
+ assert.deepStrictEqual(list.selectAll('ark-list-item').length, 0)
315
+ })
316
+
317
+ it('emits error when template compilation fails', () => {
318
+ setup()
319
+ const list = document.createElement('ark-list')
320
+ list.innerHTML = `
321
+ <data>${JSON.stringify(['Colombia'])}</data>
322
+ <template>\${this</template>
323
+ `
324
+ let errorEvent = null
325
+ list.addEventListener('error', (event) => {
326
+ errorEvent = event
327
+ })
328
+
329
+ list.render()
330
+
331
+ assert.ok(errorEvent)
332
+ assert.deepStrictEqual(list.select('ark-list-item').innerHTML, '')
333
+ })
334
+
335
+ it('emits error when template evaluation fails', () => {
336
+ setup()
337
+ const list = document.createElement('ark-list')
338
+ list.innerHTML = `
339
+ <data>${JSON.stringify([{ name: 'Colombia' }])}</data>
340
+ <template>\${this.missing.name}</template>
341
+ `
342
+ let errorEvent = null
343
+ list.addEventListener('error', (event) => {
344
+ errorEvent = event
170
345
  })
171
346
 
172
- it('can be render simple lists with an item template', async () => {
173
- const source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
174
-
175
- container.innerHTML = `
176
- <ark-list>
177
- <data hidden>${JSON.stringify(source)}</data>
178
- <template>
179
- <span><strong>\${this}</strong></span>
180
- </template>
181
- </ark-list>
182
- `
183
-
184
- const list = container.querySelector('ark-list')
185
-
186
- const items = list.selectAll('ark-list-item')
187
-
188
- expect(items.length).toEqual(4)
189
- expect(items[0].innerHTML.replace(/\s/g, '')).toEqual(
190
- '<span><strong>Colombia</strong></span>')
191
- expect(items[1].innerHTML.replace(/\s/g, '')).toEqual(
192
- '<span><strong>Uruguay</strong></span>')
193
- expect(items[2].innerHTML.replace(/\s/g, '')).toEqual(
194
- '<span><strong>Brasil</strong></span>')
195
- expect(items[3].innerHTML.replace(/\s/g, '')).toEqual(
196
- '<span><strong>Perú</strong></span>')
347
+ list.render()
348
+
349
+ assert.ok(errorEvent)
350
+ assert.deepStrictEqual(list.select('ark-list-item').innerHTML, '')
351
+ })
352
+
353
+ it('ignores selection events outside list items', () => {
354
+ setup()
355
+ container.innerHTML = `
356
+ <ark-list></ark-list>
357
+ `
358
+ const list = container.querySelector('ark-list')
359
+ list.source = ['Colombia']
360
+ list.render()
361
+
362
+ assert.doesNotThrow(() => {
363
+ list.dispatchEvent(new Event('click', { bubbles: true }))
197
364
  })
365
+ })
198
366
 
199
- it('can be rendered again given a new array through init', async () => {
200
- let source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
201
- container.innerHTML = `
202
- <ark-list>
203
- <data hidden>${JSON.stringify(source)}</data>
204
- <template>
205
- <span><strong>\${this}</strong></span>
206
- </template>
207
- </ark-list>
208
- `
209
- const list = container.querySelector('ark-list')
210
- let items = list.selectAll('ark-list-item')
211
- expect(items.length).toEqual(4)
212
- expect(items[0].innerHTML.replace(/\s/g, '')).toEqual(
213
- '<span><strong>Colombia</strong></span>')
214
- expect(items[1].innerHTML.replace(/\s/g, '')).toEqual(
215
- '<span><strong>Uruguay</strong></span>')
216
- expect(items[2].innerHTML.replace(/\s/g, '')).toEqual(
217
- '<span><strong>Brasil</strong></span>')
218
- expect(items[3].innerHTML.replace(/\s/g, '')).toEqual(
219
- '<span><strong>Perú</strong></span>')
220
-
221
- source = ['Ecuador', 'Panama', 'Venezuela', 'USA']
222
- list.init({ source }).render()
223
- items = list.selectAll('ark-list-item')
224
-
225
- expect(items.length).toEqual(4)
226
- expect(items[0].innerHTML.replace(/\s/g, '')).toEqual(
227
- '<span><strong>Ecuador</strong></span>')
228
- expect(items[1].innerHTML.replace(/\s/g, '')).toEqual(
229
- '<span><strong>Panama</strong></span>')
230
- expect(items[2].innerHTML.replace(/\s/g, '')).toEqual(
231
- '<span><strong>Venezuela</strong></span>')
232
- expect(items[3].innerHTML.replace(/\s/g, '')).toEqual(
233
- '<span><strong>USA</strong></span>')
367
+ it('ignores delete events outside list items', () => {
368
+ setup()
369
+ container.innerHTML = `
370
+ <ark-list></ark-list>
371
+ `
372
+ const list = container.querySelector('ark-list')
373
+ list.source = ['Colombia']
374
+ list.render()
375
+
376
+ assert.doesNotThrow(() => {
377
+ list.dispatchEvent(new CustomEvent('delete', { bubbles: true }))
234
378
  })
379
+ assert.deepStrictEqual(list.selectAll('ark-list-item').length, 1)
380
+ })
235
381
 
236
- it('listens to delete events to remove its items', () => {
237
- const source = ['Colombia', 'Uruguay', 'Brasil', 'Perú']
238
- container.innerHTML = `
239
- <ark-list>
240
- <data hidden>${JSON.stringify(source)}</data>
241
- <template>
242
- <span>
243
- <strong>\${this}</strong></span>
244
- <button data-\${this}>
245
- DELETE
246
- </button>
247
- </template>
248
- </ark-list>
249
- `
250
- const list = container.querySelector('ark-list')
251
- let button = list.querySelector('[data-colombia]')
252
-
253
- let items = list.selectAll('ark-list-item')
254
- expect(items.length).toEqual(4)
255
-
256
- button.dispatchEvent(new CustomEvent('delete', { bubbles: true }))
257
-
258
- button = list.querySelector('[data-colombia]')
259
- items = list.selectAll('ark-list-item')
260
-
261
- expect(items.length).toEqual(3)
262
- expect(button).toBeNull()
382
+ it('ignores deletions that are out of range', () => {
383
+ setup()
384
+ container.innerHTML = `
385
+ <ark-list></ark-list>
386
+ `
387
+ const list = container.querySelector('ark-list')
388
+ list.source = ['Colombia']
389
+ list.render()
390
+
391
+ assert.doesNotThrow(() => {
392
+ list.delete(10)
263
393
  })
394
+ assert.deepStrictEqual(list.selectAll('ark-list-item').length, 1)
264
395
  })
@@ -1,2 +1,2 @@
1
- export { ListItem } from './components/list.item.js'
1
+ export { ListItem } from './components/item.js'
2
2
  export { List } from './components/list.js'
@@ -1,4 +1,4 @@
1
- import { Component } from '../../../base/component/index.js'
1
+ import { Component } from '#base/index.js'
2
2
  import styles from '../styles/index.js'
3
3
 
4
4
  const tag = 'ark-paginator'
@@ -103,7 +103,8 @@ export class Paginator extends Component {
103
103
  /** @param {Event} event */
104
104
  _move (event) {
105
105
  event.stopPropagation()
106
- const page = parseInt(event.target.dataset.page)
106
+ const target = /** @type {HTMLElement} */ (event.target)
107
+ const page = parseInt(target.dataset.page)
107
108
  this._setCurrentPage(page)
108
109
  }
109
110