br-dionysus 1.19.5 → 1.19.7

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 (55) hide show
  1. package/README.md +23 -17
  2. package/build/lib.config.ts +34 -29
  3. package/cypress/e2e/toolGetDomEventHub.cy.ts +272 -0
  4. package/cypress/fixtures/profile.json +5 -0
  5. package/cypress/fixtures/users.json +232 -0
  6. package/dist/br-dionysus.es.d.ts +22 -11
  7. package/dist/br-dionysus.es.js +3157 -3137
  8. package/dist/br-dionysus.umd.js +19 -19
  9. package/dist/index.css +1 -1
  10. package/package.json +4 -1
  11. package/packages/Hook/useTableConfig/useTableConfig.ts +5 -6
  12. package/packages/MTable/docs/DemoTest7.vue +2 -2
  13. package/packages/MTable/src/MTable.vue +10 -8
  14. package/packages/MVirtualTable/docs/README.md +126 -0
  15. package/packages/MVirtualTable/docs/demo.vue +511 -0
  16. package/packages/MVirtualTable/index.ts +14 -0
  17. package/packages/MVirtualTable/src/MVirtualTable.vue +1315 -0
  18. package/packages/MVirtualTable/src/types.ts +72 -0
  19. package/packages/SkinConfig/src/SkinConfig.vue +1 -0
  20. package/packages/Tool/getDomEventHub/README.md +29 -0
  21. package/packages/Tool/getDomEventHub/getDomEventHub.ts +117 -0
  22. package/packages/Tool/moneyFormat/moneyFormat.ts +4 -10
  23. package/packages/index.ts +16 -5
  24. package/packages/list.json +107 -29
  25. package/script/genNewComp/.template/docs/demo.vue.tpl +1 -1
  26. package/script/genNewComp/.template/index.ts.tpl +8 -8
  27. package/script/genNewComp/.template/install.ts.tpl +17 -8
  28. package/script/genNewComp/.template/router.ts.tpl +17 -17
  29. package/script/genNewComp/tplReplacer.js +79 -8
  30. package/script/regenerate.js +110 -0
  31. package/src/router.ts +118 -95
  32. package/vite.config.ts +29 -15
  33. package/web-types.json +1 -1
  34. package/cypress/e2e/1-getting-started/todo.cy.js +0 -143
  35. package/cypress/e2e/2-advanced-examples/actions.cy.js +0 -321
  36. package/cypress/e2e/2-advanced-examples/aliasing.cy.js +0 -39
  37. package/cypress/e2e/2-advanced-examples/assertions.cy.js +0 -176
  38. package/cypress/e2e/2-advanced-examples/connectors.cy.js +0 -98
  39. package/cypress/e2e/2-advanced-examples/cookies.cy.js +0 -118
  40. package/cypress/e2e/2-advanced-examples/cypress_api.cy.js +0 -184
  41. package/cypress/e2e/2-advanced-examples/files.cy.js +0 -85
  42. package/cypress/e2e/2-advanced-examples/location.cy.js +0 -32
  43. package/cypress/e2e/2-advanced-examples/misc.cy.js +0 -96
  44. package/cypress/e2e/2-advanced-examples/navigation.cy.js +0 -55
  45. package/cypress/e2e/2-advanced-examples/network_requests.cy.js +0 -163
  46. package/cypress/e2e/2-advanced-examples/querying.cy.js +0 -114
  47. package/cypress/e2e/2-advanced-examples/spies_stubs_clocks.cy.js +0 -204
  48. package/cypress/e2e/2-advanced-examples/storage.cy.js +0 -117
  49. package/cypress/e2e/2-advanced-examples/traversal.cy.js +0 -121
  50. package/cypress/e2e/2-advanced-examples/utilities.cy.js +0 -107
  51. package/cypress/e2e/2-advanced-examples/viewport.cy.js +0 -58
  52. package/cypress/e2e/2-advanced-examples/waiting.cy.js +0 -30
  53. package/cypress/e2e/2-advanced-examples/window.cy.js +0 -22
  54. package/packages/Tool/globalEvents/README.md +0 -23
  55. package/packages/Tool/globalEvents/globalEvents.ts +0 -79
