nock 13.2.0 → 13.2.4

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/lib/back.js CHANGED
@@ -263,6 +263,7 @@ function removeFixture(fixture, options) {
263
263
  }
264
264
 
265
265
  if (fixture && fixtureExists(fixture)) {
266
+ /* istanbul ignore next - fs.unlinkSync is for node 10 support */
266
267
  fs.rmSync ? fs.rmSync(fixture) : fs.unlinkSync(fixture)
267
268
  }
268
269
  context.isLoaded = false
package/lib/common.js CHANGED
@@ -194,7 +194,7 @@ function isJSONContent(headers) {
194
194
  *
195
195
  * Duplicates throw an error.
196
196
  */
197
- function headersFieldNamesToLowerCase(headers) {
197
+ function headersFieldNamesToLowerCase(headers, throwOnDuplicate) {
198
198
  if (!isPlainObject(headers)) {
199
199
  throw Error('Headers must be provided as an object')
200
200
  }
@@ -203,9 +203,15 @@ function headersFieldNamesToLowerCase(headers) {
203
203
  Object.entries(headers).forEach(([fieldName, fieldValue]) => {
204
204
  const key = fieldName.toLowerCase()
205
205
  if (lowerCaseHeaders[key] !== undefined) {
206
- throw Error(
207
- `Failed to convert header keys to lower case due to field name conflict: ${key}`
208
- )
206
+ if (throwOnDuplicate) {
207
+ throw Error(
208
+ `Failed to convert header keys to lower case due to field name conflict: ${key}`
209
+ )
210
+ } else {
211
+ debug(
212
+ `Duplicate header provided in request: ${key}. Only the last value can be matched.`
213
+ )
214
+ }
209
215
  }
210
216
  lowerCaseHeaders[key] = fieldValue
211
217
  })
@@ -547,7 +553,7 @@ function urlToOptions(url) {
547
553
  * Used for comparing decoded search parameters, request body JSON objects,
548
554
  * and URL decoded request form bodies.
549
555
  *
550
- * Performs a general recursive strict comparision with two caveats:
556
+ * Performs a general recursive strict comparison with two caveats:
551
557
  * - The expected data can use regexp to compare values
552
558
  * - JSON path notation and nested objects are considered equal
553
559
  */
@@ -40,7 +40,10 @@ class InterceptedRequestRouter {
40
40
  // affecting the user so we use a clone of the object.
41
41
  ...options,
42
42
  // We use lower-case header field names throughout Nock.
43
- headers: common.headersFieldNamesToLowerCase(options.headers || {}),
43
+ headers: common.headersFieldNamesToLowerCase(
44
+ options.headers || {},
45
+ false
46
+ ),
44
47
  }
45
48
  this.interceptors = interceptors
46
49
 
@@ -48,8 +51,14 @@ class InterceptedRequestRouter {
48
51
 
49
52
  // support setting `timeout` using request `options`
50
53
  // https://nodejs.org/docs/latest-v12.x/api/http.html#http_http_request_url_options_callback
51
- if (options.timeout) {
52
- this.socket.setTimeout(options.timeout)
54
+ // any timeout in the request options override any timeout in the agent options.
55
+ // per https://github.com/nodejs/node/pull/21204
56
+ const timeout =
57
+ options.timeout ||
58
+ (options.agent && options.agent.options && options.agent.options.timeout)
59
+
60
+ if (timeout) {
61
+ this.socket.setTimeout(timeout)
53
62
  }
54
63
 
55
64
  this.response = new IncomingMessage(this.socket)
@@ -66,7 +66,8 @@ module.exports = class Interceptor {
66
66
 
67
67
  // We use lower-case header field names throughout Nock.
68
68
  this.reqheaders = common.headersFieldNamesToLowerCase(
69
- scope.scopeOptions.reqheaders || {}
69
+ scope.scopeOptions.reqheaders || {},
70
+ true
70
71
  )
71
72
  this.badheaders = common.headersFieldsArrayToLowerCase(
72
73
  scope.scopeOptions.badheaders || []
@@ -155,7 +156,7 @@ module.exports = class Interceptor {
155
156
  )
156
157
 
157
158
  // If the content is not encoded we may need to transform the response body.
158
- // Otherwise we leave it as it is.
159
+ // Otherwise, we leave it as it is.
159
160
  if (
160
161
  body &&
161
162
  typeof body !== 'string' &&
@@ -173,10 +174,14 @@ module.exports = class Interceptor {
173
174
  // https://tools.ietf.org/html/rfc7231#section-3.1.1.5
174
175
  this.rawHeaders.push('Content-Type', 'application/json')
175
176
  }
177
+ }
176
178
 
177
- if (this.scope.contentLen) {
178
- // https://tools.ietf.org/html/rfc7230#section-3.3.2
179
+ if (this.scope.contentLen) {
180
+ // https://tools.ietf.org/html/rfc7230#section-3.3.2
181
+ if (typeof body === 'string') {
179
182
  this.rawHeaders.push('Content-Length', body.length)
183
+ } else if (Buffer.isBuffer(body)) {
184
+ this.rawHeaders.push('Content-Length', body.byteLength)
180
185
  }
181
186
  }
182
187
 
@@ -412,6 +417,12 @@ module.exports = class Interceptor {
412
417
  }
413
418
 
414
419
  matchHostName(options) {
420
+ const { basePath } = this.scope
421
+
422
+ if (basePath instanceof RegExp) {
423
+ return basePath.test(options.hostname)
424
+ }
425
+
415
426
  return options.hostname === this.scope.urlParts.hostname
416
427
  }
417
428
 
@@ -79,7 +79,7 @@ class ReadableBuffers extends stream.Readable {
79
79
  this.buffers = buffers
80
80
  }
81
81
 
82
- _read(size) {
82
+ _read(_size) {
83
83
  while (this.buffers.length) {
84
84
  if (!this.push(this.buffers.shift())) {
85
85
  return
@@ -315,7 +315,7 @@ function playbackInterceptor({
315
315
 
316
316
  // Calling `start` immediately could take the request all the way to the connection delay
317
317
  // during a single microtask execution. This setImmediate stalls the playback to ensure the
318
- // correct events are emitted first ('socket', 'finish') and any aborts in the in the queue or
318
+ // correct events are emitted first ('socket', 'finish') and any aborts in the queue or
319
319
  // called during a 'finish' listener can be called.
320
320
  common.setImmediate(() => {
321
321
  if (!common.isRequestDestroyed(req)) {
package/lib/recorder.js CHANGED
@@ -168,7 +168,7 @@ let currentRecordingId = 0
168
168
  const defaultRecordOptions = {
169
169
  dont_print: false,
170
170
  enable_reqheaders_recording: false,
171
- logging: console.log,
171
+ logging: console.log, // eslint-disable-line no-console
172
172
  output_objects: false,
173
173
  use_separator: true,
174
174
  }
package/package.json CHANGED
@@ -7,14 +7,14 @@
7
7
  "testing",
8
8
  "isolation"
9
9
  ],
10
- "version": "13.2.0",
10
+ "version": "13.2.4",
11
11
  "author": "Pedro Teixeira <pedro.teixeira@gmail.com>",
12
12
  "repository": {
13
13
  "type": "git",
14
14
  "url": "https://github.com/nock/nock.git"
15
15
  },
16
16
  "bugs": {
17
- "url": "http://github.com/nock/nock/issues"
17
+ "url": "https://github.com/nock/nock/issues"
18
18
  },
19
19
  "engines": {
20
20
  "node": ">= 10.13"
@@ -28,29 +28,28 @@
28
28
  "propagate": "^2.0.0"
29
29
  },
30
30
  "devDependencies": {
31
- "@sinonjs/fake-timers": "^8.1.0",
31
+ "@definitelytyped/dtslint": "^0.0.103",
32
+ "@sinonjs/fake-timers": "^9.0.0",
32
33
  "assert-rejects": "^1.0.0",
33
34
  "chai": "^4.1.2",
34
35
  "dirty-chai": "^2.0.1",
35
- "dtslint": "^4.0.4",
36
- "eslint": "^7.3.1",
36
+ "eslint": "^8.8.0",
37
37
  "eslint-config-prettier": "^8.1.0",
38
- "eslint-config-standard": "^16.0.2",
38
+ "eslint-config-standard": "^17.0.0-0",
39
39
  "eslint-plugin-import": "^2.16.0",
40
- "eslint-plugin-mocha": "^9.0.0",
40
+ "eslint-plugin-mocha": "^10.0.3",
41
41
  "eslint-plugin-node": "^11.0.0",
42
- "eslint-plugin-promise": "^4.1.1",
43
- "eslint-plugin-standard": "^5.0.0",
42
+ "eslint-plugin-promise": "^6.0.0",
44
43
  "form-data": "^4.0.0",
45
44
  "got": "^11.3.0",
46
- "mocha": "^8.0.1",
45
+ "mocha": "^9.1.3",
47
46
  "npm-run-all": "^4.1.5",
48
47
  "nyc": "^15.0.0",
49
- "prettier": "2.4.1",
48
+ "prettier": "2.5.1",
50
49
  "proxyquire": "^2.1.0",
51
50
  "rimraf": "^3.0.0",
52
- "semantic-release": "^17.0.2",
53
- "sinon": "^12.0.1",
51
+ "semantic-release": "^18.0.1",
52
+ "sinon": "^13.0.1",
54
53
  "sinon-chai": "^3.7.0",
55
54
  "typescript": "^4.2.2"
56
55
  },
package/types/index.d.ts CHANGED
@@ -240,7 +240,7 @@ declare namespace nock {
240
240
  options?: Options
241
241
  }
242
242
 
243
- type BackMode = 'wild' | 'dryrun' | 'record' | 'lockdown'
243
+ type BackMode = 'wild' | 'dryrun' | 'record' | 'update' | 'lockdown'
244
244
 
245
245
  interface Back {
246
246
  currentMode: BackMode
package/CHANGELOG.md DELETED
@@ -1,6 +0,0 @@
1
- # Changelog
2
-
3
- Nock’s changelog can be found directly in the [GitHub release notes](https://github.com/nock/nock/releases).
4
- These are automatically created by [semantic-release](https://github.com/semantic-release/semantic-release) based on their [commit message conventions](https://semantic-release.gitbook.io/semantic-release#commit-message-format).
5
-
6
- Migration guides are available for major versions in the [migration guides directory](https://github.com/nock/nock/tree/main/migration_guides).