Compare commits
630 Commits
openSAP-we
...
addCustomR
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
b22915b6e7 | ||
|
|
6fb46a0ad7 | ||
|
|
d15d0535d9 | ||
|
|
6ee42326a7 | ||
|
|
430d3a46c4 | ||
|
|
308e6b932a | ||
|
|
703d45fab0 | ||
|
|
63c21c5a96 | ||
|
|
e0c6b16b15 | ||
|
|
0771fc06e6 | ||
|
|
dc90cad8f4 | ||
|
|
f731a95bd1 | ||
|
|
2cd092be10 | ||
|
|
a1c2f32408 | ||
|
|
8a6a42f109 | ||
|
|
28cfceeaf0 | ||
|
|
879546829a | ||
|
|
b7e435d611 | ||
|
|
4f5f075697 | ||
|
|
710c83aa1c | ||
|
|
e9fbba9f46 | ||
|
|
0d96447d4b | ||
|
|
e790d89065 | ||
|
|
94dd9620e4 | ||
|
|
ed1510d173 | ||
|
|
d07b20a689 | ||
|
|
e6584c4c15 | ||
|
|
2a6fca177b | ||
|
|
d9058f9b51 | ||
|
|
affd1718ef | ||
|
|
5ff72c3f02 | ||
|
|
666001d564 | ||
|
|
e4214b0e40 | ||
|
|
ad76c699c9 | ||
|
|
0ad8baefc7 | ||
|
|
3f7b43346f | ||
|
|
6981841d86 | ||
|
|
18c29d8b67 | ||
|
|
02fc1a89a1 | ||
|
|
1672c8d914 | ||
|
|
0132241c43 | ||
|
|
d1619cfa4d | ||
|
|
f844a39069 | ||
|
|
b60e02bb22 | ||
|
|
94b74d76ad | ||
|
|
b0b4412c7a | ||
|
|
70cfa82a35 | ||
|
|
d17d74f1ec | ||
|
|
9fbf7c69c9 | ||
|
|
f54a8cecb7 | ||
|
|
608e16090c | ||
|
|
bd0f514026 | ||
|
|
ee2fdd0989 | ||
|
|
92f7489def | ||
|
|
e222645935 | ||
|
|
8676f7184d | ||
|
|
a069f2d7de | ||
|
|
254362daa1 | ||
|
|
e419fda74e | ||
|
|
6bb51a8807 | ||
|
|
36b339a362 | ||
|
|
07ffdedace | ||
|
|
47655c5f48 | ||
|
|
aa5fda976a | ||
|
|
b97253f266 | ||
|
|
65379110e2 | ||
|
|
b8e04027d5 | ||
|
|
3554674d8e | ||
|
|
45e9c132a9 | ||
|
|
e9a81ad2a8 | ||
|
|
2389924403 | ||
|
|
b733f8333c | ||
|
|
4fa96203cb | ||
|
|
630838a7b4 | ||
|
|
09c2a40c7d | ||
|
|
88e527adba | ||
|
|
b0d74b0ea4 | ||
|
|
b4f6d5714c | ||
|
|
18f9f6c3f8 | ||
|
|
a0d5355f7d | ||
|
|
37538a368c | ||
|
|
662f93a995 | ||
|
|
76bed22f40 | ||
|
|
8ab66b4130 | ||
|
|
2a37ef8be1 | ||
|
|
de35537c04 | ||
|
|
e477879d71 | ||
|
|
38593baeb8 | ||
|
|
f0e8575e5e | ||
|
|
b52a9c3a21 | ||
|
|
88cb9c0069 | ||
|
|
42f7e1920b | ||
|
|
dea92b54d8 | ||
|
|
9a98ffd298 | ||
|
|
57cda61b02 | ||
|
|
8d26fc1f45 | ||
|
|
5c4247b14c | ||
|
|
a704f12b40 | ||
|
|
b981f8fb02 | ||
|
|
f45f0a05b3 | ||
|
|
a3adca1919 | ||
|
|
ac5e631a92 | ||
|
|
dc72a7dc9e | ||
|
|
d915bd7b54 | ||
|
|
ec4d7a4b92 | ||
|
|
07a686264d | ||
|
|
88c9f31a24 | ||
|
|
bcb6ffa20f | ||
|
|
f29f66c41e | ||
|
|
96375aa221 | ||
|
|
c1329a6f20 | ||
|
|
babb5780b0 | ||
|
|
cae45fcd87 | ||
|
|
bf2b12e4e8 | ||
|
|
e44d62ac49 | ||
|
|
0e053f98f3 | ||
|
|
662bfc35d3 | ||
|
|
af605bf685 | ||
|
|
04411e35a7 | ||
|
|
8f5c33f4f5 | ||
|
|
a893184736 | ||
|
|
ee4dcf116c | ||
|
|
58cef5558d | ||
|
|
7753cda65d | ||
|
|
df57a9d8d0 | ||
|
|
2d92b851f1 | ||
|
|
e157fc8a92 | ||
|
|
3b69a80975 | ||
|
|
b80ba7445d | ||
|
|
b733643f2a | ||
|
|
bf317bc2c9 | ||
|
|
bbebff4066 | ||
|
|
eb75394044 | ||
|
|
b8f65b687f | ||
|
|
c49c9691bd | ||
|
|
7e4bc0985e | ||
|
|
912271338d | ||
|
|
bbf1194a09 | ||
|
|
529c431518 | ||
|
|
3f85676edd | ||
|
|
959c07cee3 | ||
|
|
8cc09fde38 | ||
|
|
bb55c432c9 | ||
|
|
5fc86d45ad | ||
|
|
e86d0dc3a2 | ||
|
|
a661fb2d45 | ||
|
|
bfe0c831d6 | ||
|
|
cad615a662 | ||
|
|
7101c58920 | ||
|
|
07dc1e88b3 | ||
|
|
6f8d74dc9a | ||
|
|
ec57c5ea48 | ||
|
|
c040a47279 | ||
|
|
30bfd70c49 | ||
|
|
6fb9581cf1 | ||
|
|
e87d6cdfc5 | ||
|
|
29ea2bc2da | ||
|
|
12574271ac | ||
|
|
17b5cc1ad2 | ||
|
|
26ca7f54ad | ||
|
|
573e78253d | ||
|
|
a7511ed677 | ||
|
|
f1289b436b | ||
|
|
984ea2133b | ||
|
|
179d301acb | ||
|
|
bbf20b1ca3 | ||
|
|
f4f02f6fe5 | ||
|
|
68c2504fc4 | ||
|
|
51a8762738 | ||
|
|
ff533754b4 | ||
|
|
f6b4d534fc | ||
|
|
3c5107ba42 | ||
|
|
dbc561d2e3 | ||
|
|
f21488fd71 | ||
|
|
0bce8d9ce0 | ||
|
|
0f03ffd3eb | ||
|
|
bc03cae550 | ||
|
|
8197559065 | ||
|
|
7accf1ae23 | ||
|
|
2ffa1721b3 | ||
|
|
37811381e7 | ||
|
|
74f9d5cc1e | ||
|
|
7c0769e059 | ||
|
|
10dcd6aadd | ||
|
|
f8c23f4c54 | ||
|
|
ae6be30aa0 | ||
|
|
e6baa95f74 | ||
|
|
aa28804a51 | ||
|
|
ea0773071e | ||
|
|
1a71a6d28a | ||
|
|
50791bed80 | ||
|
|
d58a71af7f | ||
|
|
c7c979236e | ||
|
|
0675793c87 | ||
|
|
91bca922c4 | ||
|
|
30403d239a | ||
|
|
589e282288 | ||
|
|
a8345122ea | ||
|
|
788a101f41 | ||
|
|
379ddc9fb0 | ||
|
|
1fde0c928b | ||
|
|
fa854a2411 | ||
|
|
40b6acee6a | ||
|
|
a37f1b8e0c | ||
|
|
042ddec41c | ||
|
|
8d8aa6c2c9 | ||
|
|
756ed48ce3 | ||
|
|
19b680ab3d | ||
|
|
33380c0792 | ||
|
|
0d5b65d93f | ||
|
|
dcf5ec6068 | ||
|
|
fb41dd100b | ||
|
|
769aa2b4f5 | ||
|
|
f6c5e620c0 | ||
|
|
7013cb6296 | ||
|
|
6411ce4ea3 | ||
|
|
cd914a8d87 | ||
|
|
b35e92b5bc | ||
|
|
8350aff111 | ||
|
|
9aa604c5a0 | ||
|
|
f5cb53adf8 | ||
|
|
9fe16edc55 | ||
|
|
0093883f25 | ||
|
|
14024a4837 | ||
|
|
2e13b37096 | ||
|
|
7407b0aae3 | ||
|
|
152d088ff4 | ||
|
|
19c886d6dc | ||
|
|
575cffe70a | ||
|
|
03869e5896 | ||
|
|
597afeb3d8 | ||
|
|
d376e6e063 | ||
|
|
2a44cfa9dc | ||
|
|
7964c9aefd | ||
|
|
ce752097d0 | ||
|
|
e838f380c5 | ||
|
|
e89e012eba | ||
|
|
bf0f57efe5 | ||
|
|
40ea057f7f | ||
|
|
31d2f4c932 | ||
|
|
8cc2db7118 | ||
|
|
482b71e60b | ||
|
|
7536451e29 | ||
|
|
2703e8b999 | ||
|
|
ac2e4dd6f9 | ||
|
|
c718fa400d | ||
|
|
730da6e435 | ||
|
|
7d9b4f7a5d | ||
|
|
35d3708592 | ||
|
|
eaaf0d29a5 | ||
|
|
64fe700d1e | ||
|
|
5c3cec973e | ||
|
|
680a6ae68f | ||
|
|
366b0f8f9a | ||
|
|
b95df77b9a | ||
|
|
7f6b87171a | ||
|
|
21e74bbbfb | ||
|
|
102b15c3cd | ||
|
|
73db2e96bc | ||
|
|
7bb58ee2d5 | ||
|
|
27e82d16e0 | ||
|
|
ff9bbe6d8d | ||
|
|
5f1b7b8cbf | ||
|
|
0253300557 | ||
|
|
139d957495 | ||
|
|
404427237b | ||
|
|
5f89334403 | ||
|
|
e612fa97ea | ||
|
|
da2ea39466 | ||
|
|
117000df71 | ||
|
|
f3ffb69d3a | ||
|
|
f908484973 | ||
|
|
c4529f3cd7 | ||
|
|
0220400484 | ||
|
|
c1911b6e96 | ||
|
|
19083d156e | ||
|
|
48d547e6cd | ||
|
|
bae491a832 | ||
|
|
ca41a2141c | ||
|
|
08f409af73 | ||
|
|
efa60550fb | ||
|
|
f599206bf4 | ||
|
|
2f5d159428 | ||
|
|
2be3d50389 | ||
|
|
46b58f1b5c | ||
|
|
e87527cbcd | ||
|
|
091844219b | ||
|
|
de796e5a89 | ||
|
|
f988088412 | ||
|
|
c4a51ab719 | ||
|
|
f58376607a | ||
|
|
839048d87c | ||
|
|
3b3463f889 | ||
|
|
d3396304ec | ||
|
|
ae09caf7ad | ||
|
|
e1052c209b | ||
|
|
cd3aad59e1 | ||
|
|
bcbf65f95e | ||
|
|
1189374860 | ||
|
|
9f2eb8fa83 | ||
|
|
7b18e15e5b | ||
|
|
00bfc1507e | ||
|
|
47a58e7393 | ||
|
|
c04b972d27 | ||
|
|
85b9b9d3a3 | ||
|
|
3655eef971 | ||
|
|
87dd356204 | ||
|
|
a89ec34f7c | ||
|
|
444dcacb14 | ||
|
|
2011a1ca7a | ||
|
|
7e0c36ede5 | ||
|
|
e8d08d039e | ||
|
|
5e3258913e | ||
|
|
44e14926e4 | ||
|
|
592e945c28 | ||
|
|
5d5c787365 | ||
|
|
bb79def1d9 | ||
|
|
bd4a38bf54 | ||
|
|
abf18d74db | ||
|
|
f144354229 | ||
|
|
97670bbc84 | ||
|
|
82d6f54337 | ||
|
|
a4baee6e3b | ||
|
|
95b01e7d7a | ||
|
|
c2437fc419 | ||
|
|
9381459458 | ||
|
|
28a7c16895 | ||
|
|
c1141e6c87 | ||
|
|
6e686c6c8b | ||
|
|
1ccddb2155 | ||
|
|
7c8e52d5e9 | ||
|
|
0dc1dc198d | ||
|
|
20bfb5c5f7 | ||
|
|
be87f5617a | ||
|
|
3117df1282 | ||
|
|
be685437aa | ||
|
|
ff3801be71 | ||
|
|
702c3245bd | ||
|
|
14002300c5 | ||
|
|
ad417ec061 | ||
|
|
a6ec296129 | ||
|
|
1b10bbbfe4 | ||
|
|
aaa1b2d6c7 | ||
|
|
1cb169e886 | ||
|
|
9b9bb4c114 | ||
|
|
2536f36596 | ||
|
|
5f160c0927 | ||
|
|
0c4658a3ef | ||
|
|
33cd70065a | ||
|
|
450577d5a7 | ||
|
|
5a23ba0f76 | ||
|
|
064ce32b8a | ||
|
|
2c064d0200 | ||
|
|
51ee6d167c | ||
|
|
049345a39c | ||
|
|
a7e0cf61a3 | ||
|
|
1b0462f52e | ||
|
|
2bae86079e | ||
|
|
dcab44ab68 | ||
|
|
9f0629eef1 | ||
|
|
f6c938457f | ||
|
|
647ac72588 | ||
|
|
2975038696 | ||
|
|
861094cc83 | ||
|
|
2368913612 | ||
|
|
22ece2e586 | ||
|
|
ae788414f8 | ||
|
|
ebc7017ded | ||
|
|
876ff94782 | ||
|
|
76d1b1865b | ||
|
|
85dd8558f4 | ||
|
|
d0d95f3c42 | ||
|
|
c46a82d0f8 | ||
|
|
7654012292 | ||
|
|
65c8c82f74 | ||
|
|
d368eb2ff5 | ||
|
|
3cbb199870 | ||
|
|
b51a08bf4e | ||
|
|
b31efc8083 | ||
|
|
6669b983b1 | ||
|
|
b6e5a2fced | ||
|
|
6de09e0940 | ||
|
|
b6f3914d79 | ||
|
|
28402c58b3 | ||
|
|
77de0e445e | ||
|
|
a037d92c97 | ||
|
|
5e829ae7bb | ||
|
|
b5031588ce | ||
|
|
85319d9e8d | ||
|
|
39872200ae | ||
|
|
6a4af929f1 | ||
|
|
5b966c503c | ||
|
|
75628b6096 | ||
|
|
c12e516f5d | ||
|
|
01073fd6a5 | ||
|
|
dc72442764 | ||
|
|
7e04f50852 | ||
|
|
ea6e274810 | ||
|
|
86e5c429bd | ||
|
|
f32398ba8d | ||
|
|
684c2d53f1 | ||
|
|
b4594e23c5 | ||
|
|
b6028721af | ||
|
|
e15a6192b6 | ||
|
|
d1eb14f638 | ||
|
|
394a8b5d12 | ||
|
|
dae8e96fe1 | ||
|
|
8f01bf911e | ||
|
|
932f56812c | ||
|
|
d80084bfb7 | ||
|
|
d265a385f8 | ||
|
|
80f469b5b6 | ||
|
|
f2c37ec162 | ||
|
|
8e8ae949df | ||
|
|
3d24dc491d | ||
|
|
f593265687 | ||
|
|
6d488b042c | ||
|
|
d5ef630743 | ||
|
|
b47c9d75df | ||
|
|
d0d08b1ee1 | ||
|
|
ffaec7aa07 | ||
|
|
1587521bd3 | ||
|
|
c04c423c0d | ||
|
|
7b5c60c3c7 | ||
|
|
8317503b20 | ||
|
|
f6c838e6ea | ||
|
|
5d64ca3555 | ||
|
|
392106d44a | ||
|
|
df55110b9b | ||
|
|
d9a06d16f1 | ||
|
|
c424517770 | ||
|
|
363e9aa9a8 | ||
|
|
7131c13500 | ||
|
|
934a00eff1 | ||
|
|
a238390b73 | ||
|
|
54e170ef88 | ||
|
|
df3cfbb956 | ||
|
|
14756e47f7 | ||
|
|
90edc4289f | ||
|
|
7ae618d803 | ||
|
|
e19447b700 | ||
|
|
ab18c12a69 | ||
|
|
a456eae8ba | ||
|
|
d8308fe7a3 | ||
|
|
a75f8bdc45 | ||
|
|
a71aaf75a1 | ||
|
|
6fdd91b8c8 | ||
|
|
62c3969185 | ||
|
|
2d608cd882 | ||
|
|
ae8fe083ed | ||
|
|
6b3d9db4e9 | ||
|
|
332fae3761 | ||
|
|
039f62209c | ||
|
|
a43ade103c | ||
|
|
a6f1d48670 | ||
|
|
bd65af43eb | ||
|
|
6f9133cd4f | ||
|
|
441c82b4c9 | ||
|
|
fa7cff4123 | ||
|
|
1b69064752 | ||
|
|
ada05cf279 | ||
|
|
4b78a8b637 | ||
|
|
5c5afd2790 | ||
|
|
74ee6f34e4 | ||
|
|
9a9b7aeb86 | ||
|
|
cfc01bbc4f | ||
|
|
aaac6cc678 | ||
|
|
99fdf0c038 | ||
|
|
6ccecfecae | ||
|
|
e5f0a7ef73 | ||
|
|
de54f70570 | ||
|
|
e1c6118cb4 | ||
|
|
a3e4865d97 | ||
|
|
641df50422 | ||
|
|
0f026ed56c | ||
|
|
57a3c5f178 | ||
|
|
522ec8e071 | ||
|
|
7b1c3d8b3a | ||
|
|
5ba69b5021 | ||
|
|
fd796b54ef | ||
|
|
660344b623 | ||
|
|
d20c29a758 | ||
|
|
604cc0514c | ||
|
|
ff351455dd | ||
|
|
8f74bd32a9 | ||
|
|
c181afe8c6 | ||
|
|
9ade3e6b6a | ||
|
|
6f9737ae38 | ||
|
|
0a552b4346 | ||
|
|
6367081e9d | ||
|
|
3e73683d99 | ||
|
|
2b345ca447 | ||
|
|
20593f2fa2 | ||
|
|
ca45aa1cf7 | ||
|
|
e408836c2a | ||
|
|
3000a9e2df | ||
|
|
b83236de2a | ||
|
|
46b3b8aaec | ||
|
|
59f5c82684 | ||
|
|
bf20760a4f | ||
|
|
113852a518 | ||
|
|
e3670b5337 | ||
|
|
d0894e50d7 | ||
|
|
8a3681c391 | ||
|
|
278b9ebf7f | ||
|
|
0e27923739 | ||
|
|
0959a43fb9 | ||
|
|
3831951b65 | ||
|
|
50428b4d26 | ||
|
|
0ed239b28b | ||
|
|
63a617be65 | ||
|
|
e93c7648d1 | ||
|
|
2cefb0e829 | ||
|
|
3d150e8308 | ||
|
|
570f7a82de | ||
|
|
2bae61e99b | ||
|
|
31357cde95 | ||
|
|
93f4cd5c6e | ||
|
|
cf3c45466a | ||
|
|
b86d36373f | ||
|
|
4cc10826b7 | ||
|
|
0dcb669548 | ||
|
|
0fcd6db32d | ||
|
|
d0685e6d83 | ||
|
|
1b338e450c | ||
|
|
083266b11d | ||
|
|
6277f39aec | ||
|
|
834bcb79c0 | ||
|
|
97b946a3b8 | ||
|
|
212e43683e | ||
|
|
d2b267e683 | ||
|
|
4225b809c5 | ||
|
|
73760f6499 | ||
|
|
ef520571d5 | ||
|
|
caca6995a1 | ||
|
|
188d8430a2 | ||
|
|
f15a4f807e | ||
|
|
428f1ce29d | ||
|
|
b362d955c4 | ||
|
|
faa910161a | ||
|
|
db0658c785 | ||
|
|
b339e40ac1 | ||
|
|
fb5ca615e7 | ||
|
|
63be66e602 | ||
|
|
62efa30dc0 | ||
|
|
4f3d54fb87 | ||
|
|
2394a725e4 | ||
|
|
a8de029389 | ||
|
|
251d07f38e | ||
|
|
9ec7e67b17 | ||
|
|
6cf9a95d78 | ||
|
|
387ada93ca | ||
|
|
c63ac4783f | ||
|
|
2f837593b7 | ||
|
|
bdacbb6a35 | ||
|
|
1679764a7f | ||
|
|
c6de0be951 | ||
|
|
59aefda4b1 | ||
|
|
20eb7ab29c | ||
|
|
2c1d1646e1 | ||
|
|
94b1c7256b | ||
|
|
3d26f288f5 | ||
|
|
73d3352f90 | ||
|
|
84dbb94b5d | ||
|
|
d5db52264a | ||
|
|
9998997a73 | ||
|
|
7c953050f2 | ||
|
|
99cda67246 | ||
|
|
073b082935 | ||
|
|
3872ac21a3 | ||
|
|
76829742d8 | ||
|
|
4f28aa930c | ||
|
|
7ce20182c8 | ||
|
|
b32568047d | ||
|
|
3524d056f1 | ||
|
|
992018186f | ||
|
|
c0de1b2805 | ||
|
|
c3745777fb | ||
|
|
b922f4d1c6 | ||
|
|
92bf470989 | ||
|
|
c0486a1b7b | ||
|
|
fe1eb32926 | ||
|
|
4ae16e8fd2 | ||
|
|
e4983b8bde | ||
|
|
eefdf6c976 | ||
|
|
8613475988 | ||
|
|
8c50d05776 | ||
|
|
fb3cf9c315 | ||
|
|
f50e5312c3 | ||
|
|
79d624e798 | ||
|
|
d8d3b57929 | ||
|
|
48fa640f5b | ||
|
|
84a815e7e6 | ||
|
|
737027ded4 | ||
|
|
8c9e8a08dd | ||
|
|
ea01007716 | ||
|
|
531b6cbf69 | ||
|
|
ef43d31dd3 | ||
|
|
93579f83f2 | ||
|
|
2a78b8fb64 | ||
|
|
2744fe1d9c | ||
|
|
8429bdc9a3 | ||
|
|
946331168a | ||
|
|
ddb25d5ff5 | ||
|
|
125cb6e5c2 | ||
|
|
c6eb21ec51 | ||
|
|
cb066233c9 | ||
|
|
9921b2f3de | ||
|
|
26d7fc767c | ||
|
|
d9df2930cb | ||
|
|
658a961459 | ||
|
|
3731a7ea23 | ||
|
|
06755978b2 | ||
|
|
02469acebb | ||
|
|
e2b47228db | ||
|
|
13480ad99e | ||
|
|
8071faa62d | ||
|
|
9ea294586a | ||
|
|
a56a11ff3e | ||
|
|
b4084b45cb | ||
|
|
26e3c0d753 | ||
|
|
6d0194acc0 | ||
|
|
db75a99808 | ||
|
|
a04755efed | ||
|
|
ba72d7f478 | ||
|
|
cd808c76dd | ||
|
|
630bb2b19c | ||
|
|
f9a7aa59de | ||
|
|
9205e0893a | ||
|
|
7137bf227e |
15
.eslint/index.js
Normal file
15
.eslint/index.js
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
const cds = require("@sap/eslint-plugin-cds");
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
configs: {
|
||||||
|
recommended: {
|
||||||
|
plugins: ["cloud-cap-samples"],
|
||||||
|
rules: {
|
||||||
|
"cloud-cap-samples/no-open-services": ["error", "show"]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
rules: {
|
||||||
|
"no-open-services": cds.createRule(require("./rules/no-open-services")),
|
||||||
|
}
|
||||||
|
};
|
||||||
5
.eslint/package.json
Normal file
5
.eslint/package.json
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
"name": "eslint-plugin-cloud-cap-samples",
|
||||||
|
"description": "Contains shareable custom lint rules for this repository",
|
||||||
|
"version": "1.0.0"
|
||||||
|
}
|
||||||
29
.eslint/rules/no-open-services.js
Normal file
29
.eslint/rules/no-open-services.js
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
module.exports = {
|
||||||
|
meta: {
|
||||||
|
docs: {
|
||||||
|
description: "Service without `@requires/restrict` should not expose fields with personal data.",
|
||||||
|
version: "1.0.0"
|
||||||
|
},
|
||||||
|
fixable: "code",
|
||||||
|
model: "inferred"
|
||||||
|
},
|
||||||
|
create: function (context) {
|
||||||
|
const services = context.getModel() ? context.getModel().services : [];
|
||||||
|
const unprotectedServices = services.filter(s => !s["@requires"] && !s["@restrict"]).map(s => s.name)
|
||||||
|
return { entity: checkForExposedFields };
|
||||||
|
|
||||||
|
function checkForExposedFields(entity) {
|
||||||
|
const entityInUnprotectedService = unprotectedServices.some(service => entity.name.includes(service))
|
||||||
|
if (entityInUnprotectedService) {
|
||||||
|
const elements = Object.keys(entity.elements).filter((name) => ["createdBy", "modifiedBy"].includes(name))
|
||||||
|
for (let element of elements) {
|
||||||
|
context.report({
|
||||||
|
message: `Field '${element}' in '${entity.name}' exposes personal data. Remove field or add \`@restrict/requires\`.`,
|
||||||
|
node: context.getNode(entity),
|
||||||
|
file: entity.$location.file
|
||||||
|
})
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
25
.eslintrc
25
.eslintrc
@@ -1,16 +1,23 @@
|
|||||||
{
|
{
|
||||||
"extends": "eslint:recommended",
|
"extends": [
|
||||||
|
"eslint:recommended",
|
||||||
|
"plugin:@sap/cds/recommended",
|
||||||
|
"plugin:cloud-cap-samples/recommended"
|
||||||
|
],
|
||||||
|
"plugins": [
|
||||||
|
"cloud-cap-samples"
|
||||||
|
],
|
||||||
"env": {
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"es2022": true,
|
||||||
"node": true,
|
"node": true,
|
||||||
"es6": true,
|
"jest": true,
|
||||||
"jest": true
|
"mocha": true
|
||||||
},
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": 2018
|
|
||||||
},
|
},
|
||||||
"globals": {
|
"globals": {
|
||||||
"SELECT": true,
|
"SELECT": true,
|
||||||
"INSERT": true,
|
"INSERT": true,
|
||||||
|
"UPSERT": true,
|
||||||
"UPDATE": true,
|
"UPDATE": true,
|
||||||
"DELETE": true,
|
"DELETE": true,
|
||||||
"CREATE": true,
|
"CREATE": true,
|
||||||
@@ -19,6 +26,8 @@
|
|||||||
},
|
},
|
||||||
"rules": {
|
"rules": {
|
||||||
"no-console": "off",
|
"no-console": "off",
|
||||||
"require-atomic-updates": "off"
|
"require-atomic-updates": "off",
|
||||||
|
"require-await": "warn",
|
||||||
|
"no-unused-vars": ["warn", { "argsIgnorePattern": "_" }]
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: This channel is CLOSED.
|
||||||
|
about: Use SAP community instead
|
||||||
|
url: https://answers.sap.com/tags/9f13aee1-834c-4105-8e43-ee442775e5ce
|
||||||
8
.github/dependabot.yml
vendored
Normal file
8
.github/dependabot.yml
vendored
Normal file
@@ -0,0 +1,8 @@
|
|||||||
|
version: 2
|
||||||
|
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: npm
|
||||||
|
directory: /
|
||||||
|
versioning-strategy: increase-if-necessary
|
||||||
|
schedule:
|
||||||
|
interval: daily
|
||||||
29
.github/workflows/node.js.yml
vendored
Normal file
29
.github/workflows/node.js.yml
vendored
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
# This workflow will do a clean install of node dependencies, build the source code and run tests across different versions of node
|
||||||
|
# For more information see: https://help.github.com/actions/language-and-framework-guides/using-nodejs-with-github-actions
|
||||||
|
|
||||||
|
name: CI
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ main ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ main ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
node-version: [16.x, 14.x]
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- name: Use Node.js ${{ matrix.node-version }}
|
||||||
|
uses: actions/setup-node@v1
|
||||||
|
with:
|
||||||
|
node-version: ${{ matrix.node-version }}
|
||||||
|
- run: npm i -g npm@8
|
||||||
|
- run: npm ci
|
||||||
|
- run: npm test
|
||||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -12,4 +12,11 @@ target/
|
|||||||
*.mtar
|
*.mtar
|
||||||
connection.properties
|
connection.properties
|
||||||
default-env.json
|
default-env.json
|
||||||
|
.cdsrc-private.json
|
||||||
packages/messageBox
|
packages/messageBox
|
||||||
|
reviews/msg-box
|
||||||
|
reviews/db/test.db
|
||||||
|
|
||||||
|
*.openapi3.json
|
||||||
|
*.sqlite
|
||||||
|
*.db
|
||||||
|
|||||||
3
.npmrc
Normal file
3
.npmrc
Normal file
@@ -0,0 +1,3 @@
|
|||||||
|
# Ensure we always use public packages, i.e. avoid using local registries from ~/.npmrc
|
||||||
|
@sap:registry=https://registry.npmjs.org/
|
||||||
|
registry=https://registry.npmjs.org/
|
||||||
29
.reuse/dep5
Normal file
29
.reuse/dep5
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
Format: https://www.debian.org/doc/packaging-manuals/copyright-format/1.0/
|
||||||
|
Upstream-Name: cloud-cap-samples
|
||||||
|
Upstream-Contact: <Christian Georgi (christian.georgi@sap.com)>
|
||||||
|
Source: https://github.com/SAP-samples/cloud-cap-samples
|
||||||
|
Disclaimer: The code in this project may include calls to APIs (“API Calls”) of
|
||||||
|
SAP or third-party products or services developed outside of this project
|
||||||
|
(“External Products”).
|
||||||
|
“APIs” means application programming interfaces, as well as their respective
|
||||||
|
specifications and implementing code that allows software to communicate with
|
||||||
|
other software.
|
||||||
|
API Calls to External Products are not licensed under the open source license
|
||||||
|
that governs this project. The use of such API Calls and related External
|
||||||
|
Products are subject to applicable additional agreements with the relevant
|
||||||
|
provider of the External Products. In no event shall the open source license
|
||||||
|
that governs this project grant any rights in or to any External Products,or
|
||||||
|
alter, expand or supersede any terms of the applicable additional agreements.
|
||||||
|
If you have a valid license agreement with SAP for the use of a particular SAP
|
||||||
|
External Product, then you may make use of any API Calls included in this
|
||||||
|
project’s code for that SAP External Product, subject to the terms of such
|
||||||
|
license agreement. If you do not have a valid license agreement for the use of
|
||||||
|
a particular SAP External Product, then you may only make use of any API Calls
|
||||||
|
in this project for that SAP External Product for your internal, non-productive
|
||||||
|
and non-commercial test and evaluation of such API Calls. Nothing herein grants
|
||||||
|
you any rights to use or access any SAP External Product, or provide any third
|
||||||
|
parties the right to use of access any SAP External Product, through API Calls.
|
||||||
|
|
||||||
|
Files: *
|
||||||
|
Copyright: 2019-2020 SAP SE or an SAP affiliate company and cap-cloud-samples
|
||||||
|
License: Apache-2.0
|
||||||
117
.tours/db-native.tour
Normal file
117
.tours/db-native.tour
Normal file
@@ -0,0 +1,117 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://aka.ms/codetour-schema",
|
||||||
|
"title": "Database Functions",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"title": "Introduction",
|
||||||
|
"description": "### Database Functions in CDS Models\n\nIn this tour, you'll learn how to add database-specific functions to CDS models in your application."
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "bookshop/db/schema.cds",
|
||||||
|
"description": "#### Basic Schema\n\nWe want to add two fields to the `Authors` entity, one for the author's age and one for the span of years that she or he lived.\n\nThese two fields can be computed out of the existing `dateOfBirth` and `dateOfDeath` fields.",
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 19,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 21,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Base fields in Author"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "bookshop/srv/admin-service.cds",
|
||||||
|
"description": "This is how the `Authors` entity gets exposed in an OData or REST service.\n\nIn the next step, you'll see how we extend this projection.",
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 4,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 5,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Authors service"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "fiori/db/sqlite/index.cds",
|
||||||
|
"description": "#### SQLite Implementation\n\nHere's the first implementation for SQLite. It computes the two fields `age` and `lifetime` through SQLite's [strftime](https://sqlite.org/lang_datefunc.html) function.\n\nThrough the [`extend projection`](https://cap.cloud.sap/docs/cds/cdl#extend-view) clause you can add additional fields to projection entities. These are deployed as database views, which is why we can integrate the database functions in the first place.\n",
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 7,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 11,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "SQLite implementation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "fiori/db/hana/index.cds",
|
||||||
|
"description": "#### SAP HANA Implementation\n\nThis is the second implementation for SAP HANA. It computes the same two fields `age` and `lifetime` through the [YEARS_BETWEEN](https://help.sap.com/viewer/7c78579ce9b14a669c1f3295b0d8ca16/Cloud/en-US/7c0d2c161ea34def86de3f5eadd6a0af.html) and [YEAR](https://help.sap.com/viewer/7c78579ce9b14a669c1f3295b0d8ca16/Cloud/en-US/20f5fac6751910148dabd3c6821f907d.html) functions of SAP HANA.\n\n#### File Layout and Code Structure\n\nNote the path of the `.cds` file we are in: it's in a subfolder of `db`, so that it's _not_ automatically picked up when we start the application. The same is true for the SQLite implementation: it's in a separate `db/sqlite/` folder as well. In the next step, you'll see how these files are loaded.\n\nAlso, we choose to implement all of that as an extension of the original bookshop here in the _fiori_ package. See the first [CAP Samples] code tour for more details on the different packages of this repository.",
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 7,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 11,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "SAP HANA implementation"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "fiori/package.json",
|
||||||
|
"description": "#### Configuration\n\nThe `cds.requires` section in `package.json` is a place to configure which of the `db/sqlite` and `db/hana` folders are used for which database.\n\nWe use [Node.js profiles](https://cap.cloud.sap/docs/node.js/cds-env#profiles) to separate the configuration.\nIn the `development` profile, you can see that `db/sqlite` is set as the model, while the `db/hana` folder is configured in the `production` profile. `db-ext` is a pseudo datasource, its name doesn't matter.\n\nSee [`cds.resolve`](https://cap.cloud.sap/docs/node.js/cds-compile#cds-resolve) to learn more about how models are found.",
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 41,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 48,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Configuration"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "fiori/package.json",
|
||||||
|
"description": "#### Run with SQLite\n\nTo run with `development` and an in-memory SQLite database, you don't need to do anything special, because it's activated by default. Just run:\n\n>> cds watch fiori\n\nThen open [http://localhost:4004/admin/Authors](http://localhost:4004/admin/Authors) to see the two new fields.\n",
|
||||||
|
"line": 43,
|
||||||
|
"title": "Run with SQLite"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "fiori/package.json",
|
||||||
|
"description": "#### Deploy the CDS Model to SAP HANA\n\nTo 'activate' SAP HANA through the `production` profile, you can use the global `--production` flag:\n\n>> cd fiori; cds deploy --to hana --production\n\n[Learn more about SAP HANA deployment](https://cap.cloud.sap/docs/guides/databases#get-hana)\n\n#### Run the Application\n\n>> cd fiori; cds watch --production\n\nThe service on [http://localhost:4004/admin/Authors](http://localhost:4004/admin/Authors) is the same as before, but this time the `Authors` entity is backed by a database view with an SAP HANA function.\n\n#### More\n\nIf you don't see data, you can add some in the next step.",
|
||||||
|
"line": 46,
|
||||||
|
"title": "Run with SAP HANA"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "fiori/test/requests.http",
|
||||||
|
"description": "### Add More Data\n\nOptionally you can add some `Authors` data by clicking on the _Send Request_ link (provided by the [REST client](https://marketplace.visualstudio.com/items?itemName=humao.rest-client) extension).",
|
||||||
|
"line": 72,
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 67,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 73,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Add Data"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Wrap-up",
|
||||||
|
"description": "### Summary\n\nThat's it! You have seen: \n- How to integrate database-specific functions in a CDS model.\n- How to switch between the two implementations for SQLite and SAP HANA."
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
139
.tours/samples.tour
Normal file
139
.tours/samples.tour
Normal file
@@ -0,0 +1,139 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://aka.ms/codetour-schema",
|
||||||
|
"title": "CAP Samples",
|
||||||
|
"steps": [
|
||||||
|
{
|
||||||
|
"title": "Welcome",
|
||||||
|
"file": "README.md",
|
||||||
|
"description": "### Welcome to CAP Samples!\n\nThis tour leads you through a collection of samples for the [SAP Cloud Application Programming Model (CAP)](https://cap.cloud.sap).\nYou will learn which features of the programming model are demonstrated in which sample.\n\nLet's start!",
|
||||||
|
"line": 2,
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 3,
|
||||||
|
"character": 108
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "hello/srv/world.cds",
|
||||||
|
"description": "### Hello World!\n\nThis is a simplistic [Hello World](https://cap.cloud.sap/docs/get-started/hello-world) service using [CDS](https://cap.cloud.sap/docs/cds/) and [cds.services](https://cap.cloud.sap/docs/node.js/api#services-api).",
|
||||||
|
"line": 2,
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 4,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Hello World!"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "bookshop/db/schema.cds",
|
||||||
|
"description": "### A Bookshop!\n\nIntroduces:\n- [Project Setup](https://cap.cloud.sap/docs/get-started/) and [Layouts](https://cap.cloud.sap/docs/get-started/projects)\n- [Domain Modeling](https://cap.cloud.sap/docs/guides/domain-models)\n- [Defining Services](https://cap.cloud.sap/docs/guides/providing-services)\n- [Generic Providers](https://cap.cloud.sap/docs/guides/generic-providers)\n- [Adding Custom Logic](https://cap.cloud.sap/docs/guides/service-impl)\n- [Using Databases](https://cap.cloud.sap/docs/guides/databases)\n",
|
||||||
|
"line": 1,
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 32,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Bookshop"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "common/index.cds",
|
||||||
|
"description": "### Extend and Reuse\n\nShowcases how to extend [@sap/cds/common](https://cap.cloud.sap/docs/cds/common) thereby covering:\n- Building [extension packages](https://cap.cloud.sap/docs/guides/domain-models#aspects-extensibility)\n- Providing [reuse packages](https://cap.cloud.sap/docs/get-started/projects#sharing-and-reusing-content)\n- [Verticalization](https://cap.cloud.sap/docs/cds/common#adapting-to-your-needs)\n- Using [Aspects](https://cap.cloud.sap/docs/cds/cdl#aspects)\n- Used in the [fiori app sample](#fiori)\n",
|
||||||
|
"line": 1,
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 46,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Common"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "orders/db/schema.cds",
|
||||||
|
"description": "### Orders - Compositions and Serving Documents\n\nA standalone orders management service, demonstrating:\n- Using [Compositions](https://cap.cloud.sap/docs/cds/cdl#compositions) in [Domain Models](https://cap.cloud.sap/docs/guides/domain-models), along with\n- [Serving deeply nested documents](https://cap.cloud.sap/docs/guides/generic-providers#serving-structured-data)\n",
|
||||||
|
"line": 1,
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 27,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Orders"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "reviews/db/schema.cds",
|
||||||
|
"description": "### Reviews - More Modularity\n\nShows how to implement a modular service to manage product reviews, including:\n- Consuming other services synchronously and asynchronously\n- Serving requests synchronously\n- Emitting events asynchronously\n- Grow as you go, with:\n- Mocking app services\n- Running service meshes\n- Late-cut Micro Services\n- As well as managed data, input validations, and authorization\n",
|
||||||
|
"line": 1,
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 39,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Reviews"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"title": "Bookstore",
|
||||||
|
"description": "### Bookstore - Reuse and UI\n\n- A [composite app, reusing and combining](https://cap.cloud.sap/docs/guides/reuse-and-compose) these packages:\n - [@capire/bookshop](bookshop)\n - [@capire/reviews](reviews)\n - [@capire/orders](orders)\n - [@capire/common](common)\n- [The Vue.js app](bookshop/app/vue) imported from bookshop is served as well\n- [The Vue.js app](reviews/app/vue) imported from reviews is served as well\n- [The Fiori app](orders/app) imported from orders is served as well\n- [OpenAPI export + Swagger UI](https://cap.cloud.sap/docs/advanced/openapi)"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "fiori/app/services.cds",
|
||||||
|
"description": "### Annotations for SAP Fiori Elements\n\nAdds an SAP Fiori elements application to bookstore, thereby introducing:\n- OData Annotations in `.cds` files\n- Support for Fiori Draft\n- Support for Value Helps\n- Serving SAP Fiori apps locally\n\nSee the [Serving Fiori UIs](https://cap.cloud.sap/docs/advanced/fiori) documentation for more information.",
|
||||||
|
"line": 1,
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 1,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 13,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Fiori"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"file": "package.json",
|
||||||
|
"description": "### All-in-one Monorepo\n\nEach sample sub directory essentially is a standard npm package, some with standard npm dependencies to other samples. The root folder's [package.json](package.json) has local links to the sub folders, such that an `npm install` populates a local `node_modules` folder acts like a local npm registry to the individual sample packages.\n",
|
||||||
|
"selection": {
|
||||||
|
"start": {
|
||||||
|
"line": 8,
|
||||||
|
"character": 1
|
||||||
|
},
|
||||||
|
"end": {
|
||||||
|
"line": 16,
|
||||||
|
"character": 1
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"title": "Packages"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"isPrimary": true,
|
||||||
|
"description": "Overview of CAP Samples for Node.js"
|
||||||
|
}
|
||||||
21
.vscode/extensions.json
vendored
Normal file
21
.vscode/extensions.json
vendored
Normal file
@@ -0,0 +1,21 @@
|
|||||||
|
{
|
||||||
|
// See https://go.microsoft.com/fwlink/?LinkId=827846 to learn about workspace recommendations.
|
||||||
|
// Extension identifier format: ${publisher}.${name}. Example: vscode.csharp
|
||||||
|
|
||||||
|
// List of extensions which should be recommended for users of this workspace.
|
||||||
|
"recommendations": [
|
||||||
|
"sapse.vscode-cds",
|
||||||
|
"dbaeumer.vscode-eslint",
|
||||||
|
"esbenp.prettier-vscode",
|
||||||
|
"mechatroner.rainbow-csv",
|
||||||
|
"humao.rest-client",
|
||||||
|
"alexcvzz.vscode-sqlite",
|
||||||
|
"hbenl.vscode-mocha-test-adapter",
|
||||||
|
"sdras.night-owl",
|
||||||
|
"vsls-contrib.codetour"
|
||||||
|
],
|
||||||
|
// List of extensions recommended by VS Code that should not be recommended for users of this workspace.
|
||||||
|
"unwantedRecommendations": [
|
||||||
|
|
||||||
|
]
|
||||||
|
}
|
||||||
60
.vscode/launch.json
vendored
60
.vscode/launch.json
vendored
@@ -5,32 +5,52 @@
|
|||||||
"version": "0.2.0",
|
"version": "0.2.0",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
{
|
{
|
||||||
"name": "bookshop", "request": "launch", "type": "node", "runtimeExecutable": "npx", "runtimeArgs": [ "-n" ],
|
"name": "bookshop",
|
||||||
"args": [ "--", "cds", "run", "--in-memory" ],
|
"command": "npx cds watch bookshop",
|
||||||
"cwd": "${workspaceFolder}/packages/bookshop",
|
"type": "node-terminal",
|
||||||
"console": "integratedTerminal",
|
"request": "launch",
|
||||||
"skipFiles": ["<node_internals>/**"]
|
"skipFiles": [
|
||||||
|
"<node_internals>/**",
|
||||||
|
"**/node_modules/**",
|
||||||
|
"**/cds/lib/lazy.js",
|
||||||
|
"**/cds/lib/req/cds-context.js",
|
||||||
|
"**/odata-v4/okra/**"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "cds run ...", "request": "launch", "type": "node", "runtimeExecutable": "npx", "runtimeArgs": [ "-n" ],
|
"name": "Fiori App",
|
||||||
"args": [ "--", "cds", "run", "--with-mocks", "--in-memory?" ],
|
"command": "npx cds watch fiori",
|
||||||
"cwd": "${workspaceFolder}/packages/${input:service}",
|
"type": "node-terminal",
|
||||||
"console": "integratedTerminal",
|
"request": "launch",
|
||||||
"skipFiles": ["<node_internals>/**"]
|
"skipFiles": [
|
||||||
}
|
"<node_internals>/**",
|
||||||
|
"**/node_modules/**",
|
||||||
|
"**/cds/lib/lazy.js",
|
||||||
|
"**/cds/lib/req/cds-context.js",
|
||||||
|
"**/odata-v4/okra/**"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Debug Mocha Tests",
|
||||||
|
"type": "node",
|
||||||
|
"request": "attach",
|
||||||
|
"port": 9229,
|
||||||
|
"continueOnAttach": true,
|
||||||
|
"skipFiles": [
|
||||||
|
"<node_internals>/**",
|
||||||
|
"**/node_modules/**",
|
||||||
|
"**/cds/lib/lazy.js",
|
||||||
|
"**/cds/lib/req/cds-context.js",
|
||||||
|
"**/odata-v4/okra/**",
|
||||||
|
]
|
||||||
|
},
|
||||||
],
|
],
|
||||||
"inputs": [
|
"inputs": [
|
||||||
{
|
{
|
||||||
"type": "pickString",
|
"type": "pickString",
|
||||||
"id": "service",
|
"id": "sample",
|
||||||
"description": "Which service do you want to start?",
|
"description": "Which sample do you want to start?",
|
||||||
"options": [
|
"options": [ "bookshop", "fiori", "reviews", "reviews" ],
|
||||||
"bookshop",
|
|
||||||
"bookstore",
|
|
||||||
"media-server",
|
|
||||||
"office-supplies",
|
|
||||||
"reviews-service"
|
|
||||||
],
|
|
||||||
"default": "bookshop"
|
"default": "bookshop"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
|
|||||||
25
.vscode/settings.json
vendored
25
.vscode/settings.json
vendored
@@ -1,6 +1,27 @@
|
|||||||
{
|
{
|
||||||
"files.exclude": {
|
"files.exclude": {
|
||||||
|
".reuse/**": true,
|
||||||
"**/.gitignore": true,
|
"**/.gitignore": true,
|
||||||
"**/.vscode": true
|
"**/.vscode": true,
|
||||||
}
|
"LICENSES/**": true
|
||||||
|
},
|
||||||
|
"debug.javascript.terminalOptions": {
|
||||||
|
"skipFiles": [
|
||||||
|
"<node_internals>/**",
|
||||||
|
"**/node_modules/**",
|
||||||
|
"**/cds/lib/lazy.js",
|
||||||
|
"**/cds/lib/req/cds-context.js",
|
||||||
|
"**/odata-v4/okra/**"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"mochaExplorer.debuggerConfig": "Debug Mocha Tests",
|
||||||
|
"mochaExplorer.parallel": true,
|
||||||
|
"eslint.validate": [
|
||||||
|
"cds",
|
||||||
|
"csn",
|
||||||
|
"csv",
|
||||||
|
"csv (semicolon)",
|
||||||
|
"tsv",
|
||||||
|
"tab"
|
||||||
|
],
|
||||||
}
|
}
|
||||||
|
|||||||
28
.vscode/tasks.json
vendored
28
.vscode/tasks.json
vendored
@@ -1,17 +1,15 @@
|
|||||||
{
|
{
|
||||||
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
// See https://go.microsoft.com/fwlink/?LinkId=733558
|
||||||
// for the documentation about the tasks.json format
|
// for the documentation about the tasks.json format
|
||||||
"version": "2.0.0",
|
"version": "2.0.0",
|
||||||
"tasks": [
|
"tasks": [
|
||||||
{
|
{
|
||||||
"type": "npm", "script": "watch", "path": "packages/bookshop/",
|
"type": "npm",
|
||||||
"options": { "env": { "PORT": "4004" }},
|
"script": "jest",
|
||||||
"presentation": { "group": "A" }
|
"group": {
|
||||||
},
|
"kind": "test",
|
||||||
{
|
"isDefault": true
|
||||||
"type": "npm", "script": "watch", "path": "packages/reviews-service/",
|
}
|
||||||
"options": { "env": { "PORT": "5005" }},
|
}
|
||||||
"presentation": { "group": "A" }
|
]
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
}
|
||||||
391
LICENSE
391
LICENSE
@@ -1,190 +1,201 @@
|
|||||||
SAP SAMPLE CODE LICENSE AGREEMENT
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
Please scroll down and read the following SAP Sample Code License Agreement
|
http://www.apache.org/licenses/
|
||||||
carefully ("Agreement"). By downloading, installing, or otherwise using the
|
|
||||||
SAP sample code or any materials that accompany the sample code documentation
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
(collectively, the "Sample Code"), You agree that this Agreement forms a legally
|
|
||||||
binding agreement between You ("You" or "Your") and SAP SE, for and on behalf
|
1. Definitions.
|
||||||
of itself and its subsidiaries and affiliates (as defined in Section 15 of the
|
|
||||||
German Stock Corporation Act), and You agree to be bound by all of the terms
|
"License" shall mean the terms and conditions for use, reproduction,
|
||||||
and conditions stated in this Agreement. If You are trying to access or download
|
and distribution as defined by Sections 1 through 9 of this document.
|
||||||
the Sample Code on behalf of Your employer or as a consultant or agent of a
|
|
||||||
third party (either "Your Company"), You represent and warrant that You have
|
"Licensor" shall mean the copyright owner or entity authorized by
|
||||||
the authority to act on behalf of and bind Your Company to the terms of this
|
the copyright owner that is granting the License.
|
||||||
Agreement and everywhere in this Agreement that refers to 'You' or 'Your' shall
|
|
||||||
also include Your Company. If You do not agree to these terms, do not attempt
|
"Legal Entity" shall mean the union of the acting entity and all
|
||||||
to access or use the Sample Code.
|
other entities that control, are controlled by, or are under common
|
||||||
|
control with that entity. For the purposes of this definition,
|
||||||
1. LICENSE: Subject to the terms of this Agreement, SAP grants You a nonexclusive,
|
"control" means (i) the power, direct or indirect, to cause the
|
||||||
non-transferable, non-sublicensable, revocable, royalty-free,
|
direction or management of such entity, whether by contract or
|
||||||
limited license to use, copy, and modify the Sample Code solely for Your internal
|
otherwise, or (ii) ownership of fifty percent (50%) or more of the
|
||||||
business purposes.
|
outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
2. RESTRICTIONS: You must not use the Sample Code to: (a) impair, degrade or
|
"You" (or "Your") shall mean an individual or Legal Entity
|
||||||
reduce the performance or security of any SAP products, services or related
|
exercising permissions granted by this License.
|
||||||
technology (collectively, "SAP Products"); (b) enable the bypassing or
|
|
||||||
circumventing of SAP's license restrictions and/or provide users with access to
|
"Source" form shall mean the preferred form for making modifications,
|
||||||
the SAP Products to which such users are not licensed; or (c) permit mass data
|
including but not limited to software source code, documentation
|
||||||
extraction from an SAP Product to a non-SAP Product, including use,
|
source, and configuration files.
|
||||||
modification, saving or other processing of such data in the non-SAP Product.
|
|
||||||
Further, You must not: (i) provide or make the Sample Code available to any
|
"Object" form shall mean any form resulting from mechanical
|
||||||
third party other than your authorized employees, contractors and agents
|
transformation or translation of a Source form, including but
|
||||||
(collectively, “Representatives”) and solely to be used by Your Representatives
|
not limited to compiled object code, generated documentation,
|
||||||
for Your own internal business purposes; ii) remove or modify any marks or
|
and conversions to other media types.
|
||||||
proprietary notices from the Sample Code; iii) assign this Agreement, or any
|
|
||||||
interest therein, to any third party; (iv) use any SAP name, trademark or logo
|
"Work" shall mean the work of authorship, whether in Source or
|
||||||
without the prior written authorization of SAP; or (v) use the Sample Code to
|
Object form, made available under the License, as indicated by a
|
||||||
modify an SAP Product or decompile, disassemble or reverse engineer an SAP
|
copyright notice that is included in or attached to the work
|
||||||
Product (except to the extent permitted by applicable law). You are responsible
|
(an example is provided in the Appendix below).
|
||||||
for any breach of the terms of this Agreement by You or Your Representatives.
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object
|
||||||
3. INTELLECTUAL PROPERTY: SAP or its licensors retain all ownership and
|
form, that is based on (or derived from) the Work and for which the
|
||||||
intellectual property rights in and to the Sample Code and SAP Products. In
|
editorial revisions, annotations, elaborations, or other modifications
|
||||||
exchange for the right to use, copy and modify the Sample Code provided under
|
represent, as a whole, an original work of authorship. For the purposes
|
||||||
this Agreement, You covenant not to assert any intellectual property rights in
|
of this License, Derivative Works shall not include works that remain
|
||||||
or to any of Your products, services, or related technology that are based on
|
separable from, or merely link (or bind by name) to the interfaces of,
|
||||||
or incorporate the Sample Code against any individual or entity in respect of
|
the Work and Derivative Works thereof.
|
||||||
any current or future SAP Products.
|
|
||||||
|
"Contribution" shall mean any work of authorship, including
|
||||||
4. SAP AND THIRD PARTY APIS: The Sample Code may include API (application
|
the original version of the Work and any modifications or additions
|
||||||
programming interface) calls to SAP and third-party products or services. The
|
to that Work or Derivative Works thereof, that is intentionally
|
||||||
access or use of the third-party products and services to which the API calls
|
submitted to Licensor for inclusion in the Work by the copyright owner
|
||||||
are directed may be subject to additional terms and conditions between you and
|
or by an individual or Legal Entity authorized to submit on behalf of
|
||||||
SAP or such third parties. You (and not SAP) are solely responsible for
|
the copyright owner. For the purposes of this definition, "submitted"
|
||||||
understanding and complying with any additional terms and conditions that apply
|
means any form of electronic, verbal, or written communication sent
|
||||||
to the access or use of those APIs and/or third-party products and services.
|
to the Licensor or its representatives, including but not limited to
|
||||||
SAP does not grant You any rights in or to these APIs, products or services
|
communication on electronic mailing lists, source code control systems,
|
||||||
under this Agreement.
|
and issue tracking systems that are managed by, or on behalf of, the
|
||||||
|
Licensor for the purpose of discussing and improving the Work, but
|
||||||
5. FREE AND OPEN SOURCE COMPONENTS: The Sample Code may include third party
|
excluding communication that is conspicuously marked or otherwise
|
||||||
free or open source components ("FOSS Components"). You may have additional
|
designated in writing by the copyright owner as "Not a Contribution."
|
||||||
rights in such FOSS Components that are provided by the third party licensors
|
|
||||||
of those components.
|
"Contributor" shall mean Licensor and any individual or Legal Entity
|
||||||
6. THIRD PARTY DEPENDENCIES: The Sample Code may require third party software
|
on behalf of whom a Contribution has been received by Licensor and
|
||||||
dependencies ("Dependencies") for the use or operation of the Sample Code. These
|
subsequently incorporated within the Work.
|
||||||
Dependencies may be identified by SAP in Maven POM files, documentation or by
|
|
||||||
other means. SAP does not grant You any rights in or to such Dependencies under
|
2. Grant of Copyright License. Subject to the terms and conditions of
|
||||||
this Agreement. You are solely responsible for the acquisition, installation
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
and use of such Dependencies.
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
7. WARRANTY:
|
copyright license to reproduce, prepare Derivative Works of,
|
||||||
a) If You are located outside the US or Canada: AS THE SAMPLE CODE IS PROVIDED
|
publicly display, publicly perform, sublicense, and distribute the
|
||||||
TO YOU FREE OF CHARGE, SAP DOES NOT GUARANTEE OR WARRANT ANY FEATURES OR
|
Work and such Derivative Works in Source or Object form.
|
||||||
QUALITIES OF THE SAMPLE CODE OR GIVE ANY UNDERTAKING WITH REGARD TO ANY OTHER
|
|
||||||
QUALITY. NO SUCH WARRANTY OR UNDERTAKING SHALL BE IMPLIED BY YOU FROM ANY
|
3. Grant of Patent License. Subject to the terms and conditions of
|
||||||
DESCRIPTION IN THE SAMPLE CODE OR ANY OTHER MATERIALS, COMMUNICATION OR
|
this License, each Contributor hereby grants to You a perpetual,
|
||||||
ADVERTISEMENT. IN PARTICULAR, SAP DOES NOT WARRANT THAT THE SAMPLE CODE WILL BE
|
worldwide, non-exclusive, no-charge, royalty-free, irrevocable
|
||||||
AVAILABLE UNINTERRUPTED, ERROR FREE, OR PERMANENTLY AVAILABLE. ALL WARRANTY
|
(except as stated in this section) patent license to make, have made,
|
||||||
CLAIMS RESPECTING THE SAMPLE CODE ARE SUBJECT TO THE LIMITATION OF LIABILITY
|
use, offer to sell, sell, import, and otherwise transfer the Work,
|
||||||
STIPULATED IN SECTION 8 BELOW.
|
where such license applies only to those patent claims licensable
|
||||||
b) If You are located in the US or Canada: THE SAMPLE CODE IS LICENSED TO YOU
|
by such Contributor that are necessarily infringed by their
|
||||||
"AS IS", WITHOUT ANY WARRANTY, ESCROW, TRAINING, MAINTENANCE, OR SERVICE
|
Contribution(s) alone or by combination of their Contribution(s)
|
||||||
OBLIGATIONS WHATSOEVER ON THE PART OF SAP. SAP MAKES NO EXPRESS OR IMPLIED
|
with the Work to which such Contribution(s) was submitted. If You
|
||||||
WARRANTIES OR CONDITIONS OF SALE OF ANY TYPE WHATSOEVER, INCLUDING BUT NOT
|
institute patent litigation against any entity (including a
|
||||||
LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY AND OF FITNESS FOR A PARTICULAR
|
cross-claim or counterclaim in a lawsuit) alleging that the Work
|
||||||
PURPOSE. IN PARTICULAR, SAP DOES NOT WARRANT THAT THE SAMPLE CODE WILL BE
|
or a Contribution incorporated within the Work constitutes direct
|
||||||
AVAILABLE UNINTERRUPTED, ERROR FREE, OR PERMANENTLY AVAILABLE. YOU ASSUME ALL
|
or contributory patent infringement, then any patent licenses
|
||||||
RISKS ASSOCIATED WITH THE USE OF THE SAMPLE CODE, INCLUDING WITHOUT LIMITATION
|
granted to You under this License for that Work shall terminate
|
||||||
RISKS RELATING TO QUALITY, AVAILABILITY, PERFORMANCE, DATA LOSS, AND UTILITY IN
|
as of the date such litigation is filed.
|
||||||
A PRODUCTION ENVIRONMENT.
|
|
||||||
c) For all locations: SAP DOES NOT MAKE ANY REPRESENTATIONS OR WARRANTIES IN
|
4. Redistribution. You may reproduce and distribute copies of the
|
||||||
RESPECT OF THIRD PARTY DEPENDENCIES, APIS, PRODUCTS AND SERVICES, INCLUDING BUT
|
Work or Derivative Works thereof in any medium, with or without
|
||||||
NOT LIMITED TO IMPLIED WARRANTIES OF MERCHANTABILITY AND OF FITNESS FOR A
|
modifications, and in Source or Object form, provided that You
|
||||||
PARTICULAR PURPOSE. IN PARTICULAR, SAP DOES NOT WARRANT THAT THIRDPARTY
|
meet the following conditions:
|
||||||
DEPENDENCIES, APIS, PRODUCTS AND SERVICES WILL BE AVAILABLE, ERROR FREE,
|
|
||||||
INTEROPERABLE WITH THE SAMPLE CODE, SUITABLE FOR ANY PARTICULAR PURPOSE OR NONINFRINGING.
|
(a) You must give any other recipients of the Work or
|
||||||
YOU ASSUME ALL RISKS ASSOCIATED WITH THE USE OF THIRD
|
Derivative Works a copy of this License; and
|
||||||
PARTY DEPENDENCIES, APIS, PRODUCTS AND SERVICES, INCLUDING WITHOUT LIMITATION
|
|
||||||
RISKS RELATING TO QUALITY, AVAILABILITY, PERFORMANCE, DATA LOSS, UTILITY IN A
|
(b) You must cause any modified files to carry prominent notices
|
||||||
PRODUCTION ENVIRONMENT, AND NON-INFRINGEMENT. IN NO EVENT WILL SAP BE LIABLE
|
stating that You changed the files; and
|
||||||
DIRECTLY OR INDIRECTLY IN RESPECT OF ANY USE OF THIRD PARTY DEPENDENCIES, APIS,
|
|
||||||
PRODUCTS AND SERVICES BY YOU.
|
(c) You must retain, in the Source form of any Derivative Works
|
||||||
|
that You distribute, all copyright, patent, trademark, and
|
||||||
8. LIMITATION OF LIABILITY:
|
attribution notices from the Source form of the Work,
|
||||||
a) If You are located outside the US or Canada: IRRESPECTIVE OF THE LEGAL
|
excluding those notices that do not pertain to any part of
|
||||||
REASONS, SAP SHALL ONLY BE LIABLE FOR DAMAGES UNDER THIS AGREEMENT IF SUCH
|
the Derivative Works; and
|
||||||
DAMAGE (I) CAN BE CLAIMED UNDER THE GERMAN PRODUCT LIABILITY ACT OR (II) IS
|
|
||||||
CAUSED BY INTENTIONAL MISCONDUCT OF SAP OR (III) CONSISTS OF PERSONAL INJURY.
|
(d) If the Work includes a "NOTICE" text file as part of its
|
||||||
IN ALL OTHER CASES, NEITHER SAP NOR ITS EMPLOYEES, AGENTS AND SUBCONTRACTORS
|
distribution, then any Derivative Works that You distribute must
|
||||||
SHALL BE LIABLE FOR ANY KIND OF DAMAGE OR CLAIMS HEREUNDER.
|
include a readable copy of the attribution notices contained
|
||||||
b) If You are located in the US or Canada: IN NO EVENT SHALL SAP BE LIABLE TO
|
within such NOTICE file, excluding those notices that do not
|
||||||
YOU, YOUR COMPANY OR TO ANY THIRD PARTY FOR ANY DAMAGES IN AN AMOUNT IN EXCESS
|
pertain to any part of the Derivative Works, in at least one
|
||||||
OF $100 ARISING IN CONNECTION WITH YOUR USE OF OR INABILITY TO USE THE SAMPLE
|
of the following places: within a NOTICE text file distributed
|
||||||
CODE OR IN CONNECTION WITH SAP'S PROVISION OF OR FAILURE TO PROVIDE SERVICES
|
as part of the Derivative Works; within the Source form or
|
||||||
PERTAINING TO THE SAMPLE CODE, OR AS A RESULT OF ANY DEFECT IN THE SAMPLE COED.
|
documentation, if provided along with the Derivative Works; or,
|
||||||
THIS DISCLAIMER OF LIABILITY SHALL APPLY REGARDLESS OF THE FORM OF ACTION THAT
|
within a display generated by the Derivative Works, if and
|
||||||
MAY BE BROUGHT AGAINST SAP, WHETHER IN CONTRACT OR TORT, INCLUDING WITHOUT
|
wherever such third-party notices normally appear. The contents
|
||||||
LIMITATION ANY ACTION FOR NEGLIGENCE. YOUR SOLE REMEDY IN THE EVENT OF BREACH
|
of the NOTICE file are for informational purposes only and
|
||||||
OF THIS AGREEMENT BY SAP OR FOR ANY OTHER CLAIM RELATED TO THE SAMPLE CODE SHALL
|
do not modify the License. You may add Your own attribution
|
||||||
BE TERMINATION OF THIS AGREEMENT. NOTWITHSTANDING ANYTHING TO THE CONTRARY
|
notices within Derivative Works that You distribute, alongside
|
||||||
HEREIN, UNDER NO CIRCUMSTANCES SHALL SAP OR ITS LICENSORS BE LIABLE TO YOU OR
|
or as an addendum to the NOTICE text from the Work, provided
|
||||||
ANY OTHER PERSON OR ENTITY FOR ANY SPECIAL, INCIDENTAL, CONSEQUENTIAL, OR
|
that such additional attribution notices cannot be construed
|
||||||
INDIRECT DAMAGES, LOSS OF GOOD WILL OR BUSINESS PROFITS, WORK STOPPAGE, DATA
|
as modifying the License.
|
||||||
LOSS, COMPUTER FAILURE OR MALFUNCTION, ANY AND ALL OTHER COMMERCIAL DAMAGES OR
|
|
||||||
LOSS, OR EXEMPLARY OR PUNITIVE DAMAGES.
|
You may add Your own copyright statement to Your modifications and
|
||||||
|
may provide additional or different license terms and conditions
|
||||||
9. INDEMNITY: You will fully indemnify, hold harmless and defend SAP against
|
for use, reproduction, or distribution of Your modifications, or
|
||||||
law suits based on any claim: (a) that any of Your products, services or related
|
for any such Derivative Works as a whole, provided Your use,
|
||||||
technology that are based on or incorporate the Sample Code infringes or
|
reproduction, and distribution of the Work otherwise complies with
|
||||||
misappropriates any patent, copyright, trademark, trade secrets, or other
|
the conditions stated in this License.
|
||||||
proprietary rights of a third party, or (b) related to Your alleged violation
|
|
||||||
of the terms of this Agreement.
|
5. Submission of Contributions. Unless You explicitly state otherwise,
|
||||||
|
any Contribution intentionally submitted for inclusion in the Work
|
||||||
10. EXPORT: The Sample Code is subject to German, EU and US export control
|
by You to the Licensor shall be under the terms and conditions of
|
||||||
regulations. You confirm that: a) You will not use the Sample Code for, and
|
this License, without any additional terms or conditions.
|
||||||
will not allow the Sample Code to be used for, any purposes prohibited by
|
Notwithstanding the above, nothing herein shall supersede or modify
|
||||||
German, EU and US law, including, without limitation, for the development,
|
the terms of any separate license agreement you may have executed
|
||||||
design, manufacture or production of nuclear, chemical or biological weapons of
|
with Licensor regarding such Contributions.
|
||||||
mass destruction; b) You are not located in Cuba, Iran, Sudan, Iraq, North
|
|
||||||
Korea, Syria, nor any other country to which the United States has prohibited
|
6. Trademarks. This License does not grant permission to use the trade
|
||||||
export or that has been designated by the U.S. Government as a "terrorist
|
names, trademarks, service marks, or product names of the Licensor,
|
||||||
supporting" country (any, an "US Embargoed Country"); c) You are not a citizen,
|
except as required for reasonable and customary use in describing the
|
||||||
national or resident of, and are not under the control of, a US Embargoed
|
origin of the Work and reproducing the content of the NOTICE file.
|
||||||
Country; d) You will not download or otherwise export or re-export the Sample
|
|
||||||
Code, directly or indirectly, to a US Embargoed Country nor to citizens,
|
7. Disclaimer of Warranty. Unless required by applicable law or
|
||||||
nationals or residents of a US Embargoed Country; e) You are not listed on the
|
agreed to in writing, Licensor provides the Work (and each
|
||||||
United States Department of Treasury lists of Specially Designated Nationals,
|
Contributor provides its Contributions) on an "AS IS" BASIS,
|
||||||
Specially Designated Terrorists, and Specially Designated Narcotic Traffickers,
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
nor listed on the United States Department of Commerce Table of Denial Orders
|
implied, including, without limitation, any warranties or conditions
|
||||||
or any other U.S. government list of prohibited or restricted parties and f)
|
of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A
|
||||||
You will not download or otherwise export or re-export the Sample Code, directly
|
PARTICULAR PURPOSE. You are solely responsible for determining the
|
||||||
or indirectly, to persons on the above-mentioned lists.
|
appropriateness of using or redistributing the Work and assume any
|
||||||
|
risks associated with Your exercise of permissions under this License.
|
||||||
11. SUPPORT: SAP does not offer support for the Sample Code.
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory,
|
||||||
12. TERM AND TERMINATION: You may terminate this Agreement by destroying all
|
whether in tort (including negligence), contract, or otherwise,
|
||||||
copies of the Sample Code in Your possession or control. SAP may terminate Your
|
unless required by applicable law (such as deliberate and grossly
|
||||||
license to use the Sample Code immediately if You fail to comply with any of
|
negligent acts) or agreed to in writing, shall any Contributor be
|
||||||
the terms of this Agreement, or, for SAP's convenience by providing you with
|
liable to You for damages, including any direct, indirect, special,
|
||||||
ten (10) days written notice of termination. In case of termination or
|
incidental, or consequential damages of any character arising as a
|
||||||
expiration of this Agreement, You must immediately destroy all copies of the
|
result of this License or out of the use or inability to use the
|
||||||
Sample Code in your possession or control. In the event Your Company is acquired
|
Work (including but not limited to damages for loss of goodwill,
|
||||||
(by merger, purchase of stock, assets or intellectual property or exclusive
|
work stoppage, computer failure or malfunction, or any and all
|
||||||
license), or You become employed, by a direct competitor of SAP, then this
|
other commercial damages or losses), even if such Contributor
|
||||||
Agreement and all licenses granted to You in this Agreement shall immediately
|
has been advised of the possibility of such damages.
|
||||||
terminate upon the date of such acquisition or change of employment.
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing
|
||||||
13. LAW/VENUE:
|
the Work or Derivative Works thereof, You may choose to offer,
|
||||||
a) If You are located outside the US or Canada: This Agreement is governed by
|
and charge a fee for, acceptance of support, warranty, indemnity,
|
||||||
and construed in accordance with the laws of Germany without reference to its
|
or other liability obligations and/or rights consistent with this
|
||||||
conflicts of law principles. You and SAP agree to submit to the exclusive
|
License. However, in accepting such obligations, You may act only
|
||||||
jurisdiction of, and venue in, the courts located in Karlsruhe, Germany in any
|
on Your own behalf and on Your sole responsibility, not on behalf
|
||||||
dispute arising out of or relating to this Agreement or the Sample Code. The
|
of any other Contributor, and only if You agree to indemnify,
|
||||||
United Nations Convention on Contracts for the International Sale of Goods shall
|
defend, and hold each Contributor harmless for any liability
|
||||||
not apply to this Agreement.
|
incurred by, or claims asserted against, such Contributor by reason
|
||||||
b) If You are located in the US or Canada: This Agreement shall be governed by
|
of your accepting any such warranty or additional liability.
|
||||||
and construed in accordance with the laws of the State of New York, USA without
|
|
||||||
reference to its conflicts of law principles. You and SAP agree to submit to
|
END OF TERMS AND CONDITIONS
|
||||||
the exclusive jurisdiction of, and venue in, the courts located in New York,
|
|
||||||
New York, USA in any dispute arising out of or relating to this Agreement or
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
the Sample Code. The United Nations Convention on Contracts for the
|
|
||||||
International Sale of Goods shall not apply to this Agreement.
|
To apply the Apache License to your work, attach the following
|
||||||
|
boilerplate notice, with the fields enclosed by brackets "[]"
|
||||||
14. MISCELLANEOUS: This Agreement is the complete agreement between the parties
|
replaced with your own identifying information. (Don't include
|
||||||
respecting the Sample Code. This Agreement supersedes all prior or
|
the brackets!) The text should be enclosed in the appropriate
|
||||||
contemporaneous agreements or representations with regards to the Sample Code.
|
comment syntax for the file format. We also recommend that a
|
||||||
If any term of this Agreement is found to be invalid or unenforceable, the
|
file or class name and description of purpose be included on the
|
||||||
surviving provisions shall remain effective. SAP's failure to enforce any right
|
same "printed page" as the copyright notice for easier
|
||||||
or provisions stipulated in this Agreement will not constitute a waiver of such
|
identification within third-party archives.
|
||||||
provision, or any other provision of this Agreement.
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
v1.0-071618
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
|
|||||||
73
LICENSES/Apache-2.0.txt
Normal file
73
LICENSES/Apache-2.0.txt
Normal file
@@ -0,0 +1,73 @@
|
|||||||
|
Apache License
|
||||||
|
Version 2.0, January 2004
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
|
||||||
|
|
||||||
|
(a) You must give any other recipients of the Work or Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
(b) You must cause any modified files to carry prominent notices stating that You changed the files; and
|
||||||
|
|
||||||
|
(c) You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
|
||||||
|
|
||||||
|
(d) If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License.
|
||||||
|
|
||||||
|
You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
|
||||||
|
APPENDIX: How to apply the Apache License to your work.
|
||||||
|
|
||||||
|
To apply the Apache License to your work, attach the following boilerplate notice, with the fields enclosed by brackets "[]" replaced with your own identifying information. (Don't include the brackets!) The text should be enclosed in the appropriate comment syntax for the file format. We also recommend that a file or class name and description of purpose be included on the same "printed page" as the copyright notice for easier identification within third-party archives.
|
||||||
|
|
||||||
|
Copyright [yyyy] [name of copyright owner]
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License");
|
||||||
|
you may not use this file except in compliance with the License.
|
||||||
|
You may obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
||||||
|
See the License for the specific language governing permissions and
|
||||||
|
limitations under the License.
|
||||||
1
NOTICE
1
NOTICE
@@ -1 +0,0 @@
|
|||||||
Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved.
|
|
||||||
102
README.md
102
README.md
@@ -1,73 +1,87 @@
|
|||||||
# cloud-cap-samples
|
# Welcome to cap/samples
|
||||||
|
|
||||||
This is a monorepository for sample projects on [SAP Cloud Application Programming Model](https://cap.cloud.sap).
|
Find here a collection of samples for the [SAP Cloud Application Programming Model](https://cap.cloud.sap) organized in a simplistic [monorepo setup](samples.md#all-in-one-monorepo). → See [**Overview** of contained samples](samples.md)
|
||||||
|
|
||||||
## Description
|

|
||||||
|
[](https://api.reuse.software/info/github.com/SAP-samples/cloud-cap-samples)
|
||||||
|
|
||||||
This repository provides a list of samples and reusable packages created based on SAP Cloud Application Programming Model.
|
### Preliminaries
|
||||||
The SAP Cloud Application Programming Model enables you to quickly create business applications by allowing you to focus on your domain logic. It offers a consistent end-to-end programming model that includes languages, libraries and APIs tailored for full-stack development on SAP Cloud Platform.
|
|
||||||
|
|
||||||
The samples provided can be run in a local setup on SQLite Database.
|
1. Ensure you have the latest LTS version of Node.js installed (see [Getting Started](https://cap.cloud.sap/docs/get-started/))
|
||||||
|
2. Install [**@sap/cds-dk**](https://cap.cloud.sap/docs/get-started/) globally:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm i -g @sap/cds-dk
|
||||||
|
```
|
||||||
|
|
||||||
## Requirements
|
3. _Optional:_ [Use Visual Studio Code](https://cap.cloud.sap/docs/get-started/tools#vscode)
|
||||||
* [Node.js](https://nodejs.org/en/) v8 or higher
|
|
||||||
* [Git](https://git-scm.com)
|
|
||||||
* [SQLite DB](https://www.sqlite.org/download.html) (Windows only; pre-installed on Mac/Linux)
|
|
||||||
|
|
||||||
#### Optional (if you want to import the code into an editor)
|
### Download
|
||||||
* [VS Code](https://code.visualstudio.com)
|
|
||||||
* [Add CDS extension to VS](https://cap.cloud.sap/docs/get-started/in-vscode#add-cds-editor)
|
|
||||||
|
|
||||||
## Download and Installation
|
If you've [Git](https://git-scm.com/downloads) installed, clone this repo as shown below, otherwise [download as ZIP file](archive/main.zip).
|
||||||
|
|
||||||
#### Install `cds` development kit
|
|
||||||
```sh
|
```sh
|
||||||
# sets the registry for `@sap` packages
|
git clone https://github.com/sap-samples/cloud-cap-samples samples
|
||||||
npm set @sap:registry=https://npm.sap.com
|
cd samples
|
||||||
|
|
||||||
npm install -g @sap/cds-dk
|
|
||||||
cds #> test-run it
|
|
||||||
```
|
```
|
||||||
Got issues? Check out the [documentation](https://cap.cloud.sap/docs/get-started/).
|
|
||||||
|
|
||||||
#### Clone and build the application
|
### Setup
|
||||||
`git clone https://github.com/SAP-samples/cloud-cap-samples samples && cd samples && npm i`
|
|
||||||
|
|
||||||
#### Run the samples
|
In the samples folder run:
|
||||||
|
|
||||||
With that you're ready to run the samples, e.g. start the [_bookshop_](./packages/bookshop) sample as follows:
|
```sh
|
||||||
|
npm install
|
||||||
|
```
|
||||||
|
|
||||||
`npm run bookshop`
|
### Run
|
||||||
|
|
||||||
## Test
|
With that you're ready to run the samples, for example:
|
||||||
|
|
||||||
For example, try these links in your browser:
|
```sh
|
||||||
- <http://localhost:4004> to test with generic index page.
|
cds watch bookshop
|
||||||
- <http://localhost:4004/fiori.html> to test with Fiori sandbox.
|
```
|
||||||
|
|
||||||
|
After that open this link in your browser: [http://localhost:4004](http://localhost:4004)
|
||||||
|
|
||||||
|
When asked to log in, type `alice` as user and leave the password field blank, which is the [default user](https://cap.cloud.sap/docs/node.js/authentication#mocked).
|
||||||
|
|
||||||
|
### Testing
|
||||||
|
|
||||||
|
Run the provided tests with [_jest_](http://jestjs.io) or [_mocha_](http://mochajs.org), for example:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npx jest
|
||||||
|
```
|
||||||
|
> While mocha is a bit smaller and faster, jest runs tests in parallel and isolation, which allows to run all tests.
|
||||||
|
|
||||||
|
|
||||||
## Debug
|
### Serve `npm`
|
||||||
|
|
||||||
For example, in [VS Code](https://code.visualstudio.com) switch to _Debug_ view and launch one of the prepared _cds run_ launch configurations.
|
We've included a simple npm registry mock, which allows you to do an `npm install @capire/<package>` locally. Use it as follows:
|
||||||
|
|
||||||
|
1. Start the @capire registry:
|
||||||
|
```sh
|
||||||
|
npm run registry
|
||||||
|
```
|
||||||
|
> While running this will have `@capire:registry=http://localhost:4444` set with npmrc.
|
||||||
|
|
||||||
|
2. Install one of the @capire packages wherever you like, for example:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm add @capire/common @capire/bookshop
|
||||||
|
```
|
||||||
|
|
||||||
|
|
||||||
## Limitations
|
## Code Tours
|
||||||
|
|
||||||
None
|
Take one of the [guided tours](.tours) in VS Code through our CAP samples and learn which CAP features are showcased by the different parts of the repository. Just install the [CodeTour extension](https://marketplace.visualstudio.com/items?itemName=vsls-contrib.codetour) for VS Code. We'll add more code tours in the future. Stay tuned!
|
||||||
|
|
||||||
## Known Issues
|
## Get Support
|
||||||
|
|
||||||
None
|
Check out the documentation at [https://cap.cloud.sap](https://cap.cloud.sap). <br>
|
||||||
|
In case you've a question, find a bug, or otherwise need support, use our [community](https://answers.sap.com/tags/9f13aee1-834c-4105-8e43-ee442775e5ce) to get more visibility.
|
||||||
|
|
||||||
## How to obtain support
|
|
||||||
|
|
||||||
Check out the documentation on https://cap.cloud.sap. In case you find a bug, or you need additional support, please open an issue [here](https://github.com/SAP-samples/cloud-cap-samples/issues/new) in GitHub.
|
|
||||||
|
|
||||||
## To-Do (upcoming changes)
|
|
||||||
|
|
||||||
None
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
Copyright (c) 2019 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under SAP Sample Code License Agreement, except as noted otherwise in the [LICENSE](/LICENSE) file.
|
Copyright (c) 2022 SAP SE or an SAP affiliate company. All rights reserved. This file is licensed under the Apache Software License, version 2.0 except as noted otherwise in the [LICENSE](LICENSE) file.
|
||||||
|
|||||||
25
bookshop/.vscode/launch.json
vendored
Normal file
25
bookshop/.vscode/launch.json
vendored
Normal file
@@ -0,0 +1,25 @@
|
|||||||
|
{
|
||||||
|
// Use IntelliSense to learn about possible attributes.
|
||||||
|
// Hover to view descriptions of existing attributes.
|
||||||
|
// For more information, visit: https://go.microsoft.com/fwlink/?linkid=830387
|
||||||
|
"version": "0.2.0",
|
||||||
|
"configurations": [
|
||||||
|
{
|
||||||
|
"name": "Attach to...",
|
||||||
|
"type": "node",
|
||||||
|
"request": "attach",
|
||||||
|
"processId": "${command:PickProcess}",
|
||||||
|
"skipFiles": ["<node_internals>/**"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "cds run",
|
||||||
|
"type": "node",
|
||||||
|
"request": "launch",
|
||||||
|
"runtimeExecutable": "npx",
|
||||||
|
"runtimeArgs": ["-n"],
|
||||||
|
"args": ["--", "cds", "run", "--with-mocks", "--in-memory?"],
|
||||||
|
"console": "integratedTerminal",
|
||||||
|
"skipFiles": ["<node_internals>/**"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
89
bookshop/app/vue/app.js
Normal file
89
bookshop/app/vue/app.js
Normal file
@@ -0,0 +1,89 @@
|
|||||||
|
/* global Vue axios */ //> from vue.html
|
||||||
|
const $ = sel => document.querySelector(sel)
|
||||||
|
const GET = (url) => axios.get('/browse'+url)
|
||||||
|
const POST = (cmd,data) => axios.post('/browse'+cmd,data)
|
||||||
|
|
||||||
|
const books = Vue.createApp ({
|
||||||
|
|
||||||
|
data() {
|
||||||
|
return {
|
||||||
|
list: [],
|
||||||
|
book: undefined,
|
||||||
|
order: { quantity:1, succeeded:'', failed:'' },
|
||||||
|
user: undefined
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
methods: {
|
||||||
|
|
||||||
|
search: ({target:{value:v}}) => books.fetch(v && '&$search='+v),
|
||||||
|
|
||||||
|
async fetch (etc='') {
|
||||||
|
const {data} = await GET(`/ListOfBooks?$expand=genre,currency${etc}`)
|
||||||
|
books.list = data.value
|
||||||
|
},
|
||||||
|
|
||||||
|
async inspect (eve) {
|
||||||
|
const book = books.book = books.list [eve.currentTarget.rowIndex-1]
|
||||||
|
const res = await GET(`/Books/${book.ID}?$select=descr,stock,image`)
|
||||||
|
Object.assign (book, res.data)
|
||||||
|
books.order = { quantity:1 }
|
||||||
|
setTimeout (()=> $('form > input').focus(), 111)
|
||||||
|
},
|
||||||
|
|
||||||
|
async submitOrder () {
|
||||||
|
const {book,order} = books, quantity = parseInt (order.quantity) || 1 // REVISIT: Okra should be less strict
|
||||||
|
try {
|
||||||
|
const res = await POST(`/submitOrder`, { quantity, book: book.ID })
|
||||||
|
book.stock = res.data.stock
|
||||||
|
books.order = { quantity, succeeded: `Successfully ordered ${quantity} item(s).` }
|
||||||
|
} catch (e) {
|
||||||
|
books.order = { quantity, failed: e.response.data.error ? e.response.data.error.message : e.response.data }
|
||||||
|
}
|
||||||
|
},
|
||||||
|
|
||||||
|
async login() {
|
||||||
|
try {
|
||||||
|
const { data:user } = await axios.post('/user/login',{})
|
||||||
|
if (user.id !== 'anonymous') books.user = user
|
||||||
|
} catch (err) { books.user = { id: err.message } }
|
||||||
|
},
|
||||||
|
|
||||||
|
async getUserInfo() {
|
||||||
|
try {
|
||||||
|
const { data:user } = await axios.get('/user/me')
|
||||||
|
if (user.id !== 'anonymous') books.user = user
|
||||||
|
} catch (err) { books.user = { id: err.message } }
|
||||||
|
},
|
||||||
|
}
|
||||||
|
}).mount('#app')
|
||||||
|
|
||||||
|
books.getUserInfo()
|
||||||
|
books.fetch() // initially fill list of books
|
||||||
|
|
||||||
|
document.addEventListener('keydown', (event) => {
|
||||||
|
// hide user info on request
|
||||||
|
if (event.key === 'u') books.user = undefined
|
||||||
|
})
|
||||||
|
|
||||||
|
axios.interceptors.request.use(csrfToken)
|
||||||
|
function csrfToken (request) {
|
||||||
|
if (request.method === 'head' || request.method === 'get') return request
|
||||||
|
if ('csrfToken' in document) {
|
||||||
|
request.headers['x-csrf-token'] = document.csrfToken
|
||||||
|
return request
|
||||||
|
}
|
||||||
|
return fetchToken().then(token => {
|
||||||
|
document.csrfToken = token
|
||||||
|
request.headers['x-csrf-token'] = document.csrfToken
|
||||||
|
return request
|
||||||
|
}).catch(_ => {
|
||||||
|
document.csrfToken = null // set mark to not try again
|
||||||
|
return request
|
||||||
|
})
|
||||||
|
|
||||||
|
function fetchToken() {
|
||||||
|
return axios.get('/', { headers: { 'x-csrf-token': 'fetch' } })
|
||||||
|
.then(res => res.headers['x-csrf-token'])
|
||||||
|
}
|
||||||
|
}
|
||||||
78
bookshop/app/vue/index.html
Normal file
78
bookshop/app/vue/index.html
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
<!DOCTYPE html>
|
||||||
|
<html>
|
||||||
|
|
||||||
|
<head>
|
||||||
|
<title> Capire Books </title>
|
||||||
|
<link rel="stylesheet" href="https://unpkg.com/primitive-ui/dist/css/main.css">
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
|
||||||
|
<script src="https://cdn.jsdelivr.net/npm/vue@3/dist/vue.global.prod.js"></script>
|
||||||
|
<style>
|
||||||
|
.hovering tr:hover td { color:cyan; background: #123; cursor: pointer; }
|
||||||
|
.rating-stars { color:teal }
|
||||||
|
.succeeded { color:teal }
|
||||||
|
.failed { color:red }
|
||||||
|
.user {text-align: end; color: grey;}
|
||||||
|
</style>
|
||||||
|
</head>
|
||||||
|
|
||||||
|
<body class="small-container", style="margin-top: 70px;">
|
||||||
|
<div id='app'>
|
||||||
|
|
||||||
|
<form class="user" @submit.prevent="login">
|
||||||
|
<div v-if="user">
|
||||||
|
<div v-if="user.tenant">Tenant: {{ user.tenant }}</div>
|
||||||
|
<div> User: {{ user.id }}</div>
|
||||||
|
<div>Locale: {{ user.locale }}</div>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
<input type="submit" value="Login" class="muted-button">
|
||||||
|
<!-- <a href="/user/login()">Login</a> -->
|
||||||
|
</div>
|
||||||
|
</form>
|
||||||
|
|
||||||
|
<h1> Capire Books </h1>
|
||||||
|
|
||||||
|
<input type="text" placeholder="Search..." @input="search">
|
||||||
|
|
||||||
|
<table id='books' class="hovering">
|
||||||
|
<thead>
|
||||||
|
<th> Book </th>
|
||||||
|
<th> Author </th>
|
||||||
|
<th> Genre </th>
|
||||||
|
<th> Rating </th>
|
||||||
|
<th> Price </th>
|
||||||
|
</thead>
|
||||||
|
<tr v-for="book in list" v-bind:id="book.ID" v-on:click="inspect">
|
||||||
|
<td>{{ book.title }}</td>
|
||||||
|
<td>{{ book.author }}</td>
|
||||||
|
<td>{{ book.genre.name }}</td>
|
||||||
|
<td class="rating-stars">
|
||||||
|
{{ ('★'.repeat(Math.round(book.rating))+'☆☆☆☆☆').slice(0,5) }} ({{ book.numberOfReviews }})
|
||||||
|
</td>
|
||||||
|
<td>{{ book.currency && book.currency.symbol }} {{ book.price }}</td>
|
||||||
|
</tr>
|
||||||
|
</table>
|
||||||
|
|
||||||
|
<div v-if="book">
|
||||||
|
<img v-bind:src="book.image" alt=""/>
|
||||||
|
<label style="text-align:right">
|
||||||
|
<span class="succeeded"> {{ order.succeeded }} </span>
|
||||||
|
<span class="failed"> {{ order.failed }} </span>
|
||||||
|
{{ book.stock }} in stock
|
||||||
|
</label>
|
||||||
|
<form @submit.prevent="submitOrder" style="float:right; display:flex; flex-direction:row-reverse">
|
||||||
|
<input type="number" v-model="order.quantity" v-bind:class="{ failed: order.failed }" style="width:5em">
|
||||||
|
<input type="submit" value="Order:" class="muted-button">
|
||||||
|
</form>
|
||||||
|
<h4> {{ book.title }} </h4>
|
||||||
|
<p> {{ book.descr }} </p>
|
||||||
|
</div>
|
||||||
|
<div v-else>
|
||||||
|
( click on a row to see details... )
|
||||||
|
</div>
|
||||||
|
|
||||||
|
</div>
|
||||||
|
</body>
|
||||||
|
|
||||||
|
<script src="app.js"></script>
|
||||||
|
</html>
|
||||||
|
500 Internal Server Error
Gitea Version: 1.24.4 |