This repository has been archived by the owner on Dec 10, 2022. It is now read-only.
-
Notifications
You must be signed in to change notification settings - Fork 16
/
index.js
96 lines (80 loc) · 3.03 KB
/
index.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
var path = require("path")
var fs = require("fs")
var url = require("url")
var hock = require("hock")
var extend = require("util-extend")
var predefinedMocks = require("./lib/predefines.js").predefinedMocks
module.exports = start
function start (options, cb) {
var minReq = options.minReq === undefined ? 0 : options.minReq
var maxReq = options.maxReq === undefined ? Infinity : options.maxReq
var port = options.port === undefined ? 1331 : options.port
var mocks = options.mocks === undefined ? {} : options.mocks
var plugin = options.plugin === undefined ? function () {} : options.plugin
if (options.port === 0) options.port = '0' // work around hock 0.x stripping the port arg if false
var hockServer = hock.createHock(options, function (err) {
hockServer._server.removeListener('error', cb)
if (err) return cb(err)
var realUrl = 'http://localhost:' + hockServer.address().port
mocks = extendRoutes(mocks)
// default headers must be set before invoking plugins so that
// newly-enqueued requests inherit those default headers
hockServer.defaultReplyHeaders({ connection: 'close' })
plugin(hockServer)
Object.keys(mocks).forEach(function (method) {
Object.keys(mocks[method]).forEach(function (route) {
var status = mocks[method][route][0]
var customTarget = mocks[method][route][1]
var target
if (customTarget && typeof customTarget === "string")
target = customTarget
else
target = __dirname + "/fixtures" + route
fs.lstat(target, function (err, stats) {
if (err) return next()
if (stats.isDirectory()) return next()
return hockServer[method](route)
.many({max: maxReq, min: minReq})
.replyWithFile(status, target)
})
function replaceRegistry (res) {
return JSON.stringify(res)
.replace(/https?:\/\/registry\.npmjs\.org/ig, realUrl)
}
function next () {
var res
if (!customTarget) {
res = require(__dirname + "/fixtures" + route)
res = replaceRegistry(res)
var escapeScoped = route.replace(/^(\/@[^\/]+)\//, '$1%2f')
if (escapeScoped !== route) {
hockServer[method](escapeScoped)
.many({max: maxReq, min: minReq})
.reply(status, res)
}
return hockServer[method](route)
.many({max: maxReq, min: minReq})
.reply(status, res)
}
try {
res = require(customTarget)
} catch (e) {
res = customTarget
}
res = replaceRegistry(res)
hockServer[method](route)
.many({max: maxReq, min: minReq})
.reply(status, res)
}
})
})
cb && cb(null, hockServer)
})
hockServer._server.once('error', cb)
}
function extendRoutes (mocks) {
for (var method in mocks) {
predefinedMocks[method] = extend(predefinedMocks[method], mocks[method])
}
return predefinedMocks
}