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.
- package/README.md +23 -17
- package/build/lib.config.ts +34 -29
- package/cypress/e2e/toolGetDomEventHub.cy.ts +272 -0
- package/cypress/fixtures/profile.json +5 -0
- package/cypress/fixtures/users.json +232 -0
- package/dist/br-dionysus.es.d.ts +22 -11
- package/dist/br-dionysus.es.js +3157 -3137
- package/dist/br-dionysus.umd.js +19 -19
- package/dist/index.css +1 -1
- package/package.json +4 -1
- package/packages/Hook/useTableConfig/useTableConfig.ts +5 -6
- package/packages/MTable/docs/DemoTest7.vue +2 -2
- package/packages/MTable/src/MTable.vue +10 -8
- package/packages/MVirtualTable/docs/README.md +126 -0
- package/packages/MVirtualTable/docs/demo.vue +511 -0
- package/packages/MVirtualTable/index.ts +14 -0
- package/packages/MVirtualTable/src/MVirtualTable.vue +1315 -0
- package/packages/MVirtualTable/src/types.ts +72 -0
- package/packages/SkinConfig/src/SkinConfig.vue +1 -0
- package/packages/Tool/getDomEventHub/README.md +29 -0
- package/packages/Tool/getDomEventHub/getDomEventHub.ts +117 -0
- package/packages/Tool/moneyFormat/moneyFormat.ts +4 -10
- package/packages/index.ts +16 -5
- package/packages/list.json +107 -29
- package/script/genNewComp/.template/docs/demo.vue.tpl +1 -1
- package/script/genNewComp/.template/index.ts.tpl +8 -8
- package/script/genNewComp/.template/install.ts.tpl +17 -8
- package/script/genNewComp/.template/router.ts.tpl +17 -17
- package/script/genNewComp/tplReplacer.js +79 -8
- package/script/regenerate.js +110 -0
- package/src/router.ts +118 -95
- package/vite.config.ts +29 -15
- package/web-types.json +1 -1
- package/cypress/e2e/1-getting-started/todo.cy.js +0 -143
- package/cypress/e2e/2-advanced-examples/actions.cy.js +0 -321
- package/cypress/e2e/2-advanced-examples/aliasing.cy.js +0 -39
- package/cypress/e2e/2-advanced-examples/assertions.cy.js +0 -176
- package/cypress/e2e/2-advanced-examples/connectors.cy.js +0 -98
- package/cypress/e2e/2-advanced-examples/cookies.cy.js +0 -118
- package/cypress/e2e/2-advanced-examples/cypress_api.cy.js +0 -184
- package/cypress/e2e/2-advanced-examples/files.cy.js +0 -85
- package/cypress/e2e/2-advanced-examples/location.cy.js +0 -32
- package/cypress/e2e/2-advanced-examples/misc.cy.js +0 -96
- package/cypress/e2e/2-advanced-examples/navigation.cy.js +0 -55
- package/cypress/e2e/2-advanced-examples/network_requests.cy.js +0 -163
- package/cypress/e2e/2-advanced-examples/querying.cy.js +0 -114
- package/cypress/e2e/2-advanced-examples/spies_stubs_clocks.cy.js +0 -204
- package/cypress/e2e/2-advanced-examples/storage.cy.js +0 -117
- package/cypress/e2e/2-advanced-examples/traversal.cy.js +0 -121
- package/cypress/e2e/2-advanced-examples/utilities.cy.js +0 -107
- package/cypress/e2e/2-advanced-examples/viewport.cy.js +0 -58
- package/cypress/e2e/2-advanced-examples/waiting.cy.js +0 -30
- package/cypress/e2e/2-advanced-examples/window.cy.js +0 -22
- package/packages/Tool/globalEvents/README.md +0 -23
- 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
|
-
+
|
|
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
|
-
##
|
|
5460
|
+
## 全局单例 DOM 事件任务中心 getDomEventHub
|
|
5461
|
+
|
|
5462
|
+
用于在同一 DOM 节点上集中监听事件,并允许多个组件向同一事件注册独立回调任务,避免重复绑定与相互覆盖。
|
|
5461
5463
|
|
|
5462
5464
|
### 1) 参数
|
|
5463
5465
|
|
|
5464
|
-
| 参数 | 描述
|
|
5465
|
-
|
|
5466
|
-
| point | 锚点(绑定事件的dom
|
|
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
|
-
|
|
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
|
|
package/build/lib.config.ts
CHANGED
|
@@ -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
|
-
|
|
9
|
-
build:
|
|
10
|
-
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
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
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
|
|
34
|
-
|
|
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,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
|
+
]
|