deepv-code 1.0.182 → 1.0.185
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/bundle/dvcode.js +757 -753
- package/package.json +1 -1
- package/bundle/assets/help/README.md +0 -113
- package/bundle/assets/sounds/README.md +0 -74
- package/bundle/node_modules/undici/LICENSE +0 -21
- package/bundle/node_modules/undici/README.md +0 -472
- package/bundle/node_modules/undici/docs/docs/api/Agent.md +0 -83
- package/bundle/node_modules/undici/docs/docs/api/BalancedPool.md +0 -99
- package/bundle/node_modules/undici/docs/docs/api/CacheStorage.md +0 -30
- package/bundle/node_modules/undici/docs/docs/api/CacheStore.md +0 -151
- package/bundle/node_modules/undici/docs/docs/api/Client.md +0 -281
- package/bundle/node_modules/undici/docs/docs/api/ClientStats.md +0 -27
- package/bundle/node_modules/undici/docs/docs/api/Connector.md +0 -115
- package/bundle/node_modules/undici/docs/docs/api/ContentType.md +0 -57
- package/bundle/node_modules/undici/docs/docs/api/Cookies.md +0 -101
- package/bundle/node_modules/undici/docs/docs/api/Debug.md +0 -62
- package/bundle/node_modules/undici/docs/docs/api/DiagnosticsChannel.md +0 -204
- package/bundle/node_modules/undici/docs/docs/api/Dispatcher.md +0 -1200
- package/bundle/node_modules/undici/docs/docs/api/EnvHttpProxyAgent.md +0 -159
- package/bundle/node_modules/undici/docs/docs/api/Errors.md +0 -49
- package/bundle/node_modules/undici/docs/docs/api/EventSource.md +0 -45
- package/bundle/node_modules/undici/docs/docs/api/Fetch.md +0 -52
- package/bundle/node_modules/undici/docs/docs/api/H2CClient.md +0 -262
- package/bundle/node_modules/undici/docs/docs/api/MockAgent.md +0 -603
- package/bundle/node_modules/undici/docs/docs/api/MockCallHistory.md +0 -197
- package/bundle/node_modules/undici/docs/docs/api/MockCallHistoryLog.md +0 -43
- package/bundle/node_modules/undici/docs/docs/api/MockClient.md +0 -77
- package/bundle/node_modules/undici/docs/docs/api/MockErrors.md +0 -12
- package/bundle/node_modules/undici/docs/docs/api/MockPool.md +0 -548
- package/bundle/node_modules/undici/docs/docs/api/Pool.md +0 -84
- package/bundle/node_modules/undici/docs/docs/api/PoolStats.md +0 -35
- package/bundle/node_modules/undici/docs/docs/api/ProxyAgent.md +0 -227
- package/bundle/node_modules/undici/docs/docs/api/RedirectHandler.md +0 -96
- package/bundle/node_modules/undici/docs/docs/api/RetryAgent.md +0 -45
- package/bundle/node_modules/undici/docs/docs/api/RetryHandler.md +0 -117
- package/bundle/node_modules/undici/docs/docs/api/Util.md +0 -25
- package/bundle/node_modules/undici/docs/docs/api/WebSocket.md +0 -85
- package/bundle/node_modules/undici/docs/docs/api/api-lifecycle.md +0 -91
- package/bundle/node_modules/undici/docs/docs/best-practices/client-certificate.md +0 -64
- package/bundle/node_modules/undici/docs/docs/best-practices/mocking-request.md +0 -190
- package/bundle/node_modules/undici/docs/docs/best-practices/proxy.md +0 -127
- package/bundle/node_modules/undici/docs/docs/best-practices/writing-tests.md +0 -20
- package/bundle/node_modules/undici/index-fetch.js +0 -35
- package/bundle/node_modules/undici/index.d.ts +0 -3
- package/bundle/node_modules/undici/index.js +0 -183
- package/bundle/node_modules/undici/lib/api/abort-signal.js +0 -59
- package/bundle/node_modules/undici/lib/api/api-connect.js +0 -110
- package/bundle/node_modules/undici/lib/api/api-pipeline.js +0 -252
- package/bundle/node_modules/undici/lib/api/api-request.js +0 -199
- package/bundle/node_modules/undici/lib/api/api-stream.js +0 -209
- package/bundle/node_modules/undici/lib/api/api-upgrade.js +0 -110
- package/bundle/node_modules/undici/lib/api/index.js +0 -7
- package/bundle/node_modules/undici/lib/api/readable.js +0 -558
- package/bundle/node_modules/undici/lib/api/util.js +0 -95
- package/bundle/node_modules/undici/lib/cache/memory-cache-store.js +0 -234
- package/bundle/node_modules/undici/lib/cache/sqlite-cache-store.js +0 -461
- package/bundle/node_modules/undici/lib/core/connect.js +0 -164
- package/bundle/node_modules/undici/lib/core/constants.js +0 -143
- package/bundle/node_modules/undici/lib/core/diagnostics.js +0 -196
- package/bundle/node_modules/undici/lib/core/errors.js +0 -244
- package/bundle/node_modules/undici/lib/core/request.js +0 -397
- package/bundle/node_modules/undici/lib/core/symbols.js +0 -68
- package/bundle/node_modules/undici/lib/core/tree.js +0 -160
- package/bundle/node_modules/undici/lib/core/util.js +0 -988
- package/bundle/node_modules/undici/lib/dispatcher/agent.js +0 -135
- package/bundle/node_modules/undici/lib/dispatcher/balanced-pool.js +0 -206
- package/bundle/node_modules/undici/lib/dispatcher/client-h1.js +0 -1615
- package/bundle/node_modules/undici/lib/dispatcher/client-h2.js +0 -798
- package/bundle/node_modules/undici/lib/dispatcher/client.js +0 -614
- package/bundle/node_modules/undici/lib/dispatcher/dispatcher-base.js +0 -161
- package/bundle/node_modules/undici/lib/dispatcher/dispatcher.js +0 -48
- package/bundle/node_modules/undici/lib/dispatcher/env-http-proxy-agent.js +0 -151
- package/bundle/node_modules/undici/lib/dispatcher/fixed-queue.js +0 -159
- package/bundle/node_modules/undici/lib/dispatcher/h2c-client.js +0 -122
- package/bundle/node_modules/undici/lib/dispatcher/pool-base.js +0 -191
- package/bundle/node_modules/undici/lib/dispatcher/pool.js +0 -118
- package/bundle/node_modules/undici/lib/dispatcher/proxy-agent.js +0 -275
- package/bundle/node_modules/undici/lib/dispatcher/retry-agent.js +0 -35
- package/bundle/node_modules/undici/lib/global.js +0 -32
- package/bundle/node_modules/undici/lib/handler/cache-handler.js +0 -448
- package/bundle/node_modules/undici/lib/handler/cache-revalidation-handler.js +0 -124
- package/bundle/node_modules/undici/lib/handler/decorator-handler.js +0 -67
- package/bundle/node_modules/undici/lib/handler/redirect-handler.js +0 -227
- package/bundle/node_modules/undici/lib/handler/retry-handler.js +0 -342
- package/bundle/node_modules/undici/lib/handler/unwrap-handler.js +0 -96
- package/bundle/node_modules/undici/lib/handler/wrap-handler.js +0 -95
- package/bundle/node_modules/undici/lib/interceptor/cache.js +0 -372
- package/bundle/node_modules/undici/lib/interceptor/dns.js +0 -432
- package/bundle/node_modules/undici/lib/interceptor/dump.js +0 -111
- package/bundle/node_modules/undici/lib/interceptor/redirect.js +0 -21
- package/bundle/node_modules/undici/lib/interceptor/response-error.js +0 -95
- package/bundle/node_modules/undici/lib/interceptor/retry.js +0 -19
- package/bundle/node_modules/undici/lib/llhttp/.gitkeep +0 -0
- package/bundle/node_modules/undici/lib/llhttp/constants.d.ts +0 -97
- package/bundle/node_modules/undici/lib/llhttp/constants.js +0 -498
- package/bundle/node_modules/undici/lib/llhttp/constants.js.map +0 -1
- package/bundle/node_modules/undici/lib/llhttp/llhttp-wasm.js +0 -15
- package/bundle/node_modules/undici/lib/llhttp/llhttp_simd-wasm.js +0 -15
- package/bundle/node_modules/undici/lib/llhttp/utils.d.ts +0 -2
- package/bundle/node_modules/undici/lib/llhttp/utils.js +0 -15
- package/bundle/node_modules/undici/lib/llhttp/utils.js.map +0 -1
- package/bundle/node_modules/undici/lib/mock/mock-agent.js +0 -224
- package/bundle/node_modules/undici/lib/mock/mock-call-history.js +0 -248
- package/bundle/node_modules/undici/lib/mock/mock-client.js +0 -64
- package/bundle/node_modules/undici/lib/mock/mock-errors.js +0 -19
- package/bundle/node_modules/undici/lib/mock/mock-interceptor.js +0 -209
- package/bundle/node_modules/undici/lib/mock/mock-pool.js +0 -64
- package/bundle/node_modules/undici/lib/mock/mock-symbols.js +0 -31
- package/bundle/node_modules/undici/lib/mock/mock-utils.js +0 -433
- package/bundle/node_modules/undici/lib/mock/pending-interceptors-formatter.js +0 -43
- package/bundle/node_modules/undici/lib/util/cache.js +0 -368
- package/bundle/node_modules/undici/lib/util/date.js +0 -259
- package/bundle/node_modules/undici/lib/util/stats.js +0 -32
- package/bundle/node_modules/undici/lib/util/timers.js +0 -423
- package/bundle/node_modules/undici/lib/web/cache/cache.js +0 -862
- package/bundle/node_modules/undici/lib/web/cache/cachestorage.js +0 -152
- package/bundle/node_modules/undici/lib/web/cache/util.js +0 -45
- package/bundle/node_modules/undici/lib/web/cookies/constants.js +0 -12
- package/bundle/node_modules/undici/lib/web/cookies/index.js +0 -199
- package/bundle/node_modules/undici/lib/web/cookies/parse.js +0 -322
- package/bundle/node_modules/undici/lib/web/cookies/util.js +0 -282
- package/bundle/node_modules/undici/lib/web/eventsource/eventsource-stream.js +0 -399
- package/bundle/node_modules/undici/lib/web/eventsource/eventsource.js +0 -484
- package/bundle/node_modules/undici/lib/web/eventsource/util.js +0 -37
- package/bundle/node_modules/undici/lib/web/fetch/LICENSE +0 -21
- package/bundle/node_modules/undici/lib/web/fetch/body.js +0 -532
- package/bundle/node_modules/undici/lib/web/fetch/constants.js +0 -131
- package/bundle/node_modules/undici/lib/web/fetch/data-url.js +0 -744
- package/bundle/node_modules/undici/lib/web/fetch/dispatcher-weakref.js +0 -46
- package/bundle/node_modules/undici/lib/web/fetch/formdata-parser.js +0 -501
- package/bundle/node_modules/undici/lib/web/fetch/formdata.js +0 -263
- package/bundle/node_modules/undici/lib/web/fetch/global.js +0 -40
- package/bundle/node_modules/undici/lib/web/fetch/headers.js +0 -719
- package/bundle/node_modules/undici/lib/web/fetch/index.js +0 -2258
- package/bundle/node_modules/undici/lib/web/fetch/request.js +0 -1099
- package/bundle/node_modules/undici/lib/web/fetch/response.js +0 -636
- package/bundle/node_modules/undici/lib/web/fetch/util.js +0 -1782
- package/bundle/node_modules/undici/lib/web/fetch/webidl.js +0 -740
- package/bundle/node_modules/undici/lib/web/websocket/connection.js +0 -325
- package/bundle/node_modules/undici/lib/web/websocket/constants.js +0 -126
- package/bundle/node_modules/undici/lib/web/websocket/events.js +0 -331
- package/bundle/node_modules/undici/lib/web/websocket/frame.js +0 -138
- package/bundle/node_modules/undici/lib/web/websocket/permessage-deflate.js +0 -70
- package/bundle/node_modules/undici/lib/web/websocket/receiver.js +0 -454
- package/bundle/node_modules/undici/lib/web/websocket/sender.js +0 -109
- package/bundle/node_modules/undici/lib/web/websocket/stream/websocketerror.js +0 -83
- package/bundle/node_modules/undici/lib/web/websocket/stream/websocketstream.js +0 -485
- package/bundle/node_modules/undici/lib/web/websocket/util.js +0 -338
- package/bundle/node_modules/undici/lib/web/websocket/websocket.js +0 -686
- package/bundle/node_modules/undici/package.json +0 -149
- package/bundle/node_modules/undici/scripts/strip-comments.js +0 -10
- package/bundle/node_modules/undici/types/README.md +0 -6
- package/bundle/node_modules/undici/types/agent.d.ts +0 -35
- package/bundle/node_modules/undici/types/api.d.ts +0 -43
- package/bundle/node_modules/undici/types/balanced-pool.d.ts +0 -29
- package/bundle/node_modules/undici/types/cache-interceptor.d.ts +0 -172
- package/bundle/node_modules/undici/types/cache.d.ts +0 -36
- package/bundle/node_modules/undici/types/client-stats.d.ts +0 -15
- package/bundle/node_modules/undici/types/client.d.ts +0 -110
- package/bundle/node_modules/undici/types/connector.d.ts +0 -34
- package/bundle/node_modules/undici/types/content-type.d.ts +0 -21
- package/bundle/node_modules/undici/types/cookies.d.ts +0 -30
- package/bundle/node_modules/undici/types/diagnostics-channel.d.ts +0 -66
- package/bundle/node_modules/undici/types/dispatcher.d.ts +0 -281
- package/bundle/node_modules/undici/types/env-http-proxy-agent.d.ts +0 -21
- package/bundle/node_modules/undici/types/errors.d.ts +0 -171
- package/bundle/node_modules/undici/types/eventsource.d.ts +0 -61
- package/bundle/node_modules/undici/types/fetch.d.ts +0 -210
- package/bundle/node_modules/undici/types/formdata.d.ts +0 -108
- package/bundle/node_modules/undici/types/global-dispatcher.d.ts +0 -9
- package/bundle/node_modules/undici/types/global-origin.d.ts +0 -7
- package/bundle/node_modules/undici/types/h2c-client.d.ts +0 -75
- package/bundle/node_modules/undici/types/handlers.d.ts +0 -15
- package/bundle/node_modules/undici/types/header.d.ts +0 -160
- package/bundle/node_modules/undici/types/index.d.ts +0 -75
- package/bundle/node_modules/undici/types/interceptors.d.ts +0 -34
- package/bundle/node_modules/undici/types/mock-agent.d.ts +0 -68
- package/bundle/node_modules/undici/types/mock-call-history.d.ts +0 -111
- package/bundle/node_modules/undici/types/mock-client.d.ts +0 -25
- package/bundle/node_modules/undici/types/mock-errors.d.ts +0 -12
- package/bundle/node_modules/undici/types/mock-interceptor.d.ts +0 -93
- package/bundle/node_modules/undici/types/mock-pool.d.ts +0 -25
- package/bundle/node_modules/undici/types/patch.d.ts +0 -29
- package/bundle/node_modules/undici/types/pool-stats.d.ts +0 -19
- package/bundle/node_modules/undici/types/pool.d.ts +0 -41
- package/bundle/node_modules/undici/types/proxy-agent.d.ts +0 -29
- package/bundle/node_modules/undici/types/readable.d.ts +0 -68
- package/bundle/node_modules/undici/types/retry-agent.d.ts +0 -8
- package/bundle/node_modules/undici/types/retry-handler.d.ts +0 -116
- package/bundle/node_modules/undici/types/util.d.ts +0 -18
- package/bundle/node_modules/undici/types/utility.d.ts +0 -7
- package/bundle/node_modules/undici/types/webidl.d.ts +0 -266
- package/bundle/node_modules/undici/types/websocket.d.ts +0 -184
|
@@ -1,433 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const { MockNotMatchedError } = require('./mock-errors')
|
|
4
|
-
const {
|
|
5
|
-
kDispatches,
|
|
6
|
-
kMockAgent,
|
|
7
|
-
kOriginalDispatch,
|
|
8
|
-
kOrigin,
|
|
9
|
-
kGetNetConnect
|
|
10
|
-
} = require('./mock-symbols')
|
|
11
|
-
const { serializePathWithQuery } = require('../core/util')
|
|
12
|
-
const { STATUS_CODES } = require('node:http')
|
|
13
|
-
const {
|
|
14
|
-
types: {
|
|
15
|
-
isPromise
|
|
16
|
-
}
|
|
17
|
-
} = require('node:util')
|
|
18
|
-
const { InvalidArgumentError } = require('../core/errors')
|
|
19
|
-
|
|
20
|
-
function matchValue (match, value) {
|
|
21
|
-
if (typeof match === 'string') {
|
|
22
|
-
return match === value
|
|
23
|
-
}
|
|
24
|
-
if (match instanceof RegExp) {
|
|
25
|
-
return match.test(value)
|
|
26
|
-
}
|
|
27
|
-
if (typeof match === 'function') {
|
|
28
|
-
return match(value) === true
|
|
29
|
-
}
|
|
30
|
-
return false
|
|
31
|
-
}
|
|
32
|
-
|
|
33
|
-
function lowerCaseEntries (headers) {
|
|
34
|
-
return Object.fromEntries(
|
|
35
|
-
Object.entries(headers).map(([headerName, headerValue]) => {
|
|
36
|
-
return [headerName.toLocaleLowerCase(), headerValue]
|
|
37
|
-
})
|
|
38
|
-
)
|
|
39
|
-
}
|
|
40
|
-
|
|
41
|
-
/**
|
|
42
|
-
* @param {import('../../index').Headers|string[]|Record<string, string>} headers
|
|
43
|
-
* @param {string} key
|
|
44
|
-
*/
|
|
45
|
-
function getHeaderByName (headers, key) {
|
|
46
|
-
if (Array.isArray(headers)) {
|
|
47
|
-
for (let i = 0; i < headers.length; i += 2) {
|
|
48
|
-
if (headers[i].toLocaleLowerCase() === key.toLocaleLowerCase()) {
|
|
49
|
-
return headers[i + 1]
|
|
50
|
-
}
|
|
51
|
-
}
|
|
52
|
-
|
|
53
|
-
return undefined
|
|
54
|
-
} else if (typeof headers.get === 'function') {
|
|
55
|
-
return headers.get(key)
|
|
56
|
-
} else {
|
|
57
|
-
return lowerCaseEntries(headers)[key.toLocaleLowerCase()]
|
|
58
|
-
}
|
|
59
|
-
}
|
|
60
|
-
|
|
61
|
-
/** @param {string[]} headers */
|
|
62
|
-
function buildHeadersFromArray (headers) { // fetch HeadersList
|
|
63
|
-
const clone = headers.slice()
|
|
64
|
-
const entries = []
|
|
65
|
-
for (let index = 0; index < clone.length; index += 2) {
|
|
66
|
-
entries.push([clone[index], clone[index + 1]])
|
|
67
|
-
}
|
|
68
|
-
return Object.fromEntries(entries)
|
|
69
|
-
}
|
|
70
|
-
|
|
71
|
-
function matchHeaders (mockDispatch, headers) {
|
|
72
|
-
if (typeof mockDispatch.headers === 'function') {
|
|
73
|
-
if (Array.isArray(headers)) { // fetch HeadersList
|
|
74
|
-
headers = buildHeadersFromArray(headers)
|
|
75
|
-
}
|
|
76
|
-
return mockDispatch.headers(headers ? lowerCaseEntries(headers) : {})
|
|
77
|
-
}
|
|
78
|
-
if (typeof mockDispatch.headers === 'undefined') {
|
|
79
|
-
return true
|
|
80
|
-
}
|
|
81
|
-
if (typeof headers !== 'object' || typeof mockDispatch.headers !== 'object') {
|
|
82
|
-
return false
|
|
83
|
-
}
|
|
84
|
-
|
|
85
|
-
for (const [matchHeaderName, matchHeaderValue] of Object.entries(mockDispatch.headers)) {
|
|
86
|
-
const headerValue = getHeaderByName(headers, matchHeaderName)
|
|
87
|
-
|
|
88
|
-
if (!matchValue(matchHeaderValue, headerValue)) {
|
|
89
|
-
return false
|
|
90
|
-
}
|
|
91
|
-
}
|
|
92
|
-
return true
|
|
93
|
-
}
|
|
94
|
-
|
|
95
|
-
function normalizeSearchParams (query) {
|
|
96
|
-
if (typeof query !== 'string') {
|
|
97
|
-
return query
|
|
98
|
-
}
|
|
99
|
-
|
|
100
|
-
const originalQp = new URLSearchParams(query)
|
|
101
|
-
const normalizedQp = new URLSearchParams()
|
|
102
|
-
|
|
103
|
-
for (let [key, value] of originalQp.entries()) {
|
|
104
|
-
key = key.replace('[]', '')
|
|
105
|
-
|
|
106
|
-
const valueRepresentsString = /^(['"]).*\1$/.test(value)
|
|
107
|
-
if (valueRepresentsString) {
|
|
108
|
-
normalizedQp.append(key, value)
|
|
109
|
-
continue
|
|
110
|
-
}
|
|
111
|
-
|
|
112
|
-
if (value.includes(',')) {
|
|
113
|
-
const values = value.split(',')
|
|
114
|
-
for (const v of values) {
|
|
115
|
-
normalizedQp.append(key, v)
|
|
116
|
-
}
|
|
117
|
-
continue
|
|
118
|
-
}
|
|
119
|
-
|
|
120
|
-
normalizedQp.append(key, value)
|
|
121
|
-
}
|
|
122
|
-
|
|
123
|
-
return normalizedQp
|
|
124
|
-
}
|
|
125
|
-
|
|
126
|
-
function safeUrl (path) {
|
|
127
|
-
if (typeof path !== 'string') {
|
|
128
|
-
return path
|
|
129
|
-
}
|
|
130
|
-
const pathSegments = path.split('?', 3)
|
|
131
|
-
if (pathSegments.length !== 2) {
|
|
132
|
-
return path
|
|
133
|
-
}
|
|
134
|
-
|
|
135
|
-
const qp = new URLSearchParams(pathSegments.pop())
|
|
136
|
-
qp.sort()
|
|
137
|
-
return [...pathSegments, qp.toString()].join('?')
|
|
138
|
-
}
|
|
139
|
-
|
|
140
|
-
function matchKey (mockDispatch, { path, method, body, headers }) {
|
|
141
|
-
const pathMatch = matchValue(mockDispatch.path, path)
|
|
142
|
-
const methodMatch = matchValue(mockDispatch.method, method)
|
|
143
|
-
const bodyMatch = typeof mockDispatch.body !== 'undefined' ? matchValue(mockDispatch.body, body) : true
|
|
144
|
-
const headersMatch = matchHeaders(mockDispatch, headers)
|
|
145
|
-
return pathMatch && methodMatch && bodyMatch && headersMatch
|
|
146
|
-
}
|
|
147
|
-
|
|
148
|
-
function getResponseData (data) {
|
|
149
|
-
if (Buffer.isBuffer(data)) {
|
|
150
|
-
return data
|
|
151
|
-
} else if (data instanceof Uint8Array) {
|
|
152
|
-
return data
|
|
153
|
-
} else if (data instanceof ArrayBuffer) {
|
|
154
|
-
return data
|
|
155
|
-
} else if (typeof data === 'object') {
|
|
156
|
-
return JSON.stringify(data)
|
|
157
|
-
} else if (data) {
|
|
158
|
-
return data.toString()
|
|
159
|
-
} else {
|
|
160
|
-
return ''
|
|
161
|
-
}
|
|
162
|
-
}
|
|
163
|
-
|
|
164
|
-
function getMockDispatch (mockDispatches, key) {
|
|
165
|
-
const basePath = key.query ? serializePathWithQuery(key.path, key.query) : key.path
|
|
166
|
-
const resolvedPath = typeof basePath === 'string' ? safeUrl(basePath) : basePath
|
|
167
|
-
|
|
168
|
-
const resolvedPathWithoutTrailingSlash = removeTrailingSlash(resolvedPath)
|
|
169
|
-
|
|
170
|
-
// Match path
|
|
171
|
-
let matchedMockDispatches = mockDispatches
|
|
172
|
-
.filter(({ consumed }) => !consumed)
|
|
173
|
-
.filter(({ path, ignoreTrailingSlash }) => {
|
|
174
|
-
return ignoreTrailingSlash
|
|
175
|
-
? matchValue(removeTrailingSlash(safeUrl(path)), resolvedPathWithoutTrailingSlash)
|
|
176
|
-
: matchValue(safeUrl(path), resolvedPath)
|
|
177
|
-
})
|
|
178
|
-
if (matchedMockDispatches.length === 0) {
|
|
179
|
-
throw new MockNotMatchedError(`Mock dispatch not matched for path '${resolvedPath}'`)
|
|
180
|
-
}
|
|
181
|
-
|
|
182
|
-
// Match method
|
|
183
|
-
matchedMockDispatches = matchedMockDispatches.filter(({ method }) => matchValue(method, key.method))
|
|
184
|
-
if (matchedMockDispatches.length === 0) {
|
|
185
|
-
throw new MockNotMatchedError(`Mock dispatch not matched for method '${key.method}' on path '${resolvedPath}'`)
|
|
186
|
-
}
|
|
187
|
-
|
|
188
|
-
// Match body
|
|
189
|
-
matchedMockDispatches = matchedMockDispatches.filter(({ body }) => typeof body !== 'undefined' ? matchValue(body, key.body) : true)
|
|
190
|
-
if (matchedMockDispatches.length === 0) {
|
|
191
|
-
throw new MockNotMatchedError(`Mock dispatch not matched for body '${key.body}' on path '${resolvedPath}'`)
|
|
192
|
-
}
|
|
193
|
-
|
|
194
|
-
// Match headers
|
|
195
|
-
matchedMockDispatches = matchedMockDispatches.filter((mockDispatch) => matchHeaders(mockDispatch, key.headers))
|
|
196
|
-
if (matchedMockDispatches.length === 0) {
|
|
197
|
-
const headers = typeof key.headers === 'object' ? JSON.stringify(key.headers) : key.headers
|
|
198
|
-
throw new MockNotMatchedError(`Mock dispatch not matched for headers '${headers}' on path '${resolvedPath}'`)
|
|
199
|
-
}
|
|
200
|
-
|
|
201
|
-
return matchedMockDispatches[0]
|
|
202
|
-
}
|
|
203
|
-
|
|
204
|
-
function addMockDispatch (mockDispatches, key, data, opts) {
|
|
205
|
-
const baseData = { timesInvoked: 0, times: 1, persist: false, consumed: false, ...opts }
|
|
206
|
-
const replyData = typeof data === 'function' ? { callback: data } : { ...data }
|
|
207
|
-
const newMockDispatch = { ...baseData, ...key, pending: true, data: { error: null, ...replyData } }
|
|
208
|
-
mockDispatches.push(newMockDispatch)
|
|
209
|
-
return newMockDispatch
|
|
210
|
-
}
|
|
211
|
-
|
|
212
|
-
function deleteMockDispatch (mockDispatches, key) {
|
|
213
|
-
const index = mockDispatches.findIndex(dispatch => {
|
|
214
|
-
if (!dispatch.consumed) {
|
|
215
|
-
return false
|
|
216
|
-
}
|
|
217
|
-
return matchKey(dispatch, key)
|
|
218
|
-
})
|
|
219
|
-
if (index !== -1) {
|
|
220
|
-
mockDispatches.splice(index, 1)
|
|
221
|
-
}
|
|
222
|
-
}
|
|
223
|
-
|
|
224
|
-
/**
|
|
225
|
-
* @param {string} path Path to remove trailing slash from
|
|
226
|
-
*/
|
|
227
|
-
function removeTrailingSlash (path) {
|
|
228
|
-
while (path.endsWith('/')) {
|
|
229
|
-
path = path.slice(0, -1)
|
|
230
|
-
}
|
|
231
|
-
|
|
232
|
-
if (path.length === 0) {
|
|
233
|
-
path = '/'
|
|
234
|
-
}
|
|
235
|
-
|
|
236
|
-
return path
|
|
237
|
-
}
|
|
238
|
-
|
|
239
|
-
function buildKey (opts) {
|
|
240
|
-
const { path, method, body, headers, query } = opts
|
|
241
|
-
|
|
242
|
-
return {
|
|
243
|
-
path,
|
|
244
|
-
method,
|
|
245
|
-
body,
|
|
246
|
-
headers,
|
|
247
|
-
query
|
|
248
|
-
}
|
|
249
|
-
}
|
|
250
|
-
|
|
251
|
-
function generateKeyValues (data) {
|
|
252
|
-
const keys = Object.keys(data)
|
|
253
|
-
const result = []
|
|
254
|
-
for (let i = 0; i < keys.length; ++i) {
|
|
255
|
-
const key = keys[i]
|
|
256
|
-
const value = data[key]
|
|
257
|
-
const name = Buffer.from(`${key}`)
|
|
258
|
-
if (Array.isArray(value)) {
|
|
259
|
-
for (let j = 0; j < value.length; ++j) {
|
|
260
|
-
result.push(name, Buffer.from(`${value[j]}`))
|
|
261
|
-
}
|
|
262
|
-
} else {
|
|
263
|
-
result.push(name, Buffer.from(`${value}`))
|
|
264
|
-
}
|
|
265
|
-
}
|
|
266
|
-
return result
|
|
267
|
-
}
|
|
268
|
-
|
|
269
|
-
/**
|
|
270
|
-
* @see https://developer.mozilla.org/en-US/docs/Web/HTTP/Status
|
|
271
|
-
* @param {number} statusCode
|
|
272
|
-
*/
|
|
273
|
-
function getStatusText (statusCode) {
|
|
274
|
-
return STATUS_CODES[statusCode] || 'unknown'
|
|
275
|
-
}
|
|
276
|
-
|
|
277
|
-
async function getResponse (body) {
|
|
278
|
-
const buffers = []
|
|
279
|
-
for await (const data of body) {
|
|
280
|
-
buffers.push(data)
|
|
281
|
-
}
|
|
282
|
-
return Buffer.concat(buffers).toString('utf8')
|
|
283
|
-
}
|
|
284
|
-
|
|
285
|
-
/**
|
|
286
|
-
* Mock dispatch function used to simulate undici dispatches
|
|
287
|
-
*/
|
|
288
|
-
function mockDispatch (opts, handler) {
|
|
289
|
-
// Get mock dispatch from built key
|
|
290
|
-
const key = buildKey(opts)
|
|
291
|
-
const mockDispatch = getMockDispatch(this[kDispatches], key)
|
|
292
|
-
|
|
293
|
-
mockDispatch.timesInvoked++
|
|
294
|
-
|
|
295
|
-
// Here's where we resolve a callback if a callback is present for the dispatch data.
|
|
296
|
-
if (mockDispatch.data.callback) {
|
|
297
|
-
mockDispatch.data = { ...mockDispatch.data, ...mockDispatch.data.callback(opts) }
|
|
298
|
-
}
|
|
299
|
-
|
|
300
|
-
// Parse mockDispatch data
|
|
301
|
-
const { data: { statusCode, data, headers, trailers, error }, delay, persist } = mockDispatch
|
|
302
|
-
const { timesInvoked, times } = mockDispatch
|
|
303
|
-
|
|
304
|
-
// If it's used up and not persistent, mark as consumed
|
|
305
|
-
mockDispatch.consumed = !persist && timesInvoked >= times
|
|
306
|
-
mockDispatch.pending = timesInvoked < times
|
|
307
|
-
|
|
308
|
-
// If specified, trigger dispatch error
|
|
309
|
-
if (error !== null) {
|
|
310
|
-
deleteMockDispatch(this[kDispatches], key)
|
|
311
|
-
handler.onError(error)
|
|
312
|
-
return true
|
|
313
|
-
}
|
|
314
|
-
|
|
315
|
-
// Handle the request with a delay if necessary
|
|
316
|
-
if (typeof delay === 'number' && delay > 0) {
|
|
317
|
-
setTimeout(() => {
|
|
318
|
-
handleReply(this[kDispatches])
|
|
319
|
-
}, delay)
|
|
320
|
-
} else {
|
|
321
|
-
handleReply(this[kDispatches])
|
|
322
|
-
}
|
|
323
|
-
|
|
324
|
-
function handleReply (mockDispatches, _data = data) {
|
|
325
|
-
// fetch's HeadersList is a 1D string array
|
|
326
|
-
const optsHeaders = Array.isArray(opts.headers)
|
|
327
|
-
? buildHeadersFromArray(opts.headers)
|
|
328
|
-
: opts.headers
|
|
329
|
-
const body = typeof _data === 'function'
|
|
330
|
-
? _data({ ...opts, headers: optsHeaders })
|
|
331
|
-
: _data
|
|
332
|
-
|
|
333
|
-
// util.types.isPromise is likely needed for jest.
|
|
334
|
-
if (isPromise(body)) {
|
|
335
|
-
// If handleReply is asynchronous, throwing an error
|
|
336
|
-
// in the callback will reject the promise, rather than
|
|
337
|
-
// synchronously throw the error, which breaks some tests.
|
|
338
|
-
// Rather, we wait for the callback to resolve if it is a
|
|
339
|
-
// promise, and then re-run handleReply with the new body.
|
|
340
|
-
body.then((newData) => handleReply(mockDispatches, newData))
|
|
341
|
-
return
|
|
342
|
-
}
|
|
343
|
-
|
|
344
|
-
const responseData = getResponseData(body)
|
|
345
|
-
const responseHeaders = generateKeyValues(headers)
|
|
346
|
-
const responseTrailers = generateKeyValues(trailers)
|
|
347
|
-
|
|
348
|
-
handler.onConnect?.(err => handler.onError(err), null)
|
|
349
|
-
handler.onHeaders?.(statusCode, responseHeaders, resume, getStatusText(statusCode))
|
|
350
|
-
handler.onData?.(Buffer.from(responseData))
|
|
351
|
-
handler.onComplete?.(responseTrailers)
|
|
352
|
-
deleteMockDispatch(mockDispatches, key)
|
|
353
|
-
}
|
|
354
|
-
|
|
355
|
-
function resume () {}
|
|
356
|
-
|
|
357
|
-
return true
|
|
358
|
-
}
|
|
359
|
-
|
|
360
|
-
function buildMockDispatch () {
|
|
361
|
-
const agent = this[kMockAgent]
|
|
362
|
-
const origin = this[kOrigin]
|
|
363
|
-
const originalDispatch = this[kOriginalDispatch]
|
|
364
|
-
|
|
365
|
-
return function dispatch (opts, handler) {
|
|
366
|
-
if (agent.isMockActive) {
|
|
367
|
-
try {
|
|
368
|
-
mockDispatch.call(this, opts, handler)
|
|
369
|
-
} catch (error) {
|
|
370
|
-
if (error instanceof MockNotMatchedError) {
|
|
371
|
-
const netConnect = agent[kGetNetConnect]()
|
|
372
|
-
if (netConnect === false) {
|
|
373
|
-
throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect disabled)`)
|
|
374
|
-
}
|
|
375
|
-
if (checkNetConnect(netConnect, origin)) {
|
|
376
|
-
originalDispatch.call(this, opts, handler)
|
|
377
|
-
} else {
|
|
378
|
-
throw new MockNotMatchedError(`${error.message}: subsequent request to origin ${origin} was not allowed (net.connect is not enabled for this origin)`)
|
|
379
|
-
}
|
|
380
|
-
} else {
|
|
381
|
-
throw error
|
|
382
|
-
}
|
|
383
|
-
}
|
|
384
|
-
} else {
|
|
385
|
-
originalDispatch.call(this, opts, handler)
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
}
|
|
389
|
-
|
|
390
|
-
function checkNetConnect (netConnect, origin) {
|
|
391
|
-
const url = new URL(origin)
|
|
392
|
-
if (netConnect === true) {
|
|
393
|
-
return true
|
|
394
|
-
} else if (Array.isArray(netConnect) && netConnect.some((matcher) => matchValue(matcher, url.host))) {
|
|
395
|
-
return true
|
|
396
|
-
}
|
|
397
|
-
return false
|
|
398
|
-
}
|
|
399
|
-
|
|
400
|
-
function buildAndValidateMockOptions (opts) {
|
|
401
|
-
if (opts) {
|
|
402
|
-
const { agent, ...mockOptions } = opts
|
|
403
|
-
|
|
404
|
-
if ('enableCallHistory' in mockOptions && typeof mockOptions.enableCallHistory !== 'boolean') {
|
|
405
|
-
throw new InvalidArgumentError('options.enableCallHistory must to be a boolean')
|
|
406
|
-
}
|
|
407
|
-
|
|
408
|
-
if ('acceptNonStandardSearchParameters' in mockOptions && typeof mockOptions.acceptNonStandardSearchParameters !== 'boolean') {
|
|
409
|
-
throw new InvalidArgumentError('options.acceptNonStandardSearchParameters must to be a boolean')
|
|
410
|
-
}
|
|
411
|
-
|
|
412
|
-
return mockOptions
|
|
413
|
-
}
|
|
414
|
-
}
|
|
415
|
-
|
|
416
|
-
module.exports = {
|
|
417
|
-
getResponseData,
|
|
418
|
-
getMockDispatch,
|
|
419
|
-
addMockDispatch,
|
|
420
|
-
deleteMockDispatch,
|
|
421
|
-
buildKey,
|
|
422
|
-
generateKeyValues,
|
|
423
|
-
matchValue,
|
|
424
|
-
getResponse,
|
|
425
|
-
getStatusText,
|
|
426
|
-
mockDispatch,
|
|
427
|
-
buildMockDispatch,
|
|
428
|
-
checkNetConnect,
|
|
429
|
-
buildAndValidateMockOptions,
|
|
430
|
-
getHeaderByName,
|
|
431
|
-
buildHeadersFromArray,
|
|
432
|
-
normalizeSearchParams
|
|
433
|
-
}
|
|
@@ -1,43 +0,0 @@
|
|
|
1
|
-
'use strict'
|
|
2
|
-
|
|
3
|
-
const { Transform } = require('node:stream')
|
|
4
|
-
const { Console } = require('node:console')
|
|
5
|
-
|
|
6
|
-
const PERSISTENT = process.versions.icu ? '✅' : 'Y '
|
|
7
|
-
const NOT_PERSISTENT = process.versions.icu ? '❌' : 'N '
|
|
8
|
-
|
|
9
|
-
/**
|
|
10
|
-
* Gets the output of `console.table(…)` as a string.
|
|
11
|
-
*/
|
|
12
|
-
module.exports = class PendingInterceptorsFormatter {
|
|
13
|
-
constructor ({ disableColors } = {}) {
|
|
14
|
-
this.transform = new Transform({
|
|
15
|
-
transform (chunk, _enc, cb) {
|
|
16
|
-
cb(null, chunk)
|
|
17
|
-
}
|
|
18
|
-
})
|
|
19
|
-
|
|
20
|
-
this.logger = new Console({
|
|
21
|
-
stdout: this.transform,
|
|
22
|
-
inspectOptions: {
|
|
23
|
-
colors: !disableColors && !process.env.CI
|
|
24
|
-
}
|
|
25
|
-
})
|
|
26
|
-
}
|
|
27
|
-
|
|
28
|
-
format (pendingInterceptors) {
|
|
29
|
-
const withPrettyHeaders = pendingInterceptors.map(
|
|
30
|
-
({ method, path, data: { statusCode }, persist, times, timesInvoked, origin }) => ({
|
|
31
|
-
Method: method,
|
|
32
|
-
Origin: origin,
|
|
33
|
-
Path: path,
|
|
34
|
-
'Status code': statusCode,
|
|
35
|
-
Persistent: persist ? PERSISTENT : NOT_PERSISTENT,
|
|
36
|
-
Invocations: timesInvoked,
|
|
37
|
-
Remaining: persist ? Infinity : times - timesInvoked
|
|
38
|
-
}))
|
|
39
|
-
|
|
40
|
-
this.logger.table(withPrettyHeaders)
|
|
41
|
-
return this.transform.read().toString()
|
|
42
|
-
}
|
|
43
|
-
}
|