@adaptivestone/framework 4.2.0 → 4.3.1
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/CHANGELOG.md
CHANGED
|
@@ -1,3 +1,11 @@
|
|
|
1
|
+
### 4.3.1
|
|
2
|
+
|
|
3
|
+
[UPDATE] Yup file validator update. As formidable now return all fields as an array
|
|
4
|
+
|
|
5
|
+
### 4.3.0
|
|
6
|
+
|
|
7
|
+
[BREAKING] updated formidable with a new version + tests. Marked as breaking because of a new major version, but this is internal of framework and exernal still the same. Should break nothing
|
|
8
|
+
|
|
1
9
|
### 4.2.0
|
|
2
10
|
|
|
3
11
|
[UPDATE] updated deps
|
package/helpers/yup.js
CHANGED
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@adaptivestone/framework",
|
|
3
|
-
"version": "4.
|
|
3
|
+
"version": "4.3.1",
|
|
4
4
|
"description": "Adaptive stone node js framework",
|
|
5
5
|
"main": "index.js",
|
|
6
6
|
"engines": {
|
|
@@ -43,7 +43,7 @@
|
|
|
43
43
|
"deepmerge": "^4.2.2",
|
|
44
44
|
"dotenv": "^16.0.0",
|
|
45
45
|
"express": "^4.17.1",
|
|
46
|
-
"formidable": "^
|
|
46
|
+
"formidable": "^3.5.1",
|
|
47
47
|
"html-to-text": "^9.0.3",
|
|
48
48
|
"i18next": "^23.2.8",
|
|
49
49
|
"i18next-chained-backend": "^4.0.0",
|
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
const formidable = require('formidable');
|
|
1
|
+
const formidable = require('formidable').default;
|
|
2
2
|
|
|
3
3
|
const AbstractMiddleware = require('./AbstractMiddleware');
|
|
4
4
|
|
|
@@ -13,23 +13,25 @@ class RequestParser extends AbstractMiddleware {
|
|
|
13
13
|
// TODO update this to https://github.com/node-formidable/formidable/issues/412#issuecomment-1367914268 in node v20 (in 2023?)
|
|
14
14
|
|
|
15
15
|
const form = formidable(this.params); // not in construstor as reuse formidable affects performance
|
|
16
|
-
|
|
17
|
-
|
|
18
|
-
|
|
19
|
-
);
|
|
20
|
-
|
|
21
|
-
|
|
22
|
-
|
|
23
|
-
|
|
16
|
+
let fields;
|
|
17
|
+
let files;
|
|
18
|
+
try {
|
|
19
|
+
[fields, files] = await form.parse(req);
|
|
20
|
+
} catch (err) {
|
|
21
|
+
this.logger.error(`Parsing failed ${err}`);
|
|
22
|
+
return next(err);
|
|
23
|
+
}
|
|
24
|
+
this.logger.verbose(
|
|
25
|
+
`Parsing multipart/formdata request DONE ${Date.now() - time}ms`,
|
|
26
|
+
);
|
|
24
27
|
|
|
25
|
-
|
|
26
|
-
|
|
27
|
-
|
|
28
|
-
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
});
|
|
28
|
+
req.body = {
|
|
29
|
+
// todo avoid body in next versions
|
|
30
|
+
...req.body,
|
|
31
|
+
...fields,
|
|
32
|
+
...files,
|
|
33
|
+
};
|
|
34
|
+
return next();
|
|
33
35
|
}
|
|
34
36
|
}
|
|
35
37
|
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
const { createServer } = require('node:http');
|
|
2
|
+
const formidable = require('formidable');
|
|
3
|
+
|
|
4
|
+
const RequestParser = require('./RequestParser');
|
|
5
|
+
|
|
6
|
+
describe('reqest parser limiter methods', () => {
|
|
7
|
+
it('have description fields', async () => {
|
|
8
|
+
expect.assertions(1);
|
|
9
|
+
const middleware = new RequestParser(global.server.app);
|
|
10
|
+
expect(middleware.constructor.description).toBeDefined();
|
|
11
|
+
});
|
|
12
|
+
it('middleware that works', async () => {
|
|
13
|
+
expect.assertions(4);
|
|
14
|
+
|
|
15
|
+
await new Promise((done) => {
|
|
16
|
+
// from https://github.com/node-formidable/formidable/blob/master/test-node/standalone/promise.test.js
|
|
17
|
+
|
|
18
|
+
const server = createServer(async (req, res) => {
|
|
19
|
+
req.appInfo = {};
|
|
20
|
+
const middleware = new RequestParser(global.server.app);
|
|
21
|
+
middleware.middleware(req, {}, (err) => {
|
|
22
|
+
expect(err).toBeUndefined();
|
|
23
|
+
expect(req.body.title).toBeDefined();
|
|
24
|
+
expect(req.body.multipleFiles).toBeDefined();
|
|
25
|
+
expect(
|
|
26
|
+
req.body.multipleFiles[0] instanceof formidable.PersistentFile,
|
|
27
|
+
).toBe(true);
|
|
28
|
+
|
|
29
|
+
res.writeHead(200);
|
|
30
|
+
res.end('ok');
|
|
31
|
+
});
|
|
32
|
+
});
|
|
33
|
+
server.listen(null, async () => {
|
|
34
|
+
const chosenPort = server.address().port;
|
|
35
|
+
const body = `----13068458571765726332503797717\r
|
|
36
|
+
Content-Disposition: form-data; name="title"\r
|
|
37
|
+
\r
|
|
38
|
+
a\r
|
|
39
|
+
----13068458571765726332503797717\r
|
|
40
|
+
Content-Disposition: form-data; name="multipleFiles"; filename="x.txt"\r
|
|
41
|
+
Content-Type: application/x-javascript\r
|
|
42
|
+
\r
|
|
43
|
+
\r
|
|
44
|
+
\r
|
|
45
|
+
a\r
|
|
46
|
+
b\r
|
|
47
|
+
c\r
|
|
48
|
+
d\r
|
|
49
|
+
\r
|
|
50
|
+
----13068458571765726332503797717--\r
|
|
51
|
+
`;
|
|
52
|
+
await fetch(String(new URL(`http:localhost:${chosenPort}/`)), {
|
|
53
|
+
method: 'POST',
|
|
54
|
+
|
|
55
|
+
headers: {
|
|
56
|
+
'Content-Length': body.length,
|
|
57
|
+
Host: `localhost:${chosenPort}`,
|
|
58
|
+
'Content-Type':
|
|
59
|
+
'multipart/form-data; boundary=--13068458571765726332503797717',
|
|
60
|
+
},
|
|
61
|
+
body,
|
|
62
|
+
}).catch((err) => {
|
|
63
|
+
console.error(err);
|
|
64
|
+
done(err);
|
|
65
|
+
});
|
|
66
|
+
server.close(() => {
|
|
67
|
+
done();
|
|
68
|
+
});
|
|
69
|
+
});
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
it('middleware with a problem', async () => {
|
|
73
|
+
expect.assertions(1);
|
|
74
|
+
|
|
75
|
+
await new Promise((done) => {
|
|
76
|
+
// from https://github.com/node-formidable/formidable/blob/master/test-node/standalone/promise.test.js
|
|
77
|
+
|
|
78
|
+
const server = createServer(async (req, res) => {
|
|
79
|
+
req.appInfo = {};
|
|
80
|
+
const middleware = new RequestParser(global.server.app);
|
|
81
|
+
middleware.middleware(req, {}, (err) => {
|
|
82
|
+
expect(err).toBeDefined();
|
|
83
|
+
|
|
84
|
+
res.writeHead(200);
|
|
85
|
+
res.end('ok');
|
|
86
|
+
});
|
|
87
|
+
});
|
|
88
|
+
server.listen(null, async () => {
|
|
89
|
+
const chosenPort = server.address().port;
|
|
90
|
+
const body = 'someBadBody';
|
|
91
|
+
|
|
92
|
+
await fetch(String(new URL(`http:localhost:${chosenPort}/`)), {
|
|
93
|
+
method: 'POST',
|
|
94
|
+
|
|
95
|
+
headers: {
|
|
96
|
+
'Content-Length': body.length,
|
|
97
|
+
Host: `localhost:${chosenPort}`,
|
|
98
|
+
'Content-Type': 'badContentType',
|
|
99
|
+
},
|
|
100
|
+
body,
|
|
101
|
+
}).catch((err) => {
|
|
102
|
+
console.error(err);
|
|
103
|
+
done(err);
|
|
104
|
+
});
|
|
105
|
+
server.close(() => {
|
|
106
|
+
done();
|
|
107
|
+
});
|
|
108
|
+
});
|
|
109
|
+
});
|
|
110
|
+
});
|
|
111
|
+
});
|