mirror of
https://github.com/nestjs/nest.git
synced 2026-02-23 15:52:50 +00:00
Compare commits
505 Commits
ToonvanStr
...
v6.3.1
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
78f9800088 | ||
|
|
a3a016e57a | ||
|
|
bbb3f9475c | ||
|
|
f210ebca2f | ||
|
|
5c84a78f02 | ||
|
|
020c0fce0d | ||
|
|
1167450310 | ||
|
|
13feee14ab | ||
|
|
3ea9193708 | ||
|
|
2016fd04ab | ||
|
|
99eb93d88e | ||
|
|
90fe90f158 | ||
|
|
366bcaf432 | ||
|
|
1824a9fe59 | ||
|
|
6a606b027f | ||
|
|
da854518fd | ||
|
|
b8fb5edd8d | ||
|
|
cf1a911525 | ||
|
|
ff39013882 | ||
|
|
d856a5570c | ||
|
|
999da7655d | ||
|
|
7db09f0679 | ||
|
|
7957a63930 | ||
|
|
f0d49435c1 | ||
|
|
1565d85e66 | ||
|
|
355cde1d52 | ||
|
|
250c3d0099 | ||
|
|
4624a24199 | ||
|
|
75f391a536 | ||
|
|
ca021b9390 | ||
|
|
7b669e3668 | ||
|
|
b7e2bb7663 | ||
|
|
4d11d1fbf5 | ||
|
|
354793c272 | ||
|
|
bff1199255 | ||
|
|
f94d3a43c9 | ||
|
|
8f80407b91 | ||
|
|
61e0b27200 | ||
|
|
0ff1612111 | ||
|
|
44198f1dd0 | ||
|
|
1d26de5fd4 | ||
|
|
6618b43019 | ||
|
|
343fb310ce | ||
|
|
d4f1bc7bb7 | ||
|
|
d1189a7348 | ||
|
|
3ee0650433 | ||
|
|
8d367c415b | ||
|
|
1981830bbe | ||
|
|
19e55fe2df | ||
|
|
4de5400083 | ||
|
|
ee487dbfc3 | ||
|
|
31d53cda6c | ||
|
|
e6a19c37f1 | ||
|
|
cd65de5d31 | ||
|
|
336c9b44c5 | ||
|
|
bbc53dc28b | ||
|
|
dddf7b9a00 | ||
|
|
524e78f362 | ||
|
|
19bafaeceb | ||
|
|
d88b920dba | ||
|
|
230ae4da95 | ||
|
|
8664505d82 | ||
|
|
275a97a84d | ||
|
|
aed28959b8 | ||
|
|
9acb208dbe | ||
|
|
fd45cdca46 | ||
|
|
6d2a8c8861 | ||
|
|
637ada0600 | ||
|
|
9d07884c0c | ||
|
|
971d92e7fd | ||
|
|
67dacc31a0 | ||
|
|
fca5411430 | ||
|
|
a3ad69df40 | ||
|
|
3264196c4c | ||
|
|
31525dff26 | ||
|
|
efb8a1ea3b | ||
|
|
47326e7a5d | ||
|
|
4f8b216c85 | ||
|
|
b8db3bbeb8 | ||
|
|
bca3268a89 | ||
|
|
01f4a3bae5 | ||
|
|
ab592581b9 | ||
|
|
ae8aee6bb5 | ||
|
|
b937c1dd2b | ||
|
|
2141e118e7 | ||
|
|
19e2c73bcc | ||
|
|
82a983a1c7 | ||
|
|
a486245c8d | ||
|
|
a7342eed59 | ||
|
|
069ccb1b46 | ||
|
|
3aeeab39eb | ||
|
|
c7adccfa7c | ||
|
|
4baa96e649 | ||
|
|
509592f3c1 | ||
|
|
57b405a3a1 | ||
|
|
d5b8ea2444 | ||
|
|
bab2d383b4 | ||
|
|
3164eebb11 | ||
|
|
5f42b03234 | ||
|
|
9b362a067e | ||
|
|
c386487dae | ||
|
|
f64827ed1b | ||
|
|
e8d4888e89 | ||
|
|
7c9a548125 | ||
|
|
95bb4cd711 | ||
|
|
151f0edbed | ||
|
|
885ac139b4 | ||
|
|
d78ecb4c59 | ||
|
|
2869253468 | ||
|
|
fadc1797fd | ||
|
|
910fb31d04 | ||
|
|
ca91e01426 | ||
|
|
f3e3679793 | ||
|
|
90487cc9a3 | ||
|
|
40ad3e418c | ||
|
|
79076b139e | ||
|
|
267ee1004c | ||
|
|
c385e88e2a | ||
|
|
5e6b10b9c7 | ||
|
|
7276451fc9 | ||
|
|
e01111d9e3 | ||
|
|
d85a6ff15c | ||
|
|
fbb6147303 | ||
|
|
a23b5bd793 | ||
|
|
2fe8081c68 | ||
|
|
b04f1f4cfd | ||
|
|
a24391fcca | ||
|
|
15f11c95a2 | ||
|
|
e866a8f423 | ||
|
|
09bba36e58 | ||
|
|
322af6494d | ||
|
|
17cb7ff2a4 | ||
|
|
f9d70391e1 | ||
|
|
8d42c0d3d0 | ||
|
|
8ac98630e1 | ||
|
|
416f710573 | ||
|
|
fdf3d8942d | ||
|
|
22a299b195 | ||
|
|
cd86c5b66b | ||
|
|
a144121463 | ||
|
|
1bb39c15b9 | ||
|
|
845a615cf6 | ||
|
|
7a38d5bdca | ||
|
|
bbaa1d523c | ||
|
|
c1cd3e87d7 | ||
|
|
1b24762cab | ||
|
|
e5b80381d7 | ||
|
|
43cf264026 | ||
|
|
06a9b2252e | ||
|
|
49cae3abb7 | ||
|
|
fc1d4f0395 | ||
|
|
0305a693d7 | ||
|
|
c687b5bcda | ||
|
|
eca9a486e1 | ||
|
|
72edae181e | ||
|
|
e2f93ef226 | ||
|
|
a5832be647 | ||
|
|
418da4f097 | ||
|
|
4242531b27 | ||
|
|
4b73ca638e | ||
|
|
1425635190 | ||
|
|
ded6710d37 | ||
|
|
b3f51cc9c1 | ||
|
|
d7f2e4abbf | ||
|
|
3b06632a37 | ||
|
|
f3330223e8 | ||
|
|
1ce763b167 | ||
|
|
ab8e02e33e | ||
|
|
79056a0483 | ||
|
|
eda8065e02 | ||
|
|
fb72dcc0fe | ||
|
|
cc0bc31bd4 | ||
|
|
11a85cd254 | ||
|
|
fc40f218a4 | ||
|
|
d6b31c3490 | ||
|
|
97afee965c | ||
|
|
7f5fac66e9 | ||
|
|
b920eb6641 | ||
|
|
a20d06239c | ||
|
|
33c3a4ce9b | ||
|
|
b4759ad00f | ||
|
|
7fcb4d524d | ||
|
|
fd5d28a2de | ||
|
|
1e6600b482 | ||
|
|
f6176378f4 | ||
|
|
b8b7a5d3f9 | ||
|
|
2aa9f2fbeb | ||
|
|
6ed25e4102 | ||
|
|
b3f1dc0e8c | ||
|
|
8db96f3545 | ||
|
|
2d12dd7219 | ||
|
|
472fe76701 | ||
|
|
54bc519b06 | ||
|
|
628ec3279e | ||
|
|
8d21314273 | ||
|
|
d058c9fc4b | ||
|
|
8a45e55352 | ||
|
|
cfc1874d9b | ||
|
|
53203ef378 | ||
|
|
7058acf0ca | ||
|
|
caf2322a96 | ||
|
|
4214fa8103 | ||
|
|
9b6a9a0d2f | ||
|
|
ed1d3e1539 | ||
|
|
6263ff75b9 | ||
|
|
e0cc9fb6ac | ||
|
|
9741885f5d | ||
|
|
f2fd6d72df | ||
|
|
043ce9b04f | ||
|
|
8be5181e67 | ||
|
|
43ca7fb5b1 | ||
|
|
5134f6f6ba | ||
|
|
d64274ff96 | ||
|
|
0ec4becd24 | ||
|
|
1a4837fa04 | ||
|
|
56951d15de | ||
|
|
178d34c831 | ||
|
|
0137ebce00 | ||
|
|
039d32271e | ||
|
|
390b214c24 | ||
|
|
a3500f4047 | ||
|
|
c2c3dab5aa | ||
|
|
43e5bdd93b | ||
|
|
1e29999ba7 | ||
|
|
b201ac34ed | ||
|
|
e664830d5e | ||
|
|
c60b1ace78 | ||
|
|
8bbf9419a3 | ||
|
|
ad81b4e4d7 | ||
|
|
ae5e7ca728 | ||
|
|
c6e9b23e45 | ||
|
|
e5a7de868d | ||
|
|
aaed3d1c14 | ||
|
|
e5dd459a88 | ||
|
|
3403ae7c54 | ||
|
|
65de083b6a | ||
|
|
228d43f9d6 | ||
|
|
74d9ad9fb4 | ||
|
|
e50f65e866 | ||
|
|
cbbbc9d257 | ||
|
|
5e2727bf90 | ||
|
|
5fce020f08 | ||
|
|
7a6c9c5a9d | ||
|
|
335dee25cb | ||
|
|
6c9bd5a58c | ||
|
|
2a9183f4da | ||
|
|
d8188306a5 | ||
|
|
61d699ead2 | ||
|
|
fab531c991 | ||
|
|
6c397ba344 | ||
|
|
6aff08a643 | ||
|
|
67572b7eb7 | ||
|
|
e910ef7751 | ||
|
|
99af074f9d | ||
|
|
111deb3191 | ||
|
|
662213b003 | ||
|
|
21f9486f3e | ||
|
|
9d5a777d80 | ||
|
|
932f5d5d02 | ||
|
|
b183f1c783 | ||
|
|
89c7a3e1aa | ||
|
|
4c8ed7f295 | ||
|
|
b2cd7507b6 | ||
|
|
74b4a13442 | ||
|
|
7440d946ca | ||
|
|
297eb65823 | ||
|
|
451e2ca7ea | ||
|
|
6338782546 | ||
|
|
783467b25a | ||
|
|
0bc04142dd | ||
|
|
8ab031784e | ||
|
|
bcf2fc49b8 | ||
|
|
d86c57eeea | ||
|
|
91cfc62032 | ||
|
|
64ed7ebc55 | ||
|
|
bf1de49dcd | ||
|
|
24e34a62d5 | ||
|
|
4592401c7d | ||
|
|
0ddf5b0060 | ||
|
|
1e9c3139b5 | ||
|
|
223501cb94 | ||
|
|
3c92750465 | ||
|
|
4b2fd75cf3 | ||
|
|
0f72500966 | ||
|
|
06ac009bb4 | ||
|
|
b355af9914 | ||
|
|
405bc9bd1b | ||
|
|
9325059885 | ||
|
|
8649c33030 | ||
|
|
9c3e7033bb | ||
|
|
3b2c740bd7 | ||
|
|
035d7d4d05 | ||
|
|
a9dcb9b33e | ||
|
|
06e9720186 | ||
|
|
d1b42e29c5 | ||
|
|
8a1eb31255 | ||
|
|
555dadeb36 | ||
|
|
27315975d3 | ||
|
|
7b2b74dcc6 | ||
|
|
c944ef8816 | ||
|
|
efa5d5886c | ||
|
|
f440366f3d | ||
|
|
4f1888f9a0 | ||
|
|
a50ec037ee | ||
|
|
3735556603 | ||
|
|
6754b96039 | ||
|
|
a48257c968 | ||
|
|
f472852d44 | ||
|
|
49e028c4fe | ||
|
|
f5d286b556 | ||
|
|
6966fd7df2 | ||
|
|
ce6110cf32 | ||
|
|
b1ecb73da6 | ||
|
|
efaeb40e52 | ||
|
|
1ad68cc0bc | ||
|
|
73b27cafa9 | ||
|
|
db616f7cee | ||
|
|
83afa42ee0 | ||
|
|
a5086dcb27 | ||
|
|
526445ab00 | ||
|
|
8206917d0e | ||
|
|
a92c57e53b | ||
|
|
27a02a7745 | ||
|
|
78a58ac69c | ||
|
|
ae4216361e | ||
|
|
c472a7556a | ||
|
|
e48c90e69e | ||
|
|
2f96c8568d | ||
|
|
803b408f0f | ||
|
|
6cdc31abd2 | ||
|
|
5c06f1528f | ||
|
|
cbb7022dc2 | ||
|
|
4a69ddefac | ||
|
|
e33ed082f0 | ||
|
|
7f49452516 | ||
|
|
f58e87ef4f | ||
|
|
94b884a0fa | ||
|
|
5a2216e58b | ||
|
|
4c9eb5a4ac | ||
|
|
6e4b19d0f7 | ||
|
|
dcb0ca77e8 | ||
|
|
c7e1d8e293 | ||
|
|
a026e4b564 | ||
|
|
21a2bdaee9 | ||
|
|
3319e62d62 | ||
|
|
e4f1a1dde2 | ||
|
|
54530247d4 | ||
|
|
cbc9b987fb | ||
|
|
bf17608fd7 | ||
|
|
ad7da8f493 | ||
|
|
eeb260acde | ||
|
|
62dc446a60 | ||
|
|
81eaca0193 | ||
|
|
8f7aad1a84 | ||
|
|
85fb17b32b | ||
|
|
78732403b8 | ||
|
|
4608b6e8e3 | ||
|
|
d01497c0cb | ||
|
|
ef6591674a | ||
|
|
808b6d0627 | ||
|
|
b36b0f0f03 | ||
|
|
8b6dd09ca5 | ||
|
|
f9a42cf442 | ||
|
|
6cd93a9918 | ||
|
|
95e2f7e9ed | ||
|
|
675fd079ac | ||
|
|
102a345077 | ||
|
|
4a4fd2e0e0 | ||
|
|
980f98d6b9 | ||
|
|
1283fd3201 | ||
|
|
e59eb97585 | ||
|
|
13697371a4 | ||
|
|
ec14c921ad | ||
|
|
b12328d0b8 | ||
|
|
9783ac2437 | ||
|
|
7d463c64a4 | ||
|
|
5e8fd1e690 | ||
|
|
71c4bf31cb | ||
|
|
7149f96e11 | ||
|
|
68f33be063 | ||
|
|
4259eb409e | ||
|
|
1d0a9fdc01 | ||
|
|
c7ef4c8778 | ||
|
|
fb02c35e57 | ||
|
|
d78cd72164 | ||
|
|
fb96560cba | ||
|
|
c6e84b6ce3 | ||
|
|
371554a00e | ||
|
|
a9658634e0 | ||
|
|
cdd38dc018 | ||
|
|
bab370cf6d | ||
|
|
981a64ebae | ||
|
|
7f3f022d1c | ||
|
|
685a1ff2c6 | ||
|
|
4a66e75d62 | ||
|
|
4c775b7e24 | ||
|
|
7f1dd41cc6 | ||
|
|
8a7f4df9cb | ||
|
|
960dafcd33 | ||
|
|
dbe952bb1b | ||
|
|
1847f14840 | ||
|
|
57a7b7325d | ||
|
|
09eb4c14e3 | ||
|
|
f6252a49ac | ||
|
|
9a3c8af62c | ||
|
|
1f790a6f4c | ||
|
|
2f4c842c01 | ||
|
|
dfd87b43f7 | ||
|
|
c6d52e5be6 | ||
|
|
8d7375fa1c | ||
|
|
c5c4bf314e | ||
|
|
e888b65106 | ||
|
|
37fa9d529e | ||
|
|
5922e7ed9c | ||
|
|
efb4421280 | ||
|
|
85c2483d60 | ||
|
|
313bc08cda | ||
|
|
ce5d3793f8 | ||
|
|
5cd03dc720 | ||
|
|
baa475a98e | ||
|
|
9775b2c74a | ||
|
|
7b1f2b92fa | ||
|
|
669c110d45 | ||
|
|
348c1caa3e | ||
|
|
026bb027a9 | ||
|
|
9a6f2a96ad | ||
|
|
03fa137dc6 | ||
|
|
5e935e8aae | ||
|
|
cf6ce1f31c | ||
|
|
0c4818281f | ||
|
|
7311b956a5 | ||
|
|
f045eb2b09 | ||
|
|
71b35c1b63 | ||
|
|
5eb65422da | ||
|
|
3fd5e90b84 | ||
|
|
e7804eb8d8 | ||
|
|
292b9fbb25 | ||
|
|
c70f42c5ac | ||
|
|
18288965ca | ||
|
|
4ba700af7e | ||
|
|
10ea259ba0 | ||
|
|
c434a80e75 | ||
|
|
536f4db3c0 | ||
|
|
3898d4f199 | ||
|
|
9d44042d0b | ||
|
|
44c54ed93e | ||
|
|
1b6e07c907 | ||
|
|
e41a025fc5 | ||
|
|
d9e96208fb | ||
|
|
0ef55c0b65 | ||
|
|
7a72c1d4ec | ||
|
|
22a54d714f | ||
|
|
1dcb7aefbe | ||
|
|
82e52fc3e8 | ||
|
|
ea2d32669e | ||
|
|
d2cadc12c1 | ||
|
|
0363108120 | ||
|
|
107b243c8b | ||
|
|
758201cf94 | ||
|
|
205d737214 | ||
|
|
b83357e2e9 | ||
|
|
d465d1b8eb | ||
|
|
f5f0ff48bd | ||
|
|
22ec505ff6 | ||
|
|
868aa2d07d | ||
|
|
d8c241e64f | ||
|
|
bed8e0a7f5 | ||
|
|
547615afd7 | ||
|
|
f8a335dc11 | ||
|
|
32aa7f1507 | ||
|
|
85c290dda5 | ||
|
|
0ba5424af1 | ||
|
|
9e76f416c1 | ||
|
|
4d267f643c | ||
|
|
ee8b112504 | ||
|
|
2fa9989072 | ||
|
|
769d7559d0 | ||
|
|
f4488781e4 | ||
|
|
b0088db764 | ||
|
|
22889735cf | ||
|
|
92068f302c | ||
|
|
a09e8260cd | ||
|
|
c26bbbb9bc | ||
|
|
0e9dbee56d | ||
|
|
9f10e08abb | ||
|
|
8dbb31a0b8 | ||
|
|
487309c12b | ||
|
|
a1d23d6af8 | ||
|
|
6c5108bf1e | ||
|
|
2e7f9cbe2e | ||
|
|
ac994fdda3 | ||
|
|
cf733999d2 | ||
|
|
da240312fa | ||
|
|
78cac3a086 | ||
|
|
5721aab084 | ||
|
|
c5acf28c4b | ||
|
|
a833d08d1f | ||
|
|
5103278f0a | ||
|
|
3a757698ba | ||
|
|
8765b989c4 | ||
|
|
a301e95e82 | ||
|
|
a56896e7ba | ||
|
|
2bd7346bb8 | ||
|
|
672dd499c3 | ||
|
|
21a6b5e4fd |
3
.github/FUNDING.yml
vendored
Normal file
3
.github/FUNDING.yml
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
# These are supported funding model platforms
|
||||
|
||||
open_collective: nestjs
|
||||
46
.github/ISSUE_TEMPLATE.md
vendored
46
.github/ISSUE_TEMPLATE.md
vendored
@@ -1,46 +0,0 @@
|
||||
<!--
|
||||
PLEASE HELP US PROCESS GITHUB ISSUES FASTER BY PROVIDING THE FOLLOWING INFORMATION.
|
||||
|
||||
ISSUES MISSING IMPORTANT INFORMATION MAY BE CLOSED WITHOUT INVESTIGATION.
|
||||
-->
|
||||
|
||||
## I'm submitting a...
|
||||
<!--
|
||||
Please search GitHub for a similar issue or PR before submitting.
|
||||
Check one of the following options with "x" -->
|
||||
<pre><code>
|
||||
[ ] Regression <!--(a behavior that used to work and stopped working in a new release)-->
|
||||
[ ] Bug report
|
||||
[ ] Feature request
|
||||
[ ] Documentation issue or request
|
||||
[ ] Support request => Please do not submit support request here, instead post your question on Stack Overflow.
|
||||
</code></pre>
|
||||
|
||||
## Current behavior
|
||||
<!-- Describe how the issue manifests. -->
|
||||
|
||||
|
||||
## Expected behavior
|
||||
<!-- Describe what the desired behavior would be. -->
|
||||
|
||||
|
||||
## Minimal reproduction of the problem with instructions
|
||||
<!-- Please share a repo, a gist, or step-by-step instructions. -->
|
||||
|
||||
## What is the motivation / use case for changing the behavior?
|
||||
<!-- Describe the motivation or the concrete use case. -->
|
||||
|
||||
|
||||
## Environment
|
||||
|
||||
<pre><code>
|
||||
Nest version: X.Y.Z
|
||||
<!-- Check whether this is still an issue in the most recent Nest version -->
|
||||
|
||||
For Tooling issues:
|
||||
- Node version: XX <!-- run `node --version` -->
|
||||
- Platform: <!-- Mac, Linux, Windows -->
|
||||
|
||||
Others:
|
||||
<!-- Anything else relevant? Operating system version, IDE, package manager, ... -->
|
||||
</code></pre>
|
||||
41
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
Normal file
41
.github/ISSUE_TEMPLATE/Bug_report.md
vendored
Normal file
@@ -0,0 +1,41 @@
|
||||
---
|
||||
name: "\U0001F41B Bug Report"
|
||||
about: "If something isn't working as expected \U0001F914."
|
||||
title: ''
|
||||
labels: 'type: potential issue :broken_heart:,needs triage'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Bug Report
|
||||
|
||||
## Current behavior
|
||||
<!-- Describe how the issue manifests. -->
|
||||
|
||||
## Input Code
|
||||
<!-- REPL or Repo link if applicable: -->
|
||||
|
||||
```ts
|
||||
const your = (code) => here;
|
||||
```
|
||||
|
||||
## Expected behavior
|
||||
<!-- A clear and concise description of what you expected to happen (or code). -->
|
||||
|
||||
## Possible Solution
|
||||
<!--- Only if you have suggestions on a fix for the bug -->
|
||||
|
||||
## Environment
|
||||
|
||||
<pre><code>
|
||||
Nest version: X.Y.Z
|
||||
<!-- Check whether this is still an issue in the most recent Nest version -->
|
||||
|
||||
For Tooling issues:
|
||||
- Node version: XX <!-- run `node --version` -->
|
||||
- Platform: <!-- Mac, Linux, Windows -->
|
||||
|
||||
Others:
|
||||
<!-- Anything else relevant? Operating system version, IDE, package manager, ... -->
|
||||
</code></pre>
|
||||
|
||||
22
.github/ISSUE_TEMPLATE/Feature_request.md
vendored
Normal file
22
.github/ISSUE_TEMPLATE/Feature_request.md
vendored
Normal file
@@ -0,0 +1,22 @@
|
||||
---
|
||||
name: "\U0001F680 Feature Request"
|
||||
about: "I have a suggestion \U0001F63B!"
|
||||
title: ''
|
||||
labels: 'type: enhancement :wolf:,needs triage'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Feature Request
|
||||
|
||||
## Is your feature request related to a problem? Please describe.
|
||||
<!-- A clear and concise description of what the problem is. Ex. I have an issue when [...] -->
|
||||
|
||||
## Describe the solution you'd like
|
||||
<!-- A clear and concise description of what you want to happen. Add any considered drawbacks. -->
|
||||
|
||||
## Teachability, Documentation, Adoption, Migration Strategy
|
||||
<!-- If you can, explain how users will be able to use this and possibly write out a version the docs. Maybe a screenshot or design? -->
|
||||
|
||||
## What is the motivation / use case for changing the behavior?
|
||||
<!-- Describe the motivation or the concrete use case. -->
|
||||
40
.github/ISSUE_TEMPLATE/Regression.md
vendored
Normal file
40
.github/ISSUE_TEMPLATE/Regression.md
vendored
Normal file
@@ -0,0 +1,40 @@
|
||||
---
|
||||
name: "\U0001F4A5 Regression"
|
||||
about: Report an unexpected while upgrading your Nest application!
|
||||
title: ''
|
||||
labels: 'type: bug :sob:,needs triage'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
## Regression
|
||||
|
||||
<!-- First check out: https://docs.nestjs.com/migration-guide -->
|
||||
|
||||
## Potential Commit/PR that introduced the regression**
|
||||
<!-- If you have time to investigate, what PR/date introduced this issue. -->
|
||||
|
||||
## Describe the regression
|
||||
<!-- A clear and concise description of what the regression is. -->
|
||||
|
||||
## Input Code
|
||||
<!--- If you have link to our REPL or a standalone repo please link that! -->
|
||||
|
||||
```ts
|
||||
const your = (code) => here;
|
||||
```
|
||||
|
||||
## Expected behavior/code
|
||||
<!-- A clear and concise description of what you expected to happen (or code). -->
|
||||
|
||||
## Environment
|
||||
<pre><code>
|
||||
Nest version: A.B.C -> X.Y.Z
|
||||
|
||||
For Tooling issues:
|
||||
- Node version: XX <!-- run `node --version` -->
|
||||
- Platform: <!-- Mac, Linux, Windows -->
|
||||
|
||||
Others:
|
||||
<!-- Anything else relevant? Operating system version, IDE, package manager, ... -->
|
||||
</code></pre>
|
||||
14
.github/ISSUE_TEMPLATE/Support_question.md
vendored
Normal file
14
.github/ISSUE_TEMPLATE/Support_question.md
vendored
Normal file
@@ -0,0 +1,14 @@
|
||||
---
|
||||
name: "\U0001F917 Support Question"
|
||||
about: "If you have a question \U0001F4AC, please check out our Discord or StackOverflow!"
|
||||
title: ''
|
||||
labels: 'type: question 🙌,needs triage'
|
||||
assignees: ''
|
||||
|
||||
---
|
||||
|
||||
<!-- We primarily use GitHub as an issue tracker; for usage and support questions, please check out these resources below. Thanks! 😁. -->
|
||||
|
||||
* Discord Community Chat: https://discord.gg/G7Qnnhy
|
||||
* StackOverflow: https://stackoverflow.com/questions/tagged/nestjs using the tag `nestjs`
|
||||
* Twitter: If it's just a quick question you can ping our Twitter: https://twitter.com/nestframework
|
||||
@@ -320,7 +320,7 @@ changes to be accepted, the CLA must be signed. It's a quick process, we promise
|
||||
[corporate-cla]: http://code.google.com/legal/corporate-cla-v1.0.html
|
||||
[dev-doc]: https://github.com/nestjs/nest/blob/master/docs/DEVELOPER.md
|
||||
[github]: https://github.com/nestjs/nest
|
||||
[gitter]: https://gitter.im/nestjs/nest
|
||||
[gitter]: https://gitter.im/nestjs/nestjs
|
||||
[individual-cla]: http://code.google.com/legal/individual-cla-v1.0.html
|
||||
[js-style-guide]: https://google.github.io/styleguide/jsguide.html
|
||||
[jsfiddle]: http://jsfiddle.net
|
||||
|
||||
30
Readme.md
30
Readme.md
@@ -14,7 +14,7 @@
|
||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/core.svg" alt="NPM Downloads" /></a>
|
||||
<a href="https://travis-ci.org/nestjs/nest" target="_blank"><img src="https://api.travis-ci.org/nestjs/nest.svg?branch=master" alt="Travis" /></a>
|
||||
<a href="https://travis-ci.org/nestjs/nest" target="_blank"><img src="https://img.shields.io/travis/nestjs/nest/master.svg?label=linux" alt="Linux" /></a>
|
||||
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#8" alt="Coverage" /></a>
|
||||
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a>
|
||||
<a href="https://gitter.im/nestjs/nestjs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge" target="_blank"><img src="https://badges.gitter.im/nestjs/nestjs.svg" alt="Gitter" /></a>
|
||||
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
|
||||
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
|
||||
@@ -53,30 +53,32 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
|
||||
|
||||
<a href="https://valor-software.com/" target="_blank"><img src="https://docs.nestjs.com/assets/sponsors/valor-software.png" width="320" /></a>
|
||||
|
||||
#### Base Sponsor
|
||||
|
||||
<a href="https://blueanchor.io/" target="_blank"><img src="https://nestjs.com/img/blueanchor.png" width="300" /></a>
|
||||
<a href="https://www.novologic.com/" target="_blank"><img src="https://nestjs.com/img/novologic.png" width="200" /></a>
|
||||
|
||||
#### Silver Sponsors
|
||||
<a href="https://neoteric.eu/" target="_blank"><img src="https://nestjs.com/img/neoteric-cut.png" width="120" valign="middle" /></a>
|
||||
<a href="http://gojob.com" target="_blank"><img src="http://nestjs.com/img/gojob-logo.png" valign="middle" height="95" /></a> <a href="https://www.swingdev.io" target="_blank"><img src="https://nestjs.com/img/swingdev-logo.svg#1" width="150" valign="middle" /> </a>
|
||||
<a href="https://yakaz.com/" target="_blank"><img src="https://nestjs.com/img/yakaz.png" width="100" valign="middle" /></a>
|
||||
<a href="https://trilon.io" target="_blank"><img src="https://nestjs.com/img/trilon.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://xtremis.com/" target="_blank"><img src="https://nestjs.com/img/logo-xtremis.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://gojob.com" target="_blank"><img src="http://nestjs.com/img/gojob-logo.png" valign="middle" height="95" /></a>
|
||||
<a href="https://trilon.io" target="_blank"><img src="https://nestjs.com/img/trilon.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://www.leogistics.com" target="_blank"><img src="https://nestjs.com/img/leogistics-logo.jpeg" width="150" valign="middle" /></a>
|
||||
|
||||
#### Sponsors
|
||||
|
||||
<a href="https://scal.io" target="_blank"><img src="https://nestjs.com/img/scalio-logo.svg" width="110" valign="middle" /></a> <a href="http://angularity.io" target="_blank"><img src="http://angularity.io/media/logo.svg" height="26" valign="middle" /></a> <!--<a href="https://keycdn.com"><img src="https://nestjs.com/img/keycdn.svg" height="30" /></a> --> <a href="https://hostpresto.com" target="_blank"><img src="https://nestjs.com/img/hostpresto.png" height="30" valign="middle" /></a> <a href="https://genuinebee.com/" target="_blank"><img src="https://nestjs.com/img/genuinebee.svg" height="36" valign="middle" /></a> <a href="http://architectnow.net/" target="_blank"><img src="https://nestjs.com/img/architectnow.png" height="24" valign="middle" /></a> <a href="https://quander.io/" target="_blank"><img src="https://nestjs.com/img/quander.png" height="28" valign="middle" /></a> <a href="https://mantro.net/" target="_blank"><img src="https://nestjs.com/img/mantro-logo.svg" height="20" valign="middle" /></a>
|
||||
<a href="https://www.swingdev.io" target="_blank"><img src="https://nestjs.com/img/swingdev-logo.svg#1" width="125" valign="middle" /> </a> <a href="https://blueanchor.io/" target="_blank"><img src="https://nestjs.com/img/blueanchor.png" width="180" valign="middle" /></a>
|
||||
<a href="https://www.novologic.com/" target="_blank"><img src="https://nestjs.com/img/novologic.png" width="130" valign="middle" /></a>
|
||||
<a href="https://scal.io" target="_blank"><img src="https://nestjs.com/img/scalio-logo.svg" width="100" valign="middle" /></a> <a href="http://angularity.io" target="_blank"><img src="http://angularity.io/media/logo.svg" height="26" valign="middle" /></a> <!--<a href="https://keycdn.com"><img src="https://nestjs.com/img/keycdn.svg" height="30" /></a> --> <a href="https://hostpresto.com" target="_blank"><img src="https://nestjs.com/img/hostpresto.png" height="30" valign="middle" /></a>
|
||||
|
||||
<a href="https://triplebyte.com/" target="_blank"><img src="https://nestjs.com/img/triplebyte.png" height="30" valign="middle" /></a>
|
||||
<a href="https://genuinebee.com/" target="_blank"><img src="https://nestjs.com/img/genuinebee.svg" height="36" valign="middle" /></a> <a href="http://architectnow.net/" target="_blank"><img src="https://nestjs.com/img/architectnow.png" height="24" valign="middle" /></a> <a href="https://quander.io/" target="_blank"><img src="https://nestjs.com/img/quander.png" height="28" valign="middle" /></a> <a href="https://mantro.net/" target="_blank"><img src="https://nestjs.com/img/mantro-logo.svg" height="20" valign="middle" /></a> <a href="https://triplebyte.com/" target="_blank"><img src="https://nestjs.com/img/triplebyte.png" height="30" valign="middle" /></a>
|
||||
<a href="https://ever.co/" target="_blank"><img src="https://nestjs.com/img/ever-logo.png" height="20" valign="middle" /></a>
|
||||
<a href="https://buddy.works/" target="_blank"><img src="https://nestjs.com/img/buddy-logo.svg" height="35" valign="middle" /></a>
|
||||
<a href="https://buddy.works/" target="_blank"><img src="https://nestjs.com/img/buddy-logo.svg" height="35" valign="middle" /></a>
|
||||
<a href="https://blokt.com" target="_blank"><img src="https://nestjs.com/img/blokt-logo.png" height="31" valign="middle" /></a>
|
||||
<a href="https://reposit.co.uk/" target="_blank"><img src="https://nestjs.com/img/reposit-logo.png" height="28" valign="middle" /></a> <a href="https://yakaz.com/" target="_blank"><img src="https://nestjs.com/img/yakaz.png" width="80" valign="middle" /></a>
|
||||
<a href="https://nearpod.com/" target="_blank"><img src="https://nestjs.com/img/nearpod-logo.svg" width="120" valign="middle" /></a>
|
||||
<a href="https://clay.global/" target="_blank"><img src="https://nestjs.com/img/clay-logo.svg" width="90" valign="middle" /></a>
|
||||
<a href="http://xtremis.com/" target="_blank"><img src="https://nestjs.com/img/logo-xtremis.svg" width="145" valign="middle" /></a>
|
||||
|
||||
|
||||
|
||||
## Backers
|
||||
|
||||
<a href="https://opencollective.com/nest" target="_blank"><img src="https://opencollective.com/nest/backers.svg?width=890"></a>
|
||||
<a href="https://opencollective.com/nest" target="_blank"><img src="https://opencollective.com/nest/backers.svg?width=1600"></a>
|
||||
|
||||
## Stay in touch
|
||||
|
||||
|
||||
@@ -23,7 +23,7 @@ services:
|
||||
- "9001:9001"
|
||||
restart: always
|
||||
mysql:
|
||||
image: mysql:5.7.25
|
||||
image: mysql:5.7.26
|
||||
environment:
|
||||
MYSQL_ROOT_PASSWORD: root
|
||||
MYSQL_DATABASE: test
|
||||
|
||||
1576
integration/graphql/package-lock.json
generated
1576
integration/graphql/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,21 +9,21 @@
|
||||
"start:prod": "node dist/main.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "6.0.5",
|
||||
"@nestjs/core": "6.0.5",
|
||||
"@nestjs/graphql": "6.0.5",
|
||||
"apollo-server-express": "2.4.8",
|
||||
"graphql": "14.2.1",
|
||||
"@nestjs/common": "6.3.0",
|
||||
"@nestjs/core": "6.3.0",
|
||||
"@nestjs/graphql": "6.2.1",
|
||||
"apollo-server-express": "2.6.1",
|
||||
"graphql": "14.3.1",
|
||||
"graphql-tools": "4.0.4",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rxjs": "6.4.0",
|
||||
"rxjs": "6.5.2",
|
||||
"subscriptions-transport-ws": "0.9.16",
|
||||
"typescript": "3.4.2",
|
||||
"ws": "6.2.1"
|
||||
"typescript": "3.5.1",
|
||||
"ws": "7.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "7.10.5",
|
||||
"ts-node": "8.0.3",
|
||||
"tslint": "5.15.0"
|
||||
"@types/node": "7.10.6",
|
||||
"ts-node": "8.2.0",
|
||||
"tslint": "5.17.0"
|
||||
}
|
||||
}
|
||||
|
||||
223
integration/hello-world/package-lock.json
generated
223
integration/hello-world/package-lock.json
generated
@@ -5,21 +5,21 @@
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@nestjs/common": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.0.5.tgz",
|
||||
"integrity": "sha512-CbXtgBW/irevfUZF+rURDLFjhmT0Q6dmzbEYkuMg8bSjPmvgG6VzOBG6PwoPZbd+8PrPc2XLjN2A2Hg9mImp7A==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.3.0.tgz",
|
||||
"integrity": "sha512-zvMk2tN2l07bzylGM1znTKd0EpivYqox2ER6VXKAIWNDYVfPQg6q0UBsAuaXHTVGGCjbbl1l8wiyWwZvWmAUAg==",
|
||||
"requires": {
|
||||
"axios": "0.18.0",
|
||||
"axios": "0.19.0",
|
||||
"cli-color": "1.4.0",
|
||||
"uuid": "3.3.2"
|
||||
}
|
||||
},
|
||||
"@nestjs/core": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.0.5.tgz",
|
||||
"integrity": "sha512-diLLr9qb9vGKyvfkt8JFGox21rpgj4YiToCRb3Tbdab0bvssLopznh/f7cdEBNmk5Adtl3IvXjtdVRj+XH7VCw==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.3.0.tgz",
|
||||
"integrity": "sha512-4V8AXcvD+/5PjmKZV6pHhVDsVfIqfYTmx6Sc5SMnpTFlTpbAvC6UizrvC2BN9VAwSNkIFwJHtNNWhachjeykzA==",
|
||||
"requires": {
|
||||
"@nuxtjs/opencollective": "0.2.1",
|
||||
"@nuxtjs/opencollective": "0.2.2",
|
||||
"fast-safe-stringify": "2.0.6",
|
||||
"iterare": "1.1.2",
|
||||
"object-hash": "1.3.1",
|
||||
@@ -28,9 +28,9 @@
|
||||
}
|
||||
},
|
||||
"@nestjs/microservices": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-6.0.5.tgz",
|
||||
"integrity": "sha512-lUyxzYQ3E5U7aQaY4bKVnGxizTl2cE2Rrey0ylmeVE4ae9Y7/z/7mdsfB4DVnuMVuRpyClUJ+zrQ4tJAIvL/nQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-6.3.0.tgz",
|
||||
"integrity": "sha512-JgSIJ+5IIQQWuK5Q7lsugxVH1ntToLBuTclH23jqTb4QnIcVAQFx0/rhyBgnKPIHZSPe1Z9553AFka86u6DP7g==",
|
||||
"requires": {
|
||||
"iterare": "1.1.2",
|
||||
"json-socket": "0.3.0",
|
||||
@@ -38,25 +38,25 @@
|
||||
}
|
||||
},
|
||||
"@nestjs/testing": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-6.0.5.tgz",
|
||||
"integrity": "sha512-LrPBckONn/ZalBC8GU5LxvgIS8DJNrdwZE4gMJz0ugodwl0c1IL3e2gIukBkUJtHYPtzN12nYevnaGYT/V1aDQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-6.3.0.tgz",
|
||||
"integrity": "sha512-M8Vbi+6zJp3OkKf3OdBM70DaK2SswzygQ3zuuu/nc/TCFiX+9setLsQwXf/qFeO/ss8ko5UB2HmP6R8HelAdiA==",
|
||||
"requires": {
|
||||
"optional": "0.1.4"
|
||||
}
|
||||
},
|
||||
"@nestjs/websockets": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-6.0.5.tgz",
|
||||
"integrity": "sha512-cA4Z6dM/Q8WqzgDyC6HiCdFvcDVAv7TyGkzthuuCn9xHDeLjtyzCL1koogkZ0FmLWhNmCskc/yJb2IjApGtzvQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-6.3.0.tgz",
|
||||
"integrity": "sha512-02UC5zYBW57pApO6cWpHZuSw1Z0kqQd5ocSr5aKaSVGITQjbkhlWovMCwibAAzqnVegBIyGOj9FDxEtcPrdv7w==",
|
||||
"requires": {
|
||||
"iterare": "1.1.2"
|
||||
}
|
||||
},
|
||||
"@nuxtjs/opencollective": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.1.tgz",
|
||||
"integrity": "sha512-pzSib8NKquaTt/ns5Cc2G0BGRVJXaD+p1qfF6q7vNIMvRysorn/VF3y7gAuQpcxfF7wBbGE+dXjhIieWOUsWSw==",
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz",
|
||||
"integrity": "sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw==",
|
||||
"requires": {
|
||||
"chalk": "^2.4.1",
|
||||
"consola": "^2.3.0",
|
||||
@@ -64,9 +64,9 @@
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "7.10.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.5.tgz",
|
||||
"integrity": "sha512-RYkagUUbxQBss46ElbEa+j4q4X3GR12QwB7a/PM5hmVuVkYoW1jENT1+taspKUv8ibwW8cw+kRFbOaTc/Key3w==",
|
||||
"version": "7.10.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.6.tgz",
|
||||
"integrity": "sha512-d0BOAicT0tEdbdVQlLGOVul1kvg6YvbaADRCThGCz5NJ0e9r00SofcR1x69hmlCyrHuB6jd4cKzL9bMLjPnpAA==",
|
||||
"dev": true
|
||||
},
|
||||
"abstract-logging": {
|
||||
@@ -141,19 +141,14 @@
|
||||
}
|
||||
},
|
||||
"axios": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
|
||||
"integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
|
||||
"version": "0.19.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
|
||||
"integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.3.0",
|
||||
"is-buffer": "^1.1.5"
|
||||
"follow-redirects": "1.5.10",
|
||||
"is-buffer": "^2.0.2"
|
||||
}
|
||||
},
|
||||
"bourne": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/bourne/-/bourne-1.1.2.tgz",
|
||||
"integrity": "sha512-b2dgVkTZhkQirNMohgC00rWfpVqEi9y5tKM1k3JvoNx05ODtfQoPPd4js9CYFQoY0IM8LAmnJulEuWv74zjUOg=="
|
||||
},
|
||||
"buffer-from": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
||||
@@ -171,9 +166,9 @@
|
||||
}
|
||||
},
|
||||
"class-transformer": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.0.tgz",
|
||||
"integrity": "sha512-6N/5WkEmLZCKxyC2CAPYQIJt3pDZzDFag7AExpyWRm7CjaS/U62VDRU+Z2AUrQaNpnuiXRlli0so4PJUqGSVZQ=="
|
||||
"version": "0.2.3",
|
||||
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.3.tgz",
|
||||
"integrity": "sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ=="
|
||||
},
|
||||
"class-validator": {
|
||||
"version": "0.9.1",
|
||||
@@ -226,9 +221,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"consola": {
|
||||
"version": "2.5.8",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.5.8.tgz",
|
||||
"integrity": "sha512-fYv1M0rNJw4h0CZUx8PX02Px7xQhA+vNHpV8DBCGMoozp2Io/vrSXhhEothaRnSt7VMR0rj2pt9KKLXa5amrCw=="
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.7.1.tgz",
|
||||
"integrity": "sha512-u7JYs+HnMbZPD2cEuS1XHsLeqtazA0kd5lAk8r8DnnGdgNhOdb7DSubJ+QLdQkbtpmmxgp7gs8Ug44sCyY4FCQ=="
|
||||
},
|
||||
"cookiejar": {
|
||||
"version": "2.1.2",
|
||||
@@ -254,7 +249,6 @@
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
@@ -271,15 +265,15 @@
|
||||
"dev": true
|
||||
},
|
||||
"diff": {
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
|
||||
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
|
||||
"integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
|
||||
"dev": true
|
||||
},
|
||||
"es5-ext": {
|
||||
"version": "0.10.49",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz",
|
||||
"integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==",
|
||||
"version": "0.10.50",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz",
|
||||
"integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==",
|
||||
"requires": {
|
||||
"es6-iterator": "~2.0.3",
|
||||
"es6-symbol": "~3.1.1",
|
||||
@@ -352,9 +346,9 @@
|
||||
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
|
||||
},
|
||||
"fast-json-stringify": {
|
||||
"version": "1.14.0",
|
||||
"resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-1.14.0.tgz",
|
||||
"integrity": "sha512-3VSblXsVxIE46E/YzRYHapyIeM3/igeA/kyzdL5xfAIYNnCLd8Oy+scrURnqZIRXMmtx0hfyp+okN5+r4W+GMQ==",
|
||||
"version": "1.15.2",
|
||||
"resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-1.15.2.tgz",
|
||||
"integrity": "sha512-iKo79rW7J2LRexme54j33BZBmFmGtqwYL6fmAxnU5VOZEJCUFir5g5iCmt5HXtxUXvI2hnmpGku+cduJpMCvwQ==",
|
||||
"requires": {
|
||||
"ajv": "^6.8.1",
|
||||
"deepmerge": "^3.0.0"
|
||||
@@ -371,23 +365,23 @@
|
||||
"integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg=="
|
||||
},
|
||||
"fastify": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/fastify/-/fastify-2.2.0.tgz",
|
||||
"integrity": "sha512-U6W101N+8Hyz2uiN3XqdSdTiaWYiJ0lCJmC3tO42PNttjCZQp8EPIhZ0QkVQWLrrP0ijjgomwaYrj9eMzqWyDw==",
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/fastify/-/fastify-2.4.1.tgz",
|
||||
"integrity": "sha512-AVzNO8/gg6og8T/s7M3UUQjvI4AIJNm8CSHm+kf3S0mGoJfWpfRuTD1pRTQ5tM+0pJpybyT5nDVTy97/oTD1+w==",
|
||||
"requires": {
|
||||
"abstract-logging": "^1.0.0",
|
||||
"ajv": "^6.9.2",
|
||||
"avvio": "^6.1.1",
|
||||
"bourne": "^1.1.2",
|
||||
"fast-json-stringify": "^1.11.2",
|
||||
"fast-json-stringify": "^1.15.0",
|
||||
"find-my-way": "^2.0.0",
|
||||
"flatstr": "^1.0.9",
|
||||
"flatstr": "^1.0.12",
|
||||
"light-my-request": "^3.2.0",
|
||||
"middie": "^4.0.1",
|
||||
"pino": "^5.11.1",
|
||||
"proxy-addr": "^2.0.4",
|
||||
"readable-stream": "^3.1.1",
|
||||
"rfdc": "^1.1.2",
|
||||
"secure-json-parse": "^1.0.0",
|
||||
"tiny-lru": "^6.0.1"
|
||||
}
|
||||
},
|
||||
@@ -410,31 +404,16 @@
|
||||
}
|
||||
},
|
||||
"flatstr": {
|
||||
"version": "1.0.9",
|
||||
"resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.9.tgz",
|
||||
"integrity": "sha512-qFlJnOBWDfIaunF54/lBqNKmXOI0HqNhu+mHkLmbaBXlS71PUd9OjFOdyevHt/aHoHB1+eW7eKHgRKOG5aHSpw=="
|
||||
"version": "1.0.12",
|
||||
"resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz",
|
||||
"integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw=="
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz",
|
||||
"integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==",
|
||||
"version": "1.5.10",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
|
||||
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
|
||||
"requires": {
|
||||
"debug": "^3.2.6"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.2.6",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
||||
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
||||
}
|
||||
"debug": "=3.1.0"
|
||||
}
|
||||
},
|
||||
"form-data": {
|
||||
@@ -475,14 +454,14 @@
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||
},
|
||||
"ipaddr.js": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
|
||||
"integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4="
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
|
||||
"integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
|
||||
},
|
||||
"is-buffer": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
|
||||
"integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw=="
|
||||
},
|
||||
"is-promise": {
|
||||
"version": "2.1.0",
|
||||
@@ -581,8 +560,7 @@
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
|
||||
"dev": true
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
},
|
||||
"next-tick": {
|
||||
"version": "1.0.0",
|
||||
@@ -590,9 +568,9 @@
|
||||
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz",
|
||||
"integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA=="
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
|
||||
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
|
||||
},
|
||||
"object-hash": {
|
||||
"version": "1.3.1",
|
||||
@@ -610,9 +588,9 @@
|
||||
"integrity": "sha512-ZOtfhPttCrqp2M1PBBH4X13XlvnfhIwD7yCLx+GoGoXRPQyxGOTdQMpIzPSPKXAJT/JQrdfFrgdJOyAzvgpQ9A=="
|
||||
},
|
||||
"pino": {
|
||||
"version": "5.12.2",
|
||||
"resolved": "https://registry.npmjs.org/pino/-/pino-5.12.2.tgz",
|
||||
"integrity": "sha512-EunVRDkw/eQzgAudJiZuqzEQ20hDezixLRLrdxUMBzavvt5ot3vep7K8swRvXSgj2bKtbOmoHnrRMtYzRjfITQ==",
|
||||
"version": "5.12.5",
|
||||
"resolved": "https://registry.npmjs.org/pino/-/pino-5.12.5.tgz",
|
||||
"integrity": "sha512-Y493vt9ci7Jez3WZ/aUArijTQZXbHgWvDB3TMZlTu731p2kan/qyJk5k46aveEmYFnTlEommc+PSncUcuiMrBg==",
|
||||
"requires": {
|
||||
"fast-redact": "^1.4.4",
|
||||
"fast-safe-stringify": "^2.0.6",
|
||||
@@ -623,9 +601,9 @@
|
||||
}
|
||||
},
|
||||
"pino-std-serializers": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.3.0.tgz",
|
||||
"integrity": "sha512-klfGoOsP6sJH7ON796G4xoUSx2fkpFgKHO4YVVO2zmz31jR+etzc/QzGJILaOIiCD6HTCFgkPx+XN8nk+ruqPw=="
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz",
|
||||
"integrity": "sha512-v/JglhO0aFcvkMV9VUxhgyuJo8K1si857Ww86Tx8H2cjC/kp0ndzzcF6Vbxr4RgKFYJdHfLVpEuD55znMZuxnw=="
|
||||
},
|
||||
"process-nextick-args": {
|
||||
"version": "2.0.0",
|
||||
@@ -634,12 +612,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"proxy-addr": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
|
||||
"integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
|
||||
"integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
|
||||
"requires": {
|
||||
"forwarded": "~0.1.2",
|
||||
"ipaddr.js": "1.8.0"
|
||||
"ipaddr.js": "1.9.0"
|
||||
}
|
||||
},
|
||||
"punycode": {
|
||||
@@ -684,14 +662,14 @@
|
||||
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
|
||||
},
|
||||
"rfdc": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz",
|
||||
"integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA=="
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz",
|
||||
"integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug=="
|
||||
},
|
||||
"rxjs": {
|
||||
"version": "6.4.0",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
|
||||
"integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
|
||||
"integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
|
||||
"requires": {
|
||||
"tslib": "^1.9.0"
|
||||
}
|
||||
@@ -709,15 +687,20 @@
|
||||
"ret": "~0.2.0"
|
||||
}
|
||||
},
|
||||
"secure-json-parse": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-1.0.0.tgz",
|
||||
"integrity": "sha512-kMg4jXttRQzVyLebIDc+MRxCueJ/zsmHpCn59BRd0mZUCd+V02wNd7/Pds8Nyhv7jfLHo1KkUOzdIF7cRMU4LQ=="
|
||||
},
|
||||
"semver-store": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz",
|
||||
"integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg=="
|
||||
},
|
||||
"sonic-boom": {
|
||||
"version": "0.7.3",
|
||||
"resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.3.tgz",
|
||||
"integrity": "sha512-A9EyoIeLD+g9vMLYQKjNCatJtAKdBQMW03+L8ZWWX/A6hq+srRCwdqHrBD1R8oSMLXov3oHN13dljtZf12q2Ow==",
|
||||
"version": "0.7.4",
|
||||
"resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.4.tgz",
|
||||
"integrity": "sha512-8JRAJg0RxZtFLQMxolwETvWd2JSlH3ZGo/Z4xPxMbpqF14xCgVYPVeFCFOR3zyr3pcfG82QDVj6537Sx5ZWdNw==",
|
||||
"requires": {
|
||||
"flatstr": "^1.0.9"
|
||||
}
|
||||
@@ -729,9 +712,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"source-map-support": {
|
||||
"version": "0.5.11",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz",
|
||||
"integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==",
|
||||
"version": "0.5.12",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
|
||||
"integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"buffer-from": "^1.0.0",
|
||||
@@ -829,13 +812,13 @@
|
||||
"integrity": "sha512-k/vdHz+bFALjmik0URLWBYNuO0hCABTL5dullbZBXvFDdlL8RrKaeLR6YuHfX+6ZXOLkHw+HpNLCUA7DtLMQmg=="
|
||||
},
|
||||
"ts-node": {
|
||||
"version": "8.0.3",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz",
|
||||
"integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==",
|
||||
"version": "8.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.2.0.tgz",
|
||||
"integrity": "sha512-m8XQwUurkbYqXrKqr3WHCW310utRNvV5OnRVeISeea7LoCWVcdfeB/Ntl8JYWFh+WRoUAdBgESrzKochQt7sMw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"arg": "^4.1.0",
|
||||
"diff": "^3.1.0",
|
||||
"diff": "^4.0.1",
|
||||
"make-error": "^1.1.1",
|
||||
"source-map-support": "^0.5.6",
|
||||
"yn": "^3.0.0"
|
||||
@@ -847,9 +830,9 @@
|
||||
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
|
||||
},
|
||||
"typescript": {
|
||||
"version": "3.4.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.2.tgz",
|
||||
"integrity": "sha512-Og2Vn6Mk7JAuWA1hQdDQN/Ekm/SchX80VzLhjKN9ETYrIepBFAd8PkOdOTK2nKt0FCkmMZKBJvQ1dV1gIxPu/A=="
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
|
||||
"integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw=="
|
||||
},
|
||||
"uri-js": {
|
||||
"version": "4.2.2",
|
||||
@@ -875,9 +858,9 @@
|
||||
"integrity": "sha512-Q/wBy3LB1uOyssgNlXSRmaf22NxjvDNZM2MtIQ4jaEOAB61xsh1TQxsq1CgzUMBV1lDrVMogIh8GjG1DYW0zLg=="
|
||||
},
|
||||
"yn": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz",
|
||||
"integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==",
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz",
|
||||
"integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,21 +7,21 @@
|
||||
"start": "ts-node src/main"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "6.0.5",
|
||||
"@nestjs/core": "6.0.5",
|
||||
"@nestjs/microservices": "6.0.5",
|
||||
"@nestjs/testing": "6.0.5",
|
||||
"@nestjs/websockets": "6.0.5",
|
||||
"class-transformer": "0.2.0",
|
||||
"@nestjs/common": "6.3.0",
|
||||
"@nestjs/core": "6.3.0",
|
||||
"@nestjs/microservices": "6.3.0",
|
||||
"@nestjs/testing": "6.3.0",
|
||||
"@nestjs/websockets": "6.3.0",
|
||||
"class-transformer": "0.2.3",
|
||||
"class-validator": "0.9.1",
|
||||
"fastify": "2.2.0",
|
||||
"fastify": "2.4.1",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rxjs": "6.4.0",
|
||||
"typescript": "3.4.2"
|
||||
"rxjs": "6.5.2",
|
||||
"typescript": "3.5.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "7.10.5",
|
||||
"@types/node": "7.10.6",
|
||||
"supertest": "4.0.2",
|
||||
"ts-node": "8.0.3"
|
||||
"ts-node": "8.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
133
integration/hooks/package-lock.json
generated
133
integration/hooks/package-lock.json
generated
@@ -5,21 +5,21 @@
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@nestjs/common": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.0.5.tgz",
|
||||
"integrity": "sha512-CbXtgBW/irevfUZF+rURDLFjhmT0Q6dmzbEYkuMg8bSjPmvgG6VzOBG6PwoPZbd+8PrPc2XLjN2A2Hg9mImp7A==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.3.0.tgz",
|
||||
"integrity": "sha512-zvMk2tN2l07bzylGM1znTKd0EpivYqox2ER6VXKAIWNDYVfPQg6q0UBsAuaXHTVGGCjbbl1l8wiyWwZvWmAUAg==",
|
||||
"requires": {
|
||||
"axios": "0.18.0",
|
||||
"axios": "0.19.0",
|
||||
"cli-color": "1.4.0",
|
||||
"uuid": "3.3.2"
|
||||
}
|
||||
},
|
||||
"@nestjs/core": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.0.5.tgz",
|
||||
"integrity": "sha512-diLLr9qb9vGKyvfkt8JFGox21rpgj4YiToCRb3Tbdab0bvssLopznh/f7cdEBNmk5Adtl3IvXjtdVRj+XH7VCw==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.3.0.tgz",
|
||||
"integrity": "sha512-4V8AXcvD+/5PjmKZV6pHhVDsVfIqfYTmx6Sc5SMnpTFlTpbAvC6UizrvC2BN9VAwSNkIFwJHtNNWhachjeykzA==",
|
||||
"requires": {
|
||||
"@nuxtjs/opencollective": "0.2.1",
|
||||
"@nuxtjs/opencollective": "0.2.2",
|
||||
"fast-safe-stringify": "2.0.6",
|
||||
"iterare": "1.1.2",
|
||||
"object-hash": "1.3.1",
|
||||
@@ -28,9 +28,9 @@
|
||||
}
|
||||
},
|
||||
"@nuxtjs/opencollective": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.1.tgz",
|
||||
"integrity": "sha512-pzSib8NKquaTt/ns5Cc2G0BGRVJXaD+p1qfF6q7vNIMvRysorn/VF3y7gAuQpcxfF7wBbGE+dXjhIieWOUsWSw==",
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz",
|
||||
"integrity": "sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw==",
|
||||
"requires": {
|
||||
"chalk": "^2.4.1",
|
||||
"consola": "^2.3.0",
|
||||
@@ -38,9 +38,9 @@
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "7.10.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.5.tgz",
|
||||
"integrity": "sha512-RYkagUUbxQBss46ElbEa+j4q4X3GR12QwB7a/PM5hmVuVkYoW1jENT1+taspKUv8ibwW8cw+kRFbOaTc/Key3w==",
|
||||
"version": "7.10.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.6.tgz",
|
||||
"integrity": "sha512-d0BOAicT0tEdbdVQlLGOVul1kvg6YvbaADRCThGCz5NJ0e9r00SofcR1x69hmlCyrHuB6jd4cKzL9bMLjPnpAA==",
|
||||
"dev": true
|
||||
},
|
||||
"ansi-regex": {
|
||||
@@ -69,12 +69,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"axios": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
|
||||
"integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
|
||||
"version": "0.19.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
|
||||
"integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.3.0",
|
||||
"is-buffer": "^1.1.5"
|
||||
"follow-redirects": "1.5.10",
|
||||
"is-buffer": "^2.0.2"
|
||||
}
|
||||
},
|
||||
"buffer-from": {
|
||||
@@ -94,9 +94,9 @@
|
||||
}
|
||||
},
|
||||
"class-transformer": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.0.tgz",
|
||||
"integrity": "sha512-6N/5WkEmLZCKxyC2CAPYQIJt3pDZzDFag7AExpyWRm7CjaS/U62VDRU+Z2AUrQaNpnuiXRlli0so4PJUqGSVZQ=="
|
||||
"version": "0.2.3",
|
||||
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.3.tgz",
|
||||
"integrity": "sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ=="
|
||||
},
|
||||
"class-validator": {
|
||||
"version": "0.9.1",
|
||||
@@ -149,9 +149,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"consola": {
|
||||
"version": "2.5.8",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.5.8.tgz",
|
||||
"integrity": "sha512-fYv1M0rNJw4h0CZUx8PX02Px7xQhA+vNHpV8DBCGMoozp2Io/vrSXhhEothaRnSt7VMR0rj2pt9KKLXa5amrCw=="
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.7.1.tgz",
|
||||
"integrity": "sha512-u7JYs+HnMbZPD2cEuS1XHsLeqtazA0kd5lAk8r8DnnGdgNhOdb7DSubJ+QLdQkbtpmmxgp7gs8Ug44sCyY4FCQ=="
|
||||
},
|
||||
"cookiejar": {
|
||||
"version": "2.1.2",
|
||||
@@ -177,6 +177,7 @@
|
||||
"version": "3.2.6",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
||||
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
@@ -188,15 +189,15 @@
|
||||
"dev": true
|
||||
},
|
||||
"diff": {
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
|
||||
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
|
||||
"integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
|
||||
"dev": true
|
||||
},
|
||||
"es5-ext": {
|
||||
"version": "0.10.49",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz",
|
||||
"integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==",
|
||||
"version": "0.10.50",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz",
|
||||
"integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==",
|
||||
"requires": {
|
||||
"es6-iterator": "~2.0.3",
|
||||
"es6-symbol": "~3.1.1",
|
||||
@@ -259,11 +260,26 @@
|
||||
"integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg=="
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz",
|
||||
"integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==",
|
||||
"version": "1.5.10",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
|
||||
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
|
||||
"requires": {
|
||||
"debug": "^3.2.6"
|
||||
"debug": "=3.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"form-data": {
|
||||
@@ -300,9 +316,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"is-buffer": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
|
||||
"integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw=="
|
||||
},
|
||||
"is-promise": {
|
||||
"version": "2.1.0",
|
||||
@@ -373,7 +389,8 @@
|
||||
"ms": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
|
||||
"dev": true
|
||||
},
|
||||
"next-tick": {
|
||||
"version": "1.0.0",
|
||||
@@ -381,9 +398,9 @@
|
||||
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz",
|
||||
"integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA=="
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
|
||||
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
|
||||
},
|
||||
"object-hash": {
|
||||
"version": "1.3.1",
|
||||
@@ -413,9 +430,9 @@
|
||||
"integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="
|
||||
},
|
||||
"rxjs": {
|
||||
"version": "6.4.0",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
|
||||
"integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
|
||||
"integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
|
||||
"requires": {
|
||||
"tslib": "^1.9.0"
|
||||
}
|
||||
@@ -433,9 +450,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"source-map-support": {
|
||||
"version": "0.5.11",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz",
|
||||
"integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==",
|
||||
"version": "0.5.12",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
|
||||
"integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"buffer-from": "^1.0.0",
|
||||
@@ -520,13 +537,13 @@
|
||||
}
|
||||
},
|
||||
"ts-node": {
|
||||
"version": "8.0.3",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz",
|
||||
"integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==",
|
||||
"version": "8.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.2.0.tgz",
|
||||
"integrity": "sha512-m8XQwUurkbYqXrKqr3WHCW310utRNvV5OnRVeISeea7LoCWVcdfeB/Ntl8JYWFh+WRoUAdBgESrzKochQt7sMw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"arg": "^4.1.0",
|
||||
"diff": "^3.1.0",
|
||||
"diff": "^4.0.1",
|
||||
"make-error": "^1.1.1",
|
||||
"source-map-support": "^0.5.6",
|
||||
"yn": "^3.0.0"
|
||||
@@ -538,9 +555,9 @@
|
||||
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
|
||||
},
|
||||
"typescript": {
|
||||
"version": "3.4.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.2.tgz",
|
||||
"integrity": "sha512-Og2Vn6Mk7JAuWA1hQdDQN/Ekm/SchX80VzLhjKN9ETYrIepBFAd8PkOdOTK2nKt0FCkmMZKBJvQ1dV1gIxPu/A=="
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
|
||||
"integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw=="
|
||||
},
|
||||
"util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
@@ -559,9 +576,9 @@
|
||||
"integrity": "sha512-Q/wBy3LB1uOyssgNlXSRmaf22NxjvDNZM2MtIQ4jaEOAB61xsh1TQxsq1CgzUMBV1lDrVMogIh8GjG1DYW0zLg=="
|
||||
},
|
||||
"yn": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz",
|
||||
"integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==",
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz",
|
||||
"integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,17 +7,17 @@
|
||||
"start": "ts-node src/main"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "6.0.5",
|
||||
"@nestjs/core": "6.0.5",
|
||||
"class-transformer": "0.2.0",
|
||||
"@nestjs/common": "6.3.0",
|
||||
"@nestjs/core": "6.3.0",
|
||||
"class-transformer": "0.2.3",
|
||||
"class-validator": "0.9.1",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rxjs": "6.4.0",
|
||||
"typescript": "3.4.2"
|
||||
"rxjs": "6.5.2",
|
||||
"typescript": "3.5.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "7.10.5",
|
||||
"@types/node": "7.10.6",
|
||||
"supertest": "4.0.2",
|
||||
"ts-node": "8.0.3"
|
||||
"ts-node": "8.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
151
integration/injector/package-lock.json
generated
151
integration/injector/package-lock.json
generated
@@ -5,21 +5,21 @@
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@nestjs/common": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.0.5.tgz",
|
||||
"integrity": "sha512-CbXtgBW/irevfUZF+rURDLFjhmT0Q6dmzbEYkuMg8bSjPmvgG6VzOBG6PwoPZbd+8PrPc2XLjN2A2Hg9mImp7A==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.3.0.tgz",
|
||||
"integrity": "sha512-zvMk2tN2l07bzylGM1znTKd0EpivYqox2ER6VXKAIWNDYVfPQg6q0UBsAuaXHTVGGCjbbl1l8wiyWwZvWmAUAg==",
|
||||
"requires": {
|
||||
"axios": "0.18.0",
|
||||
"axios": "0.19.0",
|
||||
"cli-color": "1.4.0",
|
||||
"uuid": "3.3.2"
|
||||
}
|
||||
},
|
||||
"@nestjs/core": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.0.5.tgz",
|
||||
"integrity": "sha512-diLLr9qb9vGKyvfkt8JFGox21rpgj4YiToCRb3Tbdab0bvssLopznh/f7cdEBNmk5Adtl3IvXjtdVRj+XH7VCw==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.3.0.tgz",
|
||||
"integrity": "sha512-4V8AXcvD+/5PjmKZV6pHhVDsVfIqfYTmx6Sc5SMnpTFlTpbAvC6UizrvC2BN9VAwSNkIFwJHtNNWhachjeykzA==",
|
||||
"requires": {
|
||||
"@nuxtjs/opencollective": "0.2.1",
|
||||
"@nuxtjs/opencollective": "0.2.2",
|
||||
"fast-safe-stringify": "2.0.6",
|
||||
"iterare": "1.1.2",
|
||||
"object-hash": "1.3.1",
|
||||
@@ -28,9 +28,9 @@
|
||||
}
|
||||
},
|
||||
"@nestjs/microservices": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-6.0.5.tgz",
|
||||
"integrity": "sha512-lUyxzYQ3E5U7aQaY4bKVnGxizTl2cE2Rrey0ylmeVE4ae9Y7/z/7mdsfB4DVnuMVuRpyClUJ+zrQ4tJAIvL/nQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-6.3.0.tgz",
|
||||
"integrity": "sha512-JgSIJ+5IIQQWuK5Q7lsugxVH1ntToLBuTclH23jqTb4QnIcVAQFx0/rhyBgnKPIHZSPe1Z9553AFka86u6DP7g==",
|
||||
"requires": {
|
||||
"iterare": "1.1.2",
|
||||
"json-socket": "0.3.0",
|
||||
@@ -38,25 +38,25 @@
|
||||
}
|
||||
},
|
||||
"@nestjs/testing": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-6.0.5.tgz",
|
||||
"integrity": "sha512-LrPBckONn/ZalBC8GU5LxvgIS8DJNrdwZE4gMJz0ugodwl0c1IL3e2gIukBkUJtHYPtzN12nYevnaGYT/V1aDQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-6.3.0.tgz",
|
||||
"integrity": "sha512-M8Vbi+6zJp3OkKf3OdBM70DaK2SswzygQ3zuuu/nc/TCFiX+9setLsQwXf/qFeO/ss8ko5UB2HmP6R8HelAdiA==",
|
||||
"requires": {
|
||||
"optional": "0.1.4"
|
||||
}
|
||||
},
|
||||
"@nestjs/websockets": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-6.0.5.tgz",
|
||||
"integrity": "sha512-cA4Z6dM/Q8WqzgDyC6HiCdFvcDVAv7TyGkzthuuCn9xHDeLjtyzCL1koogkZ0FmLWhNmCskc/yJb2IjApGtzvQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-6.3.0.tgz",
|
||||
"integrity": "sha512-02UC5zYBW57pApO6cWpHZuSw1Z0kqQd5ocSr5aKaSVGITQjbkhlWovMCwibAAzqnVegBIyGOj9FDxEtcPrdv7w==",
|
||||
"requires": {
|
||||
"iterare": "1.1.2"
|
||||
}
|
||||
},
|
||||
"@nuxtjs/opencollective": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.1.tgz",
|
||||
"integrity": "sha512-pzSib8NKquaTt/ns5Cc2G0BGRVJXaD+p1qfF6q7vNIMvRysorn/VF3y7gAuQpcxfF7wBbGE+dXjhIieWOUsWSw==",
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz",
|
||||
"integrity": "sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw==",
|
||||
"requires": {
|
||||
"chalk": "^2.4.1",
|
||||
"consola": "^2.3.0",
|
||||
@@ -64,9 +64,9 @@
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "7.10.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.5.tgz",
|
||||
"integrity": "sha512-RYkagUUbxQBss46ElbEa+j4q4X3GR12QwB7a/PM5hmVuVkYoW1jENT1+taspKUv8ibwW8cw+kRFbOaTc/Key3w==",
|
||||
"version": "7.10.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.6.tgz",
|
||||
"integrity": "sha512-d0BOAicT0tEdbdVQlLGOVul1kvg6YvbaADRCThGCz5NJ0e9r00SofcR1x69hmlCyrHuB6jd4cKzL9bMLjPnpAA==",
|
||||
"dev": true
|
||||
},
|
||||
"ansi-regex": {
|
||||
@@ -95,12 +95,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"axios": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
|
||||
"integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
|
||||
"version": "0.19.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
|
||||
"integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.3.0",
|
||||
"is-buffer": "^1.1.5"
|
||||
"follow-redirects": "1.5.10",
|
||||
"is-buffer": "^2.0.2"
|
||||
}
|
||||
},
|
||||
"buffer-from": {
|
||||
@@ -120,9 +120,9 @@
|
||||
}
|
||||
},
|
||||
"class-transformer": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.0.tgz",
|
||||
"integrity": "sha512-6N/5WkEmLZCKxyC2CAPYQIJt3pDZzDFag7AExpyWRm7CjaS/U62VDRU+Z2AUrQaNpnuiXRlli0so4PJUqGSVZQ=="
|
||||
"version": "0.2.3",
|
||||
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.3.tgz",
|
||||
"integrity": "sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ=="
|
||||
},
|
||||
"class-validator": {
|
||||
"version": "0.9.1",
|
||||
@@ -175,9 +175,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"consola": {
|
||||
"version": "2.5.8",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.5.8.tgz",
|
||||
"integrity": "sha512-fYv1M0rNJw4h0CZUx8PX02Px7xQhA+vNHpV8DBCGMoozp2Io/vrSXhhEothaRnSt7VMR0rj2pt9KKLXa5amrCw=="
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.7.1.tgz",
|
||||
"integrity": "sha512-u7JYs+HnMbZPD2cEuS1XHsLeqtazA0kd5lAk8r8DnnGdgNhOdb7DSubJ+QLdQkbtpmmxgp7gs8Ug44sCyY4FCQ=="
|
||||
},
|
||||
"cookiejar": {
|
||||
"version": "2.1.2",
|
||||
@@ -203,6 +203,7 @@
|
||||
"version": "3.2.6",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
||||
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
@@ -214,15 +215,15 @@
|
||||
"dev": true
|
||||
},
|
||||
"diff": {
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
|
||||
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
|
||||
"integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
|
||||
"dev": true
|
||||
},
|
||||
"es5-ext": {
|
||||
"version": "0.10.49",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz",
|
||||
"integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==",
|
||||
"version": "0.10.50",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz",
|
||||
"integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==",
|
||||
"requires": {
|
||||
"es6-iterator": "~2.0.3",
|
||||
"es6-symbol": "~3.1.1",
|
||||
@@ -285,11 +286,26 @@
|
||||
"integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg=="
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz",
|
||||
"integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==",
|
||||
"version": "1.5.10",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
|
||||
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
|
||||
"requires": {
|
||||
"debug": "^3.2.6"
|
||||
"debug": "=3.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"form-data": {
|
||||
@@ -326,9 +342,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"is-buffer": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
|
||||
"integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw=="
|
||||
},
|
||||
"is-promise": {
|
||||
"version": "2.1.0",
|
||||
@@ -404,7 +420,8 @@
|
||||
"ms": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
|
||||
"dev": true
|
||||
},
|
||||
"next-tick": {
|
||||
"version": "1.0.0",
|
||||
@@ -412,9 +429,9 @@
|
||||
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz",
|
||||
"integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA=="
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
|
||||
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
|
||||
},
|
||||
"object-hash": {
|
||||
"version": "1.3.1",
|
||||
@@ -444,9 +461,9 @@
|
||||
"integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="
|
||||
},
|
||||
"rxjs": {
|
||||
"version": "6.4.0",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
|
||||
"integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
|
||||
"integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
|
||||
"requires": {
|
||||
"tslib": "^1.9.0"
|
||||
}
|
||||
@@ -464,9 +481,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"source-map-support": {
|
||||
"version": "0.5.11",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz",
|
||||
"integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==",
|
||||
"version": "0.5.12",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
|
||||
"integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"buffer-from": "^1.0.0",
|
||||
@@ -551,13 +568,13 @@
|
||||
}
|
||||
},
|
||||
"ts-node": {
|
||||
"version": "8.0.3",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz",
|
||||
"integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==",
|
||||
"version": "8.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.2.0.tgz",
|
||||
"integrity": "sha512-m8XQwUurkbYqXrKqr3WHCW310utRNvV5OnRVeISeea7LoCWVcdfeB/Ntl8JYWFh+WRoUAdBgESrzKochQt7sMw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"arg": "^4.1.0",
|
||||
"diff": "^3.1.0",
|
||||
"diff": "^4.0.1",
|
||||
"make-error": "^1.1.1",
|
||||
"source-map-support": "^0.5.6",
|
||||
"yn": "^3.0.0"
|
||||
@@ -569,9 +586,9 @@
|
||||
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
|
||||
},
|
||||
"typescript": {
|
||||
"version": "3.4.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.2.tgz",
|
||||
"integrity": "sha512-Og2Vn6Mk7JAuWA1hQdDQN/Ekm/SchX80VzLhjKN9ETYrIepBFAd8PkOdOTK2nKt0FCkmMZKBJvQ1dV1gIxPu/A=="
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
|
||||
"integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw=="
|
||||
},
|
||||
"util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
@@ -590,9 +607,9 @@
|
||||
"integrity": "sha512-Q/wBy3LB1uOyssgNlXSRmaf22NxjvDNZM2MtIQ4jaEOAB61xsh1TQxsq1CgzUMBV1lDrVMogIh8GjG1DYW0zLg=="
|
||||
},
|
||||
"yn": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz",
|
||||
"integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==",
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz",
|
||||
"integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,20 +7,20 @@
|
||||
"start": "ts-node src/main"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "6.0.5",
|
||||
"@nestjs/core": "6.0.5",
|
||||
"@nestjs/microservices": "6.0.5",
|
||||
"@nestjs/testing": "6.0.5",
|
||||
"@nestjs/websockets": "6.0.5",
|
||||
"class-transformer": "0.2.0",
|
||||
"@nestjs/common": "6.3.0",
|
||||
"@nestjs/core": "6.3.0",
|
||||
"@nestjs/microservices": "6.3.0",
|
||||
"@nestjs/testing": "6.3.0",
|
||||
"@nestjs/websockets": "6.3.0",
|
||||
"class-transformer": "0.2.3",
|
||||
"class-validator": "0.9.1",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rxjs": "6.4.0",
|
||||
"typescript": "3.4.2"
|
||||
"rxjs": "6.5.2",
|
||||
"typescript": "3.5.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "7.10.5",
|
||||
"@types/node": "7.10.6",
|
||||
"supertest": "4.0.2",
|
||||
"ts-node": "8.0.3"
|
||||
"ts-node": "8.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
169
integration/microservices/e2e/orders-grpc.spec.ts
Normal file
169
integration/microservices/e2e/orders-grpc.spec.ts
Normal file
@@ -0,0 +1,169 @@
|
||||
import * as ProtoLoader from '@grpc/proto-loader';
|
||||
import { INestApplication } from '@nestjs/common';
|
||||
import { Transport } from '@nestjs/microservices';
|
||||
import { ExpressAdapter } from '@nestjs/platform-express';
|
||||
import { Test } from '@nestjs/testing';
|
||||
import { fail } from 'assert';
|
||||
import { expect } from 'chai';
|
||||
import * as express from 'express';
|
||||
import * as GRPC from 'grpc';
|
||||
import { join } from 'path';
|
||||
import * as request from 'supertest';
|
||||
import { AdvancedGrpcController } from '../src/grpc-advanced/advanced.grpc.controller';
|
||||
|
||||
describe('Advanced GRPC transport', () => {
|
||||
let server;
|
||||
let app: INestApplication;
|
||||
let client: any;
|
||||
|
||||
before(async () => {
|
||||
const module = await Test.createTestingModule({
|
||||
controllers: [AdvancedGrpcController],
|
||||
}).compile();
|
||||
// Create gRPC + HTTP server
|
||||
server = express();
|
||||
app = module.createNestApplication(new ExpressAdapter(server));
|
||||
/*
|
||||
* Create microservice configuration
|
||||
*/
|
||||
app.connectMicroservice({
|
||||
transport: Transport.GRPC,
|
||||
options: {
|
||||
url: 'localhost:5001',
|
||||
package: 'proto_example',
|
||||
protoPath: 'root.proto',
|
||||
loader: {
|
||||
includeDirs: [join(__dirname, '../src/grpc-advanced/proto')],
|
||||
keepCase: true,
|
||||
},
|
||||
},
|
||||
});
|
||||
// Start gRPC microservice
|
||||
await app.startAllMicroservicesAsync();
|
||||
await app.init();
|
||||
// Load proto-buffers for test gRPC dispatch
|
||||
const proto = ProtoLoader.loadSync('root.proto', {
|
||||
includeDirs: [join(__dirname, '../src/grpc-advanced/proto')],
|
||||
}) as any;
|
||||
// Create Raw gRPC client object
|
||||
const protoGRPC = GRPC.loadPackageDefinition(proto) as any;
|
||||
// Create client connected to started services at standard 5000 port
|
||||
client = new protoGRPC.proto_example.orders.OrderService(
|
||||
'localhost:5001',
|
||||
GRPC.credentials.createInsecure(),
|
||||
);
|
||||
});
|
||||
|
||||
it(`GRPC Sending and Receiving HTTP POST`, () => {
|
||||
return request(server)
|
||||
.post('/')
|
||||
.send('1')
|
||||
.expect(200, {
|
||||
id: 1,
|
||||
itemTypes: [1],
|
||||
shipmentType: {
|
||||
from: 'test',
|
||||
to: 'test1',
|
||||
carrier: 'test-carrier',
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
it('GRPC Sending and receiving message', async () => {
|
||||
// Execute find in Promise
|
||||
return new Promise(resolve => {
|
||||
client.find(
|
||||
{
|
||||
id: 1,
|
||||
},
|
||||
(err, result) => {
|
||||
// Compare results
|
||||
expect(err).to.be.null;
|
||||
expect(result).to.eql({
|
||||
id: 1,
|
||||
itemTypes: [1],
|
||||
shipmentType: {
|
||||
from: 'test',
|
||||
to: 'test1',
|
||||
carrier: 'test-carrier',
|
||||
},
|
||||
});
|
||||
// Resolve after checkups
|
||||
resolve();
|
||||
},
|
||||
);
|
||||
});
|
||||
});
|
||||
|
||||
it('GRPC Sending and receiving Stream from RX handler', async () => {
|
||||
const callHandler = client.sync();
|
||||
|
||||
callHandler.on('data', (msg: number) => {
|
||||
// Do deep comparison (to.eql)
|
||||
expect(msg).to.eql({
|
||||
id: 1,
|
||||
itemTypes: [1],
|
||||
shipmentType: {
|
||||
from: 'test',
|
||||
to: 'test1',
|
||||
carrier: 'test-carrier',
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
callHandler.on('error', (err: any) => {
|
||||
// We want to fail only on real errors while Cancellation error
|
||||
// is expected
|
||||
if (
|
||||
String(err)
|
||||
.toLowerCase()
|
||||
.indexOf('cancelled') === -1
|
||||
) {
|
||||
fail('gRPC Stream error happened, error: ' + err);
|
||||
}
|
||||
});
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
callHandler.write({
|
||||
id: 1,
|
||||
});
|
||||
setTimeout(() => resolve(), 1000);
|
||||
});
|
||||
});
|
||||
|
||||
it('GRPC Sending and receiving Stream from Call handler', async () => {
|
||||
const callHandler = client.syncCall();
|
||||
|
||||
callHandler.on('data', (msg: number) => {
|
||||
// Do deep comparison (to.eql)
|
||||
expect(msg).to.eql({
|
||||
id: 1,
|
||||
itemTypes: [1],
|
||||
shipmentType: {
|
||||
from: 'test',
|
||||
to: 'test1',
|
||||
carrier: 'test-carrier',
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
callHandler.on('error', (err: any) => {
|
||||
// We want to fail only on real errors while Cancellation error
|
||||
// is expected
|
||||
if (
|
||||
String(err)
|
||||
.toLowerCase()
|
||||
.indexOf('cancelled') === -1
|
||||
) {
|
||||
fail('gRPC Stream error happened, error: ' + err);
|
||||
}
|
||||
});
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
callHandler.write({
|
||||
id: 1,
|
||||
});
|
||||
setTimeout(() => resolve(), 1000);
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -1,6 +1,10 @@
|
||||
import * as ProtoLoader from '@grpc/proto-loader';
|
||||
import { INestApplication } from '@nestjs/common';
|
||||
import { Transport } from '@nestjs/microservices';
|
||||
import { Test } from '@nestjs/testing';
|
||||
import { fail } from 'assert';
|
||||
import { expect } from 'chai';
|
||||
import * as GRPC from 'grpc';
|
||||
import { join } from 'path';
|
||||
import * as request from 'supertest';
|
||||
import { GrpcController } from '../src/grpc/grpc.controller';
|
||||
@@ -8,8 +12,9 @@ import { GrpcController } from '../src/grpc/grpc.controller';
|
||||
describe('GRPC transport', () => {
|
||||
let server;
|
||||
let app: INestApplication;
|
||||
let client: any;
|
||||
|
||||
beforeEach(async () => {
|
||||
before(async () => {
|
||||
const module = await Test.createTestingModule({
|
||||
controllers: [GrpcController],
|
||||
}).compile();
|
||||
@@ -24,18 +29,83 @@ describe('GRPC transport', () => {
|
||||
protoPath: join(__dirname, '../src/grpc/math.proto'),
|
||||
},
|
||||
});
|
||||
// Start gRPC microservice
|
||||
await app.startAllMicroservicesAsync();
|
||||
await app.init();
|
||||
// Load proto-buffers for test gRPC dispatch
|
||||
const proto = ProtoLoader.loadSync(
|
||||
join(__dirname, '../src/grpc/math.proto'),
|
||||
) as any;
|
||||
// Create Raw gRPC client object
|
||||
const protoGRPC = GRPC.loadPackageDefinition(proto) as any;
|
||||
// Create client connected to started services at standard 5000 port
|
||||
client = new protoGRPC.math.Math(
|
||||
'localhost:5000',
|
||||
GRPC.credentials.createInsecure(),
|
||||
);
|
||||
});
|
||||
|
||||
it(`/POST`, () => {
|
||||
it(`GRPC Sending and Receiving HTTP POST`, () => {
|
||||
return request(server)
|
||||
.post('/')
|
||||
.send([1, 2, 3, 4, 5])
|
||||
.expect(200, { result: 15 });
|
||||
});
|
||||
|
||||
afterEach(async () => {
|
||||
it('GRPC Sending and receiving Stream from RX handler', async () => {
|
||||
const callHandler = client.SumStream();
|
||||
|
||||
callHandler.on('data', (msg: number) => {
|
||||
expect(msg).to.eql({ result: 15 });
|
||||
callHandler.cancel();
|
||||
});
|
||||
|
||||
callHandler.on('error', (err: any) => {
|
||||
// We want to fail only on real errors while Cancellation error
|
||||
// is expected
|
||||
if (
|
||||
String(err)
|
||||
.toLowerCase()
|
||||
.indexOf('cancelled') === -1
|
||||
) {
|
||||
fail('gRPC Stream error happened, error: ' + err);
|
||||
}
|
||||
});
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
callHandler.write({ data: [1, 2, 3, 4, 5] });
|
||||
setTimeout(() => resolve(), 1000);
|
||||
});
|
||||
});
|
||||
|
||||
it('GRPC Sending and receiving Stream from Call Passthrough handler', async () => {
|
||||
const callHandler = client.SumStreamPass();
|
||||
|
||||
callHandler.on('data', (msg: number) => {
|
||||
expect(msg).to.eql({ result: 15 });
|
||||
callHandler.cancel();
|
||||
});
|
||||
|
||||
callHandler.on('error', (err: any) => {
|
||||
// We want to fail only on real errors while Cancellation error
|
||||
// is expected
|
||||
if (
|
||||
String(err)
|
||||
.toLowerCase()
|
||||
.indexOf('cancelled') === -1
|
||||
) {
|
||||
fail('gRPC Stream error happened, error: ' + err);
|
||||
}
|
||||
});
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
callHandler.write({ data: [1, 2, 3, 4, 5] });
|
||||
setTimeout(() => resolve(), 1000);
|
||||
});
|
||||
});
|
||||
|
||||
after(async () => {
|
||||
await app.close();
|
||||
client.close();
|
||||
});
|
||||
});
|
||||
|
||||
@@ -23,6 +23,7 @@ describe('RabbitMQ transport', () => {
|
||||
urls: [`amqp://localhost:5672`],
|
||||
queue: 'test',
|
||||
queueOptions: { durable: false },
|
||||
socketOptions: { noDelay: true },
|
||||
},
|
||||
});
|
||||
await app.startAllMicroservicesAsync();
|
||||
|
||||
744
integration/microservices/package-lock.json
generated
744
integration/microservices/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -7,21 +7,22 @@
|
||||
"start": "ts-node src/main"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "6.0.5",
|
||||
"@nestjs/core": "6.0.5",
|
||||
"@nestjs/microservices": "6.0.5",
|
||||
"@nestjs/testing": "6.0.5",
|
||||
"@nestjs/websockets": "6.0.5",
|
||||
"amqp-connection-manager": "2.3.1",
|
||||
"class-transformer": "0.2.0",
|
||||
"@nestjs/common": "6.3.0",
|
||||
"@nestjs/core": "6.3.0",
|
||||
"@nestjs/microservices": "6.3.0",
|
||||
"@nestjs/platform-express": "6.3.0",
|
||||
"@nestjs/testing": "6.3.0",
|
||||
"@nestjs/websockets": "6.3.0",
|
||||
"amqp-connection-manager": "2.3.2",
|
||||
"class-transformer": "0.2.3",
|
||||
"class-validator": "0.9.1",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rxjs": "6.4.0",
|
||||
"typescript": "3.4.2"
|
||||
"rxjs": "6.5.2",
|
||||
"typescript": "3.5.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "7.10.5",
|
||||
"@types/node": "7.10.6",
|
||||
"supertest": "4.0.2",
|
||||
"ts-node": "8.0.3"
|
||||
"ts-node": "8.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,100 @@
|
||||
import { Body, Controller, HttpCode, Post } from '@nestjs/common';
|
||||
import {
|
||||
Client,
|
||||
ClientGrpc,
|
||||
GrpcMethod,
|
||||
GrpcStreamCall,
|
||||
GrpcStreamMethod,
|
||||
Transport,
|
||||
} from '@nestjs/microservices';
|
||||
import { join } from 'path';
|
||||
import { Observable, of, Subject } from 'rxjs';
|
||||
|
||||
@Controller()
|
||||
export class AdvancedGrpcController {
|
||||
/*
|
||||
* HTTP Proxy Client defines loading pattern
|
||||
*/
|
||||
@Client({
|
||||
transport: Transport.GRPC,
|
||||
options: {
|
||||
url: 'localhost:5001',
|
||||
package: 'proto_example.orders',
|
||||
protoPath: 'root.proto',
|
||||
loader: {
|
||||
includeDirs: [join(__dirname, './proto')],
|
||||
keepCase: true,
|
||||
},
|
||||
},
|
||||
})
|
||||
client: ClientGrpc;
|
||||
|
||||
/**
|
||||
* HTTP Proxy entry for support non-stream find method
|
||||
* @param id
|
||||
*/
|
||||
@Post()
|
||||
@HttpCode(200)
|
||||
call(@Body() id: number): Observable<number> {
|
||||
const svc = this.client.getService<any>('OrderService');
|
||||
return svc.find({ id });
|
||||
}
|
||||
|
||||
/**
|
||||
* GRPC stub for Find method
|
||||
* @param id
|
||||
*/
|
||||
@GrpcMethod('orders.OrderService')
|
||||
async find({ id }: { id: number }): Promise<any> {
|
||||
return of({
|
||||
id: 1,
|
||||
itemTypes: [1],
|
||||
shipmentType: {
|
||||
from: 'test',
|
||||
to: 'test1',
|
||||
carrier: 'test-carrier',
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* GRPC stub implementation for sync stream method
|
||||
* @param messages
|
||||
*/
|
||||
@GrpcStreamMethod('orders.OrderService')
|
||||
async sync(messages: Observable<any>): Promise<any> {
|
||||
const s = new Subject();
|
||||
const o = s.asObservable();
|
||||
messages.subscribe(msg => {
|
||||
s.next({
|
||||
id: 1,
|
||||
itemTypes: [1],
|
||||
shipmentType: {
|
||||
from: 'test',
|
||||
to: 'test1',
|
||||
carrier: 'test-carrier',
|
||||
},
|
||||
});
|
||||
});
|
||||
return o;
|
||||
}
|
||||
|
||||
/**
|
||||
* GRPC stub implementation for syncCall stream method (implemented through call)
|
||||
* @param stream
|
||||
*/
|
||||
@GrpcStreamCall('orders.OrderService')
|
||||
async syncCall(stream: any) {
|
||||
stream.on('data', (msg: any) => {
|
||||
stream.write({
|
||||
id: 1,
|
||||
itemTypes: [1],
|
||||
shipmentType: {
|
||||
from: 'test',
|
||||
to: 'test1',
|
||||
carrier: 'test-carrier',
|
||||
},
|
||||
});
|
||||
});
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
syntax = "proto3";
|
||||
package proto_example.common.items;
|
||||
|
||||
enum ItemType {
|
||||
DEFAULT = 0;
|
||||
SUPERIOR = 1;
|
||||
FLAWLESS = 2;
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
syntax = "proto3";
|
||||
package proto_example.common.shipments;
|
||||
|
||||
message ShipmentType {
|
||||
string from = 1;
|
||||
string to = 2;
|
||||
string carrier = 3;
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
syntax = "proto3";
|
||||
package proto_example.orders;
|
||||
|
||||
import public "common/item_types.proto";
|
||||
import public "common/shipment_types.proto";
|
||||
|
||||
message Order {
|
||||
int32 id = 1;
|
||||
repeated common.items.ItemType itemTypes = 2;
|
||||
common.shipments.ShipmentType shipmentType = 3;
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
syntax = "proto3";
|
||||
import "orders/message.proto";
|
||||
package proto_example.orders;
|
||||
|
||||
service OrderService {
|
||||
rpc Find(Order) returns (Order);
|
||||
rpc Sync(stream Order) returns (stream Order);
|
||||
rpc SyncCall(stream Order) returns (stream Order);
|
||||
}
|
||||
@@ -0,0 +1,3 @@
|
||||
syntax = "proto3";
|
||||
package proto_example;
|
||||
import public "orders/service.proto";
|
||||
@@ -1,5 +1,12 @@
|
||||
import { Body, Controller, HttpCode, Post } from '@nestjs/common';
|
||||
import { Client, ClientGrpc, GrpcMethod, Transport } from '@nestjs/microservices';
|
||||
import {
|
||||
Client,
|
||||
ClientGrpc,
|
||||
GrpcMethod,
|
||||
GrpcStreamCall,
|
||||
GrpcStreamMethod,
|
||||
Transport,
|
||||
} from '@nestjs/microservices';
|
||||
import { join } from 'path';
|
||||
import { Observable, of } from 'rxjs';
|
||||
|
||||
@@ -27,4 +34,27 @@ export class GrpcController {
|
||||
result: data.reduce((a, b) => a + b),
|
||||
});
|
||||
}
|
||||
|
||||
@GrpcStreamMethod('Math')
|
||||
async sumStream(messages: Observable<any>): Promise<any> {
|
||||
return new Promise<any>((resolve, reject) => {
|
||||
messages.subscribe(
|
||||
msg => {
|
||||
resolve({
|
||||
result: msg.data.reduce((a, b) => a + b),
|
||||
});
|
||||
},
|
||||
err => {
|
||||
reject(err);
|
||||
},
|
||||
);
|
||||
});
|
||||
}
|
||||
|
||||
@GrpcStreamCall('Math')
|
||||
async sumStreamPass(stream: any) {
|
||||
stream.on('data', (msg: any) => {
|
||||
stream.write({ result: msg.data.reduce((a, b) => a + b) });
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,9 @@ syntax = "proto3";
|
||||
package math;
|
||||
|
||||
service Math {
|
||||
rpc Sum (RequestSum) returns (SumResult) {}
|
||||
rpc Sum (RequestSum) returns (SumResult);
|
||||
rpc SumStream(stream RequestSum) returns(stream SumResult);
|
||||
rpc SumStreamPass(stream RequestSum) returns(stream SumResult);
|
||||
}
|
||||
|
||||
message SumResult {
|
||||
|
||||
@@ -19,6 +19,7 @@ export class RMQBroadcastController {
|
||||
urls: [`amqp://localhost:5672`],
|
||||
queue: 'test_broadcast',
|
||||
queueOptions: { durable: false },
|
||||
socketOptions: { noDelay: true },
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
@@ -22,6 +22,7 @@ export class RMQController {
|
||||
urls: [`amqp://localhost:5672`],
|
||||
queue: 'test',
|
||||
queueOptions: { durable: false },
|
||||
socketOptions: { noDelay: true },
|
||||
},
|
||||
});
|
||||
}
|
||||
|
||||
325
integration/mongoose/package-lock.json
generated
325
integration/mongoose/package-lock.json
generated
@@ -4,22 +4,42 @@
|
||||
"lockfileVersion": 1,
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@nestjs/common": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.0.5.tgz",
|
||||
"integrity": "sha512-CbXtgBW/irevfUZF+rURDLFjhmT0Q6dmzbEYkuMg8bSjPmvgG6VzOBG6PwoPZbd+8PrPc2XLjN2A2Hg9mImp7A==",
|
||||
"@babel/code-frame": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.0.0.tgz",
|
||||
"integrity": "sha512-OfC2uemaknXr87bdLUkWog7nYuliM9Ij5HUcajsVcMCpQrcLmtxRbVFTIqmcSkSeYRBFBRxs2FiUqFJDLdiebA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"axios": "0.18.0",
|
||||
"@babel/highlight": "^7.0.0"
|
||||
}
|
||||
},
|
||||
"@babel/highlight": {
|
||||
"version": "7.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.0.0.tgz",
|
||||
"integrity": "sha512-UFMC4ZeFC48Tpvj7C8UgLvtkaUuovQX+5xNWrsIoMG8o2z+XFKjKaN9iVmS84dPwVN00W4wPmqvYoZF3EGAsfw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chalk": "^2.0.0",
|
||||
"esutils": "^2.0.2",
|
||||
"js-tokens": "^4.0.0"
|
||||
}
|
||||
},
|
||||
"@nestjs/common": {
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.3.0.tgz",
|
||||
"integrity": "sha512-zvMk2tN2l07bzylGM1znTKd0EpivYqox2ER6VXKAIWNDYVfPQg6q0UBsAuaXHTVGGCjbbl1l8wiyWwZvWmAUAg==",
|
||||
"requires": {
|
||||
"axios": "0.19.0",
|
||||
"cli-color": "1.4.0",
|
||||
"uuid": "3.3.2"
|
||||
}
|
||||
},
|
||||
"@nestjs/core": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.0.5.tgz",
|
||||
"integrity": "sha512-diLLr9qb9vGKyvfkt8JFGox21rpgj4YiToCRb3Tbdab0bvssLopznh/f7cdEBNmk5Adtl3IvXjtdVRj+XH7VCw==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.3.0.tgz",
|
||||
"integrity": "sha512-4V8AXcvD+/5PjmKZV6pHhVDsVfIqfYTmx6Sc5SMnpTFlTpbAvC6UizrvC2BN9VAwSNkIFwJHtNNWhachjeykzA==",
|
||||
"requires": {
|
||||
"@nuxtjs/opencollective": "0.2.1",
|
||||
"@nuxtjs/opencollective": "0.2.2",
|
||||
"fast-safe-stringify": "2.0.6",
|
||||
"iterare": "1.1.2",
|
||||
"object-hash": "1.3.1",
|
||||
@@ -28,14 +48,14 @@
|
||||
}
|
||||
},
|
||||
"@nestjs/mongoose": {
|
||||
"version": "6.0.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/mongoose/-/mongoose-6.0.0.tgz",
|
||||
"integrity": "sha512-2iag6pGVAQ5ww92KRsVZmtpkcQ1LgaKyLs3LlUFDRXNfXqTvcHdpK0H4nVR19X9IMm0N57+MbQosvTFJDkbK+A=="
|
||||
"version": "6.1.2",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/mongoose/-/mongoose-6.1.2.tgz",
|
||||
"integrity": "sha512-BkbkguvaPPGbL/41lK6P22DaQodBC9Yv9rUAmNlQVShChtwss7/cGj68AKC3jEoidrx75wCyDO3P8Tp6pggE4w=="
|
||||
},
|
||||
"@nuxtjs/opencollective": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.1.tgz",
|
||||
"integrity": "sha512-pzSib8NKquaTt/ns5Cc2G0BGRVJXaD+p1qfF6q7vNIMvRysorn/VF3y7gAuQpcxfF7wBbGE+dXjhIieWOUsWSw==",
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz",
|
||||
"integrity": "sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw==",
|
||||
"requires": {
|
||||
"chalk": "^2.4.1",
|
||||
"consola": "^2.3.0",
|
||||
@@ -52,9 +72,9 @@
|
||||
}
|
||||
},
|
||||
"@types/mongodb": {
|
||||
"version": "3.1.22",
|
||||
"resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.1.22.tgz",
|
||||
"integrity": "sha512-hvNR0txBlJJAy1eZOeIDshW4dnQaC694COou4eHHaMdIcteCfoCQATD7sYNlXxNxfTc1iIbHUi7A8CAhQe08uA==",
|
||||
"version": "3.1.28",
|
||||
"resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.1.28.tgz",
|
||||
"integrity": "sha512-tG+QqJ/hir2p0069ee28t2O9tlGRJKDq1WFZC2QYMlU47LGdldLL8tepfTq6aFLvP58OpwSoxaJ/qjW93ob1NQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/bson": "*",
|
||||
@@ -62,9 +82,9 @@
|
||||
}
|
||||
},
|
||||
"@types/mongoose": {
|
||||
"version": "5.3.24",
|
||||
"resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.3.24.tgz",
|
||||
"integrity": "sha512-Txa5C/veUJJG2o1sRbl8z1M7GhPjJz6J3JJQV76eYN0PyI9F2NO3gbVUj059ND5nlbvQjRhXuFLaqN6NH8nMNQ==",
|
||||
"version": "5.5.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/mongoose/-/mongoose-5.5.5.tgz",
|
||||
"integrity": "sha512-EqeWg6UkoraYA9W/Gbyer2I/KT6rWwSkPkdsl3dcB81RHadQdpxpV7tyOdPTCCLxDcqzkILrA4Vtt/Zqx3YZaA==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"@types/mongodb": "*",
|
||||
@@ -72,9 +92,9 @@
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "7.10.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.5.tgz",
|
||||
"integrity": "sha512-RYkagUUbxQBss46ElbEa+j4q4X3GR12QwB7a/PM5hmVuVkYoW1jENT1+taspKUv8ibwW8cw+kRFbOaTc/Key3w==",
|
||||
"version": "7.10.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.6.tgz",
|
||||
"integrity": "sha512-d0BOAicT0tEdbdVQlLGOVul1kvg6YvbaADRCThGCz5NJ0e9r00SofcR1x69hmlCyrHuB6jd4cKzL9bMLjPnpAA==",
|
||||
"dev": true
|
||||
},
|
||||
"ansi-regex": {
|
||||
@@ -106,58 +126,20 @@
|
||||
}
|
||||
},
|
||||
"async": {
|
||||
"version": "2.6.1",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-2.6.1.tgz",
|
||||
"integrity": "sha512-fNEiL2+AZt6AlAw/29Cr0UDe4sRAHCpEHh54WMz+Bb7QfNcFw4h3loofyJpLeQs4Yx7yuqu/2dLgM5hKOs6HlQ==",
|
||||
"version": "2.6.2",
|
||||
"resolved": "https://registry.npmjs.org/async/-/async-2.6.2.tgz",
|
||||
"integrity": "sha512-H1qVYh1MYhEEFLsP97cVKqCGo7KfCyTt6uEWqsTBr9SO84oK9Uwbyd/yCW+6rKJLHksBNUVWZDAjfS+Ccx0Bbg==",
|
||||
"requires": {
|
||||
"lodash": "^4.17.10"
|
||||
"lodash": "^4.17.11"
|
||||
}
|
||||
},
|
||||
"axios": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
|
||||
"integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
|
||||
"version": "0.19.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
|
||||
"integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.3.0",
|
||||
"is-buffer": "^1.1.5"
|
||||
}
|
||||
},
|
||||
"babel-code-frame": {
|
||||
"version": "6.26.0",
|
||||
"resolved": "https://registry.npmjs.org/babel-code-frame/-/babel-code-frame-6.26.0.tgz",
|
||||
"integrity": "sha1-Y/1D99weO7fONZR9uP42mj9Yx0s=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"chalk": "^1.1.3",
|
||||
"esutils": "^2.0.2",
|
||||
"js-tokens": "^3.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"ansi-styles": {
|
||||
"version": "2.2.1",
|
||||
"resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz",
|
||||
"integrity": "sha1-tDLdM1i2NM914eRmQ2gkBTPB3b4=",
|
||||
"dev": true
|
||||
},
|
||||
"chalk": {
|
||||
"version": "1.1.3",
|
||||
"resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz",
|
||||
"integrity": "sha1-qBFcVeSnAv5NFQq9OHKCKn4J/Jg=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-styles": "^2.2.1",
|
||||
"escape-string-regexp": "^1.0.2",
|
||||
"has-ansi": "^2.0.0",
|
||||
"strip-ansi": "^3.0.0",
|
||||
"supports-color": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz",
|
||||
"integrity": "sha1-U10EXOa2Nj+kARcIRimZXp3zJMc=",
|
||||
"dev": true
|
||||
}
|
||||
"follow-redirects": "1.5.10",
|
||||
"is-buffer": "^2.0.2"
|
||||
}
|
||||
},
|
||||
"balanced-match": {
|
||||
@@ -187,9 +169,9 @@
|
||||
"integrity": "sha512-jCGVYLoYMHDkOsbwJZBCqwMHyH4c+wzgI9hG7Z6SZJRXWr+x58pdIbm2i9a/jFGCkRJqRUr8eoI7lDWa0hTkxg=="
|
||||
},
|
||||
"buffer-from": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.0.0.tgz",
|
||||
"integrity": "sha512-83apNb8KK0Se60UE1+4Ukbe3HbfELJ6UlI4ldtOGs7So4KD26orJM8hIY9lxdzP+UpItH1Yh/Y8GUvNFWFFRxA==",
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
||||
"integrity": "sha512-MQcXEUbCKtEo7bhqEs6560Hyd4XaovZlO/k9V3hjVUF/zwW7KBVdSK4gIt/bzwS9MbR5qob+F5jusZsb0YQK2A==",
|
||||
"dev": true
|
||||
},
|
||||
"builtin-modules": {
|
||||
@@ -235,9 +217,9 @@
|
||||
"integrity": "sha1-p9BVi9icQveV3UIyj3QIMcpTvCU="
|
||||
},
|
||||
"commander": {
|
||||
"version": "2.19.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.19.0.tgz",
|
||||
"integrity": "sha512-6tvAOO+D6OENvRAh524Dh9jcfKTYDQAqvqezbCW82xj5X0pSrcpxtvRKHLG0yBY6SD7PSDrJaj+0AiOcKVd1Xg==",
|
||||
"version": "2.20.0",
|
||||
"resolved": "https://registry.npmjs.org/commander/-/commander-2.20.0.tgz",
|
||||
"integrity": "sha512-7j2y+40w61zy6YC2iRNpUe/NwhNyoXrYpHMrSunaMG64nRnaf96zO/KMQR4OyN/UnE5KLyEBnKHd4aG3rskjpQ==",
|
||||
"dev": true
|
||||
},
|
||||
"concat-map": {
|
||||
@@ -247,9 +229,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"consola": {
|
||||
"version": "2.5.8",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.5.8.tgz",
|
||||
"integrity": "sha512-fYv1M0rNJw4h0CZUx8PX02Px7xQhA+vNHpV8DBCGMoozp2Io/vrSXhhEothaRnSt7VMR0rj2pt9KKLXa5amrCw=="
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.7.1.tgz",
|
||||
"integrity": "sha512-u7JYs+HnMbZPD2cEuS1XHsLeqtazA0kd5lAk8r8DnnGdgNhOdb7DSubJ+QLdQkbtpmmxgp7gs8Ug44sCyY4FCQ=="
|
||||
},
|
||||
"d": {
|
||||
"version": "1.0.0",
|
||||
@@ -260,11 +242,18 @@
|
||||
}
|
||||
},
|
||||
"debug": {
|
||||
"version": "3.2.6",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
||||
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
"ms": "2.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"diff": {
|
||||
@@ -274,9 +263,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"es5-ext": {
|
||||
"version": "0.10.49",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz",
|
||||
"integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==",
|
||||
"version": "0.10.50",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz",
|
||||
"integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==",
|
||||
"requires": {
|
||||
"es6-iterator": "~2.0.3",
|
||||
"es6-symbol": "~3.1.1",
|
||||
@@ -345,11 +334,11 @@
|
||||
"integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg=="
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz",
|
||||
"integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==",
|
||||
"version": "1.5.10",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
|
||||
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
|
||||
"requires": {
|
||||
"debug": "^3.2.6"
|
||||
"debug": "=3.1.0"
|
||||
}
|
||||
},
|
||||
"fs.realpath": {
|
||||
@@ -359,9 +348,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"glob": {
|
||||
"version": "7.1.3",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.3.tgz",
|
||||
"integrity": "sha512-vcfuiIxogLV4DlGBHIUOwI0IbrJ8HWPc4MU7HzviGeNho/UJDfi6B5p3sHeWIQ0KGIU0Jpxi5ZHxemQfLkkAwQ==",
|
||||
"version": "7.1.4",
|
||||
"resolved": "https://registry.npmjs.org/glob/-/glob-7.1.4.tgz",
|
||||
"integrity": "sha512-hkLPepehmnKk41pUGm3sYxoFs/umurYfYJCerbXEyFIWcAzvpipAgVkBqqT9RBKMGjnq6kMuyYwha6csxbiM1A==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"fs.realpath": "^1.0.0",
|
||||
@@ -372,15 +361,6 @@
|
||||
"path-is-absolute": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"has-ansi": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz",
|
||||
"integrity": "sha1-NPUEnOHs3ysGSa8+8k5F7TVBbZE=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"has-flag": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz",
|
||||
@@ -403,9 +383,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"is-buffer": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
|
||||
"integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw=="
|
||||
},
|
||||
"is-promise": {
|
||||
"version": "2.1.0",
|
||||
@@ -418,15 +398,15 @@
|
||||
"integrity": "sha512-25rVYmj/dDvTR6zOa9jY1Ihd6USLa0J508Ub2iy7Aga+xu9JMbjDds2Uh03ReDGbva/YN3s3Ybi+Do0nOX6wAg=="
|
||||
},
|
||||
"js-tokens": {
|
||||
"version": "3.0.2",
|
||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-3.0.2.tgz",
|
||||
"integrity": "sha1-mGbfOVECEw449/mWvOtlRDIJwls=",
|
||||
"version": "4.0.0",
|
||||
"resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz",
|
||||
"integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==",
|
||||
"dev": true
|
||||
},
|
||||
"js-yaml": {
|
||||
"version": "3.13.0",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.0.tgz",
|
||||
"integrity": "sha512-pZZoSxcCYco+DIKBTimr67J6Hy+EYGZDY/HCWC+iAEA9h1ByhMXAIVUXMcMFpOCxQ/xjXmPI2MkDL5HRm5eFrQ==",
|
||||
"version": "3.13.1",
|
||||
"resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-3.13.1.tgz",
|
||||
"integrity": "sha512-YfbcO7jXDdyj0DGxYVSlSeQNHbD7XPWvrVWeVUujrQEoZzWJIRrCPoyk6kL6IAjAG2IolMK4T0hNUe0HOUs5Jw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"argparse": "^1.0.7",
|
||||
@@ -503,41 +483,42 @@
|
||||
}
|
||||
},
|
||||
"mongodb": {
|
||||
"version": "3.1.13",
|
||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.1.13.tgz",
|
||||
"integrity": "sha512-sz2dhvBZQWf3LRNDhbd30KHVzdjZx9IKC0L+kSZ/gzYquCF5zPOgGqRz6sSCqYZtKP2ekB4nfLxhGtzGHnIKxA==",
|
||||
"version": "3.2.6",
|
||||
"resolved": "https://registry.npmjs.org/mongodb/-/mongodb-3.2.6.tgz",
|
||||
"integrity": "sha512-qnHc4tjEkHKemuzBq9R7ycYnhFE0Dlpt6+n6suoZp2DcDdqviQ+teloJU24fsOw/PLmr75yGk4mRx/YabjDQEQ==",
|
||||
"requires": {
|
||||
"mongodb-core": "3.1.11",
|
||||
"mongodb-core": "3.2.6",
|
||||
"safe-buffer": "^5.1.2"
|
||||
}
|
||||
},
|
||||
"mongodb-core": {
|
||||
"version": "3.1.11",
|
||||
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.1.11.tgz",
|
||||
"integrity": "sha512-rD2US2s5qk/ckbiiGFHeu+yKYDXdJ1G87F6CG3YdaZpzdOm5zpoAZd/EKbPmFO6cQZ+XVXBXBJ660sSI0gc6qg==",
|
||||
"version": "3.2.6",
|
||||
"resolved": "https://registry.npmjs.org/mongodb-core/-/mongodb-core-3.2.6.tgz",
|
||||
"integrity": "sha512-i+XRVjur9D0ywGF7cFebOUnALnbvMHajdNhhl3TQuopW6QDE655G8CpPeERbqSqfa3rOKEUo08lENDIiBIuAvQ==",
|
||||
"requires": {
|
||||
"bson": "^1.1.0",
|
||||
"bson": "^1.1.1",
|
||||
"require_optional": "^1.0.1",
|
||||
"safe-buffer": "^5.1.2",
|
||||
"saslprep": "^1.0.0"
|
||||
}
|
||||
},
|
||||
"mongoose": {
|
||||
"version": "5.4.22",
|
||||
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.4.22.tgz",
|
||||
"integrity": "sha512-rbtmFmXe5YJfBrVfOpSW2xeSAKFtnJ5RLQjl4ULzT1icmY/SUHtJ5b+mW4SMCEk7whm/w+2oHO9qMBr8UI1xIw==",
|
||||
"version": "5.5.12",
|
||||
"resolved": "https://registry.npmjs.org/mongoose/-/mongoose-5.5.12.tgz",
|
||||
"integrity": "sha512-G6KfSHfxfoBw7zpRRdbG1GzLZSkY71nY3CMHMMfg5o+xVAGc3Q78Qu+kA3P+Ka15KHLu6LNyvAc1Zvtv1JhGfw==",
|
||||
"requires": {
|
||||
"async": "2.6.1",
|
||||
"bson": "~1.1.0",
|
||||
"async": "2.6.2",
|
||||
"bson": "~1.1.1",
|
||||
"kareem": "2.3.0",
|
||||
"mongodb": "3.1.13",
|
||||
"mongodb-core": "3.1.11",
|
||||
"mongodb": "3.2.6",
|
||||
"mongodb-core": "3.2.6",
|
||||
"mongoose-legacy-pluralize": "1.0.2",
|
||||
"mpath": "0.5.1",
|
||||
"mpath": "0.6.0",
|
||||
"mquery": "3.2.0",
|
||||
"ms": "2.1.1",
|
||||
"regexp-clone": "0.0.1",
|
||||
"safe-buffer": "5.1.2",
|
||||
"sift": "7.0.1",
|
||||
"sliced": "1.0.1"
|
||||
}
|
||||
},
|
||||
@@ -547,9 +528,9 @@
|
||||
"integrity": "sha512-Yo/7qQU4/EyIS8YDFSeenIvXxZN+ld7YdV9LqFVQJzTLye8unujAWPZ4NWKfFA+RNjh+wvTWKY9Z3E5XM6ZZiQ=="
|
||||
},
|
||||
"mpath": {
|
||||
"version": "0.5.1",
|
||||
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.5.1.tgz",
|
||||
"integrity": "sha512-H8OVQ+QEz82sch4wbODFOz+3YQ61FYz/z3eJ5pIdbMEaUzDqA268Wd+Vt4Paw9TJfvDgVKaayC0gBzMIw2jhsg=="
|
||||
"version": "0.6.0",
|
||||
"resolved": "https://registry.npmjs.org/mpath/-/mpath-0.6.0.tgz",
|
||||
"integrity": "sha512-i75qh79MJ5Xo/sbhxrDrPSEG0H/mr1kcZXJ8dH6URU5jD/knFxCVqVC/gVSW7GIXL/9hHWlT9haLbCXWOll3qw=="
|
||||
},
|
||||
"mquery": {
|
||||
"version": "3.2.0",
|
||||
@@ -589,9 +570,9 @@
|
||||
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz",
|
||||
"integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA=="
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
|
||||
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
|
||||
},
|
||||
"object-hash": {
|
||||
"version": "1.3.1",
|
||||
@@ -644,9 +625,9 @@
|
||||
}
|
||||
},
|
||||
"resolve": {
|
||||
"version": "1.10.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.10.0.tgz",
|
||||
"integrity": "sha512-3sUr9aq5OfSg2S9pNtPA9hL1FVEAjvfOC4leW0SNf/mpnaakz2a9femSd6LqAww2RaFctwyf1lCqnTHuF1rxDg==",
|
||||
"version": "1.11.0",
|
||||
"resolved": "https://registry.npmjs.org/resolve/-/resolve-1.11.0.tgz",
|
||||
"integrity": "sha512-WL2pBDjqT6pGUNSUzMw00o4T7If+z4H2x3Gz893WoUQ5KW8Vr9txp00ykiP16VBaZF5+j/OcXJHZ9+PCvdiDKw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"path-parse": "^1.0.6"
|
||||
@@ -658,9 +639,9 @@
|
||||
"integrity": "sha1-lICrIOlP+h2egKgEx+oUdhGWa1c="
|
||||
},
|
||||
"rxjs": {
|
||||
"version": "6.4.0",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
|
||||
"integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
|
||||
"integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
|
||||
"requires": {
|
||||
"tslib": "^1.9.0"
|
||||
}
|
||||
@@ -671,9 +652,9 @@
|
||||
"integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g=="
|
||||
},
|
||||
"saslprep": {
|
||||
"version": "1.0.2",
|
||||
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.2.tgz",
|
||||
"integrity": "sha512-4cDsYuAjXssUSjxHKRe4DTZC0agDwsCqcMqtJAQPzC74nJ7LfAJflAtC1Zed5hMzEQKj82d3tuzqdGNRsLJ4Gw==",
|
||||
"version": "1.0.3",
|
||||
"resolved": "https://registry.npmjs.org/saslprep/-/saslprep-1.0.3.tgz",
|
||||
"integrity": "sha512-/MY/PEMbk2SuY5sScONwhUDsV2p77Znkb/q3nSVstq/yQzYJOH/Azh29p9oJLsl3LnQwSvZDKagDGBsBwSooag==",
|
||||
"optional": true,
|
||||
"requires": {
|
||||
"sparse-bitfield": "^3.0.3"
|
||||
@@ -684,6 +665,11 @@
|
||||
"resolved": "https://registry.npmjs.org/semver/-/semver-5.5.0.tgz",
|
||||
"integrity": "sha512-4SJ3dm0WAwWy/NVeioZh5AntkdJoWKxHxcmyP622fOkgHa4z3R0TdBJICINyaSDE6uNwVc8gZr+ZinwZAH4xIA=="
|
||||
},
|
||||
"sift": {
|
||||
"version": "7.0.1",
|
||||
"resolved": "https://registry.npmjs.org/sift/-/sift-7.0.1.tgz",
|
||||
"integrity": "sha512-oqD7PMJ+uO6jV9EQCl0LrRw1OwsiPsiFQR5AR30heR+4Dl7jBBbDLnNvWiak20tzZlSE1H7RB30SX/1j/YYT7g=="
|
||||
},
|
||||
"sliced": {
|
||||
"version": "1.0.1",
|
||||
"resolved": "https://registry.npmjs.org/sliced/-/sliced-1.0.1.tgz",
|
||||
@@ -696,9 +682,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"source-map-support": {
|
||||
"version": "0.5.11",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz",
|
||||
"integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==",
|
||||
"version": "0.5.12",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
|
||||
"integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"buffer-from": "^1.0.0",
|
||||
@@ -720,15 +706,6 @@
|
||||
"integrity": "sha1-BOaSb2YolTVPPdAVIDYzuFcpfiw=",
|
||||
"dev": true
|
||||
},
|
||||
"strip-ansi": {
|
||||
"version": "3.0.1",
|
||||
"resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz",
|
||||
"integrity": "sha1-ajhfuIU9lS1f8F0Oiq+UJ43GPc8=",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ansi-regex": "^2.0.0"
|
||||
}
|
||||
},
|
||||
"supports-color": {
|
||||
"version": "5.4.0",
|
||||
"resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.4.0.tgz",
|
||||
@@ -747,16 +724,24 @@
|
||||
}
|
||||
},
|
||||
"ts-node": {
|
||||
"version": "8.0.3",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz",
|
||||
"integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==",
|
||||
"version": "8.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.2.0.tgz",
|
||||
"integrity": "sha512-m8XQwUurkbYqXrKqr3WHCW310utRNvV5OnRVeISeea7LoCWVcdfeB/Ntl8JYWFh+WRoUAdBgESrzKochQt7sMw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"arg": "^4.1.0",
|
||||
"diff": "^3.1.0",
|
||||
"diff": "^4.0.1",
|
||||
"make-error": "^1.1.1",
|
||||
"source-map-support": "^0.5.6",
|
||||
"yn": "^3.0.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"diff": {
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
|
||||
"integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
},
|
||||
"tslib": {
|
||||
@@ -765,18 +750,18 @@
|
||||
"integrity": "sha512-avfPS28HmGLLc2o4elcc2EIq2FcH++Yo5YxpBZi9Yw93BCTGFthI4HPE4Rpep6vSYQaK8e69PelM44tPj+RaQg=="
|
||||
},
|
||||
"tslint": {
|
||||
"version": "5.15.0",
|
||||
"resolved": "https://registry.npmjs.org/tslint/-/tslint-5.15.0.tgz",
|
||||
"integrity": "sha512-6bIEujKR21/3nyeoX2uBnE8s+tMXCQXhqMmaIPJpHmXJoBJPTLcI7/VHRtUwMhnLVdwLqqY3zmd8Dxqa5CVdJA==",
|
||||
"version": "5.17.0",
|
||||
"resolved": "https://registry.npmjs.org/tslint/-/tslint-5.17.0.tgz",
|
||||
"integrity": "sha512-pflx87WfVoYepTet3xLfDOLDm9Jqi61UXIKePOuca0qoAZyrGWonDG9VTbji58Fy+8gciUn8Bt7y69+KEVjc/w==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"babel-code-frame": "^6.22.0",
|
||||
"@babel/code-frame": "^7.0.0",
|
||||
"builtin-modules": "^1.1.1",
|
||||
"chalk": "^2.3.0",
|
||||
"commander": "^2.12.1",
|
||||
"diff": "^3.2.0",
|
||||
"glob": "^7.1.1",
|
||||
"js-yaml": "^3.13.0",
|
||||
"js-yaml": "^3.13.1",
|
||||
"minimatch": "^3.0.4",
|
||||
"mkdirp": "^0.5.1",
|
||||
"resolve": "^1.3.2",
|
||||
@@ -795,9 +780,9 @@
|
||||
}
|
||||
},
|
||||
"typescript": {
|
||||
"version": "3.4.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.2.tgz",
|
||||
"integrity": "sha512-Og2Vn6Mk7JAuWA1hQdDQN/Ekm/SchX80VzLhjKN9ETYrIepBFAd8PkOdOTK2nKt0FCkmMZKBJvQ1dV1gIxPu/A=="
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
|
||||
"integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw=="
|
||||
},
|
||||
"uuid": {
|
||||
"version": "3.3.2",
|
||||
@@ -811,9 +796,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"yn": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz",
|
||||
"integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==",
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz",
|
||||
"integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -9,18 +9,18 @@
|
||||
"start:prod": "node dist/main.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "6.0.5",
|
||||
"@nestjs/core": "6.0.5",
|
||||
"@nestjs/mongoose": "6.0.0",
|
||||
"mongoose": "5.4.22",
|
||||
"@nestjs/common": "6.3.0",
|
||||
"@nestjs/core": "6.3.0",
|
||||
"@nestjs/mongoose": "6.1.2",
|
||||
"mongoose": "5.5.12",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rxjs": "6.4.0",
|
||||
"typescript": "3.4.2"
|
||||
"rxjs": "6.5.2",
|
||||
"typescript": "3.5.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/mongoose": "5.3.24",
|
||||
"@types/node": "7.10.5",
|
||||
"ts-node": "8.0.3",
|
||||
"tslint": "5.15.0"
|
||||
"@types/mongoose": "5.5.5",
|
||||
"@types/node": "7.10.6",
|
||||
"ts-node": "8.2.0",
|
||||
"tslint": "5.17.0"
|
||||
}
|
||||
}
|
||||
|
||||
223
integration/scopes/package-lock.json
generated
223
integration/scopes/package-lock.json
generated
@@ -5,21 +5,21 @@
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@nestjs/common": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.0.5.tgz",
|
||||
"integrity": "sha512-CbXtgBW/irevfUZF+rURDLFjhmT0Q6dmzbEYkuMg8bSjPmvgG6VzOBG6PwoPZbd+8PrPc2XLjN2A2Hg9mImp7A==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.3.0.tgz",
|
||||
"integrity": "sha512-zvMk2tN2l07bzylGM1znTKd0EpivYqox2ER6VXKAIWNDYVfPQg6q0UBsAuaXHTVGGCjbbl1l8wiyWwZvWmAUAg==",
|
||||
"requires": {
|
||||
"axios": "0.18.0",
|
||||
"axios": "0.19.0",
|
||||
"cli-color": "1.4.0",
|
||||
"uuid": "3.3.2"
|
||||
}
|
||||
},
|
||||
"@nestjs/core": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.0.5.tgz",
|
||||
"integrity": "sha512-diLLr9qb9vGKyvfkt8JFGox21rpgj4YiToCRb3Tbdab0bvssLopznh/f7cdEBNmk5Adtl3IvXjtdVRj+XH7VCw==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.3.0.tgz",
|
||||
"integrity": "sha512-4V8AXcvD+/5PjmKZV6pHhVDsVfIqfYTmx6Sc5SMnpTFlTpbAvC6UizrvC2BN9VAwSNkIFwJHtNNWhachjeykzA==",
|
||||
"requires": {
|
||||
"@nuxtjs/opencollective": "0.2.1",
|
||||
"@nuxtjs/opencollective": "0.2.2",
|
||||
"fast-safe-stringify": "2.0.6",
|
||||
"iterare": "1.1.2",
|
||||
"object-hash": "1.3.1",
|
||||
@@ -28,9 +28,9 @@
|
||||
}
|
||||
},
|
||||
"@nestjs/microservices": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-6.0.5.tgz",
|
||||
"integrity": "sha512-lUyxzYQ3E5U7aQaY4bKVnGxizTl2cE2Rrey0ylmeVE4ae9Y7/z/7mdsfB4DVnuMVuRpyClUJ+zrQ4tJAIvL/nQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-6.3.0.tgz",
|
||||
"integrity": "sha512-JgSIJ+5IIQQWuK5Q7lsugxVH1ntToLBuTclH23jqTb4QnIcVAQFx0/rhyBgnKPIHZSPe1Z9553AFka86u6DP7g==",
|
||||
"requires": {
|
||||
"iterare": "1.1.2",
|
||||
"json-socket": "0.3.0",
|
||||
@@ -38,25 +38,25 @@
|
||||
}
|
||||
},
|
||||
"@nestjs/testing": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-6.0.5.tgz",
|
||||
"integrity": "sha512-LrPBckONn/ZalBC8GU5LxvgIS8DJNrdwZE4gMJz0ugodwl0c1IL3e2gIukBkUJtHYPtzN12nYevnaGYT/V1aDQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-6.3.0.tgz",
|
||||
"integrity": "sha512-M8Vbi+6zJp3OkKf3OdBM70DaK2SswzygQ3zuuu/nc/TCFiX+9setLsQwXf/qFeO/ss8ko5UB2HmP6R8HelAdiA==",
|
||||
"requires": {
|
||||
"optional": "0.1.4"
|
||||
}
|
||||
},
|
||||
"@nestjs/websockets": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-6.0.5.tgz",
|
||||
"integrity": "sha512-cA4Z6dM/Q8WqzgDyC6HiCdFvcDVAv7TyGkzthuuCn9xHDeLjtyzCL1koogkZ0FmLWhNmCskc/yJb2IjApGtzvQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-6.3.0.tgz",
|
||||
"integrity": "sha512-02UC5zYBW57pApO6cWpHZuSw1Z0kqQd5ocSr5aKaSVGITQjbkhlWovMCwibAAzqnVegBIyGOj9FDxEtcPrdv7w==",
|
||||
"requires": {
|
||||
"iterare": "1.1.2"
|
||||
}
|
||||
},
|
||||
"@nuxtjs/opencollective": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.1.tgz",
|
||||
"integrity": "sha512-pzSib8NKquaTt/ns5Cc2G0BGRVJXaD+p1qfF6q7vNIMvRysorn/VF3y7gAuQpcxfF7wBbGE+dXjhIieWOUsWSw==",
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz",
|
||||
"integrity": "sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw==",
|
||||
"requires": {
|
||||
"chalk": "^2.4.1",
|
||||
"consola": "^2.3.0",
|
||||
@@ -64,9 +64,9 @@
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "7.10.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.5.tgz",
|
||||
"integrity": "sha512-RYkagUUbxQBss46ElbEa+j4q4X3GR12QwB7a/PM5hmVuVkYoW1jENT1+taspKUv8ibwW8cw+kRFbOaTc/Key3w==",
|
||||
"version": "7.10.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.6.tgz",
|
||||
"integrity": "sha512-d0BOAicT0tEdbdVQlLGOVul1kvg6YvbaADRCThGCz5NJ0e9r00SofcR1x69hmlCyrHuB6jd4cKzL9bMLjPnpAA==",
|
||||
"dev": true
|
||||
},
|
||||
"abstract-logging": {
|
||||
@@ -141,19 +141,14 @@
|
||||
}
|
||||
},
|
||||
"axios": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
|
||||
"integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
|
||||
"version": "0.19.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
|
||||
"integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.3.0",
|
||||
"is-buffer": "^1.1.5"
|
||||
"follow-redirects": "1.5.10",
|
||||
"is-buffer": "^2.0.2"
|
||||
}
|
||||
},
|
||||
"bourne": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/bourne/-/bourne-1.1.2.tgz",
|
||||
"integrity": "sha512-b2dgVkTZhkQirNMohgC00rWfpVqEi9y5tKM1k3JvoNx05ODtfQoPPd4js9CYFQoY0IM8LAmnJulEuWv74zjUOg=="
|
||||
},
|
||||
"buffer-from": {
|
||||
"version": "1.1.1",
|
||||
"resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.1.tgz",
|
||||
@@ -171,9 +166,9 @@
|
||||
}
|
||||
},
|
||||
"class-transformer": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.0.tgz",
|
||||
"integrity": "sha512-6N/5WkEmLZCKxyC2CAPYQIJt3pDZzDFag7AExpyWRm7CjaS/U62VDRU+Z2AUrQaNpnuiXRlli0so4PJUqGSVZQ=="
|
||||
"version": "0.2.3",
|
||||
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.3.tgz",
|
||||
"integrity": "sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ=="
|
||||
},
|
||||
"class-validator": {
|
||||
"version": "0.9.1",
|
||||
@@ -226,9 +221,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"consola": {
|
||||
"version": "2.5.8",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.5.8.tgz",
|
||||
"integrity": "sha512-fYv1M0rNJw4h0CZUx8PX02Px7xQhA+vNHpV8DBCGMoozp2Io/vrSXhhEothaRnSt7VMR0rj2pt9KKLXa5amrCw=="
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.7.1.tgz",
|
||||
"integrity": "sha512-u7JYs+HnMbZPD2cEuS1XHsLeqtazA0kd5lAk8r8DnnGdgNhOdb7DSubJ+QLdQkbtpmmxgp7gs8Ug44sCyY4FCQ=="
|
||||
},
|
||||
"cookiejar": {
|
||||
"version": "2.1.2",
|
||||
@@ -254,7 +249,6 @@
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
@@ -271,15 +265,15 @@
|
||||
"dev": true
|
||||
},
|
||||
"diff": {
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
|
||||
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
|
||||
"integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
|
||||
"dev": true
|
||||
},
|
||||
"es5-ext": {
|
||||
"version": "0.10.49",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz",
|
||||
"integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==",
|
||||
"version": "0.10.50",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz",
|
||||
"integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==",
|
||||
"requires": {
|
||||
"es6-iterator": "~2.0.3",
|
||||
"es6-symbol": "~3.1.1",
|
||||
@@ -352,9 +346,9 @@
|
||||
"integrity": "sha1-1RQsDK7msRifh9OnYREGT4bIu/I="
|
||||
},
|
||||
"fast-json-stringify": {
|
||||
"version": "1.14.0",
|
||||
"resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-1.14.0.tgz",
|
||||
"integrity": "sha512-3VSblXsVxIE46E/YzRYHapyIeM3/igeA/kyzdL5xfAIYNnCLd8Oy+scrURnqZIRXMmtx0hfyp+okN5+r4W+GMQ==",
|
||||
"version": "1.15.2",
|
||||
"resolved": "https://registry.npmjs.org/fast-json-stringify/-/fast-json-stringify-1.15.2.tgz",
|
||||
"integrity": "sha512-iKo79rW7J2LRexme54j33BZBmFmGtqwYL6fmAxnU5VOZEJCUFir5g5iCmt5HXtxUXvI2hnmpGku+cduJpMCvwQ==",
|
||||
"requires": {
|
||||
"ajv": "^6.8.1",
|
||||
"deepmerge": "^3.0.0"
|
||||
@@ -371,23 +365,23 @@
|
||||
"integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg=="
|
||||
},
|
||||
"fastify": {
|
||||
"version": "2.2.0",
|
||||
"resolved": "https://registry.npmjs.org/fastify/-/fastify-2.2.0.tgz",
|
||||
"integrity": "sha512-U6W101N+8Hyz2uiN3XqdSdTiaWYiJ0lCJmC3tO42PNttjCZQp8EPIhZ0QkVQWLrrP0ijjgomwaYrj9eMzqWyDw==",
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/fastify/-/fastify-2.4.1.tgz",
|
||||
"integrity": "sha512-AVzNO8/gg6og8T/s7M3UUQjvI4AIJNm8CSHm+kf3S0mGoJfWpfRuTD1pRTQ5tM+0pJpybyT5nDVTy97/oTD1+w==",
|
||||
"requires": {
|
||||
"abstract-logging": "^1.0.0",
|
||||
"ajv": "^6.9.2",
|
||||
"avvio": "^6.1.1",
|
||||
"bourne": "^1.1.2",
|
||||
"fast-json-stringify": "^1.11.2",
|
||||
"fast-json-stringify": "^1.15.0",
|
||||
"find-my-way": "^2.0.0",
|
||||
"flatstr": "^1.0.9",
|
||||
"flatstr": "^1.0.12",
|
||||
"light-my-request": "^3.2.0",
|
||||
"middie": "^4.0.1",
|
||||
"pino": "^5.11.1",
|
||||
"proxy-addr": "^2.0.4",
|
||||
"readable-stream": "^3.1.1",
|
||||
"rfdc": "^1.1.2",
|
||||
"secure-json-parse": "^1.0.0",
|
||||
"tiny-lru": "^6.0.1"
|
||||
}
|
||||
},
|
||||
@@ -410,31 +404,16 @@
|
||||
}
|
||||
},
|
||||
"flatstr": {
|
||||
"version": "1.0.9",
|
||||
"resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.9.tgz",
|
||||
"integrity": "sha512-qFlJnOBWDfIaunF54/lBqNKmXOI0HqNhu+mHkLmbaBXlS71PUd9OjFOdyevHt/aHoHB1+eW7eKHgRKOG5aHSpw=="
|
||||
"version": "1.0.12",
|
||||
"resolved": "https://registry.npmjs.org/flatstr/-/flatstr-1.0.12.tgz",
|
||||
"integrity": "sha512-4zPxDyhCyiN2wIAtSLI6gc82/EjqZc1onI4Mz/l0pWrAlsSfYH/2ZIcU+e3oA2wDwbzIWNKwa23F8rh6+DRWkw=="
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz",
|
||||
"integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==",
|
||||
"version": "1.5.10",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
|
||||
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
|
||||
"requires": {
|
||||
"debug": "^3.2.6"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.2.6",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
||||
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
||||
}
|
||||
"debug": "=3.1.0"
|
||||
}
|
||||
},
|
||||
"form-data": {
|
||||
@@ -475,14 +454,14 @@
|
||||
"integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4="
|
||||
},
|
||||
"ipaddr.js": {
|
||||
"version": "1.8.0",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.8.0.tgz",
|
||||
"integrity": "sha1-6qM9bd16zo9/b+DJygRA5wZzix4="
|
||||
"version": "1.9.0",
|
||||
"resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz",
|
||||
"integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA=="
|
||||
},
|
||||
"is-buffer": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
|
||||
"integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw=="
|
||||
},
|
||||
"is-promise": {
|
||||
"version": "2.1.0",
|
||||
@@ -581,8 +560,7 @@
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=",
|
||||
"dev": true
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
},
|
||||
"next-tick": {
|
||||
"version": "1.0.0",
|
||||
@@ -590,9 +568,9 @@
|
||||
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz",
|
||||
"integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA=="
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
|
||||
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
|
||||
},
|
||||
"object-hash": {
|
||||
"version": "1.3.1",
|
||||
@@ -610,9 +588,9 @@
|
||||
"integrity": "sha512-ZOtfhPttCrqp2M1PBBH4X13XlvnfhIwD7yCLx+GoGoXRPQyxGOTdQMpIzPSPKXAJT/JQrdfFrgdJOyAzvgpQ9A=="
|
||||
},
|
||||
"pino": {
|
||||
"version": "5.12.2",
|
||||
"resolved": "https://registry.npmjs.org/pino/-/pino-5.12.2.tgz",
|
||||
"integrity": "sha512-EunVRDkw/eQzgAudJiZuqzEQ20hDezixLRLrdxUMBzavvt5ot3vep7K8swRvXSgj2bKtbOmoHnrRMtYzRjfITQ==",
|
||||
"version": "5.12.5",
|
||||
"resolved": "https://registry.npmjs.org/pino/-/pino-5.12.5.tgz",
|
||||
"integrity": "sha512-Y493vt9ci7Jez3WZ/aUArijTQZXbHgWvDB3TMZlTu731p2kan/qyJk5k46aveEmYFnTlEommc+PSncUcuiMrBg==",
|
||||
"requires": {
|
||||
"fast-redact": "^1.4.4",
|
||||
"fast-safe-stringify": "^2.0.6",
|
||||
@@ -623,9 +601,9 @@
|
||||
}
|
||||
},
|
||||
"pino-std-serializers": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.3.0.tgz",
|
||||
"integrity": "sha512-klfGoOsP6sJH7ON796G4xoUSx2fkpFgKHO4YVVO2zmz31jR+etzc/QzGJILaOIiCD6HTCFgkPx+XN8nk+ruqPw=="
|
||||
"version": "2.4.1",
|
||||
"resolved": "https://registry.npmjs.org/pino-std-serializers/-/pino-std-serializers-2.4.1.tgz",
|
||||
"integrity": "sha512-v/JglhO0aFcvkMV9VUxhgyuJo8K1si857Ww86Tx8H2cjC/kp0ndzzcF6Vbxr4RgKFYJdHfLVpEuD55znMZuxnw=="
|
||||
},
|
||||
"process-nextick-args": {
|
||||
"version": "2.0.0",
|
||||
@@ -634,12 +612,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"proxy-addr": {
|
||||
"version": "2.0.4",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.4.tgz",
|
||||
"integrity": "sha512-5erio2h9jp5CHGwcybmxmVqHmnCBZeewlfJ0pex+UW7Qny7OOZXTtH56TGNyBizkgiOwhJtMKrVzDTeKcySZwA==",
|
||||
"version": "2.0.5",
|
||||
"resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz",
|
||||
"integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==",
|
||||
"requires": {
|
||||
"forwarded": "~0.1.2",
|
||||
"ipaddr.js": "1.8.0"
|
||||
"ipaddr.js": "1.9.0"
|
||||
}
|
||||
},
|
||||
"punycode": {
|
||||
@@ -684,14 +662,14 @@
|
||||
"integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw=="
|
||||
},
|
||||
"rfdc": {
|
||||
"version": "1.1.2",
|
||||
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.2.tgz",
|
||||
"integrity": "sha512-92ktAgvZhBzYTIK0Mja9uen5q5J3NRVMoDkJL2VMwq6SXjVCgqvQeVP2XAaUY6HT+XpQYeLSjb3UoitBryKmdA=="
|
||||
"version": "1.1.4",
|
||||
"resolved": "https://registry.npmjs.org/rfdc/-/rfdc-1.1.4.tgz",
|
||||
"integrity": "sha512-5C9HXdzK8EAqN7JDif30jqsBzavB7wLpaubisuQIGHWf2gUXSpzy6ArX/+Da8RjFpagWsCn+pIgxTMAmKw9Zug=="
|
||||
},
|
||||
"rxjs": {
|
||||
"version": "6.4.0",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
|
||||
"integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
|
||||
"integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
|
||||
"requires": {
|
||||
"tslib": "^1.9.0"
|
||||
}
|
||||
@@ -709,15 +687,20 @@
|
||||
"ret": "~0.2.0"
|
||||
}
|
||||
},
|
||||
"secure-json-parse": {
|
||||
"version": "1.0.0",
|
||||
"resolved": "https://registry.npmjs.org/secure-json-parse/-/secure-json-parse-1.0.0.tgz",
|
||||
"integrity": "sha512-kMg4jXttRQzVyLebIDc+MRxCueJ/zsmHpCn59BRd0mZUCd+V02wNd7/Pds8Nyhv7jfLHo1KkUOzdIF7cRMU4LQ=="
|
||||
},
|
||||
"semver-store": {
|
||||
"version": "0.3.0",
|
||||
"resolved": "https://registry.npmjs.org/semver-store/-/semver-store-0.3.0.tgz",
|
||||
"integrity": "sha512-TcZvGMMy9vodEFSse30lWinkj+JgOBvPn8wRItpQRSayhc+4ssDs335uklkfvQQJgL/WvmHLVj4Ycv2s7QCQMg=="
|
||||
},
|
||||
"sonic-boom": {
|
||||
"version": "0.7.3",
|
||||
"resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.3.tgz",
|
||||
"integrity": "sha512-A9EyoIeLD+g9vMLYQKjNCatJtAKdBQMW03+L8ZWWX/A6hq+srRCwdqHrBD1R8oSMLXov3oHN13dljtZf12q2Ow==",
|
||||
"version": "0.7.4",
|
||||
"resolved": "https://registry.npmjs.org/sonic-boom/-/sonic-boom-0.7.4.tgz",
|
||||
"integrity": "sha512-8JRAJg0RxZtFLQMxolwETvWd2JSlH3ZGo/Z4xPxMbpqF14xCgVYPVeFCFOR3zyr3pcfG82QDVj6537Sx5ZWdNw==",
|
||||
"requires": {
|
||||
"flatstr": "^1.0.9"
|
||||
}
|
||||
@@ -729,9 +712,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"source-map-support": {
|
||||
"version": "0.5.11",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz",
|
||||
"integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==",
|
||||
"version": "0.5.12",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
|
||||
"integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"buffer-from": "^1.0.0",
|
||||
@@ -829,13 +812,13 @@
|
||||
"integrity": "sha512-k/vdHz+bFALjmik0URLWBYNuO0hCABTL5dullbZBXvFDdlL8RrKaeLR6YuHfX+6ZXOLkHw+HpNLCUA7DtLMQmg=="
|
||||
},
|
||||
"ts-node": {
|
||||
"version": "8.0.3",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz",
|
||||
"integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==",
|
||||
"version": "8.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.2.0.tgz",
|
||||
"integrity": "sha512-m8XQwUurkbYqXrKqr3WHCW310utRNvV5OnRVeISeea7LoCWVcdfeB/Ntl8JYWFh+WRoUAdBgESrzKochQt7sMw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"arg": "^4.1.0",
|
||||
"diff": "^3.1.0",
|
||||
"diff": "^4.0.1",
|
||||
"make-error": "^1.1.1",
|
||||
"source-map-support": "^0.5.6",
|
||||
"yn": "^3.0.0"
|
||||
@@ -847,9 +830,9 @@
|
||||
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
|
||||
},
|
||||
"typescript": {
|
||||
"version": "3.4.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.2.tgz",
|
||||
"integrity": "sha512-Og2Vn6Mk7JAuWA1hQdDQN/Ekm/SchX80VzLhjKN9ETYrIepBFAd8PkOdOTK2nKt0FCkmMZKBJvQ1dV1gIxPu/A=="
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
|
||||
"integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw=="
|
||||
},
|
||||
"uri-js": {
|
||||
"version": "4.2.2",
|
||||
@@ -875,9 +858,9 @@
|
||||
"integrity": "sha512-Q/wBy3LB1uOyssgNlXSRmaf22NxjvDNZM2MtIQ4jaEOAB61xsh1TQxsq1CgzUMBV1lDrVMogIh8GjG1DYW0zLg=="
|
||||
},
|
||||
"yn": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz",
|
||||
"integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==",
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz",
|
||||
"integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,21 +7,21 @@
|
||||
"start": "ts-node src/main"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "6.0.5",
|
||||
"@nestjs/core": "6.0.5",
|
||||
"@nestjs/microservices": "6.0.5",
|
||||
"@nestjs/testing": "6.0.5",
|
||||
"@nestjs/websockets": "6.0.5",
|
||||
"class-transformer": "0.2.0",
|
||||
"@nestjs/common": "6.3.0",
|
||||
"@nestjs/core": "6.3.0",
|
||||
"@nestjs/microservices": "6.3.0",
|
||||
"@nestjs/testing": "6.3.0",
|
||||
"@nestjs/websockets": "6.3.0",
|
||||
"class-transformer": "0.2.3",
|
||||
"class-validator": "0.9.1",
|
||||
"fastify": "2.2.0",
|
||||
"fastify": "2.4.1",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rxjs": "6.4.0",
|
||||
"typescript": "3.4.2"
|
||||
"rxjs": "6.5.2",
|
||||
"typescript": "3.5.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "7.10.5",
|
||||
"@types/node": "7.10.6",
|
||||
"supertest": "4.0.2",
|
||||
"ts-node": "8.0.3"
|
||||
"ts-node": "8.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -3,7 +3,7 @@ import { Test } from '@nestjs/testing';
|
||||
import * as request from 'supertest';
|
||||
import { ApplicationModule } from '../src/app.module';
|
||||
|
||||
describe('GraphQL - Pipes', () => {
|
||||
describe('GraphQL Pipes', () => {
|
||||
let app: INestApplication;
|
||||
|
||||
beforeEach(async () => {
|
||||
@@ -32,20 +32,24 @@ describe('GraphQL - Pipes', () => {
|
||||
extensions: {
|
||||
code: 'INTERNAL_SERVER_ERROR',
|
||||
exception: {
|
||||
message: [
|
||||
{
|
||||
children: [],
|
||||
constraints: {
|
||||
length:
|
||||
'description must be longer than or equal to 30 characters',
|
||||
message: {
|
||||
error: 'Bad Request',
|
||||
message: [
|
||||
{
|
||||
children: [],
|
||||
constraints: {
|
||||
length:
|
||||
'description must be longer than or equal to 30 characters',
|
||||
},
|
||||
property: 'description',
|
||||
target: {
|
||||
ingredients: [],
|
||||
title: 'test',
|
||||
},
|
||||
},
|
||||
property: 'description',
|
||||
target: {
|
||||
ingredients: [],
|
||||
title: 'test',
|
||||
},
|
||||
},
|
||||
],
|
||||
],
|
||||
statusCode: 400,
|
||||
},
|
||||
response: {
|
||||
error: 'Bad Request',
|
||||
message: [
|
||||
@@ -73,20 +77,24 @@ describe('GraphQL - Pipes', () => {
|
||||
line: 2,
|
||||
},
|
||||
],
|
||||
message: [
|
||||
{
|
||||
children: [],
|
||||
constraints: {
|
||||
length:
|
||||
'description must be longer than or equal to 30 characters',
|
||||
message: {
|
||||
error: 'Bad Request',
|
||||
message: [
|
||||
{
|
||||
children: [],
|
||||
constraints: {
|
||||
length:
|
||||
'description must be longer than or equal to 30 characters',
|
||||
},
|
||||
property: 'description',
|
||||
target: {
|
||||
ingredients: [],
|
||||
title: 'test',
|
||||
},
|
||||
},
|
||||
property: 'description',
|
||||
target: {
|
||||
ingredients: [],
|
||||
title: 'test',
|
||||
},
|
||||
},
|
||||
],
|
||||
],
|
||||
statusCode: 400,
|
||||
},
|
||||
path: ['addRecipe'],
|
||||
},
|
||||
],
|
||||
|
||||
1519
integration/typegraphql/package-lock.json
generated
1519
integration/typegraphql/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,24 +9,24 @@
|
||||
"start:prod": "node dist/main.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "6.0.5",
|
||||
"@nestjs/core": "6.0.5",
|
||||
"@nestjs/graphql": "6.0.5",
|
||||
"apollo-server-express": "2.4.8",
|
||||
"class-transformer": "0.2.0",
|
||||
"@nestjs/common": "6.3.0",
|
||||
"@nestjs/core": "6.3.0",
|
||||
"@nestjs/graphql": "6.2.1",
|
||||
"apollo-server-express": "2.6.1",
|
||||
"class-transformer": "0.2.3",
|
||||
"class-validator": "0.9.1",
|
||||
"graphql": "14.2.1",
|
||||
"graphql": "14.3.1",
|
||||
"graphql-tools": "4.0.4",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rxjs": "6.4.0",
|
||||
"rxjs": "6.5.2",
|
||||
"subscriptions-transport-ws": "0.9.16",
|
||||
"type-graphql": "0.17.1",
|
||||
"typescript": "3.4.2",
|
||||
"ws": "6.2.1"
|
||||
"type-graphql": "0.17.4",
|
||||
"typescript": "3.5.1",
|
||||
"ws": "7.0.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "7.10.5",
|
||||
"ts-node": "8.0.3",
|
||||
"tslint": "5.15.0"
|
||||
"@types/node": "7.10.6",
|
||||
"ts-node": "8.2.0",
|
||||
"tslint": "5.17.0"
|
||||
}
|
||||
}
|
||||
|
||||
811
integration/typeorm/package-lock.json
generated
811
integration/typeorm/package-lock.json
generated
File diff suppressed because it is too large
Load Diff
@@ -9,18 +9,18 @@
|
||||
"start:prod": "node dist/main.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "6.0.5",
|
||||
"@nestjs/core": "6.0.5",
|
||||
"@nestjs/typeorm": "6.0.0",
|
||||
"mysql": "2.16.0",
|
||||
"@nestjs/common": "6.3.0",
|
||||
"@nestjs/core": "6.3.0",
|
||||
"@nestjs/typeorm": "6.1.2",
|
||||
"mysql": "2.17.1",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rxjs": "6.4.0",
|
||||
"typeorm": "0.2.16",
|
||||
"typescript": "3.4.2"
|
||||
"rxjs": "6.5.2",
|
||||
"typeorm": "0.2.18",
|
||||
"typescript": "3.5.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "7.10.5",
|
||||
"ts-node": "8.0.3",
|
||||
"tslint": "5.15.0"
|
||||
"@types/node": "7.10.6",
|
||||
"ts-node": "8.2.0",
|
||||
"tslint": "5.17.0"
|
||||
}
|
||||
}
|
||||
|
||||
151
integration/websockets/package-lock.json
generated
151
integration/websockets/package-lock.json
generated
@@ -5,21 +5,21 @@
|
||||
"requires": true,
|
||||
"dependencies": {
|
||||
"@nestjs/common": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.0.5.tgz",
|
||||
"integrity": "sha512-CbXtgBW/irevfUZF+rURDLFjhmT0Q6dmzbEYkuMg8bSjPmvgG6VzOBG6PwoPZbd+8PrPc2XLjN2A2Hg9mImp7A==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/common/-/common-6.3.0.tgz",
|
||||
"integrity": "sha512-zvMk2tN2l07bzylGM1znTKd0EpivYqox2ER6VXKAIWNDYVfPQg6q0UBsAuaXHTVGGCjbbl1l8wiyWwZvWmAUAg==",
|
||||
"requires": {
|
||||
"axios": "0.18.0",
|
||||
"axios": "0.19.0",
|
||||
"cli-color": "1.4.0",
|
||||
"uuid": "3.3.2"
|
||||
}
|
||||
},
|
||||
"@nestjs/core": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.0.5.tgz",
|
||||
"integrity": "sha512-diLLr9qb9vGKyvfkt8JFGox21rpgj4YiToCRb3Tbdab0bvssLopznh/f7cdEBNmk5Adtl3IvXjtdVRj+XH7VCw==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/core/-/core-6.3.0.tgz",
|
||||
"integrity": "sha512-4V8AXcvD+/5PjmKZV6pHhVDsVfIqfYTmx6Sc5SMnpTFlTpbAvC6UizrvC2BN9VAwSNkIFwJHtNNWhachjeykzA==",
|
||||
"requires": {
|
||||
"@nuxtjs/opencollective": "0.2.1",
|
||||
"@nuxtjs/opencollective": "0.2.2",
|
||||
"fast-safe-stringify": "2.0.6",
|
||||
"iterare": "1.1.2",
|
||||
"object-hash": "1.3.1",
|
||||
@@ -28,9 +28,9 @@
|
||||
}
|
||||
},
|
||||
"@nestjs/microservices": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-6.0.5.tgz",
|
||||
"integrity": "sha512-lUyxzYQ3E5U7aQaY4bKVnGxizTl2cE2Rrey0ylmeVE4ae9Y7/z/7mdsfB4DVnuMVuRpyClUJ+zrQ4tJAIvL/nQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/microservices/-/microservices-6.3.0.tgz",
|
||||
"integrity": "sha512-JgSIJ+5IIQQWuK5Q7lsugxVH1ntToLBuTclH23jqTb4QnIcVAQFx0/rhyBgnKPIHZSPe1Z9553AFka86u6DP7g==",
|
||||
"requires": {
|
||||
"iterare": "1.1.2",
|
||||
"json-socket": "0.3.0",
|
||||
@@ -38,25 +38,25 @@
|
||||
}
|
||||
},
|
||||
"@nestjs/testing": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-6.0.5.tgz",
|
||||
"integrity": "sha512-LrPBckONn/ZalBC8GU5LxvgIS8DJNrdwZE4gMJz0ugodwl0c1IL3e2gIukBkUJtHYPtzN12nYevnaGYT/V1aDQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/testing/-/testing-6.3.0.tgz",
|
||||
"integrity": "sha512-M8Vbi+6zJp3OkKf3OdBM70DaK2SswzygQ3zuuu/nc/TCFiX+9setLsQwXf/qFeO/ss8ko5UB2HmP6R8HelAdiA==",
|
||||
"requires": {
|
||||
"optional": "0.1.4"
|
||||
}
|
||||
},
|
||||
"@nestjs/websockets": {
|
||||
"version": "6.0.5",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-6.0.5.tgz",
|
||||
"integrity": "sha512-cA4Z6dM/Q8WqzgDyC6HiCdFvcDVAv7TyGkzthuuCn9xHDeLjtyzCL1koogkZ0FmLWhNmCskc/yJb2IjApGtzvQ==",
|
||||
"version": "6.3.0",
|
||||
"resolved": "https://registry.npmjs.org/@nestjs/websockets/-/websockets-6.3.0.tgz",
|
||||
"integrity": "sha512-02UC5zYBW57pApO6cWpHZuSw1Z0kqQd5ocSr5aKaSVGITQjbkhlWovMCwibAAzqnVegBIyGOj9FDxEtcPrdv7w==",
|
||||
"requires": {
|
||||
"iterare": "1.1.2"
|
||||
}
|
||||
},
|
||||
"@nuxtjs/opencollective": {
|
||||
"version": "0.2.1",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.1.tgz",
|
||||
"integrity": "sha512-pzSib8NKquaTt/ns5Cc2G0BGRVJXaD+p1qfF6q7vNIMvRysorn/VF3y7gAuQpcxfF7wBbGE+dXjhIieWOUsWSw==",
|
||||
"version": "0.2.2",
|
||||
"resolved": "https://registry.npmjs.org/@nuxtjs/opencollective/-/opencollective-0.2.2.tgz",
|
||||
"integrity": "sha512-69gFVDs7mJfNjv9Zs5DFVD+pvBW+k1TaHSOqUWqAyTTfLcKI/EMYQgvEvziRd+zAFtUOoye6MfWh0qvinGISPw==",
|
||||
"requires": {
|
||||
"chalk": "^2.4.1",
|
||||
"consola": "^2.3.0",
|
||||
@@ -64,9 +64,9 @@
|
||||
}
|
||||
},
|
||||
"@types/node": {
|
||||
"version": "7.10.5",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.5.tgz",
|
||||
"integrity": "sha512-RYkagUUbxQBss46ElbEa+j4q4X3GR12QwB7a/PM5hmVuVkYoW1jENT1+taspKUv8ibwW8cw+kRFbOaTc/Key3w==",
|
||||
"version": "7.10.6",
|
||||
"resolved": "https://registry.npmjs.org/@types/node/-/node-7.10.6.tgz",
|
||||
"integrity": "sha512-d0BOAicT0tEdbdVQlLGOVul1kvg6YvbaADRCThGCz5NJ0e9r00SofcR1x69hmlCyrHuB6jd4cKzL9bMLjPnpAA==",
|
||||
"dev": true
|
||||
},
|
||||
"ansi-regex": {
|
||||
@@ -95,12 +95,12 @@
|
||||
"dev": true
|
||||
},
|
||||
"axios": {
|
||||
"version": "0.18.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.18.0.tgz",
|
||||
"integrity": "sha1-MtU+SFHv3AoRmTts0AB4nXDAUQI=",
|
||||
"version": "0.19.0",
|
||||
"resolved": "https://registry.npmjs.org/axios/-/axios-0.19.0.tgz",
|
||||
"integrity": "sha512-1uvKqKQta3KBxIz14F2v06AEHZ/dIoeKfbTRkK1E5oqjDnuEerLmYTgJB5AiQZHJcljpg1TuRzdjDR06qNk0DQ==",
|
||||
"requires": {
|
||||
"follow-redirects": "^1.3.0",
|
||||
"is-buffer": "^1.1.5"
|
||||
"follow-redirects": "1.5.10",
|
||||
"is-buffer": "^2.0.2"
|
||||
}
|
||||
},
|
||||
"buffer-from": {
|
||||
@@ -120,9 +120,9 @@
|
||||
}
|
||||
},
|
||||
"class-transformer": {
|
||||
"version": "0.2.0",
|
||||
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.0.tgz",
|
||||
"integrity": "sha512-6N/5WkEmLZCKxyC2CAPYQIJt3pDZzDFag7AExpyWRm7CjaS/U62VDRU+Z2AUrQaNpnuiXRlli0so4PJUqGSVZQ=="
|
||||
"version": "0.2.3",
|
||||
"resolved": "https://registry.npmjs.org/class-transformer/-/class-transformer-0.2.3.tgz",
|
||||
"integrity": "sha512-qsP+0xoavpOlJHuYsQJsN58HXSl8Jvveo+T37rEvCEeRfMWoytAyR0Ua/YsFgpM6AZYZ/og2PJwArwzJl1aXtQ=="
|
||||
},
|
||||
"class-validator": {
|
||||
"version": "0.9.1",
|
||||
@@ -175,9 +175,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"consola": {
|
||||
"version": "2.5.8",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.5.8.tgz",
|
||||
"integrity": "sha512-fYv1M0rNJw4h0CZUx8PX02Px7xQhA+vNHpV8DBCGMoozp2Io/vrSXhhEothaRnSt7VMR0rj2pt9KKLXa5amrCw=="
|
||||
"version": "2.7.1",
|
||||
"resolved": "https://registry.npmjs.org/consola/-/consola-2.7.1.tgz",
|
||||
"integrity": "sha512-u7JYs+HnMbZPD2cEuS1XHsLeqtazA0kd5lAk8r8DnnGdgNhOdb7DSubJ+QLdQkbtpmmxgp7gs8Ug44sCyY4FCQ=="
|
||||
},
|
||||
"cookiejar": {
|
||||
"version": "2.1.2",
|
||||
@@ -203,6 +203,7 @@
|
||||
"version": "3.2.6",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.2.6.tgz",
|
||||
"integrity": "sha512-mel+jf7nrtEl5Pn1Qx46zARXKDpBbvzezse7p7LqINmdoIk8PYP5SySaxEmYv6TZ0JyEKA1hsCId6DIhgITtWQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"ms": "^2.1.1"
|
||||
}
|
||||
@@ -214,15 +215,15 @@
|
||||
"dev": true
|
||||
},
|
||||
"diff": {
|
||||
"version": "3.5.0",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-3.5.0.tgz",
|
||||
"integrity": "sha512-A46qtFgd+g7pDZinpnwiRJtxbC1hpgf0uzP3iG89scHk0AUC7A1TGxf5OiiOUv/JMZR8GOt8hL900hV0bOy5xA==",
|
||||
"version": "4.0.1",
|
||||
"resolved": "https://registry.npmjs.org/diff/-/diff-4.0.1.tgz",
|
||||
"integrity": "sha512-s2+XdvhPCOF01LRQBC8hf4vhbVmI2CGS5aZnxLJlT5FtdhPCDFq80q++zK2KlrVorVDdL5BOGZ/VfLrVtYNF+Q==",
|
||||
"dev": true
|
||||
},
|
||||
"es5-ext": {
|
||||
"version": "0.10.49",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.49.tgz",
|
||||
"integrity": "sha512-3NMEhi57E31qdzmYp2jwRArIUsj1HI/RxbQ4bgnSB+AIKIxsAmTiK83bYMifIcpWvEc3P1X30DhUKOqEtF/kvg==",
|
||||
"version": "0.10.50",
|
||||
"resolved": "https://registry.npmjs.org/es5-ext/-/es5-ext-0.10.50.tgz",
|
||||
"integrity": "sha512-KMzZTPBkeQV/JcSQhI5/z6d9VWJ3EnQ194USTUwIYZ2ZbpN8+SGXQKt1h68EX44+qt+Fzr8DO17vnxrw7c3agw==",
|
||||
"requires": {
|
||||
"es6-iterator": "~2.0.3",
|
||||
"es6-symbol": "~3.1.1",
|
||||
@@ -285,11 +286,26 @@
|
||||
"integrity": "sha512-q8BZ89jjc+mz08rSxROs8VsrBBcn1SIw1kq9NjolL509tkABRk9io01RAjSaEv1Xb2uFLt8VtRiZbGp5H8iDtg=="
|
||||
},
|
||||
"follow-redirects": {
|
||||
"version": "1.7.0",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.7.0.tgz",
|
||||
"integrity": "sha512-m/pZQy4Gj287eNy94nivy5wchN3Kp+Q5WgUPNy5lJSZ3sgkVKSYV/ZChMAQVIgx1SqfZ2zBZtPA2YlXIWxxJOQ==",
|
||||
"version": "1.5.10",
|
||||
"resolved": "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.5.10.tgz",
|
||||
"integrity": "sha512-0V5l4Cizzvqt5D44aTXbFZz+FtyXV1vrDN6qrelxtfYQKW0KO0W2T/hkE8xvGa/540LkZlkaUjO4ailYTFtHVQ==",
|
||||
"requires": {
|
||||
"debug": "^3.2.6"
|
||||
"debug": "=3.1.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"debug": {
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz",
|
||||
"integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==",
|
||||
"requires": {
|
||||
"ms": "2.0.0"
|
||||
}
|
||||
},
|
||||
"ms": {
|
||||
"version": "2.0.0",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz",
|
||||
"integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g="
|
||||
}
|
||||
}
|
||||
},
|
||||
"form-data": {
|
||||
@@ -326,9 +342,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"is-buffer": {
|
||||
"version": "1.1.6",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-1.1.6.tgz",
|
||||
"integrity": "sha512-NcdALwpXkTm5Zvvbk7owOUSvVvBKDgKP5/ewfXEznmQFfs4ZRmanOeKBTjRVjka3QFoN6XJ+9F3USqfHqTaU5w=="
|
||||
"version": "2.0.3",
|
||||
"resolved": "https://registry.npmjs.org/is-buffer/-/is-buffer-2.0.3.tgz",
|
||||
"integrity": "sha512-U15Q7MXTuZlrbymiz95PJpZxu8IlipAp4dtS3wOdgPXx3mqBnslrWU14kxfHB+Py/+2PVKSr37dMAgM2A4uArw=="
|
||||
},
|
||||
"is-promise": {
|
||||
"version": "2.1.0",
|
||||
@@ -404,7 +420,8 @@
|
||||
"ms": {
|
||||
"version": "2.1.1",
|
||||
"resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz",
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg=="
|
||||
"integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==",
|
||||
"dev": true
|
||||
},
|
||||
"next-tick": {
|
||||
"version": "1.0.0",
|
||||
@@ -412,9 +429,9 @@
|
||||
"integrity": "sha1-yobR/ogoFpsBICCOPchCS524NCw="
|
||||
},
|
||||
"node-fetch": {
|
||||
"version": "2.3.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.3.0.tgz",
|
||||
"integrity": "sha512-MOd8pV3fxENbryESLgVIeaGKrdl+uaYhCSSVkjeOb/31/njTpcis5aWfdqgNlHIrKOLRbMnfPINPOML2CIFeXA=="
|
||||
"version": "2.6.0",
|
||||
"resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.6.0.tgz",
|
||||
"integrity": "sha512-8dG4H5ujfvFiqDmVu9fQ5bOHUC15JMjMY/Zumv26oOvvVJjM67KF8koCWIabKQ1GJIa9r2mMZscBq/TbdOcmNA=="
|
||||
},
|
||||
"object-hash": {
|
||||
"version": "1.3.1",
|
||||
@@ -444,9 +461,9 @@
|
||||
"integrity": "sha512-Ts1Y/anZELhSsjMcU605fU9RE4Oi3p5ORujwbIKXfWa+0Zxs510Qrmrce5/Jowq3cHSZSJqBjypxmHarc+vEWg=="
|
||||
},
|
||||
"rxjs": {
|
||||
"version": "6.4.0",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.4.0.tgz",
|
||||
"integrity": "sha512-Z9Yfa11F6B9Sg/BK9MnqnQ+aQYicPLtilXBp2yUtDt2JRCE0h26d33EnfO3ZxoNxG0T92OUucP3Ct7cpfkdFfw==",
|
||||
"version": "6.5.2",
|
||||
"resolved": "https://registry.npmjs.org/rxjs/-/rxjs-6.5.2.tgz",
|
||||
"integrity": "sha512-HUb7j3kvb7p7eCUHE3FqjoDsC1xfZQ4AHFWfTKSpZ+sAhhz5X1WX0ZuUqWbzB2QhSLp3DoLUG+hMdEDKqWo2Zg==",
|
||||
"requires": {
|
||||
"tslib": "^1.9.0"
|
||||
}
|
||||
@@ -464,9 +481,9 @@
|
||||
"dev": true
|
||||
},
|
||||
"source-map-support": {
|
||||
"version": "0.5.11",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.11.tgz",
|
||||
"integrity": "sha512-//sajEx/fGL3iw6fltKMdPvy8kL3kJ2O3iuYlRoT3k9Kb4BjOoZ+BZzaNHeuaruSt+Kf3Zk9tnfAQg9/AJqUVQ==",
|
||||
"version": "0.5.12",
|
||||
"resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.12.tgz",
|
||||
"integrity": "sha512-4h2Pbvyy15EE02G+JOZpUCmqWJuqrs+sEkzewTm++BPi7Hvn/HwcqLAcNxYAyI0x13CpPPn+kMjl+hplXMHITQ==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"buffer-from": "^1.0.0",
|
||||
@@ -551,13 +568,13 @@
|
||||
}
|
||||
},
|
||||
"ts-node": {
|
||||
"version": "8.0.3",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.0.3.tgz",
|
||||
"integrity": "sha512-2qayBA4vdtVRuDo11DEFSsD/SFsBXQBRZZhbRGSIkmYmVkWjULn/GGMdG10KVqkaGndljfaTD8dKjWgcejO8YA==",
|
||||
"version": "8.2.0",
|
||||
"resolved": "https://registry.npmjs.org/ts-node/-/ts-node-8.2.0.tgz",
|
||||
"integrity": "sha512-m8XQwUurkbYqXrKqr3WHCW310utRNvV5OnRVeISeea7LoCWVcdfeB/Ntl8JYWFh+WRoUAdBgESrzKochQt7sMw==",
|
||||
"dev": true,
|
||||
"requires": {
|
||||
"arg": "^4.1.0",
|
||||
"diff": "^3.1.0",
|
||||
"diff": "^4.0.1",
|
||||
"make-error": "^1.1.1",
|
||||
"source-map-support": "^0.5.6",
|
||||
"yn": "^3.0.0"
|
||||
@@ -569,9 +586,9 @@
|
||||
"integrity": "sha512-4krF8scpejhaOgqzBEcGM7yDIEfi0/8+8zDRZhNZZ2kjmHJ4hv3zCbQWxoJGz1iw5U0Jl0nma13xzHXcncMavQ=="
|
||||
},
|
||||
"typescript": {
|
||||
"version": "3.4.2",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.4.2.tgz",
|
||||
"integrity": "sha512-Og2Vn6Mk7JAuWA1hQdDQN/Ekm/SchX80VzLhjKN9ETYrIepBFAd8PkOdOTK2nKt0FCkmMZKBJvQ1dV1gIxPu/A=="
|
||||
"version": "3.5.1",
|
||||
"resolved": "https://registry.npmjs.org/typescript/-/typescript-3.5.1.tgz",
|
||||
"integrity": "sha512-64HkdiRv1yYZsSe4xC1WVgamNigVYjlssIoaH2HcZF0+ijsk5YK2g0G34w9wJkze8+5ow4STd22AynfO6ZYYLw=="
|
||||
},
|
||||
"util-deprecate": {
|
||||
"version": "1.0.2",
|
||||
@@ -590,9 +607,9 @@
|
||||
"integrity": "sha512-Q/wBy3LB1uOyssgNlXSRmaf22NxjvDNZM2MtIQ4jaEOAB61xsh1TQxsq1CgzUMBV1lDrVMogIh8GjG1DYW0zLg=="
|
||||
},
|
||||
"yn": {
|
||||
"version": "3.0.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.0.0.tgz",
|
||||
"integrity": "sha512-+Wo/p5VRfxUgBUGy2j/6KX2mj9AYJWOHuhMjMcbBFc3y54o9/4buK1ksBvuiK01C3kby8DH9lSmJdSxw+4G/2Q==",
|
||||
"version": "3.1.0",
|
||||
"resolved": "https://registry.npmjs.org/yn/-/yn-3.1.0.tgz",
|
||||
"integrity": "sha512-kKfnnYkbTfrAdd0xICNFw7Atm8nKpLcLv9AZGEt+kczL/WQVai4e2V6ZN8U/O+iI6WrNuJjNNOyu4zfhl9D3Hg==",
|
||||
"dev": true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -7,20 +7,20 @@
|
||||
"start": "ts-node src/main"
|
||||
},
|
||||
"dependencies": {
|
||||
"@nestjs/common": "6.0.5",
|
||||
"@nestjs/core": "6.0.5",
|
||||
"@nestjs/microservices": "6.0.5",
|
||||
"@nestjs/testing": "6.0.5",
|
||||
"@nestjs/websockets": "6.0.5",
|
||||
"class-transformer": "0.2.0",
|
||||
"@nestjs/common": "6.3.0",
|
||||
"@nestjs/core": "6.3.0",
|
||||
"@nestjs/microservices": "6.3.0",
|
||||
"@nestjs/testing": "6.3.0",
|
||||
"@nestjs/websockets": "6.3.0",
|
||||
"class-transformer": "0.2.3",
|
||||
"class-validator": "0.9.1",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rxjs": "6.4.0",
|
||||
"typescript": "3.4.2"
|
||||
"rxjs": "6.5.2",
|
||||
"typescript": "3.5.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/node": "7.10.5",
|
||||
"@types/node": "7.10.6",
|
||||
"supertest": "4.0.2",
|
||||
"ts-node": "8.0.3"
|
||||
"ts-node": "8.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,7 +1,5 @@
|
||||
{
|
||||
"lerna": "2.4.0",
|
||||
"packages": [
|
||||
"packages/*"
|
||||
],
|
||||
"version": "6.0.5"
|
||||
"packages": ["packages/*"],
|
||||
"version": "6.3.0"
|
||||
}
|
||||
|
||||
4319
package-lock.json
generated
4319
package-lock.json
generated
File diff suppressed because it is too large
Load Diff
97
package.json
97
package.json
@@ -1,6 +1,7 @@
|
||||
{
|
||||
"name": "nestjs",
|
||||
"version": "6.0.5",
|
||||
"name": "nestjs-monorepo",
|
||||
"version": "6.3.0",
|
||||
"private": true,
|
||||
"description": "Modern, fast, powerful node.js web framework",
|
||||
"scripts": {
|
||||
"coverage": "nyc report --reporter=text-lcov | coveralls",
|
||||
@@ -31,80 +32,80 @@
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"@grpc/proto-loader": "0.3.0",
|
||||
"@nestjs/common": "6.0.5",
|
||||
"@nestjs/core": "6.0.5",
|
||||
"@nestjs/microservices": "6.0.5",
|
||||
"@nestjs/testing": "6.0.5",
|
||||
"@nestjs/websockets": "6.0.5",
|
||||
"@nuxtjs/opencollective": "0.2.1",
|
||||
"amqp-connection-manager": "2.3.1",
|
||||
"@nestjs/common": "6.1.1",
|
||||
"@nestjs/core": "6.1.1",
|
||||
"@nestjs/microservices": "6.1.1",
|
||||
"@nestjs/testing": "6.1.1",
|
||||
"@nestjs/websockets": "6.1.1",
|
||||
"@nuxtjs/opencollective": "0.2.2",
|
||||
"amqp-connection-manager": "2.3.2",
|
||||
"amqplib": "0.5.3",
|
||||
"apollo-server-express": "2.4.8",
|
||||
"axios": "0.18.0",
|
||||
"cache-manager": "2.9.0",
|
||||
"class-transformer": "0.2.0",
|
||||
"apollo-server-express": "2.6.1",
|
||||
"axios": "0.19.0",
|
||||
"cache-manager": "2.9.1",
|
||||
"class-transformer": "0.2.3",
|
||||
"class-validator": "0.9.1",
|
||||
"cli-color": "1.4.0",
|
||||
"connect": "3.6.6",
|
||||
"connect": "3.7.0",
|
||||
"cors": "2.8.5",
|
||||
"engine.io-client": "3.3.2",
|
||||
"express": "4.16.4",
|
||||
"fast-json-stringify": "1.14.0",
|
||||
"express": "4.17.1",
|
||||
"fast-json-stringify": "1.15.3",
|
||||
"fast-safe-stringify": "2.0.6",
|
||||
"fastify": "2.2.0",
|
||||
"fastify-cors": "2.1.2",
|
||||
"fastify": "2.4.1",
|
||||
"fastify-cors": "2.1.3",
|
||||
"fastify-formbody": "3.1.0",
|
||||
"fastify-multipart": "0.8.0",
|
||||
"graphql": "14.2.1",
|
||||
"grpc": "1.19.0",
|
||||
"fastify-multipart": "1.0.0",
|
||||
"graphql": "14.3.1",
|
||||
"grpc": "1.21.1",
|
||||
"http2": "3.3.7",
|
||||
"iterare": "1.1.2",
|
||||
"merge-graphql-schemas": "1.5.8",
|
||||
"mqtt": "2.18.8",
|
||||
"mqtt": "3.0.0",
|
||||
"multer": "1.4.1",
|
||||
"nats": "1.2.6",
|
||||
"nats": "1.2.10",
|
||||
"object-hash": "1.3.1",
|
||||
"optional": "0.1.4",
|
||||
"path-to-regexp": "3.0.0",
|
||||
"pump": "3.0.0",
|
||||
"redis": "2.8.0",
|
||||
"reflect-metadata": "0.1.13",
|
||||
"rxjs": "6.4.0",
|
||||
"rxjs-compat": "6.4.0",
|
||||
"rxjs": "6.5.2",
|
||||
"rxjs-compat": "6.5.2",
|
||||
"socket.io": "2.2.0",
|
||||
"ts-morph": "1.3.3",
|
||||
"ts-morph": "2.3.0",
|
||||
"uuid": "3.3.2"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/amqplib": "0.5.11",
|
||||
"@types/amqplib": "0.5.12",
|
||||
"@types/cache-manager": "1.2.7",
|
||||
"@types/chai": "4.1.7",
|
||||
"@types/chai-as-promised": "7.1.0",
|
||||
"@types/cors": "2.8.4",
|
||||
"@types/express": "4.16.1",
|
||||
"@types/cors": "2.8.5",
|
||||
"@types/express": "4.17.0",
|
||||
"@types/fastify-cors": "2.1.0",
|
||||
"@types/kafka-node": "2.0.8",
|
||||
"@types/mocha": "5.2.6",
|
||||
"@types/node": "10.14.4",
|
||||
"@types/redis": "2.8.12",
|
||||
"@types/mocha": "5.2.7",
|
||||
"@types/node": "10.14.8",
|
||||
"@types/redis": "2.8.13",
|
||||
"@types/reflect-metadata": "0.0.5",
|
||||
"@types/sinon": "7.0.11",
|
||||
"@types/sinon": "7.0.12",
|
||||
"@types/socket.io": "2.1.2",
|
||||
"@types/ws": "6.0.1",
|
||||
"artillery": "1.6.0-27",
|
||||
"artillery": "1.6.0-28",
|
||||
"awesome-typescript-loader": "5.2.1",
|
||||
"body-parser": "1.18.3",
|
||||
"body-parser": "1.19.0",
|
||||
"chai": "4.2.0",
|
||||
"chai-as-promised": "7.1.1",
|
||||
"clang-format": "1.2.4",
|
||||
"concurrently": "4.1.0",
|
||||
"conventional-changelog": "3.0.6",
|
||||
"core-js": "3.0.1",
|
||||
"conventional-changelog": "3.1.8",
|
||||
"core-js": "3.1.3",
|
||||
"coveralls": "3.0.3",
|
||||
"csv-write-stream": "2.0.0",
|
||||
"delete-empty": "2.0.0",
|
||||
"fastify-static": "2.4.0",
|
||||
"gulp": "4.0.0",
|
||||
"gulp": "4.0.1",
|
||||
"gulp-clang-format": "1.0.27",
|
||||
"gulp-clean": "0.4.0",
|
||||
"gulp-sourcemaps": "2.6.5",
|
||||
@@ -113,20 +114,20 @@
|
||||
"husky": "1.3.1",
|
||||
"imports-loader": "0.8.0",
|
||||
"json-loader": "0.5.7",
|
||||
"lerna": "3.13.1",
|
||||
"lint-staged": "8.1.5",
|
||||
"lerna": "3.14.1",
|
||||
"lint-staged": "8.1.7",
|
||||
"memory-usage": "1.2.1",
|
||||
"mocha": "3.5.3",
|
||||
"nodemon": "1.18.10",
|
||||
"nyc": "13.3.0",
|
||||
"prettier": "1.16.4",
|
||||
"sinon": "7.3.1",
|
||||
"nodemon": "1.19.1",
|
||||
"nyc": "14.1.1",
|
||||
"prettier": "1.17.1",
|
||||
"sinon": "7.3.2",
|
||||
"sinon-chai": "3.3.0",
|
||||
"socket.io-client": "2.2.0",
|
||||
"supertest": "4.0.2",
|
||||
"ts-node": "8.0.3",
|
||||
"tslint": "5.15.0",
|
||||
"typescript": "3.4.2"
|
||||
"ts-node": "8.2.0",
|
||||
"tslint": "5.17.0",
|
||||
"typescript": "3.5.1"
|
||||
},
|
||||
"collective": {
|
||||
"type": "opencollective",
|
||||
@@ -141,9 +142,11 @@
|
||||
],
|
||||
"exclude": [
|
||||
"node_modules/",
|
||||
"packages/**/test/**",
|
||||
"packages/**/*.spec.ts",
|
||||
"packages/**/adapters/*.ts",
|
||||
"packages/**/nest-*.ts",
|
||||
"packages/**/test/**/*.ts",
|
||||
"packages/core/errors/**/*",
|
||||
"packages/common/exceptions/*.ts",
|
||||
"packages/common/http/*.ts",
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/core.svg" alt="NPM Downloads" /></a>
|
||||
<a href="https://travis-ci.org/nestjs/nest" target="_blank"><img src="https://api.travis-ci.org/nestjs/nest.svg?branch=master" alt="Travis" /></a>
|
||||
<a href="https://travis-ci.org/nestjs/nest" target="_blank"><img src="https://img.shields.io/travis/nestjs/nest/master.svg?label=linux" alt="Linux" /></a>
|
||||
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#8" alt="Coverage" /></a>
|
||||
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a>
|
||||
<a href="https://gitter.im/nestjs/nestjs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge" target="_blank"><img src="https://badges.gitter.im/nestjs/nestjs.svg" alt="Gitter" /></a>
|
||||
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
|
||||
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
|
||||
@@ -53,30 +53,32 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
|
||||
|
||||
<a href="https://valor-software.com/" target="_blank"><img src="https://docs.nestjs.com/assets/sponsors/valor-software.png" width="320" /></a>
|
||||
|
||||
#### Base Sponsor
|
||||
|
||||
<a href="https://blueanchor.io/" target="_blank"><img src="https://nestjs.com/img/blueanchor.png" width="300" /></a>
|
||||
<a href="https://www.novologic.com/" target="_blank"><img src="https://nestjs.com/img/novologic.png" width="200" /></a>
|
||||
|
||||
#### Silver Sponsors
|
||||
<a href="https://neoteric.eu/" target="_blank"><img src="https://nestjs.com/img/neoteric-cut.png" width="120" valign="middle" /></a>
|
||||
<a href="http://gojob.com" target="_blank"><img src="http://nestjs.com/img/gojob-logo.png" valign="middle" height="95" /></a> <a href="https://www.swingdev.io" target="_blank"><img src="https://nestjs.com/img/swingdev-logo.svg#1" width="150" valign="middle" /> </a>
|
||||
<a href="https://yakaz.com/" target="_blank"><img src="https://nestjs.com/img/yakaz.png" width="100" valign="middle" /></a>
|
||||
<a href="https://trilon.io" target="_blank"><img src="https://nestjs.com/img/trilon.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://xtremis.com/" target="_blank"><img src="https://nestjs.com/img/logo-xtremis.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://gojob.com" target="_blank"><img src="http://nestjs.com/img/gojob-logo.png" valign="middle" height="95" /></a>
|
||||
<a href="https://trilon.io" target="_blank"><img src="https://nestjs.com/img/trilon.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://www.leogistics.com" target="_blank"><img src="https://nestjs.com/img/leogistics-logo.jpeg" width="150" valign="middle" /></a>
|
||||
|
||||
#### Sponsors
|
||||
|
||||
<a href="https://scal.io" target="_blank"><img src="https://nestjs.com/img/scalio-logo.svg" width="110" valign="middle" /></a> <a href="http://angularity.io" target="_blank"><img src="http://angularity.io/media/logo.svg" height="26" valign="middle" /></a> <!--<a href="https://keycdn.com"><img src="https://nestjs.com/img/keycdn.svg" height="30" /></a> --> <a href="https://hostpresto.com" target="_blank"><img src="https://nestjs.com/img/hostpresto.png" height="30" valign="middle" /></a> <a href="https://genuinebee.com/" target="_blank"><img src="https://nestjs.com/img/genuinebee.svg" height="36" valign="middle" /></a> <a href="http://architectnow.net/" target="_blank"><img src="https://nestjs.com/img/architectnow.png" height="24" valign="middle" /></a> <a href="https://quander.io/" target="_blank"><img src="https://nestjs.com/img/quander.png" height="28" valign="middle" /></a> <a href="https://mantro.net/" target="_blank"><img src="https://nestjs.com/img/mantro-logo.svg" height="20" valign="middle" /></a>
|
||||
<a href="https://www.swingdev.io" target="_blank"><img src="https://nestjs.com/img/swingdev-logo.svg#1" width="125" valign="middle" /> </a> <a href="https://blueanchor.io/" target="_blank"><img src="https://nestjs.com/img/blueanchor.png" width="180" valign="middle" /></a>
|
||||
<a href="https://www.novologic.com/" target="_blank"><img src="https://nestjs.com/img/novologic.png" width="130" valign="middle" /></a>
|
||||
<a href="https://scal.io" target="_blank"><img src="https://nestjs.com/img/scalio-logo.svg" width="100" valign="middle" /></a> <a href="http://angularity.io" target="_blank"><img src="http://angularity.io/media/logo.svg" height="26" valign="middle" /></a> <!--<a href="https://keycdn.com"><img src="https://nestjs.com/img/keycdn.svg" height="30" /></a> --> <a href="https://hostpresto.com" target="_blank"><img src="https://nestjs.com/img/hostpresto.png" height="30" valign="middle" /></a>
|
||||
|
||||
<a href="https://triplebyte.com/" target="_blank"><img src="https://nestjs.com/img/triplebyte.png" height="30" valign="middle" /></a>
|
||||
<a href="https://genuinebee.com/" target="_blank"><img src="https://nestjs.com/img/genuinebee.svg" height="36" valign="middle" /></a> <a href="http://architectnow.net/" target="_blank"><img src="https://nestjs.com/img/architectnow.png" height="24" valign="middle" /></a> <a href="https://quander.io/" target="_blank"><img src="https://nestjs.com/img/quander.png" height="28" valign="middle" /></a> <a href="https://mantro.net/" target="_blank"><img src="https://nestjs.com/img/mantro-logo.svg" height="20" valign="middle" /></a> <a href="https://triplebyte.com/" target="_blank"><img src="https://nestjs.com/img/triplebyte.png" height="30" valign="middle" /></a>
|
||||
<a href="https://ever.co/" target="_blank"><img src="https://nestjs.com/img/ever-logo.png" height="20" valign="middle" /></a>
|
||||
<a href="https://buddy.works/" target="_blank"><img src="https://nestjs.com/img/buddy-logo.svg" height="35" valign="middle" /></a>
|
||||
<a href="https://buddy.works/" target="_blank"><img src="https://nestjs.com/img/buddy-logo.svg" height="35" valign="middle" /></a>
|
||||
<a href="https://blokt.com" target="_blank"><img src="https://nestjs.com/img/blokt-logo.png" height="31" valign="middle" /></a>
|
||||
<a href="https://reposit.co.uk/" target="_blank"><img src="https://nestjs.com/img/reposit-logo.png" height="28" valign="middle" /></a> <a href="https://yakaz.com/" target="_blank"><img src="https://nestjs.com/img/yakaz.png" width="80" valign="middle" /></a>
|
||||
<a href="https://nearpod.com/" target="_blank"><img src="https://nestjs.com/img/nearpod-logo.svg" width="120" valign="middle" /></a>
|
||||
<a href="https://clay.global/" target="_blank"><img src="https://nestjs.com/img/clay-logo.svg" width="90" valign="middle" /></a>
|
||||
<a href="http://xtremis.com/" target="_blank"><img src="https://nestjs.com/img/logo-xtremis.svg" width="145" valign="middle" /></a>
|
||||
|
||||
|
||||
|
||||
## Backers
|
||||
|
||||
<a href="https://opencollective.com/nest" target="_blank"><img src="https://opencollective.com/nest/backers.svg?width=890"></a>
|
||||
<a href="https://opencollective.com/nest" target="_blank"><img src="https://opencollective.com/nest/backers.svg?width=1600"></a>
|
||||
|
||||
## Stay in touch
|
||||
|
||||
|
||||
@@ -48,7 +48,8 @@ export function createParamDecorator(
|
||||
|
||||
const isPipe = (pipe: any) =>
|
||||
pipe &&
|
||||
((isFunction(pipe) && pipe.prototype) || isFunction(pipe.transform));
|
||||
((isFunction(pipe) && pipe.prototype && isFunction(pipe.prototype.transform)) ||
|
||||
isFunction(pipe.transform));
|
||||
|
||||
const hasParamData = isNil(data) || !isPipe(data);
|
||||
const paramData = hasParamData ? data : undefined;
|
||||
|
||||
@@ -1,5 +1,3 @@
|
||||
import { isObject } from '../utils/shared.utils';
|
||||
|
||||
export class HttpException extends Error {
|
||||
public readonly message: any;
|
||||
|
||||
@@ -22,9 +20,7 @@ export class HttpException extends Error {
|
||||
private readonly status: number,
|
||||
) {
|
||||
super();
|
||||
this.message =
|
||||
(isObject(response) && (response as { message?: string }).message) ||
|
||||
response;
|
||||
this.message = response;
|
||||
}
|
||||
|
||||
public getResponse(): string | object {
|
||||
|
||||
@@ -38,4 +38,8 @@ export interface ClassTransformOptions {
|
||||
* This option is useful when you know for sure that your types might have a circular dependency.
|
||||
*/
|
||||
enableCircularCheck?: boolean;
|
||||
/**
|
||||
* If set to true class-transformer will attempt conversion based on TS reflected type
|
||||
*/
|
||||
enableImplicitConversion?: boolean;
|
||||
}
|
||||
|
||||
@@ -89,5 +89,6 @@ export interface RmqOptions {
|
||||
prefetchCount?: number;
|
||||
isGlobalPrefetchCount?: boolean;
|
||||
queueOptions?: any;
|
||||
socketOptions?: any;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -6,7 +6,8 @@ export type Provider<T = any> =
|
||||
| Type<any>
|
||||
| ClassProvider<T>
|
||||
| ValueProvider<T>
|
||||
| FactoryProvider<T>;
|
||||
| FactoryProvider<T>
|
||||
| ExistingProvider<T>;
|
||||
|
||||
export interface ClassProvider<T = any> {
|
||||
provide: string | symbol | Type<any> | Abstract<any> | Function;
|
||||
@@ -22,6 +23,11 @@ export interface ValueProvider<T = any> {
|
||||
export interface FactoryProvider<T = any> {
|
||||
provide: string | symbol | Type<any> | Abstract<any> | Function;
|
||||
useFactory: (...args: any[]) => T;
|
||||
inject?: Array<Type<any> | string | any>;
|
||||
inject?: Array<Type<any> | string | symbol | Abstract<any> | Function>;
|
||||
scope?: Scope;
|
||||
}
|
||||
|
||||
export interface ExistingProvider<T = any> {
|
||||
provide: string | symbol | Type<any> | Abstract<any> | Function;
|
||||
useExisting: any;
|
||||
}
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
import { ShutdownSignal } from '../enums/shutdown-signal.enum';
|
||||
import { LoggerService } from '../services/logger.service';
|
||||
import { Abstract } from './abstract.interface';
|
||||
import { Type } from './type.interface';
|
||||
import { ShutdownSignal } from '../enums/shutdown-signal.enum';
|
||||
|
||||
export interface INestApplicationContext {
|
||||
/**
|
||||
@@ -39,4 +39,13 @@ export interface INestApplicationContext {
|
||||
* @returns {this} The Nest application context instance
|
||||
*/
|
||||
enableShutdownHooks(signals?: ShutdownSignal[] | string[]): this;
|
||||
|
||||
/**
|
||||
* Initalizes the Nest application.
|
||||
* Calls the Nest lifecycle events.
|
||||
* It isn't mandatory to call this method directly.
|
||||
*
|
||||
* @returns {Promise<this>} The NestApplicationContext instance as Promise
|
||||
*/
|
||||
init(): Promise<this>;
|
||||
}
|
||||
|
||||
@@ -8,13 +8,6 @@ import { INestApplicationContext } from './nest-application-context.interface';
|
||||
import { WebSocketAdapter } from './websockets/web-socket-adapter.interface';
|
||||
|
||||
export interface INestApplication extends INestApplicationContext {
|
||||
/**
|
||||
* Initializes application. It is not mandatory to call this method directly.
|
||||
*
|
||||
* @returns {Promise}
|
||||
*/
|
||||
init(): Promise<this>;
|
||||
|
||||
/**
|
||||
* A wrapper function around HTTP adapter method: `adapter.use()`.
|
||||
* Example `app.use(cors())`
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nestjs/common",
|
||||
"version": "6.0.5",
|
||||
"version": "6.3.1",
|
||||
"description": "Nest - modern, fast, powerful node.js web framework (@common)",
|
||||
"author": "Kamil Mysliwiec",
|
||||
"repository": {
|
||||
@@ -12,7 +12,7 @@
|
||||
},
|
||||
"license": "MIT",
|
||||
"dependencies": {
|
||||
"axios": "0.18.0",
|
||||
"axios": "0.19.0",
|
||||
"cli-color": "1.4.0",
|
||||
"uuid": "3.3.2"
|
||||
},
|
||||
|
||||
@@ -1,2 +1,3 @@
|
||||
export * from './validation.pipe';
|
||||
export * from './parse-int.pipe';
|
||||
export * from './parse-uuid.pipe';
|
||||
export * from './validation.pipe';
|
||||
|
||||
31
packages/common/pipes/parse-uuid.pipe.ts
Normal file
31
packages/common/pipes/parse-uuid.pipe.ts
Normal file
@@ -0,0 +1,31 @@
|
||||
import { Optional } from '../decorators';
|
||||
import { ArgumentMetadata, BadRequestException, Injectable } from '../index';
|
||||
import { PipeTransform } from '../interfaces/features/pipe-transform.interface';
|
||||
import { isUUID } from '../utils/is-uuid';
|
||||
|
||||
export interface ParseUUIDPipeOptions {
|
||||
version?: '3' | '4' | '5';
|
||||
exceptionFactory?: (errors: string) => any;
|
||||
}
|
||||
|
||||
@Injectable()
|
||||
export class ParseUUIDPipe implements PipeTransform<string> {
|
||||
private readonly version: '3' | '4' | '5';
|
||||
protected exceptionFactory: (errors: string) => any;
|
||||
|
||||
constructor(@Optional() options?: ParseUUIDPipeOptions) {
|
||||
options = options || {};
|
||||
|
||||
this.version = options.version;
|
||||
this.exceptionFactory =
|
||||
options.exceptionFactory || (error => new BadRequestException(error));
|
||||
}
|
||||
async transform(value: string, metadata: ArgumentMetadata): Promise<string> {
|
||||
if (!isUUID(value, this.version)) {
|
||||
throw this.exceptionFactory(
|
||||
`Validation failed (uuid v${this.version} is expected)`,
|
||||
);
|
||||
}
|
||||
return value;
|
||||
}
|
||||
}
|
||||
@@ -1,6 +1,10 @@
|
||||
import { Optional } from '../decorators';
|
||||
import { Injectable } from '../decorators/core';
|
||||
import { ArgumentMetadata, BadRequestException, ValidationError } from '../index';
|
||||
import {
|
||||
ArgumentMetadata,
|
||||
BadRequestException,
|
||||
ValidationError,
|
||||
} from '../index';
|
||||
import { ClassTransformOptions } from '../interfaces/external/class-transform-options.interface';
|
||||
import { ValidatorOptions } from '../interfaces/external/validator-options.interface';
|
||||
import { PipeTransform } from '../interfaces/features/pipe-transform.interface';
|
||||
@@ -12,6 +16,7 @@ export interface ValidationPipeOptions extends ValidatorOptions {
|
||||
disableErrorMessages?: boolean;
|
||||
transformOptions?: ClassTransformOptions;
|
||||
exceptionFactory?: (errors: ValidationError[]) => any;
|
||||
validateCustomDecorators?: boolean;
|
||||
}
|
||||
|
||||
let classValidator: any = {};
|
||||
@@ -24,6 +29,7 @@ export class ValidationPipe implements PipeTransform<any> {
|
||||
protected validatorOptions: ValidatorOptions;
|
||||
protected transformOptions: ClassTransformOptions;
|
||||
protected exceptionFactory: (errors: ValidationError[]) => any;
|
||||
protected validateCustomDecorators: boolean;
|
||||
|
||||
constructor(@Optional() options?: ValidationPipeOptions) {
|
||||
options = options || {};
|
||||
@@ -31,12 +37,14 @@ export class ValidationPipe implements PipeTransform<any> {
|
||||
transform,
|
||||
disableErrorMessages,
|
||||
transformOptions,
|
||||
validateCustomDecorators,
|
||||
...validatorOptions
|
||||
} = options;
|
||||
this.isTransformEnabled = !!transform;
|
||||
this.validatorOptions = validatorOptions;
|
||||
this.transformOptions = transformOptions;
|
||||
this.isDetailedOutputDisabled = disableErrorMessages;
|
||||
this.validateCustomDecorators = validateCustomDecorators || false;
|
||||
this.exceptionFactory =
|
||||
options.exceptionFactory ||
|
||||
(errors =>
|
||||
@@ -57,10 +65,13 @@ export class ValidationPipe implements PipeTransform<any> {
|
||||
if (!metatype || !this.toValidate(metadata)) {
|
||||
return value;
|
||||
}
|
||||
value = this.toEmptyIfNil(value);
|
||||
|
||||
this.stripProtoKeys(value);
|
||||
const entity = classTransformer.plainToClass(
|
||||
metatype,
|
||||
this.toEmptyIfNil(value),
|
||||
this.transformOptions
|
||||
value,
|
||||
this.transformOptions,
|
||||
);
|
||||
const errors = await classValidator.validate(entity, this.validatorOptions);
|
||||
if (errors.length > 0) {
|
||||
@@ -69,20 +80,28 @@ export class ValidationPipe implements PipeTransform<any> {
|
||||
return this.isTransformEnabled
|
||||
? entity
|
||||
: Object.keys(this.validatorOptions).length > 0
|
||||
? classTransformer.classToPlain(entity, this.transformOptions)
|
||||
: value;
|
||||
? classTransformer.classToPlain(entity, this.transformOptions)
|
||||
: value;
|
||||
}
|
||||
|
||||
private toValidate(metadata: ArgumentMetadata): boolean {
|
||||
const { metatype, type } = metadata;
|
||||
if (type === 'custom') {
|
||||
if (type === 'custom' && !this.validateCustomDecorators) {
|
||||
return false;
|
||||
}
|
||||
const types = [String, Boolean, Number, Array, Object];
|
||||
return !types.some(t => metatype === t) && !isNil(metatype);
|
||||
}
|
||||
|
||||
toEmptyIfNil<T = any, R = any>(value: T): R | {} {
|
||||
private toEmptyIfNil<T = any, R = any>(value: T): R | {} {
|
||||
return isNil(value) ? {} : value;
|
||||
}
|
||||
|
||||
private stripProtoKeys(value: Record<string, any>) {
|
||||
delete value.__proto__;
|
||||
const keys = Object.keys(value);
|
||||
keys
|
||||
.filter(key => typeof value[key] === 'object' && value[key])
|
||||
.forEach(key => this.stripProtoKeys(value[key]));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -88,5 +88,24 @@ describe('createParamDecorator', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('when class type passed as data', () => {
|
||||
class Data { }
|
||||
class Test {
|
||||
public test(
|
||||
@Decorator(Data) prop,
|
||||
) { }
|
||||
}
|
||||
|
||||
it('should return class type as data parameter', () => {
|
||||
const metadata = Reflect.getMetadata(
|
||||
ROUTE_ARGS_METADATA,
|
||||
Test,
|
||||
'test',
|
||||
);
|
||||
const key = Object.keys(metadata)[0];
|
||||
expect(metadata[key].data).to.equal(Data);
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
47
packages/common/test/exceptions/http.exception.spec.ts
Normal file
47
packages/common/test/exceptions/http.exception.spec.ts
Normal file
@@ -0,0 +1,47 @@
|
||||
import { expect } from 'chai';
|
||||
import { BadRequestException, HttpException, NotFoundException } from '../../exceptions';
|
||||
|
||||
describe('HttpException', () => {
|
||||
it('should return a message as a string when input is a string', () => {
|
||||
const message: string = 'My error message';
|
||||
expect(new HttpException(message, 404).message).to.be.eql('My error message');
|
||||
});
|
||||
|
||||
it('should return a message as an object when input is an object', () => {
|
||||
const message: object = {
|
||||
msg: 'My error message',
|
||||
reason: 'this can be a human readable reason',
|
||||
anything: 'else',
|
||||
};
|
||||
expect(new HttpException(message, 404).message).to.be.eql(message);
|
||||
});
|
||||
|
||||
it('should return a message from a built-in exception as an object', () => {
|
||||
const message: string = 'My error message';
|
||||
expect(new BadRequestException(message).message).to.be.eql({
|
||||
statusCode: 400,
|
||||
error: 'Bad Request',
|
||||
message: 'My error message',
|
||||
});
|
||||
});
|
||||
|
||||
it('should return an object even when the message is undefined', () => {
|
||||
expect(new BadRequestException().message).to.be.eql({statusCode: 400, error: 'Bad Request'});
|
||||
});
|
||||
|
||||
it('should return a status code', () => {
|
||||
expect(new BadRequestException().getStatus()).to.be.eql(400);
|
||||
expect(new NotFoundException().getStatus()).to.be.eql(404);
|
||||
});
|
||||
|
||||
it('should return a response', () => {
|
||||
expect(new BadRequestException().getResponse()).to.be.eql({
|
||||
error: 'Bad Request',
|
||||
statusCode: 400,
|
||||
});
|
||||
expect(new NotFoundException().getResponse()).to.be.eql({
|
||||
error: 'Not Found',
|
||||
statusCode: 404,
|
||||
});
|
||||
});
|
||||
});
|
||||
66
packages/common/test/pipes/parse-uuid.pipe.spec.ts
Normal file
66
packages/common/test/pipes/parse-uuid.pipe.spec.ts
Normal file
@@ -0,0 +1,66 @@
|
||||
import { expect } from 'chai';
|
||||
import * as sinon from 'sinon';
|
||||
import { ArgumentMetadata } from '../../interfaces';
|
||||
import { ParseUUIDPipe } from '../../pipes/parse-uuid.pipe';
|
||||
|
||||
describe('ParseUUIDPipe', () => {
|
||||
let target: ParseUUIDPipe;
|
||||
|
||||
describe('transform', () => {
|
||||
const v3 = 'e8b5a51d-11c8-3310-a6ab-367563f20686';
|
||||
const v4 = '10ba038e-48da-487b-96e8-8d3b99b6d18a';
|
||||
const v5 = '630eb68f-e0fa-5ecc-887a-7c7a62614681';
|
||||
|
||||
describe('when validation passes', () => {
|
||||
it('should return string if value is uuid v3, v4 or v5', async () => {
|
||||
target = new ParseUUIDPipe();
|
||||
expect(await target.transform(v3, {} as ArgumentMetadata)).to.equal(v3);
|
||||
expect(await target.transform(v4, {} as ArgumentMetadata)).to.equal(v4);
|
||||
expect(await target.transform(v5, {} as ArgumentMetadata)).to.equal(v5);
|
||||
});
|
||||
|
||||
it('should return string if value is uuid v3', async () => {
|
||||
target = new ParseUUIDPipe({ version: '3' });
|
||||
expect(await target.transform(v3, {} as ArgumentMetadata)).to.equal(v3);
|
||||
});
|
||||
|
||||
it('should return string if value is uuid v4', async () => {
|
||||
target = new ParseUUIDPipe({ version: '4' });
|
||||
expect(await target.transform(v4, {} as ArgumentMetadata)).to.equal(v4);
|
||||
});
|
||||
|
||||
it('should return string if value is uuid v5', async () => {
|
||||
target = new ParseUUIDPipe({ version: '5' });
|
||||
expect(await target.transform(v5, {} as ArgumentMetadata)).to.equal(v5);
|
||||
});
|
||||
});
|
||||
|
||||
describe('when validation fails', () => {
|
||||
it('should throw an error', async () => {
|
||||
target = new ParseUUIDPipe();
|
||||
expect(target.transform('123a', {} as ArgumentMetadata)).to.be.rejected;
|
||||
});
|
||||
|
||||
it('should throw an error - v3', async () => {
|
||||
target = new ParseUUIDPipe({ version: '3' });
|
||||
expect(target.transform('123a', {} as ArgumentMetadata)).to.be.rejected;
|
||||
expect(target.transform(v4, {} as ArgumentMetadata)).to.be.rejected;
|
||||
expect(target.transform(v5, {} as ArgumentMetadata)).to.be.rejected;
|
||||
});
|
||||
|
||||
it('should throw an error - v4', async () => {
|
||||
target = new ParseUUIDPipe({ version: '4' });
|
||||
expect(target.transform('123a', {} as ArgumentMetadata)).to.be.rejected;
|
||||
expect(target.transform(v3, {} as ArgumentMetadata)).to.be.rejected;
|
||||
expect(target.transform(v5, {} as ArgumentMetadata)).to.be.rejected;
|
||||
});
|
||||
|
||||
it('should throw an error - v5 ', async () => {
|
||||
target = new ParseUUIDPipe({ version: '4' });
|
||||
expect(target.transform('123a', {} as ArgumentMetadata)).to.be.rejected;
|
||||
expect(target.transform(v3, {} as ArgumentMetadata)).to.be.rejected;
|
||||
expect(target.transform(v4, {} as ArgumentMetadata)).to.be.rejected;
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -26,6 +26,10 @@ class TestModel {
|
||||
@IsString() public prop1: string;
|
||||
|
||||
@IsString() public prop2: string;
|
||||
|
||||
@IsOptional()
|
||||
@IsString()
|
||||
public optionalProp: string;
|
||||
}
|
||||
|
||||
describe('ValidationPipe', () => {
|
||||
@@ -46,13 +50,34 @@ describe('ValidationPipe', () => {
|
||||
beforeEach(() => {
|
||||
target = new ValidationPipe();
|
||||
});
|
||||
it('should return the value unchanged', async () => {
|
||||
it('should return the value unchanged if optional value is not defined', async () => {
|
||||
const testObj = { prop1: 'value1', prop2: 'value2' };
|
||||
expect(await target.transform(testObj, {} as any)).to.equal(testObj);
|
||||
expect(
|
||||
await target.transform(testObj, metadata as any),
|
||||
).to.not.be.instanceOf(TestModel);
|
||||
});
|
||||
it('should return the value unchanged if optional value is set undefined', async () => {
|
||||
const testObj = { prop1: 'value1', prop2: 'value2', optionalProp: undefined };
|
||||
expect(await target.transform(testObj, {} as any)).to.equal(testObj);
|
||||
expect(
|
||||
await target.transform(testObj, metadata as any),
|
||||
).to.not.be.instanceOf(TestModel);
|
||||
});
|
||||
it('should return the value unchanged if optional value is null', async () => {
|
||||
const testObj = { prop1: 'value1', prop2: 'value2', optionalProp: null };
|
||||
expect(await target.transform(testObj, {} as any)).to.equal(testObj);
|
||||
expect(
|
||||
await target.transform(testObj, metadata as any),
|
||||
).to.not.be.instanceOf(TestModel);
|
||||
});
|
||||
it('should return the value unchanged if optional value is set', async () => {
|
||||
const testObj = { prop1: 'value1', prop2: 'value2', optionalProp: 'optional value' };
|
||||
expect(await target.transform(testObj, {} as any)).to.equal(testObj);
|
||||
expect(
|
||||
await target.transform(testObj, metadata as any),
|
||||
).to.not.be.instanceOf(TestModel);
|
||||
});
|
||||
});
|
||||
describe('when validation fails', () => {
|
||||
beforeEach(() => {
|
||||
@@ -134,6 +159,48 @@ describe('ValidationPipe', () => {
|
||||
expect(
|
||||
await target.transform(testObj, metadata),
|
||||
).to.not.have.property('prop3');
|
||||
expect(
|
||||
await target.transform(testObj, metadata),
|
||||
).to.not.have.property('optionalProp');
|
||||
});
|
||||
it('should return a plain object without extra properties if optional prop is defined', async () => {
|
||||
target = new ValidationPipe({ transform: false, whitelist: true });
|
||||
const testObj = { prop1: 'value1', prop2: 'value2', prop3: 'value3', optionalProp: 'optional value' };
|
||||
expect(
|
||||
await target.transform(testObj, metadata),
|
||||
).to.not.be.instanceOf(TestModel);
|
||||
expect(
|
||||
await target.transform(testObj, metadata),
|
||||
).to.not.have.property('prop3');
|
||||
expect(
|
||||
await target.transform(testObj, metadata),
|
||||
).to.have.property('optionalProp');
|
||||
});
|
||||
it('should return a plain object without extra properties if optional prop is undefined', async () => {
|
||||
target = new ValidationPipe({ transform: false, whitelist: true });
|
||||
const testObj = { prop1: 'value1', prop2: 'value2', prop3: 'value3', optionalProp: undefined };
|
||||
expect(
|
||||
await target.transform(testObj, metadata),
|
||||
).to.not.be.instanceOf(TestModel);
|
||||
expect(
|
||||
await target.transform(testObj, metadata),
|
||||
).to.not.have.property('prop3');
|
||||
expect(
|
||||
await target.transform(testObj, metadata),
|
||||
).to.have.property('optionalProp');
|
||||
});
|
||||
it('should return a plain object without extra properties if optional prop is null', async () => {
|
||||
target = new ValidationPipe({ transform: false, whitelist: true });
|
||||
const testObj = { prop1: 'value1', prop2: 'value2', prop3: 'value3', optionalProp: null };
|
||||
expect(
|
||||
await target.transform(testObj, metadata),
|
||||
).to.not.be.instanceOf(TestModel);
|
||||
expect(
|
||||
await target.transform(testObj, metadata),
|
||||
).to.not.have.property('prop3');
|
||||
expect(
|
||||
await target.transform(testObj, metadata),
|
||||
).to.have.property('optionalProp');
|
||||
});
|
||||
});
|
||||
describe('when validation rejects', () => {
|
||||
|
||||
16
packages/common/utils/is-uuid.ts
Normal file
16
packages/common/utils/is-uuid.ts
Normal file
@@ -0,0 +1,16 @@
|
||||
import { BadRequestException } from '../exceptions';
|
||||
|
||||
const uuid = {
|
||||
3: /^[0-9A-F]{8}-[0-9A-F]{4}-3[0-9A-F]{3}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
|
||||
4: /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
|
||||
5: /^[0-9A-F]{8}-[0-9A-F]{4}-5[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i,
|
||||
all: /^[0-9A-F]{8}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{4}-[0-9A-F]{12}$/i,
|
||||
};
|
||||
|
||||
export function isUUID(str: any, version = 'all') {
|
||||
if (typeof str !== 'string') {
|
||||
throw new BadRequestException('The value passed as UUID is not a string');
|
||||
}
|
||||
const pattern = uuid[version];
|
||||
return pattern && pattern.test(str);
|
||||
}
|
||||
@@ -14,7 +14,7 @@
|
||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/core.svg" alt="NPM Downloads" /></a>
|
||||
<a href="https://travis-ci.org/nestjs/nest" target="_blank"><img src="https://api.travis-ci.org/nestjs/nest.svg?branch=master" alt="Travis" /></a>
|
||||
<a href="https://travis-ci.org/nestjs/nest" target="_blank"><img src="https://img.shields.io/travis/nestjs/nest/master.svg?label=linux" alt="Linux" /></a>
|
||||
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#8" alt="Coverage" /></a>
|
||||
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a>
|
||||
<a href="https://gitter.im/nestjs/nestjs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge" target="_blank"><img src="https://badges.gitter.im/nestjs/nestjs.svg" alt="Gitter" /></a>
|
||||
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
|
||||
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
|
||||
@@ -53,30 +53,32 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
|
||||
|
||||
<a href="https://valor-software.com/" target="_blank"><img src="https://docs.nestjs.com/assets/sponsors/valor-software.png" width="320" /></a>
|
||||
|
||||
#### Base Sponsor
|
||||
|
||||
<a href="https://blueanchor.io/" target="_blank"><img src="https://nestjs.com/img/blueanchor.png" width="300" /></a>
|
||||
<a href="https://www.novologic.com/" target="_blank"><img src="https://nestjs.com/img/novologic.png" width="200" /></a>
|
||||
|
||||
#### Silver Sponsors
|
||||
<a href="https://neoteric.eu/" target="_blank"><img src="https://nestjs.com/img/neoteric-cut.png" width="120" valign="middle" /></a>
|
||||
<a href="http://gojob.com" target="_blank"><img src="http://nestjs.com/img/gojob-logo.png" valign="middle" height="95" /></a> <a href="https://www.swingdev.io" target="_blank"><img src="https://nestjs.com/img/swingdev-logo.svg#1" width="150" valign="middle" /> </a>
|
||||
<a href="https://yakaz.com/" target="_blank"><img src="https://nestjs.com/img/yakaz.png" width="100" valign="middle" /></a>
|
||||
<a href="https://trilon.io" target="_blank"><img src="https://nestjs.com/img/trilon.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://xtremis.com/" target="_blank"><img src="https://nestjs.com/img/logo-xtremis.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://gojob.com" target="_blank"><img src="http://nestjs.com/img/gojob-logo.png" valign="middle" height="95" /></a>
|
||||
<a href="https://trilon.io" target="_blank"><img src="https://nestjs.com/img/trilon.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://www.leogistics.com" target="_blank"><img src="https://nestjs.com/img/leogistics-logo.jpeg" width="150" valign="middle" /></a>
|
||||
|
||||
#### Sponsors
|
||||
|
||||
<a href="https://scal.io" target="_blank"><img src="https://nestjs.com/img/scalio-logo.svg" width="110" valign="middle" /></a> <a href="http://angularity.io" target="_blank"><img src="http://angularity.io/media/logo.svg" height="26" valign="middle" /></a> <!--<a href="https://keycdn.com"><img src="https://nestjs.com/img/keycdn.svg" height="30" /></a> --> <a href="https://hostpresto.com" target="_blank"><img src="https://nestjs.com/img/hostpresto.png" height="30" valign="middle" /></a> <a href="https://genuinebee.com/" target="_blank"><img src="https://nestjs.com/img/genuinebee.svg" height="36" valign="middle" /></a> <a href="http://architectnow.net/" target="_blank"><img src="https://nestjs.com/img/architectnow.png" height="24" valign="middle" /></a> <a href="https://quander.io/" target="_blank"><img src="https://nestjs.com/img/quander.png" height="28" valign="middle" /></a> <a href="https://mantro.net/" target="_blank"><img src="https://nestjs.com/img/mantro-logo.svg" height="20" valign="middle" /></a>
|
||||
<a href="https://www.swingdev.io" target="_blank"><img src="https://nestjs.com/img/swingdev-logo.svg#1" width="125" valign="middle" /> </a> <a href="https://blueanchor.io/" target="_blank"><img src="https://nestjs.com/img/blueanchor.png" width="180" valign="middle" /></a>
|
||||
<a href="https://www.novologic.com/" target="_blank"><img src="https://nestjs.com/img/novologic.png" width="130" valign="middle" /></a>
|
||||
<a href="https://scal.io" target="_blank"><img src="https://nestjs.com/img/scalio-logo.svg" width="100" valign="middle" /></a> <a href="http://angularity.io" target="_blank"><img src="http://angularity.io/media/logo.svg" height="26" valign="middle" /></a> <!--<a href="https://keycdn.com"><img src="https://nestjs.com/img/keycdn.svg" height="30" /></a> --> <a href="https://hostpresto.com" target="_blank"><img src="https://nestjs.com/img/hostpresto.png" height="30" valign="middle" /></a>
|
||||
|
||||
<a href="https://triplebyte.com/" target="_blank"><img src="https://nestjs.com/img/triplebyte.png" height="30" valign="middle" /></a>
|
||||
<a href="https://genuinebee.com/" target="_blank"><img src="https://nestjs.com/img/genuinebee.svg" height="36" valign="middle" /></a> <a href="http://architectnow.net/" target="_blank"><img src="https://nestjs.com/img/architectnow.png" height="24" valign="middle" /></a> <a href="https://quander.io/" target="_blank"><img src="https://nestjs.com/img/quander.png" height="28" valign="middle" /></a> <a href="https://mantro.net/" target="_blank"><img src="https://nestjs.com/img/mantro-logo.svg" height="20" valign="middle" /></a> <a href="https://triplebyte.com/" target="_blank"><img src="https://nestjs.com/img/triplebyte.png" height="30" valign="middle" /></a>
|
||||
<a href="https://ever.co/" target="_blank"><img src="https://nestjs.com/img/ever-logo.png" height="20" valign="middle" /></a>
|
||||
<a href="https://buddy.works/" target="_blank"><img src="https://nestjs.com/img/buddy-logo.svg" height="35" valign="middle" /></a>
|
||||
<a href="https://buddy.works/" target="_blank"><img src="https://nestjs.com/img/buddy-logo.svg" height="35" valign="middle" /></a>
|
||||
<a href="https://blokt.com" target="_blank"><img src="https://nestjs.com/img/blokt-logo.png" height="31" valign="middle" /></a>
|
||||
<a href="https://reposit.co.uk/" target="_blank"><img src="https://nestjs.com/img/reposit-logo.png" height="28" valign="middle" /></a> <a href="https://yakaz.com/" target="_blank"><img src="https://nestjs.com/img/yakaz.png" width="80" valign="middle" /></a>
|
||||
<a href="https://nearpod.com/" target="_blank"><img src="https://nestjs.com/img/nearpod-logo.svg" width="120" valign="middle" /></a>
|
||||
<a href="https://clay.global/" target="_blank"><img src="https://nestjs.com/img/clay-logo.svg" width="90" valign="middle" /></a>
|
||||
<a href="http://xtremis.com/" target="_blank"><img src="https://nestjs.com/img/logo-xtremis.svg" width="145" valign="middle" /></a>
|
||||
|
||||
|
||||
|
||||
## Backers
|
||||
|
||||
<a href="https://opencollective.com/nest" target="_blank"><img src="https://opencollective.com/nest/backers.svg?width=890"></a>
|
||||
<a href="https://opencollective.com/nest" target="_blank"><img src="https://opencollective.com/nest/backers.svg?width=1600"></a>
|
||||
|
||||
## Stay in touch
|
||||
|
||||
|
||||
@@ -1,24 +1,31 @@
|
||||
import { ExceptionHandler } from './exception-handler';
|
||||
import { UNHANDLED_RUNTIME_EXCEPTION } from './messages';
|
||||
|
||||
const DEFAULT_TEARDOWN = () => process.exit(1);
|
||||
|
||||
export class ExceptionsZone {
|
||||
private static readonly exceptionHandler = new ExceptionHandler();
|
||||
|
||||
public static run(fn: () => void) {
|
||||
public static run(
|
||||
callback: () => void,
|
||||
teardown: (err: any) => void = DEFAULT_TEARDOWN,
|
||||
) {
|
||||
try {
|
||||
fn();
|
||||
callback();
|
||||
} catch (e) {
|
||||
this.exceptionHandler.handle(e);
|
||||
throw UNHANDLED_RUNTIME_EXCEPTION;
|
||||
teardown(e);
|
||||
}
|
||||
}
|
||||
|
||||
public static async asyncRun(fn: () => Promise<void>) {
|
||||
public static async asyncRun(
|
||||
callback: () => Promise<void>,
|
||||
teardown: (err: any) => void = DEFAULT_TEARDOWN,
|
||||
) {
|
||||
try {
|
||||
await fn();
|
||||
await callback();
|
||||
} catch (e) {
|
||||
this.exceptionHandler.handle(e);
|
||||
throw UNHANDLED_RUNTIME_EXCEPTION;
|
||||
teardown(e);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -40,6 +40,12 @@ export interface ExternalHandlerMetadata {
|
||||
) => (ParamProperties & { metatype?: any })[];
|
||||
}
|
||||
|
||||
export interface ExternalContextOptions {
|
||||
guards?: boolean;
|
||||
interceptors?: boolean;
|
||||
filters?: boolean;
|
||||
}
|
||||
|
||||
export class ExternalContextCreator {
|
||||
private readonly contextUtils = new ContextUtils();
|
||||
private readonly externalErrorProxy = new ExternalErrorProxy();
|
||||
@@ -98,6 +104,11 @@ export class ExternalContextCreator {
|
||||
paramsFactory?: ParamsFactory,
|
||||
contextId = STATIC_CONTEXT,
|
||||
inquirerId?: string,
|
||||
options: ExternalContextOptions = {
|
||||
interceptors: true,
|
||||
guards: true,
|
||||
filters: true,
|
||||
},
|
||||
) {
|
||||
const module = this.findContextModuleName(instance.constructor);
|
||||
const { argsLength, paramtypes, getParamsMetadata } = this.getMetadata<T>(
|
||||
@@ -106,7 +117,6 @@ export class ExternalContextCreator {
|
||||
metadataKey,
|
||||
paramsFactory,
|
||||
);
|
||||
|
||||
const pipes = this.pipesContextCreator.create(
|
||||
instance,
|
||||
callback,
|
||||
@@ -114,7 +124,6 @@ export class ExternalContextCreator {
|
||||
contextId,
|
||||
inquirerId,
|
||||
);
|
||||
|
||||
const guards = this.guardsContextCreator.create(
|
||||
instance,
|
||||
callback,
|
||||
@@ -122,13 +131,6 @@ export class ExternalContextCreator {
|
||||
contextId,
|
||||
inquirerId,
|
||||
);
|
||||
const interceptors = this.interceptorsContextCreator.create(
|
||||
instance,
|
||||
callback,
|
||||
module,
|
||||
contextId,
|
||||
inquirerId,
|
||||
);
|
||||
const exceptionFilter = this.filtersContextCreator.create(
|
||||
instance,
|
||||
callback,
|
||||
@@ -136,12 +138,24 @@ export class ExternalContextCreator {
|
||||
contextId,
|
||||
inquirerId,
|
||||
);
|
||||
const interceptors = options.interceptors
|
||||
? this.interceptorsContextCreator.create(
|
||||
instance,
|
||||
callback,
|
||||
module,
|
||||
contextId,
|
||||
inquirerId,
|
||||
)
|
||||
: [];
|
||||
|
||||
const paramsMetadata = getParamsMetadata(module, contextId, inquirerId);
|
||||
const paramsOptions = paramsMetadata
|
||||
? this.contextUtils.mergeParamsMetatypes(paramsMetadata, paramtypes)
|
||||
: [];
|
||||
|
||||
const fnCanActivate = options.guards
|
||||
? this.createGuardsFn(guards, instance, callback)
|
||||
: null;
|
||||
const fnApplyPipes = this.createPipesFn(pipes, paramsOptions);
|
||||
const handler = (initialArgs: any[], ...args: any[]) => async () => {
|
||||
if (fnApplyPipes) {
|
||||
@@ -153,15 +167,8 @@ export class ExternalContextCreator {
|
||||
|
||||
const target = async (...args: any[]) => {
|
||||
const initialArgs = this.contextUtils.createNullArray(argsLength);
|
||||
const canActivate = await this.guardsConsumer.tryActivate(
|
||||
guards,
|
||||
args,
|
||||
instance,
|
||||
callback,
|
||||
);
|
||||
if (!canActivate) {
|
||||
throw new ForbiddenException(FORBIDDEN_MESSAGE);
|
||||
}
|
||||
fnCanActivate && (await fnCanActivate(args));
|
||||
|
||||
const result = await this.interceptorsConsumer.intercept(
|
||||
interceptors,
|
||||
args,
|
||||
@@ -171,7 +178,9 @@ export class ExternalContextCreator {
|
||||
);
|
||||
return this.transformToResult(result);
|
||||
};
|
||||
return this.externalErrorProxy.createProxy(target, exceptionFilter);
|
||||
return options.filters
|
||||
? this.externalErrorProxy.createProxy(target, exceptionFilter)
|
||||
: target;
|
||||
}
|
||||
|
||||
public getMetadata<T>(
|
||||
@@ -328,4 +337,23 @@ export class ExternalContextCreator {
|
||||
}
|
||||
return resultOrDeffered;
|
||||
}
|
||||
|
||||
public createGuardsFn(
|
||||
guards: any[],
|
||||
instance: Controller,
|
||||
callback: (...args: any[]) => any,
|
||||
): Function | null {
|
||||
const canActivateFn = async (args: any[]) => {
|
||||
const canActivate = await this.guardsConsumer.tryActivate(
|
||||
guards,
|
||||
args,
|
||||
instance,
|
||||
callback,
|
||||
);
|
||||
if (!canActivate) {
|
||||
throw new ForbiddenException(FORBIDDEN_MESSAGE);
|
||||
}
|
||||
};
|
||||
return guards.length ? canActivateFn : null;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -80,7 +80,7 @@ export class Injector {
|
||||
}
|
||||
const loadInstance = (instances: any[]) => {
|
||||
targetWrapper.instance = targetWrapper.isDependencyTreeStatic()
|
||||
? new metatype(...instances)
|
||||
? new (metatype as Type<any>)(...instances)
|
||||
: Object.create(metatype.prototype);
|
||||
};
|
||||
await this.resolveConstructorParams(
|
||||
@@ -190,7 +190,7 @@ export class Injector {
|
||||
throw new RuntimeException();
|
||||
}
|
||||
if (instanceHost.isResolved) {
|
||||
return;
|
||||
return done();
|
||||
}
|
||||
const callback = async (instances: any[]) => {
|
||||
const properties = await this.resolveProperties(
|
||||
@@ -235,10 +235,10 @@ export class Injector {
|
||||
return callback(deps);
|
||||
}
|
||||
const dependencies = isNil(inject)
|
||||
? this.reflectConstructorParams(wrapper.metatype)
|
||||
? this.reflectConstructorParams(wrapper.metatype as Type<any>)
|
||||
: inject;
|
||||
const optionalDependenciesIds = isNil(inject)
|
||||
? this.reflectOptionalParams(wrapper.metatype)
|
||||
? this.reflectOptionalParams(wrapper.metatype as Type<any>)
|
||||
: [];
|
||||
|
||||
let isResolved = true;
|
||||
@@ -444,12 +444,20 @@ export class Injector {
|
||||
moduleRegistry: any[] = [],
|
||||
contextId = STATIC_CONTEXT,
|
||||
inquirer?: InstanceWrapper,
|
||||
isTraversing?: boolean,
|
||||
): Promise<any> {
|
||||
let instanceWrapperRef: InstanceWrapper = null;
|
||||
|
||||
const imports = module.imports || new Set<Module>();
|
||||
const children = [...imports.values()].filter(item => item);
|
||||
const identity = (item: any) => item;
|
||||
|
||||
let children = [...imports.values()].filter(identity);
|
||||
if (isTraversing) {
|
||||
const contextModuleExports = module.exports;
|
||||
children = children.filter(child =>
|
||||
contextModuleExports.has(child.metatype && child.metatype.name),
|
||||
);
|
||||
}
|
||||
for (const relatedModule of children) {
|
||||
if (moduleRegistry.includes(relatedModule.id)) {
|
||||
continue;
|
||||
@@ -464,6 +472,7 @@ export class Injector {
|
||||
moduleRegistry,
|
||||
contextId,
|
||||
inquirer,
|
||||
true,
|
||||
);
|
||||
if (instanceRef) {
|
||||
return instanceRef;
|
||||
@@ -504,7 +513,7 @@ export class Injector {
|
||||
if (metadata && contextId !== STATIC_CONTEXT) {
|
||||
return this.loadPropertiesMetadata(metadata, contextId, inquirer);
|
||||
}
|
||||
const properties = this.reflectProperties(wrapper.metatype);
|
||||
const properties = this.reflectProperties(wrapper.metatype as Type<any>);
|
||||
const instances = await Promise.all(
|
||||
properties.map(async (item: PropertyDependency) => {
|
||||
try {
|
||||
@@ -588,14 +597,12 @@ export class Injector {
|
||||
const isInContext = isStatic || isInRequestScope || isLazyTransient;
|
||||
|
||||
if (isNil(inject) && isInContext) {
|
||||
const targetInstance = wrapper.getInstanceByContextId(
|
||||
contextId,
|
||||
inquirerId,
|
||||
);
|
||||
|
||||
targetInstance.instance = wrapper.forwardRef
|
||||
? Object.assign(targetInstance.instance, new metatype(...instances))
|
||||
: new metatype(...instances);
|
||||
instanceHost.instance = wrapper.forwardRef
|
||||
? Object.assign(
|
||||
instanceHost.instance,
|
||||
new (metatype as Type<any>)(...instances),
|
||||
)
|
||||
: new (metatype as Type<any>)(...instances);
|
||||
} else if (isInContext) {
|
||||
const factoryReturnValue = ((targetMetatype.metatype as any) as Function)(
|
||||
...instances,
|
||||
|
||||
@@ -1,4 +1,9 @@
|
||||
import { Scope, Type } from '@nestjs/common';
|
||||
import { Provider, Scope, Type } from '@nestjs/common';
|
||||
import {
|
||||
ClassProvider,
|
||||
FactoryProvider,
|
||||
ValueProvider,
|
||||
} from '@nestjs/common/interfaces';
|
||||
import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util';
|
||||
import { isNil, isUndefined } from '@nestjs/common/utils/shared.utils';
|
||||
import { STATIC_CONTEXT } from './constants';
|
||||
@@ -30,11 +35,11 @@ interface InstanceMetadataStore {
|
||||
|
||||
export class InstanceWrapper<T = any> {
|
||||
public readonly name: any;
|
||||
public readonly metatype: Type<T>;
|
||||
public readonly inject?: (string | symbol | Function | Type<any>)[];
|
||||
public readonly async?: boolean;
|
||||
public readonly host?: Module;
|
||||
public readonly scope?: Scope = Scope.DEFAULT;
|
||||
public metatype: Type<T> | Function;
|
||||
public inject?: (string | symbol | Function | Type<any>)[];
|
||||
public forwardRef?: boolean;
|
||||
|
||||
private readonly values = new WeakMap<ContextId, InstancePerContext<T>>();
|
||||
@@ -293,6 +298,24 @@ export class InstanceWrapper<T = any> {
|
||||
.filter(item => !!item);
|
||||
}
|
||||
|
||||
public mergeWith(provider: Provider) {
|
||||
if ((provider as ValueProvider).useValue) {
|
||||
this.metatype = null;
|
||||
this.inject = null;
|
||||
this.setInstanceByContextId(STATIC_CONTEXT, {
|
||||
instance: (provider as ValueProvider).useValue,
|
||||
isResolved: true,
|
||||
isPending: false,
|
||||
});
|
||||
} else if ((provider as ClassProvider).useClass) {
|
||||
this.inject = null;
|
||||
this.metatype = (provider as ClassProvider).useClass;
|
||||
} else if ((provider as FactoryProvider).useFactory) {
|
||||
this.metatype = (provider as FactoryProvider).useFactory;
|
||||
this.inject = (provider as FactoryProvider).inject || [];
|
||||
}
|
||||
}
|
||||
|
||||
private isNewable(): boolean {
|
||||
return isNil(this.inject) && this.metatype && this.metatype.prototype;
|
||||
}
|
||||
|
||||
@@ -2,10 +2,15 @@ import { Scope } from '@nestjs/common';
|
||||
import { SCOPE_OPTIONS_METADATA } from '@nestjs/common/constants';
|
||||
import {
|
||||
Abstract,
|
||||
ClassProvider,
|
||||
Controller,
|
||||
DynamicModule,
|
||||
ExistingProvider,
|
||||
FactoryProvider,
|
||||
Injectable,
|
||||
NestModule,
|
||||
Provider,
|
||||
ValueProvider,
|
||||
} from '@nestjs/common/interfaces';
|
||||
import { Type } from '@nestjs/common/interfaces/type.interface';
|
||||
import { randomStringGenerator } from '@nestjs/common/utils/random-string-generator.util';
|
||||
@@ -23,32 +28,9 @@ import { NestContainer } from './container';
|
||||
import { InstanceWrapper } from './instance-wrapper';
|
||||
import { ModuleRef } from './module-ref';
|
||||
|
||||
export interface CustomProvider {
|
||||
provide: any;
|
||||
name: string;
|
||||
interface ProviderName {
|
||||
name?: string | symbol;
|
||||
}
|
||||
export type OpaqueToken =
|
||||
| string
|
||||
| symbol
|
||||
| Type<any>
|
||||
| Function
|
||||
| Abstract<any>;
|
||||
|
||||
export type CustomClass = CustomProvider & {
|
||||
useClass: Type<any>;
|
||||
scope?: Scope;
|
||||
};
|
||||
export type CustomFactory = CustomProvider & {
|
||||
useFactory: (...args: any[]) => any;
|
||||
inject?: OpaqueToken[];
|
||||
scope?: Scope;
|
||||
};
|
||||
export type CustomValue = CustomProvider & { useValue: any };
|
||||
export type ProviderMetatype =
|
||||
| Type<Injectable>
|
||||
| CustomFactory
|
||||
| CustomValue
|
||||
| CustomClass;
|
||||
|
||||
export class Module {
|
||||
private readonly _id: string;
|
||||
@@ -186,7 +168,7 @@ export class Module {
|
||||
}
|
||||
}
|
||||
|
||||
public addProvider(provider: ProviderMetatype): string {
|
||||
public addProvider(provider: Provider): string {
|
||||
if (this.isCustomProvider(provider)) {
|
||||
return this.addCustomProvider(provider, this._providers);
|
||||
}
|
||||
@@ -205,13 +187,28 @@ export class Module {
|
||||
}
|
||||
|
||||
public isCustomProvider(
|
||||
provider: ProviderMetatype,
|
||||
): provider is CustomClass | CustomFactory | CustomValue {
|
||||
return !isNil((provider as CustomProvider).provide);
|
||||
provider: Provider,
|
||||
): provider is
|
||||
| ClassProvider
|
||||
| FactoryProvider
|
||||
| ValueProvider
|
||||
| ExistingProvider {
|
||||
return !isNil(
|
||||
(provider as
|
||||
| ClassProvider
|
||||
| FactoryProvider
|
||||
| ValueProvider
|
||||
| ExistingProvider).provide,
|
||||
);
|
||||
}
|
||||
|
||||
public addCustomProvider(
|
||||
provider: CustomFactory | CustomValue | CustomClass,
|
||||
provider: (
|
||||
| ClassProvider
|
||||
| FactoryProvider
|
||||
| ValueProvider
|
||||
| ExistingProvider) &
|
||||
ProviderName,
|
||||
collection: Map<string, any>,
|
||||
): string {
|
||||
const name = this.getProviderStaticToken(provider.provide) as string;
|
||||
@@ -225,20 +222,26 @@ export class Module {
|
||||
this.addCustomValue(provider, collection);
|
||||
} else if (this.isCustomFactory(provider)) {
|
||||
this.addCustomFactory(provider, collection);
|
||||
} else if (this.isCustomUseExisting(provider)) {
|
||||
this.addCustomUseExisting(provider, collection);
|
||||
}
|
||||
return name;
|
||||
}
|
||||
|
||||
public isCustomClass(provider: any): provider is CustomClass {
|
||||
return !isUndefined((provider as CustomClass).useClass);
|
||||
public isCustomClass(provider: any): provider is ClassProvider {
|
||||
return !isUndefined((provider as ClassProvider).useClass);
|
||||
}
|
||||
|
||||
public isCustomValue(provider: any): provider is CustomValue {
|
||||
return !isUndefined((provider as CustomValue).useValue);
|
||||
public isCustomValue(provider: any): provider is ValueProvider {
|
||||
return !isUndefined((provider as ValueProvider).useValue);
|
||||
}
|
||||
|
||||
public isCustomFactory(provider: any): provider is CustomFactory {
|
||||
return !isUndefined((provider as CustomFactory).useFactory);
|
||||
public isCustomFactory(provider: any): provider is FactoryProvider {
|
||||
return !isUndefined((provider as FactoryProvider).useFactory);
|
||||
}
|
||||
|
||||
public isCustomUseExisting(provider: any): provider is ExistingProvider {
|
||||
return !isUndefined((provider as ExistingProvider).useExisting);
|
||||
}
|
||||
|
||||
public isDynamicModule(exported: any): exported is DynamicModule {
|
||||
@@ -246,12 +249,12 @@ export class Module {
|
||||
}
|
||||
|
||||
public addCustomClass(
|
||||
provider: CustomClass,
|
||||
provider: ClassProvider & ProviderName,
|
||||
collection: Map<string, InstanceWrapper>,
|
||||
) {
|
||||
const { name, useClass, scope } = provider;
|
||||
collection.set(
|
||||
name,
|
||||
name as string,
|
||||
new InstanceWrapper({
|
||||
name,
|
||||
metatype: useClass,
|
||||
@@ -264,12 +267,12 @@ export class Module {
|
||||
}
|
||||
|
||||
public addCustomValue(
|
||||
provider: CustomValue,
|
||||
provider: ValueProvider & ProviderName,
|
||||
collection: Map<string, InstanceWrapper>,
|
||||
) {
|
||||
const { name, useValue: value } = provider;
|
||||
collection.set(
|
||||
name,
|
||||
name as string,
|
||||
new InstanceWrapper({
|
||||
name,
|
||||
metatype: null,
|
||||
@@ -282,12 +285,12 @@ export class Module {
|
||||
}
|
||||
|
||||
public addCustomFactory(
|
||||
provider: CustomFactory,
|
||||
provider: FactoryProvider & ProviderName,
|
||||
collection: Map<string, InstanceWrapper>,
|
||||
) {
|
||||
const { name, useFactory: factory, inject, scope } = provider;
|
||||
collection.set(
|
||||
name,
|
||||
name as string,
|
||||
new InstanceWrapper({
|
||||
name,
|
||||
metatype: factory as any,
|
||||
@@ -300,8 +303,26 @@ export class Module {
|
||||
);
|
||||
}
|
||||
|
||||
public addCustomUseExisting(
|
||||
provider: ExistingProvider & ProviderName,
|
||||
collection: Map<string, InstanceWrapper>,
|
||||
) {
|
||||
const { name, useExisting } = provider;
|
||||
collection.set(
|
||||
name as string,
|
||||
new InstanceWrapper({
|
||||
name,
|
||||
metatype: (instance => instance) as any,
|
||||
instance: null,
|
||||
isResolved: false,
|
||||
inject: [useExisting],
|
||||
host: this,
|
||||
}),
|
||||
);
|
||||
}
|
||||
|
||||
public addExportedProvider(
|
||||
provider: ProviderMetatype | string | symbol | DynamicModule,
|
||||
provider: Provider & ProviderName | string | symbol | DynamicModule,
|
||||
) {
|
||||
const addExportedUnit = (token: string | symbol) =>
|
||||
this._exports.add(this.validateExportedProvider(token));
|
||||
@@ -318,7 +339,11 @@ export class Module {
|
||||
}
|
||||
|
||||
public addCustomExportedProvider(
|
||||
provider: CustomFactory | CustomValue | CustomClass,
|
||||
provider:
|
||||
| FactoryProvider
|
||||
| ValueProvider
|
||||
| ClassProvider
|
||||
| ExistingProvider,
|
||||
) {
|
||||
const provide = provider.provide;
|
||||
if (isString(provide) || isSymbol(provide)) {
|
||||
@@ -365,9 +390,13 @@ export class Module {
|
||||
|
||||
public replace(toReplace: string | symbol | Type<any>, options: any) {
|
||||
if (options.isProvider && this.hasProvider(toReplace)) {
|
||||
return this.addProvider({ provide: toReplace, ...options });
|
||||
const name = this.getProviderStaticToken(toReplace);
|
||||
const originalProvider = this._providers.get(name);
|
||||
return originalProvider.mergeWith({ provide: toReplace, ...options });
|
||||
} else if (!options.isProvider && this.hasInjectable(toReplace)) {
|
||||
this.addInjectable({
|
||||
const name = this.getProviderStaticToken(toReplace);
|
||||
const originalInjectable = this._injectables.get(name);
|
||||
return originalInjectable.mergeWith({
|
||||
provide: toReplace,
|
||||
...options,
|
||||
});
|
||||
@@ -385,7 +414,7 @@ export class Module {
|
||||
}
|
||||
|
||||
public getProviderStaticToken(
|
||||
provider: string | symbol | Type<any>,
|
||||
provider: string | symbol | Type<any> | Abstract<any>,
|
||||
): string | symbol {
|
||||
return isFunction(provider)
|
||||
? (provider as Function).name
|
||||
@@ -425,7 +454,7 @@ export class Module {
|
||||
};
|
||||
}
|
||||
|
||||
private getClassScope(provider: ProviderMetatype): Scope {
|
||||
private getClassScope(provider: Provider): Scope {
|
||||
const metadata = Reflect.getMetadata(SCOPE_OPTIONS_METADATA, provider);
|
||||
return metadata && metadata.scope;
|
||||
}
|
||||
|
||||
@@ -23,6 +23,7 @@ export class NestApplicationContext implements INestApplicationContext {
|
||||
private readonly moduleTokenFactory = new ModuleTokenFactory();
|
||||
private readonly containerScanner: ContainerScanner;
|
||||
private readonly activeShutdownSignals: string[] = new Array<string>();
|
||||
protected isInitialized: boolean = false;
|
||||
|
||||
constructor(
|
||||
protected readonly container: NestContainer,
|
||||
@@ -63,9 +64,20 @@ export class NestApplicationContext implements INestApplicationContext {
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Initalizes the Nest application.
|
||||
* Calls the Nest lifecycle events.
|
||||
*
|
||||
* @returns {Promise<this>} The NestApplicationContext instance as Promise
|
||||
*/
|
||||
public async init(): Promise<this> {
|
||||
// Ignore if is already initialized
|
||||
if (this.isInitialized) return;
|
||||
|
||||
await this.callInitHook();
|
||||
await this.callBootstrapHook();
|
||||
|
||||
this.isInitialized = true;
|
||||
return this;
|
||||
}
|
||||
|
||||
|
||||
@@ -45,7 +45,6 @@ export class NestApplication extends NestApplicationContext
|
||||
private readonly routesResolver: Resolver;
|
||||
private readonly microservices: any[] = [];
|
||||
private httpServer: any;
|
||||
private isInitialized = false;
|
||||
|
||||
constructor(
|
||||
container: NestContainer,
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nestjs/core",
|
||||
"version": "6.0.5",
|
||||
"version": "6.3.1",
|
||||
"description": "Nest - modern, fast, powerful node.js web framework (@core)",
|
||||
"author": "Kamil Mysliwiec",
|
||||
"license": "MIT",
|
||||
@@ -22,7 +22,7 @@
|
||||
}
|
||||
},
|
||||
"dependencies": {
|
||||
"@nuxtjs/opencollective": "0.2.1",
|
||||
"@nuxtjs/opencollective": "0.2.2",
|
||||
"fast-safe-stringify": "2.0.6",
|
||||
"iterare": "1.1.2",
|
||||
"object-hash": "1.3.1",
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { BadRequestException, NotFoundException } from '@nestjs/common';
|
||||
import { MODULE_PATH } from '@nestjs/common/constants';
|
||||
import { HttpServer } from '@nestjs/common/interfaces';
|
||||
import { HttpServer, Type } from '@nestjs/common/interfaces';
|
||||
import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface';
|
||||
import { Logger } from '@nestjs/common/services/logger.service';
|
||||
import { ApplicationConfig } from '../application-config';
|
||||
@@ -60,7 +60,10 @@ export class RoutesResolver implements Resolver {
|
||||
) {
|
||||
routes.forEach(instanceWrapper => {
|
||||
const { metatype } = instanceWrapper;
|
||||
const path = this.routerBuilder.extractRouterPath(metatype, basePath);
|
||||
const path = this.routerBuilder.extractRouterPath(
|
||||
metatype as Type<any>,
|
||||
basePath,
|
||||
);
|
||||
const controllerName = metatype.name;
|
||||
|
||||
this.logger.log(CONTROLLER_MAPPING_MESSAGE(controllerName, path));
|
||||
|
||||
@@ -16,6 +16,7 @@ import {
|
||||
ClassProvider,
|
||||
FactoryProvider,
|
||||
ValueProvider,
|
||||
ExistingProvider,
|
||||
} from '@nestjs/common/interfaces';
|
||||
import { Controller } from '@nestjs/common/interfaces/controllers/controller.interface';
|
||||
import { Injectable } from '@nestjs/common/interfaces/injectable.interface';
|
||||
@@ -187,14 +188,15 @@ export class DependenciesScanner {
|
||||
component.prototype,
|
||||
this.reflectKeyMetadata.bind(this, component, metadataKey),
|
||||
);
|
||||
const flattenMethodsInjectables = methodsInjectables.reduce<any[]>(
|
||||
(a: any[], b) => a.concat(b),
|
||||
const flattenMethodsInjectables = methodsInjectables.reduce(
|
||||
(a: any[], b: any[]) => a.concat(b),
|
||||
[],
|
||||
);
|
||||
const injectables = [
|
||||
) as any[];
|
||||
const combinedInjectables = [
|
||||
...controllerInjectables,
|
||||
...flattenMethodsInjectables,
|
||||
].filter(isFunction);
|
||||
const injectables = Array.from(new Set(combinedInjectables));
|
||||
|
||||
injectables.forEach(injectable =>
|
||||
this.insertInjectable(injectable, token, component),
|
||||
@@ -255,7 +257,11 @@ export class DependenciesScanner {
|
||||
|
||||
public isCustomProvider(
|
||||
provider: Provider,
|
||||
): provider is ClassProvider | ValueProvider | FactoryProvider {
|
||||
): provider is
|
||||
| ClassProvider
|
||||
| ValueProvider
|
||||
| FactoryProvider
|
||||
| ExistingProvider {
|
||||
return provider && !isNil((provider as any).provide);
|
||||
}
|
||||
|
||||
@@ -266,8 +272,11 @@ export class DependenciesScanner {
|
||||
}
|
||||
const applyProvidersMap = this.getApplyProvidersMap();
|
||||
const providersKeys = Object.keys(applyProvidersMap);
|
||||
const type = (provider as ClassProvider | ValueProvider | FactoryProvider)
|
||||
.provide;
|
||||
const type = (provider as
|
||||
| ClassProvider
|
||||
| ValueProvider
|
||||
| FactoryProvider
|
||||
| ExistingProvider).provide;
|
||||
|
||||
if (!providersKeys.includes(type as string)) {
|
||||
return this.container.addProvider(provider as any, token);
|
||||
|
||||
@@ -1,16 +1,19 @@
|
||||
import * as sinon from 'sinon';
|
||||
import { expect } from 'chai';
|
||||
import * as sinon from 'sinon';
|
||||
import { ExceptionsZone } from '../../../errors/exceptions-zone';
|
||||
import { UNHANDLED_RUNTIME_EXCEPTION } from '../../../errors/messages';
|
||||
|
||||
describe('ExceptionsZone', () => {
|
||||
const rethrow = err => {
|
||||
throw err;
|
||||
};
|
||||
|
||||
describe('run', () => {
|
||||
let callback: sinon.SinonSpy;
|
||||
beforeEach(() => {
|
||||
callback = sinon.spy();
|
||||
});
|
||||
it('should call callback', () => {
|
||||
ExceptionsZone.run(callback as any);
|
||||
ExceptionsZone.run(callback as any, rethrow);
|
||||
expect(callback.called).to.be.true;
|
||||
});
|
||||
describe('when callback throws exception', () => {
|
||||
@@ -18,17 +21,15 @@ describe('ExceptionsZone', () => {
|
||||
handle: () => {},
|
||||
};
|
||||
let handleSpy: sinon.SinonSpy;
|
||||
beforeEach(() => {
|
||||
before(() => {
|
||||
(ExceptionsZone as any).exceptionHandler = exceptionHandler;
|
||||
handleSpy = sinon.spy(exceptionHandler, 'handle');
|
||||
});
|
||||
it('should call "handle" method of exceptionHandler and throws UNHANDLED_RUNTIME_EXCEPTION', () => {
|
||||
it('should call "handle" method of exceptionHandler and rethrows', () => {
|
||||
const throwsCallback = () => {
|
||||
throw 3;
|
||||
throw new Error('');
|
||||
};
|
||||
expect(() => ExceptionsZone.run(throwsCallback)).to.throws(
|
||||
UNHANDLED_RUNTIME_EXCEPTION,
|
||||
);
|
||||
expect(() => ExceptionsZone.run(throwsCallback, rethrow)).to.throws();
|
||||
expect(handleSpy.called).to.be.true;
|
||||
});
|
||||
});
|
||||
@@ -39,7 +40,7 @@ describe('ExceptionsZone', () => {
|
||||
callback = sinon.spy();
|
||||
});
|
||||
it('should call callback', async () => {
|
||||
await ExceptionsZone.asyncRun(callback as any);
|
||||
await ExceptionsZone.asyncRun(callback as any, rethrow);
|
||||
expect(callback.called).to.be.true;
|
||||
});
|
||||
describe('when callback throws exception', () => {
|
||||
@@ -47,16 +48,16 @@ describe('ExceptionsZone', () => {
|
||||
handle: () => {},
|
||||
};
|
||||
let handleSpy: sinon.SinonSpy;
|
||||
beforeEach(() => {
|
||||
before(() => {
|
||||
(ExceptionsZone as any).exceptionHandler = exceptionHandler;
|
||||
handleSpy = sinon.spy(exceptionHandler, 'handle');
|
||||
});
|
||||
it('should call "handle" method of exceptionHandler and throws UNHANDLED_RUNTIME_EXCEPTION', async () => {
|
||||
it('should call "handle" method of exceptionHandler and rethrows error', async () => {
|
||||
const throwsCallback = () => {
|
||||
throw 3;
|
||||
throw new Error('');
|
||||
};
|
||||
expect(ExceptionsZone.asyncRun(throwsCallback)).to.eventually.be
|
||||
.rejected;
|
||||
expect(ExceptionsZone.asyncRun(throwsCallback, rethrow)).to.eventually
|
||||
.be.rejected;
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
8
packages/core/test/helpers/context-id-factory.spec.ts
Normal file
8
packages/core/test/helpers/context-id-factory.spec.ts
Normal file
@@ -0,0 +1,8 @@
|
||||
import { expect } from 'chai';
|
||||
import { createContextId } from '../../helpers/context-id-factory';
|
||||
|
||||
describe('createContextId', () => {
|
||||
it('should return an object with random "id" property', () => {
|
||||
expect(createContextId()).to.have.property('id');
|
||||
});
|
||||
});
|
||||
@@ -54,7 +54,7 @@ describe('Module', () => {
|
||||
const setSpy = sinon.spy(collection, 'set');
|
||||
(module as any)._injectables = collection;
|
||||
|
||||
module.addInjectable(TestProvider);
|
||||
module.addInjectable(TestProvider, TestModule);
|
||||
expect(
|
||||
setSpy.calledWith(
|
||||
'TestProvider',
|
||||
@@ -140,6 +140,16 @@ describe('Module', () => {
|
||||
expect((addCustomFactory as sinon.SinonSpy).called).to.be.true;
|
||||
});
|
||||
|
||||
it('should call "addCustomUseExisting" when "useExisting" property exists', () => {
|
||||
const addCustomUseExisting = sinon.spy();
|
||||
module.addCustomUseExisting = addCustomUseExisting;
|
||||
|
||||
const provider = { provide: 'test', useExisting: () => null };
|
||||
|
||||
module.addCustomUseExisting(provider as any, new Map());
|
||||
expect((addCustomUseExisting as sinon.SinonSpy).called).to.be.true;
|
||||
});
|
||||
|
||||
describe('addCustomClass', () => {
|
||||
const type = { name: 'TypeTest' };
|
||||
const provider = { provide: type, useClass: type, name: 'test' };
|
||||
@@ -229,6 +239,36 @@ describe('Module', () => {
|
||||
});
|
||||
});
|
||||
|
||||
describe('addCustomUseExisting', () => {
|
||||
const type = { name: 'TypeTest' };
|
||||
const provider = { provide: type, useExisting: type, name: 'test' };
|
||||
|
||||
let setSpy;
|
||||
beforeEach(() => {
|
||||
const collection = new Map();
|
||||
setSpy = sinon.spy(collection, 'set');
|
||||
(module as any)._providers = collection;
|
||||
});
|
||||
it('should store provider', () => {
|
||||
module.addCustomUseExisting(provider as any, (module as any)._providers);
|
||||
const factoryFn = (module as any)._providers.get(provider.name).metatype;
|
||||
expect(
|
||||
setSpy.calledWith(
|
||||
provider.name,
|
||||
new InstanceWrapper({
|
||||
host: module,
|
||||
name: provider.name,
|
||||
metatype: factoryFn,
|
||||
instance: null,
|
||||
inject: [provider.useExisting as any],
|
||||
isResolved: false,
|
||||
}),
|
||||
),
|
||||
).to.be.true;
|
||||
expect(factoryFn(provider.useExisting)).to.be.eql(type);
|
||||
});
|
||||
});
|
||||
|
||||
describe('when get instance', () => {
|
||||
describe('when metatype does not exists in providers collection', () => {
|
||||
beforeEach(() => {
|
||||
@@ -272,21 +312,28 @@ describe('Module', () => {
|
||||
|
||||
describe('replace', () => {
|
||||
describe('when provider', () => {
|
||||
it('should call `addProvider`', () => {
|
||||
const addProviderSpy = sinon.spy(module, 'addProvider');
|
||||
it('should call `mergeWith`', () => {
|
||||
const wrapper = {
|
||||
mergeWith: sinon.spy(),
|
||||
};
|
||||
sinon.stub(module, 'hasProvider').callsFake(() => true);
|
||||
sinon.stub(module.providers, 'get').callsFake(() => wrapper as any);
|
||||
|
||||
module.replace(null, { isProvider: true });
|
||||
expect(addProviderSpy.called).to.be.true;
|
||||
expect(wrapper.mergeWith.called).to.be.true;
|
||||
});
|
||||
});
|
||||
describe('when guard', () => {
|
||||
it('should call `addInjectable`', () => {
|
||||
const addInjectableSpy = sinon.spy(module, 'addInjectable');
|
||||
it('should call `mergeWith`', () => {
|
||||
const wrapper = {
|
||||
mergeWith: sinon.spy(),
|
||||
isProvider: true,
|
||||
};
|
||||
sinon.stub(module, 'hasInjectable').callsFake(() => true);
|
||||
sinon.stub(module.injectables, 'get').callsFake(() => wrapper as any);
|
||||
|
||||
module.replace(null, {});
|
||||
expect(addInjectableSpy.called).to.be.true;
|
||||
expect(wrapper.mergeWith.called).to.be.true;
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -413,4 +460,25 @@ describe('Module', () => {
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
describe('getter "id"', () => {
|
||||
it('should return module id', () => {
|
||||
// tslint:disable-next-line:no-string-literal
|
||||
expect(module.id).to.be.equal(module['_id']);
|
||||
});
|
||||
});
|
||||
|
||||
describe('getProviderByKey', () => {
|
||||
describe('when does not exist', () => {
|
||||
it('should return undefined', () => {
|
||||
expect(module.getProviderByKey('test')).to.be.undefined;
|
||||
});
|
||||
});
|
||||
describe('otherwise', () => {
|
||||
it('should return instance wrapper', () => {
|
||||
module.addProvider(TestProvider);
|
||||
expect(module.getProviderByKey('TestProvider')).to.not.be.undefined;
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
@@ -14,7 +14,7 @@
|
||||
<a href="https://www.npmjs.com/~nestjscore" target="_blank"><img src="https://img.shields.io/npm/dm/@nestjs/core.svg" alt="NPM Downloads" /></a>
|
||||
<a href="https://travis-ci.org/nestjs/nest" target="_blank"><img src="https://api.travis-ci.org/nestjs/nest.svg?branch=master" alt="Travis" /></a>
|
||||
<a href="https://travis-ci.org/nestjs/nest" target="_blank"><img src="https://img.shields.io/travis/nestjs/nest/master.svg?label=linux" alt="Linux" /></a>
|
||||
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#8" alt="Coverage" /></a>
|
||||
<a href="https://coveralls.io/github/nestjs/nest?branch=master" target="_blank"><img src="https://coveralls.io/repos/github/nestjs/nest/badge.svg?branch=master#9" alt="Coverage" /></a>
|
||||
<a href="https://gitter.im/nestjs/nestjs?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=body_badge" target="_blank"><img src="https://badges.gitter.im/nestjs/nestjs.svg" alt="Gitter" /></a>
|
||||
<a href="https://discord.gg/G7Qnnhy" target="_blank"><img src="https://img.shields.io/badge/discord-online-brightgreen.svg" alt="Discord"/></a>
|
||||
<a href="https://opencollective.com/nest#backer" target="_blank"><img src="https://opencollective.com/nest/backers/badge.svg" alt="Backers on Open Collective" /></a>
|
||||
@@ -53,30 +53,32 @@ Nest is an MIT-licensed open source project. It can grow thanks to the sponsors
|
||||
|
||||
<a href="https://valor-software.com/" target="_blank"><img src="https://docs.nestjs.com/assets/sponsors/valor-software.png" width="320" /></a>
|
||||
|
||||
#### Base Sponsor
|
||||
|
||||
<a href="https://blueanchor.io/" target="_blank"><img src="https://nestjs.com/img/blueanchor.png" width="300" /></a>
|
||||
<a href="https://www.novologic.com/" target="_blank"><img src="https://nestjs.com/img/novologic.png" width="200" /></a>
|
||||
|
||||
#### Silver Sponsors
|
||||
<a href="https://neoteric.eu/" target="_blank"><img src="https://nestjs.com/img/neoteric-cut.png" width="120" valign="middle" /></a>
|
||||
<a href="http://gojob.com" target="_blank"><img src="http://nestjs.com/img/gojob-logo.png" valign="middle" height="95" /></a> <a href="https://www.swingdev.io" target="_blank"><img src="https://nestjs.com/img/swingdev-logo.svg#1" width="150" valign="middle" /> </a>
|
||||
<a href="https://yakaz.com/" target="_blank"><img src="https://nestjs.com/img/yakaz.png" width="100" valign="middle" /></a>
|
||||
<a href="https://trilon.io" target="_blank"><img src="https://nestjs.com/img/trilon.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://xtremis.com/" target="_blank"><img src="https://nestjs.com/img/logo-xtremis.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://gojob.com" target="_blank"><img src="http://nestjs.com/img/gojob-logo.png" valign="middle" height="95" /></a>
|
||||
<a href="https://trilon.io" target="_blank"><img src="https://nestjs.com/img/trilon.svg" width="150" valign="middle" /></a>
|
||||
<a href="http://www.leogistics.com" target="_blank"><img src="https://nestjs.com/img/leogistics-logo.jpeg" width="150" valign="middle" /></a>
|
||||
|
||||
#### Sponsors
|
||||
|
||||
<a href="https://scal.io" target="_blank"><img src="https://nestjs.com/img/scalio-logo.svg" width="110" valign="middle" /></a> <a href="http://angularity.io" target="_blank"><img src="http://angularity.io/media/logo.svg" height="26" valign="middle" /></a> <!--<a href="https://keycdn.com"><img src="https://nestjs.com/img/keycdn.svg" height="30" /></a> --> <a href="https://hostpresto.com" target="_blank"><img src="https://nestjs.com/img/hostpresto.png" height="30" valign="middle" /></a> <a href="https://genuinebee.com/" target="_blank"><img src="https://nestjs.com/img/genuinebee.svg" height="36" valign="middle" /></a> <a href="http://architectnow.net/" target="_blank"><img src="https://nestjs.com/img/architectnow.png" height="24" valign="middle" /></a> <a href="https://quander.io/" target="_blank"><img src="https://nestjs.com/img/quander.png" height="28" valign="middle" /></a> <a href="https://mantro.net/" target="_blank"><img src="https://nestjs.com/img/mantro-logo.svg" height="20" valign="middle" /></a>
|
||||
<a href="https://www.swingdev.io" target="_blank"><img src="https://nestjs.com/img/swingdev-logo.svg#1" width="125" valign="middle" /> </a> <a href="https://blueanchor.io/" target="_blank"><img src="https://nestjs.com/img/blueanchor.png" width="180" valign="middle" /></a>
|
||||
<a href="https://www.novologic.com/" target="_blank"><img src="https://nestjs.com/img/novologic.png" width="130" valign="middle" /></a>
|
||||
<a href="https://scal.io" target="_blank"><img src="https://nestjs.com/img/scalio-logo.svg" width="100" valign="middle" /></a> <a href="http://angularity.io" target="_blank"><img src="http://angularity.io/media/logo.svg" height="26" valign="middle" /></a> <!--<a href="https://keycdn.com"><img src="https://nestjs.com/img/keycdn.svg" height="30" /></a> --> <a href="https://hostpresto.com" target="_blank"><img src="https://nestjs.com/img/hostpresto.png" height="30" valign="middle" /></a>
|
||||
|
||||
<a href="https://triplebyte.com/" target="_blank"><img src="https://nestjs.com/img/triplebyte.png" height="30" valign="middle" /></a>
|
||||
<a href="https://genuinebee.com/" target="_blank"><img src="https://nestjs.com/img/genuinebee.svg" height="36" valign="middle" /></a> <a href="http://architectnow.net/" target="_blank"><img src="https://nestjs.com/img/architectnow.png" height="24" valign="middle" /></a> <a href="https://quander.io/" target="_blank"><img src="https://nestjs.com/img/quander.png" height="28" valign="middle" /></a> <a href="https://mantro.net/" target="_blank"><img src="https://nestjs.com/img/mantro-logo.svg" height="20" valign="middle" /></a> <a href="https://triplebyte.com/" target="_blank"><img src="https://nestjs.com/img/triplebyte.png" height="30" valign="middle" /></a>
|
||||
<a href="https://ever.co/" target="_blank"><img src="https://nestjs.com/img/ever-logo.png" height="20" valign="middle" /></a>
|
||||
<a href="https://buddy.works/" target="_blank"><img src="https://nestjs.com/img/buddy-logo.svg" height="35" valign="middle" /></a>
|
||||
<a href="https://buddy.works/" target="_blank"><img src="https://nestjs.com/img/buddy-logo.svg" height="35" valign="middle" /></a>
|
||||
<a href="https://blokt.com" target="_blank"><img src="https://nestjs.com/img/blokt-logo.png" height="31" valign="middle" /></a>
|
||||
<a href="https://reposit.co.uk/" target="_blank"><img src="https://nestjs.com/img/reposit-logo.png" height="28" valign="middle" /></a> <a href="https://yakaz.com/" target="_blank"><img src="https://nestjs.com/img/yakaz.png" width="80" valign="middle" /></a>
|
||||
<a href="https://nearpod.com/" target="_blank"><img src="https://nestjs.com/img/nearpod-logo.svg" width="120" valign="middle" /></a>
|
||||
<a href="https://clay.global/" target="_blank"><img src="https://nestjs.com/img/clay-logo.svg" width="90" valign="middle" /></a>
|
||||
<a href="http://xtremis.com/" target="_blank"><img src="https://nestjs.com/img/logo-xtremis.svg" width="145" valign="middle" /></a>
|
||||
|
||||
|
||||
|
||||
## Backers
|
||||
|
||||
<a href="https://opencollective.com/nest" target="_blank"><img src="https://opencollective.com/nest/backers.svg?width=890"></a>
|
||||
<a href="https://opencollective.com/nest" target="_blank"><img src="https://opencollective.com/nest/backers.svg?width=1600"></a>
|
||||
|
||||
## Stay in touch
|
||||
|
||||
|
||||
@@ -2,12 +2,16 @@ import { Logger } from '@nestjs/common/services/logger.service';
|
||||
import { loadPackage } from '@nestjs/common/utils/load-package.util';
|
||||
import { isObject } from '@nestjs/common/utils/shared.utils';
|
||||
import { Observable } from 'rxjs';
|
||||
import { GRPC_DEFAULT_PROTO_LOADER, GRPC_DEFAULT_URL } from '../constants';
|
||||
import {
|
||||
GRPC_DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH,
|
||||
GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH,
|
||||
GRPC_DEFAULT_PROTO_LOADER,
|
||||
GRPC_DEFAULT_URL,
|
||||
} from '../constants';
|
||||
import { InvalidGrpcPackageException } from '../errors/invalid-grpc-package.exception';
|
||||
import { InvalidGrpcServiceException } from '../errors/invalid-grpc-service.exception';
|
||||
import { InvalidProtoDefinitionException } from '../errors/invalid-proto-definition.exception';
|
||||
import { ClientGrpc, GrpcOptions } from '../interfaces';
|
||||
import { ClientOptions } from '../interfaces/client-metadata.interface';
|
||||
import { ClientProxy } from './client-proxy';
|
||||
import { GRPC_CANCELLED } from './constants';
|
||||
|
||||
@@ -19,14 +23,12 @@ export class ClientGrpcProxy extends ClientProxy implements ClientGrpc {
|
||||
protected readonly url: string;
|
||||
protected grpcClient: any;
|
||||
|
||||
constructor(protected readonly options: ClientOptions['options']) {
|
||||
constructor(protected readonly options: GrpcOptions['options']) {
|
||||
super();
|
||||
this.url =
|
||||
this.getOptionsProp<GrpcOptions>(options, 'url') || GRPC_DEFAULT_URL;
|
||||
this.url = this.getOptionsProp(options, 'url') || GRPC_DEFAULT_URL;
|
||||
|
||||
const protoLoader =
|
||||
this.getOptionsProp<GrpcOptions>(options, 'protoLoader') ||
|
||||
GRPC_DEFAULT_PROTO_LOADER;
|
||||
this.getOptionsProp(options, 'protoLoader') || GRPC_DEFAULT_PROTO_LOADER;
|
||||
|
||||
grpcPackage = loadPackage('grpc', ClientGrpcProxy.name, () =>
|
||||
require('grpc'),
|
||||
@@ -36,9 +38,29 @@ export class ClientGrpcProxy extends ClientProxy implements ClientGrpc {
|
||||
}
|
||||
|
||||
public getService<T extends {}>(name: string): T {
|
||||
const maxSendMessageLengthKey = 'grpc.max_send_message_length';
|
||||
const maxReceiveMessageLengthKey = 'grpc.max_receive_message_length';
|
||||
const maxMessageLengthOptions = {
|
||||
[maxSendMessageLengthKey]: this.getOptionsProp(
|
||||
this.options,
|
||||
'maxSendMessageLength',
|
||||
GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH,
|
||||
),
|
||||
[maxReceiveMessageLengthKey]: this.getOptionsProp(
|
||||
this.options,
|
||||
'maxReceiveMessageLength',
|
||||
GRPC_DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH,
|
||||
),
|
||||
};
|
||||
const options: any = isObject(this.options)
|
||||
? { ...this.options, loader: '' }
|
||||
: {};
|
||||
? {
|
||||
...this.options,
|
||||
...maxMessageLengthOptions,
|
||||
loader: '',
|
||||
}
|
||||
: {
|
||||
...maxMessageLengthOptions,
|
||||
};
|
||||
|
||||
if (!this.grpcClient[name]) {
|
||||
throw new InvalidGrpcServiceException();
|
||||
@@ -119,10 +141,7 @@ export class ClientGrpcProxy extends ClientProxy implements ClientGrpc {
|
||||
|
||||
public createClient(): any {
|
||||
const grpcContext = this.loadProto();
|
||||
const packageName = this.getOptionsProp<GrpcOptions>(
|
||||
this.options,
|
||||
'package',
|
||||
);
|
||||
const packageName = this.getOptionsProp(this.options, 'package');
|
||||
const grpcPkg = this.lookupPackage(grpcContext, packageName);
|
||||
if (!grpcPkg) {
|
||||
const invalidPackageError = new InvalidGrpcPackageException();
|
||||
@@ -134,8 +153,8 @@ export class ClientGrpcProxy extends ClientProxy implements ClientGrpc {
|
||||
|
||||
public loadProto(): any {
|
||||
try {
|
||||
const file = this.getOptionsProp<GrpcOptions>(this.options, 'protoPath');
|
||||
const loader = this.getOptionsProp<GrpcOptions>(this.options, 'loader');
|
||||
const file = this.getOptionsProp(this.options, 'protoPath');
|
||||
const loader = this.getOptionsProp(this.options, 'loader');
|
||||
|
||||
const packageDefinition = grpcProtoLoaderPackage.loadSync(file, loader);
|
||||
const packageObject = grpcPackage.loadPackageDefinition(
|
||||
|
||||
@@ -10,7 +10,6 @@ import {
|
||||
} from '../constants';
|
||||
import { MqttClient } from '../external/mqtt-client.interface';
|
||||
import { MqttOptions, PacketId, ReadPacket, WritePacket } from '../interfaces';
|
||||
import { ClientOptions } from '../interfaces/client-metadata.interface';
|
||||
import { ClientProxy } from './client-proxy';
|
||||
import { ECONNREFUSED } from './constants';
|
||||
|
||||
@@ -22,10 +21,9 @@ export class ClientMqtt extends ClientProxy {
|
||||
protected mqttClient: MqttClient;
|
||||
protected connection: Promise<any>;
|
||||
|
||||
constructor(protected readonly options: ClientOptions['options']) {
|
||||
constructor(protected readonly options: MqttOptions['options']) {
|
||||
super();
|
||||
this.url =
|
||||
this.getOptionsProp<MqttOptions>(this.options, 'url') || MQTT_DEFAULT_URL;
|
||||
this.url = this.getOptionsProp(this.options, 'url') || MQTT_DEFAULT_URL;
|
||||
|
||||
mqttPackage = loadPackage('mqtt', ClientMqtt.name, () => require('mqtt'));
|
||||
}
|
||||
|
||||
@@ -4,7 +4,6 @@ import { share } from 'rxjs/operators';
|
||||
import { ERROR_EVENT, NATS_DEFAULT_URL } from '../constants';
|
||||
import { Client } from '../external/nats-client.interface';
|
||||
import { NatsOptions, PacketId, ReadPacket, WritePacket } from '../interfaces';
|
||||
import { ClientOptions } from '../interfaces/client-metadata.interface';
|
||||
import { ClientProxy } from './client-proxy';
|
||||
import { CONN_ERR } from './constants';
|
||||
|
||||
@@ -16,10 +15,9 @@ export class ClientNats extends ClientProxy {
|
||||
protected natsClient: Client;
|
||||
protected connection: Promise<any>;
|
||||
|
||||
constructor(protected readonly options: ClientOptions['options']) {
|
||||
constructor(protected readonly options: NatsOptions['options']) {
|
||||
super();
|
||||
this.url =
|
||||
this.getOptionsProp<NatsOptions>(this.options, 'url') || NATS_DEFAULT_URL;
|
||||
this.url = this.getOptionsProp(this.options, 'url') || NATS_DEFAULT_URL;
|
||||
natsPackage = loadPackage('nats', ClientNats.name, () => require('nats'));
|
||||
}
|
||||
|
||||
@@ -107,10 +105,8 @@ export class ClientNats extends ClientProxy {
|
||||
protected dispatchEvent(packet: ReadPacket): Promise<any> {
|
||||
const pattern = this.normalizePattern(packet.pattern);
|
||||
return new Promise((resolve, reject) =>
|
||||
this.natsClient.publish(
|
||||
pattern,
|
||||
packet as any,
|
||||
err => (err ? reject(err) : resolve()),
|
||||
this.natsClient.publish(pattern, packet as any, err =>
|
||||
err ? reject(err) : resolve(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -1,6 +1,16 @@
|
||||
import { Transport } from '../enums/transport.enum';
|
||||
import { ClientOptions } from '../interfaces/client-metadata.interface';
|
||||
import {
|
||||
ClientOptions,
|
||||
TcpClientOptions,
|
||||
} from '../interfaces/client-metadata.interface';
|
||||
import { Closeable } from '../interfaces/closeable.interface';
|
||||
import {
|
||||
GrpcOptions,
|
||||
MqttOptions,
|
||||
NatsOptions,
|
||||
RedisOptions,
|
||||
RmqOptions,
|
||||
} from '../interfaces/microservice-configuration.interface';
|
||||
import { ClientGrpcProxy } from './client-grpc';
|
||||
import { ClientMqtt } from './client-mqtt';
|
||||
import { ClientNats } from './client-nats';
|
||||
@@ -14,21 +24,25 @@ export interface IClientProxyFactory {
|
||||
}
|
||||
|
||||
export class ClientProxyFactory {
|
||||
public static create(
|
||||
clientOptions: { transport: Transport.GRPC } & ClientOptions,
|
||||
): ClientGrpcProxy;
|
||||
public static create(clientOptions: ClientOptions): ClientProxy & Closeable;
|
||||
public static create(clientOptions: ClientOptions): ClientProxy & Closeable {
|
||||
const { transport, options } = clientOptions;
|
||||
switch (transport) {
|
||||
case Transport.REDIS:
|
||||
return new ClientRedis(options);
|
||||
return new ClientRedis(options as RedisOptions['options']);
|
||||
case Transport.NATS:
|
||||
return new ClientNats(options);
|
||||
return new ClientNats(options as NatsOptions['options']);
|
||||
case Transport.MQTT:
|
||||
return new ClientMqtt(options);
|
||||
return new ClientMqtt(options as MqttOptions['options']);
|
||||
case Transport.GRPC:
|
||||
return new ClientGrpcProxy(options);
|
||||
return new ClientGrpcProxy(options as GrpcOptions['options']);
|
||||
case Transport.RMQ:
|
||||
return new ClientRMQ(options);
|
||||
return new ClientRMQ(options as RmqOptions['options']);
|
||||
default:
|
||||
return new ClientTCP(options);
|
||||
return new ClientTCP(options as TcpClientOptions['options']);
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -93,15 +93,14 @@ export abstract class ClientProxy {
|
||||
return merge(error$, connect$).pipe(take(1));
|
||||
}
|
||||
|
||||
protected getOptionsProp<T extends { options?: any }>(
|
||||
obj: ClientOptions['options'],
|
||||
prop: keyof T['options'],
|
||||
defaultValue: any = undefined,
|
||||
) {
|
||||
return obj ? obj[prop as string] : defaultValue;
|
||||
protected getOptionsProp<
|
||||
T extends ClientOptions['options'],
|
||||
K extends keyof T
|
||||
>(obj: T, prop: K, defaultValue: T[K] = undefined) {
|
||||
return (obj && obj[prop]) || defaultValue;
|
||||
}
|
||||
|
||||
protected normalizePattern<T = any>(pattern: T): string {
|
||||
return isString(pattern) ? pattern : JSON.stringify(pattern);
|
||||
return (isString(pattern) ? pattern : JSON.stringify(pattern)) as string;
|
||||
}
|
||||
}
|
||||
|
||||
@@ -14,7 +14,6 @@ import {
|
||||
RetryStrategyOptions,
|
||||
} from '../external/redis.interface';
|
||||
import { PacketId, ReadPacket, RedisOptions, WritePacket } from '../interfaces';
|
||||
import { ClientOptions } from '../interfaces/client-metadata.interface';
|
||||
import { ClientProxy } from './client-proxy';
|
||||
import { ECONNREFUSED } from './constants';
|
||||
|
||||
@@ -28,10 +27,9 @@ export class ClientRedis extends ClientProxy {
|
||||
protected connection: Promise<any>;
|
||||
protected isExplicitlyTerminated = false;
|
||||
|
||||
constructor(protected readonly options: ClientOptions['options']) {
|
||||
constructor(protected readonly options: RedisOptions['options']) {
|
||||
super();
|
||||
this.url =
|
||||
this.getOptionsProp<RedisOptions>(options, 'url') || REDIS_DEFAULT_URL;
|
||||
this.url = this.getOptionsProp(options, 'url') || REDIS_DEFAULT_URL;
|
||||
|
||||
redisPackage = loadPackage('redis', ClientRedis.name, () =>
|
||||
require('redis'),
|
||||
@@ -108,13 +106,12 @@ export class ClientRedis extends ClientProxy {
|
||||
}
|
||||
if (
|
||||
this.isExplicitlyTerminated ||
|
||||
!this.getOptionsProp<RedisOptions>(this.options, 'retryAttempts') ||
|
||||
options.attempt >
|
||||
this.getOptionsProp<RedisOptions>(this.options, 'retryAttempts')
|
||||
!this.getOptionsProp(this.options, 'retryAttempts') ||
|
||||
options.attempt > this.getOptionsProp(this.options, 'retryAttempts')
|
||||
) {
|
||||
return undefined;
|
||||
}
|
||||
return this.getOptionsProp<RedisOptions>(this.options, 'retryDelay') || 0;
|
||||
return this.getOptionsProp(this.options, 'retryDelay') || 0;
|
||||
}
|
||||
|
||||
public createResponseCallback(): (channel: string, buffer: string) => void {
|
||||
@@ -173,10 +170,8 @@ export class ClientRedis extends ClientProxy {
|
||||
protected dispatchEvent(packet: ReadPacket): Promise<any> {
|
||||
const pattern = this.normalizePattern(packet.pattern);
|
||||
return new Promise((resolve, reject) =>
|
||||
this.pubClient.publish(
|
||||
pattern,
|
||||
JSON.stringify(packet),
|
||||
err => (err ? reject(err) : resolve()),
|
||||
this.pubClient.publish(pattern, JSON.stringify(packet), err =>
|
||||
err ? reject(err) : resolve(),
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
@@ -4,11 +4,12 @@ import { randomStringGenerator } from '@nestjs/common/utils/random-string-genera
|
||||
import { EventEmitter } from 'events';
|
||||
import { fromEvent, merge, Observable } from 'rxjs';
|
||||
import { first, map, share, switchMap } from 'rxjs/operators';
|
||||
import { ClientOptions, ReadPacket, RmqOptions } from '../interfaces';
|
||||
import { ReadPacket, RmqOptions } from '../interfaces';
|
||||
import {
|
||||
DISCONNECT_EVENT,
|
||||
ERROR_EVENT,
|
||||
RQM_DEFAULT_IS_GLOBAL_PREFETCH_COUNT,
|
||||
RQM_DEFAULT_NOACK,
|
||||
RQM_DEFAULT_PREFETCH_COUNT,
|
||||
RQM_DEFAULT_QUEUE,
|
||||
RQM_DEFAULT_QUEUE_OPTIONS,
|
||||
@@ -31,16 +32,13 @@ export class ClientRMQ extends ClientProxy {
|
||||
protected queueOptions: any;
|
||||
protected responseEmitter: EventEmitter;
|
||||
|
||||
constructor(protected readonly options: ClientOptions['options']) {
|
||||
constructor(protected readonly options: RmqOptions['options']) {
|
||||
super();
|
||||
this.urls = this.getOptionsProp<RmqOptions>(this.options, 'urls') || [
|
||||
RQM_DEFAULT_URL,
|
||||
];
|
||||
this.urls = this.getOptionsProp(this.options, 'urls') || [RQM_DEFAULT_URL];
|
||||
this.queue =
|
||||
this.getOptionsProp<RmqOptions>(this.options, 'queue') ||
|
||||
RQM_DEFAULT_QUEUE;
|
||||
this.getOptionsProp(this.options, 'queue') || RQM_DEFAULT_QUEUE;
|
||||
this.queueOptions =
|
||||
this.getOptionsProp<RmqOptions>(this.options, 'queueOptions') ||
|
||||
this.getOptionsProp(this.options, 'queueOptions') ||
|
||||
RQM_DEFAULT_QUEUE_OPTIONS;
|
||||
|
||||
loadPackage('amqplib', ClientRMQ.name, () => require('amqplib'));
|
||||
@@ -55,12 +53,16 @@ export class ClientRMQ extends ClientProxy {
|
||||
}
|
||||
|
||||
public consumeChannel() {
|
||||
const noAck =
|
||||
this.getOptionsProp(this.options, 'noAck') || RQM_DEFAULT_NOACK;
|
||||
this.channel.addSetup((channel: any) =>
|
||||
channel.consume(
|
||||
REPLY_QUEUE,
|
||||
(msg: any) =>
|
||||
this.responseEmitter.emit(msg.properties.correlationId, msg),
|
||||
{ noAck: true },
|
||||
{
|
||||
noAck,
|
||||
},
|
||||
),
|
||||
);
|
||||
}
|
||||
@@ -92,7 +94,8 @@ export class ClientRMQ extends ClientProxy {
|
||||
}
|
||||
|
||||
public createClient<T = any>(): T {
|
||||
return rqmPackage.connect(this.urls) as T;
|
||||
const socketOptions = this.getOptionsProp(this.options, 'socketOptions');
|
||||
return rqmPackage.connect(this.urls, socketOptions) as T;
|
||||
}
|
||||
|
||||
public mergeDisconnectEvent<T = any>(
|
||||
@@ -109,10 +112,10 @@ export class ClientRMQ extends ClientProxy {
|
||||
|
||||
public async setupChannel(channel: any, resolve: Function) {
|
||||
const prefetchCount =
|
||||
this.getOptionsProp<RmqOptions>(this.options, 'prefetchCount') ||
|
||||
this.getOptionsProp(this.options, 'prefetchCount') ||
|
||||
RQM_DEFAULT_PREFETCH_COUNT;
|
||||
const isGlobalPrefetchCount =
|
||||
this.getOptionsProp<RmqOptions>(this.options, 'isGlobalPrefetchCount') ||
|
||||
this.getOptionsProp(this.options, 'isGlobalPrefetchCount') ||
|
||||
RQM_DEFAULT_IS_GLOBAL_PREFETCH_COUNT;
|
||||
|
||||
await channel.assertQueue(this.queue, this.queueOptions);
|
||||
|
||||
@@ -8,12 +8,9 @@ import {
|
||||
TCP_DEFAULT_HOST,
|
||||
TCP_DEFAULT_PORT,
|
||||
} from '../constants';
|
||||
import { PacketId, ReadPacket, WritePacket } from '../interfaces';
|
||||
import {
|
||||
ClientOptions,
|
||||
TcpClientOptions,
|
||||
} from '../interfaces/client-metadata.interface';
|
||||
import { JsonSocket } from '../helpers/json-socket';
|
||||
import { PacketId, ReadPacket, WritePacket } from '../interfaces';
|
||||
import { TcpClientOptions } from '../interfaces/client-metadata.interface';
|
||||
import { ClientProxy } from './client-proxy';
|
||||
import { ECONNREFUSED } from './constants';
|
||||
|
||||
@@ -25,14 +22,10 @@ export class ClientTCP extends ClientProxy {
|
||||
private isConnected = false;
|
||||
private socket: JsonSocket;
|
||||
|
||||
constructor(options: ClientOptions['options']) {
|
||||
constructor(options: TcpClientOptions['options']) {
|
||||
super();
|
||||
this.port =
|
||||
this.getOptionsProp<TcpClientOptions>(options, 'port') ||
|
||||
TCP_DEFAULT_PORT;
|
||||
this.host =
|
||||
this.getOptionsProp<TcpClientOptions>(options, 'host') ||
|
||||
TCP_DEFAULT_HOST;
|
||||
this.port = this.getOptionsProp(options, 'port') || TCP_DEFAULT_PORT;
|
||||
this.host = this.getOptionsProp(options, 'host') || TCP_DEFAULT_HOST;
|
||||
}
|
||||
|
||||
public connect(): Promise<any> {
|
||||
|
||||
@@ -4,4 +4,5 @@ export * from './client-nats';
|
||||
export * from './client-proxy';
|
||||
export { ClientProxyFactory } from './client-proxy-factory';
|
||||
export * from './client-redis';
|
||||
export * from './client-rmq';
|
||||
export * from './client-tcp';
|
||||
|
||||
@@ -24,6 +24,7 @@ export const RQM_DEFAULT_QUEUE = 'default';
|
||||
export const RQM_DEFAULT_PREFETCH_COUNT = 0;
|
||||
export const RQM_DEFAULT_IS_GLOBAL_PREFETCH_COUNT = false;
|
||||
export const RQM_DEFAULT_QUEUE_OPTIONS = {};
|
||||
export const RQM_DEFAULT_NOACK = true;
|
||||
export const GRPC_DEFAULT_PROTO_LOADER = '@grpc/proto-loader';
|
||||
|
||||
export const NO_MESSAGE_HANDLER = `There is no matching message handler defined in the remote service.`;
|
||||
|
||||
@@ -2,6 +2,12 @@ import { PATTERN_HANDLER_METADATA, PATTERN_METADATA } from '../constants';
|
||||
import { PatternHandler } from '../enums/pattern-handler.enum';
|
||||
import { PatternMetadata } from '../interfaces/pattern-metadata.interface';
|
||||
|
||||
export enum GrpcMethodStreamingType {
|
||||
NO_STREAMING = 'no_stream',
|
||||
RX_STREAMING = 'rx_stream',
|
||||
PT_STREAMING = 'pt_stream',
|
||||
}
|
||||
|
||||
/**
|
||||
* Subscribes to incoming messages which fulfils chosen pattern.
|
||||
*/
|
||||
@@ -39,21 +45,82 @@ export function GrpcMethod(service: string, method?: string): MethodDecorator {
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers gRPC call through RX handler for service and method
|
||||
*
|
||||
* @param service String parameter reflecting the name of service definition from proto file
|
||||
*/
|
||||
export function GrpcStreamMethod(service?: string);
|
||||
/**
|
||||
* @param service String parameter reflecting the name of service definition from proto file
|
||||
* @param method Optional string parameter reflecting the name of method inside of a service definition coming after rpc keyword
|
||||
*/
|
||||
export function GrpcStreamMethod(service: string, method?: string);
|
||||
export function GrpcStreamMethod(service: string, method?: string) {
|
||||
return (
|
||||
target: any,
|
||||
key: string | symbol,
|
||||
descriptor: PropertyDescriptor,
|
||||
) => {
|
||||
const metadata = createMethodMetadata(
|
||||
target,
|
||||
key,
|
||||
service,
|
||||
method,
|
||||
GrpcMethodStreamingType.RX_STREAMING,
|
||||
);
|
||||
return MessagePattern(metadata)(target, key, descriptor);
|
||||
};
|
||||
}
|
||||
|
||||
/**
|
||||
* Registers gRPC call pass through handler for service and method
|
||||
*
|
||||
* @param service String parameter reflecting the name of service definition from proto file
|
||||
*/
|
||||
export function GrpcStreamCall(service?: string);
|
||||
/**
|
||||
* @param service String parameter reflecting the name of service definition from proto file
|
||||
* @param method Optional string parameter reflecting the name of method inside of a service definition coming after rpc keyword
|
||||
*/
|
||||
export function GrpcStreamCall(service: string, method?: string);
|
||||
export function GrpcStreamCall(service: string, method?: string) {
|
||||
return (
|
||||
target: any,
|
||||
key: string | symbol,
|
||||
descriptor: PropertyDescriptor,
|
||||
) => {
|
||||
const metadata = createMethodMetadata(
|
||||
target,
|
||||
key,
|
||||
service,
|
||||
method,
|
||||
GrpcMethodStreamingType.PT_STREAMING,
|
||||
);
|
||||
return MessagePattern(metadata)(target, key, descriptor);
|
||||
};
|
||||
}
|
||||
|
||||
export function createMethodMetadata(
|
||||
target: any,
|
||||
key: string | symbol,
|
||||
service: string | undefined,
|
||||
method: string | undefined,
|
||||
streaming = GrpcMethodStreamingType.NO_STREAMING,
|
||||
) {
|
||||
const capitalizeFirstLetter = (str: string) =>
|
||||
str.charAt(0).toUpperCase() + str.slice(1);
|
||||
|
||||
if (!service) {
|
||||
const { name } = target.constructor;
|
||||
return { service: name, rpc: capitalizeFirstLetter(key as string) };
|
||||
return {
|
||||
service: name,
|
||||
rpc: capitalizeFirstLetter(key as string),
|
||||
streaming,
|
||||
};
|
||||
}
|
||||
if (service && !method) {
|
||||
return { service, rpc: capitalizeFirstLetter(key as string) };
|
||||
return { service, rpc: capitalizeFirstLetter(key as string), streaming };
|
||||
}
|
||||
return { service, rpc: method };
|
||||
return { service, rpc: method, streaming };
|
||||
}
|
||||
|
||||
@@ -14,3 +14,4 @@ export * from './interfaces';
|
||||
export * from './module';
|
||||
export * from './nest-microservice';
|
||||
export * from './server';
|
||||
export * from './tokens';
|
||||
|
||||
@@ -6,3 +6,4 @@ export * from './message-handler.interface';
|
||||
export * from './microservice-configuration.interface';
|
||||
export * from './packet.interface';
|
||||
export * from './pattern-metadata.interface';
|
||||
export * from './request-context.interface';
|
||||
|
||||
@@ -93,5 +93,7 @@ export interface RmqOptions {
|
||||
prefetchCount?: number;
|
||||
isGlobalPrefetchCount?: boolean;
|
||||
queueOptions?: any;
|
||||
socketOptions?: any;
|
||||
noAck?: boolean;
|
||||
};
|
||||
}
|
||||
|
||||
@@ -0,0 +1,4 @@
|
||||
export interface RequestContext<T = any> {
|
||||
pattern: string | Record<string, any>;
|
||||
data: T;
|
||||
}
|
||||
@@ -2,12 +2,16 @@ import { Controller } from '@nestjs/common/interfaces/controllers/controller.int
|
||||
import { createContextId } from '@nestjs/core/helpers/context-id-factory';
|
||||
import { NestContainer } from '@nestjs/core/injector/container';
|
||||
import { Injector } from '@nestjs/core/injector/injector';
|
||||
import { InstanceWrapper } from '@nestjs/core/injector/instance-wrapper';
|
||||
import {
|
||||
ContextId,
|
||||
InstanceWrapper,
|
||||
} from '@nestjs/core/injector/instance-wrapper';
|
||||
import { MetadataScanner } from '@nestjs/core/metadata-scanner';
|
||||
import { REQUEST } from '@nestjs/core/router/request/request-constants';
|
||||
import { IClientProxyFactory } from './client/client-proxy-factory';
|
||||
import { ClientsContainer } from './container';
|
||||
import { RpcContextCreator } from './context/rpc-context-creator';
|
||||
import { CustomTransportStrategy } from './interfaces';
|
||||
import { CustomTransportStrategy, RequestContext } from './interfaces';
|
||||
import { ListenerMetadataExplorer } from './listener-metadata-explorer';
|
||||
import { Server } from './server/server';
|
||||
|
||||
@@ -48,8 +52,10 @@ export class ListenersController {
|
||||
}
|
||||
server.addHandler(
|
||||
pattern,
|
||||
async data => {
|
||||
async (data: unknown) => {
|
||||
const contextId = createContextId();
|
||||
this.registerRequestProvider({ pattern, data }, contextId);
|
||||
|
||||
const contextInstance = await this.injector.loadPerContext(
|
||||
instance,
|
||||
module,
|
||||
@@ -88,4 +94,17 @@ export class ListenersController {
|
||||
) {
|
||||
Reflect.set(instance, property, client);
|
||||
}
|
||||
|
||||
private registerRequestProvider(
|
||||
request: RequestContext,
|
||||
contextId: ContextId,
|
||||
) {
|
||||
const coreModuleRef = this.container.getInternalCoreModuleRef();
|
||||
const wrapper = coreModuleRef.getProviderByKey(REQUEST);
|
||||
|
||||
wrapper.setInstanceByContextId(contextId, {
|
||||
instance: request,
|
||||
isResolved: true,
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
@@ -30,7 +30,6 @@ export class NestMicroservice extends NestApplicationContext
|
||||
private microserviceConfig: MicroserviceOptions;
|
||||
private server: Server & CustomTransportStrategy;
|
||||
private isTerminated = false;
|
||||
private isInitialized = false;
|
||||
private isInitHookCalled = false;
|
||||
|
||||
constructor(
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
{
|
||||
"name": "@nestjs/microservices",
|
||||
"version": "6.0.5",
|
||||
"version": "6.3.1",
|
||||
"description": "Nest - modern, fast, powerful node.js web framework (@microservices)",
|
||||
"author": "Kamil Mysliwiec",
|
||||
"license": "MIT",
|
||||
|
||||
@@ -3,4 +3,5 @@ export * from './server-grpc';
|
||||
export * from './server-mqtt';
|
||||
export * from './server-nats';
|
||||
export * from './server-redis';
|
||||
export * from './server-rmq';
|
||||
export * from './server-tcp';
|
||||
|
||||
@@ -1,6 +1,6 @@
|
||||
import { isObject, isUndefined } from '@nestjs/common/utils/shared.utils';
|
||||
import { fromEvent } from 'rxjs';
|
||||
import { takeUntil } from 'rxjs/operators';
|
||||
import { EMPTY, fromEvent, Subject } from 'rxjs';
|
||||
import { catchError, takeUntil } from 'rxjs/operators';
|
||||
import {
|
||||
CANCEL_EVENT,
|
||||
GRPC_DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH,
|
||||
@@ -8,13 +8,11 @@ import {
|
||||
GRPC_DEFAULT_PROTO_LOADER,
|
||||
GRPC_DEFAULT_URL,
|
||||
} from '../constants';
|
||||
import { GrpcMethodStreamingType } from '../decorators';
|
||||
import { InvalidGrpcPackageException } from '../errors/invalid-grpc-package.exception';
|
||||
import { InvalidProtoDefinitionException } from '../errors/invalid-proto-definition.exception';
|
||||
import { CustomTransportStrategy } from '../interfaces';
|
||||
import {
|
||||
GrpcOptions,
|
||||
MicroserviceOptions,
|
||||
} from '../interfaces/microservice-configuration.interface';
|
||||
import { GrpcOptions } from '../interfaces/microservice-configuration.interface';
|
||||
import { Server } from './server';
|
||||
|
||||
let grpcPackage: any = {};
|
||||
@@ -25,19 +23,20 @@ interface GrpcCall<TRequest = any, TMetadata = any> {
|
||||
metadata: TMetadata;
|
||||
end: Function;
|
||||
write: Function;
|
||||
on: Function;
|
||||
emit: Function;
|
||||
}
|
||||
|
||||
export class ServerGrpc extends Server implements CustomTransportStrategy {
|
||||
private readonly url: string;
|
||||
private grpcClient: any;
|
||||
|
||||
constructor(private readonly options: MicroserviceOptions['options']) {
|
||||
constructor(private readonly options: GrpcOptions['options']) {
|
||||
super();
|
||||
this.url =
|
||||
this.getOptionsProp<GrpcOptions>(options, 'url') || GRPC_DEFAULT_URL;
|
||||
this.url = this.getOptionsProp(options, 'url') || GRPC_DEFAULT_URL;
|
||||
|
||||
const protoLoader =
|
||||
this.getOptionsProp<GrpcOptions>(options, 'protoLoader') ||
|
||||
GRPC_DEFAULT_PROTO_LOADER;
|
||||
this.getOptionsProp(options, 'protoLoader') || GRPC_DEFAULT_PROTO_LOADER;
|
||||
|
||||
grpcPackage = this.loadPackage('grpc', ServerGrpc.name, () =>
|
||||
require('grpc'),
|
||||
@@ -58,10 +57,7 @@ export class ServerGrpc extends Server implements CustomTransportStrategy {
|
||||
|
||||
public async bindEvents() {
|
||||
const grpcContext = this.loadProto();
|
||||
const packageName = this.getOptionsProp<GrpcOptions>(
|
||||
this.options,
|
||||
'package',
|
||||
);
|
||||
const packageName = this.getOptionsProp(this.options, 'package');
|
||||
const grpcPkg = this.lookupPackage(grpcContext, packageName);
|
||||
if (!grpcPkg) {
|
||||
const invalidPackageError = new InvalidGrpcPackageException();
|
||||
@@ -94,36 +90,110 @@ export class ServerGrpc extends Server implements CustomTransportStrategy {
|
||||
return services;
|
||||
}
|
||||
|
||||
/**
|
||||
* Will create service mapping from gRPC generated Object to handlers
|
||||
* defined with @GrpcMethod or @GrpcStreamMethod annotations
|
||||
*
|
||||
* @param grpcService
|
||||
* @param name
|
||||
*/
|
||||
public async createService(grpcService: any, name: string) {
|
||||
const service = {};
|
||||
|
||||
// tslint:disable-next-line:forin
|
||||
for (const methodName in grpcService.prototype) {
|
||||
const methodHandler = this.getHandlerByPattern(
|
||||
this.createPattern(name, methodName),
|
||||
);
|
||||
let pattern = '';
|
||||
let methodHandler = null;
|
||||
let streamingType = GrpcMethodStreamingType.NO_STREAMING;
|
||||
|
||||
const methodFunction = grpcService.prototype[methodName];
|
||||
const methodReqStreaming = methodFunction.requestStream;
|
||||
|
||||
if (!isUndefined(methodReqStreaming) && methodReqStreaming) {
|
||||
// Try first pattern to be presented, RX streaming pattern would be
|
||||
// a preferable pattern to select among a few defined
|
||||
pattern = this.createPattern(
|
||||
name,
|
||||
methodName,
|
||||
GrpcMethodStreamingType.RX_STREAMING,
|
||||
);
|
||||
methodHandler = this.messageHandlers.get(pattern);
|
||||
streamingType = GrpcMethodStreamingType.RX_STREAMING;
|
||||
// If first pattern didn't match to any of handlers then try
|
||||
// pass-through handler to be presented
|
||||
if (!methodHandler) {
|
||||
pattern = this.createPattern(
|
||||
name,
|
||||
methodName,
|
||||
GrpcMethodStreamingType.PT_STREAMING,
|
||||
);
|
||||
methodHandler = this.messageHandlers.get(pattern);
|
||||
streamingType = GrpcMethodStreamingType.PT_STREAMING;
|
||||
}
|
||||
} else {
|
||||
pattern = this.createPattern(
|
||||
name,
|
||||
methodName,
|
||||
GrpcMethodStreamingType.NO_STREAMING,
|
||||
);
|
||||
// Select handler if any presented for No-Streaming pattern
|
||||
methodHandler = this.messageHandlers.get(pattern);
|
||||
streamingType = GrpcMethodStreamingType.NO_STREAMING;
|
||||
}
|
||||
if (!methodHandler) {
|
||||
continue;
|
||||
}
|
||||
service[methodName] = await this.createServiceMethod(
|
||||
methodHandler,
|
||||
grpcService.prototype[methodName],
|
||||
streamingType,
|
||||
);
|
||||
}
|
||||
return service;
|
||||
}
|
||||
|
||||
public createPattern(service: string, methodName: string): string {
|
||||
/**
|
||||
* Will create a string of a JSON serialized format
|
||||
*
|
||||
* @param service name of the service which should be a match to gRPC service definition name
|
||||
* @param methodName name of the method which is coming after rpc keyword
|
||||
* @param streaming GrpcMethodStreamingType parameter which should correspond to
|
||||
* stream keyword in gRPC service request part
|
||||
*/
|
||||
public createPattern(
|
||||
service: string,
|
||||
methodName: string,
|
||||
streaming: GrpcMethodStreamingType,
|
||||
): string {
|
||||
return JSON.stringify({
|
||||
service,
|
||||
rpc: methodName,
|
||||
streaming,
|
||||
});
|
||||
}
|
||||
|
||||
/**
|
||||
* Will return async function which will handle gRPC call
|
||||
* with Rx streams or as a direct call passthrough
|
||||
*
|
||||
* @param methodHandler
|
||||
* @param protoNativeHandler
|
||||
*/
|
||||
public createServiceMethod(
|
||||
methodHandler: Function,
|
||||
protoNativeHandler: any,
|
||||
streamType: GrpcMethodStreamingType,
|
||||
): Function {
|
||||
// If proto handler has request stream as "true" then we expect it to have
|
||||
// streaming from the side of requester
|
||||
if (protoNativeHandler.requestStream) {
|
||||
// If any handlers were defined with GrpcStreamMethod annotation use RX
|
||||
if (streamType === GrpcMethodStreamingType.RX_STREAMING)
|
||||
return this.createStreamDuplexMethod(methodHandler);
|
||||
// If any handlers were defined with GrpcStreamCall annotation
|
||||
else if (streamType === GrpcMethodStreamingType.PT_STREAMING)
|
||||
return this.createStreamCallMethod(methodHandler);
|
||||
}
|
||||
return protoNativeHandler.responseStream
|
||||
? this.createStreamServiceMethod(methodHandler)
|
||||
: this.createUnaryServiceMethod(methodHandler);
|
||||
@@ -144,12 +214,59 @@ export class ServerGrpc extends Server implements CustomTransportStrategy {
|
||||
const handler = methodHandler(call.request, call.metadata);
|
||||
const result$ = this.transformToObservable(await handler);
|
||||
await result$
|
||||
.pipe(takeUntil(fromEvent(call as any, CANCEL_EVENT)))
|
||||
.pipe(
|
||||
takeUntil(fromEvent(call as any, CANCEL_EVENT)),
|
||||
catchError(err => {
|
||||
call.emit('error', err);
|
||||
return EMPTY;
|
||||
}),
|
||||
)
|
||||
.forEach(data => call.write(data));
|
||||
call.end();
|
||||
};
|
||||
}
|
||||
|
||||
public createStreamDuplexMethod(methodHandler: Function) {
|
||||
return async (call: GrpcCall) => {
|
||||
const req = new Subject<any>();
|
||||
call.on('data', (m: any) => req.next(m));
|
||||
call.on('error', (e: any) => {
|
||||
// Check if error means that stream ended on other end
|
||||
if (
|
||||
String(e)
|
||||
.toLowerCase()
|
||||
.indexOf('cancelled') > -1
|
||||
) {
|
||||
call.end();
|
||||
return;
|
||||
}
|
||||
// If another error then just pass it along
|
||||
req.error(e);
|
||||
});
|
||||
call.on('end', () => req.complete());
|
||||
|
||||
const handler = methodHandler(req.asObservable());
|
||||
const res = this.transformToObservable(await handler);
|
||||
await res
|
||||
.pipe(
|
||||
takeUntil(fromEvent(call as any, CANCEL_EVENT)),
|
||||
catchError(err => {
|
||||
call.emit('error', err);
|
||||
return EMPTY;
|
||||
}),
|
||||
)
|
||||
.forEach(m => call.write(m));
|
||||
|
||||
call.end();
|
||||
};
|
||||
}
|
||||
|
||||
public createStreamCallMethod(methodHandler: Function) {
|
||||
return async (call: GrpcCall) => {
|
||||
methodHandler(call);
|
||||
};
|
||||
}
|
||||
|
||||
public close() {
|
||||
this.grpcClient && this.grpcClient.forceShutdown();
|
||||
this.grpcClient = null;
|
||||
@@ -165,21 +282,18 @@ export class ServerGrpc extends Server implements CustomTransportStrategy {
|
||||
|
||||
public createClient(): any {
|
||||
const server = new grpcPackage.Server({
|
||||
'grpc.max_send_message_length': this.getOptionsProp<GrpcOptions>(
|
||||
'grpc.max_send_message_length': this.getOptionsProp(
|
||||
this.options,
|
||||
'maxSendMessageLength',
|
||||
GRPC_DEFAULT_MAX_SEND_MESSAGE_LENGTH,
|
||||
),
|
||||
'grpc.max_receive_message_length': this.getOptionsProp<GrpcOptions>(
|
||||
'grpc.max_receive_message_length': this.getOptionsProp(
|
||||
this.options,
|
||||
'maxReceiveMessageLength',
|
||||
GRPC_DEFAULT_MAX_RECEIVE_MESSAGE_LENGTH,
|
||||
),
|
||||
});
|
||||
const credentials = this.getOptionsProp<GrpcOptions>(
|
||||
this.options,
|
||||
'credentials',
|
||||
);
|
||||
const credentials = this.getOptionsProp(this.options, 'credentials');
|
||||
server.bind(
|
||||
this.url,
|
||||
credentials || grpcPackage.ServerCredentials.createInsecure(),
|
||||
@@ -198,8 +312,8 @@ export class ServerGrpc extends Server implements CustomTransportStrategy {
|
||||
|
||||
public loadProto(): any {
|
||||
try {
|
||||
const file = this.getOptionsProp<GrpcOptions>(this.options, 'protoPath');
|
||||
const loader = this.getOptionsProp<GrpcOptions>(this.options, 'loader');
|
||||
const file = this.getOptionsProp(this.options, 'protoPath');
|
||||
const loader = this.getOptionsProp(this.options, 'loader');
|
||||
|
||||
const packageDefinition = grpcProtoLoaderPackage.loadSync(file, loader);
|
||||
const packageObject = grpcPackage.loadPackageDefinition(
|
||||
|
||||
@@ -21,10 +21,9 @@ export class ServerMqtt extends Server implements CustomTransportStrategy {
|
||||
private readonly url: string;
|
||||
private mqttClient: MqttClient;
|
||||
|
||||
constructor(private readonly options: MicroserviceOptions['options']) {
|
||||
constructor(private readonly options: MqttOptions['options']) {
|
||||
super();
|
||||
this.url =
|
||||
this.getOptionsProp<MqttOptions>(options, 'url') || MQTT_DEFAULT_URL;
|
||||
this.url = this.getOptionsProp(options, 'url') || MQTT_DEFAULT_URL;
|
||||
|
||||
mqttPackage = this.loadPackage('mqtt', ServerMqtt.name, () =>
|
||||
require('mqtt'),
|
||||
@@ -59,10 +58,7 @@ export class ServerMqtt extends Server implements CustomTransportStrategy {
|
||||
}
|
||||
|
||||
public createMqttClient(): MqttClient {
|
||||
return mqttPackage.connect(
|
||||
this.url,
|
||||
this.options as MqttOptions,
|
||||
);
|
||||
return mqttPackage.connect(this.url, this.options as MqttOptions);
|
||||
}
|
||||
|
||||
public getMessageHandler(pub: MqttClient): Function {
|
||||
|
||||
@@ -21,10 +21,9 @@ export class ServerNats extends Server implements CustomTransportStrategy {
|
||||
private readonly url: string;
|
||||
private natsClient: Client;
|
||||
|
||||
constructor(private readonly options: MicroserviceOptions['options']) {
|
||||
constructor(private readonly options: NatsOptions['options']) {
|
||||
super();
|
||||
this.url =
|
||||
this.getOptionsProp<NatsOptions>(this.options, 'url') || NATS_DEFAULT_URL;
|
||||
this.url = this.getOptionsProp(this.options, 'url') || NATS_DEFAULT_URL;
|
||||
|
||||
natsPackage = this.loadPackage('nats', ServerNats.name, () =>
|
||||
require('nats'),
|
||||
@@ -43,7 +42,7 @@ export class ServerNats extends Server implements CustomTransportStrategy {
|
||||
}
|
||||
|
||||
public bindEvents(client: Client) {
|
||||
const queue = this.getOptionsProp<NatsOptions>(this.options, 'queue');
|
||||
const queue = this.getOptionsProp(this.options, 'queue');
|
||||
const subscribe = queue
|
||||
? (channel: string) =>
|
||||
client.subscribe(
|
||||
|
||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user