@srfnstack/spliffy 0.9.1 → 0.9.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/package.json +2 -2
- package/src/errors.mjs +254 -0
- package/src/handler.mjs +0 -2
- package/src/routes.mjs +12 -14
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@srfnstack/spliffy",
|
|
3
|
-
"version": "0.9.
|
|
3
|
+
"version": "0.9.4",
|
|
4
4
|
"author": "snowbldr",
|
|
5
5
|
"private": false,
|
|
6
6
|
"homepage": "https://github.com/narcolepticsnowman/spliffy",
|
|
@@ -39,6 +39,6 @@
|
|
|
39
39
|
"standard": "^16.0.4",
|
|
40
40
|
"helmet": "^4.6.0",
|
|
41
41
|
"jest": "^27.3.1",
|
|
42
|
-
"node-fetch": "^2.6.
|
|
42
|
+
"node-fetch": "^2.6.7"
|
|
43
43
|
}
|
|
44
44
|
}
|
package/src/errors.mjs
ADDED
|
@@ -0,0 +1,254 @@
|
|
|
1
|
+
export class HttpError extends Error {
|
|
2
|
+
constructor (statusCode, statusMessage, body) {
|
|
3
|
+
super()
|
|
4
|
+
this.statusCode = statusCode
|
|
5
|
+
this.statusMessage = statusMessage
|
|
6
|
+
this.body = body
|
|
7
|
+
}
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
export class BadRequestError extends HttpError {
|
|
11
|
+
constructor (body) {
|
|
12
|
+
super(400, 'Bad Request', body)
|
|
13
|
+
}
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export class UnauthorizedError extends HttpError {
|
|
17
|
+
constructor (body) {
|
|
18
|
+
super(401, 'Unauthorized', body)
|
|
19
|
+
}
|
|
20
|
+
}
|
|
21
|
+
|
|
22
|
+
export class PaymentRequiredError extends HttpError {
|
|
23
|
+
constructor (body) {
|
|
24
|
+
super(402, 'Payment Required', body)
|
|
25
|
+
}
|
|
26
|
+
}
|
|
27
|
+
|
|
28
|
+
export class ForbiddenError extends HttpError {
|
|
29
|
+
constructor (body) {
|
|
30
|
+
super(403, 'Forbidden', body)
|
|
31
|
+
}
|
|
32
|
+
}
|
|
33
|
+
|
|
34
|
+
export class NotFoundError extends HttpError {
|
|
35
|
+
constructor (body) {
|
|
36
|
+
super(404, 'Not Found', body)
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
export class MethodNotAllowedError extends HttpError {
|
|
41
|
+
constructor (body) {
|
|
42
|
+
super(405, 'Method Not Allowed', body)
|
|
43
|
+
}
|
|
44
|
+
}
|
|
45
|
+
|
|
46
|
+
export class NotAcceptableError extends HttpError {
|
|
47
|
+
constructor (body) {
|
|
48
|
+
super(406, 'Not Acceptable', body)
|
|
49
|
+
}
|
|
50
|
+
}
|
|
51
|
+
|
|
52
|
+
export class ProxyAuthenticationRequiredError extends HttpError {
|
|
53
|
+
constructor (body) {
|
|
54
|
+
super(407, 'Proxy Authentication Required', body)
|
|
55
|
+
}
|
|
56
|
+
}
|
|
57
|
+
|
|
58
|
+
export class RequestTimeoutError extends HttpError {
|
|
59
|
+
constructor (body) {
|
|
60
|
+
super(408, 'Request Timeout', body)
|
|
61
|
+
}
|
|
62
|
+
}
|
|
63
|
+
|
|
64
|
+
export class ConflictError extends HttpError {
|
|
65
|
+
constructor (body) {
|
|
66
|
+
super(409, 'Conflict', body)
|
|
67
|
+
}
|
|
68
|
+
}
|
|
69
|
+
|
|
70
|
+
export class GoneError extends HttpError {
|
|
71
|
+
constructor (body) {
|
|
72
|
+
super(410, 'Gone', body)
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
|
|
76
|
+
export class LengthRequiredError extends HttpError {
|
|
77
|
+
constructor (body) {
|
|
78
|
+
super(411, 'Length Required', body)
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
export class PreconditionFailedError extends HttpError {
|
|
83
|
+
constructor (body) {
|
|
84
|
+
super(412, 'Precondition Failed', body)
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
export class PayloadTooLargeError extends HttpError {
|
|
89
|
+
constructor (body) {
|
|
90
|
+
super(413, 'Payload Too Large', body)
|
|
91
|
+
}
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
export class URITooLongError extends HttpError {
|
|
95
|
+
constructor (body) {
|
|
96
|
+
super(414, 'URI Too Long', body)
|
|
97
|
+
}
|
|
98
|
+
}
|
|
99
|
+
|
|
100
|
+
export class UnsupportedMediaTypeError extends HttpError {
|
|
101
|
+
constructor (body) {
|
|
102
|
+
super(415, 'Unsupported Media Type', body)
|
|
103
|
+
}
|
|
104
|
+
}
|
|
105
|
+
|
|
106
|
+
export class RangeNotSatisfiableError extends HttpError {
|
|
107
|
+
constructor (body) {
|
|
108
|
+
super(416, 'Bad Request', body)
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export class ExpectationFailedError extends HttpError {
|
|
113
|
+
constructor (body) {
|
|
114
|
+
super(417, 'Expectation Failed', body)
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
|
|
118
|
+
export class ImATeapotError extends HttpError {
|
|
119
|
+
constructor (body) {
|
|
120
|
+
super(418, 'I can\'t brew coffee', body)
|
|
121
|
+
}
|
|
122
|
+
}
|
|
123
|
+
|
|
124
|
+
export class EnhanceYourCalmError extends HttpError {
|
|
125
|
+
constructor (body) {
|
|
126
|
+
super(420, 'Enhance Your Calm', body)
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
|
|
130
|
+
export class MisdirectedRequestError extends HttpError {
|
|
131
|
+
constructor (body) {
|
|
132
|
+
super(421, 'Misdirected Request', body)
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
|
|
136
|
+
export class UnprocessableEntityError extends HttpError {
|
|
137
|
+
constructor (body) {
|
|
138
|
+
super(422, 'Unprocessable Entity', body)
|
|
139
|
+
}
|
|
140
|
+
}
|
|
141
|
+
|
|
142
|
+
export class LockedError extends HttpError {
|
|
143
|
+
constructor (body) {
|
|
144
|
+
super(423, 'Locked', body)
|
|
145
|
+
}
|
|
146
|
+
}
|
|
147
|
+
|
|
148
|
+
export class FailedDependencyError extends HttpError {
|
|
149
|
+
constructor (body) {
|
|
150
|
+
super(424, 'Failed Dependency', body)
|
|
151
|
+
}
|
|
152
|
+
}
|
|
153
|
+
|
|
154
|
+
export class TooEarlyError extends HttpError {
|
|
155
|
+
constructor (body) {
|
|
156
|
+
super(425, 'Too Early', body)
|
|
157
|
+
}
|
|
158
|
+
}
|
|
159
|
+
|
|
160
|
+
export class UpgradeRequiredError extends HttpError {
|
|
161
|
+
constructor (body) {
|
|
162
|
+
super(426, 'Upgrade Required', body)
|
|
163
|
+
}
|
|
164
|
+
}
|
|
165
|
+
|
|
166
|
+
export class PreconditionRequiredError extends HttpError {
|
|
167
|
+
constructor (body) {
|
|
168
|
+
super(428, 'Precondition Required', body)
|
|
169
|
+
}
|
|
170
|
+
}
|
|
171
|
+
|
|
172
|
+
export class TooManyRequestsError extends HttpError {
|
|
173
|
+
constructor (body) {
|
|
174
|
+
super(429, 'Too Many Requests', body)
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
|
|
178
|
+
export class RequestHeaderFieldsTooLargeError extends HttpError {
|
|
179
|
+
constructor (body) {
|
|
180
|
+
super(431, 'Request Header Fields Too Large', body)
|
|
181
|
+
}
|
|
182
|
+
}
|
|
183
|
+
|
|
184
|
+
export class UnavailableForLegalReasonsError extends HttpError {
|
|
185
|
+
constructor (body) {
|
|
186
|
+
super(451, 'Unavailable For Legal Reasons', body)
|
|
187
|
+
}
|
|
188
|
+
}
|
|
189
|
+
|
|
190
|
+
export class InternalServerError extends HttpError {
|
|
191
|
+
constructor (body) {
|
|
192
|
+
super(500, 'Internal Server Error', body)
|
|
193
|
+
}
|
|
194
|
+
}
|
|
195
|
+
|
|
196
|
+
export class NotImplementedError extends HttpError {
|
|
197
|
+
constructor (body) {
|
|
198
|
+
super(501, 'Not Implemented', body)
|
|
199
|
+
}
|
|
200
|
+
}
|
|
201
|
+
|
|
202
|
+
export class BadGatewayError extends HttpError {
|
|
203
|
+
constructor (body) {
|
|
204
|
+
super(502, 'Bad Gateway', body)
|
|
205
|
+
}
|
|
206
|
+
}
|
|
207
|
+
|
|
208
|
+
export class ServiceUnavailableError extends HttpError {
|
|
209
|
+
constructor (body) {
|
|
210
|
+
super(503, 'Service Unavailable', body)
|
|
211
|
+
}
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
export class GatewayTimeoutError extends HttpError {
|
|
215
|
+
constructor (body) {
|
|
216
|
+
super(504, 'Gateway Timeout', body)
|
|
217
|
+
}
|
|
218
|
+
}
|
|
219
|
+
|
|
220
|
+
export class HTTPVersionNotSupportedError extends HttpError {
|
|
221
|
+
constructor (body) {
|
|
222
|
+
super(505, 'HTTP Version Not Supported', body)
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
|
|
226
|
+
export class VariantAlsoNegotiatesError extends HttpError {
|
|
227
|
+
constructor (body) {
|
|
228
|
+
super(506, 'Variant Also Negotiates', body)
|
|
229
|
+
}
|
|
230
|
+
}
|
|
231
|
+
|
|
232
|
+
export class InsufficientStorageError extends HttpError {
|
|
233
|
+
constructor (body) {
|
|
234
|
+
super(507, 'Insufficient Storage', body)
|
|
235
|
+
}
|
|
236
|
+
}
|
|
237
|
+
|
|
238
|
+
export class LoopDetectedError extends HttpError {
|
|
239
|
+
constructor (body) {
|
|
240
|
+
super(508, 'Loop Detected', body)
|
|
241
|
+
}
|
|
242
|
+
}
|
|
243
|
+
|
|
244
|
+
export class NotExtendedError extends HttpError {
|
|
245
|
+
constructor (body) {
|
|
246
|
+
super(510, 'Not Extended', body)
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
export class NetworkAuthenticationRequiredError extends HttpError {
|
|
251
|
+
constructor (body) {
|
|
252
|
+
super(511, 'Network Authentication Required', body)
|
|
253
|
+
}
|
|
254
|
+
}
|
package/src/handler.mjs
CHANGED
|
@@ -34,7 +34,6 @@ const executeHandler = async (url, res, req, bodyPromise, handler, middleware, e
|
|
|
34
34
|
finalizeResponse(req, res, handled, handler.statusCodeOverride)
|
|
35
35
|
} catch (e) {
|
|
36
36
|
const refId = uuid()
|
|
37
|
-
log.error('handler failed', e, refId)
|
|
38
37
|
await executeMiddleware(middleware, req, res, errorTransformer, refId, e)
|
|
39
38
|
endError(res, e, refId, errorTransformer)
|
|
40
39
|
}
|
|
@@ -174,7 +173,6 @@ const handleRequest = async (req, res, handler, middleware, errorTransformer) =>
|
|
|
174
173
|
}
|
|
175
174
|
} catch (e) {
|
|
176
175
|
const refId = uuid()
|
|
177
|
-
log.error('Handling request failed', e, refId)
|
|
178
176
|
await executeMiddleware(middleware, req, res, errorTransformer, refId, e)
|
|
179
177
|
if (!res.writableEnded) { endError(res, e, refId, errorTransformer) }
|
|
180
178
|
}
|
package/src/routes.mjs
CHANGED
|
@@ -44,6 +44,16 @@ const doFindRoutes = async (config, currentFile, filePath, urlPath, pathParamete
|
|
|
44
44
|
return routes
|
|
45
45
|
}
|
|
46
46
|
|
|
47
|
+
const wrapSyntaxError = (e, path) => {
|
|
48
|
+
// Hack to workaround https://github.com/nodejs/modules/issues/471
|
|
49
|
+
if (e instanceof SyntaxError) {
|
|
50
|
+
const newError = new SyntaxError(`${e.message}. In file: ${path}`)
|
|
51
|
+
newError.stack += `\nCaused By: ${e.stack}`
|
|
52
|
+
throw newError
|
|
53
|
+
}
|
|
54
|
+
throw e
|
|
55
|
+
}
|
|
56
|
+
|
|
47
57
|
const importModules = async (config, dirPath, files) => Promise.all(
|
|
48
58
|
files
|
|
49
59
|
.filter(filterTestFiles(config))
|
|
@@ -51,14 +61,7 @@ const importModules = async (config, dirPath, files) => Promise.all(
|
|
|
51
61
|
.map(f => path.join(dirPath, f.name))
|
|
52
62
|
.map(mwPath => import(`file://${mwPath}`)
|
|
53
63
|
.then(module => ({ module, mwPath }))
|
|
54
|
-
.catch(e =>
|
|
55
|
-
// Hack to workaround https://github.com/nodejs/modules/issues/471
|
|
56
|
-
if (e instanceof SyntaxError) {
|
|
57
|
-
const newError = new SyntaxError(`${e.message}. In file: ${mwPath}`)
|
|
58
|
-
newError.stack = e.stack
|
|
59
|
-
throw newError
|
|
60
|
-
}
|
|
61
|
-
})
|
|
64
|
+
.catch(e => wrapSyntaxError(e, mwPath))
|
|
62
65
|
))
|
|
63
66
|
|
|
64
67
|
const findRoutesInDir = async (name, filePath, urlPath, inheritedMiddleware, pathParameters, config) => {
|
|
@@ -118,12 +121,7 @@ const buildJSHandlerRoute = async (name, filePath, urlPath, inheritedMiddleware,
|
|
|
118
121
|
try {
|
|
119
122
|
module = await import(`file://${filePath}`)
|
|
120
123
|
} catch (e) {
|
|
121
|
-
|
|
122
|
-
if (e instanceof SyntaxError) {
|
|
123
|
-
const newError = new SyntaxError(`${e.message}. In file: ${filePath}`)
|
|
124
|
-
newError.stack = e.stack
|
|
125
|
-
throw newError
|
|
126
|
-
}
|
|
124
|
+
wrapSyntaxError(e, filePath)
|
|
127
125
|
}
|
|
128
126
|
const handlers = module.default
|
|
129
127
|
try {
|