@spinajs/http 2.0.481 → 2.0.484
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/cjs/config/http.d.ts +15 -7
- package/lib/cjs/config/http.d.ts.map +1 -1
- package/lib/cjs/config/http.js +28 -9
- package/lib/cjs/config/http.js.map +1 -1
- package/lib/cjs/controllers.d.ts.map +1 -1
- package/lib/cjs/controllers.js +48 -12
- package/lib/cjs/controllers.js.map +1 -1
- package/lib/cjs/cookie.d.ts +8 -0
- package/lib/cjs/cookie.d.ts.map +1 -0
- package/lib/cjs/cookie.js +40 -0
- package/lib/cjs/cookie.js.map +1 -0
- package/lib/cjs/decorators.d.ts +46 -4
- package/lib/cjs/decorators.d.ts.map +1 -1
- package/lib/cjs/decorators.js +127 -23
- package/lib/cjs/decorators.js.map +1 -1
- package/lib/cjs/error.js +3 -3
- package/lib/cjs/error.js.map +1 -1
- package/lib/cjs/file-middlewares/validation.d.ts +11 -0
- package/lib/cjs/file-middlewares/validation.d.ts.map +1 -1
- package/lib/cjs/file-middlewares/validation.js +52 -9
- package/lib/cjs/file-middlewares/validation.js.map +1 -1
- package/lib/cjs/file-middlewares/zip.d.ts.map +1 -1
- package/lib/cjs/file-middlewares/zip.js +6 -1
- package/lib/cjs/file-middlewares/zip.js.map +1 -1
- package/lib/cjs/index.d.ts +1 -0
- package/lib/cjs/index.d.ts.map +1 -1
- package/lib/cjs/index.js +1 -0
- package/lib/cjs/index.js.map +1 -1
- package/lib/cjs/interfaces.d.ts +95 -1
- package/lib/cjs/interfaces.d.ts.map +1 -1
- package/lib/cjs/interfaces.js +100 -4
- package/lib/cjs/interfaces.js.map +1 -1
- package/lib/cjs/middlewares/PerfRollup.d.ts +19 -0
- package/lib/cjs/middlewares/PerfRollup.d.ts.map +1 -0
- package/lib/cjs/middlewares/PerfRollup.js +61 -0
- package/lib/cjs/middlewares/PerfRollup.js.map +1 -0
- package/lib/cjs/middlewares/RequestId.d.ts +1 -2
- package/lib/cjs/middlewares/RequestId.d.ts.map +1 -1
- package/lib/cjs/middlewares/RequestId.js +19 -5
- package/lib/cjs/middlewares/RequestId.js.map +1 -1
- package/lib/cjs/middlewares/ResponseTime.d.ts +1 -2
- package/lib/cjs/middlewares/ResponseTime.d.ts.map +1 -1
- package/lib/cjs/middlewares/ResponseTime.js +29 -11
- package/lib/cjs/middlewares/ResponseTime.js.map +1 -1
- package/lib/cjs/response-methods/file.d.ts.map +1 -1
- package/lib/cjs/response-methods/file.js +47 -21
- package/lib/cjs/response-methods/file.js.map +1 -1
- package/lib/cjs/response-methods/index.d.ts +3 -0
- package/lib/cjs/response-methods/index.d.ts.map +1 -1
- package/lib/cjs/response-methods/index.js +3 -0
- package/lib/cjs/response-methods/index.js.map +1 -1
- package/lib/cjs/response-methods/redirect.d.ts +11 -4
- package/lib/cjs/response-methods/redirect.d.ts.map +1 -1
- package/lib/cjs/response-methods/redirect.js +14 -4
- package/lib/cjs/response-methods/redirect.js.map +1 -1
- package/lib/cjs/response-methods/xml.d.ts +17 -0
- package/lib/cjs/response-methods/xml.d.ts.map +1 -0
- package/lib/cjs/response-methods/xml.js +26 -0
- package/lib/cjs/response-methods/xml.js.map +1 -0
- package/lib/cjs/responses.d.ts +10 -0
- package/lib/cjs/responses.d.ts.map +1 -1
- package/lib/cjs/responses.js +94 -35
- package/lib/cjs/responses.js.map +1 -1
- package/lib/cjs/route-args/FromBody.d.ts.map +1 -1
- package/lib/cjs/route-args/FromBody.js +6 -1
- package/lib/cjs/route-args/FromBody.js.map +1 -1
- package/lib/cjs/route-args/FromForm.d.ts +1 -1
- package/lib/cjs/route-args/FromForm.d.ts.map +1 -1
- package/lib/cjs/route-args/FromForm.js +116 -37
- package/lib/cjs/route-args/FromForm.js.map +1 -1
- package/lib/cjs/route-args/FromXml.d.ts +17 -0
- package/lib/cjs/route-args/FromXml.d.ts.map +1 -0
- package/lib/cjs/route-args/FromXml.js +55 -0
- package/lib/cjs/route-args/FromXml.js.map +1 -0
- package/lib/cjs/route-args/RequestContext.d.ts +43 -0
- package/lib/cjs/route-args/RequestContext.d.ts.map +1 -0
- package/lib/cjs/route-args/RequestContext.js +94 -0
- package/lib/cjs/route-args/RequestContext.js.map +1 -0
- package/lib/cjs/route-args/RequestFields.d.ts +1 -1
- package/lib/cjs/route-args/RequestFields.d.ts.map +1 -1
- package/lib/cjs/route-args/RequestFields.js +1 -0
- package/lib/cjs/route-args/RequestFields.js.map +1 -1
- package/lib/cjs/route-args/RouteArgs.d.ts.map +1 -1
- package/lib/cjs/route-args/RouteArgs.js +50 -10
- package/lib/cjs/route-args/RouteArgs.js.map +1 -1
- package/lib/cjs/route-args/index.d.ts +2 -0
- package/lib/cjs/route-args/index.d.ts.map +1 -1
- package/lib/cjs/route-args/index.js +2 -0
- package/lib/cjs/route-args/index.js.map +1 -1
- package/lib/cjs/server.d.ts +36 -3
- package/lib/cjs/server.d.ts.map +1 -1
- package/lib/cjs/server.js +131 -42
- package/lib/cjs/server.js.map +1 -1
- package/lib/mjs/config/http.d.ts +15 -7
- package/lib/mjs/config/http.d.ts.map +1 -1
- package/lib/mjs/config/http.js +28 -9
- package/lib/mjs/config/http.js.map +1 -1
- package/lib/mjs/controllers.d.ts.map +1 -1
- package/lib/mjs/controllers.js +46 -10
- package/lib/mjs/controllers.js.map +1 -1
- package/lib/mjs/cookie.d.ts +8 -0
- package/lib/mjs/cookie.d.ts.map +1 -0
- package/lib/mjs/cookie.js +32 -0
- package/lib/mjs/cookie.js.map +1 -0
- package/lib/mjs/decorators.d.ts +46 -4
- package/lib/mjs/decorators.d.ts.map +1 -1
- package/lib/mjs/decorators.js +121 -24
- package/lib/mjs/decorators.js.map +1 -1
- package/lib/mjs/error.js +3 -3
- package/lib/mjs/error.js.map +1 -1
- package/lib/mjs/file-middlewares/validation.d.ts +11 -0
- package/lib/mjs/file-middlewares/validation.d.ts.map +1 -1
- package/lib/mjs/file-middlewares/validation.js +53 -10
- package/lib/mjs/file-middlewares/validation.js.map +1 -1
- package/lib/mjs/file-middlewares/zip.d.ts.map +1 -1
- package/lib/mjs/file-middlewares/zip.js +6 -1
- package/lib/mjs/file-middlewares/zip.js.map +1 -1
- package/lib/mjs/index.d.ts +1 -0
- package/lib/mjs/index.d.ts.map +1 -1
- package/lib/mjs/index.js +1 -0
- package/lib/mjs/index.js.map +1 -1
- package/lib/mjs/interfaces.d.ts +95 -1
- package/lib/mjs/interfaces.d.ts.map +1 -1
- package/lib/mjs/interfaces.js +65 -2
- package/lib/mjs/interfaces.js.map +1 -1
- package/lib/mjs/middlewares/PerfRollup.d.ts +19 -0
- package/lib/mjs/middlewares/PerfRollup.d.ts.map +1 -0
- package/lib/mjs/middlewares/PerfRollup.js +58 -0
- package/lib/mjs/middlewares/PerfRollup.js.map +1 -0
- package/lib/mjs/middlewares/RequestId.d.ts +1 -2
- package/lib/mjs/middlewares/RequestId.d.ts.map +1 -1
- package/lib/mjs/middlewares/RequestId.js +19 -5
- package/lib/mjs/middlewares/RequestId.js.map +1 -1
- package/lib/mjs/middlewares/ResponseTime.d.ts +1 -2
- package/lib/mjs/middlewares/ResponseTime.d.ts.map +1 -1
- package/lib/mjs/middlewares/ResponseTime.js +29 -11
- package/lib/mjs/middlewares/ResponseTime.js.map +1 -1
- package/lib/mjs/response-methods/file.d.ts.map +1 -1
- package/lib/mjs/response-methods/file.js +41 -15
- package/lib/mjs/response-methods/file.js.map +1 -1
- package/lib/mjs/response-methods/index.d.ts +3 -0
- package/lib/mjs/response-methods/index.d.ts.map +1 -1
- package/lib/mjs/response-methods/index.js +3 -0
- package/lib/mjs/response-methods/index.js.map +1 -1
- package/lib/mjs/response-methods/redirect.d.ts +11 -4
- package/lib/mjs/response-methods/redirect.d.ts.map +1 -1
- package/lib/mjs/response-methods/redirect.js +15 -5
- package/lib/mjs/response-methods/redirect.js.map +1 -1
- package/lib/mjs/response-methods/xml.d.ts +17 -0
- package/lib/mjs/response-methods/xml.d.ts.map +1 -0
- package/lib/mjs/response-methods/xml.js +22 -0
- package/lib/mjs/response-methods/xml.js.map +1 -0
- package/lib/mjs/responses.d.ts +10 -0
- package/lib/mjs/responses.d.ts.map +1 -1
- package/lib/mjs/responses.js +93 -35
- package/lib/mjs/responses.js.map +1 -1
- package/lib/mjs/route-args/FromBody.d.ts.map +1 -1
- package/lib/mjs/route-args/FromBody.js +6 -1
- package/lib/mjs/route-args/FromBody.js.map +1 -1
- package/lib/mjs/route-args/FromForm.d.ts +1 -1
- package/lib/mjs/route-args/FromForm.d.ts.map +1 -1
- package/lib/mjs/route-args/FromForm.js +114 -38
- package/lib/mjs/route-args/FromForm.js.map +1 -1
- package/lib/mjs/route-args/FromXml.d.ts +17 -0
- package/lib/mjs/route-args/FromXml.d.ts.map +1 -0
- package/lib/mjs/route-args/FromXml.js +52 -0
- package/lib/mjs/route-args/FromXml.js.map +1 -0
- package/lib/mjs/route-args/RequestContext.d.ts +43 -0
- package/lib/mjs/route-args/RequestContext.d.ts.map +1 -0
- package/lib/mjs/route-args/RequestContext.js +91 -0
- package/lib/mjs/route-args/RequestContext.js.map +1 -0
- package/lib/mjs/route-args/RequestFields.d.ts +1 -1
- package/lib/mjs/route-args/RequestFields.d.ts.map +1 -1
- package/lib/mjs/route-args/RequestFields.js +1 -0
- package/lib/mjs/route-args/RequestFields.js.map +1 -1
- package/lib/mjs/route-args/RouteArgs.d.ts.map +1 -1
- package/lib/mjs/route-args/RouteArgs.js +51 -11
- package/lib/mjs/route-args/RouteArgs.js.map +1 -1
- package/lib/mjs/route-args/index.d.ts +2 -0
- package/lib/mjs/route-args/index.d.ts.map +1 -1
- package/lib/mjs/route-args/index.js +2 -0
- package/lib/mjs/route-args/index.js.map +1 -1
- package/lib/mjs/server.d.ts +36 -3
- package/lib/mjs/server.d.ts.map +1 -1
- package/lib/mjs/server.js +132 -43
- package/lib/mjs/server.js.map +1 -1
- package/lib/tsconfig.cjs.tsbuildinfo +1 -1
- package/lib/tsconfig.mjs.tsbuildinfo +1 -1
- package/package.json +17 -12
|
@@ -7,9 +7,12 @@ exports.JsonFileResponse = exports.FileResponse = exports.ZipResponse = void 0;
|
|
|
7
7
|
const di_1 = require("@spinajs/di");
|
|
8
8
|
const exceptions_1 = require("@spinajs/exceptions");
|
|
9
9
|
const lodash_1 = __importDefault(require("lodash"));
|
|
10
|
-
const
|
|
10
|
+
const fs_1 = require("fs");
|
|
11
|
+
const path_1 = require("path");
|
|
11
12
|
const interfaces_js_1 = require("./../interfaces.js");
|
|
12
|
-
|
|
13
|
+
// import from the defining module, not the package barrel - '../index.js' pulls
|
|
14
|
+
// the whole export graph back through interfaces.js and re-forms an import cycle
|
|
15
|
+
const responses_js_1 = require("../responses.js");
|
|
13
16
|
class ZipResponse extends interfaces_js_1.Response {
|
|
14
17
|
/**
|
|
15
18
|
* Sends zipped file to client at given path & filename. If file exists
|
|
@@ -19,7 +22,10 @@ class ZipResponse extends interfaces_js_1.Response {
|
|
|
19
22
|
super(null);
|
|
20
23
|
this.Options = Options;
|
|
21
24
|
this.responseOptions = responseOptions;
|
|
22
|
-
|
|
25
|
+
// The payload is always a zip archive — default to application/zip rather
|
|
26
|
+
// than deriving from the (original) download filename, which would mislabel
|
|
27
|
+
// e.g. a zipped `report.txt` as text/plain.
|
|
28
|
+
this.Options.mimeType = Options.mimeType ?? 'application/zip';
|
|
23
29
|
this.Options.provider = Options.provider ?? 'local';
|
|
24
30
|
}
|
|
25
31
|
async execute(_req, res) {
|
|
@@ -32,9 +38,9 @@ class ZipResponse extends interfaces_js_1.Response {
|
|
|
32
38
|
const fPath = zippedFile.asFilePath();
|
|
33
39
|
return new Promise((resolve, reject) => {
|
|
34
40
|
const encodedFilename = encodeURIComponent(this.Options.filename);
|
|
35
|
-
(0,
|
|
36
|
-
(0,
|
|
37
|
-
res.setHeader('Content-Type', this.Options.mimeType || 'application/
|
|
41
|
+
(0, responses_js_1._setCoockies)(res, this.responseOptions);
|
|
42
|
+
(0, responses_js_1._setHeaders)(res, this.responseOptions);
|
|
43
|
+
res.setHeader('Content-Type', this.Options.mimeType || 'application/zip');
|
|
38
44
|
res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${encodedFilename}`);
|
|
39
45
|
res.sendFile(zippedFile.fs.resolvePath(fPath), (err) => {
|
|
40
46
|
zippedFile.fs.rm(fPath).finally(() => {
|
|
@@ -59,7 +65,11 @@ class FileResponse extends interfaces_js_1.Response {
|
|
|
59
65
|
super(null);
|
|
60
66
|
this.Options = Options;
|
|
61
67
|
this.responseOptions = responseOptions;
|
|
62
|
-
|
|
68
|
+
// Do NOT default the mime type here. When the caller doesn't specify one we
|
|
69
|
+
// let res.sendFile derive it from the actual file, which yields the correct
|
|
70
|
+
// charset for text types (e.g. `text/plain; charset=utf-8`) and the right
|
|
71
|
+
// type for binaries — deriving it from the filename dropped the charset.
|
|
72
|
+
this.Options.mimeType = Options.mimeType;
|
|
63
73
|
this.Options.provider = Options.provider ?? 'local';
|
|
64
74
|
}
|
|
65
75
|
async execute(_req, res) {
|
|
@@ -72,27 +82,41 @@ class FileResponse extends interfaces_js_1.Response {
|
|
|
72
82
|
throw new exceptions_1.ResourceNotFound(`File ${this.Options.path} not exists`);
|
|
73
83
|
}
|
|
74
84
|
const file = await provider.download(this.Options.path);
|
|
85
|
+
// A local provider returns the real on-disk file (must NOT be deleted); a
|
|
86
|
+
// remote provider downloads to a throwaway temp copy that must be cleaned
|
|
87
|
+
// up after sending. Detect the local case by the file living under the
|
|
88
|
+
// provider's own base path.
|
|
89
|
+
const basePath = provider.Options?.basePath;
|
|
90
|
+
const isLocalRealFile = !!basePath && (0, path_1.resolve)(file).startsWith((0, path_1.resolve)(basePath));
|
|
75
91
|
return new Promise((resolve, reject) => {
|
|
76
92
|
const encodedFilename = encodeURIComponent(this.Options.filename);
|
|
77
|
-
(0,
|
|
78
|
-
(0,
|
|
79
|
-
|
|
93
|
+
(0, responses_js_1._setCoockies)(res, this.responseOptions);
|
|
94
|
+
(0, responses_js_1._setHeaders)(res, this.responseOptions);
|
|
95
|
+
// Only pin the Content-Type when the caller gave an explicit mime type;
|
|
96
|
+
// otherwise let sendFile set it from the file (correct charset / type).
|
|
97
|
+
if (this.Options.mimeType) {
|
|
98
|
+
res.setHeader('Content-Type', this.Options.mimeType);
|
|
99
|
+
}
|
|
80
100
|
res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${encodedFilename}`);
|
|
81
101
|
res.sendFile(file, (err) => {
|
|
82
|
-
const
|
|
102
|
+
const cleanups = [];
|
|
103
|
+
// Remove the source file on the provider when requested.
|
|
104
|
+
if (this.Options.deleteAfterDownload) {
|
|
105
|
+
cleanups.push(provider.rm(this.Options.path).catch(() => undefined));
|
|
106
|
+
}
|
|
107
|
+
// Remove the downloaded temp copy for remote providers (never the real
|
|
108
|
+
// local file).
|
|
109
|
+
if (!isLocalRealFile) {
|
|
110
|
+
cleanups.push(fs_1.promises.unlink(file).catch(() => undefined));
|
|
111
|
+
}
|
|
112
|
+
Promise.allSettled(cleanups).finally(() => {
|
|
83
113
|
if (!lodash_1.default.isNil(err)) {
|
|
84
114
|
reject(err);
|
|
85
115
|
}
|
|
86
116
|
else {
|
|
87
117
|
resolve();
|
|
88
118
|
}
|
|
89
|
-
};
|
|
90
|
-
if (this.Options.deleteAfterDownload) {
|
|
91
|
-
provider.rm(this.Options.path).finally(r);
|
|
92
|
-
}
|
|
93
|
-
else {
|
|
94
|
-
r();
|
|
95
|
-
}
|
|
119
|
+
});
|
|
96
120
|
});
|
|
97
121
|
});
|
|
98
122
|
}
|
|
@@ -108,11 +132,13 @@ class JsonFileResponse extends interfaces_js_1.Response {
|
|
|
108
132
|
async execute(_req, res) {
|
|
109
133
|
const provider = await di_1.DI.resolve('__file_provider__', ['fs-temp']);
|
|
110
134
|
const tmpPath = provider.tmppath();
|
|
111
|
-
|
|
135
|
+
// Must await: sendFile below races the write otherwise and can hit the
|
|
136
|
+
// path before it exists, producing an intermittent ENOENT / 500.
|
|
137
|
+
await provider.write(tmpPath, JSON.stringify(this.data));
|
|
112
138
|
return new Promise((resolve, reject) => {
|
|
113
139
|
const encodedFilename = encodeURIComponent(this.filename);
|
|
114
|
-
(0,
|
|
115
|
-
(0,
|
|
140
|
+
(0, responses_js_1._setCoockies)(res, this.responseOptions);
|
|
141
|
+
(0, responses_js_1._setHeaders)(res, this.responseOptions);
|
|
116
142
|
res.setHeader('Content-Type', 'application/json');
|
|
117
143
|
res.setHeader('Content-Disposition', `attachment; filename*=UTF-8''${encodedFilename}`);
|
|
118
144
|
res.sendFile(tmpPath, (err) => {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../src/response-methods/file.ts"],"names":[],"mappings":";;;;;;AAAA,oCAAiC;AACjC,oDAA+D;AAE/D,oDAAuB;AACvB,
|
|
1
|
+
{"version":3,"file":"file.js","sourceRoot":"","sources":["../../../src/response-methods/file.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,12 +5,15 @@ export * from './forbidden.js';
|
|
|
5
5
|
export * from './noContent.js';
|
|
6
6
|
export * from './notFound.js';
|
|
7
7
|
export * from './json.js';
|
|
8
|
+
export * from './xml.js';
|
|
8
9
|
export * from './ok.js';
|
|
9
10
|
export * from './template.js';
|
|
11
|
+
export * from './redirect.js';
|
|
10
12
|
export * from './serverError.js';
|
|
11
13
|
export * from './unauthorized.js';
|
|
12
14
|
export * from './conflict.js';
|
|
13
15
|
export * from './notAllowed.js';
|
|
16
|
+
export * from './notAcceptable.js';
|
|
14
17
|
export * from './validationError.js';
|
|
15
18
|
export * from './entityTooLarge.js';
|
|
16
19
|
//# sourceMappingURL=index.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/response-methods/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/response-methods/index.ts"],"names":[],"mappings":"AAAA,cAAc,iBAAiB,CAAC;AAChC,cAAc,cAAc,CAAC;AAC7B,cAAc,WAAW,CAAC;AAC1B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,gBAAgB,CAAC;AAC/B,cAAc,eAAe,CAAC;AAC9B,cAAc,WAAW,CAAC;AAC1B,cAAc,UAAU,CAAC;AACzB,cAAc,SAAS,CAAC;AACxB,cAAc,eAAe,CAAC;AAC9B,cAAc,eAAe,CAAC;AAC9B,cAAc,kBAAkB,CAAC;AACjC,cAAc,mBAAmB,CAAC;AAClC,cAAc,eAAe,CAAC;AAC9B,cAAc,iBAAiB,CAAC;AAChC,cAAc,oBAAoB,CAAC;AACnC,cAAc,sBAAsB,CAAC;AACrC,cAAc,qBAAqB,CAAC"}
|
|
@@ -21,12 +21,15 @@ __exportStar(require("./forbidden.js"), exports);
|
|
|
21
21
|
__exportStar(require("./noContent.js"), exports);
|
|
22
22
|
__exportStar(require("./notFound.js"), exports);
|
|
23
23
|
__exportStar(require("./json.js"), exports);
|
|
24
|
+
__exportStar(require("./xml.js"), exports);
|
|
24
25
|
__exportStar(require("./ok.js"), exports);
|
|
25
26
|
__exportStar(require("./template.js"), exports);
|
|
27
|
+
__exportStar(require("./redirect.js"), exports);
|
|
26
28
|
__exportStar(require("./serverError.js"), exports);
|
|
27
29
|
__exportStar(require("./unauthorized.js"), exports);
|
|
28
30
|
__exportStar(require("./conflict.js"), exports);
|
|
29
31
|
__exportStar(require("./notAllowed.js"), exports);
|
|
32
|
+
__exportStar(require("./notAcceptable.js"), exports);
|
|
30
33
|
__exportStar(require("./validationError.js"), exports);
|
|
31
34
|
__exportStar(require("./entityTooLarge.js"), exports);
|
|
32
35
|
//# sourceMappingURL=index.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/response-methods/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,+CAA6B;AAC7B,4CAA0B;AAC1B,iDAA+B;AAC/B,iDAA+B;AAC/B,gDAA8B;AAC9B,4CAA0B;AAC1B,0CAAwB;AACxB,gDAA8B;AAC9B,mDAAiC;AACjC,oDAAkC;AAClC,gDAA8B;AAC9B,kDAAgC;AAChC,uDAAqC;AACrC,sDAAoC"}
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/response-methods/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAAA,kDAAgC;AAChC,+CAA6B;AAC7B,4CAA0B;AAC1B,iDAA+B;AAC/B,iDAA+B;AAC/B,gDAA8B;AAC9B,4CAA0B;AAC1B,2CAAyB;AACzB,0CAAwB;AACxB,gDAA8B;AAC9B,gDAA8B;AAC9B,mDAAiC;AACjC,oDAAkC;AAClC,gDAA8B;AAC9B,kDAAgC;AAChC,qDAAmC;AACnC,uDAAqC;AACrC,sDAAoC"}
|
|
@@ -1,13 +1,20 @@
|
|
|
1
1
|
import * as express from 'express';
|
|
2
|
-
import { Response } from '../interfaces.js';
|
|
2
|
+
import { IResponseOptions, Response } from '../interfaces.js';
|
|
3
3
|
/**
|
|
4
|
-
* Redirects to another
|
|
4
|
+
* Redirects to another url. Simple alias over res.redirect for api consistency,
|
|
5
|
+
* with control over the redirect status code and the ability to set cookies /
|
|
6
|
+
* headers on the redirect response (useful for auth flows).
|
|
5
7
|
*
|
|
6
|
-
* @param url - url
|
|
8
|
+
* @param url - target url
|
|
9
|
+
* @param status - redirect status code (default 302 FOUND). Use 301/308 for
|
|
10
|
+
* permanent, 307 to preserve method/body.
|
|
11
|
+
* @param responseOptions - cookies / headers to set before redirecting
|
|
7
12
|
*/
|
|
8
13
|
export declare class Redirect extends Response {
|
|
14
|
+
protected responseOptions?: IResponseOptions | undefined;
|
|
9
15
|
protected url: string;
|
|
10
|
-
|
|
16
|
+
protected status: number;
|
|
17
|
+
constructor(url: string, status?: number, responseOptions?: IResponseOptions | undefined);
|
|
11
18
|
execute(_req: express.Request, res: express.Response): Promise<void>;
|
|
12
19
|
}
|
|
13
20
|
//# sourceMappingURL=redirect.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect.d.ts","sourceRoot":"","sources":["../../../src/response-methods/redirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;
|
|
1
|
+
{"version":3,"file":"redirect.d.ts","sourceRoot":"","sources":["../../../src/response-methods/redirect.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAoB,gBAAgB,EAAE,QAAQ,EAAE,MAAM,kBAAkB,CAAC;AAGhF;;;;;;;;;GASG;AACH,qBAAa,QAAS,SAAQ,QAAQ;IAI8B,SAAS,CAAC,eAAe,CAAC,EAAE,gBAAgB;IAH9G,SAAS,CAAC,GAAG,EAAE,MAAM,CAAC;IACtB,SAAS,CAAC,MAAM,EAAE,MAAM,CAAC;gBAEb,GAAG,EAAE,MAAM,EAAE,MAAM,GAAE,MAA+B,EAAY,eAAe,CAAC,EAAE,gBAAgB,YAAA;IAOjG,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,GAAG,EAAE,OAAO,CAAC,QAAQ;CAMlE"}
|
|
@@ -2,18 +2,28 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.Redirect = void 0;
|
|
4
4
|
const interfaces_js_1 = require("../interfaces.js");
|
|
5
|
+
const responses_js_1 = require("../responses.js");
|
|
5
6
|
/**
|
|
6
|
-
* Redirects to another
|
|
7
|
+
* Redirects to another url. Simple alias over res.redirect for api consistency,
|
|
8
|
+
* with control over the redirect status code and the ability to set cookies /
|
|
9
|
+
* headers on the redirect response (useful for auth flows).
|
|
7
10
|
*
|
|
8
|
-
* @param url - url
|
|
11
|
+
* @param url - target url
|
|
12
|
+
* @param status - redirect status code (default 302 FOUND). Use 301/308 for
|
|
13
|
+
* permanent, 307 to preserve method/body.
|
|
14
|
+
* @param responseOptions - cookies / headers to set before redirecting
|
|
9
15
|
*/
|
|
10
16
|
class Redirect extends interfaces_js_1.Response {
|
|
11
|
-
constructor(url) {
|
|
17
|
+
constructor(url, status = interfaces_js_1.HTTP_STATUS_CODE.FOUND, responseOptions) {
|
|
12
18
|
super(null);
|
|
19
|
+
this.responseOptions = responseOptions;
|
|
13
20
|
this.url = url;
|
|
21
|
+
this.status = status;
|
|
14
22
|
}
|
|
15
23
|
async execute(_req, res) {
|
|
16
|
-
|
|
24
|
+
(0, responses_js_1._setCoockies)(res, this.responseOptions);
|
|
25
|
+
(0, responses_js_1._setHeaders)(res, this.responseOptions);
|
|
26
|
+
res.redirect(this.status, this.url);
|
|
17
27
|
}
|
|
18
28
|
}
|
|
19
29
|
exports.Redirect = Redirect;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../../../src/response-methods/redirect.ts"],"names":[],"mappings":";;;AACA,
|
|
1
|
+
{"version":3,"file":"redirect.js","sourceRoot":"","sources":["../../../src/response-methods/redirect.ts"],"names":[],"mappings":";;;AACA,oDAAgF;AAChF,kDAA4D;AAE5D;;;;;;;;;GASG;AACH,MAAa,QAAS,SAAQ,wBAAQ;IAIpC,YAAY,GAAW,EAAE,SAAiB,gCAAgB,CAAC,KAAK,EAAY,eAAkC;QAC5G,KAAK,CAAC,IAAI,CAAC,CAAC;QAD8D,oBAAe,GAAf,eAAe,CAAmB;QAG5G,IAAI,CAAC,GAAG,GAAG,GAAG,CAAC;QACf,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IACvB,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,IAAqB,EAAE,GAAqB;QAC/D,IAAA,2BAAY,EAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QACxC,IAAA,0BAAW,EAAC,GAAG,EAAE,IAAI,CAAC,eAAe,CAAC,CAAC;QAEvC,GAAG,CAAC,QAAQ,CAAC,IAAI,CAAC,MAAM,EAAE,IAAI,CAAC,GAAG,CAAC,CAAC;IACtC,CAAC;CACF;AAjBD,4BAiBC"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
import * as express from 'express';
|
|
2
|
+
import { HTTP_STATUS_CODE, IResponseOptions, Response, ResponseFunction } from '../interfaces.js';
|
|
3
|
+
/**
|
|
4
|
+
* Returns an HTTP 200 response with an XML body, bypassing Accept-header
|
|
5
|
+
* negotiation. Use when the endpoint must always respond with XML. The data
|
|
6
|
+
* should be a plain object graph; arrays / scalars are wrapped under a
|
|
7
|
+
* `<response>` root. Optional fast-xml-parser XMLBuilder options can be passed.
|
|
8
|
+
*/
|
|
9
|
+
export declare class Xml<T = any> extends Response<T> {
|
|
10
|
+
protected options?: IResponseOptions | undefined;
|
|
11
|
+
protected xmlOptions?: any | undefined;
|
|
12
|
+
protected _errorCode: HTTP_STATUS_CODE;
|
|
13
|
+
protected _template: string;
|
|
14
|
+
constructor(data?: T | Promise<T> | null, options?: IResponseOptions | undefined, xmlOptions?: any | undefined);
|
|
15
|
+
execute(_req: express.Request, _res: express.Response): Promise<ResponseFunction | void>;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=xml.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.d.ts","sourceRoot":"","sources":["../../../src/response-methods/xml.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAE,gBAAgB,EAAE,gBAAgB,EAAE,QAAQ,EAAE,gBAAgB,EAAE,MAAM,kBAAkB,CAAC;AAGlG;;;;;GAKG;AACH,qBAAa,GAAG,CAAC,CAAC,GAAG,GAAG,CAAE,SAAQ,QAAQ,CAAC,CAAC,CAAC;IAID,SAAS,CAAC,OAAO,CAAC,EAAE,gBAAgB;IAAE,SAAS,CAAC,UAAU,CAAC,EAAE,GAAG;IAH1G,SAAS,CAAC,UAAU,mBAAuB;IAC3C,SAAS,CAAC,SAAS,SAAM;gBAEb,IAAI,CAAC,EAAE,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,GAAG,IAAI,EAAY,OAAO,CAAC,EAAE,gBAAgB,YAAA,EAAY,UAAU,CAAC,EAAE,GAAG,YAAA;IAI7F,OAAO,CAAC,IAAI,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,GAAG,OAAO,CAAC,gBAAgB,GAAG,IAAI,CAAC;CAItG"}
|
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.Xml = void 0;
|
|
4
|
+
const interfaces_js_1 = require("../interfaces.js");
|
|
5
|
+
const responses_js_1 = require("../responses.js");
|
|
6
|
+
/**
|
|
7
|
+
* Returns an HTTP 200 response with an XML body, bypassing Accept-header
|
|
8
|
+
* negotiation. Use when the endpoint must always respond with XML. The data
|
|
9
|
+
* should be a plain object graph; arrays / scalars are wrapped under a
|
|
10
|
+
* `<response>` root. Optional fast-xml-parser XMLBuilder options can be passed.
|
|
11
|
+
*/
|
|
12
|
+
class Xml extends interfaces_js_1.Response {
|
|
13
|
+
constructor(data, options, xmlOptions) {
|
|
14
|
+
super(data, options);
|
|
15
|
+
this.options = options;
|
|
16
|
+
this.xmlOptions = xmlOptions;
|
|
17
|
+
this._errorCode = interfaces_js_1.HTTP_STATUS_CODE.OK;
|
|
18
|
+
this._template = '';
|
|
19
|
+
}
|
|
20
|
+
async execute(_req, _res) {
|
|
21
|
+
const data = await this.prepareResponse();
|
|
22
|
+
return (0, responses_js_1.xmlResponse)(data, { ...this.options, StatusCode: this.options?.StatusCode ?? this._errorCode }, this.xmlOptions);
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
exports.Xml = Xml;
|
|
26
|
+
//# sourceMappingURL=xml.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"xml.js","sourceRoot":"","sources":["../../../src/response-methods/xml.ts"],"names":[],"mappings":";;;AACA,oDAAkG;AAClG,kDAA8C;AAE9C;;;;;GAKG;AACH,MAAa,GAAa,SAAQ,wBAAW;IAI3C,YAAY,IAA4B,EAAY,OAA0B,EAAY,UAAgB;QACxG,KAAK,CAAC,IAAI,EAAE,OAAO,CAAC,CAAC;QAD6B,YAAO,GAAP,OAAO,CAAmB;QAAY,eAAU,GAAV,UAAU,CAAM;QAHhG,eAAU,GAAG,gCAAgB,CAAC,EAAE,CAAC;QACjC,cAAS,GAAG,EAAE,CAAC;IAIzB,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,IAAqB,EAAE,IAAsB;QAChE,MAAM,IAAI,GAAG,MAAM,IAAI,CAAC,eAAe,EAAE,CAAC;QAC1C,OAAO,IAAA,0BAAW,EAAC,IAAI,EAAE,EAAE,GAAG,IAAI,CAAC,OAAO,EAAE,UAAU,EAAE,IAAI,CAAC,OAAO,EAAE,UAAU,IAAI,IAAI,CAAC,UAAU,EAAE,EAAE,IAAI,CAAC,UAAU,CAAC,CAAC;IAC1H,CAAC;CACF;AAZD,kBAYC"}
|
package/lib/cjs/responses.d.ts
CHANGED
|
@@ -16,6 +16,16 @@ export declare function jsonResponse(model: any, options?: IResponseOptions): (_
|
|
|
16
16
|
* @param status - status code
|
|
17
17
|
*/
|
|
18
18
|
export declare function textResponse(model: any, options?: IResponseOptions): (_req: express.Request, res: express.Response) => void;
|
|
19
|
+
/**
|
|
20
|
+
* Serializes data to an XML body. The payload should be a plain object graph;
|
|
21
|
+
* arrays and scalars are wrapped under a `<response>` root so the output is a
|
|
22
|
+
* single well-formed document.
|
|
23
|
+
*
|
|
24
|
+
* @param model - data to serialize
|
|
25
|
+
* @param options - response options (status, headers, cookies)
|
|
26
|
+
* @param xmlOptions - fast-xml-parser XMLBuilder options
|
|
27
|
+
*/
|
|
28
|
+
export declare function xmlResponse(model: any, options?: IResponseOptions, xmlOptions?: any): (_req: express.Request, res: express.Response) => void;
|
|
19
29
|
/**
|
|
20
30
|
* Sends html response & sets proper header. If template is not avaible, handles proper error rendering.
|
|
21
31
|
*
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/responses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAwD,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;
|
|
1
|
+
{"version":3,"file":"responses.d.ts","sourceRoot":"","sources":["../../src/responses.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AACnC,OAAO,EAAwD,gBAAgB,EAAE,MAAM,iBAAiB,CAAC;AAmBzG,wBAAgB,YAAY,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,gBAAgB,QA6B7E;AAED,wBAAgB,WAAW,CAAC,GAAG,EAAE,OAAO,CAAC,QAAQ,EAAE,OAAO,CAAC,EAAE,gBAAgB,QAI5E;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,IACzD,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,OAAO,CAAC,QAAQ,UAcrD;AAED;;;;;GAKG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,IACzD,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,OAAO,CAAC,QAAQ,UAgBrD;AAED;;;;;;;;GAQG;AACH,wBAAgB,WAAW,CAAC,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,EAAE,UAAU,CAAC,EAAE,GAAG,IAC1E,MAAM,OAAO,CAAC,OAAO,EAAE,KAAK,OAAO,CAAC,QAAQ,UAYrD;AAED;;;;;;GAMG;AACH,wBAAgB,YAAY,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,GAAG,EAAE,OAAO,CAAC,EAAE,gBAAgB,IAGvE,KAAK,OAAO,CAAC,OAAO,EAAE,KAAK,OAAO,CAAC,QAAQ,UA0DpD;AAED;;;;;;;;GAQG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,GAAG,EAAE,QAAQ,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,gBAAgB,IA+E3E,KAAK,OAAO,CAAC,OAAO,EAAE,KAAK,OAAO,CAAC,QAAQ,UA4BpD"}
|
package/lib/cjs/responses.js
CHANGED
|
@@ -37,6 +37,7 @@ exports._setCoockies = _setCoockies;
|
|
|
37
37
|
exports._setHeaders = _setHeaders;
|
|
38
38
|
exports.jsonResponse = jsonResponse;
|
|
39
39
|
exports.textResponse = textResponse;
|
|
40
|
+
exports.xmlResponse = xmlResponse;
|
|
40
41
|
exports.htmlResponse = htmlResponse;
|
|
41
42
|
exports.httpResponse = httpResponse;
|
|
42
43
|
const interfaces_js_1 = require("./interfaces.js");
|
|
@@ -45,8 +46,15 @@ const di_1 = require("@spinajs/di");
|
|
|
45
46
|
const log_common_1 = require("@spinajs/log-common");
|
|
46
47
|
const randomstring = __importStar(require("randomstring"));
|
|
47
48
|
const templates_1 = require("@spinajs/templates");
|
|
48
|
-
|
|
49
|
+
// NOTE: import the exception, not the `ServerError` *response* from './index.js'.
|
|
50
|
+
// That barrel import created the cycle interfaces -> responses -> index ->
|
|
51
|
+
// response-methods/badRequest -> interfaces, which blew up with
|
|
52
|
+
// "Cannot access 'Response' before initialization" whenever a module other
|
|
53
|
+
// than index.js (eg. server.js) was the entry point. `UnexpectedServerError`
|
|
54
|
+
// is mapped back to the ServerError response by __handle_error__ anyway.
|
|
55
|
+
const exceptions_1 = require("@spinajs/exceptions");
|
|
49
56
|
const cs = __importStar(require("cookie-signature"));
|
|
57
|
+
const fast_xml_parser_1 = require("fast-xml-parser");
|
|
50
58
|
function _setCoockies(res, options) {
|
|
51
59
|
const cfg = di_1.DI.get(configuration_1.Configuration);
|
|
52
60
|
if (!cfg) {
|
|
@@ -86,7 +94,9 @@ function jsonResponse(model, options) {
|
|
|
86
94
|
res.status(options?.StatusCode ? options?.StatusCode : interfaces_js_1.HTTP_STATUS_CODE.OK);
|
|
87
95
|
_setCoockies(res, options);
|
|
88
96
|
_setHeaders(res, options);
|
|
89
|
-
|
|
97
|
+
// Presence check, not truthiness: 0 / false / '' are valid JSON bodies and
|
|
98
|
+
// must be sent. Only undefined / null mean "no body".
|
|
99
|
+
if (model !== undefined && model !== null) {
|
|
90
100
|
res.json(model);
|
|
91
101
|
}
|
|
92
102
|
else {
|
|
@@ -105,10 +115,36 @@ function textResponse(model, options) {
|
|
|
105
115
|
res.status(options?.StatusCode ? options?.StatusCode : interfaces_js_1.HTTP_STATUS_CODE.OK);
|
|
106
116
|
_setCoockies(res, options);
|
|
107
117
|
_setHeaders(res, options);
|
|
108
|
-
|
|
118
|
+
// Presence check, not truthiness: 0 / false / '' are valid bodies. Only
|
|
119
|
+
// undefined / null end the response empty (and always terminate it —
|
|
120
|
+
// otherwise a missing body on this fallback path hangs until timeout).
|
|
121
|
+
if (model !== undefined && model !== null) {
|
|
109
122
|
res.set('Content-Type', 'text/plain');
|
|
110
123
|
res.send(JSON.stringify(model));
|
|
111
124
|
}
|
|
125
|
+
else {
|
|
126
|
+
res.end();
|
|
127
|
+
}
|
|
128
|
+
};
|
|
129
|
+
}
|
|
130
|
+
/**
|
|
131
|
+
* Serializes data to an XML body. The payload should be a plain object graph;
|
|
132
|
+
* arrays and scalars are wrapped under a `<response>` root so the output is a
|
|
133
|
+
* single well-formed document.
|
|
134
|
+
*
|
|
135
|
+
* @param model - data to serialize
|
|
136
|
+
* @param options - response options (status, headers, cookies)
|
|
137
|
+
* @param xmlOptions - fast-xml-parser XMLBuilder options
|
|
138
|
+
*/
|
|
139
|
+
function xmlResponse(model, options, xmlOptions) {
|
|
140
|
+
return (_req, res) => {
|
|
141
|
+
res.status(options?.StatusCode ? options.StatusCode : interfaces_js_1.HTTP_STATUS_CODE.OK);
|
|
142
|
+
_setCoockies(res, options);
|
|
143
|
+
_setHeaders(res, options);
|
|
144
|
+
res.set('Content-Type', 'application/xml');
|
|
145
|
+
const builder = new fast_xml_parser_1.XMLBuilder({ ignoreAttributes: false, ...xmlOptions });
|
|
146
|
+
const payload = model !== null && typeof model === 'object' && !Array.isArray(model) ? model : { response: model };
|
|
147
|
+
res.send(builder.build(payload));
|
|
112
148
|
};
|
|
113
149
|
}
|
|
114
150
|
/**
|
|
@@ -205,44 +241,67 @@ function httpResponse(model, template, options) {
|
|
|
205
241
|
})(req, res);
|
|
206
242
|
}
|
|
207
243
|
};
|
|
208
|
-
|
|
209
|
-
|
|
210
|
-
|
|
211
|
-
|
|
212
|
-
|
|
213
|
-
|
|
214
|
-
|
|
215
|
-
|
|
216
|
-
|
|
217
|
-
|
|
218
|
-
|
|
219
|
-
|
|
220
|
-
|
|
221
|
-
|
|
222
|
-
|
|
223
|
-
|
|
224
|
-
|
|
225
|
-
|
|
226
|
-
})(req, res);
|
|
227
|
-
});
|
|
244
|
+
const htmlBranch = (req, res) => {
|
|
245
|
+
const fs = di_1.DI.resolve('__file_provider__', ['__fs_http_response_templates__']);
|
|
246
|
+
if (!fs) {
|
|
247
|
+
throw new exceptions_1.UnexpectedServerError('file provider __fs_http_response_templates__ not set. Pleas set response template file provider for html http default responses !');
|
|
248
|
+
}
|
|
249
|
+
fs.download(template)
|
|
250
|
+
.then((file) => {
|
|
251
|
+
htmlResponse(file, model, options)(req, res);
|
|
252
|
+
})
|
|
253
|
+
.catch((err) => {
|
|
254
|
+
const log = di_1.DI.resolve(log_common_1.Log, ['http']);
|
|
255
|
+
log.warn(`Cannot render html file ${template}, error: ${err.message}:${err.stack}`, err);
|
|
256
|
+
fs.download('serverError.pug').then((file) => {
|
|
257
|
+
// try to render server error response
|
|
258
|
+
htmlResponse(file, { error: err }, {
|
|
259
|
+
...options,
|
|
260
|
+
StatusCode: interfaces_js_1.HTTP_STATUS_CODE.INTERNAL_ERROR,
|
|
261
|
+
})(req, res);
|
|
228
262
|
});
|
|
263
|
+
});
|
|
264
|
+
};
|
|
265
|
+
const jsonBranch = (req, res) => {
|
|
266
|
+
if (options && options.StatusCode && options.StatusCode >= 400) {
|
|
267
|
+
errorTransform(req, res);
|
|
229
268
|
}
|
|
230
|
-
else if (req.
|
|
231
|
-
|
|
232
|
-
errorTransform(req, res);
|
|
233
|
-
}
|
|
234
|
-
else {
|
|
235
|
-
if (req.headers['x-data-transform']) {
|
|
236
|
-
dataTransform(req, res);
|
|
237
|
-
}
|
|
238
|
-
else {
|
|
239
|
-
jsonResponse(model, options)(req, res);
|
|
240
|
-
}
|
|
241
|
-
}
|
|
269
|
+
else if (req.headers['x-data-transform']) {
|
|
270
|
+
dataTransform(req, res);
|
|
242
271
|
}
|
|
243
272
|
else {
|
|
273
|
+
jsonResponse(model, options)(req, res);
|
|
274
|
+
}
|
|
275
|
+
};
|
|
276
|
+
return (req, res) => {
|
|
277
|
+
// Offer the types the server is configured to produce, JSON first so a
|
|
278
|
+
// wildcard / absent Accept (*/*) defaults to JSON rather than HTML. Explicit
|
|
279
|
+
// client preferences (order / q-values) are still honored by req.accepts.
|
|
280
|
+
const offered = [];
|
|
281
|
+
if ((acceptedHeaders & interfaces_js_1.HttpAcceptHeaders.JSON) === interfaces_js_1.HttpAcceptHeaders.JSON)
|
|
282
|
+
offered.push('json');
|
|
283
|
+
if ((acceptedHeaders & interfaces_js_1.HttpAcceptHeaders.HTML) === interfaces_js_1.HttpAcceptHeaders.HTML)
|
|
284
|
+
offered.push('html');
|
|
285
|
+
if ((acceptedHeaders & interfaces_js_1.HttpAcceptHeaders.XML) === interfaces_js_1.HttpAcceptHeaders.XML)
|
|
286
|
+
offered.push('xml');
|
|
287
|
+
const best = offered.length ? req.accepts(offered) : false;
|
|
288
|
+
if (best === 'html') {
|
|
289
|
+
htmlBranch(req, res);
|
|
290
|
+
}
|
|
291
|
+
else if (best === 'json') {
|
|
292
|
+
jsonBranch(req, res);
|
|
293
|
+
}
|
|
294
|
+
else if (best === 'xml') {
|
|
295
|
+
xmlResponse(model, options)(req, res);
|
|
296
|
+
}
|
|
297
|
+
else if (req.accepts('text/plain')) {
|
|
298
|
+
// Client accepts plain text (or the config offers nothing negotiable).
|
|
244
299
|
textResponse(model, options)(req, res);
|
|
245
300
|
}
|
|
301
|
+
else {
|
|
302
|
+
// Client explicitly asked for a media type the server can't produce.
|
|
303
|
+
jsonResponse({ error: { message: 'Not Acceptable', code: interfaces_js_1.HTTP_STATUS_CODE.NOT_ACCEPTABLE } }, { ...options, StatusCode: interfaces_js_1.HTTP_STATUS_CODE.NOT_ACCEPTABLE })(req, res);
|
|
304
|
+
}
|
|
246
305
|
};
|
|
247
306
|
}
|
|
248
307
|
//# sourceMappingURL=responses.js.map
|
package/lib/cjs/responses.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/responses.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;
|
|
1
|
+
{"version":3,"file":"responses.js","sourceRoot":"","sources":["../../src/responses.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FromBody.d.ts","sourceRoot":"","sources":["../../../src/route-args/FromBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,qBACa,QAAS,SAAQ,SAAS;IACrC,IAAW,aAAa,IAAI,aAAa,CAExC;IAEY,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAC,KAAK,EAAG,OAAO,EAAG,EAAG,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM;;;;
|
|
1
|
+
{"version":3,"file":"FromBody.d.ts","sourceRoot":"","sources":["../../../src/route-args/FromBody.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAC;AAC3C,OAAO,EAAE,eAAe,EAAE,aAAa,EAAE,UAAU,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AACtF,OAAO,KAAK,OAAO,MAAM,SAAS,CAAC;AAGnC,qBACa,QAAS,SAAQ,SAAS;IACrC,IAAW,aAAa,IAAI,aAAa,CAExC;IAEY,OAAO,CAAC,QAAQ,EAAE,UAAU,EAAC,KAAK,EAAG,OAAO,EAAG,EAAG,KAAK,EAAE,eAAe,EAAE,GAAG,EAAE,OAAO,CAAC,OAAO,EAAE,IAAI,EAAE,OAAO,CAAC,QAAQ,EAAE,KAAK,EAAE,MAAM;;;;CAenJ"}
|
|
@@ -18,7 +18,12 @@ let FromBody = class FromBody extends RouteArgs_js_1.RouteArgs {
|
|
|
18
18
|
if (!req.body) {
|
|
19
19
|
return { CallData: callData, Args: null };
|
|
20
20
|
}
|
|
21
|
-
|
|
21
|
+
// Use presence, not truthiness — a body field legitimately holding 0,
|
|
22
|
+
// false or '' must map to that value, not be treated as absent (which
|
|
23
|
+
// would wrongly fall through to passing the whole body).
|
|
24
|
+
const hasNamedField = Object.prototype.hasOwnProperty.call(req.body, param.Name);
|
|
25
|
+
const isSingleBodyParam = [...route.Parameters.values()].filter((p) => p.Type === interfaces_js_1.ParameterType.FromBody).length === 1;
|
|
26
|
+
const arg = hasNamedField ? req.body[param.Name] : isSingleBodyParam ? req.body : null;
|
|
22
27
|
let result = await this.tryHydrateParam(arg, param, route);
|
|
23
28
|
return { CallData: callData, Args: result };
|
|
24
29
|
}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FromBody.js","sourceRoot":"","sources":["../../../src/route-args/FromBody.ts"],"names":[],"mappings":";;;;;;;;;AAAA,iDAA2C;AAC3C,oDAAsF;AAEtF,oCAAyC;AAGlC,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,wBAAS;IACrC,IAAW,aAAa;QACtB,OAAO,6BAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,QAAoB,EAAC,KAAkB,EAAG,KAAsB,EAAE,GAAoB,EAAE,IAAsB,EAAE,KAAa;QAChJ,IAAG,CAAC,GAAG,CAAC,IAAI,EAAC,CAAC;YACZ,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC5C,CAAC;QAED,MAAM,
|
|
1
|
+
{"version":3,"file":"FromBody.js","sourceRoot":"","sources":["../../../src/route-args/FromBody.ts"],"names":[],"mappings":";;;;;;;;;AAAA,iDAA2C;AAC3C,oDAAsF;AAEtF,oCAAyC;AAGlC,IAAM,QAAQ,GAAd,MAAM,QAAS,SAAQ,wBAAS;IACrC,IAAW,aAAa;QACtB,OAAO,6BAAa,CAAC,QAAQ,CAAC;IAChC,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,QAAoB,EAAC,KAAkB,EAAG,KAAsB,EAAE,GAAoB,EAAE,IAAsB,EAAE,KAAa;QAChJ,IAAG,CAAC,GAAG,CAAC,IAAI,EAAC,CAAC;YACZ,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,IAAI,EAAE,CAAC;QAC5C,CAAC;QAED,sEAAsE;QACtE,sEAAsE;QACtE,yDAAyD;QACzD,MAAM,aAAa,GAAG,MAAM,CAAC,SAAS,CAAC,cAAc,CAAC,IAAI,CAAC,GAAG,CAAC,IAAI,EAAE,KAAK,CAAC,IAAI,CAAC,CAAC;QACjF,MAAM,iBAAiB,GAAG,CAAC,GAAG,KAAK,CAAC,UAAU,CAAC,MAAM,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,IAAI,KAAK,6BAAa,CAAC,QAAQ,CAAC,CAAC,MAAM,KAAK,CAAC,CAAC;QACvH,MAAM,GAAG,GAAG,aAAa,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,IAAI,CAAC,CAAC,CAAC,CAAC,iBAAiB,CAAC,CAAC,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAEvF,IAAI,MAAM,GAAG,MAAM,IAAI,CAAC,eAAe,CAAC,GAAG,EAAE,KAAK,EAAE,KAAK,CAAC,CAAC;QAC3D,OAAO,EAAE,QAAQ,EAAE,QAAQ,EAAE,IAAI,EAAE,MAAM,EAAE,CAAC;IAC9C,CAAC;CACF,CAAA;AApBY,4BAAQ;mBAAR,QAAQ;IADpB,IAAA,eAAU,GAAE;GACA,QAAQ,CAoBpB"}
|
|
@@ -85,7 +85,7 @@ export declare class FromCSV extends FromFormBase {
|
|
|
85
85
|
export declare class FromFormField extends FromFormBase {
|
|
86
86
|
get SupportedType(): ParameterType;
|
|
87
87
|
extract(callData: IRouteCall, _args: unknown[], param: IRouteParameter, req: Request, res: express.Response, route?: IRoute): Promise<{
|
|
88
|
-
Args:
|
|
88
|
+
Args: any;
|
|
89
89
|
CallData: IRouteCall;
|
|
90
90
|
}>;
|
|
91
91
|
}
|