package/README.md CHANGED
@@ -2847,7 +2847,7 @@ const list = ref<{ name: string, className: string }[]>([
2847
2847
 
2848
2848
  + createHash([](#))
2849
2849
 
2850
- + globalEvents([|-register---|-注册行为-----------------------|-(options:-EventRegistration)](#|-register---|-注册行为-----------------------|-(options:-EventRegistration)))
2850
+ + getDomEventHub([|-on-------|-注册行为------------------------|-(options:-EventRegistration)](#|-on-------|-注册行为------------------------|-(options:-EventRegistration)))
2851
2851
 
2852
2852
  + moneyFormat([](#))
2853
2853
 
@@ -5457,29 +5457,35 @@ const list = ref<{ name: string, className: string }[]>([
5457
5457
 
5458
5458
 
5459
5459
 
5460
- ## 全局事件代理 globalEvents
5460
+ ## 全局单例 DOM 事件任务中心 getDomEventHub
5461
+
5462
+ 用于在同一 DOM 节点上集中监听事件,并允许多个组件向同一事件注册独立回调任务,避免重复绑定与相互覆盖。
5461
5463
 
5462
5464
  ### 1) 参数
5463
5465
 
5464
- | 参数 | 描述 | 类型 | 默认值 |
5465
- |-------|--------------------------|--------|--------|
5466
- | point | 锚点(绑定事件的dom节点的class,id等) | string | 'body' |
5466
+ | 参数 | 描述 | 类型 | 默认值 |
5467
+ |-------|---------------------|--------|--------|
5468
+ | point | 锚点(绑定事件的 dom 节点选择器) | string | 'body' |
5467
5469
 
5468
- ### 2) 返参
5470
+ ### 2) 返参(GlobalEventManager)
5471
+
5472
+ | 参数 | 描述 | 类型 | 默认值 |
5473
+ |----------|-----------------------------|--------------------------------------|-----|
5474
+ | on | 注册行为 | (options: EventRegistration) => void | - |
5475
+ | off | 注销行为(id 存在即注销对应行为,不存在即注销所有) | (id?: string \| number) => void | - |
5476
+ | clear | 清空任务池 | () => void | - |
5477
+ | destroy | 销毁 Hub,解绑事件并清空任务池 | () => void | - |
5478
+ | setPoint | 设置监听锚点(重新绑定,保留任务池) | (point: string) => void | - |
5469
5479
 
5470
- | 参数 | 描述 | 类型 | 默认值 |
5471
- |------------|----------------------------|--------------------------------------|-----|
5472
- | register | 注册行为 | (options: EventRegistration) => void | - |
5473
- | unregister | 注销行为(id存在即注销对应行为,不存在即注销所有) | (id?: string \| number) => void | - |
5480
+ ### 3) EventRegistration
5474
5481
 
5475
- #### 2.1) EventRegistration
5482
+ | 参数 | 描述 | 类型 | 默认值 |
5483
+ |-----------|------------------|-----------------------------------------------------------------------------------------------------------------|-----|
5484
+ | eventName | 事件类型 | 'click' \| 'mousemove' \| 'mousedown' \| 'mouseenter' \| 'mouseleave' \| 'mouseout' \| 'mouseover' \| 'mouseup' | - |
5485
+ | id | 唯一标识符 | string \| number | - |
5486
+ | callback | 事件回调 | (event: T) => void | - |
5487
+ | priority | 事件优先级(数字越小优先级越高) | number | - |
5476
5488
 
5477
- | 参数 | 描述 | 类型 | 默认值 |
5478
- |-----------|------------------|--------------------|-----|
5479
- | eventName | 事件类型 | GlobalEventName | - |
5480
- | id | 唯一标识符 | string \| number | - |
5481
- | callback | 事件回调 | (event: T) => void | - |
5482
- | priority | 事件优先级(数字越小优先级越高) | number | - |
5483
5489
 
5484
5490
 
5485
5491
 
@@ -1,38 +1,43 @@
1
- import baseConfig from '../vite.config.js'
2
1
  import { defineConfig } from 'vite'
3
2
  import { resolve } from 'path'
4
3
  import dts from 'vite-plugin-dts'
5
4
  import createWebTypes from './../createWebTypes.mjs'
6
5
 
7
- export default defineConfig({
8
- ...baseConfig,
9
- build: {
10
- outDir: 'dist',
11
- cssCodeSplit: true,
12
- lib: {
13
- entry: resolve(__dirname, '../packages/index.ts'),
14
- name: 'BrPlugin',
15
- fileName: (format) => `br-dionysus.${format}.js`
16
- },
17
- rollupOptions: {
18
- // 确保外部化处理那些你不想打包进库的依赖
19
- external: ['vue'],
20
- output: {
21
- // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
22
- globals: {
23
- vue: 'Vue'
6
+ export default defineConfig(async ({ mode }) => {
7
+ const { default: baseConfigFn } = await import('../vite.config.ts')
8
+ const baseConfig = await baseConfigFn({ command: 'build', mode, isSsrBuild: false, isPreview: false } as any)
9
+ const basePlugins = (baseConfig?.plugins ?? []) as any[]
10
+
11
+ return {
12
+ ...baseConfig,
13
+ build: {
14
+ outDir: 'dist',
15
+ cssCodeSplit: true,
16
+ lib: {
17
+ entry: resolve(__dirname, '../packages/index.ts'),
18
+ name: 'BrPlugin',
19
+ fileName: (format: string) => `br-dionysus.${format}.js`
20
+ },
21
+ rollupOptions: {
22
+ // 确保外部化处理那些你不想打包进库的依赖
23
+ external: ['vue'],
24
+ output: {
25
+ // 在 UMD 构建模式下为这些外部化的依赖提供一个全局变量
26
+ globals: {
27
+ vue: 'Vue'
28
+ }
24
29
  }
25
30
  }
26
- }
27
- },
28
- plugins: [
29
- ...(baseConfig as any).plugins,
30
- dts({ rollupTypes: true }),
31
- {
32
- name: 'build-complete',
33
- writeBundle () {
34
- createWebTypes()
31
+ },
32
+ plugins: [
33
+ ...basePlugins,
34
+ dts({ rollupTypes: true }),
35
+ {
36
+ name: 'build-complete',
37
+ writeBundle () {
38
+ createWebTypes()
39
+ }
35
40
  }
36
- }
37
- ]
41
+ ]
42
+ }
38
43
  })
@@ -0,0 +1,272 @@
1
+ import getDomEventHub from '../../packages/Tool/getDomEventHub/getDomEventHub'
2
+
3
+ describe('工具函数 getDomEventHub', () => {
4
+ const waitForBind = () => {
5
+ cy.then(() => {
6
+ return new Cypress.Promise<void>(resolve => {
7
+ window.setTimeout(resolve, 0)
8
+ })
9
+ })
10
+ }
11
+
12
+ const triggerMouseEvent = (
13
+ eventName: 'mouseup' | 'mousedown' | 'mousemove',
14
+ targetSelector: string = 'body',
15
+ bubbles: boolean = true
16
+ ) => {
17
+ cy.then(() => {
18
+ const target = document.querySelector(targetSelector)
19
+ if (!target) throw new Error(`未找到事件触发目标: ${targetSelector}`)
20
+ target.dispatchEvent(new MouseEvent(eventName, { bubbles }))
21
+ })
22
+ }
23
+
24
+ beforeEach(() => {
25
+ getDomEventHub('body').off()
26
+ getDomEventHub('body')
27
+ waitForBind()
28
+ })
29
+
30
+ afterEach(() => {
31
+ getDomEventHub('body').off()
32
+ })
33
+
34
+ it('注册 onmouseup 后能够触发回调', () => {
35
+ const callback = cy.spy().as('mouseupCallback')
36
+
37
+ getDomEventHub('body').on({
38
+ id: 'global-events-mouseup',
39
+ eventName: 'mouseup',
40
+ callback
41
+ })
42
+
43
+ triggerMouseEvent('mouseup')
44
+ cy.get('@mouseupCallback').should('have.been.calledOnce')
45
+ })
46
+
47
+ it('不传 point 时默认绑定到 body', () => {
48
+ const callback = cy.spy().as('defaultBodyCallback')
49
+
50
+ getDomEventHub().on({
51
+ id: 'global-events-default-body',
52
+ eventName: 'mouseup',
53
+ callback
54
+ })
55
+
56
+ triggerMouseEvent('mouseup')
57
+ cy.get('@defaultBodyCallback').should('have.been.calledOnce')
58
+ })
59
+
60
+ it('同 id 重复注册会被忽略', () => {
61
+ const firstCallback = cy.spy().as('firstCallback')
62
+ const secondCallback = cy.spy().as('secondCallback')
63
+
64
+ const manager = getDomEventHub('body')
65
+ manager.on({
66
+ id: 'global-events-dup-id',
67
+ eventName: 'mousedown',
68
+ callback: firstCallback
69
+ })
70
+ manager.on({
71
+ id: 'global-events-dup-id',
72
+ eventName: 'mousedown',
73
+ callback: secondCallback
74
+ })
75
+
76
+ triggerMouseEvent('mousedown')
77
+ cy.get('@firstCallback').should('have.been.calledOnce')
78
+ cy.get('@secondCallback').should('not.have.been.called')
79
+ })
80
+
81
+ it('同一事件可注册多个回调,并按注册顺序触发', () => {
82
+ const callOrder: string[] = []
83
+ const firstCallback = cy.spy(() => {
84
+ callOrder.push('first')
85
+ }).as('orderedFirstCallback')
86
+ const secondCallback = cy.spy(() => {
87
+ callOrder.push('second')
88
+ }).as('orderedSecondCallback')
89
+
90
+ const manager = getDomEventHub('body')
91
+ manager.on({
92
+ id: 'global-events-order-first',
93
+ eventName: 'mouseup',
94
+ callback: firstCallback
95
+ })
96
+ manager.on({
97
+ id: 'global-events-order-second',
98
+ eventName: 'mouseup',
99
+ callback: secondCallback
100
+ })
101
+
102
+ triggerMouseEvent('mouseup')
103
+
104
+ cy.get('@orderedFirstCallback').should('have.been.calledOnce')
105
+ cy.get('@orderedSecondCallback').should('have.been.calledOnce')
106
+ cy.then(() => {
107
+ expect(callOrder).to.deep.equal(['first', 'second'])
108
+ })
109
+ })
110
+
111
+ it('不同 eventName 互不干扰,只触发对应回调', () => {
112
+ const mouseupCallback = cy.spy().as('isolatedMouseupCallback')
113
+ const mousedownCallback = cy.spy().as('isolatedMousedownCallback')
114
+
115
+ const manager = getDomEventHub('body')
116
+ manager.on({
117
+ id: 'global-events-isolate-up',
118
+ eventName: 'mouseup',
119
+ callback: mouseupCallback
120
+ })
121
+ manager.on({
122
+ id: 'global-events-isolate-down',
123
+ eventName: 'mousedown',
124
+ callback: mousedownCallback
125
+ })
126
+
127
+ triggerMouseEvent('mouseup')
128
+
129
+ cy.get('@isolatedMouseupCallback').should('have.been.calledOnce')
130
+ cy.get('@isolatedMousedownCallback').should('not.have.been.called')
131
+ })
132
+
133
+ it('不同事件使用相同 id 时,后注册的监听会被忽略', () => {
134
+ const mouseupCallback = cy.spy().as('sameIdMouseupCallback')
135
+ const mousedownCallback = cy.spy().as('sameIdMousedownCallback')
136
+
137
+ const manager = getDomEventHub('body')
138
+ manager.on({
139
+ id: 'global-events-same-id-cross-event',
140
+ eventName: 'mouseup',
141
+ callback: mouseupCallback
142
+ })
143
+ manager.on({
144
+ id: 'global-events-same-id-cross-event',
145
+ eventName: 'mousedown',
146
+ callback: mousedownCallback
147
+ })
148
+
149
+ triggerMouseEvent('mouseup')
150
+ triggerMouseEvent('mousedown')
151
+
152
+ cy.get('@sameIdMouseupCallback').should('have.been.calledOnce')
153
+ cy.get('@sameIdMousedownCallback').should('not.have.been.called')
154
+ })
155
+
156
+ it('off(id) 仅移除指定事件', () => {
157
+ const keepCallback = cy.spy().as('keepCallback')
158
+ const removeCallback = cy.spy().as('removeCallback')
159
+
160
+ const manager = getDomEventHub('body')
161
+ manager.on({
162
+ id: 'global-events-keep',
163
+ eventName: 'mousemove',
164
+ callback: keepCallback
165
+ })
166
+ manager.on({
167
+ id: 'global-events-remove',
168
+ eventName: 'mousemove',
169
+ callback: removeCallback
170
+ })
171
+
172
+ manager.off('global-events-remove')
173
+ triggerMouseEvent('mousemove')
174
+
175
+ cy.get('@keepCallback').should('have.been.calledOnce')
176
+ cy.get('@removeCallback').should('not.have.been.called')
177
+ })
178
+
179
+ it('off(不存在的 id) 不影响已有监听', () => {
180
+ const callback = cy.spy().as('keepAfterInvalidOff')
181
+
182
+ const manager = getDomEventHub('body')
183
+ manager.on({
184
+ id: 'global-events-invalid-off',
185
+ eventName: 'mousemove',
186
+ callback
187
+ })
188
+
189
+ manager.off('global-events-not-exists')
190
+ triggerMouseEvent('mousemove')
191
+
192
+ cy.get('@keepAfterInvalidOff').should('have.been.calledOnce')
193
+ })
194
+
195
+ it('off() 会移除所有事件', () => {
196
+ const callback = cy.spy().as('allRemovedCallback')
197
+
198
+ const manager = getDomEventHub('body')
199
+ manager.on({
200
+ id: 'global-events-clear-all',
201
+ eventName: 'mouseup',
202
+ callback
203
+ })
204
+ manager.off()
205
+
206
+ triggerMouseEvent('mouseup')
207
+ cy.get('@allRemovedCallback').should('not.have.been.called')
208
+ })
209
+
210
+ it('clear() 会清空任务池', () => {
211
+ const callback = cy.spy().as('clearCallback')
212
+
213
+ const manager = getDomEventHub('body')
214
+ manager.on({
215
+ id: 'global-events-clear',
216
+ eventName: 'mouseup',
217
+ callback
218
+ })
219
+
220
+ manager.clear()
221
+ triggerMouseEvent('mouseup')
222
+
223
+ cy.get('@clearCallback').should('not.have.been.called')
224
+ })
225
+
226
+ it('destroy() 会解绑事件并清空任务池', () => {
227
+ const callback = cy.spy().as('destroyCallback')
228
+
229
+ const manager = getDomEventHub('body')
230
+ manager.on({
231
+ id: 'global-events-destroy',
232
+ eventName: 'mouseup',
233
+ callback
234
+ })
235
+
236
+ manager.destroy()
237
+ triggerMouseEvent('mouseup')
238
+
239
+ cy.get('@destroyCallback').should('not.have.been.called')
240
+ })
241
+
242
+ it('setPoint() 切换锚点后保留任务池,仅新锚点触发回调', () => {
243
+ const callback = cy.spy().as('setPointCallback')
244
+
245
+ cy.then(() => {
246
+ const pointEl = document.createElement('div')
247
+ pointEl.id = 'global-events-point'
248
+ document.body.appendChild(pointEl)
249
+ })
250
+
251
+ const manager = getDomEventHub('body')
252
+ manager.on({
253
+ id: 'global-events-set-point',
254
+ eventName: 'mouseup',
255
+ callback
256
+ })
257
+
258
+ manager.setPoint('#global-events-point')
259
+ waitForBind()
260
+
261
+ triggerMouseEvent('mouseup', 'body', false)
262
+ triggerMouseEvent('mouseup', '#global-events-point', false)
263
+
264
+ cy.get('@setPointCallback').should('have.been.calledOnce')
265
+
266
+ manager.setPoint('body')
267
+ waitForBind()
268
+ cy.then(() => {
269
+ document.querySelector('#global-events-point')?.remove()
270
+ })
271
+ })
272
+ })
@@ -0,0 +1,5 @@
1
+ {
2
+ "id": 8739,
3
+ "name": "Jane",
4
+ "email": "jane@example.com"
5
+ }
@@ -0,0 +1,232 @@
1
+ [
2
+ {
3
+ "id": 1,
4
+ "name": "Leanne Graham",
5
+ "username": "Bret",
6
+ "email": "Sincere@april.biz",
7
+ "address": {
8
+ "street": "Kulas Light",
9
+ "suite": "Apt. 556",
10
+ "city": "Gwenborough",
11
+ "zipcode": "92998-3874",
12
+ "geo": {
13
+ "lat": "-37.3159",
14
+ "lng": "81.1496"
15
+ }
16
+ },
17
+ "phone": "1-770-736-8031 x56442",
18
+ "website": "hildegard.org",
19
+ "company": {
20
+ "name": "Romaguera-Crona",
21
+ "catchPhrase": "Multi-layered client-server neural-net",
22
+ "bs": "harness real-time e-markets"
23
+ }
24
+ },
25
+ {
26
+ "id": 2,
27
+ "name": "Ervin Howell",
28
+ "username": "Antonette",
29
+ "email": "Shanna@melissa.tv",
30
+ "address": {
31
+ "street": "Victor Plains",
32
+ "suite": "Suite 879",
33
+ "city": "Wisokyburgh",
34
+ "zipcode": "90566-7771",
35
+ "geo": {
36
+ "lat": "-43.9509",
37
+ "lng": "-34.4618"
38
+ }
39
+ },
40
+ "phone": "010-692-6593 x09125",
41
+ "website": "anastasia.net",
42
+ "company": {
43
+ "name": "Deckow-Crist",
44
+ "catchPhrase": "Proactive didactic contingency",
45
+ "bs": "synergize scalable supply-chains"
46
+ }
47
+ },
48
+ {
49
+ "id": 3,
50
+ "name": "Clementine Bauch",
51
+ "username": "Samantha",
52
+ "email": "Nathan@yesenia.net",
53
+ "address": {
54
+ "street": "Douglas Extension",
55
+ "suite": "Suite 847",
56
+ "city": "McKenziehaven",
57
+ "zipcode": "59590-4157",
58
+ "geo": {
59
+ "lat": "-68.6102",
60
+ "lng": "-47.0653"
61
+ }
62
+ },
63
+ "phone": "1-463-123-4447",
64
+ "website": "ramiro.info",
65
+ "company": {
66
+ "name": "Romaguera-Jacobson",
67
+ "catchPhrase": "Face to face bifurcated interface",
68
+ "bs": "e-enable strategic applications"
69
+ }
70
+ },
71
+ {
72
+ "id": 4,
73
+ "name": "Patricia Lebsack",
74
+ "username": "Karianne",
75
+ "email": "Julianne.OConner@kory.org",
76
+ "address": {
77
+ "street": "Hoeger Mall",
78
+ "suite": "Apt. 692",
79
+ "city": "South Elvis",
80
+ "zipcode": "53919-4257",
81
+ "geo": {
82
+ "lat": "29.4572",
83
+ "lng": "-164.2990"
84
+ }
85
+ },
86
+ "phone": "493-170-9623 x156",
87
+ "website": "kale.biz",
88
+ "company": {
89
+ "name": "Robel-Corkery",
90
+ "catchPhrase": "Multi-tiered zero tolerance productivity",
91
+ "bs": "transition cutting-edge web services"
92
+ }
93
+ },
94
+ {
95
+ "id": 5,
96
+ "name": "Chelsey Dietrich",
97
+ "username": "Kamren",
98
+ "email": "Lucio_Hettinger@annie.ca",
99
+ "address": {
100
+ "street": "Skiles Walks",
101
+ "suite": "Suite 351",
102
+ "city": "Roscoeview",
103
+ "zipcode": "33263",
104
+ "geo": {
105
+ "lat": "-31.8129",
106
+ "lng": "62.5342"
107
+ }
108
+ },
109
+ "phone": "(254)954-1289",
110
+ "website": "demarco.info",
111
+ "company": {
112
+ "name": "Keebler LLC",
113
+ "catchPhrase": "User-centric fault-tolerant solution",
114
+ "bs": "revolutionize end-to-end systems"
115
+ }
116
+ },
117
+ {
118
+ "id": 6,
119
+ "name": "Mrs. Dennis Schulist",
120
+ "username": "Leopoldo_Corkery",
121
+ "email": "Karley_Dach@jasper.info",
122
+ "address": {
123
+ "street": "Norberto Crossing",
124
+ "suite": "Apt. 950",
125
+ "city": "South Christy",
126
+ "zipcode": "23505-1337",
127
+ "geo": {
128
+ "lat": "-71.4197",
129
+ "lng": "71.7478"
130
+ }
131
+ },
132
+ "phone": "1-477-935-8478 x6430",
133
+ "website": "ola.org",
134
+ "company": {
135
+ "name": "Considine-Lockman",
136
+ "catchPhrase": "Synchronised bottom-line interface",
137
+ "bs": "e-enable innovative applications"
138
+ }
139
+ },
140
+ {
141
+ "id": 7,
142
+ "name": "Kurtis Weissnat",
143
+ "username": "Elwyn.Skiles",
144
+ "email": "Telly.Hoeger@billy.biz",
145
+ "address": {
146
+ "street": "Rex Trail",
147
+ "suite": "Suite 280",
148
+ "city": "Howemouth",
149
+ "zipcode": "58804-1099",
150
+ "geo": {
151
+ "lat": "24.8918",
152
+ "lng": "21.8984"
153
+ }
154
+ },
155
+ "phone": "210.067.6132",
156
+ "website": "elvis.io",
157
+ "company": {
158
+ "name": "Johns Group",
159
+ "catchPhrase": "Configurable multimedia task-force",
160
+ "bs": "generate enterprise e-tailers"
161
+ }
162
+ },
163
+ {
164
+ "id": 8,
165
+ "name": "Nicholas Runolfsdottir V",
166
+ "username": "Maxime_Nienow",
167
+ "email": "Sherwood@rosamond.me",
168
+ "address": {
169
+ "street": "Ellsworth Summit",
170
+ "suite": "Suite 729",
171
+ "city": "Aliyaview",
172
+ "zipcode": "45169",
173
+ "geo": {
174
+ "lat": "-14.3990",
175
+ "lng": "-120.7677"
176
+ }
177
+ },
178
+ "phone": "586.493.6943 x140",
179
+ "website": "jacynthe.com",
180
+ "company": {
181
+ "name": "Abernathy Group",
182
+ "catchPhrase": "Implemented secondary concept",
183
+ "bs": "e-enable extensible e-tailers"
184
+ }
185
+ },
186
+ {
187
+ "id": 9,
188
+ "name": "Glenna Reichert",
189
+ "username": "Delphine",
190
+ "email": "Chaim_McDermott@dana.io",
191
+ "address": {
192
+ "street": "Dayna Park",
193
+ "suite": "Suite 449",
194
+ "city": "Bartholomebury",
195
+ "zipcode": "76495-3109",
196
+ "geo": {
197
+ "lat": "24.6463",
198
+ "lng": "-168.8889"
199
+ }
200
+ },
201
+ "phone": "(775)976-6794 x41206",
202
+ "website": "conrad.com",
203
+ "company": {
204
+ "name": "Yost and Sons",
205
+ "catchPhrase": "Switchable contextually-based project",
206
+ "bs": "aggregate real-time technologies"
207
+ }
208
+ },
209
+ {
210
+ "id": 10,
211
+ "name": "Clementina DuBuque",
212
+ "username": "Moriah.Stanton",
213
+ "email": "Rey.Padberg@karina.biz",
214
+ "address": {
215
+ "street": "Kattie Turnpike",
216
+ "suite": "Suite 198",
217
+ "city": "Lebsackbury",
218
+ "zipcode": "31428-2261",
219
+ "geo": {
220
+ "lat": "-38.2386",
221
+ "lng": "57.2232"
222
+ }
223
+ },
224
+ "phone": "024-648-3804",
225
+ "website": "ambrose.net",
226
+ "company": {
227
+ "name": "Hoeger LLC",
228
+ "catchPhrase": "Centralized empowering task-force",
229
+ "bs": "target end-to-end models"
230
+ }
231
+ }
232
+ ]