Compare commits
3106 Commits
api-draft
...
test-multi
Author | SHA1 | Date | |
---|---|---|---|
555497604c | |||
e581ccb120 | |||
6bcc9bfd84 | |||
f42f291790 | |||
176e8167f0 | |||
87d58904b4 | |||
ae629a6c8b | |||
3f575f0ec0 | |||
b3ab56cb57 | |||
f6934a43c9 | |||
22a7537974 | |||
3620760991 | |||
88a94c80be | |||
2fc0d34b8f | |||
d53ca3ec9a | |||
86e5d10fc1 | |||
936b88363c | |||
38fec73a33 | |||
43c2c8543e | |||
e8e719e7f7 | |||
26e70d82b7 | |||
3a65f75d21 | |||
51e4c0c836 | |||
bb9c225f23 | |||
19ec98af79 | |||
23ead2ceaa | |||
6a8f4b5d9c | |||
464bb3b885 | |||
4775c88909 | |||
722e2e2bb1 | |||
333aa1d6db | |||
5e92c69fe2 | |||
8ddba2b06f | |||
6f9241c0b1 | |||
d84808aa68 | |||
0df672e470 | |||
c9bc390355 | |||
5b1664f073 | |||
e634e09e32 | |||
8e3947e48d | |||
b1ea6efd45 | |||
70f2fad243 | |||
2d64813a4f | |||
fd0e89ca05 | |||
01d02642e8 | |||
1f588a2a6e | |||
e18c7562ae | |||
08b1c4ae74 | |||
2488072d6b | |||
82ea23e20c | |||
a0b02c9684 | |||
bba29b083f | |||
7c4258d720 | |||
95d30f75ac | |||
db3cfd33af | |||
85fe838c04 | |||
6bdea20f9a | |||
159563ce5c | |||
0d88bc8531 | |||
8acbcadd5d | |||
e20c7a17d6 | |||
035a1be57d | |||
09b49f31ab | |||
e1e2cf9be8 | |||
84e82d3bda | |||
7b53cad2c5 | |||
420edb75f8 | |||
749e84611e | |||
8eba3a81f3 | |||
63fabe576c | |||
11c96796c0 | |||
5caa5e1a50 | |||
b9b0cfe0ef | |||
bee0527acb | |||
ed3c2f6a56 | |||
b1c97e51e5 | |||
16786a64c1 | |||
e3ad2c98ca | |||
0a0d3b20c2 | |||
02c2fb5655 | |||
0b02b083c3 | |||
25b3431131 | |||
c8723da098 | |||
933ce7aa3c | |||
8ef3869325 | |||
53f5fdabe5 | |||
d10561fc7f | |||
566469e691 | |||
6d4a324fca | |||
b8fabb7e73 | |||
1680c3cc1b | |||
61dd85c704 | |||
980777691a | |||
a50c1704e5 | |||
98080784a3 | |||
bf7b672957 | |||
5dadf6f6fc | |||
555db60bf7 | |||
1972ca9ea7 | |||
1e11bbc2ad | |||
c4a87ae5d7 | |||
4e325fb165 | |||
e59e4efdf0 | |||
f17fda53a0 | |||
f2dbe6d816 | |||
510d3bd333 | |||
a908eb1d65 | |||
c0bda64927 | |||
d0c5731287 | |||
5eaf222f88 | |||
0249ab4df5 | |||
4f8cba160d | |||
c269e089da | |||
4873f40614 | |||
10bb9173ec | |||
ea8c9c7cc8 | |||
4c9c084eec | |||
b64ee10812 | |||
ee1ecf43db | |||
4d8db8eb7c | |||
1b13965200 | |||
38db8f7fe5 | |||
4ba8f893a6 | |||
c4b9be18f1 | |||
eabdf6cd04 | |||
e56c673005 | |||
dad9f12a5c | |||
aa5edb0b83 | |||
b315803180 | |||
b27317631b | |||
953a9daafb | |||
63f9cd449f | |||
54220f547b | |||
93d967c2b3 | |||
1226459c6f | |||
d7c9c9cb98 | |||
2131ef2397 | |||
48c22369a1 | |||
6506077f4d | |||
b1b4266ff3 | |||
42b0148f93 | |||
9461ad8edd | |||
40055ba955 | |||
9cb85ad176 | |||
f2b2953a5d | |||
62de310686 | |||
4b9ff67e49 | |||
d5e32ec494 | |||
38880ba3d1 | |||
a99ce7733c | |||
9f48764210 | |||
a1aaa0dd41 | |||
bee15e98c8 | |||
092bbe547d | |||
6cbe05317c | |||
3b92fcdf6c | |||
6dde54bd25 | |||
359e7377ac | |||
9f4190f781 | |||
f3fc991a74 | |||
2564e75fc9 | |||
f42fe78acf | |||
fe928a1386 | |||
b329ed6ed5 | |||
9b7a0d7e4c | |||
5c15e53abb | |||
f58b3881f2 | |||
071a13b219 | |||
ca66898e51 | |||
94c7b2343a | |||
c397c336ab | |||
eea23f2caf | |||
6665641c02 | |||
c3ebf52dd2 | |||
f8f2e7da9b | |||
240f58b2d0 | |||
7d3baee7b5 | |||
1f5cb7ca42 | |||
4a7ebe326c | |||
10da314a4a | |||
b3ceccd7fb | |||
1bde4c9a0c | |||
4b85360446 | |||
41b860a547 | |||
254b3db966 | |||
cbb3f32d1e | |||
e3bf72e77f | |||
0b63b782cf | |||
da39fd0c70 | |||
96dd581a67 | |||
2a1e322230 | |||
300b98bd54 | |||
c946609d13 | |||
7ca559fbe4 | |||
71392915c1 | |||
2889e88a97 | |||
d56d176aac | |||
925518c83f | |||
fa5aceb7b3 | |||
6755ef4641 | |||
333e8b5583 | |||
9d8a8b36d2 | |||
b484a4a959 | |||
64e7c62d98 | |||
6483fe2402 | |||
a123889d6a | |||
a40867d544 | |||
dbed9262c0 | |||
43ac66233e | |||
04e85c176a | |||
8274c23129 | |||
5fafde5f23 | |||
80a6e7f719 | |||
2c13aeecce | |||
ac015c3e45 | |||
ae1a4bcc6a | |||
e1e0eeac56 | |||
c90dfb2a1f | |||
1dfa5e5b8c | |||
99896b72ea | |||
979ba77c8e | |||
aebb5df611 | |||
605eeff9d7 | |||
a83ee1f90f | |||
fe899cbcc8 | |||
633bac2ed5 | |||
dacec48aec | |||
3ca133c782 | |||
12416b8079 | |||
9920e67c83 | |||
0e80a5b8a0 | |||
05f9202fe4 | |||
0da35a44b0 | |||
2305cd2e49 | |||
b30b6bc94e | |||
564f254652 | |||
9fa71244ea | |||
8157cdc7e9 | |||
721bdd737a | |||
1b57999059 | |||
b7460cef41 | |||
46f7f6dd04 | |||
cf2b8b3c8a | |||
ac0e1d3161 | |||
f9bd31deee | |||
cf3566742b | |||
b4a87dd07f | |||
e83cfa24c2 | |||
86ebd14ae7 | |||
b042d9098d | |||
325f2c4860 | |||
74a516aa9e | |||
28e26461cc | |||
cfaaf6b1fe | |||
bffe79ecbd | |||
94d9852339 | |||
905e397d3f | |||
e70a636073 | |||
03abb5e5de | |||
ac20c01233 | |||
b8ded0a16e | |||
b68f79f427 | |||
221d10d3e6 | |||
22d32eed1d | |||
5d656f0963 | |||
201d622b85 | |||
3571004f5c | |||
16249c3790 | |||
5377f0d0b3 | |||
15778b00a0 | |||
169eec0a51 | |||
f789775b1c | |||
fc59a4dce4 | |||
29128a891d | |||
dd3d4c8c3a | |||
4047c888be | |||
1499286bee | |||
6226763c37 | |||
7623a0648f | |||
b7085f7f62 | |||
55c851873c | |||
2b143dfc0f | |||
9405272f3b | |||
a9be9f1827 | |||
abb1a5c75b | |||
5e2fe7dc42 | |||
e4d6e90c35 | |||
84d9a525a9 | |||
0aca0ce6a6 | |||
c0742d521c | |||
92737b43af | |||
8b0f6885ee | |||
9af2d15cef | |||
e60d8d08a4 | |||
3e9b567fce | |||
6f51de85db | |||
f202ae19cb | |||
668bd75025 | |||
e6e07cf959 | |||
2f8431905f | |||
23aba14dfe | |||
b0fa955914 | |||
98207a3e0d | |||
26b81345f2 | |||
ac2034b243 | |||
351848ad56 | |||
cbac495f93 | |||
15ef5b7623 | |||
46c7ac944f | |||
aa4bfab462 | |||
f5cbb37e5a | |||
8d9079984a | |||
41783d8939 | |||
441ad58fe7 | |||
06a6a3f773 | |||
52fab78625 | |||
5eb6c15959 | |||
ce8c31cfa4 | |||
d80c0eef8e | |||
55829dcf05 | |||
d78956327c | |||
4a0728a55b | |||
2e1d57aa8c | |||
1c2b0678be | |||
6f810add43 | |||
12727adb16 | |||
9da750c3bb | |||
176226ddef | |||
acea18fa70 | |||
d1656f8561 | |||
87751e882c | |||
dff393a714 | |||
fd9c9aee03 | |||
59bf981fb0 | |||
4bbdac759f | |||
13fe7509de | |||
6fd8f6cd43 | |||
6375ecda34 | |||
d232dacc65 | |||
59946e89ef | |||
d75c4b4049 | |||
30ca4b707d | |||
27704c9a48 | |||
b0203f2272 | |||
77b720d00d | |||
ba982671b2 | |||
5df7d92d64 | |||
a8228406de | |||
2401473012 | |||
e502fb88fa | |||
37a52cb011 | |||
04fb4e8a82 | |||
5646a252f7 | |||
0e6ce7f58b | |||
8cd6a4c6a3 | |||
02fc162197 | |||
84d21a3695 | |||
1a6369c2b9 | |||
463c44679d | |||
c1f3ea4e61 | |||
142b767470 | |||
184b716b53 | |||
e53399495b | |||
d27f73579b | |||
1ae8199e89 | |||
2deb4e8474 | |||
7f10681424 | |||
c756adad6f | |||
f3d593bc1e | |||
b637307de6 | |||
b6e0208e71 | |||
631876cab3 | |||
a192d46c2b | |||
6923f17645 | |||
87a45de05b | |||
ab76451360 | |||
a91179091f | |||
5f7e34ce6c | |||
db33f0538a | |||
257a8e2e2d | |||
baa8078d23 | |||
ee60013f45 | |||
505796d9f0 | |||
56120ba1bb | |||
225b235059 | |||
de614ff606 | |||
7879752f47 | |||
08b2940eb6 | |||
67749dd2bb | |||
56c203d9ca | |||
54ce86eff3 | |||
9713ca74c7 | |||
81ed9169f1 | |||
e60462c221 | |||
09c4e610af | |||
4a576321e3 | |||
24c5dc03de | |||
d8291ddc17 | |||
1b75d828d8 | |||
966e583978 | |||
e52f60fdf0 | |||
b4c44c6d49 | |||
0f6215da9d | |||
7d0b323dab | |||
14114781fc | |||
97694fa29c | |||
9f6bfa2351 | |||
b842cbc83d | |||
0da5409092 | |||
888afd88b8 | |||
35692ae4b9 | |||
18b2a270c9 | |||
6f2d8e6ce3 | |||
91d1681698 | |||
efd97de743 | |||
c4cd725c9a | |||
23e5efbb19 | |||
4e995c10da | |||
b5cf157c40 | |||
ac082e9f58 | |||
9f7799b44f | |||
cdf9c50b8a | |||
7c4e9cef87 | |||
ffb3b302c7 | |||
278f48f65c | |||
4801dc4f32 | |||
9e8f845fbe | |||
b4d1cdaae8 | |||
f9d3af2724 | |||
ac6ed5dd01 | |||
6e0c1cc674 | |||
33c37ebf19 | |||
c33c29b6f3 | |||
37debefadc | |||
891fe0a36b | |||
4b6de59b03 | |||
6a5b902365 | |||
270f07ebd5 | |||
52500f6097 | |||
2fa8a8d61d | |||
69a6cd20af | |||
28eb268af1 | |||
045bb443cb | |||
c6ca912f2b | |||
78c7484d54 | |||
4d560086dd | |||
ef965ebdfd | |||
0b4a843617 | |||
7e7141a5a0 | |||
b3fd6c9b85 | |||
deb0511b43 | |||
e32f465f7a | |||
abc458cef4 | |||
2198a4780b | |||
b76d4b76cb | |||
9ebb013f22 | |||
5a4cba0226 | |||
f03bfdebb4 | |||
7c1550ced7 | |||
a09da30768 | |||
66bb938fc4 | |||
0d478d5dfc | |||
2a9b431c50 | |||
756e7e5372 | |||
573a63d359 | |||
3f2ad2be0c | |||
fd3be63805 | |||
ad8ed419de | |||
8b4f07c2e0 | |||
e667b22b3c | |||
9198effafe | |||
7d51d9c1eb | |||
de6eceb98b | |||
72f7ec1481 | |||
13ff0c368d | |||
9124f4f566 | |||
5e21f98309 | |||
26069dac79 | |||
b7d2402434 | |||
d9baa94970 | |||
afeb89a51a | |||
07992f0b2a | |||
a5c4508578 | |||
a4fab3ce8a | |||
97d80f57cc | |||
41138a1731 | |||
a54a2f8f84 | |||
5bbe710552 | |||
f2d34d7c33 | |||
8fa1770885 | |||
7221dc1ac6 | |||
25bb9939d6 | |||
e7e12504f2 | |||
68eb5e6286 | |||
63bf856d89 | |||
e3dcd51f8d | |||
cb63f4eca1 | |||
3f60c3c0f1 | |||
16bb22e834 | |||
d2b9a7754f | |||
70125afa9d | |||
551364ad8c | |||
7f7518bb9d | |||
b1467548da | |||
baa7c0bc58 | |||
73b81e38e7 | |||
8b088b7a2c | |||
894da25461 | |||
8c8a14af7b | |||
3735a85c69 | |||
79c4dc9272 | |||
d7c266d70f | |||
87d63806b9 | |||
f0e7f8cfc0 | |||
db597e1e93 | |||
98db273f5d | |||
8a6f944655 | |||
bacad24811 | |||
8cc58946cf | |||
3338bc1000 | |||
80c20b3d05 | |||
0d9558b891 | |||
c29c3c386f | |||
e1d0c22071 | |||
7dee6344b0 | |||
731ab89561 | |||
9ceb3c5b1e | |||
6bd0246db6 | |||
bee3a9eedf | |||
e515d19acd | |||
dd13efe065 | |||
99aa5c7b7b | |||
b5dfbe268c | |||
a9b9107cc3 | |||
cfda4e4214 | |||
0a657de4b2 | |||
8153edb9cb | |||
22ca339fb9 | |||
7f8764560b | |||
4411bb0a2d | |||
4ecd264d93 | |||
16677c99c9 | |||
6ab468086a | |||
9d2991ee10 | |||
dadb6120c2 | |||
d9a94db59d | |||
6dd8d448df | |||
ef2db1edaf | |||
3748927e87 | |||
7e4aac028b | |||
8e54b8a819 | |||
9e5eddec9b | |||
c46e4c5dad | |||
f0dc928230 | |||
6f674930d9 | |||
8675fc3fa6 | |||
25434342f3 | |||
8044dfe726 | |||
cd6c7fdc5e | |||
7ff85dc396 | |||
fb4877924a | |||
4b13cbdb33 | |||
51c9328dfd | |||
31ac67b393 | |||
0399766ccd | |||
18ab034147 | |||
8a4bc2a463 | |||
771fb9c044 | |||
055cf2b118 | |||
e9cf337aac | |||
04a18248c7 | |||
d462db60de | |||
67ebcf4749 | |||
38dbf2ccab | |||
e9968e3649 | |||
d9fafd2956 | |||
b5aba7ce8f | |||
0db5648e10 | |||
83325da738 | |||
4d1b2f3456 | |||
6137700c82 | |||
91a1b3f31d | |||
357b25a76b | |||
bab53ad9bd | |||
d0d4579f13 | |||
02b537580c | |||
7073b0717f | |||
d6bb1b2a12 | |||
c256696790 | |||
d5480e7524 | |||
ab463e93fe | |||
8962b0c88b | |||
8363c65312 | |||
04598b6cf1 | |||
3876151a4b | |||
43628ad9d6 | |||
67bea86bc8 | |||
4eb4cbfffc | |||
eda01abcbc | |||
2fa29124bf | |||
694b8f4666 | |||
33faeafa98 | |||
a40ff07353 | |||
41dc9c794d | |||
f1faf3965d | |||
da2ecbbcad | |||
32c892fe98 | |||
bbb271a678 | |||
fec1438806 | |||
28f19ec310 | |||
f934454c25 | |||
eb49ffae02 | |||
5751012872 | |||
aa041e04cf | |||
24e7ea143a | |||
79d5d9c4d0 | |||
b5bfdc4418 | |||
59730c60ec | |||
4a87a5d847 | |||
421c09ec2c | |||
0679b246b8 | |||
83f9c6c528 | |||
a5f3ba6259 | |||
a70facf0c8 | |||
447fe94325 | |||
8e2b666766 | |||
dcbfbdbb89 | |||
4c76bf34ab | |||
81b7a9d3e0 | |||
dc573c479c | |||
23303c910e | |||
3282934cf6 | |||
c157fab081 | |||
7c07b66cc9 | |||
7a906ccf5c | |||
ff7debfb81 | |||
92ba103f45 | |||
2c2d8d6b56 | |||
cfadb9f4fd | |||
396817b2d1 | |||
96eb6d6b74 | |||
cb5d47f66f | |||
ea90d02d66 | |||
95f73d8eb8 | |||
a37c686993 | |||
f12166097c | |||
d103a22fa0 | |||
04a60cfcbb | |||
8d723960f4 | |||
6d3cd2c699 | |||
87bf94fe0a | |||
af93823b6f | |||
4a39ddf425 | |||
83c273b976 | |||
7dd81beb03 | |||
1842d3923c | |||
26838635b6 | |||
11f2c35bb2 | |||
766f48c1ba | |||
da7b93f9b3 | |||
99c095a69f | |||
f885e83505 | |||
928bc4c68a | |||
d5539c7ae4 | |||
c86a104fb6 | |||
46fedc1a30 | |||
3b6ef9b44b | |||
c68edd9b7d | |||
11574b7c40 | |||
abc2cd2413 | |||
5d74882646 | |||
9fe7f230e6 | |||
de4c5b3729 | |||
2a7901914a | |||
73b0fc6f79 | |||
ddef16795c | |||
d188b9a056 | |||
f510f3edd0 | |||
e05b0bb562 | |||
713c5e9fb7 | |||
17bca04560 | |||
61bdadc33c | |||
e0c5bca47d | |||
cdc7c1af64 | |||
3158baa998 | |||
698508fde4 | |||
68a96989e1 | |||
46a6a43234 | |||
d41fc27b55 | |||
24bb96cc90 | |||
483ee173d6 | |||
469e93d916 | |||
f96dfcc942 | |||
063a6c0e51 | |||
7c289d76b6 | |||
c617a440eb | |||
8f81a45b9b | |||
666459be87 | |||
53df89aa5d | |||
8f553f6327 | |||
f91a64483b | |||
de8d63c09d | |||
58b4a6ebf5 | |||
9d45080526 | |||
d3fe2a6811 | |||
97b37edce4 | |||
d3443518d6 | |||
c33314a4bf | |||
59eb034ab4 | |||
67d53fb62b | |||
0fd637c0e9 | |||
169cc6617a | |||
a946325e95 | |||
1beba78111 | |||
2edfeaa606 | |||
2a1f9fd063 | |||
63fe92f8ea | |||
35f303ffa4 | |||
dd70bb470f | |||
250fee125a | |||
956029c786 | |||
b9ab599c35 | |||
5a690932e9 | |||
b00757150e | |||
8515a411bd | |||
3034ec016a | |||
a81af1ce34 | |||
64c5725687 | |||
72a3248123 | |||
ee4a81bdfd | |||
b90eb80584 | |||
ebaf702c59 | |||
3956cd1c06 | |||
064cf6747e | |||
8512b634c7 | |||
4220a8a68a | |||
e7e5116773 | |||
079201273e | |||
e4c9f156a7 | |||
42eeeea374 | |||
7b060509f5 | |||
3ca9e9ae56 | |||
984bede43b | |||
87d838c690 | |||
072bf361de | |||
4e39d9fb84 | |||
14eaf4e899 | |||
a31d10e708 | |||
f9e88321a3 | |||
9e12203b86 | |||
a5326a7b95 | |||
84874f22e6 | |||
d00e8b68a5 | |||
2907d6d79c | |||
a5a4bb87c5 | |||
389589d7f7 | |||
c02cbd1ba7 | |||
90b475e17b | |||
89a298f5b3 | |||
f990a14a3c | |||
6b00af6ece | |||
5ec8ac95c1 | |||
5f061001d6 | |||
ef3c4ccf47 | |||
1a86204637 | |||
0a1959df38 | |||
03a690a158 | |||
459a055455 | |||
502d29dd25 | |||
bf947a8835 | |||
f0fd0a9cc7 | |||
7282792da1 | |||
ec0291c54d | |||
4413c29abb | |||
91e1a144ed | |||
53440c31d5 | |||
5128af2531 | |||
eedc0f13bc | |||
4172fdf1d5 | |||
7c200df4c4 | |||
d1b28e079a | |||
23ec838643 | |||
271c619c63 | |||
0552769670 | |||
99a9f5b3ba | |||
4b535ade31 | |||
de8f8088e2 | |||
32c16416d3 | |||
0cf27c349b | |||
015aa8c637 | |||
4a07ddbefc | |||
a81009541c | |||
1b680cfaca | |||
311ff003c0 | |||
0cae61444d | |||
28a603def8 | |||
d2b7407674 | |||
fff89a6384 | |||
953b95f79c | |||
6ff5ce78e1 | |||
0857fd95a7 | |||
a1f2608e7c | |||
b7cea7b955 | |||
32da19a486 | |||
39d7dc8372 | |||
f76f537be7 | |||
a681d67e05 | |||
0a634eb490 | |||
fcca8fa8d9 | |||
829eecf1ae | |||
dc7f83754a | |||
51498c0e75 | |||
6dbdebbe05 | |||
c994227d5d | |||
761ca7ad56 | |||
7f49a7bc99 | |||
ca022b8a28 | |||
6f500d0d0b | |||
07d101ac1c | |||
cdf0dd0c10 | |||
c27c347d29 | |||
dc54eef2c9 | |||
57a68a24de | |||
2c1b4b4cfc | |||
437e8a0263 | |||
0a2e912091 | |||
87513a14b7 | |||
168c040f3c | |||
78487a48f6 | |||
a5a197680d | |||
d42bd44485 | |||
77b705ecc8 | |||
48af39a584 | |||
ec978f3a35 | |||
f13714e0c4 | |||
42ac3ef9af | |||
26ffe8efde | |||
87b4000b12 | |||
f790c9bd39 | |||
096c9688d5 | |||
1f19f480ce | |||
44f48a3e2a | |||
60fce4a003 | |||
f04b5b689e | |||
05d981768e | |||
e4a6c21101 | |||
d51dd8b7d0 | |||
aed5377ad2 | |||
459b2060a5 | |||
cbeb25c583 | |||
b38a9ad4ce | |||
ecf3e19f16 | |||
3b82fd5d8b | |||
e08b4ff0ab | |||
1f3ec77bf1 | |||
3f61db2067 | |||
ce1fdbddda | |||
5332d136b7 | |||
983ed7f0e7 | |||
11978cd869 | |||
00d1b5e69f | |||
6731283cf8 | |||
6b4cd25417 | |||
0cd2799d00 | |||
243b9cac24 | |||
316e0f24cf | |||
05f94edb49 | |||
e22458f09e | |||
cc2df8401b | |||
43a82ec05f | |||
fe2e29d69b | |||
60aecfe27e | |||
5d21a8b6fe | |||
500ab52476 | |||
b0bb723357 | |||
b7fffeab1c | |||
e339d743ed | |||
84f0d49d6f | |||
090e89d524 | |||
90dd53e954 | |||
6ab60ab52e | |||
8975bc8c55 | |||
55e5c49f6e | |||
f090f7ffe7 | |||
94b5617e63 | |||
41c79c6032 | |||
83c648cc26 | |||
76e7fec1a0 | |||
09bfd80f69 | |||
15a7d03e74 | |||
1dc9743484 | |||
8f05c57d1a | |||
81caa27cba | |||
74a7ef2565 | |||
649575fd2d | |||
b75b7a958a | |||
625b39d722 | |||
65f80f4c45 | |||
02cd3048c8 | |||
63feaef988 | |||
6095872682 | |||
dba55867f4 | |||
0da80c2a67 | |||
084df5329a | |||
49ff0c79db | |||
7a4b967a01 | |||
ddfa611c44 | |||
efca7c8e58 | |||
8900072239 | |||
a7e57c62f4 | |||
24bade2284 | |||
5fcc4eebe1 | |||
27a09239e3 | |||
8d86c914a1 | |||
fab04519c6 | |||
4a5e106709 | |||
4675fc8ae6 | |||
cf9336dae9 | |||
7f32d196e4 | |||
897d05276a | |||
3e6509ce6f | |||
576b843bd5 | |||
9b8b63a0d8 | |||
a1b1fa464e | |||
95f855f905 | |||
5b00246cc0 | |||
47c388450f | |||
34a149661c | |||
4c4b587d9c | |||
b8b838f490 | |||
8cb29ba4a9 | |||
ece6223b23 | |||
ecabd00b0c | |||
768df84f10 | |||
f8b3899bb9 | |||
3b046db4f8 | |||
97f829da9f | |||
fb1eed1982 | |||
dd9b567025 | |||
fa83b4867c | |||
47d4fc9103 | |||
dabd0bff29 | |||
51c70d02d7 | |||
b74733bf3f | |||
84ae65536b | |||
71424dcf8d | |||
2c40396139 | |||
16a0bf9d6c | |||
5498ba8e1e | |||
0f9d7d2832 | |||
9bd1c51a6e | |||
fd74fb0ec4 | |||
3626ff9947 | |||
fd568409d3 | |||
14e3500a88 | |||
83d08ae369 | |||
39bf601ee1 | |||
cfafecdd64 | |||
629ca089cf | |||
89ae6ef8c7 | |||
300acd6ec8 | |||
ba780981a5 | |||
62774678a7 | |||
ac13bc5850 | |||
e526626e09 | |||
564be6f8ba | |||
371a7d3a3e | |||
8539d60562 | |||
d333fd5822 | |||
364191eddc | |||
583f4dac85 | |||
28255dce01 | |||
c9419d3e2d | |||
b386275330 | |||
d2a45e46f1 | |||
35d1727dbf | |||
8125a4f321 | |||
1a409afb03 | |||
e57c18fd69 | |||
3aec9ec6ff | |||
0e9bf74332 | |||
2609a41ee8 | |||
b8dc5acf00 | |||
fbbdf8cff7 | |||
b0edb19239 | |||
85902b878e | |||
9d5c7a4015 | |||
fc53e855c4 | |||
467c57b7c6 | |||
a51c0d5139 | |||
d46310ca7d | |||
8f87cc78e8 | |||
ee6e0f310e | |||
f328a1078e | |||
b4cf81a0ef | |||
1b9b7e2345 | |||
4456633010 | |||
cda97d142a | |||
858199e396 | |||
f504a335af | |||
463ec47af6 | |||
ec4d121a98 | |||
fea6d2df96 | |||
598d2b31e9 | |||
25e28ab97c | |||
43056c4068 | |||
614206b10c | |||
30a493d038 | |||
96e433beaa | |||
0915aaea3b | |||
80656c1be0 | |||
acd75f86f4 | |||
486dae54bd | |||
92ecf3af1d | |||
fd0c19026d | |||
3109c8d825 | |||
78cf75323f | |||
b744467f21 | |||
a0b7999ea2 | |||
2bb2bb6a1b | |||
11ed7027e7 | |||
36bcfd5a41 | |||
70b5c627ca | |||
f4f1d0387b | |||
a1bf4a92e5 | |||
7d2256d70f | |||
5814d2a35e | |||
6ab84c0bc3 | |||
a7fc9b3caa | |||
67f493f012 | |||
0686e6d38f | |||
7fc825949c | |||
2a9ccdcffd | |||
6db78af69f | |||
038489256c | |||
53b785269b | |||
007b14b5c9 | |||
50b331c451 | |||
44fc62e0ba | |||
2635f085f0 | |||
22161fce7f | |||
386fc75047 | |||
fa6dd84945 | |||
d425bd564c | |||
93e3065b3e | |||
0ad2d59924 | |||
f4468a8233 | |||
dc08877bbb | |||
f08caa6135 | |||
ad7d029ce8 | |||
387912b4d3 | |||
53e0ed4d4a | |||
11c205b5c4 | |||
4ede6351ec | |||
24bbcb466f | |||
682601477c | |||
b6b5cfe403 | |||
b6ce9c6ed7 | |||
6e5e8f0ce8 | |||
2415d785cc | |||
2b5d6beb84 | |||
86316d8940 | |||
1f2b5ec5c8 | |||
0a9d23d86f | |||
379e37c881 | |||
37ef269dce | |||
8db6f8f633 | |||
79557165a3 | |||
ec1d4abde9 | |||
07c5e2800a | |||
79811d6662 | |||
67919ece16 | |||
7029dcf09e | |||
38deef6e72 | |||
b6220288ac | |||
fc03b3a79d | |||
096d6371f1 | |||
e580734c95 | |||
2690156a9d | |||
7ac7a40b1b | |||
dc9e572052 | |||
b15ebfd492 | |||
8baee7a0c9 | |||
dc85063467 | |||
be428b326e | |||
dd0e360709 | |||
04da88e3b4 | |||
9bcab02e35 | |||
1ff4d41b7c | |||
04a5c8f69f | |||
8886a94a01 | |||
f25eebdf3f | |||
f9ba46fe85 | |||
6f6fb859d6 | |||
1e3389b427 | |||
c977c64139 | |||
e419149378 | |||
a5a3e41d21 | |||
ecef8eaf86 | |||
de03cfbe64 | |||
03a6de55d6 | |||
3c5047df5e | |||
3cc630d4c2 | |||
b3488c54cd | |||
01b1d66bea | |||
2e82edb306 | |||
8f0e773ac1 | |||
223a0feada | |||
bc9cadaa77 | |||
0fd0da8331 | |||
f42ec7e2c5 | |||
d6a422fbdb | |||
d98b54bea7 | |||
0beda1d053 | |||
e912ab8f4e | |||
5055a18ca1 | |||
fa21911287 | |||
96746f4042 | |||
b22ad3ded9 | |||
7e0f475c63 | |||
efb3c2b71e | |||
862ea6986f | |||
cfa5dcb02e | |||
23aaada79d | |||
9e4458db10 | |||
a8da06033c | |||
0bf3597147 | |||
cfd9730055 | |||
e88ead30dc | |||
67b24ce846 | |||
709c3fff65 | |||
ab6e87ae6b | |||
cdb7066bed | |||
73d0507f1f | |||
4d263bcf32 | |||
2d8f61172d | |||
621c1dc11e | |||
dd136a5ff4 | |||
8fc785bbd6 | |||
82be503f4f | |||
7feb933519 | |||
e806e5a293 | |||
770951c6da | |||
7b7c7b528a | |||
a554aa20f8 | |||
ff1ef1f184 | |||
bf1efaf912 | |||
ff2bc41317 | |||
bdaf8aff15 | |||
1dc4f9f6bb | |||
d6320f5da1 | |||
276be5e857 | |||
3101e77ecc | |||
ab6dae16f1 | |||
36222d79c6 | |||
08656a6674 | |||
8034317796 | |||
a59f3a550e | |||
415b967c0b | |||
642499d519 | |||
fa0a54eee7 | |||
82f175f6c7 | |||
8df549e8d9 | |||
9fd720777b | |||
4c68c725b1 | |||
06a5207c6d | |||
78b885c508 | |||
a18a3b6099 | |||
68949e070c | |||
654333dabe | |||
81b8a76f1b | |||
31736fa194 | |||
33632ef1dc | |||
94305ed82c | |||
c8abc45e25 | |||
cd25459ac9 | |||
aaf1eb8059 | |||
1589e4236a | |||
8ca202d0a9 | |||
d2f7904118 | |||
2d059fb856 | |||
8bbd7898bb | |||
ea6f8c9a50 | |||
d152440436 | |||
1ffe76a525 | |||
a6825f530c | |||
7cf6dc386f | |||
5d8252bb07 | |||
e1e1e0fb2f | |||
4f7345563f | |||
68a2b9f3a8 | |||
d79402c568 | |||
d0e8f650be | |||
d819c6efe2 | |||
91c877f234 | |||
55a674ba7b | |||
36055b7c04 | |||
7db4ac8ff6 | |||
fe3cc661d3 | |||
eb7efae1cc | |||
63f8fb54d4 | |||
097fa2e655 | |||
3d0b4d51c2 | |||
37650487f7 | |||
6ccc0b4fbf | |||
79fe95372d | |||
6adb190d0e | |||
c094e6c6f4 | |||
8c796b4e57 | |||
c08e9a89ff | |||
03829af2ad | |||
cc8ba18ccc | |||
57c671a42e | |||
1ee6ecf3ae | |||
5f80b3773b | |||
8452455050 | |||
e5d8f60cdb | |||
de466000a0 | |||
49664c011c | |||
cf34d6b127 | |||
e52f6ce099 | |||
1ecdc4c487 | |||
d38e2c49cb | |||
f8464fa76f | |||
308ae2cb2e | |||
88219659fb | |||
c34c2df061 | |||
99c7bd4c10 | |||
322cd94be7 | |||
f93d5a6fbf | |||
cd116667be | |||
2f2de3952d | |||
45e56798c5 | |||
0664d480e6 | |||
5d31806fb7 | |||
283599ddf5 | |||
09e3ceefa0 | |||
87f76ebfe4 | |||
384f0efcb3 | |||
55a195b841 | |||
c7946fd7b3 | |||
5d3ba3199c | |||
f0d10306fc | |||
161943b5b8 | |||
e545043a26 | |||
40fb58b5b7 | |||
1f9d4708b3 | |||
162809e081 | |||
482c871ac2 | |||
f0b3311630 | |||
656d6d6c3f | |||
ea45f0f4aa | |||
6a25cb0a58 | |||
4a1901420d | |||
ad64f00608 | |||
65aea29cb9 | |||
7981424e9a | |||
10c4340475 | |||
0a95db1a51 | |||
ace77dce65 | |||
c1d58bb25f | |||
fbcafe0f62 | |||
9a9d9222a9 | |||
221e5b4f6c | |||
5df74aee68 | |||
3b195e9c7d | |||
17838d8040 | |||
2248c2da08 | |||
532c0e98db | |||
ef3bae1312 | |||
37a8cf071c | |||
98c9cc92b8 | |||
490cb2225d | |||
ecd8372efa | |||
50173a4413 | |||
76fc0b01fa | |||
23781fa686 | |||
8ec1b9965a | |||
a16a44208a | |||
f82ca91a61 | |||
f86b8cce16 | |||
b06c234b59 | |||
31a7ebd4f1 | |||
c83e44ff1c | |||
d6faa25888 | |||
55327a0150 | |||
28d2194d51 | |||
b3bc618bb0 | |||
14a0f84c1b | |||
14ce5e159b | |||
419285c396 | |||
c51fd21847 | |||
72e382c46a | |||
8825a458dc | |||
cab51f2665 | |||
c6f83dea8d | |||
6e2497461a | |||
bdd55b3db0 | |||
700ca90c8e | |||
3f6f893e29 | |||
360881cf66 | |||
a4c2e944b3 | |||
93abb09419 | |||
e58e9d3a26 | |||
527c5ec7dd | |||
286d6e5082 | |||
14e8c7a401 | |||
fab8bb516a | |||
6d526eaf42 | |||
8b715f331c | |||
d6950a0976 | |||
68f3436792 | |||
4414161faf | |||
7477536478 | |||
2dd7307fce | |||
6b2f2b758d | |||
c13b07e648 | |||
2ecff75da5 | |||
ff5b88b544 | |||
9b7a986475 | |||
c054914a9c | |||
69b6f8afa9 | |||
45164a2f68 | |||
b189a887e6 | |||
71abfbc336 | |||
ee690545fb | |||
fcf3c76aa1 | |||
5dbd77d10c | |||
43515ca84e | |||
54fe881e71 | |||
7c32700b69 | |||
e98d0cc7c5 | |||
2200503e48 | |||
8f0081acc8 | |||
003c3e9fbe | |||
02ef58ced1 | |||
e89881c266 | |||
fa66289d5c | |||
4f3a3befe0 | |||
a0864a8702 | |||
a34ad4e58c | |||
7e50010463 | |||
974be0ae2c | |||
3dee6db5e2 | |||
3dc6dac12d | |||
aafe524454 | |||
e84ade1752 | |||
3b094e43e3 | |||
e6a7b4ed6c | |||
97230bb21f | |||
768d99d928 | |||
c760190a29 | |||
7fe4a77c43 | |||
8578d78c51 | |||
362e565a09 | |||
9517c1f2cd | |||
262d35804d | |||
e0587bf0e7 | |||
f1494fd285 | |||
884aec8ea0 | |||
216f447578 | |||
c38d810658 | |||
f5c48b7bf6 | |||
d0e08f1d9a | |||
72ea7b80fd | |||
35d0c02bc5 | |||
abd7506b45 | |||
526b4aa07e | |||
b5e23963d4 | |||
2c11eb90d4 | |||
90e9c79e19 | |||
1b83631e43 | |||
547d4e82db | |||
3377ad5e0d | |||
1c0df60f05 | |||
138067dca9 | |||
844280eaa5 | |||
d2e2d55caf | |||
f01d4071a1 | |||
06524ce967 | |||
1ec529f360 | |||
cf6458c69d | |||
3316500774 | |||
0f780587c0 | |||
ea69508e22 | |||
4274d8cc0b | |||
1a2048332f | |||
38a875395f | |||
f601ab03e7 | |||
ee1d92d4a9 | |||
548286bacd | |||
9c9006d415 | |||
3219a64d09 | |||
570aa2c02a | |||
c577d2e231 | |||
6bf4b3aba8 | |||
b659f205f7 | |||
40d54df567 | |||
b7fa5c7ba8 | |||
3b0605d17b | |||
d93e7bfd1a | |||
104cd0ed29 | |||
7fb3d86d06 | |||
dbb42e9bb6 | |||
d1baa1f98b | |||
5ab68c0586 | |||
3cf78f509d | |||
c6053e234a | |||
964c326535 | |||
baf410a364 | |||
517a40a32b | |||
8b275b206b | |||
a40a31aa4c | |||
6c0c1df010 | |||
c552afff17 | |||
0837129ad5 | |||
6f3e2a8fbb | |||
4189a05758 | |||
97ccaa58c7 | |||
08ef932926 | |||
1d2ed0398c | |||
5a00e0c549 | |||
ebcf47733f | |||
381d7e7615 | |||
8246b47668 | |||
bc5e300ba9 | |||
57efef3160 | |||
dfc5a9f040 | |||
57443d227d | |||
d36441db73 | |||
327782835e | |||
994f6be535 | |||
72fc8a24a5 | |||
07002c12eb | |||
c688d19e15 | |||
c0ce448dc3 | |||
6c479d6d59 | |||
76ba487261 | |||
e3f4da19f9 | |||
c7ffcbf7e0 | |||
a27b3737f1 | |||
78dccf1e0a | |||
9cb7e09aef | |||
4111c12895 | |||
b6ec023920 | |||
e8e7067993 | |||
0e9319e97b | |||
df53af7b4d | |||
bcbf244fd2 | |||
7ff5febae0 | |||
019d108bb2 | |||
a14f628ca3 | |||
6116351dad | |||
23efef4469 | |||
95549f7be2 | |||
6338bd1168 | |||
f7d0d2c166 | |||
7c2e10ba0e | |||
350d3c92e7 | |||
0f2918efaf | |||
b72ad529aa | |||
f77c6c821c | |||
248f160e73 | |||
5151f90bb8 | |||
402062110d | |||
1c8f23dea1 | |||
5ee22b3481 | |||
322a7bd5a8 | |||
98c8e19d93 | |||
0e30fba72d | |||
1c77ef142c | |||
853764d863 | |||
d0ab59f9da | |||
21e08709cb | |||
a1aa99837b | |||
037264b0bf | |||
1a06702dbe | |||
666bb41697 | |||
e254fafb5c | |||
1dc1cc6c24 | |||
baa5d10009 | |||
ac2b9acccb | |||
075d4deecb | |||
ac11f898d4 | |||
dd31de6935 | |||
9e811e722f | |||
8ef53d85c4 | |||
abcc5cb023 | |||
931871ff95 | |||
6b1e8862ef | |||
00ce246fc5 | |||
c0c7d96429 | |||
92b2582d0d | |||
4084a1ac86 | |||
cb1a1c2616 | |||
ce6c1f173e | |||
30a4888363 | |||
b0917a9866 | |||
464e5de947 | |||
47a07da17d | |||
ec4c443299 | |||
3122168b0e | |||
da3af4b3db | |||
850fa28bf6 | |||
270684c5fd | |||
afa1589cb5 | |||
18a94d938f | |||
d026bc2134 | |||
c0b7276787 | |||
a8ba3b3fdb | |||
bb8342f62b | |||
0d8dad1559 | |||
c1ef701eb2 | |||
c6a181a2e7 | |||
981392ea07 | |||
5928a102a6 | |||
c748569433 | |||
a87fc51fbb | |||
e07cfc9394 | |||
32a0baa7a3 | |||
f06427cb3e | |||
1b31a472a5 | |||
e5fe8fd975 | |||
b36d1ca2bc | |||
9ae4e66c91 | |||
eeab6e9bde | |||
cabc410e0a | |||
2dcff00fa7 | |||
94cdce3551 | |||
a7948ce83e | |||
74faf1bd48 | |||
3e7527d55c | |||
e9730ced9e | |||
ff2f79b087 | |||
9733674d6e | |||
e05dbadea2 | |||
bc512f3766 | |||
ae51e2e437 | |||
0e06a7b403 | |||
ff7df9ad1e | |||
1069a45cfc | |||
d13d59bfa0 | |||
76e163473a | |||
6fdc24ab21 | |||
55d3ab5e8a | |||
c073a21ba6 | |||
cb93124ee1 | |||
4bda4080d2 | |||
e710cafb2c | |||
ed8137726d | |||
3ebdab5e51 | |||
35d1b894e2 | |||
7c54ec4f9f | |||
cbcfd44016 | |||
a296bc2b81 | |||
06b9e0fa97 | |||
4374a6fa28 | |||
67883519ee | |||
6f1b5b4ae3 | |||
c3b7e7869e | |||
d48cc2deee | |||
64b9d4c24a | |||
88bcb6078e | |||
5f9f3cd8e8 | |||
814b404614 | |||
ba2bb2180b | |||
72cdb352f0 | |||
cedf942c0c | |||
27506a3757 | |||
acc4e03c88 | |||
9a6090cd02 | |||
f40c9fa6f9 | |||
e7cdb334de | |||
afca6cd2e9 | |||
3c324cbea0 | |||
e9643ad07f | |||
56b9708ab7 | |||
e6e5b6a64a | |||
58da916d18 | |||
a0327b56aa | |||
57d60128a2 | |||
987740c649 | |||
944505a5f1 | |||
c5187d8509 | |||
c7b73bdc3f | |||
7483e886f1 | |||
ef92da4d9d | |||
80b02672a6 | |||
fbf1c68c7a | |||
5eac6e646b | |||
82e5bf2325 | |||
40b7117987 | |||
07ca60e13a | |||
08cd6b1d99 | |||
78ae7b334c | |||
3a28caac06 | |||
c883bbe6c2 | |||
eaa971cb56 | |||
0301d88033 | |||
e2e0cf17db | |||
01a39f4fb7 | |||
ca16892237 | |||
1bb1330cba | |||
78c731dbf7 | |||
a2b0d350d8 | |||
534bdbae50 | |||
831873e7de | |||
622d246fdd | |||
4a1ca9f299 | |||
4e1de2678c | |||
33a4792531 | |||
37dd4856a6 | |||
6a9cf3389d | |||
0d53898af9 | |||
9582fb2b06 | |||
3c075b7ff2 | |||
081edfbd70 | |||
04cc8f7aa2 | |||
2da2395473 | |||
a1d206bfc3 | |||
00ecd27bb3 | |||
0fa4486dcf | |||
ef9c6d5fed | |||
15a75ac134 | |||
cde3994979 | |||
1a10c966e0 | |||
9288880e47 | |||
d2c5476cdd | |||
8d21d420ae | |||
cc22fd4e9d | |||
4a046b3eea | |||
b0702ceff5 | |||
5af14cd3b9 | |||
d7eb4c17ca | |||
8c9fe2d36b | |||
3246480f82 | |||
8055e050b6 | |||
b0f73fff0d | |||
755cf21d3f | |||
95457a1981 | |||
da0ed95662 | |||
c8919708bb | |||
cc5bfda730 | |||
433dee0314 | |||
013eba744d | |||
29de11167f | |||
eaa9514453 | |||
b8f278cabf | |||
63bb183bec | |||
9d2c7a6de5 | |||
07fb20c32f | |||
90a6bbc13e | |||
73e38f1955 | |||
de8f8d174d | |||
b187762d55 | |||
45a152df86 | |||
a3e78bbf91 | |||
374e4afc32 | |||
2f8a0c2c2b | |||
163043635e | |||
ec9fd59d4a | |||
e03ea25392 | |||
56c16ed263 | |||
2e99f90b7c | |||
0520b03b97 | |||
08bed6c23a | |||
c909831dd4 | |||
e19ce4ac8c | |||
fab1def790 | |||
28311fd4dd | |||
c55eaeb193 | |||
2e6cdfc457 | |||
210808ed54 | |||
062ba4a9d7 | |||
e2217e008a | |||
61e583dbb2 | |||
7d754ea143 | |||
865b99f445 | |||
ec8b4db2e5 | |||
d6bd09fabf | |||
241d75e393 | |||
f4271c96a3 | |||
8c739e9fd9 | |||
75ae5ab3bb | |||
78a5ace18d | |||
ba0077498c | |||
909a21ee8a | |||
94c35a67c5 | |||
19fc05b76d | |||
1326dae27a | |||
7d8dc00996 | |||
a958055f50 | |||
1f86a5a131 | |||
8ad07fa8de | |||
fa7298a752 | |||
ae42298d08 | |||
1a23f2b390 | |||
4df6d6141b | |||
1c97138607 | |||
8db75bf41e | |||
00fb071fe2 | |||
2bf6a48d49 | |||
eca3c57bd8 | |||
7753703034 | |||
f9060a485d | |||
39a7f43cd0 | |||
5103207a70 | |||
8c2cc90f04 | |||
ce431848b3 | |||
5726fe6313 | |||
6145843e86 | |||
0225cbab6a | |||
e477beb587 | |||
ee5d59024a | |||
5288dadafb | |||
7f3cc09cbc | |||
94fa70abb1 | |||
12574a1333 | |||
dc91a94f0e | |||
0243aa6584 | |||
e5d869f01e | |||
d4e3e6689c | |||
0363d0e8ad | |||
3669e776a9 | |||
5d3adc6a7f | |||
c1b2db848a | |||
5d19294c11 | |||
8c72729a2a | |||
9b8d5f3f9c | |||
129ab1791b | |||
d03f323a9b | |||
54a453e5a0 | |||
14894cf197 | |||
0c6786198a | |||
6d077b775d | |||
144437a06e | |||
557cd91b21 | |||
39d3e92094 | |||
7529a86d01 | |||
d34e36831c | |||
aa8fa9168a | |||
3f1b7e0a87 | |||
5ec3b98d1c | |||
1ad5094b72 | |||
b54ee2257e | |||
fcef4274e5 | |||
744a5340d3 | |||
d140051054 | |||
8da74f2665 | |||
2390278b97 | |||
8a66731271 | |||
0a9ea48355 | |||
01d93306f3 | |||
0588f9190a | |||
1378b57567 | |||
9e12886c66 | |||
2d352ac574 | |||
284dec4903 | |||
5a0656c700 | |||
425655bae0 | |||
50b4d5cb28 | |||
bc62d7d5ae | |||
c0dcf4495e | |||
a51b9bc63f | |||
ff003c3dab | |||
de7c4d2ce3 | |||
4b07930305 | |||
5a49ac16b1 | |||
91b150c064 | |||
9506d309b0 | |||
c9bd60f50e | |||
cf15ff5c07 | |||
6bbdfcdfbe | |||
06e93ff520 | |||
550e7a15e6 | |||
71c54cd541 | |||
e81b8e53dc | |||
84e6928f54 | |||
ba688fe62c | |||
c533e10352 | |||
04f47b3db6 | |||
717fa5edf4 | |||
14f5f048fb | |||
72929500d3 | |||
471adde923 | |||
6c5d5f3d00 | |||
2262fef29b | |||
bda30f1475 | |||
bfec434369 | |||
14df350994 | |||
80582f5e8d | |||
7442768ced | |||
77c7bdfdec | |||
07d9769966 | |||
385b6177b2 | |||
7f68d26433 | |||
d7b44f8d09 | |||
c4cd36e15b | |||
618a6e7e8d | |||
63a8c91f71 | |||
e59020fec7 | |||
a2e424203a | |||
16853644cb | |||
2272766c57 | |||
1d9cdea2d4 | |||
715219c44d | |||
00dc2875bf | |||
8703f363b8 | |||
26210eaa50 | |||
a4a1cb5e05 | |||
9570f2f7a1 | |||
eb4ded39b3 | |||
7deb3cd025 | |||
06779e6cd9 | |||
7f43c0bf1a | |||
bfa3bbcdc7 | |||
2baf3f8bb0 | |||
10ac13ac5c | |||
138cb199bb | |||
374c363a78 | |||
e9cb5cd639 | |||
bc7d92ee0d | |||
78f49784a0 | |||
8754c438cc | |||
1419c75503 | |||
ca8cad0a74 | |||
a3a55d3b48 | |||
e66f818996 | |||
ae5ef33487 | |||
59c5430579 | |||
6d52f094d9 | |||
740db8da75 | |||
68abc15ed5 | |||
bb47feb517 | |||
469820fb0f | |||
92dd99b26c | |||
9fe1923189 | |||
42ddb38629 | |||
fe60d7abbc | |||
54b975f242 | |||
7f75e089e8 | |||
8e8c66280f | |||
d3d874e209 | |||
ce561e1598 | |||
7290601a37 | |||
ea5a85ffd1 | |||
eb196ea521 | |||
b6a8078634 | |||
e53b34ed60 | |||
13ffa3e3c4 | |||
0e3b629d90 | |||
23216e5aee | |||
5b366e91c1 | |||
aa336dfd57 | |||
556296096d | |||
e4aaa860a3 | |||
2079a74ab2 | |||
4b86439b8a | |||
a4d8e8ff90 | |||
3674808a13 | |||
10c0c29f64 | |||
fa1a942184 | |||
e205bf1fa4 | |||
cecd708dd1 | |||
aa36417590 | |||
e6c78f6d8b | |||
747afa6200 | |||
019cdde1c6 | |||
c7e26a231a | |||
f3b519d47b | |||
c472ab044b | |||
008f1387ed | |||
6ed76708ec | |||
c2ff81bad1 | |||
a6c3d98ddd | |||
603e990755 | |||
586901aee7 | |||
449923feae | |||
ae461f71b4 | |||
5243b3748d | |||
82a661b884 | |||
f5a92f66db | |||
0417b7e32d | |||
7c9a6bd817 | |||
a58c484d71 | |||
43b92647fb | |||
e8eb34f5c3 | |||
fa57688709 | |||
5ac377ec6a | |||
c523480b48 | |||
4dc09975d0 | |||
29a472ae5d | |||
3e2fd8967a | |||
9e429802c2 | |||
6cfee100d7 | |||
eeb214204d | |||
b41ceab51e | |||
10b0f43fc1 | |||
593c1adf56 | |||
2d1ee80322 | |||
7555eab1e3 | |||
4923bcbd85 | |||
5a7fdf82ac | |||
a5f6940d67 | |||
4571205871 | |||
34c3763421 | |||
e45a686c5a | |||
1c33157fb8 | |||
ed6ae23dc0 | |||
23839b05b0 | |||
6aed3bb0b5 | |||
1ae62cde05 | |||
4e7e5bb783 | |||
efc46613bb | |||
218ef16160 | |||
fb0a577d16 | |||
19b5e7c781 | |||
0794c0edf7 | |||
89515bb896 | |||
318aecb7bc | |||
a4b857a034 | |||
d82230dea4 | |||
cb242d8efb | |||
aa8f780e4e | |||
3ed0880c6e | |||
40c68e6399 | |||
65500736da | |||
b9ab97eb7f | |||
34ef98e0cd | |||
825f50262c | |||
a6079936e8 | |||
542b7a6f20 | |||
2a8c3977a4 | |||
515ea7caf8 | |||
65993bd77f | |||
54e07ccfdd | |||
2e6fcec1c3 | |||
f992fcebe1 | |||
280c838735 | |||
445dfb3d91 | |||
bc616ecdee | |||
895c9b12e6 | |||
95e68fce57 | |||
9f4f771774 | |||
05290593e9 | |||
2aa2d9d4bb | |||
7b690d0785 | |||
39fe2fd7b6 | |||
b661b4737e | |||
9ca8975baf | |||
5f7eeeae30 | |||
537656303a | |||
e7ba13f844 | |||
64bf63c18a | |||
ac3f638b35 | |||
a3520ba51e | |||
8e0b7fce7f | |||
52f5bea215 | |||
26b4e5498f | |||
ce733628b2 | |||
307320b3ff | |||
504b2e1ecf | |||
73e452edc0 | |||
bbeb97e93c | |||
e6d65f3549 | |||
1ab4cf68d7 | |||
f20c8b7d99 | |||
17a067752f | |||
7fcaf6510e | |||
0713941812 | |||
1d7d56d5e7 | |||
ba9941891d | |||
d3b313d8aa | |||
e2f0f61862 | |||
ecdcebce0c | |||
5fbf71264e | |||
8519e7660f | |||
e75d1f62ec | |||
1c9a9baf77 | |||
44246e6973 | |||
61f59a94e4 | |||
a8a689f69a | |||
e3bd22de8c | |||
c7787aa1f0 | |||
3870266131 | |||
98cc19c637 | |||
c1128c3156 | |||
485944a782 | |||
beb24adf7a | |||
6de5f73d78 | |||
35b51d151d | |||
b2333d83d2 | |||
7513f24ff3 | |||
cb9231f453 | |||
1c9230029d | |||
e300b49c95 | |||
f6cd35a631 | |||
53cecb8909 | |||
95188f6ce6 | |||
8c7e8dab8e | |||
305d2f60d0 | |||
7cdb8db775 | |||
7f14397262 | |||
893e24ff98 | |||
b60eb6d6ae | |||
26a7fee869 | |||
1bdc0497c7 | |||
04c2eac9ef | |||
5daaae36bc | |||
3dea30b1e1 | |||
9f8578d79e | |||
0fa5609396 | |||
9956ce31e5 | |||
25ff430368 | |||
cc9a2cbf4f | |||
cd8c0fa72f | |||
fff75d111e | |||
f4df84bfa1 | |||
0dc65f5dfb | |||
6e4abcfed8 | |||
e2f9a0c9cd | |||
749a2ba088 | |||
b70501a7ed | |||
b8ae741969 | |||
9f32b4b9cd | |||
fbf736aaf7 | |||
344a325cb5 | |||
eb7f78799d | |||
57d3965fa6 | |||
2df999ef75 | |||
c2cd0db9a3 | |||
04305b7fe5 | |||
d2f13354a7 | |||
a9067892f4 | |||
88223f5e6d | |||
6310be623a | |||
6481ddbd7f | |||
258020624c | |||
29d65e9cef | |||
31a605c153 | |||
08a8207f64 | |||
5a9ca08984 | |||
0a3d51c6b5 | |||
81208d617f | |||
7ba83b639a | |||
6c093160c2 | |||
7706109c81 | |||
00bebbc66f | |||
3df7e30d2c | |||
c674627ebd | |||
c5161887e2 | |||
f8a04d0fc2 | |||
6e1a43130d | |||
906646704e | |||
4e15d8fa1f | |||
1f250dd8e7 | |||
95202611ea | |||
d88e905c65 | |||
abb7230231 | |||
92d2ec7cf4 | |||
46a51bd8db | |||
6680db0b31 | |||
9ff602a655 | |||
37c9c6dfaf | |||
0981e99256 | |||
0793442518 | |||
31897ec520 | |||
6628f93823 | |||
8fb9306272 | |||
52b6815687 | |||
f17417a541 | |||
69b06364eb | |||
1d7d963a4f | |||
910d746002 | |||
f02f1d47f1 | |||
beaf8af2e8 | |||
fce8f13984 | |||
bcdad3f19c | |||
058dfb0c87 | |||
2b41321c03 | |||
5db03bb1bd | |||
26e13a6cd0 | |||
00f3b6ce5c | |||
11677b97ab | |||
281559e84b | |||
5f8a35ecc0 | |||
fd3312734c | |||
6d0476fa0a | |||
e41289d694 | |||
95db207b33 | |||
222f852af4 | |||
2a7e6c1173 | |||
f07934f512 | |||
8830ee8c2d | |||
2a173f67c8 | |||
0c5881a1a4 | |||
ec4fe8efb3 | |||
922ace1719 | |||
8e82a4a66d | |||
f6abcf08a7 | |||
fbe43f9ab7 | |||
7c7803310b | |||
c27053e716 | |||
d4fdaf9cbc | |||
5aa93ba50c | |||
77ca3e9033 | |||
6219fa1d87 | |||
0cbbeefd62 | |||
185567cf29 | |||
7dd5da8993 | |||
95ac304afb | |||
80dc5a13b8 | |||
b5abe6527b | |||
616aab4a2d | |||
12e693941c | |||
59c61e72b8 | |||
3ce954c68c | |||
df0d4dff6f | |||
a867cd6be0 | |||
b48dd4b63b | |||
35c457b7fb | |||
6870055033 | |||
5f968b50f8 | |||
251438eefd | |||
c07a372c6e | |||
f666a7ca09 | |||
0434928f55 | |||
c27b37918a | |||
67eab82bd1 | |||
8d86ca05da | |||
4d6a0d4931 | |||
4ae35576a5 | |||
af622599a5 | |||
12d1302138 | |||
09419398e9 | |||
b69e03368a | |||
4e457f1cf0 | |||
4196da9f52 | |||
a59177447b | |||
529abcc4b0 | |||
1cb5dd021f | |||
399b745084 | |||
f09a76e23b | |||
977aea45b3 | |||
16b6a70e22 | |||
9b38484438 | |||
77aa8c8374 | |||
856f3d2061 | |||
d712a96fdc | |||
ba243e9093 | |||
c36ce15a00 | |||
d39ab17db4 | |||
1a7260cc14 | |||
8a75381a3d | |||
c394fe9287 | |||
06f4a955b5 | |||
a2bf92db97 | |||
da40f4c96e | |||
6fa5a31217 | |||
eb91cd33be | |||
5bc7a701dc | |||
5cd0516048 | |||
48a603ece8 | |||
abfa56464a | |||
c1d6e21c3c | |||
3bd556a406 | |||
347fb6d882 | |||
b3cf7a5d93 | |||
c7cffdeb3b | |||
d45ae7908d | |||
b10fb4533e | |||
c74fdb816f | |||
40985a56c8 | |||
5c01f0be24 | |||
f7ff5af60b | |||
2088fc52f3 | |||
db33ab143e | |||
8c77d4006a | |||
2fa567b98b | |||
e61f04663a | |||
4b905fa7d2 | |||
5e6e7f018a | |||
53f56b430a | |||
50c934820c | |||
2a10a2cae2 | |||
65325b90fd | |||
cfecc36ae6 | |||
d9f8622459 | |||
8e13819e1e | |||
aaedf5d576 | |||
af9ffaf02d | |||
970acbd56e | |||
46c7399867 | |||
2ed12d4ca3 | |||
1edd2043dc | |||
9a6745635d | |||
2c5dd96de1 | |||
fa962b42bc | |||
34dc457aff | |||
a3311e4c57 | |||
ef8efbd53d | |||
6cd99efbb9 | |||
ae2b73a4f5 | |||
0c3ff82cfe | |||
50f303bbdc | |||
2a4944d6ee | |||
3544caf4be | |||
976333d7f7 | |||
6d5530ba9c | |||
77d0134e2e | |||
d3b4ad41c2 | |||
f8c4c70623 | |||
e268e357b3 | |||
af3cbe9ed1 | |||
4740faab6f | |||
37478bc391 | |||
b28eb049dc | |||
10dcb3a667 | |||
3d3baddd23 | |||
f306180ab6 | |||
9475a22831 | |||
2c3a09f448 | |||
7543faa577 | |||
3c81398865 | |||
caa489f58a | |||
43117a7ebe | |||
e712edba4e | |||
35d8024aaa | |||
563b02bb1d | |||
93aa6a18f2 | |||
b8d8f40ed7 | |||
e010dbb324 | |||
bd397c869e | |||
754a2c16bd | |||
57a9ffe6ab | |||
17564aa489 | |||
f00182968b | |||
77396093d8 | |||
784114e256 | |||
d1e7e7894e | |||
65bf38d5e6 | |||
26db493b0d | |||
6459f410e7 | |||
4072b91808 | |||
3ae0fd7bc9 | |||
df7d59bc9c | |||
4f24c46e9b | |||
8750bdd778 | |||
60a8ee657a | |||
d262c4428e | |||
9f9d28deef | |||
ea74385ac8 | |||
06cc95efb1 | |||
09ebeeb8e4 | |||
7e8e861468 | |||
df2ce72e39 | |||
ecf1bac5c7 | |||
d04bdd2685 | |||
fe8398017c | |||
c2253f5010 | |||
290dd0abf0 | |||
49560698f6 | |||
165bd4f638 | |||
9df59522d9 | |||
7fc66e2de8 | |||
1ce1d29c87 | |||
d522d105ad | |||
72b753c67f | |||
16ec65f38c | |||
ed67866f45 | |||
36b5197733 | |||
fa28393c14 | |||
077f076c43 | |||
c7ae520d7e | |||
39eb7ba862 | |||
116bb2c25f | |||
6bf293f96b | |||
eceaa38ed8 | |||
b6aa087536 | |||
d94e8b10d8 | |||
590a0fe080 | |||
41d0e953f5 | |||
3436455201 | |||
bb63e13770 | |||
62685cb892 | |||
6fe0ce70eb | |||
bee22311a7 | |||
2cde80237f | |||
3b93454c53 | |||
a5a17b9502 | |||
381f3d9b69 | |||
94319df69b | |||
1666c42f78 | |||
f1870e286d | |||
94194ff675 | |||
d37caa7665 | |||
a768b12985 | |||
6f257593c8 | |||
c4d47ddc26 | |||
60d1b73160 | |||
96c054415d | |||
89be1c810a | |||
6328bd9354 | |||
fcda211800 | |||
daa71c4f69 | |||
f2d61604f7 | |||
f0b9292458 | |||
0b79ec1235 | |||
b9601ff819 | |||
6f417fc4c7 | |||
d99b4d35ab | |||
6936ab6100 | |||
532f7a76f9 | |||
09e79d38ff | |||
1c40fa88ce | |||
a4ff5ffb43 | |||
799c418124 | |||
215e9b26a8 | |||
43132ea6f8 | |||
90a7ca8ae5 | |||
f077f4fc1b | |||
0cd849fe42 | |||
06a24e3a7d | |||
abd9fdec38 | |||
bfdbb4dacb | |||
b5b68e7439 | |||
a920220122 | |||
83ed4f6b0d | |||
6a32c53d05 | |||
0785129b7f | |||
45de84c183 | |||
b2da0cb12f | |||
e121c0f8ac | |||
bf006b45e4 | |||
a3f5873501 | |||
86b337ec88 | |||
7dda85cc5f | |||
68d6920d38 | |||
f540fd08fa | |||
aaf4877daa | |||
828e5629c5 | |||
44ceb4e865 | |||
88f954b437 | |||
f85595665f | |||
73b3ae7264 | |||
eaae401d16 | |||
efed5f68af | |||
79b4f9a0f4 | |||
c98286d426 | |||
d368bc2351 | |||
6a7b77ccf5 | |||
242eb6d733 | |||
2991e9894d | |||
3dc8bc87fc | |||
cfb99eaf80 | |||
5dee588c36 | |||
2f8c03ecb2 | |||
2dfde9a612 | |||
3dade275d4 | |||
2f5dc8a887 | |||
9b11684ae9 | |||
251e3b5646 | |||
03b47b43ad | |||
18e51aaff7 | |||
5c31c6084c | |||
b1464efdaf | |||
3e6e068f7f | |||
f7a08c7087 | |||
dfa4591834 | |||
4d3ec398c9 | |||
b169089156 | |||
5b6f95bd4a | |||
66a6b6d89b | |||
d74eba1922 | |||
9a7f69a614 | |||
0578a651da | |||
f991dcfb76 | |||
42c48cb93b | |||
67b763c4c0 | |||
2708562872 | |||
9578fb0cd8 | |||
a728f2368c | |||
547696d797 | |||
025b69541e | |||
5aa95c0415 | |||
d63c401e44 | |||
c9ac85089a | |||
a8c9b6f7fe | |||
eca9968a9f | |||
736c89cfc6 | |||
9a0fcc045c | |||
a3459679d0 | |||
12333f3417 | |||
2bf05ae40f | |||
833bad067e | |||
23eff4b924 | |||
30b769d741 | |||
d813029046 | |||
81de6119fe | |||
365af918f3 | |||
40fb144d09 | |||
8cacff37ab | |||
70985c5dbd | |||
9dec99824e | |||
d4730e1656 | |||
c079868224 | |||
54a59c5e6f | |||
0804a16314 | |||
4cc020f0ea | |||
b49fef78f5 | |||
2cced53c97 | |||
f6253ae7ed | |||
3f50bdb334 | |||
2a79813460 | |||
650824574c | |||
7b0506bbdb | |||
a3847bcca5 | |||
a143b21ea1 | |||
64ff463200 | |||
08ca7659e7 | |||
d7edfb4cc6 | |||
4eca80a770 | |||
56a662841e | |||
8878ea4cf7 | |||
eb32a798b8 | |||
0759ba6722 | |||
bfdf7b822f | |||
7dde924fcc | |||
b8cb41b1da | |||
971b92acbb | |||
d643efa9bb | |||
08c0aeb2d5 | |||
b0940eb33e | |||
6ec858b237 | |||
891412bdb9 | |||
1947802a35 | |||
3b06e32b40 | |||
a2711c2c08 | |||
3e6c9fa318 | |||
2e49c5932a | |||
abf750f894 | |||
137434af1b | |||
ac4d21b252 | |||
db362a0efc | |||
887631500b | |||
65043d0ff3 | |||
1bf7c06b1e | |||
7b218c7f02 | |||
3572877a2e | |||
f2d44114fa | |||
d1d2067ad5 | |||
9456370077 | |||
0833674b91 | |||
947b54555a | |||
1a88c9a651 | |||
567bb6fa2a | |||
00d0b71080 | |||
580e10b024 | |||
fbe9621387 | |||
13b5e7c00e | |||
09d59f00e7 | |||
772d24b173 | |||
cbd001e280 | |||
6d2c5f7fd4 | |||
1f6ca8bcc3 | |||
bff4e120a7 | |||
8a0018177a | |||
c9c8998fa2 | |||
e19edbb27a | |||
f2fe6a9885 | |||
0442a31153 | |||
e03c725b86 | |||
b0e842863d | |||
5b0fa90e39 | |||
ae6f6565fa | |||
c874ae7afd | |||
c27c0c5b8c | |||
ed102492e5 | |||
e077f9ee18 | |||
e9f4db7719 | |||
34e07b938d | |||
230230aa94 | |||
901846e6c1 | |||
a93f41f1c3 | |||
7439d949c4 | |||
77d4760945 | |||
e1276e464d | |||
d248dfe346 | |||
91b63f78eb | |||
754d7b3cd7 | |||
7d950d067c | |||
a34e89d56a | |||
4ec0d0633d | |||
4b51e604a7 | |||
e3e7bd27e9 | |||
f6ed0e8ab6 | |||
c179d9e759 | |||
98f387b605 | |||
275dda820b | |||
43c32c2c7b | |||
3f5388c2e8 | |||
bad24d6213 | |||
7a94efccbf | |||
3c72eea9ef | |||
3548cde9c4 | |||
3d17435438 | |||
f185254114 | |||
943e2ebe14 | |||
0c27a5f361 | |||
abfabc85b5 | |||
e08704e6d3 | |||
f60fc2ebad | |||
b50278e92f | |||
e0b6986851 | |||
d913798d5b | |||
56267095cb | |||
f9ce27def3 | |||
127a7a62c1 | |||
4429e847e8 | |||
56e321f6d9 | |||
e135ed26f0 | |||
48b25fe842 | |||
85e57286ae | |||
5ef6617062 | |||
ae89dcd62d | |||
f9597fe799 | |||
0ec27350e0 | |||
156ba832f2 | |||
c4f079dde2 | |||
2a2e9ef99d | |||
1446b16e77 | |||
f03003b366 | |||
d3db26499c | |||
d1f67fd8b9 | |||
31ee92b711 | |||
1ea7fa3084 | |||
fe217384aa | |||
49d2d5500f | |||
c1afc34cfc | |||
d8dc3c8445 | |||
ea1855fc26 | |||
0be84a4e51 | |||
d87ed1414e | |||
4382745012 | |||
f73238787d | |||
8c04596859 | |||
79b16ddda6 | |||
d490693bad | |||
6c9bd0b510 | |||
2740b6f957 | |||
37cf56a2b3 | |||
e73bb4ff4a | |||
ea35395d7e | |||
bad901a162 | |||
bb34528a86 | |||
487ec7907c | |||
3093ab8067 | |||
0f1d685ae6 | |||
24cb72e5b5 | |||
4c6ca58c95 | |||
d62989bc5d | |||
8e39da6726 | |||
98deac042e | |||
b51ffcada6 | |||
a6386b1612 | |||
72ecbb0abc | |||
c6caae8647 | |||
da23bba392 | |||
32e7f57a7c | |||
f7dfccb096 | |||
990c653397 | |||
911ece7612 | |||
222b4421e5 | |||
4517bd1356 | |||
5984ae46fc | |||
5bde1de61b | |||
06d229ea99 | |||
58391de007 | |||
ceb3e8e3dd | |||
35a331f3fd | |||
7d13ce0626 | |||
a49eebf9f5 | |||
989e4e1b75 | |||
9bb647e275 | |||
3dee082141 | |||
7d52d348b2 | |||
ded52b8d19 | |||
ab4ce0caba | |||
90c13a3959 | |||
9847c40e34 | |||
e751461194 | |||
a566265a72 | |||
fecf419f83 | |||
26c14d2bca | |||
92bfea1773 | |||
40ad9c47a8 | |||
de85f79ab6 | |||
3736f84c12 | |||
e7a7025961 | |||
e38cf1e2e8 | |||
7b84febfde | |||
39dcb937d5 | |||
3e3d3ebcf9 | |||
e370271093 | |||
55603b927f | |||
e35666bcc6 | |||
3a19890be9 | |||
725f8202ed | |||
ee917b0e1d | |||
a8900f3d6d | |||
ea8f429902 | |||
219301a85b | |||
06a453333a | |||
5e0975ddfa | |||
76527b310d | |||
73b4385578 | |||
bb3af4eff7 | |||
68adea7b5a | |||
4d3afb8efc | |||
852ac3cd55 | |||
40abd1ce6c | |||
3a7e98ab84 | |||
6364bbc6b3 | |||
fc7d2672db | |||
3a25704f41 | |||
98486f718b | |||
a7f830177a | |||
2c2d9c1bfe | |||
cc6b9d4099 | |||
1a284ac9dc | |||
b48ca99119 | |||
2e8d021a6a | |||
5409e3d203 | |||
f0064fd91f | |||
c3d158584b | |||
6b8a2a7770 | |||
cbb7ada63c | |||
fe00d3e501 | |||
b8eeeaeede | |||
dd4e20cfb5 | |||
597d66782e | |||
01031de074 | |||
1cc29be3d6 | |||
6cbdaa442b | |||
ab9d92a01a | |||
8aa3000fb1 | |||
64d8b5fcd1 | |||
05e88e5dcf | |||
5a819a96de | |||
7998a3fc98 | |||
9063996e84 | |||
76e62ae199 | |||
0e24de2b69 | |||
542dea69a1 | |||
89f2e0943c | |||
08eaa822fe | |||
39f2f94a53 | |||
b02de171f1 | |||
4091e9cdf4 | |||
b165322ba3 | |||
30750e63aa | |||
2cb636b050 | |||
5161205a06 | |||
79c5895f2f | |||
44f8c2f49f | |||
702ebbd557 | |||
e29efbbcdf | |||
44504feeb9 | |||
fdbe31cb76 | |||
10d2794bb7 | |||
eb3b6e5eca | |||
ccc32096ea | |||
4e5887d9ec | |||
2167c061a2 | |||
2100c5717e | |||
acc1b8e207 | |||
f3bd88837f | |||
8105a7edb8 | |||
385d90b056 | |||
ecf526aa03 | |||
a35b158fd1 | |||
2ebf05ae5b | |||
850da9de52 | |||
353c24c70e | |||
73d10ab093 | |||
668b7b6a39 | |||
70c072be0b | |||
eb2fbcd8d0 | |||
02f34d1c04 | |||
c8931f8535 | |||
0274490b68 | |||
06f2c74444 | |||
4d89de7068 | |||
2d50a63ca4 | |||
54dcccb472 | |||
d1e1ba1c66 | |||
7265b241a2 | |||
59436f7b45 | |||
771542ee5f | |||
b60eff2f5e | |||
f6d6cb929f | |||
6f2c80bc2e | |||
0fe0b21eda | |||
0bedc227f4 | |||
6c4419fb72 | |||
766e94ed62 | |||
4d2f159dd8 | |||
26a9d53f3b | |||
41156cec7c | |||
9fa6184b0a | |||
14f1a1f740 | |||
5a6c209369 | |||
8c2ce81b76 | |||
99ec188813 | |||
41d0089e53 | |||
8ed9f51008 | |||
6176ca2260 | |||
eb6ddb5e45 | |||
c5041db1d1 | |||
307b678707 | |||
550e60455b | |||
d263b80810 | |||
99227d2e42 | |||
31264aadda | |||
11a2fbacb4 | |||
7c865f87be | |||
86fcf19066 | |||
1f7cece8ec | |||
a731c35ad6 | |||
c7529dd56b | |||
00fff52529 | |||
4c7ad6d93a | |||
eb5493e37b | |||
1fb18c7919 | |||
1c2378b3b4 | |||
cd21575546 | |||
f9d6b9fe5d | |||
407766774d | |||
c8898ac6aa | |||
d05a1cef9b | |||
12b5544959 | |||
59e18b9a79 | |||
ea1780364b | |||
eef08ccb0b | |||
8a9edd3705 | |||
652a50c700 | |||
d1c01d3c86 | |||
8cf7ffc7cc | |||
b57fc2a0e3 | |||
736cba76bb | |||
2339560363 | |||
24e870a126 | |||
8bdf1e3072 | |||
e8e9598721 | |||
ce87ad2564 | |||
2a2f6e8142 | |||
3e5057c285 | |||
48b271b7ca | |||
8244e435bf | |||
a3a0f003f0 | |||
e42b8d22f7 | |||
5485950130 | |||
c8f4568bd0 | |||
51079b0252 | |||
bfc6ed4604 | |||
9cb26b73b5 | |||
c0311be192 | |||
cefb40856b | |||
ee7c450e11 | |||
d741e0f23c | |||
8080490e5c | |||
a3443d8077 | |||
53e8e7c688 | |||
dea94e4e68 | |||
d40c7f1821 | |||
c7e7e0c302 | |||
8ac6ac97f0 | |||
1afa4ab329 | |||
c2517c1670 | |||
717ceff02c | |||
6878c59f45 | |||
c00b053aa7 | |||
480e12c3ab | |||
50bd233b0a | |||
79406cf1ed | |||
2d5824c4ab | |||
3480809129 | |||
11bc48c7e0 | |||
d759401b69 | |||
5a2e5ac48f | |||
1144f818cf | |||
0aebecfbb0 | |||
531d40993a | |||
4c097faf88 | |||
5152e64895 | |||
0263237b2c | |||
acd0fae040 | |||
29dd51439d | |||
a1b2175801 | |||
b0f06a2195 | |||
f9c93ca022 | |||
8e0858bb24 | |||
ee0fa0451a | |||
e86e955682 | |||
9913fb48f5 | |||
71c362f016 | |||
fa6e8fd5f9 | |||
23b64951f3 | |||
99590d18f7 | |||
86b31bc040 | |||
d52bfed1df | |||
808ccd0376 | |||
44d6456de1 | |||
a394b95259 | |||
beeefe517a | |||
d02f4041b2 | |||
9fd75ff91e | |||
026ece3956 | |||
214a843dba | |||
1d6880c283 | |||
8ddad9bf4c | |||
f167022eea | |||
76edba1014 | |||
7904989a23 | |||
ea676b4368 | |||
cc2b102256 | |||
b1266abf01 | |||
cc7d0477e8 | |||
5a2d1a746d | |||
4f0e3fdf85 | |||
be9f56107c | |||
787f3815df | |||
35d7d9b380 | |||
8b9c51f303 | |||
661b3d5889 | |||
01c85cb58d | |||
0218f42e2b | |||
d8d0f22889 | |||
d8a097a95a | |||
dc577d4c24 | |||
8f9308de01 | |||
8f7a5e113b | |||
9820f9d9c5 | |||
56ff98cce7 | |||
dade6b2254 | |||
e9cac6eff3 | |||
a88b4b31a1 | |||
7fc2fcfa07 | |||
5689279954 | |||
04112956cf | |||
165e158f37 | |||
f301741852 | |||
eda1f23df9 | |||
d15d27af73 | |||
f1113fda24 | |||
33c208d8fe | |||
c557fb6cd5 | |||
bde2bc7709 | |||
5fe759aa91 | |||
a5b7badb95 | |||
eefd4c8669 | |||
438511c5f7 | |||
3eb960cf5a | |||
699f6ba458 | |||
f21f22d95c | |||
b520d08818 | |||
fb8fe93529 | |||
f9fd97230f | |||
536e2290b8 | |||
73b922facf | |||
ba0d9a186b | |||
80f5cb756d | |||
d7f566088f | |||
a3bcaea7f9 | |||
7c11f2db4f | |||
23c71b7218 | |||
7501f679f7 | |||
463f7ccf65 | |||
87fe407739 | |||
52e087d8f8 | |||
c5cd495fce | |||
37a417051d | |||
97d819739c | |||
3935378b0c | |||
952f95aa4c | |||
0a75a5be1f | |||
70b593e28a | |||
ed69a65f9b | |||
bb4f1ce7cd | |||
0cc2ba7595 | |||
8162429106 | |||
ed519d89d7 | |||
0e4f6185b8 | |||
05b4f5401e | |||
2ff0c7b06a | |||
2330f1d135 | |||
ff92d3acab | |||
32d7187db6 | |||
00534f8af7 | |||
3795570938 | |||
362248a02e | |||
16d20eabd2 | |||
eb5566f041 | |||
757da1dff4 | |||
85432af187 | |||
f0ab817e87 | |||
96af931c0b | |||
9a5209f7c2 | |||
0818a7cda0 | |||
f35947361c | |||
9a8bcc0550 | |||
eff46b076c | |||
ab64b682c3 | |||
1c007ea256 | |||
1ced47fc2c | |||
6c1412784b | |||
6e7f4df5e3 | |||
5b6ea600ba | |||
fd9d766913 | |||
26839c7fd1 | |||
264896c264 | |||
b6502e9ea1 | |||
25a2321578 | |||
6fb36374f6 | |||
9861e63589 | |||
bce5643994 | |||
ad5691142e | |||
e468080373 | |||
e3208187bf | |||
c98c36753c | |||
1419ff86e8 | |||
601bc03ba2 | |||
ea454d65bb | |||
776586ae25 | |||
78bf804e02 | |||
2a4004fd5b | |||
b5229d7786 | |||
20ecf168f2 | |||
dc348f33c5 | |||
b7cfaf6b63 | |||
bcf85db9c4 | |||
34d5bc4f28 | |||
f1e81c359e | |||
e4b192001f | |||
8279acc9a5 | |||
63438ad9ba | |||
467f4d2257 | |||
a5aaa6f103 | |||
9b273bc148 | |||
0aba9122a1 | |||
ac3706dfb6 | |||
3905171457 | |||
1e03f22086 | |||
360fdeaec8 | |||
d5914dfde9 | |||
d3f2a24267 | |||
516b8c9e38 | |||
f9631ff4c5 | |||
fa77139077 | |||
f12b9704d9 | |||
edb158f2d3 | |||
b2c6db6207 | |||
bcdd835275 | |||
5b4952d4c6 | |||
de43aa81be | |||
5eff4e45c9 | |||
70a13a75d5 | |||
dcf26d3863 | |||
a729edd399 | |||
69cc1086df | |||
18fa9aeaf6 | |||
96892722a4 | |||
54a0de4a08 | |||
a11dba88b2 | |||
d08cdfba49 | |||
031a46aa8e | |||
ffacf6e1ae | |||
69c4c3a2c8 | |||
c305fba0a7 | |||
44f4a82fa1 | |||
5bf750c90c | |||
836b5db8cf | |||
1753a5473c | |||
d00e13e4ee | |||
4b786d3536 | |||
e6bbc3442b | |||
433dd87e51 | |||
cf9eb3f602 | |||
bd686790dc | |||
e5ef7c0c22 | |||
3d891073da | |||
116c6e57ed | |||
a39ce566d1 | |||
671ba66354 | |||
a5ba72582c | |||
73c2c01def | |||
7c82e31b66 | |||
a58fe1f81c | |||
2829b8d495 | |||
3727b287a1 | |||
677b65d124 | |||
c448753bab | |||
31d31d7819 | |||
7ade873365 | |||
8788523c25 | |||
d32ef4bc3d | |||
b4faf8991d | |||
0564759481 | |||
24e391edf7 | |||
cf295105d4 | |||
c301523156 | |||
46e1347dc8 | |||
f5539ec678 | |||
2e8604e18d | |||
9ed28a4a37 | |||
3ca9d21bbd | |||
61683800cc | |||
4c74391137 | |||
f3b265bdd5 | |||
cae85f3e30 | |||
bcd5f1ee24 | |||
ab6ef22363 | |||
09d1c2cd4b | |||
d6aa31e4aa | |||
3efaa3b1cb | |||
2fe9698ea8 | |||
1cdeccc7a7 | |||
00433f02bc | |||
7fad4e9ea1 | |||
c6d326bbbc | |||
d60bc08843 | |||
3d62cba1b3 | |||
1c6ef28b80 | |||
00706558f5 | |||
5279c842f5 | |||
431b836568 | |||
de2703ee48 | |||
f85ac79b4a | |||
bea9f22a0c | |||
3f330dccf1 | |||
f7f934f0e8 | |||
0e683acde1 | |||
dd6414daf0 | |||
8756b7213f | |||
b0cbb5a2b4 | |||
6418b0c634 | |||
433d26e703 | |||
c99ffcb1f4 | |||
ef815cf060 | |||
7fb7a5452f | |||
4b641f8723 | |||
0d312def27 | |||
a13d0b7fab | |||
0390f46460 | |||
11cfb6e1b8 | |||
f16a107105 | |||
f683ca44a2 | |||
546cde56a8 | |||
934eb13813 | |||
a224711dce | |||
c1ae68b565 | |||
9351285182 | |||
aa45e53440 | |||
f6a9c90cef | |||
0b11ddbcfd | |||
5088453712 | |||
5e44bfc6c7 | |||
22be6bc860 | |||
134452582c | |||
fb56b3ad56 | |||
8b5a425da6 | |||
d6ec7e9ab8 | |||
e470451718 | |||
5920533637 | |||
7eb7027b67 | |||
c7f199a59e | |||
43176cfbb8 | |||
f34ef8c4c8 | |||
1cdbc11894 | |||
2be6b3f051 | |||
4f85616632 | |||
65095d18f2 | |||
a1a7b2b8ce | |||
bf232d0593 | |||
19c9fcd369 | |||
9526207af8 | |||
6aeb156a58 | |||
f380e43219 | |||
6289fe333b | |||
c00d77dcb1 | |||
56a91dfbaf | |||
f6898d16c9 | |||
72ef134750 | |||
a8f7bc01c3 | |||
2dabe0d3c4 | |||
dda0628621 | |||
91bf98b38d | |||
ac5ac8d34e | |||
9f840aa0fd | |||
377786caf9 | |||
bc8aafbb1f | |||
02b806ebe0 | |||
f092bfe653 | |||
28ae62b4ac | |||
91fb82d212 | |||
4a609943f9 |
190
.circleci/config.yml
Normal file
@ -0,0 +1,190 @@
|
|||||||
|
version: 2.1
|
||||||
|
executors:
|
||||||
|
pw-focal-development:
|
||||||
|
docker:
|
||||||
|
- image: mcr.microsoft.com/playwright:v1.17.2-focal
|
||||||
|
environment:
|
||||||
|
NODE_ENV: development # Needed to ensure 'dist' folder created and devDependencies installed
|
||||||
|
parameters:
|
||||||
|
BUST_CACHE:
|
||||||
|
description: "Set this with the CircleCI UI Trigger Workflow button (boolean = true) to bust the cache!"
|
||||||
|
default: false
|
||||||
|
type: boolean
|
||||||
|
commands:
|
||||||
|
build_and_install:
|
||||||
|
description: "All steps used to build and install. Will not work on node10"
|
||||||
|
parameters:
|
||||||
|
node-version:
|
||||||
|
type: string
|
||||||
|
steps:
|
||||||
|
- checkout
|
||||||
|
- restore_cache_cmd:
|
||||||
|
node-version: << parameters.node-version >>
|
||||||
|
- node/install:
|
||||||
|
install-npm: true
|
||||||
|
node-version: << parameters.node-version >>
|
||||||
|
- run: npm install
|
||||||
|
restore_cache_cmd:
|
||||||
|
description: "Custom command for restoring cache with the ability to bust cache. When BUST_CACHE is set to true, jobs will not restore cache"
|
||||||
|
parameters:
|
||||||
|
node-version:
|
||||||
|
type: string
|
||||||
|
steps:
|
||||||
|
- when:
|
||||||
|
condition:
|
||||||
|
equal: [false, << pipeline.parameters.BUST_CACHE >> ]
|
||||||
|
steps:
|
||||||
|
- restore_cache:
|
||||||
|
key: deps-{{ .Branch }}--<< parameters.node-version >>--{{ checksum "package.json" }}-{{ checksum ".circleci/config.yml" }}
|
||||||
|
save_cache_cmd:
|
||||||
|
description: "Custom command for saving cache."
|
||||||
|
parameters:
|
||||||
|
node-version:
|
||||||
|
type: string
|
||||||
|
steps:
|
||||||
|
- save_cache:
|
||||||
|
key: deps-{{ .Branch }}--<< parameters.node-version >>--{{ checksum "package.json" }}-{{ checksum ".circleci/config.yml" }}
|
||||||
|
paths:
|
||||||
|
- ~/.npm
|
||||||
|
- node_modules
|
||||||
|
generate_and_store_version_and_filesystem_artifacts:
|
||||||
|
description: "Track important packages and files"
|
||||||
|
steps:
|
||||||
|
- run: |
|
||||||
|
mkdir /tmp/artifacts
|
||||||
|
printenv NODE_ENV >> /tmp/artifacts/NODE_ENV.txt
|
||||||
|
npm -v >> /tmp/artifacts/npm-version.txt
|
||||||
|
node -v >> /tmp/artifacts/node-version.txt
|
||||||
|
ls -latR >> /tmp/artifacts/dir.txt
|
||||||
|
- store_artifacts:
|
||||||
|
path: /tmp/artifacts/
|
||||||
|
upload_code_covio:
|
||||||
|
description: "Command to upload code coverage reports to codecov.io"
|
||||||
|
steps:
|
||||||
|
- run: curl -Os https://uploader.codecov.io/latest/linux/codecov;chmod +x codecov;./codecov
|
||||||
|
orbs:
|
||||||
|
node: circleci/node@4.9.0
|
||||||
|
browser-tools: circleci/browser-tools@1.2.3
|
||||||
|
jobs:
|
||||||
|
npm-audit:
|
||||||
|
parameters:
|
||||||
|
node-version:
|
||||||
|
type: string
|
||||||
|
executor: pw-focal-development
|
||||||
|
steps:
|
||||||
|
- build_and_install:
|
||||||
|
node-version: <<parameters.node-version>>
|
||||||
|
- run: npm audit --audit-level=low
|
||||||
|
- generate_and_store_version_and_filesystem_artifacts
|
||||||
|
node14-lint:
|
||||||
|
parameters:
|
||||||
|
node-version:
|
||||||
|
type: string
|
||||||
|
executor: pw-focal-development
|
||||||
|
steps:
|
||||||
|
- build_and_install:
|
||||||
|
node-version: <<parameters.node-version>>
|
||||||
|
- run: npm run lint
|
||||||
|
- generate_and_store_version_and_filesystem_artifacts
|
||||||
|
unit-test:
|
||||||
|
parameters:
|
||||||
|
node-version:
|
||||||
|
type: string
|
||||||
|
browser:
|
||||||
|
type: string
|
||||||
|
executor: pw-focal-development
|
||||||
|
steps:
|
||||||
|
- build_and_install:
|
||||||
|
node-version: <<parameters.node-version>>
|
||||||
|
- when:
|
||||||
|
condition:
|
||||||
|
equal: [ "FirefoxESR", <<parameters.browser>> ]
|
||||||
|
steps:
|
||||||
|
- browser-tools/install-firefox:
|
||||||
|
version: "91.4.0esr" #https://archive.mozilla.org/pub/firefox/releases/
|
||||||
|
- when:
|
||||||
|
condition:
|
||||||
|
equal: [ "FirefoxHeadless", <<parameters.browser>> ]
|
||||||
|
steps:
|
||||||
|
- browser-tools/install-firefox
|
||||||
|
- when:
|
||||||
|
condition:
|
||||||
|
equal: [ "ChromeHeadless", <<parameters.browser>> ]
|
||||||
|
steps:
|
||||||
|
- browser-tools/install-chrome:
|
||||||
|
replace-existing: false
|
||||||
|
- run: npm run test:coverage -- --browsers=<<parameters.browser>>
|
||||||
|
- save_cache_cmd:
|
||||||
|
node-version: <<parameters.node-version>>
|
||||||
|
- store_test_results:
|
||||||
|
path: dist/reports/tests/
|
||||||
|
- store_artifacts:
|
||||||
|
path: dist/reports/
|
||||||
|
- generate_and_store_version_and_filesystem_artifacts
|
||||||
|
e2e-test:
|
||||||
|
parameters:
|
||||||
|
node-version:
|
||||||
|
type: string
|
||||||
|
suite:
|
||||||
|
type: string
|
||||||
|
executor: pw-focal-development
|
||||||
|
steps:
|
||||||
|
- build_and_install:
|
||||||
|
node-version: <<parameters.node-version>>
|
||||||
|
- run: npx playwright install
|
||||||
|
- run: npm run test:e2e:<<parameters.suite>>
|
||||||
|
- store_test_results:
|
||||||
|
path: test-results/results.xml
|
||||||
|
- store_artifacts:
|
||||||
|
path: test-results
|
||||||
|
- generate_and_store_version_and_filesystem_artifacts
|
||||||
|
workflows:
|
||||||
|
overall-circleci-commit-status: #These jobs run on every commit
|
||||||
|
jobs:
|
||||||
|
- node14-lint:
|
||||||
|
node-version: lts/fermium
|
||||||
|
- unit-test:
|
||||||
|
name: node12-chrome
|
||||||
|
node-version: lts/erbium
|
||||||
|
browser: ChromeHeadless
|
||||||
|
- unit-test:
|
||||||
|
name: node14-chrome
|
||||||
|
node-version: lts/fermium
|
||||||
|
browser: ChromeHeadless
|
||||||
|
post-steps:
|
||||||
|
- upload_code_covio
|
||||||
|
- e2e-test:
|
||||||
|
name: e2e-ci
|
||||||
|
node-version: lts/fermium
|
||||||
|
suite: ci
|
||||||
|
the-nightly: #These jobs do not run on PRs, but against master at night
|
||||||
|
jobs:
|
||||||
|
- unit-test:
|
||||||
|
name: node12-firefoxESR-nightly
|
||||||
|
node-version: lts/erbium
|
||||||
|
browser: FirefoxESR
|
||||||
|
- unit-test:
|
||||||
|
name: node12-chrome-nightly
|
||||||
|
node-version: lts/erbium
|
||||||
|
browser: ChromeHeadless
|
||||||
|
- unit-test:
|
||||||
|
name: node14-firefox-nightly
|
||||||
|
node-version: lts/fermium
|
||||||
|
browser: FirefoxHeadless
|
||||||
|
- unit-test:
|
||||||
|
name: node14-chrome-nightly
|
||||||
|
node-version: lts/fermium
|
||||||
|
browser: ChromeHeadless
|
||||||
|
- npm-audit:
|
||||||
|
node-version: lts/fermium
|
||||||
|
- e2e-test:
|
||||||
|
name: e2e-full-nightly
|
||||||
|
node-version: lts/fermium
|
||||||
|
suite: full
|
||||||
|
triggers:
|
||||||
|
- schedule:
|
||||||
|
cron: "0 0 * * *"
|
||||||
|
filters:
|
||||||
|
branches:
|
||||||
|
only:
|
||||||
|
- master
|
270
.eslintrc.js
Normal file
@ -0,0 +1,270 @@
|
|||||||
|
const LEGACY_FILES = ["platform/**", "example/**"];
|
||||||
|
module.exports = {
|
||||||
|
"env": {
|
||||||
|
"browser": true,
|
||||||
|
"es6": true,
|
||||||
|
"jasmine": true,
|
||||||
|
"amd": true
|
||||||
|
},
|
||||||
|
"globals": {
|
||||||
|
"_": "readonly"
|
||||||
|
},
|
||||||
|
"extends": [
|
||||||
|
"eslint:recommended",
|
||||||
|
"plugin:vue/recommended",
|
||||||
|
"plugin:you-dont-need-lodash-underscore/compatible"
|
||||||
|
],
|
||||||
|
"parser": "vue-eslint-parser",
|
||||||
|
"parserOptions": {
|
||||||
|
"parser": "babel-eslint",
|
||||||
|
"allowImportExportEverywhere": true,
|
||||||
|
"ecmaVersion": 2015,
|
||||||
|
"ecmaFeatures": {
|
||||||
|
"impliedStrict": true
|
||||||
|
}
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"you-dont-need-lodash-underscore/omit": "off",
|
||||||
|
"you-dont-need-lodash-underscore/throttle": "off",
|
||||||
|
"you-dont-need-lodash-underscore/flatten": "off",
|
||||||
|
"no-bitwise": "error",
|
||||||
|
"curly": "error",
|
||||||
|
"eqeqeq": "error",
|
||||||
|
"guard-for-in": "error",
|
||||||
|
"no-extend-native": "error",
|
||||||
|
"no-inner-declarations": "off",
|
||||||
|
"no-use-before-define": ["error", "nofunc"],
|
||||||
|
"no-caller": "error",
|
||||||
|
"no-sequences": "error",
|
||||||
|
"no-irregular-whitespace": "error",
|
||||||
|
"no-new": "error",
|
||||||
|
"no-shadow": "error",
|
||||||
|
"no-undef": "error",
|
||||||
|
"no-unused-vars": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"vars": "all",
|
||||||
|
"args": "none"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-console": "off",
|
||||||
|
"no-trailing-spaces": "error",
|
||||||
|
"space-before-function-paren": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"anonymous": "always",
|
||||||
|
"asyncArrow": "always",
|
||||||
|
"named": "never"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"array-bracket-spacing": "error",
|
||||||
|
"space-in-parens": "error",
|
||||||
|
"space-before-blocks": "error",
|
||||||
|
"comma-dangle": "error",
|
||||||
|
"eol-last": "error",
|
||||||
|
"new-cap": [
|
||||||
|
"error",
|
||||||
|
{
|
||||||
|
"capIsNew": false,
|
||||||
|
"properties": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"dot-notation": "error",
|
||||||
|
"indent": ["error", 4],
|
||||||
|
|
||||||
|
// https://eslint.org/docs/rules/no-case-declarations
|
||||||
|
"no-case-declarations": "error",
|
||||||
|
// https://eslint.org/docs/rules/max-classes-per-file
|
||||||
|
"max-classes-per-file": ["error", 1],
|
||||||
|
// https://eslint.org/docs/rules/no-eq-null
|
||||||
|
"no-eq-null": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-eval
|
||||||
|
"no-eval": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-floating-decimal
|
||||||
|
"no-floating-decimal": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-implicit-globals
|
||||||
|
"no-implicit-globals": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-implied-eval
|
||||||
|
"no-implied-eval": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-lone-blocks
|
||||||
|
"no-lone-blocks": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-loop-func
|
||||||
|
"no-loop-func": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-new-func
|
||||||
|
"no-new-func": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-new-wrappers
|
||||||
|
"no-new-wrappers": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-octal-escape
|
||||||
|
"no-octal-escape": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-proto
|
||||||
|
"no-proto": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-return-await
|
||||||
|
"no-return-await": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-script-url
|
||||||
|
"no-script-url": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-self-compare
|
||||||
|
"no-self-compare": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-sequences
|
||||||
|
"no-sequences": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-unmodified-loop-condition
|
||||||
|
"no-unmodified-loop-condition": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-useless-call
|
||||||
|
"no-useless-call": "error",
|
||||||
|
// https://eslint.org/docs/rules/wrap-iife
|
||||||
|
"wrap-iife": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-nested-ternary
|
||||||
|
"no-nested-ternary": "error",
|
||||||
|
// https://eslint.org/docs/rules/switch-colon-spacing
|
||||||
|
"switch-colon-spacing": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-useless-computed-key
|
||||||
|
"no-useless-computed-key": "error",
|
||||||
|
// https://eslint.org/docs/rules/rest-spread-spacing
|
||||||
|
"rest-spread-spacing": ["error"],
|
||||||
|
// https://eslint.org/docs/rules/no-var
|
||||||
|
"no-var": "error",
|
||||||
|
// https://eslint.org/docs/rules/one-var
|
||||||
|
"one-var": ["error", "never"],
|
||||||
|
// https://eslint.org/docs/rules/default-case-last
|
||||||
|
"default-case-last": "error",
|
||||||
|
// https://eslint.org/docs/rules/default-param-last
|
||||||
|
"default-param-last": "error",
|
||||||
|
// https://eslint.org/docs/rules/grouped-accessor-pairs
|
||||||
|
"grouped-accessor-pairs": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-constructor-return
|
||||||
|
"no-constructor-return": "error",
|
||||||
|
// https://eslint.org/docs/rules/array-callback-return
|
||||||
|
"array-callback-return": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-invalid-this
|
||||||
|
"no-invalid-this": "error", // Believe this one actually surfaces some bugs
|
||||||
|
// https://eslint.org/docs/rules/func-style
|
||||||
|
"func-style": ["error", "declaration"],
|
||||||
|
// https://eslint.org/docs/rules/no-unused-expressions
|
||||||
|
"no-unused-expressions": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-useless-concat
|
||||||
|
"no-useless-concat": "error",
|
||||||
|
// https://eslint.org/docs/rules/radix
|
||||||
|
"radix": "error",
|
||||||
|
// https://eslint.org/docs/rules/require-await
|
||||||
|
"require-await": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-alert
|
||||||
|
"no-alert": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-useless-constructor
|
||||||
|
"no-useless-constructor": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-duplicate-imports
|
||||||
|
"no-duplicate-imports": "error",
|
||||||
|
|
||||||
|
// https://eslint.org/docs/rules/no-implicit-coercion
|
||||||
|
"no-implicit-coercion": "error",
|
||||||
|
//https://eslint.org/docs/rules/no-unneeded-ternary
|
||||||
|
"no-unneeded-ternary": "error",
|
||||||
|
// https://eslint.org/docs/rules/semi
|
||||||
|
"semi": ["error", "always"],
|
||||||
|
// https://eslint.org/docs/rules/no-multi-spaces
|
||||||
|
"no-multi-spaces": "error",
|
||||||
|
// https://eslint.org/docs/rules/key-spacing
|
||||||
|
"key-spacing": ["error", {
|
||||||
|
"afterColon": true
|
||||||
|
}],
|
||||||
|
// https://eslint.org/docs/rules/keyword-spacing
|
||||||
|
"keyword-spacing": ["error", {
|
||||||
|
"before": true,
|
||||||
|
"after": true
|
||||||
|
}],
|
||||||
|
// https://eslint.org/docs/rules/comma-spacing
|
||||||
|
// Also requires one line code fix
|
||||||
|
"comma-spacing": ["error", {
|
||||||
|
"after": true
|
||||||
|
}],
|
||||||
|
//https://eslint.org/docs/rules/no-whitespace-before-property
|
||||||
|
"no-whitespace-before-property": "error",
|
||||||
|
// https://eslint.org/docs/rules/object-curly-newline
|
||||||
|
"object-curly-newline": ["error", {
|
||||||
|
"consistent": true,
|
||||||
|
"multiline": true
|
||||||
|
}],
|
||||||
|
// https://eslint.org/docs/rules/object-property-newline
|
||||||
|
"object-property-newline": "error",
|
||||||
|
// https://eslint.org/docs/rules/brace-style
|
||||||
|
"brace-style": "error",
|
||||||
|
// https://eslint.org/docs/rules/no-multiple-empty-lines
|
||||||
|
"no-multiple-empty-lines": ["error", {"max": 1}],
|
||||||
|
// https://eslint.org/docs/rules/operator-linebreak
|
||||||
|
"operator-linebreak": ["error", "before", {"overrides": {"=": "after"}}],
|
||||||
|
// https://eslint.org/docs/rules/padding-line-between-statements
|
||||||
|
"padding-line-between-statements": ["error", {
|
||||||
|
"blankLine": "always",
|
||||||
|
"prev": "multiline-block-like",
|
||||||
|
"next": "*"
|
||||||
|
}, {
|
||||||
|
"blankLine": "always",
|
||||||
|
"prev": "*",
|
||||||
|
"next": "return"
|
||||||
|
}],
|
||||||
|
// https://eslint.org/docs/rules/space-infix-ops
|
||||||
|
"space-infix-ops": "error",
|
||||||
|
// https://eslint.org/docs/rules/space-unary-ops
|
||||||
|
"space-unary-ops": ["error", {
|
||||||
|
"words": true,
|
||||||
|
"nonwords": false
|
||||||
|
}],
|
||||||
|
// https://eslint.org/docs/rules/arrow-spacing
|
||||||
|
"arrow-spacing": "error",
|
||||||
|
// https://eslint.org/docs/rules/semi-spacing
|
||||||
|
"semi-spacing": ["error", {
|
||||||
|
"before": false,
|
||||||
|
"after": true
|
||||||
|
}],
|
||||||
|
|
||||||
|
"vue/html-indent": [
|
||||||
|
"error",
|
||||||
|
4,
|
||||||
|
{
|
||||||
|
"attribute": 1,
|
||||||
|
"baseIndent": 0,
|
||||||
|
"closeBracket": 0,
|
||||||
|
"alignAttributesVertically": true,
|
||||||
|
"ignores": []
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"vue/html-self-closing": ["error",
|
||||||
|
{
|
||||||
|
"html": {
|
||||||
|
"void": "never",
|
||||||
|
"normal": "never",
|
||||||
|
"component": "always"
|
||||||
|
},
|
||||||
|
"svg": "always",
|
||||||
|
"math": "always"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"vue/max-attributes-per-line": ["error", {
|
||||||
|
"singleline": 1,
|
||||||
|
"multiline": {
|
||||||
|
"max": 1,
|
||||||
|
"allowFirstLine": true
|
||||||
|
}
|
||||||
|
}],
|
||||||
|
"vue/multiline-html-element-content-newline": "off",
|
||||||
|
"vue/singleline-html-element-content-newline": "off",
|
||||||
|
"vue/no-mutating-props": "off"
|
||||||
|
|
||||||
|
},
|
||||||
|
"overrides": [
|
||||||
|
{
|
||||||
|
"files": LEGACY_FILES,
|
||||||
|
"rules": {
|
||||||
|
"no-unused-vars": [
|
||||||
|
"warn",
|
||||||
|
{
|
||||||
|
"vars": "all",
|
||||||
|
"args": "none",
|
||||||
|
"varsIgnorePattern": "controller"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"no-nested-ternary": "off",
|
||||||
|
"no-var": "off",
|
||||||
|
"one-var": "off"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
44
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@ -0,0 +1,44 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: File a Bug !
|
||||||
|
title: ''
|
||||||
|
labels: type:bug
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!--- Focus on user impact in the title. Use the Summary Field to -->
|
||||||
|
<!--- describe the problem technically. -->
|
||||||
|
|
||||||
|
#### Summary
|
||||||
|
<!--- A description of the issue encountered. When possible, a description -->
|
||||||
|
<!--- of the impact of the issue. What use case does it impede?-->
|
||||||
|
|
||||||
|
#### Expected vs Current Behavior
|
||||||
|
<!--- Tell us what should have happened -->
|
||||||
|
|
||||||
|
#### Impact Check List
|
||||||
|
<!--- Please select from the following options -->
|
||||||
|
|
||||||
|
- [ ] Data loss or misrepresented data?
|
||||||
|
- [ ] Regression? Did this used to work or has it always been broken?
|
||||||
|
- [ ] Is there a workaround available?
|
||||||
|
- [ ] Does this impact a critical component?
|
||||||
|
- [ ] Is this just a visual bug with no functional impact?
|
||||||
|
|
||||||
|
#### Steps to Reproduce
|
||||||
|
<!--- Provide a link to a live example, or an unambiguous set of steps to -->
|
||||||
|
<!--- reproduce this bug. Include code to reproduce, if relevant -->
|
||||||
|
1.
|
||||||
|
2.
|
||||||
|
3.
|
||||||
|
4.
|
||||||
|
|
||||||
|
#### Environment
|
||||||
|
* Open MCT Version: <!--- date of build, version, or SHA -->
|
||||||
|
* Deployment Type: <!--- npm dev? VIPER Dev? openmct-yamcs? -->
|
||||||
|
* OS:
|
||||||
|
* Browser:
|
||||||
|
|
||||||
|
#### Additional Information
|
||||||
|
<!--- Include any screenshots, gifs, or logs which will expedite triage -->
|
5
.github/ISSUE_TEMPLATE/config.yml
vendored
Normal file
@ -0,0 +1,5 @@
|
|||||||
|
blank_issues_enabled: true
|
||||||
|
contact_links:
|
||||||
|
- name: Discussions
|
||||||
|
url: https://github.com/nasa/openmct/discussions
|
||||||
|
about: Have a question about the project?
|
20
.github/ISSUE_TEMPLATE/enhancement-request.md
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Enhancement request
|
||||||
|
about: Suggest an enhancement or new improvement for this project
|
||||||
|
title: ''
|
||||||
|
labels: type:enhancement
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
11
.github/ISSUE_TEMPLATE/maintenance-type.md
vendored
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
---
|
||||||
|
name: Maintenance
|
||||||
|
about: Add, update or remove documentation, tests, or dependencies.
|
||||||
|
title: ''
|
||||||
|
labels: type:maintenance
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
#### Summary
|
||||||
|
<!--- Generally describe the purpose of the change. -->
|
13
.github/PULL_REQUEST_TEMPLATE.md
vendored
Normal file
@ -0,0 +1,13 @@
|
|||||||
|
### All Submissions:
|
||||||
|
|
||||||
|
* [ ] Have you followed the guidelines in our [Contributing document](https://github.com/nasa/openmct/blob/master/CONTRIBUTING.md)?
|
||||||
|
* [ ] Have you checked to ensure there aren't other open [Pull Requests](https://github.com/nasa/openmct/pulls) for the same update/change?
|
||||||
|
* [ ] Is this change backwards compatible? For example, developers won't need to change how they are calling the API or how they've extended core plugins such as Tables or Plots.
|
||||||
|
|
||||||
|
### Author Checklist
|
||||||
|
|
||||||
|
* [ ] Changes address original issue?
|
||||||
|
* [ ] Unit tests included and/or updated with changes?
|
||||||
|
* [ ] Command line build passes?
|
||||||
|
* [ ] Has this been smoke tested?
|
||||||
|
* [ ] Testing instructions included in associated issue?
|
27
.github/dependabot.yml
vendored
Normal file
@ -0,0 +1,27 @@
|
|||||||
|
|
||||||
|
version: 2
|
||||||
|
updates:
|
||||||
|
- package-ecosystem: "npm"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
open-pull-requests-limit: 4
|
||||||
|
labels:
|
||||||
|
- "type:maintenance"
|
||||||
|
- "dependencies"
|
||||||
|
- "pr:e2e"
|
||||||
|
allow:
|
||||||
|
- dependency-name: "*eslint*"
|
||||||
|
- dependency-name: "*karma*"
|
||||||
|
- dependency-name: "*jasmine*"
|
||||||
|
- dependency-name: "*playwright*"
|
||||||
|
- dependency-name: "*percy*"
|
||||||
|
- dependency-name: "*vue-loader*"
|
||||||
|
|
||||||
|
- package-ecosystem: "github-actions"
|
||||||
|
directory: "/"
|
||||||
|
schedule:
|
||||||
|
interval: "daily"
|
||||||
|
labels:
|
||||||
|
- "type:maintenance"
|
||||||
|
- "dependencies"
|
43
.github/workflows/codeql-analysis.yml
vendored
Normal file
@ -0,0 +1,43 @@
|
|||||||
|
|
||||||
|
name: "CodeQL"
|
||||||
|
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches: [ master ]
|
||||||
|
pull_request:
|
||||||
|
branches: [ master ]
|
||||||
|
paths-ignore:
|
||||||
|
- '**/*Spec.js'
|
||||||
|
- '**/*.md'
|
||||||
|
- '**/*.txt'
|
||||||
|
- '**/*.yml'
|
||||||
|
- '**/*.yaml'
|
||||||
|
- '**/*.spec.js'
|
||||||
|
- '**/*.config.js'
|
||||||
|
schedule:
|
||||||
|
- cron: '28 21 * * 3'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
analyze:
|
||||||
|
name: Analyze
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
actions: read
|
||||||
|
contents: read
|
||||||
|
security-events: write
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout repository
|
||||||
|
uses: actions/checkout@v2
|
||||||
|
|
||||||
|
# Initializes the CodeQL tools for scanning.
|
||||||
|
- name: Initialize CodeQL
|
||||||
|
uses: github/codeql-action/init@v1
|
||||||
|
with:
|
||||||
|
languages: javascript
|
||||||
|
|
||||||
|
- name: Autobuild
|
||||||
|
uses: github/codeql-action/autobuild@v1
|
||||||
|
|
||||||
|
- name: Perform CodeQL Analysis
|
||||||
|
uses: github/codeql-action/analyze@v1
|
53
.github/workflows/e2e-pr.yml
vendored
Normal file
@ -0,0 +1,53 @@
|
|||||||
|
name: "e2e-pr"
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
types: [ labeled ]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
e2e-full:
|
||||||
|
if: ${{ github.event.label.name == 'pr:e2e' }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- name: Trigger Success
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: 'Started e2e Run. Follow along: https://github.com/nasa/openmct/actions/runs/' + context.runId
|
||||||
|
})
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: '14'
|
||||||
|
- run: npm install
|
||||||
|
- run: npm run test:e2e:full
|
||||||
|
- name: Archive test results
|
||||||
|
uses: actions/upload-artifact@v2
|
||||||
|
with:
|
||||||
|
path: test-results
|
||||||
|
- name: Test success
|
||||||
|
if: ${{ success() }}
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: 'Success ✅ ! Build artifacts are here: https://github.com/nasa/openmct/actions/runs/' + context.runId
|
||||||
|
})
|
||||||
|
- name: Test failure
|
||||||
|
if: ${{ failure() }}
|
||||||
|
uses: actions/github-script@v5
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: 'Failure ❌ ! Build artifacts are here: https://github.com/nasa/openmct/actions/runs/' + context.runId
|
||||||
|
})
|
23
.github/workflows/e2e-visual.yml
vendored
Normal file
@ -0,0 +1,23 @@
|
|||||||
|
name: "e2e-visual"
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
pull_request:
|
||||||
|
types:
|
||||||
|
- labeled
|
||||||
|
schedule:
|
||||||
|
- cron: '28 21 * * 1-5'
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
e2e-visual:
|
||||||
|
if: ${{ github.event.label.name == 'pr:visual' }} || ${{ github.event.workflow_dispatch }} || ${{ github.event.schedule }}
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: '14'
|
||||||
|
- run: npm install
|
||||||
|
- name: Run the e2e visual tests
|
||||||
|
run: npm run test:e2e:visual
|
||||||
|
env:
|
||||||
|
PERCY_TOKEN: ${{ secrets.PERCY_TOKEN }}
|
21
.github/workflows/e2e.yml
vendored
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
name: "e2e"
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
description: 'Which branch do you want to test?' # Limited to branch for now
|
||||||
|
required: false
|
||||||
|
default: 'master'
|
||||||
|
jobs:
|
||||||
|
e2e:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.inputs.version }}
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: '14'
|
||||||
|
- run: npm install
|
||||||
|
- name: Run the e2e tests
|
||||||
|
run: npm run test:e2e:ci
|
20
.github/workflows/lighthouse.yml
vendored
Normal file
@ -0,0 +1,20 @@
|
|||||||
|
name: lighthouse
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
version:
|
||||||
|
description: 'Which branch do you want to test?' # Limited to branch for now
|
||||||
|
required: false
|
||||||
|
default: 'master'
|
||||||
|
jobs:
|
||||||
|
lighthouse:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
with:
|
||||||
|
ref: ${{ github.event.inputs.version }}
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: '14'
|
||||||
|
- run: npm install && npm install -g @lhci/cli #Don't want to include this in our deps
|
||||||
|
- run: lhci autorun
|
33
.github/workflows/npm-prerelease.yml
vendored
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
# This workflow will run tests using node and then publish a package to npmjs when a prerelease is created
|
||||||
|
# For more information see: https://help.github.com/actions/language-and-framework-guides/publishing-nodejs-packages
|
||||||
|
|
||||||
|
name: npm_prerelease
|
||||||
|
|
||||||
|
on:
|
||||||
|
release:
|
||||||
|
types: [prereleased]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: 14
|
||||||
|
- run: npm install
|
||||||
|
- run: npm test
|
||||||
|
|
||||||
|
publish-npm-prerelease:
|
||||||
|
needs: build
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
steps:
|
||||||
|
- uses: actions/checkout@v2
|
||||||
|
- uses: actions/setup-node@v2
|
||||||
|
with:
|
||||||
|
node-version: 14
|
||||||
|
registry-url: https://registry.npmjs.org/
|
||||||
|
- run: npm install
|
||||||
|
- run: npm publish --access public --tag unstable
|
||||||
|
env:
|
||||||
|
NODE_AUTH_TOKEN: ${{ secrets.NPM_TOKEN }}
|
16
.gitignore
vendored
@ -3,6 +3,7 @@
|
|||||||
*.gzip
|
*.gzip
|
||||||
*.tgz
|
*.tgz
|
||||||
*.DS_Store
|
*.DS_Store
|
||||||
|
*.swp
|
||||||
|
|
||||||
# Compiled CSS, unless directly added
|
# Compiled CSS, unless directly added
|
||||||
*.sass-cache
|
*.sass-cache
|
||||||
@ -35,3 +36,18 @@ protractor/logs
|
|||||||
|
|
||||||
# npm-debug log
|
# npm-debug log
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
|
|
||||||
|
# karma reports
|
||||||
|
report.*.json
|
||||||
|
|
||||||
|
# Lighthouse reports
|
||||||
|
.lighthouseci
|
||||||
|
|
||||||
|
# e2e test artifacts
|
||||||
|
test-results
|
||||||
|
allure-results
|
||||||
|
|
||||||
|
package-lock.json
|
||||||
|
|
||||||
|
#codecov artifacts
|
||||||
|
codecov
|
||||||
|
@ -33,3 +33,12 @@ protractor/logs
|
|||||||
|
|
||||||
# npm-debug log
|
# npm-debug log
|
||||||
npm-debug.log
|
npm-debug.log
|
||||||
|
|
||||||
|
# Infra and tests
|
||||||
|
.circleci
|
||||||
|
.github
|
||||||
|
e2e
|
||||||
|
codecov.yml
|
||||||
|
lighthouserc.yml
|
||||||
|
*.Spec.js
|
||||||
|
karma.conf.js
|
||||||
|
6
.npmrc
Normal file
@ -0,0 +1,6 @@
|
|||||||
|
loglevel=warn
|
||||||
|
|
||||||
|
# Temporary: istanbul-instrumenter-loader is working with webpack 5, but states
|
||||||
|
# webpack 4 being the latest version it supports, so this legacy-peer-deps
|
||||||
|
# allows us to install it anyway.
|
||||||
|
legacy-peer-deps=true
|
272
CONTRIBUTING.md
@ -1,6 +1,6 @@
|
|||||||
# Contributing to Open MCT Web
|
# Contributing to Open MCT
|
||||||
|
|
||||||
This document describes the process of contributing to Open MCT Web as well
|
This document describes the process of contributing to Open MCT as well
|
||||||
as the standards that will be applied when evaluating contributions.
|
as the standards that will be applied when evaluating contributions.
|
||||||
|
|
||||||
Please be aware that additional agreements will be necessary before we can
|
Please be aware that additional agreements will be necessary before we can
|
||||||
@ -10,7 +10,7 @@ accept changes from external contributors.
|
|||||||
|
|
||||||
The short version:
|
The short version:
|
||||||
|
|
||||||
1. Write your contribution.
|
1. Write your contribution or describe your idea in the form of an [GitHub issue](https://github.com/nasa/openmct/issues/new/choose) or [Starting a GitHub Discussion](https://github.com/nasa/openmct/discussions)
|
||||||
2. Make sure your contribution meets code, test, and commit message
|
2. Make sure your contribution meets code, test, and commit message
|
||||||
standards as described below.
|
standards as described below.
|
||||||
3. Submit a pull request from a topic branch back to `master`. Include a check
|
3. Submit a pull request from a topic branch back to `master`. Include a check
|
||||||
@ -18,12 +18,13 @@ The short version:
|
|||||||
for review.)
|
for review.)
|
||||||
4. Respond to any discussion. When the reviewer decides it's ready, they
|
4. Respond to any discussion. When the reviewer decides it's ready, they
|
||||||
will merge back `master` and fill out their own check list.
|
will merge back `master` and fill out their own check list.
|
||||||
|
5. If you are a first-time contributor, please see [this discussion](https://github.com/nasa/openmct/discussions/3821) for further information.
|
||||||
|
|
||||||
## Contribution Process
|
## Contribution Process
|
||||||
|
|
||||||
Open MCT Web uses git for software version control, and for branching and
|
Open MCT uses git for software version control, and for branching and
|
||||||
merging. The central repository is at
|
merging. The central repository is at
|
||||||
https://github.com/nasa/openmctweb.git.
|
https://github.com/nasa/openmct.git.
|
||||||
|
|
||||||
### Roles
|
### Roles
|
||||||
|
|
||||||
@ -43,9 +44,9 @@ the check-in process. These roles are:
|
|||||||
|
|
||||||
Three basic types of branches may be included in the above repository:
|
Three basic types of branches may be included in the above repository:
|
||||||
|
|
||||||
1. Master branch.
|
1. Master branch
|
||||||
2. Topic branches.
|
2. Topic branches
|
||||||
3. Developer branches.
|
3. Developer branches
|
||||||
|
|
||||||
Branches which do not fit into the above categories may be created and used
|
Branches which do not fit into the above categories may be created and used
|
||||||
during the course of development for various reasons, such as large-scale
|
during the course of development for various reasons, such as large-scale
|
||||||
@ -103,116 +104,132 @@ the name chosen could not be mistaken for a topic or master branch.
|
|||||||
### Merging
|
### Merging
|
||||||
|
|
||||||
When development is complete on an issue, the first step toward merging it
|
When development is complete on an issue, the first step toward merging it
|
||||||
back into the master branch is to file a Pull Request. The contributions
|
back into the master branch is to file a Pull Request (PR). The contributions
|
||||||
should meet code, test, and commit message standards as described below,
|
should meet code, test, and commit message standards as described below,
|
||||||
and the pull request should include a completed author checklist, also
|
and the pull request should include a completed author checklist, also
|
||||||
as described below. Pull requests may be assigned to specific team
|
as described below. Pull requests may be assigned to specific team
|
||||||
members when appropriate (e.g. to draw to a specific person's attention.)
|
members when appropriate (e.g. to draw to a specific person's attention).
|
||||||
|
|
||||||
Code review should take place using discussion features within the pull
|
Code review should take place using discussion features within the pull
|
||||||
request. When the reviewer is satisfied, they should add a comment to
|
request. When the reviewer is satisfied, they should add a comment to
|
||||||
the pull request containing the reviewer checklist (from below) and complete
|
the pull request containing the reviewer checklist (from below) and complete
|
||||||
the merge back to the master branch.
|
the merge back to the master branch.
|
||||||
|
|
||||||
|
Additionally:
|
||||||
|
* Every pull request must link to the issue that it addresses. Eg. “Addresses #1234” or “Closes #1234”. This is the responsibility of the pull request’s __author__. If no issue exists, [create one](https://github.com/nasa/openmct/issues/new/choose).
|
||||||
|
* Every __author__ must include testing instructions. These instructions should identify the areas of code affected, and some minimal test steps. If addressing a bug, reproduction steps should be included, if they were not included in the original issue. If reproduction steps were included on the original issue, and are sufficient, refer to them.
|
||||||
|
* A pull request that closes an issue should say so in the description. Including the text “Closes #1234” will cause the linked issue to be automatically closed when the pull request is merged. This is the responsibility of the pull request’s __author__.
|
||||||
|
* When a pull request is merged, and the corresponding issue closed, the __reviewer__ must add the tag “unverified” to the original issue. This will indicate that although the issue is closed, it has not been tested yet.
|
||||||
|
* Every PR must have two reviewers assigned, though only one approval is necessary for merge.
|
||||||
|
* Changes to API require approval by a senior developer.
|
||||||
|
* When creating a PR, it is the author's responsibility to apply any priority label from the issue to the PR as well. This helps with prioritization.
|
||||||
|
|
||||||
## Standards
|
## Standards
|
||||||
|
|
||||||
Contributions to Open MCT Web are expected to meet the following standards.
|
Contributions to Open MCT are expected to meet the following standards.
|
||||||
In addition, reviewers should use general discretion before accepting
|
In addition, reviewers should use general discretion before accepting
|
||||||
changes.
|
changes.
|
||||||
|
|
||||||
### Code Standards
|
### Code Standards
|
||||||
|
|
||||||
JavaScript sources in Open MCT Web must satisfy JSLint under its default
|
JavaScript sources in Open MCT must satisfy the ESLint rules defined in
|
||||||
settings. This is verified by the command line build.
|
this repository. This is verified by the command line build.
|
||||||
|
|
||||||
#### Code Guidelines
|
#### Code Guidelines
|
||||||
|
|
||||||
JavaScript sources in Open MCT Web should:
|
The following guidelines are provided for anyone contributing source code to the Open MCT project:
|
||||||
|
|
||||||
* Use four spaces for indentation. Tabs should not be used.
|
1. Write clean code. Here’s a good summary - https://github.com/ryanmcdermott/clean-code-javascript.
|
||||||
* Include JSDoc for any exposed API (e.g. public methods, constructors.)
|
1. Include JSDoc for any exposed API (e.g. public methods, classes).
|
||||||
* Include non-JSDoc comments as-needed for explaining private variables,
|
1. Include non-JSDoc comments as-needed for explaining private variables,
|
||||||
methods, or algorithms when they are non-obvious.
|
methods, or algorithms when they are non-obvious. Otherwise code
|
||||||
* Define one public class per script, expressed as a constructor function
|
should be self-documenting.
|
||||||
returned from an AMD-style module.
|
1. Classes and Vue components should use camel case, first letter capitalized
|
||||||
* Follow “Java-like” naming conventions. These includes:
|
(e.g. SomeClassName).
|
||||||
* Classes should use camel case, first letter capitalized
|
1. Methods, variables, fields, events, and function names should use camelCase,
|
||||||
(e.g. SomeClassName.)
|
first letter lower-case (e.g. someVariableName).
|
||||||
* Methods, variables, fields, and function names should use camel case,
|
1. Source files that export functions should use camelCase, first letter lower-case (eg. testTools.js)
|
||||||
first letter lower-case (e.g. someVariableName.) Constants
|
1. Constants (variables or fields which are meant to be declared and
|
||||||
(variables or fields which are meant to be declared and initialized
|
initialized statically, and never changed) should use only capital
|
||||||
statically, and never changed) should use only capital letters, with
|
letters, with underscores between words (e.g. SOME_CONSTANT). They should always be declared as `const`s
|
||||||
underscores between words (e.g. SOME_CONSTANT.)
|
1. File names should be the name of the exported class, plus a .js extension
|
||||||
* File name should be the name of the exported class, plus a .js extension
|
(e.g. SomeClassName.js).
|
||||||
(e.g. SomeClassName.js)
|
1. Avoid anonymous functions, except when functions are short (one or two lines)
|
||||||
* Avoid anonymous functions, except when functions are short (a few lines)
|
and their inclusion makes sense within the flow of the code
|
||||||
and/or their inclusion makes sense within the flow of the code
|
(e.g. as arguments to a forEach call). Anonymous functions should always be arrow functions.
|
||||||
(e.g. as arguments to a forEach call.)
|
1. Named functions are preferred over functions assigned to variables.
|
||||||
* Avoid deep nesting (especially of functions), except where necessary
|
eg.
|
||||||
(e.g. due to closure scope.)
|
```JavaScript
|
||||||
* End with a single new-line character.
|
function renameObject(object, newName) {
|
||||||
* Expose public methods by declaring them on the class's prototype.
|
Object.name = newName;
|
||||||
* Within a given function's scope, do not mix declarations and imperative
|
}
|
||||||
code, and present these in the following order:
|
```
|
||||||
* First, variable declarations and initialization.
|
is preferable to
|
||||||
* Second, function declarations.
|
```JavaScript
|
||||||
* Third, imperative statements.
|
const rename = (object, newName) => {
|
||||||
* Finally, the returned value.
|
Object.name = newName;
|
||||||
|
}
|
||||||
Deviations from Open MCT Web code style guidelines require two-party agreement,
|
```
|
||||||
|
1. Avoid deep nesting (especially of functions), except where necessary
|
||||||
|
(e.g. due to closure scope).
|
||||||
|
1. End with a single new-line character.
|
||||||
|
1. Always use ES6 `Class`es and inheritence rather than the pre-ES6 prototypal
|
||||||
|
pattern.
|
||||||
|
1. Within a given function's scope, do not mix declarations and imperative
|
||||||
|
code, and present these in the following order:
|
||||||
|
* First, variable declarations and initialization.
|
||||||
|
* Secondly, imperative statements.
|
||||||
|
* Finally, the returned value. A single return statement at the end of the function should be used, except where an early return would improve code clarity.
|
||||||
|
1. Avoid the use of "magic" values.
|
||||||
|
eg.
|
||||||
|
```JavaScript
|
||||||
|
const UNAUTHORIZED = 401;
|
||||||
|
if (responseCode === UNAUTHORIZED)
|
||||||
|
```
|
||||||
|
is preferable to
|
||||||
|
```JavaScript
|
||||||
|
if (responseCode === 401)
|
||||||
|
```
|
||||||
|
1. Use the ternary operator only for simple cases such as variable assignment. Nested ternaries should be avoided in all cases.
|
||||||
|
1. Test specs should reside alongside the source code they test, not in a separate directory.
|
||||||
|
1. Organize code by feature, not by type.
|
||||||
|
eg.
|
||||||
|
```
|
||||||
|
- telemetryTable
|
||||||
|
- row
|
||||||
|
TableRow.js
|
||||||
|
TableRowCollection.js
|
||||||
|
TableRow.vue
|
||||||
|
- column
|
||||||
|
TableColumn.js
|
||||||
|
TableColumn.vue
|
||||||
|
plugin.js
|
||||||
|
pluginSpec.js
|
||||||
|
```
|
||||||
|
is preferable to
|
||||||
|
```
|
||||||
|
- telemetryTable
|
||||||
|
- components
|
||||||
|
TableRow.vue
|
||||||
|
TableColumn.vue
|
||||||
|
- collections
|
||||||
|
TableRowCollection.js
|
||||||
|
TableColumn.js
|
||||||
|
TableRow.js
|
||||||
|
plugin.js
|
||||||
|
pluginSpec.js
|
||||||
|
```
|
||||||
|
Deviations from Open MCT code style guidelines require two-party agreement,
|
||||||
typically from the author of the change and its reviewer.
|
typically from the author of the change and its reviewer.
|
||||||
|
|
||||||
#### Code Example
|
|
||||||
|
|
||||||
```js
|
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Bundles should declare themselves as namespaces in whichever source
|
|
||||||
* file is most like the "main point of entry" to the bundle.
|
|
||||||
* @namespace some/bundle
|
|
||||||
*/
|
|
||||||
define(
|
|
||||||
['./OtherClass'],
|
|
||||||
function (OtherClass) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A summary of how to use this class goes here.
|
|
||||||
*
|
|
||||||
* @constructor
|
|
||||||
* @memberof some/bundle
|
|
||||||
*/
|
|
||||||
function ExampleClass() {
|
|
||||||
}
|
|
||||||
|
|
||||||
// Methods which are not intended for external use should
|
|
||||||
// not have JSDoc (or should be marked @private)
|
|
||||||
ExampleClass.prototype.privateMethod = function () {
|
|
||||||
};
|
|
||||||
|
|
||||||
/**
|
|
||||||
* A summary of this method goes here.
|
|
||||||
* @param {number} n a parameter
|
|
||||||
* @returns {number} a return value
|
|
||||||
*/
|
|
||||||
ExampleClass.prototype.publicMethod = function (n) {
|
|
||||||
return n * 2;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ExampleClass;
|
|
||||||
}
|
|
||||||
);
|
|
||||||
```
|
|
||||||
|
|
||||||
### Test Standards
|
### Test Standards
|
||||||
|
|
||||||
Automated testing shall occur whenever changes are merged into the main
|
Automated testing shall occur whenever changes are merged into the main
|
||||||
development branch and must be confirmed alongside any pull request.
|
development branch and must be confirmed alongside any pull request.
|
||||||
|
|
||||||
Automated tests are typically unit tests which exercise individual software
|
Automated tests are tests which exercise plugins, API, and utility classes.
|
||||||
components. Tests are subject to code review along with the actual
|
Tests are subject to code review along with the actual implementation, to
|
||||||
implementation, to ensure that tests are applicable and useful.
|
ensure that tests are applicable and useful.
|
||||||
|
|
||||||
Examples of useful tests:
|
Examples of useful tests:
|
||||||
* Tests which replicate bugs (or their root causes) to verify their
|
* Tests which replicate bugs (or their root causes) to verify their
|
||||||
@ -222,8 +239,26 @@ Examples of useful tests:
|
|||||||
* Tests which verify expected interactions with other components in the
|
* Tests which verify expected interactions with other components in the
|
||||||
system.
|
system.
|
||||||
|
|
||||||
During automated testing, code coverage metrics will be reported. Line
|
#### Guidelines
|
||||||
coverage must remain at or above 80%.
|
* 100% statement coverage is achievable and desirable.
|
||||||
|
* Do blackbox testing. Test external behaviors, not internal details. Write tests that describe what your plugin is supposed to do. How it does this doesn't matter, so don't test it.
|
||||||
|
* Unit test specs for plugins should be defined at the plugin level. Start with one test spec per plugin named pluginSpec.js, and as this test spec grows too big, break it up into multiple test specs that logically group related tests.
|
||||||
|
* Unit tests for API or for utility functions and classes may be defined at a per-source file level.
|
||||||
|
* Wherever possible only use and mock public API, builtin functions, and UI in your test specs. Do not directly invoke any private functions. ie. only call or mock functions and objects exposed by openmct.* (eg. openmct.telemetry, openmct.objectView, etc.), and builtin browser functions (fetch, requestAnimationFrame, setTimeout, etc.).
|
||||||
|
* Where builtin functions have been mocked, be sure to clear them between tests.
|
||||||
|
* Test at an appropriate level of isolation. Eg.
|
||||||
|
* If you’re testing a view, you do not need to test the whole application UI, you can just fetch the view provider using the public API and render the view into an element that you have created.
|
||||||
|
* You do not need to test that the view switcher works, there should be separate tests for that.
|
||||||
|
* You do not need to test that telemetry providers work, you can mock openmct.telemetry.request() to feed test data to the view.
|
||||||
|
* Use your best judgement when deciding on appropriate scope.
|
||||||
|
* Automated tests for plugins should start by actually installing the plugin being tested, and then test that installing the plugin adds the desired features and behavior to Open MCT, observing the above rules.
|
||||||
|
* All variables used in a test spec, including any instances of the Open MCT API should be declared inside of an appropriate block scope (not at the root level of the source file), and should be initialized in the relevant beforeEach block. `beforeEach` is preferable to `beforeAll` to avoid leaking of state between tests.
|
||||||
|
* A `afterEach` or `afterAll` should be used to do any clean up necessary to prevent leakage of state between test specs. This can happen when functions on `window` are wrapped, or when the URL is changed. [A convenience function](https://github.com/nasa/openmct/blob/master/src/utils/testing.js#L59) is provided for resetting the URL and clearing builtin spies between tests.
|
||||||
|
* If writing unit tests for legacy Angular code be sure to follow [best practices in order to avoid memory leaks](https://www.thecodecampus.de/blog/avoid-memory-leaks-angularjs-unit-tests/).
|
||||||
|
|
||||||
|
#### Examples
|
||||||
|
* [Example of an automated test spec for an object view plugin](https://github.com/nasa/openmct/blob/master/src/plugins/telemetryTable/pluginSpec.js)
|
||||||
|
* [Example of an automated test spec for API](https://github.com/nasa/openmct/blob/master/src/api/time/TimeAPISpec.js)
|
||||||
|
|
||||||
### Commit Message Standards
|
### Commit Message Standards
|
||||||
|
|
||||||
@ -234,7 +269,7 @@ Commit messages should:
|
|||||||
 line of white space.
|
 line of white space.
|
||||||
* Contain a short (usually one word) reference to the feature or subsystem
|
* Contain a short (usually one word) reference to the feature or subsystem
|
||||||
the commit effects, in square brackets, at the start of the subject line
|
the commit effects, in square brackets, at the start of the subject line
|
||||||
(e.g. `[Documentation] Draft of check-in process`)
|
(e.g. `[Documentation] Draft of check-in process`).
|
||||||
* Contain a reference to a relevant issue number in the body of the commit.
|
* Contain a reference to a relevant issue number in the body of the commit.
|
||||||
* This is important for traceability; while branch names also provide this,
|
* This is important for traceability; while branch names also provide this,
|
||||||
you cannot tell from looking at a commit what branch it was authored on.
|
you cannot tell from looking at a commit what branch it was authored on.
|
||||||
@ -250,9 +285,9 @@ Commit messages should:
|
|||||||
Commit messages should not:
|
Commit messages should not:
|
||||||
|
|
||||||
* Exceed 54 characters in length on the subject line.
|
* Exceed 54 characters in length on the subject line.
|
||||||
* Exceed 72 characters in length in the body of the commit.
|
* Exceed 72 characters in length in the body of the commit,
|
||||||
* Except where necessary to maintain the structure of machine-readable or
|
* Except where necessary to maintain the structure of machine-readable or
|
||||||
machine-generated text (e.g. error messages)
|
machine-generated text (e.g. error messages).
|
||||||
|
|
||||||
See [Contributing to a Project](http://git-scm.com/book/ch5-2.html) from
|
See [Contributing to a Project](http://git-scm.com/book/ch5-2.html) from
|
||||||
Pro Git by Shawn Chacon and Ben Straub for a bit of the rationale behind
|
Pro Git by Shawn Chacon and Ben Straub for a bit of the rationale behind
|
||||||
@ -260,42 +295,37 @@ these standards.
|
|||||||
|
|
||||||
## Issue Reporting
|
## Issue Reporting
|
||||||
|
|
||||||
Issues are tracked at https://github.com/nasa/openmctweb/issues
|
Issues are tracked at https://github.com/nasa/openmct/issues.
|
||||||
|
|
||||||
Issues should include:
|
|
||||||
|
|
||||||
* A short description of the issue encountered.
|
|
||||||
* A longer-form description of the issue encountered. When possible, steps to
|
|
||||||
reproduce the issue.
|
|
||||||
* When possible, a description of the impact of the issue. What use case does
|
|
||||||
it impede?
|
|
||||||
* An assessment of the severity of the issue.
|
|
||||||
|
|
||||||
Issue severity is categorized as follows (in ascending order):
|
Issue severity is categorized as follows (in ascending order):
|
||||||
|
|
||||||
* _Trivial_: Minimal impact on the usefulness and functionality of the
|
* _Trivial_: Minimal impact on the usefulness and functionality of the software; a "nice-to-have." Visual impact without functional impact,
|
||||||
software; a "nice-to-have."
|
* _Medium_: Some impairment of use, but simple workarounds exist
|
||||||
* _(Unspecified)_: Major loss of functionality or impairment of use.
|
* _Critical_: Significant loss of functionality or impairment of use. Display of telemetry data is not affected though.
|
||||||
* _Critical_: Large-scale loss of functionality or impairment of use,
|
* _Blocker_: Major functionality is impaired or lost, threatening mission success. Display of telemetry data is impaired or blocked by the bug, which could lead to loss of situational awareness.
|
||||||
such that remaining utility becomes marginal.
|
|
||||||
* _Blocker_: Harmful or otherwise unacceptable behavior. Must fix.
|
|
||||||
|
|
||||||
## Check Lists
|
## Check Lists
|
||||||
|
|
||||||
The following check lists should be completed and attached to pull requests
|
The following check lists should be completed and attached to pull requests
|
||||||
when they are filed (author checklist) and when they are merged (reviewer
|
when they are filed (author checklist) and when they are merged (reviewer
|
||||||
checklist.)
|
checklist).
|
||||||
|
|
||||||
### Author Checklist
|
### Author Checklist
|
||||||
|
|
||||||
1. Changes address original issue?
|
[Within PR Template](.github/PULL_REQUEST_TEMPLATE.md)
|
||||||
2. Unit tests included and/or updated with changes?
|
|
||||||
3. Command line build passes?
|
|
||||||
4. Changes have been smoke-tested?
|
|
||||||
|
|
||||||
### Reviewer Checklist
|
### Reviewer Checklist
|
||||||
|
|
||||||
1. Changes appear to address issue?
|
* [ ] Changes appear to address issue?
|
||||||
2. Appropriate unit tests included?
|
* [ ] Changes appear not to be breaking changes?
|
||||||
3. Code style and in-line documentation are appropriate?
|
* [ ] Appropriate unit tests included?
|
||||||
4. Commit messages meet standards?
|
* [ ] Code style and in-line documentation are appropriate?
|
||||||
|
* [ ] Commit messages meet standards?
|
||||||
|
* [ ] Has associated issue been labelled `unverified`? (only applicable if this PR closes the issue)
|
||||||
|
* [ ] Has associated issue been labelled `bug`? (only applicable if this PR is for a bug fix)
|
||||||
|
* [ ] List of Acceptance Tests Performed.
|
||||||
|
|
||||||
|
Write out a small list of tests performed with just enough detail for another developer on the team
|
||||||
|
to execute.
|
||||||
|
|
||||||
|
i.e. ```When Clicking on Add button, new `object` appears in dropdown.```
|
7
LICENSE.md
Normal file
@ -0,0 +1,7 @@
|
|||||||
|
# Open MCT License
|
||||||
|
|
||||||
|
Open MCT, Copyright (c) 2014-2021, United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All rights reserved.
|
||||||
|
|
||||||
|
Open MCT is 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.
|
562
LICENSES.md
@ -1,562 +0,0 @@
|
|||||||
# Open MCT Web Licenses
|
|
||||||
|
|
||||||
Open MCT Web, Copyright (c) 2014-2015, United States Government as represented by the Administrator of the National Aeronautics and Space Administration. All rights reserved.
|
|
||||||
|
|
||||||
Open MCT Web is 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.
|
|
||||||
|
|
||||||
Open MCT Web includes source code licensed under additional open source licenses as follows.
|
|
||||||
|
|
||||||
## Software Components Licenses
|
|
||||||
|
|
||||||
This software includes components released under the following licenses:
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### SuperSocket
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: https://supersocket.codeplex.com/
|
|
||||||
|
|
||||||
* Version: 0.9.0.2
|
|
||||||
|
|
||||||
* Author: Kerry Jiang
|
|
||||||
|
|
||||||
* Description: Supports SuperWebSocket
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright 2012 Kerry Jiang (kerry-jiang@hotmail.com)
|
|
||||||
|
|
||||||
SuperSocket is 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.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### SuperWebSocket
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: https://superswebocket.codeplex.com/
|
|
||||||
|
|
||||||
* Version: 0.9.0.2
|
|
||||||
|
|
||||||
* Author: Kerry Jiang
|
|
||||||
|
|
||||||
* Description: WebSocket implementation for client-server communication
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright 2010-2013 Kerry Jiang (kerry-jiang@hotmail.com)
|
|
||||||
|
|
||||||
SuperWebSocket is 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.
|
|
||||||
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### log4net
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://logging.apache.org/log4net/
|
|
||||||
|
|
||||||
* Version: 1.2.13
|
|
||||||
|
|
||||||
* Author: Apache Software Foundation
|
|
||||||
|
|
||||||
* Description: Logging.
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright © 2004-2015 Apache Software Foundation.
|
|
||||||
|
|
||||||
log4net is 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.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Blanket.js
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://blanketjs.org/
|
|
||||||
|
|
||||||
* Version: 1.1.5
|
|
||||||
|
|
||||||
* Author: Alex Seville
|
|
||||||
|
|
||||||
* Description: Code coverage measurement and reporting
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2013 Alex Seville
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Jasmine
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://jasmine.github.io/
|
|
||||||
|
|
||||||
* Version: 1.3.1
|
|
||||||
|
|
||||||
* Author: Pivotal Labs
|
|
||||||
|
|
||||||
* Description: Unit testing
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2008-2011 Pivotal Labs
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### RequireJS
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://requirejs.org/
|
|
||||||
|
|
||||||
* Version: 2.1.22
|
|
||||||
|
|
||||||
* Author: The Dojo Foundation
|
|
||||||
|
|
||||||
* Description: Script loader
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2010-2015, The Dojo Foundation
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### requirejs-text
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: https://github.com/requirejs/text
|
|
||||||
|
|
||||||
* Version: 2.0.14
|
|
||||||
|
|
||||||
* Author: The Dojo Foundation
|
|
||||||
|
|
||||||
* Description: Text loading plugin for RequireJS
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2010-2014, The Dojo Foundation
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in
|
|
||||||
all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
|
||||||
THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### AngularJS
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://angularjs.org/
|
|
||||||
|
|
||||||
* Version: 1.4.4
|
|
||||||
|
|
||||||
* Author: Google
|
|
||||||
|
|
||||||
* Description: Client-side web application framework
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Angular-Route
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://angularjs.org/
|
|
||||||
|
|
||||||
* Version: 1.4.4
|
|
||||||
|
|
||||||
* Author: Google
|
|
||||||
|
|
||||||
* Description: Client-side view routing
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2010-2015 Google, Inc. http://angularjs.org
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### ES6-Promise
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: https://github.com/jakearchibald/es6-promise
|
|
||||||
|
|
||||||
* Version: 3.0.2
|
|
||||||
|
|
||||||
* Authors: Yehuda Katz, Tom Dale, Stefan Penner and contributors
|
|
||||||
|
|
||||||
* Description: Promise polyfill for pre-ECMAScript 6 browsers
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2014 Yehuda Katz, Tom Dale, Stefan Penner and contributors
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### screenfull.js
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: https://github.com/sindresorhus/screenfull.js/
|
|
||||||
|
|
||||||
* Version: 3.0.0
|
|
||||||
|
|
||||||
* Author: Sindre Sorhus
|
|
||||||
|
|
||||||
* Description: Wrapper for cross-browser usage of fullscreen API
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Math.uuid.js
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: https://github.com/broofa/node-uuid
|
|
||||||
|
|
||||||
* Version: 1.4.7
|
|
||||||
|
|
||||||
* Author: Robert Kieffer
|
|
||||||
|
|
||||||
* Description: Unique identifer generation.
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2010-2012 Robert Kieffer
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Normalize.css
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: https://github.com/necolas/normalize.css
|
|
||||||
|
|
||||||
* Version: 1.1.2
|
|
||||||
|
|
||||||
* Authors: Nicolas Gallagher, Jonathan Neal
|
|
||||||
|
|
||||||
* Description: Browser style normalization
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) Nicolas Gallagher and Jonathan Neal
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Moment.js
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://momentjs.com
|
|
||||||
|
|
||||||
* Version: 2.11.1
|
|
||||||
|
|
||||||
* Authors: Tim Wood, Iskren Chernev, Moment.js contributors
|
|
||||||
|
|
||||||
* Description: Time/date parsing/formatting
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2011-2014 Tim Wood, Iskren Chernev, Moment.js contributors
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### moment-duration-format
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: https://github.com/jsmreese/moment-duration-format
|
|
||||||
|
|
||||||
* Version: 1.3.0
|
|
||||||
|
|
||||||
* Authors: John Madhavan-Reese
|
|
||||||
|
|
||||||
* Description: Duration parsing/formatting
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright 2014 John Madhavan-Reese
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of
|
|
||||||
this software and associated documentation files (the "Software"), to deal in
|
|
||||||
the Software without restriction, including without limitation the rights to
|
|
||||||
use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of
|
|
||||||
the Software, and to permit persons to whom the Software is furnished to do so,
|
|
||||||
subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS
|
|
||||||
FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR
|
|
||||||
COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER
|
|
||||||
IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN
|
|
||||||
CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### CSV.js
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: https://github.com/knrz/CSV.js
|
|
||||||
|
|
||||||
* Version: 3.6.4
|
|
||||||
|
|
||||||
* Authors: Kash Nouroozi
|
|
||||||
|
|
||||||
* Description: Encoder for CSV (comma separated values) export
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2014 Kash Nouroozi
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
||||||
of this software and associated documentation files (the "Software"), to deal
|
|
||||||
in the Software without restriction, including without limitation the rights
|
|
||||||
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
||||||
copies of the Software, and to permit persons to whom the Software is
|
|
||||||
furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all
|
|
||||||
copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
||||||
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
||||||
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
||||||
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
||||||
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
||||||
SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### FileSaver.js
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: https://github.com/eligrey/FileSaver.js/
|
|
||||||
|
|
||||||
* Version: 0.0.2
|
|
||||||
|
|
||||||
* Authors: Eli Grey
|
|
||||||
|
|
||||||
* Description: File download initiator (for file exports)
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright © 2015 Eli Grey.
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Zepto
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://zeptojs.com/
|
|
||||||
|
|
||||||
* Version: 1.1.6
|
|
||||||
|
|
||||||
* Authors: Thomas Fuchs
|
|
||||||
|
|
||||||
* Description: DOM manipulation
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2010-2016 Thomas Fuchs
|
|
||||||
http://zeptojs.com/
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining
|
|
||||||
a copy of this software and associated documentation files (the
|
|
||||||
"Software"), to deal in the Software without restriction, including
|
|
||||||
without limitation the rights to use, copy, modify, merge, publish,
|
|
||||||
distribute, sublicense, and/or sell copies of the Software, and to
|
|
||||||
permit persons to whom the Software is furnished to do so, subject to
|
|
||||||
the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be
|
|
||||||
included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
|
|
||||||
EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
|
|
||||||
MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
|
|
||||||
NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
|
|
||||||
LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
|
|
||||||
OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
|
|
||||||
WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Json.NET
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://www.newtonsoft.com/json
|
|
||||||
|
|
||||||
* Version: 6.0.8
|
|
||||||
|
|
||||||
* Author: Newtonsoft
|
|
||||||
|
|
||||||
* Description: JSON serialization/deserialization
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright (c) 2007 James Newton-King
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Nancy
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://nancyfx.org
|
|
||||||
|
|
||||||
* Version: 0.23.2
|
|
||||||
|
|
||||||
* Author: Andreas Håkansson, Steven Robbins and contributors
|
|
||||||
|
|
||||||
* Description: Embedded web server
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright © 2010 Andreas Håkansson, Steven Robbins and contributors
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
||||||
---
|
|
||||||
|
|
||||||
### Nancy.Hosting.Self
|
|
||||||
|
|
||||||
#### Info
|
|
||||||
|
|
||||||
* Link: http://nancyfx.org
|
|
||||||
|
|
||||||
* Version: 0.23.2
|
|
||||||
|
|
||||||
* Author: Andreas Håkansson, Steven Robbins and contributors
|
|
||||||
|
|
||||||
* Description: Embedded web server
|
|
||||||
|
|
||||||
#### License
|
|
||||||
|
|
||||||
Copyright © 2010 Andreas Håkansson, Steven Robbins and contributors
|
|
||||||
|
|
||||||
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
|
||||||
|
|
||||||
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
|
||||||
|
|
||||||
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
|
||||||
|
|
154
README.md
@ -1,28 +1,73 @@
|
|||||||
# Open MCT Web
|
# Open MCT [](http://www.apache.org/licenses/LICENSE-2.0) [](https://lgtm.com/projects/g/nasa/openmct/context:javascript) [](https://codecov.io/gh/nasa/openmct) [](https://percy.io/b2e34b17/openmct) [](https://www.npmjs.com/package/openmct)
|
||||||
|
|
||||||
Open MCT Web is a web-based platform for mission operations user interface
|
Open MCT (Open Mission Control Technologies) is a next-generation mission control framework for visualization of data on desktop and mobile devices. It is developed at NASA's Ames Research Center, and is being used by NASA for data analysis of spacecraft missions, as well as planning and operation of experimental rover systems. As a generalizable and open source framework, Open MCT could be used as the basis for building applications for planning, operation, and analysis of any systems producing telemetry data.
|
||||||
software.
|
|
||||||
|
|
||||||
## Bundles
|
Please visit our [Official Site](https://nasa.github.io/openmct/) and [Getting Started Guide](https://nasa.github.io/openmct/getting-started/)
|
||||||
|
|
||||||
A bundle is a group of software components (including source code, declared
|
Once you've created something amazing with Open MCT, showcase your work in our GitHub Discussions [Show and Tell](https://github.com/nasa/openmct/discussions/categories/show-and-tell) section. We love seeing unique and wonderful implementations of Open MCT!
|
||||||
as AMD modules, as well as resources such as images and HTML templates)
|
|
||||||
that are intended to be added or removed as a single unit. A plug-in for
|
|
||||||
Open MCT Web will be expressed as a bundle; platform components are also
|
|
||||||
expressed as bundles.
|
|
||||||
|
|
||||||
A bundle is also just a directory which contains a file `bundle.json`,
|
## See Open MCT in Action
|
||||||
which declares its contents.
|
|
||||||
|
|
||||||
The file `bundles.json` (note the plural), at the top level of the
|
Try Open MCT now with our [live demo](https://openmct-demo.herokuapp.com/).
|
||||||
repository, is a JSON file containing an array of all bundles (expressed as
|

|
||||||
directory names) to include in a running instance of Open MCT Web. Adding or
|
|
||||||
removing paths from this list will add or remove bundles from the running
|
## Building and Running Open MCT Locally
|
||||||
application.
|
|
||||||
|
Building and running Open MCT in your local dev environment is very easy. Be sure you have [Git](https://git-scm.com/downloads) and [Node.js](https://nodejs.org/) installed, then follow the directions below. Need additional information? Check out the [Getting Started](https://nasa.github.io/openmct/getting-started/) page on our website.
|
||||||
|
(These instructions assume you are installing as a non-root user; developers have [reported issues](https://github.com/nasa/openmct/issues/1151) running these steps with root privileges.)
|
||||||
|
|
||||||
|
1. Clone the source code
|
||||||
|
|
||||||
|
`git clone https://github.com/nasa/openmct.git`
|
||||||
|
|
||||||
|
2. Install development dependencies
|
||||||
|
|
||||||
|
`npm install`
|
||||||
|
|
||||||
|
3. Run a local development server
|
||||||
|
|
||||||
|
`npm start`
|
||||||
|
|
||||||
|
Open MCT is now running, and can be accessed by pointing a web browser at [http://localhost:8080/](http://localhost:8080/)
|
||||||
|
|
||||||
|
## Open MCT v1.0.0
|
||||||
|
This represents a major overhaul of Open MCT with significant changes under the hood. We aim to maintain backward compatibility but if you do find compatibility issues, please let us know by filing an issue in this repository. If you are having major issues with v1.0.0 please check-out the v0.14.0 tag until we can resolve them for you.
|
||||||
|
|
||||||
|
If you are migrating an application built with Open MCT as a dependency to v1.0.0 from an earlier version, please refer to [our migration guide](https://nasa.github.io/openmct/documentation/migration-guide).
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Documentation is available on the [Open MCT website](https://nasa.github.io/openmct/documentation/).
|
||||||
|
|
||||||
|
### Examples
|
||||||
|
|
||||||
|
The clearest examples for developing Open MCT plugins are in the
|
||||||
|
[tutorials](https://github.com/nasa/openmct-tutorial) provided in
|
||||||
|
our documentation.
|
||||||
|
|
||||||
|
We want Open MCT to be as easy to use, install, run, and develop for as
|
||||||
|
possible, and your feedback will help us get there! Feedback can be provided via [GitHub issues](https://github.com/nasa/openmct/issues/new/choose), [Starting a GitHub Discussion](https://github.com/nasa/openmct/discussions), or by emailing us at [arc-dl-openmct@mail.nasa.gov](mailto:arc-dl-openmct@mail.nasa.gov).
|
||||||
|
|
||||||
|
## Building Applications With Open MCT
|
||||||
|
|
||||||
|
Open MCT is built using [`npm`](http://npmjs.com/) and [`webpack`](https://webpack.js.org/).
|
||||||
|
|
||||||
|
See our documentation for a guide on [building Applications with Open MCT](https://github.com/nasa/openmct/blob/master/API.md#starting-an-open-mct-application).
|
||||||
|
|
||||||
|
## Plugins
|
||||||
|
|
||||||
|
Open MCT can be extended via plugins that make calls to the Open MCT API. A plugin is a group
|
||||||
|
of software components (including source code and resources such as images and HTML templates)
|
||||||
|
that is intended to be added or removed as a single unit.
|
||||||
|
|
||||||
|
As well as providing an extension mechanism, most of the core Open MCT codebase is also
|
||||||
|
written as plugins.
|
||||||
|
|
||||||
|
For information on writing plugins, please see [our API documentation](https://github.com/nasa/openmct/blob/master/API.md#plugins).
|
||||||
|
|
||||||
## Tests
|
## Tests
|
||||||
|
|
||||||
Tests are written for [Jasmine 1.3](http://jasmine.github.io/1.3/introduction.html)
|
Tests are written for [Jasmine 3](https://jasmine.github.io/api/3.1/global)
|
||||||
and run by [Karma](http://karma-runner.github.io). To run:
|
and run by [Karma](http://karma-runner.github.io). To run:
|
||||||
|
|
||||||
`npm test`
|
`npm test`
|
||||||
@ -38,68 +83,20 @@ naming convention is otherwise the same.)
|
|||||||
### Test Reporting
|
### Test Reporting
|
||||||
|
|
||||||
When `npm test` is run, test results will be written as HTML to
|
When `npm test` is run, test results will be written as HTML to
|
||||||
`target/tests`. Code coverage information is written to `target/coverage`.
|
`dist/reports/tests/`. Code coverage information is written to `dist/reports/coverage`.
|
||||||
|
|
||||||
|
Code Coverage Reports are available from [codecov.io](https://app.codecov.io/gh/nasa/openmct/)
|
||||||
### Functional Testing
|
|
||||||
|
|
||||||
The tests described above are all at the unit-level; an additional
|
|
||||||
test suite using [Protractor](https://angular.github.io/protractor/)
|
|
||||||
is under development, in the `protractor` folder.
|
|
||||||
|
|
||||||
To run:
|
|
||||||
|
|
||||||
* Install protractor following the instructions above.
|
|
||||||
* `cd protractor`
|
|
||||||
* `npm install`
|
|
||||||
* `npm run all`
|
|
||||||
|
|
||||||
## Build
|
|
||||||
|
|
||||||
Open MCT Web is built using [`npm`](http://npmjs.com/)
|
|
||||||
and [`gulp`](http://gulpjs.com/).
|
|
||||||
|
|
||||||
To build:
|
|
||||||
|
|
||||||
`npm run prepublish`
|
|
||||||
|
|
||||||
This will compile and minify JavaScript sources, as well as copy over assets.
|
|
||||||
The contents of the `dist` folder will contain a runnable Open MCT Web
|
|
||||||
instance (e.g. by starting an HTTP server in that directory), including:
|
|
||||||
|
|
||||||
* A `main.js` file containing Open MCT Web source code.
|
|
||||||
* Various assets in the `example` and `platform` directories.
|
|
||||||
* An `index.html` that runs Open MCT Web in its default configuration.
|
|
||||||
|
|
||||||
Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js).
|
|
||||||
|
|
||||||
### Building Documentation
|
|
||||||
|
|
||||||
Open MCT Web's documentation is generated by an
|
|
||||||
[npm](https://www.npmjs.com/)-based build. It has additional dependencies that
|
|
||||||
may not be available on every platform and thus is not covered in the standard
|
|
||||||
npm install. Ensure your system has [libcairo](http://cairographics.org/)
|
|
||||||
installed and then run the following commands:
|
|
||||||
|
|
||||||
* `npm install`
|
|
||||||
* `npm install canvas nomnoml`
|
|
||||||
* `npm run docs`
|
|
||||||
|
|
||||||
Documentation will be generated in `target/docs`.
|
|
||||||
|
|
||||||
# Glossary
|
# Glossary
|
||||||
|
|
||||||
Certain terms are used throughout Open MCT Web with consistent meanings
|
Certain terms are used throughout Open MCT with consistent meanings
|
||||||
or conventions. Any deviations from the below are issues and should be
|
or conventions. Any deviations from the below are issues and should be
|
||||||
addressed (either by updating this glossary or changing code to reflect
|
addressed (either by updating this glossary or changing code to reflect
|
||||||
correct usage.) Other developer documentation, particularly in-line
|
correct usage.) Other developer documentation, particularly in-line
|
||||||
documentation, may presume an understanding of these terms.
|
documentation, may presume an understanding of these terms.
|
||||||
|
|
||||||
* _bundle_: A bundle is a removable, reusable grouping of software elements.
|
* _plugin_: A plugin is a removable, reusable grouping of software elements.
|
||||||
The application is composed of bundles. Plug-ins are bundles. For more
|
The application is composed of plugins.
|
||||||
information, refer to framework documentation (under `platform/framework`.)
|
|
||||||
* _capability_: An object which exposes dynamic behavior or non-persistent
|
|
||||||
state associated with a domain object.
|
|
||||||
* _composition_: In the context of a domain object, this refers to the set of
|
* _composition_: In the context of a domain object, this refers to the set of
|
||||||
other domain objects that compose or are contained by that object. A domain
|
other domain objects that compose or are contained by that object. A domain
|
||||||
object's composition is the set of domain objects that should appear
|
object's composition is the set of domain objects that should appear
|
||||||
@ -112,15 +109,10 @@ documentation, may presume an understanding of these terms.
|
|||||||
(Most often used in the context of extensions, domain
|
(Most often used in the context of extensions, domain
|
||||||
object models, or other similar application-specific objects.)
|
object models, or other similar application-specific objects.)
|
||||||
* _domain object_: A meaningful object to the user; a distinct thing in
|
* _domain object_: A meaningful object to the user; a distinct thing in
|
||||||
the work support by Open MCT Web. Anything that appears in the left-hand
|
the work support by Open MCT. Anything that appears in the left-hand
|
||||||
tree is a domain object.
|
tree is a domain object.
|
||||||
* _extension_: An extension is a unit of functionality exposed to the
|
* _identifier_: A tuple consisting of a namespace and a key, which together uniquely
|
||||||
platform in a declarative fashion by a bundle. For more
|
identifies a domain object.
|
||||||
information, refer to framework documentation (under `platform/framework`.)
|
|
||||||
* _id_: A string which uniquely identifies a domain object.
|
|
||||||
* _key_: When used as an object property, this refers to the machine-readable
|
|
||||||
identifier for a specific thing in a set of things. (Most often used in the
|
|
||||||
context of extensions or other similar application-specific object sets.)
|
|
||||||
* _model_: The persistent state associated with a domain object. A domain
|
* _model_: The persistent state associated with a domain object. A domain
|
||||||
object's model is a JavaScript object which can be converted to JSON
|
object's model is a JavaScript object which can be converted to JSON
|
||||||
without losing information (that is, it contains no methods.)
|
without losing information (that is, it contains no methods.)
|
||||||
@ -132,7 +124,5 @@ documentation, may presume an understanding of these terms.
|
|||||||
a user clicks on a domain object in the tree, they are _navigating_ to
|
a user clicks on a domain object in the tree, they are _navigating_ to
|
||||||
it, and it is thereafter considered the _navigated_ object (until the
|
it, and it is thereafter considered the _navigated_ object (until the
|
||||||
user makes another such choice.)
|
user makes another such choice.)
|
||||||
* _space_: A name used to identify a persistence store. Interactions with
|
* _namespace_: A name used to identify a persistence store. A running open MCT
|
||||||
persistence with generally involve a `space` parameter in some form, to
|
application could potentially use multiple persistence stores, with the
|
||||||
distinguish multiple persistence stores from one another (for cases
|
|
||||||
where there are multiple valid persistence locations available.)
|
|
||||||
|
31
SECURITY.md
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
The Open MCT team secures our code base using a combination of code review, dependency review, and periodic security reviews. Static analysis performed during automated verification additionally safeguards against common coding errors which may result in vulnerabilities.
|
||||||
|
|
||||||
|
### Reporting a Vulnerability
|
||||||
|
|
||||||
|
For general defects, please for a [Bug Report](https://github.com/nasa/openmct/issues/new/choose)
|
||||||
|
|
||||||
|
To report a vulnerability for Open MCT please send a detailed report to [arc-dl-openmct](mailto:arc-dl-openmct@mail.nasa.gov).
|
||||||
|
|
||||||
|
See our [top-level security policy](https://github.com/nasa/openmct/security/policy) for additional information.
|
||||||
|
|
||||||
|
### CodeQL and LGTM
|
||||||
|
|
||||||
|
The [CodeQL GitHub Actions workflow](https://github.com/nasa/openmct/blob/master/.github/workflows/codeql-analysis.yml) is available to the public. To review the results, fork the repository and run the CodeQL workflow.
|
||||||
|
|
||||||
|
CodeQL is run for every pull-request in GitHub Actions.
|
||||||
|
|
||||||
|
The project is also monitored by [LGTM](https://lgtm.com/projects/g/nasa/openmct/) and is available to public.
|
||||||
|
|
||||||
|
### ESLint
|
||||||
|
|
||||||
|
Static analysis is run for every push on the master branch and every pull request on all branches in Github Actions.
|
||||||
|
|
||||||
|
For more information about ESLint, visit https://eslint.org/.
|
||||||
|
|
||||||
|
### General Support
|
||||||
|
|
||||||
|
For additional support, please open a [Github Discussion](https://github.com/nasa/openmct/discussions).
|
||||||
|
|
||||||
|
If you wish to report a cybersecurity incident or concern, please contact the NASA Security Operations Center either by phone at 1-877-627-2732 or via email address soc@nasa.gov.
|
@ -1,20 +0,0 @@
|
|||||||
# API
|
|
||||||
|
|
||||||
This directory is for draft API documentation and design. The API is organized into a few major components, which are documented in their own READMEs. See the following:
|
|
||||||
|
|
||||||
* Domain Objects
|
|
||||||
Capabilities
|
|
||||||
Events
|
|
||||||
Mutation
|
|
||||||
Etc
|
|
||||||
|
|
||||||
* [Object API](object-api/README.md) (encapsulates persistence), should include roots
|
|
||||||
* [Region API](region-api/README.md)
|
|
||||||
* [Telemetry API](telemetry-api/README.md)
|
|
||||||
* [Type API](type-api/README.md)
|
|
||||||
|
|
||||||
Not yet started:
|
|
||||||
|
|
||||||
* [Action API](action-api/README.md)
|
|
||||||
* [Indicators API](indicators-api/README.md) -- potentially compress into regions?
|
|
||||||
* [Plugin API](plugin-api/README.md)
|
|
@ -1,93 +0,0 @@
|
|||||||
define([
|
|
||||||
|
|
||||||
], function (
|
|
||||||
|
|
||||||
) {
|
|
||||||
|
|
||||||
|
|
||||||
var PROVIDER_REGISTRY = [];
|
|
||||||
|
|
||||||
function getProvider (object) {
|
|
||||||
return PROVIDER_REGISTRY.filter(function (p) {
|
|
||||||
return p.appliesTo(object);
|
|
||||||
})[0];
|
|
||||||
};
|
|
||||||
|
|
||||||
function composition(object) {
|
|
||||||
var provider = getProvider(object);
|
|
||||||
|
|
||||||
if (!provider) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
|
|
||||||
return new CompositionCollection(object, provider);
|
|
||||||
};
|
|
||||||
|
|
||||||
composition.addProvider = function (provider) {
|
|
||||||
PROVIDER_REGISTRY.unshift(provider);
|
|
||||||
};
|
|
||||||
|
|
||||||
window.MCT = window.MCT || {};
|
|
||||||
window.MCT.composition = composition;
|
|
||||||
|
|
||||||
function CompositionCollection(domainObject, provider) {
|
|
||||||
this.domainObject = domainObject;
|
|
||||||
this.provider = provider;
|
|
||||||
};
|
|
||||||
|
|
||||||
CompositionCollection.prototype.add = function (child, skipMutate) {
|
|
||||||
if (!this._children) {
|
|
||||||
throw new Error("Must load composition before you can add!");
|
|
||||||
}
|
|
||||||
// we probably should not add until we have loaded.
|
|
||||||
// todo: should we modify parent?
|
|
||||||
if (!skipMutate) {
|
|
||||||
this.provider.add(this.domainObject, child);
|
|
||||||
}
|
|
||||||
this.children.push(child);
|
|
||||||
this.emit('add', child);
|
|
||||||
};
|
|
||||||
|
|
||||||
CompositionCollection.prototype.load = function () {
|
|
||||||
return this.provider.load(this.domainObject)
|
|
||||||
.then(function (children) {
|
|
||||||
this._children = [];
|
|
||||||
children.map(function (c) {
|
|
||||||
this.add(c, true);
|
|
||||||
}, this);
|
|
||||||
this.emit('load');
|
|
||||||
// Todo: set up listener for changes via provider?
|
|
||||||
}.bind(this));
|
|
||||||
};
|
|
||||||
|
|
||||||
CompositionCollection.prototype.remove = function (child) {
|
|
||||||
var index = this.children.indexOf(child);
|
|
||||||
if (index === -1) {
|
|
||||||
throw new Error("Unable to remove child: not found in composition");
|
|
||||||
}
|
|
||||||
this.provider.remove(this.domainObject, child);
|
|
||||||
this.children.splice(index, 1);
|
|
||||||
this.emit('remove', index, child);
|
|
||||||
};
|
|
||||||
|
|
||||||
var DefaultCompositionProvider = {
|
|
||||||
appliesTo: function (domainObject) {
|
|
||||||
return !!domainObject.composition;
|
|
||||||
},
|
|
||||||
load: function (domainObject) {
|
|
||||||
return Promise.all(domainObject.composition.map(MCT.objects.get));
|
|
||||||
},
|
|
||||||
add: function (domainObject, child) {
|
|
||||||
domainObject.composition.push(child.key);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
composition.addProvider(DefaultCompositionProvider);
|
|
||||||
|
|
||||||
function Injector() {
|
|
||||||
console.log('composition api injected!');
|
|
||||||
}
|
|
||||||
|
|
||||||
return Injector;
|
|
||||||
|
|
||||||
});
|
|
@ -1,35 +0,0 @@
|
|||||||
# Composition API - Overview
|
|
||||||
|
|
||||||
The composition API is straightforward:
|
|
||||||
|
|
||||||
MCT.composition(object) -- returns a `CompositionCollection` if the object has
|
|
||||||
composition, returns undefined if it doesn't.
|
|
||||||
|
|
||||||
## CompositionCollection
|
|
||||||
|
|
||||||
Has three events:
|
|
||||||
* `load`: when the collection has completed loading.
|
|
||||||
* `add`: when a new object has been added to the collection.
|
|
||||||
* `remove` when an object has been removed from the collection.
|
|
||||||
|
|
||||||
Has three methods:
|
|
||||||
|
|
||||||
`Collection.load()` -- returns a promise that is fulfilled when the composition
|
|
||||||
has loaded.
|
|
||||||
`Collection.add(object)` -- add a domain object to the composition.
|
|
||||||
`Collection.remove(object)` -- remove the object from the composition.
|
|
||||||
|
|
||||||
## Composition providers
|
|
||||||
composition providers are anything that meets the following interface:
|
|
||||||
|
|
||||||
* `provider.appliesTo(domainObject)` -> return true if this provider can provide
|
|
||||||
composition for a given domain object.
|
|
||||||
* `provider.add(domainObject, childObject)` -> adds object
|
|
||||||
* `provider.remove(domainObject, childObject)` -> immediately removes objects
|
|
||||||
* `provider.load(domainObject)` -> returns promise for array of children
|
|
||||||
|
|
||||||
There is a default composition provider which handles loading composition for
|
|
||||||
any object with a `composition` property. If you want specialized composition
|
|
||||||
loading behavior, implement your own composition provider and register it with
|
|
||||||
|
|
||||||
`MCT.composition.addProvider(myProvider)`
|
|
@ -1,200 +0,0 @@
|
|||||||
define([
|
|
||||||
'lodash'
|
|
||||||
], function (
|
|
||||||
_
|
|
||||||
) {
|
|
||||||
|
|
||||||
/**
|
|
||||||
Object API. Intercepts the existing object API while also exposing
|
|
||||||
A new Object API.
|
|
||||||
|
|
||||||
MCT.objects.get('mine')
|
|
||||||
.then(function (root) {
|
|
||||||
console.log(root);
|
|
||||||
MCT.objects.getComposition(root)
|
|
||||||
.then(function (composition) {
|
|
||||||
console.log(composition)
|
|
||||||
})
|
|
||||||
});
|
|
||||||
*/
|
|
||||||
|
|
||||||
var Objects = {},
|
|
||||||
ROOT_REGISTRY = [],
|
|
||||||
PROVIDER_REGISTRY = {},
|
|
||||||
FALLBACK_PROVIDER;
|
|
||||||
|
|
||||||
window.MCT = window.MCT || {};
|
|
||||||
window.MCT.objects = Objects;
|
|
||||||
|
|
||||||
// take a key string and turn it into a key object
|
|
||||||
// 'scratch:root' ==> {namespace: 'scratch', identifier: 'root'}
|
|
||||||
function parseKeyString(key) {
|
|
||||||
if (typeof key === 'object') {
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
var namespace = '',
|
|
||||||
identifier = key;
|
|
||||||
for (var i = 0, escaped = false, len=key.length; i < len; i++) {
|
|
||||||
if (key[i] === ":" && !escaped) {
|
|
||||||
namespace = key.slice(0, i);
|
|
||||||
identifier = key.slice(i + 1);
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return {
|
|
||||||
namespace: namespace,
|
|
||||||
identifier: identifier
|
|
||||||
};
|
|
||||||
};
|
|
||||||
|
|
||||||
// take a key and turn it into a key string
|
|
||||||
// {namespace: 'scratch', identifier: 'root'} ==> 'scratch:root'
|
|
||||||
function makeKeyString(key) {
|
|
||||||
if (typeof key === 'string') {
|
|
||||||
return key;
|
|
||||||
}
|
|
||||||
if (!key.namespace) {
|
|
||||||
return key.identifier;
|
|
||||||
}
|
|
||||||
return [
|
|
||||||
key.namespace.replace(':', '\\:'),
|
|
||||||
key.identifier.replace(':', '\\:')
|
|
||||||
].join(':');
|
|
||||||
};
|
|
||||||
|
|
||||||
// Converts composition to use key strings instead of keys
|
|
||||||
function toOldFormat(model) {
|
|
||||||
delete model.key;
|
|
||||||
if (model.composition) {
|
|
||||||
model.composition = model.composition.map(makeKeyString);
|
|
||||||
}
|
|
||||||
return model;
|
|
||||||
};
|
|
||||||
|
|
||||||
// converts composition to use keys instead of key strings
|
|
||||||
function toNewFormat(model, key) {
|
|
||||||
model.key = key;
|
|
||||||
if (model.composition) {
|
|
||||||
model.composition = model.composition.map(parseKeyString);
|
|
||||||
}
|
|
||||||
return model;
|
|
||||||
};
|
|
||||||
|
|
||||||
// Root provider is hardcoded in; can't be skipped.
|
|
||||||
var RootProvider = {
|
|
||||||
'get': function () {
|
|
||||||
return Promise.resolve({
|
|
||||||
name: 'The root object',
|
|
||||||
type: 'root',
|
|
||||||
composition: ROOT_REGISTRY
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
// Retrieve the provider for a given key.
|
|
||||||
function getProvider(key) {
|
|
||||||
if (key.identifier === 'ROOT') {
|
|
||||||
return RootProvider;
|
|
||||||
}
|
|
||||||
return PROVIDER_REGISTRY[key.namespace] || FALLBACK_PROVIDER;
|
|
||||||
};
|
|
||||||
|
|
||||||
Objects.addProvider = function (namespace, provider) {
|
|
||||||
PROVIDER_REGISTRY[namespace] = provider;
|
|
||||||
};
|
|
||||||
|
|
||||||
[
|
|
||||||
'save',
|
|
||||||
'delete',
|
|
||||||
'get'
|
|
||||||
].forEach(function (method) {
|
|
||||||
Objects[method] = function () {
|
|
||||||
var key = arguments[0],
|
|
||||||
provider = getProvider(key);
|
|
||||||
|
|
||||||
if (!provider) {
|
|
||||||
throw new Error('No Provider Matched');
|
|
||||||
}
|
|
||||||
|
|
||||||
if (!provider[method]) {
|
|
||||||
throw new Error('Provider does not support [' + method + '].');
|
|
||||||
}
|
|
||||||
|
|
||||||
return provider[method].apply(provider, arguments);
|
|
||||||
};
|
|
||||||
});
|
|
||||||
|
|
||||||
Objects.addRoot = function (key) {
|
|
||||||
ROOT_REGISTRY.unshift(key);
|
|
||||||
};
|
|
||||||
|
|
||||||
Objects.removeRoot = function (key) {
|
|
||||||
ROOT_REGISTRY = ROOT_REGISTRY.filter(function (k) {
|
|
||||||
return (
|
|
||||||
k.identifier !== key.identifier ||
|
|
||||||
k.namespace !== key.namespace
|
|
||||||
);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
function ObjectServiceProvider(objectService, instantiate) {
|
|
||||||
this.objectService = objectService;
|
|
||||||
this.instantiate = instantiate;
|
|
||||||
}
|
|
||||||
|
|
||||||
ObjectServiceProvider.prototype.save = function (object) {
|
|
||||||
var key = object.key,
|
|
||||||
keyString = makeKeyString(key),
|
|
||||||
newObject = this.instantiate(toOldFormat(object), keyString);
|
|
||||||
|
|
||||||
return object.getCapability('persistence')
|
|
||||||
.persist()
|
|
||||||
.then(function () {
|
|
||||||
return toNewFormat(object, key);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
ObjectServiceProvider.prototype.delete = function (object) {
|
|
||||||
// TODO!
|
|
||||||
};
|
|
||||||
|
|
||||||
ObjectServiceProvider.prototype.get = function (key) {
|
|
||||||
var keyString = makeKeyString(key);
|
|
||||||
return this.objectService.getObjects([keyString])
|
|
||||||
.then(function (results) {
|
|
||||||
var model = JSON.parse(JSON.stringify(results[keyString].getModel()));
|
|
||||||
return toNewFormat(model, key);
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
// Injects new object API as a decorator so that it hijacks all requests.
|
|
||||||
// Object providers implemented on new API should just work, old API should just work, many things may break.
|
|
||||||
function ObjectAPIInjector(ROOTS, instantiate, objectService) {
|
|
||||||
this.getObjects = function (keys) {
|
|
||||||
var results = {},
|
|
||||||
promises = keys.map(function (keyString) {
|
|
||||||
var key = parseKeyString(keyString);
|
|
||||||
return Objects.get(key)
|
|
||||||
.then(function (object) {
|
|
||||||
object = toOldFormat(object)
|
|
||||||
results[keyString] = instantiate(object, keyString);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
return Promise.all(promises)
|
|
||||||
.then(function () {
|
|
||||||
return results;
|
|
||||||
});
|
|
||||||
};
|
|
||||||
|
|
||||||
FALLBACK_PROVIDER = new ObjectServiceProvider(objectService, instantiate);
|
|
||||||
|
|
||||||
ROOTS.forEach(function (r) {
|
|
||||||
ROOT_REGISTRY.push(parseKeyString(r.id));
|
|
||||||
});
|
|
||||||
|
|
||||||
return this;
|
|
||||||
}
|
|
||||||
|
|
||||||
return ObjectAPIInjector;
|
|
||||||
});
|
|
@ -1,101 +0,0 @@
|
|||||||
# Object API - Overview
|
|
||||||
|
|
||||||
The object API provides methods for fetching domain objects.
|
|
||||||
|
|
||||||
# Keys
|
|
||||||
Keys are a composite identifier that is used to create and persist objects. Ex:
|
|
||||||
```javascript
|
|
||||||
{
|
|
||||||
namespace: 'elastic',
|
|
||||||
identifier: 'myIdentifier'
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
In old MCT days, we called this an "id", and we encoded it in a single string.
|
|
||||||
The above key would encode into the identifier, `elastic:myIdentifier`.
|
|
||||||
|
|
||||||
When interacting with the API you will be dealing with key objects.
|
|
||||||
|
|
||||||
# Configuring the Object API
|
|
||||||
|
|
||||||
The following methods should be used before calling run. They allow you to
|
|
||||||
configure the persistence space of MCT.
|
|
||||||
|
|
||||||
* `MCT.objects.addRoot(key)` -- add a "ROOT" to Open MCT by specifying it's
|
|
||||||
key.
|
|
||||||
* `MCT.objects.removeRoot(key)` -- Remove a "ROOT" from Open MCT by key.
|
|
||||||
* `MCT.objects.addProvider(namespace, provider)` -- register an object provider
|
|
||||||
for a specific namespace. See below for documentation on the provider
|
|
||||||
interface.
|
|
||||||
|
|
||||||
# Using the object API
|
|
||||||
|
|
||||||
The object API provides methods for getting, saving, and deleting objects.
|
|
||||||
|
|
||||||
* MCT.objects.get(key) -> returns promise for an object
|
|
||||||
* MCT.objects.save(object) -> returns promise that is resolved when object
|
|
||||||
has been saved
|
|
||||||
* MCT.objects.delete(object) -> returns promise that is resolved when object has
|
|
||||||
been deleted
|
|
||||||
|
|
||||||
## Configuration Example: Adding a groot
|
|
||||||
|
|
||||||
The following example adds a new root object for groot and populates it with
|
|
||||||
some pieces of groot.
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
|
|
||||||
var ROOT_KEY = {
|
|
||||||
namespace: 'groot',
|
|
||||||
identifier: 'groot'
|
|
||||||
};
|
|
||||||
|
|
||||||
var GROOT_ROOT = {
|
|
||||||
name: 'I am groot',
|
|
||||||
type: 'folder',
|
|
||||||
composition: [
|
|
||||||
{
|
|
||||||
namespace: 'groot',
|
|
||||||
identifier: 'arms'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
namespace: 'groot',
|
|
||||||
identifier: 'legs'
|
|
||||||
},
|
|
||||||
{
|
|
||||||
namespace: 'groot',
|
|
||||||
identifier: 'torso'
|
|
||||||
}
|
|
||||||
]
|
|
||||||
};
|
|
||||||
|
|
||||||
var GrootProvider = {
|
|
||||||
get: function (key) {
|
|
||||||
if (key.identifier === 'groot') {
|
|
||||||
return Promise.resolve(GROOT_ROOT);
|
|
||||||
}
|
|
||||||
return Promise.resolve({
|
|
||||||
name: 'Groot\'s ' + key.identifier
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
MCT.objects.addRoot(ROOT_KEY);
|
|
||||||
|
|
||||||
MCT.objects.addProvider('groot', GrootProvider);
|
|
||||||
|
|
||||||
MCT.run();
|
|
||||||
```
|
|
||||||
|
|
||||||
### Making a custom provider:
|
|
||||||
|
|
||||||
All methods on the provider interface are optional, so you do not need
|
|
||||||
to modify them.
|
|
||||||
|
|
||||||
* `provider.get(key)` -> promise for a domain object.
|
|
||||||
* `provider.save(domainObject)` -> returns promise that is fulfilled when object
|
|
||||||
has been saved.
|
|
||||||
* `provider.delete(domainObject)` -> returns promise that is fulfilled when
|
|
||||||
object has been deleted.
|
|
||||||
|
|
||||||
|
|
@ -1,64 +0,0 @@
|
|||||||
# Region API - Overview
|
|
||||||
|
|
||||||
The region API provides a method for specifying which views should display in a given region for a given domain object. As such, they also define the basic view interface that components must define.
|
|
||||||
|
|
||||||
### MCT.region.Region
|
|
||||||
|
|
||||||
The base region type, all regions implement this interface.
|
|
||||||
|
|
||||||
`register(view)`
|
|
||||||
|
|
||||||
`getViews(domainObject)`
|
|
||||||
|
|
||||||
Additionally, Regions may have subregions for different modes of the application. Specifying a view for a region
|
|
||||||
|
|
||||||
### MCT.region.View
|
|
||||||
|
|
||||||
The basic type for views. You can extend this to implement your own functionality, or you can create your own object so long as it meets the interface.
|
|
||||||
|
|
||||||
`attribute` | `type` | `note`
|
|
||||||
--- | --- | ---
|
|
||||||
`label` | `string` or `Function` | The name of the view. Used in the view selector when more than one view exists for an object.
|
|
||||||
`glyph` | `string` or `Function` | The glyph to associate with this view. Used in the view selector when more than one view exists for an object.
|
|
||||||
`instantiate` | `Function` | constructor for a view. Will be invoked with two arguments, `container` and `domainObject`. It should return an object with a `destroy` method that is called when the view is removed.
|
|
||||||
`appliesTo` | `Function` | Determines if a view applies to a specific domain object. Will be invoked with a domainObject. Should return a number, `priority` if the view applies to a given object. If multiple views return a truthy value for a given object, they will be ordered by priority, and the largest priority value will be the default view for the object. Return `false` if a view should not apply to an object.
|
|
||||||
|
|
||||||
Basic Hello World:
|
|
||||||
|
|
||||||
```javascript
|
|
||||||
|
|
||||||
function HelloWorldView(container, domainObject) {
|
|
||||||
container.innerHTML = 'Hello World!';
|
|
||||||
}
|
|
||||||
|
|
||||||
HelloWorldView.label = 'Hello World';
|
|
||||||
HelloWorldView.glyph = 'whatever';
|
|
||||||
|
|
||||||
HelloWorldView.appliesTo = function (domainObject) {
|
|
||||||
return 10;
|
|
||||||
};
|
|
||||||
|
|
||||||
HelloWorldView.prototype.destroy = function () {
|
|
||||||
// clean up outstanding handlers;
|
|
||||||
};
|
|
||||||
|
|
||||||
MCT.regions.Main.register(HelloWorldView);
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
## Region Hierarchy
|
|
||||||
|
|
||||||
Regions are organized in a hierarchy, with the most specific region taking precedence over less specific regions.
|
|
||||||
|
|
||||||
If you specify a view for the Main Region, it will be used for both Edit and View modes. You can override the Main Region view for a specific mode by registering the view with that specific mode.
|
|
||||||
|
|
||||||
### MCT.regions.Tree
|
|
||||||
### MCT.regions.Main
|
|
||||||
### MCT.regions.Main.View
|
|
||||||
### MCT.regions.Main.Edit
|
|
||||||
### MCT.regions.Inspector
|
|
||||||
### MCT.regions.Inspector.View
|
|
||||||
### MCT.regions.Inspector.Edit
|
|
||||||
### MCT.regions.Toolbar
|
|
||||||
### MCT.regions.Toolbar.View
|
|
||||||
### MCT.regions.Toolbar.Edit
|
|
@ -1,11 +0,0 @@
|
|||||||
define([
|
|
||||||
|
|
||||||
], function () {
|
|
||||||
|
|
||||||
function RegionAPI() {
|
|
||||||
window.MCT = window.MCT || {};
|
|
||||||
window.MCT.regions = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
return RegionAPI;
|
|
||||||
})
|
|
@ -1,71 +0,0 @@
|
|||||||
# Telemetry API - Overview
|
|
||||||
|
|
||||||
The Telemetry API provides basic methods for retrieving historical and realtime telemetry data, retrieving telemetry metadata, and registering additional telemetry providers.
|
|
||||||
|
|
||||||
The Telemetry API also provides a set of helpers built upon these basics-- TelemetryFormatters help you format telemetry values for display purposes, LimitEvaluators help you display evaluate and display alarm states, while TelemetryCollections provide a method for seamlessly combining historical and realtime data, while supporting more advanced client side filtering and interactivity.
|
|
||||||
|
|
||||||
|
|
||||||
## Getting Telemetry Data
|
|
||||||
|
|
||||||
|
|
||||||
### `MCT.telemetry.request(domainObject, options)`
|
|
||||||
|
|
||||||
Request historical telemetry for a domain object. Options allows you to specify filters (start, end, etc.), sort order, and strategies for retrieving telemetry (aggregation, latest available, etc.).
|
|
||||||
|
|
||||||
Returns a `Promise` for an array of telemetry values.
|
|
||||||
|
|
||||||
### `MCT.telemetry.subscribe(domainObject, callback, options)`
|
|
||||||
|
|
||||||
Subscribe to realtime telemetry for a specific domain object. callback will be called whenever data is received from a realtime provider. Options allows you to specify ???
|
|
||||||
|
|
||||||
## Understanding Telemetry
|
|
||||||
|
|
||||||
### `MCT.telemetry.getMetadata(domainObject)`
|
|
||||||
|
|
||||||
Retrieve telemetry metadata for a domain object. Telemetry metadata helps you understand the sort of telemetry data a domain object can provide-- for instances, the possible enumerations or states, the units, and more.
|
|
||||||
|
|
||||||
### `MCT.telemetry.Formatter`
|
|
||||||
|
|
||||||
Telemetry formatters help you format telemetry values for display. Under the covers, they use telemetry metadata to interpret your telemetry data, and then they use the format API to format that data for display.
|
|
||||||
|
|
||||||
|
|
||||||
### `MCT.telemetry.LimitEvaluator`
|
|
||||||
|
|
||||||
Limit Evaluators help you evaluate limit and alarm status of individual telemetry datums for display purposes without having to interact directly with the Limit API.
|
|
||||||
|
|
||||||
## Adding new telemetry sources
|
|
||||||
|
|
||||||
### `MCT.telemetry.registerProvider(telemetryProvider)`
|
|
||||||
|
|
||||||
Register a telemetry provider with the telemetry service. This allows you to connect alternative telemetry sources to For more information, see the `MCT.telemetry.BaseProvider`
|
|
||||||
|
|
||||||
### `MCT.telemetry.BaseProvider`
|
|
||||||
|
|
||||||
The base provider is a great starting point for developers who would like to implement their own telemetry provider. At the same time, you can implement your own telemetry provider as long as it meets the TelemetryProvider (see other docs).
|
|
||||||
|
|
||||||
## Other tools
|
|
||||||
|
|
||||||
### `MCT.telemetry.TelemetryCollection`
|
|
||||||
|
|
||||||
The TelemetryCollection is a useful tool for building advanced displays. It helps you seamlessly handle both historical and realtime telemetry data, while making it easier to deal with large data sets and interactive displays that need to frequently requery data.
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
# API Reference (TODO)
|
|
||||||
|
|
||||||
* Telemetry Metadata
|
|
||||||
* Request Options
|
|
||||||
-- start
|
|
||||||
-- end
|
|
||||||
-- sort
|
|
||||||
-- ???
|
|
||||||
-- strategies -- specify which strategies you want. an array provides for fallback strategies without needing decoration. Design fallbacks into API.
|
|
||||||
|
|
||||||
### `MCT.telemetry.request(domainObject, options)`
|
|
||||||
### `MCT.telemetry.subscribe(domainObject, callback, options)`
|
|
||||||
### `MCT.telemetry.getMetadata(domainObject)`
|
|
||||||
### `MCT.telemetry.Formatter`
|
|
||||||
### `MCT.telemetry.LimitEvaluator`
|
|
||||||
### `MCT.telemetry.registerProvider(telemetryProvider)`
|
|
||||||
### `MCT.telemetry.BaseProvider`
|
|
||||||
### `MCT.telemetry.TelemetryCollection`
|
|
@ -1,239 +0,0 @@
|
|||||||
/*global define,window,console,MCT*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
|
|
||||||
var key = '114ced6c-deb7-4169-ae71-68c571665514';
|
|
||||||
MCT.objects.getObject([key])
|
|
||||||
.then(function (results) {
|
|
||||||
console.log('got results');
|
|
||||||
return results[key];
|
|
||||||
})
|
|
||||||
.then(function (domainObject) {
|
|
||||||
console.log('got object');
|
|
||||||
MCT.telemetry.subscribe(domainObject, function (datum) {
|
|
||||||
console.log('gotData!', datum);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
*/
|
|
||||||
|
|
||||||
define([
|
|
||||||
'lodash',
|
|
||||||
'eventemitter2'
|
|
||||||
], function (
|
|
||||||
_,
|
|
||||||
EventEmitter
|
|
||||||
) {
|
|
||||||
|
|
||||||
// format map is a placeholder until we figure out format service.
|
|
||||||
var FORMAT_MAP = {
|
|
||||||
generic: function (range) {
|
|
||||||
return function (datum) {
|
|
||||||
return datum[range.key];
|
|
||||||
};
|
|
||||||
},
|
|
||||||
enum: function (range) {
|
|
||||||
var enumMap = _.indexBy(range.enumerations, 'value');
|
|
||||||
return function (datum) {
|
|
||||||
try {
|
|
||||||
return enumMap[datum[range.valueKey]].text;
|
|
||||||
} catch (e) {
|
|
||||||
return datum[range.valueKey];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
FORMAT_MAP.number =
|
|
||||||
FORMAT_MAP.float =
|
|
||||||
FORMAT_MAP.integer =
|
|
||||||
FORMAT_MAP.ascii =
|
|
||||||
FORMAT_MAP.generic;
|
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
function TelemetryAPI(
|
|
||||||
formatService
|
|
||||||
) {
|
|
||||||
|
|
||||||
var FORMATTER_CACHE = new WeakMap(),
|
|
||||||
EVALUATOR_CACHE = new WeakMap();
|
|
||||||
|
|
||||||
function testAPI() {
|
|
||||||
var key = '114ced6c-deb7-4169-ae71-68c571665514';
|
|
||||||
window.MCT.objects.getObjects([key])
|
|
||||||
.then(function (results) {
|
|
||||||
console.log('got results');
|
|
||||||
return results[key];
|
|
||||||
})
|
|
||||||
.then(function (domainObject) {
|
|
||||||
var formatter = new MCT.telemetry.Formatter(domainObject);
|
|
||||||
console.log('got object');
|
|
||||||
window.MCT.telemetry.subscribe(domainObject, function (datum) {
|
|
||||||
var formattedValues = {};
|
|
||||||
Object.keys(datum).forEach(function (key) {
|
|
||||||
formattedValues[key] = formatter.format(datum, key);
|
|
||||||
});
|
|
||||||
console.log(
|
|
||||||
'datum:',
|
|
||||||
datum,
|
|
||||||
'formatted:',
|
|
||||||
formattedValues
|
|
||||||
);
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function getFormatter(range) {
|
|
||||||
if (FORMAT_MAP[range.type]) {
|
|
||||||
return FORMAT_MAP[range.type](range);
|
|
||||||
}
|
|
||||||
try {
|
|
||||||
var format = formatService.getFormat(range.type).format.bind(
|
|
||||||
formatService.getFormat(range.type)
|
|
||||||
),
|
|
||||||
formatter = function (datum) {
|
|
||||||
return format(datum[range.key]);
|
|
||||||
};
|
|
||||||
return formatter;
|
|
||||||
} catch (e) {
|
|
||||||
console.log('could not retrieve format', range, e, e.message);
|
|
||||||
return FORMAT_MAP.generic(range);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function TelemetryFormatter(domainObject) {
|
|
||||||
this.metadata = domainObject.getCapability('telemetry').getMetadata();
|
|
||||||
this.formats = {};
|
|
||||||
var ranges = this.metadata.ranges.concat(this.metadata.domains);
|
|
||||||
|
|
||||||
ranges.forEach(function (range) {
|
|
||||||
this.formats[range.key] = getFormatter(range);
|
|
||||||
}, this);
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Retrieve the 'key' from the datum and format it accordingly to
|
|
||||||
* telemetry metadata in domain object.
|
|
||||||
*/
|
|
||||||
TelemetryFormatter.prototype.format = function (datum, key) {
|
|
||||||
return this.formats[key](datum);
|
|
||||||
};
|
|
||||||
|
|
||||||
function LimitEvaluator(domainObject) {
|
|
||||||
this.domainObject = domainObject;
|
|
||||||
this.evaluator = domainObject.getCapability('limit');
|
|
||||||
if (!this.evaluator) {
|
|
||||||
this.evalute = function () {
|
|
||||||
return '';
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
/** TODO: Do we need a telemetry parser, or do we assume telemetry
|
|
||||||
is numeric by default? */
|
|
||||||
|
|
||||||
LimitEvaluator.prototype.evaluate = function (datum, key) {
|
|
||||||
return this.evaluator.evaluate(datum, key);
|
|
||||||
};
|
|
||||||
|
|
||||||
/** Basic telemetry collection, needs more magic. **/
|
|
||||||
function TelemetryCollection(domainObject) {
|
|
||||||
this.domainObject = domainObject;
|
|
||||||
this.data = [];
|
|
||||||
}
|
|
||||||
|
|
||||||
_.extend(TelemetryCollection.prototype, EventEmitter.prototype);
|
|
||||||
|
|
||||||
TelemetryCollection.prototype.request = function (options) {
|
|
||||||
request(this.domainObject, options).then(function (data) {
|
|
||||||
data.forEach(function (datum) {
|
|
||||||
this.addDatum(datum);
|
|
||||||
}, this);
|
|
||||||
}.bind(this));
|
|
||||||
};
|
|
||||||
|
|
||||||
TelemetryCollection.prototype.addDatum = function (datum) {
|
|
||||||
this.data.push(datum);
|
|
||||||
this.emit('add', datum);
|
|
||||||
};
|
|
||||||
|
|
||||||
TelemetryCollection.prototype.subscribe = function (options) {
|
|
||||||
if (this.unsubscribe) {
|
|
||||||
this.unsubscribe();
|
|
||||||
delete this.unsubscribe;
|
|
||||||
}
|
|
||||||
|
|
||||||
this.unsubscribe = subscribe(
|
|
||||||
this.domainObject,
|
|
||||||
function (telemetrySeries) {
|
|
||||||
telemetrySeries.getData().forEach(this.addDatum, this);
|
|
||||||
}.bind(this),
|
|
||||||
options
|
|
||||||
);
|
|
||||||
};
|
|
||||||
|
|
||||||
function registerProvider(provider) {
|
|
||||||
// Not yet implemented.
|
|
||||||
console.log('registering provider', provider);
|
|
||||||
}
|
|
||||||
|
|
||||||
function registerEvaluator(evaluator) {
|
|
||||||
// not yet implemented.
|
|
||||||
console.log('registering evaluator', evaluator);
|
|
||||||
}
|
|
||||||
|
|
||||||
function request(domainObject, options) {
|
|
||||||
return domainObject.getCapability('telemetry')
|
|
||||||
.requestData(options)
|
|
||||||
.then(function (telemetrySeries) {
|
|
||||||
return telemetrySeries.getData();
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function subscribe(domainObject, callback, options) {
|
|
||||||
return domainObject.getCapability('telemetry')
|
|
||||||
.subscribe(function (series) {
|
|
||||||
series.getData().forEach(callback);
|
|
||||||
}, options);
|
|
||||||
}
|
|
||||||
|
|
||||||
var Telemetry = {
|
|
||||||
registerProvider: registerProvider,
|
|
||||||
registerEvaluator: registerEvaluator,
|
|
||||||
request: request,
|
|
||||||
subscribe: subscribe,
|
|
||||||
getMetadata: function (domainObject) {
|
|
||||||
return domainObject.getCapability('telemetry').getMetadata();
|
|
||||||
},
|
|
||||||
Formatter: function (domainObject) {
|
|
||||||
if (!FORMATTER_CACHE.has(domainObject)) {
|
|
||||||
FORMATTER_CACHE.set(
|
|
||||||
domainObject,
|
|
||||||
new TelemetryFormatter(domainObject)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return FORMATTER_CACHE.get(domainObject);
|
|
||||||
},
|
|
||||||
LimitEvaluator: function (domainObject) {
|
|
||||||
if (!EVALUATOR_CACHE.has(domainObject)) {
|
|
||||||
EVALUATOR_CACHE.set(
|
|
||||||
domainObject,
|
|
||||||
new LimitEvaluator(domainObject)
|
|
||||||
);
|
|
||||||
}
|
|
||||||
return EVALUATOR_CACHE.get(domainObject);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
window.MCT = window.MCT || {};
|
|
||||||
window.MCT.telemetry = Telemetry;
|
|
||||||
window.testAPI = testAPI;
|
|
||||||
|
|
||||||
return Telemetry;
|
|
||||||
}
|
|
||||||
|
|
||||||
return TelemetryAPI;
|
|
||||||
});
|
|
@ -1,46 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT Web is 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.
|
|
||||||
*
|
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define([
|
|
||||||
'./TelemetryAPI',
|
|
||||||
'legacyRegistry'
|
|
||||||
], function (
|
|
||||||
TelemetryAPI,
|
|
||||||
legacyRegistry
|
|
||||||
) {
|
|
||||||
legacyRegistry.register('api/telemetry-api', {
|
|
||||||
name: 'Telemetry API',
|
|
||||||
description: 'The public Telemetry API',
|
|
||||||
extensions: {
|
|
||||||
runs: [
|
|
||||||
{
|
|
||||||
key: "TelemetryAPI",
|
|
||||||
implementation: TelemetryAPI,
|
|
||||||
depends: [
|
|
||||||
'formatService'
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,31 +0,0 @@
|
|||||||
# Type API - Overview
|
|
||||||
|
|
||||||
The Type API allows you to register type information for domain objects, and allows you to retrieve type information about a given domain object. Crucially, type information allows you to add new creatible object types.
|
|
||||||
|
|
||||||
### MCT.types.Type
|
|
||||||
|
|
||||||
The basic interface for a type. You can extend this to implement your own type,
|
|
||||||
or you can provide an object that implements the same interface.
|
|
||||||
|
|
||||||
`attribute` | `type` | `note`
|
|
||||||
--- | --- | ---
|
|
||||||
`label` | `String` | The human readible name of the type.
|
|
||||||
`key` | `String` | The unique identifier for this type.
|
|
||||||
`glyph` | `String` | The glyph identifier for the type. Displayed in trees, labels, and other locations.
|
|
||||||
`description` | `String` | A basic description of the type visible in the create menu.
|
|
||||||
`isCreatible` | `Boolean`, `Number`, or `Function` | If truthy, this type will be visible in the create menu. Note that objects not in the create menu can be instantiated via other means.
|
|
||||||
`namespace` | `String` | The object namespace that provides instances of this type. This allows you to implement custom object providers for specific types while still utilizing other namespaces for persistence.
|
|
||||||
`properties` | `Object` | Object defining properties of an instance of this class. Properties are used for automatic form generation and automated metadata display. For more information on the definition of this object, look at (some resource-- jsonschema?)
|
|
||||||
`canContain` | `Function` | determins whether objects of this type can contain other objects. Will be invoked with a domain object. Return true to allow composition, return false to disallow composition.
|
|
||||||
|
|
||||||
### MCT.types.register(type)
|
|
||||||
|
|
||||||
Register a type with the type API. Registering a type with the same key as another type will replace the original type definition.
|
|
||||||
|
|
||||||
### MCT.types.getType(typeKey)
|
|
||||||
|
|
||||||
Returns the type definition for a given typeKey. returns undefined if type does not exist.
|
|
||||||
|
|
||||||
### MCT.types.getType(domainObject)
|
|
||||||
|
|
||||||
Return the type definition for a given domain object.
|
|
@ -1,10 +0,0 @@
|
|||||||
define([
|
|
||||||
|
|
||||||
], function () {
|
|
||||||
function TypeAPI() {
|
|
||||||
window.MCT = window.MCT || {};
|
|
||||||
window.MCT.types = {};
|
|
||||||
}
|
|
||||||
|
|
||||||
return TypeAPI;
|
|
||||||
});
|
|
122
app.js
@ -7,72 +7,78 @@
|
|||||||
* node app.js [options]
|
* node app.js [options]
|
||||||
*/
|
*/
|
||||||
|
|
||||||
(function () {
|
const options = require('minimist')(process.argv.slice(2));
|
||||||
"use strict";
|
const express = require('express');
|
||||||
|
const app = express();
|
||||||
|
const fs = require('fs');
|
||||||
|
const request = require('request');
|
||||||
|
|
||||||
var BUNDLE_FILE = 'bundles.json',
|
// Defaults
|
||||||
options = require('minimist')(process.argv.slice(2)),
|
options.port = options.port || options.p || 8080;
|
||||||
express = require('express'),
|
options.host = options.host || 'localhost';
|
||||||
app = express(),
|
options.directory = options.directory || options.D || '.';
|
||||||
fs = require('fs'),
|
|
||||||
request = require('request');
|
|
||||||
|
|
||||||
// Defaults
|
// Show command line options
|
||||||
options.port = options.port || options.p || 8080;
|
if (options.help || options.h) {
|
||||||
['include', 'exclude', 'i', 'x'].forEach(function (opt) {
|
console.log("\nUsage: node app.js [options]\n");
|
||||||
options[opt] = options[opt] || [];
|
console.log("Options:");
|
||||||
// Make sure includes/excludes always end up as arrays
|
console.log(" --help, -h Show this message.");
|
||||||
options[opt] = Array.isArray(options[opt]) ?
|
console.log(" --port, -p <number> Specify port.");
|
||||||
options[opt] : [options[opt]];
|
console.log(" --directory, -D <bundle> Serve files from specified directory.");
|
||||||
});
|
console.log("");
|
||||||
options.include = options.include.concat(options.i);
|
process.exit(0);
|
||||||
options.exclude = options.exclude.concat(options.x);
|
}
|
||||||
|
|
||||||
// Show command line options
|
app.disable('x-powered-by');
|
||||||
if (options.help || options.h) {
|
|
||||||
console.log("\nUsage: node app.js [options]\n");
|
app.use('/proxyUrl', function proxyRequest(req, res, next) {
|
||||||
console.log("Options:");
|
console.log('Proxying request to: ', req.query.url);
|
||||||
console.log(" --help, -h Show this message.");
|
req.pipe(request({
|
||||||
console.log(" --port, -p <number> Specify port.");
|
url: req.query.url,
|
||||||
console.log(" --include, -i <bundle> Include the specified bundle.");
|
strictSSL: false
|
||||||
console.log(" --exclude, -x <bundle> Exclude the specified bundle.");
|
}).on('error', next)).pipe(res);
|
||||||
console.log("");
|
});
|
||||||
process.exit(0);
|
|
||||||
|
class WatchRunPlugin {
|
||||||
|
apply(compiler) {
|
||||||
|
compiler.hooks.emit.tapAsync('WatchRunPlugin', (compilation, callback) => {
|
||||||
|
console.log('Begin compile at ' + new Date());
|
||||||
|
callback();
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
}
|
||||||
|
|
||||||
// Override bundles.json for HTTP requests
|
const webpack = require('webpack');
|
||||||
app.use('/' + BUNDLE_FILE, function (req, res) {
|
const webpackConfig = require('./webpack.dev.js');
|
||||||
var bundles;
|
webpackConfig.plugins.push(new webpack.HotModuleReplacementPlugin());
|
||||||
|
webpackConfig.plugins.push(new WatchRunPlugin());
|
||||||
|
|
||||||
try {
|
webpackConfig.entry.openmct = [
|
||||||
bundles = JSON.parse(fs.readFileSync(BUNDLE_FILE, 'utf8'));
|
'webpack-hot-middleware/client?reload=true',
|
||||||
} catch (e) {
|
webpackConfig.entry.openmct
|
||||||
bundles = [];
|
];
|
||||||
}
|
|
||||||
|
|
||||||
// Handle command line inclusions/exclusions
|
const compiler = webpack(webpackConfig);
|
||||||
bundles = bundles.concat(options.include);
|
|
||||||
bundles = bundles.filter(function (bundle) {
|
|
||||||
return options.exclude.indexOf(bundle) === -1;
|
|
||||||
});
|
|
||||||
bundles = bundles.filter(function (bundle, index) { // Uniquify
|
|
||||||
return bundles.indexOf(bundle) === index;
|
|
||||||
});
|
|
||||||
|
|
||||||
res.send(JSON.stringify(bundles));
|
app.use(require('webpack-dev-middleware')(
|
||||||
});
|
compiler,
|
||||||
|
{
|
||||||
|
publicPath: '/dist',
|
||||||
|
logLevel: 'warn'
|
||||||
|
}
|
||||||
|
));
|
||||||
|
|
||||||
app.use('/proxyUrl', function proxyRequest(req, res, next) {
|
app.use(require('webpack-hot-middleware')(
|
||||||
console.log('Proxying request to: ', req.query.url);
|
compiler,
|
||||||
req.pipe(request({
|
{}
|
||||||
url: req.query.url,
|
));
|
||||||
strictSSL: false
|
|
||||||
}).on('error', next)).pipe(res);
|
|
||||||
});
|
|
||||||
|
|
||||||
// Expose everything else as static files
|
// Expose index.html for development users.
|
||||||
app.use(express['static']('.'));
|
app.get('/', function (req, res) {
|
||||||
|
fs.createReadStream('index.html').pipe(res);
|
||||||
|
});
|
||||||
|
|
||||||
// Finally, open the HTTP server
|
// Finally, open the HTTP server and log the instance to the console
|
||||||
app.listen(options.port);
|
app.listen(options.port, options.host, function() {
|
||||||
}());
|
console.log('Open MCT application running at %s:%s', options.host, options.port);
|
||||||
|
});
|
||||||
|
25
bower.json
@ -1,25 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "openmctweb",
|
|
||||||
"description": "The OpenMCTWeb core platform",
|
|
||||||
"main": "",
|
|
||||||
"license": "Apache-2.0",
|
|
||||||
"moduleType": [],
|
|
||||||
"homepage": "http://nasa.github.io/openmctweb/",
|
|
||||||
"private": true,
|
|
||||||
"dependencies": {
|
|
||||||
"angular": "1.4.4",
|
|
||||||
"angular-route": "1.4.4",
|
|
||||||
"moment": "^2.11.1",
|
|
||||||
"moment-duration-format": "^1.3.0",
|
|
||||||
"requirejs": "~2.1.22",
|
|
||||||
"text": "requirejs-text#^2.0.14",
|
|
||||||
"es6-promise": "^3.0.2",
|
|
||||||
"screenfull": "^3.0.0",
|
|
||||||
"node-uuid": "^1.4.7",
|
|
||||||
"comma-separated-values": "^3.6.4",
|
|
||||||
"FileSaver.js": "^0.0.2",
|
|
||||||
"zepto": "^1.1.6",
|
|
||||||
"eventemitter2": "^1.0.0",
|
|
||||||
"lodash": "3.10.1"
|
|
||||||
}
|
|
||||||
}
|
|
@ -1,11 +1,11 @@
|
|||||||
#!/bin/bash
|
#!/bin/bash
|
||||||
|
|
||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
#* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
#* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
#* as represented by the Administrator of the National Aeronautics and Space
|
#* as represented by the Administrator of the National Aeronautics and Space
|
||||||
#* Administration. All rights reserved.
|
#* Administration. All rights reserved.
|
||||||
#*
|
#*
|
||||||
#* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
#* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
#* "License"); you may not use this file except in compliance with the License.
|
#* "License"); you may not use this file except in compliance with the License.
|
||||||
#* You may obtain a copy of the License at
|
#* You may obtain a copy of the License at
|
||||||
#* http://www.apache.org/licenses/LICENSE-2.0.
|
#* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
@ -16,23 +16,25 @@
|
|||||||
#* License for the specific language governing permissions and limitations
|
#* License for the specific language governing permissions and limitations
|
||||||
#* under the License.
|
#* under the License.
|
||||||
#*
|
#*
|
||||||
#* Open MCT Web includes source code licensed under additional open source
|
#* Open MCT includes source code licensed under additional open source
|
||||||
#* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
#* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
#* this source code distribution or the Licensing information page available
|
#* this source code distribution or the Licensing information page available
|
||||||
#* at runtime from the About dialog for additional information.
|
#* at runtime from the About dialog for additional information.
|
||||||
#*****************************************************************************
|
#*****************************************************************************
|
||||||
|
|
||||||
# Script to build and deploy docs to github pages.
|
# Script to build and deploy docs.
|
||||||
|
|
||||||
OUTPUT_DIRECTORY="target/docs"
|
OUTPUT_DIRECTORY="dist/docs"
|
||||||
REPOSITORY_URL="git@github.com:nasa/openmctweb.git"
|
# Docs, once built, are pushed to the private website repo
|
||||||
|
REPOSITORY_URL="git@github.com:nasa/openmct-website.git"
|
||||||
|
WEBSITE_DIRECTORY="website"
|
||||||
|
|
||||||
BUILD_SHA=`git rev-parse head`
|
BUILD_SHA=`git rev-parse HEAD`
|
||||||
|
|
||||||
# A remote will be created for the git repository we are pushing to.
|
# A remote will be created for the git repository we are pushing to.
|
||||||
# Don't worry, as this entire directory will get trashed inbetween builds.
|
# Don't worry, as this entire directory will get trashed in between builds.
|
||||||
REMOTE_NAME="documentation"
|
REMOTE_NAME="documentation"
|
||||||
WEBSITE_BRANCH="gh-pages"
|
WEBSITE_BRANCH="master"
|
||||||
|
|
||||||
# Clean output directory, JSDOC will recreate
|
# Clean output directory, JSDOC will recreate
|
||||||
if [ -d $OUTPUT_DIRECTORY ]; then
|
if [ -d $OUTPUT_DIRECTORY ]; then
|
||||||
@ -40,23 +42,21 @@ if [ -d $OUTPUT_DIRECTORY ]; then
|
|||||||
fi
|
fi
|
||||||
|
|
||||||
npm run docs
|
npm run docs
|
||||||
cd $OUTPUT_DIRECTORY || exit 1
|
|
||||||
|
|
||||||
echo "git init"
|
echo "git clone $REPOSITORY_URL website"
|
||||||
git init
|
git clone $REPOSITORY_URL website || exit 1
|
||||||
|
echo "cp -r $OUTPUT_DIRECTORY $WEBSITE_DIRECTORY"
|
||||||
|
cp -r $OUTPUT_DIRECTORY $WEBSITE_DIRECTORY
|
||||||
|
echo "cd $WEBSITE_DIRECTORY"
|
||||||
|
cd $WEBSITE_DIRECTORY || exit 1
|
||||||
|
|
||||||
# Configure github for CircleCI user.
|
# Configure github for CircleCI user.
|
||||||
git config user.email "buildbot@circleci.com"
|
git config user.email "buildbot@circleci.com"
|
||||||
git config user.name "BuildBot"
|
git config user.name "BuildBot"
|
||||||
|
|
||||||
echo "git remote add $REMOTE_NAME $REPOSITORY_URL"
|
|
||||||
git remote add $REMOTE_NAME $REPOSITORY_URL
|
|
||||||
echo "git add ."
|
echo "git add ."
|
||||||
git add .
|
git add .
|
||||||
echo "git commit -m \"Generate docs from build $BUILD_SHA\""
|
echo "git commit -m \"Docs updated from build $BUILD_SHA\""
|
||||||
git commit -m "Generate docs from build $BUILD_SHA"
|
git commit -m "Docs updated from build $BUILD_SHA"
|
||||||
|
# Push to the website repo
|
||||||
echo "git push $REMOTE_NAME HEAD:$WEBSITE_BRANCH -f"
|
git push
|
||||||
git push $REMOTE_NAME HEAD:$WEBSITE_BRANCH -f
|
|
||||||
|
|
||||||
echo "Documentation pushed to gh-pages branch."
|
|
||||||
|
18
circle.yml
@ -1,18 +0,0 @@
|
|||||||
deployment:
|
|
||||||
production:
|
|
||||||
branch: master
|
|
||||||
commands:
|
|
||||||
- npm install canvas nomnoml
|
|
||||||
- ./build-docs.sh
|
|
||||||
- git push git@heroku.com:openmctweb-demo.git $CIRCLE_SHA1:refs/heads/master
|
|
||||||
openmctweb-staging-un:
|
|
||||||
branch: nem_prototype
|
|
||||||
heroku:
|
|
||||||
appname: openmctweb-staging-un
|
|
||||||
openmctweb-staging-deux:
|
|
||||||
branch: mobile
|
|
||||||
heroku:
|
|
||||||
appname: openmctweb-staging-deux
|
|
||||||
test:
|
|
||||||
post:
|
|
||||||
- npm run jshint --silent
|
|
31
codecov.yml
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
codecov:
|
||||||
|
require_ci_to_pass: false #This setting will update the bot regardless of whether or not tests pass
|
||||||
|
|
||||||
|
coverage:
|
||||||
|
status:
|
||||||
|
project:
|
||||||
|
default:
|
||||||
|
informational: true
|
||||||
|
patch:
|
||||||
|
default:
|
||||||
|
informational: true
|
||||||
|
precision: 2
|
||||||
|
round: down
|
||||||
|
range: "66...100"
|
||||||
|
|
||||||
|
ignore:
|
||||||
|
- "**/*Spec.js"
|
||||||
|
- "e2e"
|
||||||
|
|
||||||
|
parsers:
|
||||||
|
gcov:
|
||||||
|
branch_detection:
|
||||||
|
conditional: true
|
||||||
|
loop: true
|
||||||
|
method: false
|
||||||
|
macro: false
|
||||||
|
|
||||||
|
comment:
|
||||||
|
layout: "reach,diff,flags,files,footer"
|
||||||
|
behavior: default
|
||||||
|
require_changes: false
|
@ -1,9 +1,9 @@
|
|||||||
<!--
|
<!--
|
||||||
Open MCT Web, Copyright (c) 2014-2015, United States Government
|
Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
as represented by the Administrator of the National Aeronautics and Space
|
as represented by the Administrator of the National Aeronautics and Space
|
||||||
Administration. All rights reserved.
|
Administration. All rights reserved.
|
||||||
|
|
||||||
Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
"License"); you may not use this file except in compliance with the License.
|
"License"); you may not use this file except in compliance with the License.
|
||||||
You may obtain a copy of the License at
|
You may obtain a copy of the License at
|
||||||
http://www.apache.org/licenses/LICENSE-2.0.
|
http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
@ -14,12 +14,8 @@
|
|||||||
License for the specific language governing permissions and limitations
|
License for the specific language governing permissions and limitations
|
||||||
under the License.
|
under the License.
|
||||||
|
|
||||||
Open MCT Web includes source code licensed under additional open source
|
Open MCT includes source code licensed under additional open source
|
||||||
licenses. See the Open Source Licenses file (LICENSES.md) included with
|
licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
this source code distribution or the Licensing information page available
|
this source code distribution or the Licensing information page available
|
||||||
at runtime from the About dialog for additional information.
|
at runtime from the About dialog for additional information.
|
||||||
-->
|
-->
|
||||||
<mct-container key="overlay">
|
|
||||||
<mct-include key="'about-dialog'">
|
|
||||||
</mct-include>
|
|
||||||
</mct-container>
|
|
21
copyright-notice.js
Normal file
@ -0,0 +1,21 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is 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.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
@ -1,9 +1,3 @@
|
|||||||
<hr>
|
<hr>
|
||||||
<cite>
|
|
||||||
This document is styled using
|
|
||||||
<a href="https://github.com/jasonm23/markdown-css-themes">
|
|
||||||
https://github.com/jasonm23/markdown-css-themes
|
|
||||||
</a>.
|
|
||||||
</cite>
|
|
||||||
</body>
|
</body>
|
||||||
</html>
|
</html>
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
@ -14,7 +14,7 @@
|
|||||||
* License for the specific language governing permissions and limitations
|
* License for the specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*
|
*
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
* Open MCT includes source code licensed under additional open source
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
|
@ -1,7 +1,9 @@
|
|||||||
<html>
|
<html>
|
||||||
<head>
|
<head>
|
||||||
<link rel="stylesheet"
|
<link rel="stylesheet"
|
||||||
href="http://jasonm23.github.io/markdown-css-themes/avenir-white.css">
|
href="//nasa.github.io/openmct/static/res/css/styles.css">
|
||||||
|
<link rel="stylesheet"
|
||||||
|
href="//nasa.github.io/openmct/static/res/css/documentation.css">
|
||||||
</head>
|
</head>
|
||||||
<body>
|
<body>
|
||||||
|
|
||||||
|
@ -5,7 +5,7 @@ software components to communicate. The software components it recognizes
|
|||||||
are:
|
are:
|
||||||
|
|
||||||
* _Extensions_: Individual units of functionality that can be added to
|
* _Extensions_: Individual units of functionality that can be added to
|
||||||
or removed from Open MCT Web. _Extension categories_ distinguish what
|
or removed from Open MCT. _Extension categories_ distinguish what
|
||||||
type of functionality is being added/removed.
|
type of functionality is being added/removed.
|
||||||
* _Bundles_: A grouping of related extensions
|
* _Bundles_: A grouping of related extensions
|
||||||
(named after an analogous concept from [OSGi](http://www.osgi.org/))
|
(named after an analogous concept from [OSGi](http://www.osgi.org/))
|
||||||
@ -19,7 +19,7 @@ manner which the framework layer can understand.
|
|||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
#direction: down
|
#direction: down
|
||||||
[Open MCT Web|
|
[Open MCT|
|
||||||
[Dependency injection framework]-->[Platform bundle #1]
|
[Dependency injection framework]-->[Platform bundle #1]
|
||||||
[Dependency injection framework]-->[Platform bundle #2]
|
[Dependency injection framework]-->[Platform bundle #2]
|
||||||
[Dependency injection framework]-->[Plugin bundle #1]
|
[Dependency injection framework]-->[Plugin bundle #1]
|
||||||
@ -35,7 +35,7 @@ manner which the framework layer can understand.
|
|||||||
```
|
```
|
||||||
|
|
||||||
The "dependency injection framework" in this case is
|
The "dependency injection framework" in this case is
|
||||||
[AngularJS](https://angularjs.org/). Open MCT Web's framework layer
|
[AngularJS](https://angularjs.org/). Open MCT's framework layer
|
||||||
is really just a thin wrapper over Angular that recognizes the
|
is really just a thin wrapper over Angular that recognizes the
|
||||||
concepts of bundles and extensions (as declared in JSON files) and
|
concepts of bundles and extensions (as declared in JSON files) and
|
||||||
registering extensions with Angular. It additionally acts as a
|
registering extensions with Angular. It additionally acts as a
|
||||||
@ -60,7 +60,7 @@ activities which were performed by the framework component.
|
|||||||
|
|
||||||
## Application Initialization
|
## Application Initialization
|
||||||
|
|
||||||
The framework component initializes an Open MCT Web application following
|
The framework component initializes an Open MCT application following
|
||||||
a simple sequence of steps.
|
a simple sequence of steps.
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
@ -97,7 +97,7 @@ a simple sequence of steps.
|
|||||||
[Extension]o->[Dependency #3]
|
[Extension]o->[Dependency #3]
|
||||||
```
|
```
|
||||||
|
|
||||||
Open MCT Web's architecture relies on a simple premise: Individual units
|
Open MCT's architecture relies on a simple premise: Individual units
|
||||||
(extensions) only have access to the dependencies they declare that they
|
(extensions) only have access to the dependencies they declare that they
|
||||||
need, and they acquire references to these dependencies via dependency
|
need, and they acquire references to these dependencies via dependency
|
||||||
injection. This has several desirable traits:
|
injection. This has several desirable traits:
|
||||||
@ -121,17 +121,17 @@ injection. This has several desirable traits:
|
|||||||
the framework.
|
the framework.
|
||||||
|
|
||||||
A drawback to this approach is that it makes it difficult to define
|
A drawback to this approach is that it makes it difficult to define
|
||||||
"the architecture" of Open MCT Web, in terms of describing the specific
|
"the architecture" of Open MCT, in terms of describing the specific
|
||||||
units that interact at run-time. The run-time architecture is determined
|
units that interact at run-time. The run-time architecture is determined
|
||||||
by the framework as the consequence of wiring together dependencies.
|
by the framework as the consequence of wiring together dependencies.
|
||||||
As such, the specific architecture of any given application built on
|
As such, the specific architecture of any given application built on
|
||||||
Open MCT Web can look very different.
|
Open MCT can look very different.
|
||||||
|
|
||||||
Keeping that in mind, there are a few useful patterns supported by the
|
Keeping that in mind, there are a few useful patterns supported by the
|
||||||
framework that are useful to keep in mind.
|
framework that are useful to keep in mind.
|
||||||
|
|
||||||
The specific service infrastructure provided by the platform is described
|
The specific service infrastructure provided by the platform is described
|
||||||
in the [Platform Architecture](Platform.md).
|
in the [Platform Architecture](platform.md).
|
||||||
|
|
||||||
## Extension Categories
|
## Extension Categories
|
||||||
|
|
||||||
|
@ -1,14 +1,14 @@
|
|||||||
# Introduction
|
# Introduction
|
||||||
|
|
||||||
The purpose of this document is to familiarize developers with the
|
The purpose of this document is to familiarize developers with the
|
||||||
overall architecture of Open MCT Web.
|
overall architecture of Open MCT.
|
||||||
|
|
||||||
The target audience includes:
|
The target audience includes:
|
||||||
|
|
||||||
* _Platform maintainers_: Individuals involved in developing,
|
* _Platform maintainers_: Individuals involved in developing,
|
||||||
extending, and maintaing capabilities of the platform.
|
extending, and maintaining capabilities of the platform.
|
||||||
* _Integration developers_: Individuals tasked with integrated
|
* _Integration developers_: Individuals tasked with integrated
|
||||||
Open MCT Web into a larger system, who need to understand
|
Open MCT into a larger system, who need to understand
|
||||||
its inner workings sufficiently to complete this integration.
|
its inner workings sufficiently to complete this integration.
|
||||||
|
|
||||||
As the focus of this document is on architecture, whenever possible
|
As the focus of this document is on architecture, whenever possible
|
||||||
@ -17,25 +17,25 @@ omitted. These details may be found in the developer guide.
|
|||||||
|
|
||||||
# Overview
|
# Overview
|
||||||
|
|
||||||
Open MCT Web is client software: It runs in a web browser and
|
Open MCT is client software: It runs in a web browser and
|
||||||
provides a user interface, while communicating with various
|
provides a user interface, while communicating with various
|
||||||
server-side resources through browser APIs.
|
server-side resources through browser APIs.
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
#direction: right
|
#direction: right
|
||||||
[Client|[Browser|[Open MCT Web]->[Browser APIs]]]
|
[Client|[Browser|[Open MCT]->[Browser APIs]]]
|
||||||
[Server|[Web services]]
|
[Server|[Web services]]
|
||||||
[Client]<->[Server]
|
[Client]<->[Server]
|
||||||
```
|
```
|
||||||
|
|
||||||
While Open MCT Web can be configured to run as a standalone client,
|
While Open MCT can be configured to run as a standalone client,
|
||||||
this is rarely very useful. Instead, it is intended to be used as a
|
this is rarely very useful. Instead, it is intended to be used as a
|
||||||
display and interaction layer for information obtained from a
|
display and interaction layer for information obtained from a
|
||||||
variety of back-end services. Doing so requires authoring or utilizing
|
variety of back-end services. Doing so requires authoring or utilizing
|
||||||
adapter plugins which allow Open MCT Web to interact with these services.
|
adapter plugins which allow Open MCT to interact with these services.
|
||||||
|
|
||||||
Typically, the pattern here is to provide a known interface that
|
Typically, the pattern here is to provide a known interface that
|
||||||
Open MCT Web can utilize, and implement it such that it interacts with
|
Open MCT can utilize, and implement it such that it interacts with
|
||||||
whatever back-end provides the relevant information.
|
whatever back-end provides the relevant information.
|
||||||
Examples of back-ends that can be utilized in this fashion include
|
Examples of back-ends that can be utilized in this fashion include
|
||||||
databases for the persistence of user-created objects, or sources of
|
databases for the persistence of user-created objects, or sources of
|
||||||
@ -43,13 +43,13 @@ telemetry data.
|
|||||||
|
|
||||||
## Software Architecture
|
## Software Architecture
|
||||||
|
|
||||||
The simplest overview of Open MCT Web is to look at it as a "layered"
|
The simplest overview of Open MCT is to look at it as a "layered"
|
||||||
architecture, where each layer more clearly specifies the behavior
|
architecture, where each layer more clearly specifies the behavior
|
||||||
of the software.
|
of the software.
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
#direction: down
|
#direction: down
|
||||||
[Open MCT Web|
|
[Open MCT|
|
||||||
[Platform]<->[Application]
|
[Platform]<->[Application]
|
||||||
[Framework]->[Application]
|
[Framework]->[Application]
|
||||||
[Framework]->[Platform]
|
[Framework]->[Platform]
|
||||||
@ -64,15 +64,13 @@ These layers are:
|
|||||||
established an abstraction by which different software components
|
established an abstraction by which different software components
|
||||||
may communicate and/or interact.
|
may communicate and/or interact.
|
||||||
* [_Platform_](platform.md): The platform layer defines the general look,
|
* [_Platform_](platform.md): The platform layer defines the general look,
|
||||||
feel, and behavior of Open MCT Web. This includes user-facing components like
|
feel, and behavior of Open MCT. This includes user-facing components like
|
||||||
Browse mode and Edit mode, as well as underlying elements of the
|
Browse mode and Edit mode, as well as underlying elements of the
|
||||||
information model and the general service infrastructure.
|
information model and the general service infrastructure.
|
||||||
* _Application_: The application layer defines specific features of
|
* _Application_: The application layer defines specific features of
|
||||||
an application built on Open MCT Web. This includes adapters to
|
an application built on Open MCT. This includes adapters to
|
||||||
specific back-ends, new types of things for users to create, and
|
specific back-ends, new types of things for users to create, and
|
||||||
new ways of visualizing objects within the system. This layer
|
new ways of visualizing objects within the system. This layer
|
||||||
typically consists of a mix of custom plug-ins to Open MCT Web,
|
typically consists of a mix of custom plug-ins to Open MCT,
|
||||||
as well as optional features (such as Plot view) included alongside
|
as well as optional features (such as Plot view) included alongside
|
||||||
the platform.
|
the platform.
|
||||||
|
|
||||||
|
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Overview
|
# Overview
|
||||||
|
|
||||||
The Open MCT Web platform utilizes the [framework layer](Framework.md)
|
The Open MCT platform utilizes the [framework layer](framework.md)
|
||||||
to provide an extensible baseline for applications which includes:
|
to provide an extensible baseline for applications which includes:
|
||||||
|
|
||||||
* A common user interface (and user interface paradigm) for dealing with
|
* A common user interface (and user interface paradigm) for dealing with
|
||||||
@ -16,7 +16,7 @@ building application, the platform adds more specificity by defining
|
|||||||
additional extension types and allowing for integration with back end
|
additional extension types and allowing for integration with back end
|
||||||
components.
|
components.
|
||||||
|
|
||||||
The run-time architecture of an Open MCT Web application can be categorized
|
The run-time architecture of an Open MCT application can be categorized
|
||||||
into certain high-level tiers:
|
into certain high-level tiers:
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
@ -29,7 +29,7 @@ into certain high-level tiers:
|
|||||||
[Browser APIs]->[Back-end]
|
[Browser APIs]->[Back-end]
|
||||||
```
|
```
|
||||||
|
|
||||||
Applications built using Open MCT Web may add or configure functionality
|
Applications built using Open MCT may add or configure functionality
|
||||||
in __any of these tiers__.
|
in __any of these tiers__.
|
||||||
|
|
||||||
* _DOM_: The rendered HTML document, composed from HTML templates which
|
* _DOM_: The rendered HTML document, composed from HTML templates which
|
||||||
@ -38,7 +38,7 @@ in __any of these tiers__.
|
|||||||
are initiated from here and invoke behavior in the presentation layer. HTML
|
are initiated from here and invoke behavior in the presentation layer. HTML
|
||||||
templates are written in Angular’s template syntax; see the [Angular documentation on templates](https://docs.angularjs.org/guide/templates).
|
templates are written in Angular’s template syntax; see the [Angular documentation on templates](https://docs.angularjs.org/guide/templates).
|
||||||
These describe the page as actually seen by the user. Conceptually,
|
These describe the page as actually seen by the user. Conceptually,
|
||||||
stylesheets (controlling the lookandfeel of the rendered templates) belong
|
stylesheets (controlling the look-and-feel of the rendered templates) belong
|
||||||
in this grouping as well.
|
in this grouping as well.
|
||||||
* [_Presentation layer_](#presentation-layer): The presentation layer
|
* [_Presentation layer_](#presentation-layer): The presentation layer
|
||||||
is responsible for updating (and providing information to update)
|
is responsible for updating (and providing information to update)
|
||||||
@ -48,7 +48,7 @@ in __any of these tiers__.
|
|||||||
display.
|
display.
|
||||||
* [_Information model_](#information-model): Provides a common (within Open MCT
|
* [_Information model_](#information-model): Provides a common (within Open MCT
|
||||||
Web) set of interfaces for dealing with “things” domain objects within the
|
Web) set of interfaces for dealing with “things” domain objects within the
|
||||||
system. Userfacing concerns in a Open MCT Web application are expressed as
|
system. User-facing concerns in a Open MCT Web application are expressed as
|
||||||
domain objects; examples include folders (used to organize other domain
|
domain objects; examples include folders (used to organize other domain
|
||||||
objects), layouts (used to build displays), or telemetry points (used as
|
objects), layouts (used to build displays), or telemetry points (used as
|
||||||
handles for streams of remote measurements.) These domain objects expose a
|
handles for streams of remote measurements.) These domain objects expose a
|
||||||
@ -60,7 +60,7 @@ in __any of these tiers__.
|
|||||||
functionality needed to support the information model. This includes
|
functionality needed to support the information model. This includes
|
||||||
exposing underlying sets of extensions and mediating with the
|
exposing underlying sets of extensions and mediating with the
|
||||||
back-end.
|
back-end.
|
||||||
* _Back-end_: The back-end is out of the scope of Open MCT Web, except
|
* _Back-end_: The back-end is out of the scope of Open MCT, except
|
||||||
for the interfaces which are utilized by adapters participating in the
|
for the interfaces which are utilized by adapters participating in the
|
||||||
service infrastructure. Includes the underlying persistence stores, telemetry
|
service infrastructure. Includes the underlying persistence stores, telemetry
|
||||||
streams, and so forth which the Open MCT Web client is being used to interact
|
streams, and so forth which the Open MCT Web client is being used to interact
|
||||||
@ -70,15 +70,15 @@ in __any of these tiers__.
|
|||||||
|
|
||||||
Once the
|
Once the
|
||||||
[application has been initialized](Framework.md#application-initialization)
|
[application has been initialized](Framework.md#application-initialization)
|
||||||
Open MCT Web primarily operates in an event-driven paradigm; various
|
Open MCT primarily operates in an event-driven paradigm; various
|
||||||
events (mouse clicks, timers firing, receiving responses to XHRs) trigger
|
events (mouse clicks, timers firing, receiving responses to XHRs) trigger
|
||||||
the invocation of functions, typically in the presentation layer for
|
the invocation of functions, typically in the presentation layer for
|
||||||
user actions or in the service infrastructure for server responses.
|
user actions or in the service infrastructure for server responses.
|
||||||
|
|
||||||
The "main point of entry" into an initialized Open MCT Web application
|
The "main point of entry" into an initialized Open MCT application
|
||||||
is effectively the
|
is effectively the
|
||||||
[route](https://docs.angularjs.org/api/ngRoute/service/$route#example)
|
[route](https://docs.angularjs.org/api/ngRoute/service/$route#example)
|
||||||
which is associated with the URL used to access Open MCT Web (or a
|
which is associated with the URL used to access Open MCT (or a
|
||||||
default route.) This route will be associated with a template which
|
default route.) This route will be associated with a template which
|
||||||
will be displayed; this template will include references to directives
|
will be displayed; this template will include references to directives
|
||||||
and controllers which will be interpreted by Angular and used to
|
and controllers which will be interpreted by Angular and used to
|
||||||
@ -107,11 +107,11 @@ both the information model and the service infrastructure.
|
|||||||
|
|
||||||
# Presentation Layer
|
# Presentation Layer
|
||||||
|
|
||||||
The presentation layer of Open MCT Web is responsible for providing
|
The presentation layer of Open MCT is responsible for providing
|
||||||
information to display within templates, and for handling interactions
|
information to display within templates, and for handling interactions
|
||||||
which are initiated from templated DOM elements. AngularJS acts as
|
which are initiated from templated DOM elements. AngularJS acts as
|
||||||
an intermediary between the web page as the user sees it, and the
|
an intermediary between the web page as the user sees it, and the
|
||||||
presentation layer implemented as Open MCT Web extensions.
|
presentation layer implemented as Open MCT extensions.
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
[Presentation Layer|
|
[Presentation Layer|
|
||||||
@ -143,12 +143,12 @@ to primitives from AngularJS:
|
|||||||
attributes and tags.
|
attributes and tags.
|
||||||
* [_Routes_](https://docs.angularjs.org/api/ngRoute/service/$route#example)
|
* [_Routes_](https://docs.angularjs.org/api/ngRoute/service/$route#example)
|
||||||
are used to associate specific URLs (including the fragment identifier)
|
are used to associate specific URLs (including the fragment identifier)
|
||||||
with specific application states. (In Open MCT Web, these are used to
|
with specific application states. (In Open MCT, these are used to
|
||||||
describe the mode of usage - e.g. browse or edit - as well as to
|
describe the mode of usage - e.g. browse or edit - as well as to
|
||||||
identify the object being used.)
|
identify the object being used.)
|
||||||
* [_Templates_](https://docs.angularjs.org/guide/templates) are partial
|
* [_Templates_](https://docs.angularjs.org/guide/templates) are partial
|
||||||
HTML documents that will be rendered and kept up-to-date by AngularJS.
|
HTML documents that will be rendered and kept up-to-date by AngularJS.
|
||||||
Open MCT Web introduces a custom `mct-include` directive which acts
|
Open MCT introduces a custom `mct-include` directive which acts
|
||||||
as a wrapper around `ng-include` to allow templates to be referred
|
as a wrapper around `ng-include` to allow templates to be referred
|
||||||
to by symbolic names.
|
to by symbolic names.
|
||||||
|
|
||||||
@ -189,10 +189,10 @@ to displaying domain objects.
|
|||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
Domain objects are the most fundamental component of Open MCT Web's
|
Domain objects are the most fundamental component of Open MCT's
|
||||||
information model. A domain object is some distinct thing relevant to a
|
information model. A domain object is some distinct thing relevant to a
|
||||||
user's work flow, such as a telemetry channel, display, or similar.
|
user's work flow, such as a telemetry channel, display, or similar.
|
||||||
Open MCT Web is a tool for viewing, browsing, manipulating, and otherwise
|
Open MCT is a tool for viewing, browsing, manipulating, and otherwise
|
||||||
interacting with a graph of domain objects.
|
interacting with a graph of domain objects.
|
||||||
|
|
||||||
A domain object should be conceived of as the union of the following:
|
A domain object should be conceived of as the union of the following:
|
||||||
@ -254,7 +254,7 @@ Concrete examples of capabilities which follow this pattern
|
|||||||
|
|
||||||
# Service Infrastructure
|
# Service Infrastructure
|
||||||
|
|
||||||
Most services exposed by the Open MCT Web platform follow the
|
Most services exposed by the Open MCT platform follow the
|
||||||
[composite services](Framework.md#composite-services) to permit
|
[composite services](Framework.md#composite-services) to permit
|
||||||
a higher degree of flexibility in how a service can be modified
|
a higher degree of flexibility in how a service can be modified
|
||||||
or customized for specific applications.
|
or customized for specific applications.
|
||||||
@ -327,7 +327,7 @@ A short summary of the roles of these services:
|
|||||||
[DomainObjectProvider]o-[CapabilityService]
|
[DomainObjectProvider]o-[CapabilityService]
|
||||||
```
|
```
|
||||||
|
|
||||||
As domain objects are central to Open MCT Web's information model,
|
As domain objects are central to Open MCT's information model,
|
||||||
acquiring domain objects is equally important.
|
acquiring domain objects is equally important.
|
||||||
|
|
||||||
```nomnoml
|
```nomnoml
|
||||||
@ -338,7 +338,7 @@ acquiring domain objects is equally important.
|
|||||||
[<state> Instantiate DomainObject]->[<end> End]
|
[<state> Instantiate DomainObject]->[<end> End]
|
||||||
```
|
```
|
||||||
|
|
||||||
Open MCT Web includes an implementation of an `ObjectService` which
|
Open MCT includes an implementation of an `ObjectService` which
|
||||||
satisfies this capability by:
|
satisfies this capability by:
|
||||||
|
|
||||||
* Consulting the [Model Service](#model-service) to acquire domain object
|
* Consulting the [Model Service](#model-service) to acquire domain object
|
||||||
@ -437,9 +437,9 @@ objects (this allows failures to be recognized and handled in groups.)
|
|||||||
The telemetry service is responsible for acquiring telemetry data.
|
The telemetry service is responsible for acquiring telemetry data.
|
||||||
|
|
||||||
Notably, the platform does not include any providers for
|
Notably, the platform does not include any providers for
|
||||||
`TelemetryService`; applications built on Open MCT Web will need to
|
`TelemetryService`; applications built on Open MCT will need to
|
||||||
implement a provider for this service if they wish to expose telemetry
|
implement a provider for this service if they wish to expose telemetry
|
||||||
data. This is usually the most important step for integrating Open MCT Web
|
data. This is usually the most important step for integrating Open MCT
|
||||||
into an existing telemetry system.
|
into an existing telemetry system.
|
||||||
|
|
||||||
Requests for telemetry data are usually initiated in the
|
Requests for telemetry data are usually initiated in the
|
||||||
@ -616,7 +616,7 @@ follows:
|
|||||||
part of an action's extension definition.
|
part of an action's extension definition.
|
||||||
* `CreateActionProvider` provides the various Create actions which
|
* `CreateActionProvider` provides the various Create actions which
|
||||||
populate the Create menu. These are driven by the available types,
|
populate the Create menu. These are driven by the available types,
|
||||||
so do not map easily ot extension category `actions`; instead, these
|
so do not map easily to extension category `actions`; instead, these
|
||||||
are generated after looking up which actions are available from the
|
are generated after looking up which actions are available from the
|
||||||
[`TypeService`](#type-service).
|
[`TypeService`](#type-service).
|
||||||
* `ActionAggregator` merges together actions from multiple providers.
|
* `ActionAggregator` merges together actions from multiple providers.
|
||||||
@ -721,6 +721,6 @@ disallow.
|
|||||||
```
|
```
|
||||||
|
|
||||||
The type service provides metadata about the different types of domain
|
The type service provides metadata about the different types of domain
|
||||||
objects that exist within an Open MCT Web application. The platform
|
objects that exist within an Open MCT application. The platform
|
||||||
implementation reads these types in from extension category `types`
|
implementation reads these types in from extension category `types`
|
||||||
and wraps them in a JavaScript interface.
|
and wraps them in a JavaScript interface.
|
@ -1,7 +1,7 @@
|
|||||||
# API Refactoring
|
# API Refactoring
|
||||||
|
|
||||||
This document summarizes a path toward implementing API changes
|
This document summarizes a path toward implementing API changes
|
||||||
from the [API Redesign](../proposals/APIRedesign.md) for Open MCT Web
|
from the [API Redesign](../proposals/APIRedesign.md) for Open MCT
|
||||||
v1.0.0.
|
v1.0.0.
|
||||||
|
|
||||||
# Goals
|
# Goals
|
||||||
@ -161,7 +161,7 @@ be included in a straightforward fashion.
|
|||||||
|
|
||||||
Some goals for this build step:
|
Some goals for this build step:
|
||||||
|
|
||||||
* Compile (and, preferably, optimize/minify) Open MCT Web
|
* Compile (and, preferably, optimize/minify) Open MCT
|
||||||
sources into a single `.js` file.
|
sources into a single `.js` file.
|
||||||
* It is desirable to do the same for HTML sources, but
|
* It is desirable to do the same for HTML sources, but
|
||||||
may wish to defer this until a subsequent refactoring
|
may wish to defer this until a subsequent refactoring
|
||||||
@ -170,7 +170,7 @@ Some goals for this build step:
|
|||||||
derivative projects in a straightforward fashion.
|
derivative projects in a straightforward fashion.
|
||||||
|
|
||||||
Should also consider which dependency/packaging manager should
|
Should also consider which dependency/packaging manager should
|
||||||
be used by dependent projects to obtain Open MCT Web. Approaches
|
be used by dependent projects to obtain Open MCT. Approaches
|
||||||
include:
|
include:
|
||||||
|
|
||||||
1. Plain `npm`. Dependents then declare their dependency with
|
1. Plain `npm`. Dependents then declare their dependency with
|
||||||
@ -203,7 +203,7 @@ to use for asset generation/management and compilation/minification/etc.
|
|||||||
|
|
||||||
## Step 3. Separate repositories
|
## Step 3. Separate repositories
|
||||||
|
|
||||||
Refactor existing applications built on Open MCT Web such that they
|
Refactor existing applications built on Open MCT such that they
|
||||||
are no longer forks, but instead separate projects with a dependency
|
are no longer forks, but instead separate projects with a dependency
|
||||||
on the built artifacts from Step 2.
|
on the built artifacts from Step 2.
|
||||||
|
|
||||||
@ -211,7 +211,7 @@ Note that this is achievable already using `bower` (see `warp-bower`
|
|||||||
branch at http://developer.nasa.gov/mct/warp for an example.)
|
branch at http://developer.nasa.gov/mct/warp for an example.)
|
||||||
However, changes involved in switching to an imperative API and
|
However, changes involved in switching to an imperative API and
|
||||||
introducing a build process may change (and should simplify) the
|
introducing a build process may change (and should simplify) the
|
||||||
approach used to utilize Open MCT Web as a dependency, so these
|
approach used to utilize Open MCT as a dependency, so these
|
||||||
changes should be introduced first.
|
changes should be introduced first.
|
||||||
|
|
||||||
## Step 4. Design registration API
|
## Step 4. Design registration API
|
||||||
@ -287,7 +287,7 @@ or separately in parallel) and should involve a tight cycle of:
|
|||||||
planning should be done to spread out the changes incrementally.
|
planning should be done to spread out the changes incrementally.
|
||||||
|
|
||||||
By necessity, these changes may break functionality in applications
|
By necessity, these changes may break functionality in applications
|
||||||
built using Open MCT Web. On a case-by-case basis, should consider
|
built using Open MCT. On a case-by-case basis, should consider
|
||||||
providing temporary "legacy support" to allow downstream updates
|
providing temporary "legacy support" to allow downstream updates
|
||||||
to occur as a separate task; the relevant trade here is between
|
to occur as a separate task; the relevant trade here is between
|
||||||
waste/effort required to maintain legacy support, versus the
|
waste/effort required to maintain legacy support, versus the
|
||||||
@ -299,11 +299,11 @@ across several repositories.
|
|||||||
|
|
||||||
Update bundles to remove any usages of legacy support for bundles
|
Update bundles to remove any usages of legacy support for bundles
|
||||||
(including that used by dependent projects.) Then, remove legacy
|
(including that used by dependent projects.) Then, remove legacy
|
||||||
support from Open MCT Web.
|
support from Open MCT.
|
||||||
|
|
||||||
## Step 8. Release candidacy
|
## Step 8. Release candidacy
|
||||||
|
|
||||||
Once API changes are complete, Open MCT Web should enter a release
|
Once API changes are complete, Open MCT should enter a release
|
||||||
candidacy cycle. Important things to look at here:
|
candidacy cycle. Important things to look at here:
|
||||||
|
|
||||||
* Are changes really complete?
|
* Are changes really complete?
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Overview
|
# Overview
|
||||||
|
|
||||||
The purpose of this document is to review feedback on Open MCT Web's
|
The purpose of this document is to review feedback on Open MCT's
|
||||||
current API and propose improvements to the API, particularly for a
|
current API and propose improvements to the API, particularly for a
|
||||||
1.0.0 release.
|
1.0.0 release.
|
||||||
|
|
||||||
@ -64,7 +64,7 @@ useful, powerful interfaces.
|
|||||||
## Developer Intern Feedback
|
## Developer Intern Feedback
|
||||||
|
|
||||||
This feedback comes from interns who worked closely with
|
This feedback comes from interns who worked closely with
|
||||||
Open MCT Web as their primary task over the Summer of 2015.
|
Open MCT as their primary task over the Summer of 2015.
|
||||||
|
|
||||||
### Developer Intern 1
|
### Developer Intern 1
|
||||||
|
|
||||||
@ -98,13 +98,13 @@ Worked on bug fixes in the platform and a plugin for search.
|
|||||||
It is hard to figure out what the difference between the various ways of
|
It is hard to figure out what the difference between the various ways of
|
||||||
dealing with telemetry are. e.g., what is the difference between just
|
dealing with telemetry are. e.g., what is the difference between just
|
||||||
"Telemetry" and the "Telemetry Service"? There are many
|
"Telemetry" and the "Telemetry Service"? There are many
|
||||||
"Telemetry Thing"s which seem related, but in an unclear way.
|
"Telemetry Things" which seem related, but in an unclear way.
|
||||||
|
|
||||||
### Developer Intern 2
|
### Developer Intern 2
|
||||||
|
|
||||||
Worked on platform bug fixes and mobile support.
|
Worked on platform bug fixes and mobile support.
|
||||||
|
|
||||||
* No guide for the UI and front end for the HTML/CSS part of Open MCT Web.
|
* No guide for the UI and front end for the HTML/CSS part of Open MCT.
|
||||||
Not sure if this is applicable or needed for developers, however would
|
Not sure if this is applicable or needed for developers, however would
|
||||||
be helpful to any front end development
|
be helpful to any front end development
|
||||||
* Found it difficult to follow the plot controller & subplot
|
* Found it difficult to follow the plot controller & subplot
|
||||||
@ -118,11 +118,11 @@ Worked on platform bug fixes and mobile support.
|
|||||||
## Plugin Developer Feedback
|
## Plugin Developer Feedback
|
||||||
|
|
||||||
This feedback comes from developers who have worked on plugins for
|
This feedback comes from developers who have worked on plugins for
|
||||||
Open MCT Web, but have not worked on the platform.
|
Open MCT, but have not worked on the platform.
|
||||||
|
|
||||||
### Plugin Developer 1
|
### Plugin Developer 1
|
||||||
|
|
||||||
Used Open MCT Web over the course of several months (on a
|
Used Open MCT over the course of several months (on a
|
||||||
less-than-half-time basis) to develop a
|
less-than-half-time basis) to develop a
|
||||||
spectrum visualization plugin.
|
spectrum visualization plugin.
|
||||||
|
|
||||||
@ -138,7 +138,7 @@ spectrum visualization plugin.
|
|||||||
|
|
||||||
### Plugin Developer 2
|
### Plugin Developer 2
|
||||||
|
|
||||||
Used Open MCT Web over the course of several weeks (on a half-time basis)
|
Used Open MCT over the course of several weeks (on a half-time basis)
|
||||||
to develop a tabular visualization plugin.
|
to develop a tabular visualization plugin.
|
||||||
|
|
||||||
* Pain points
|
* Pain points
|
||||||
@ -180,7 +180,7 @@ to develop a tabular visualization plugin.
|
|||||||
* Add a model property to the bundle.json to take in "Hello World"
|
* Add a model property to the bundle.json to take in "Hello World"
|
||||||
as a parameter and pass through to the controller/view
|
as a parameter and pass through to the controller/view
|
||||||
|
|
||||||
### Open Source Contributer
|
### Open Source Contributor
|
||||||
|
|
||||||
* [Failures are non-graceful when services are missing.](
|
* [Failures are non-graceful when services are missing.](
|
||||||
https://github.com/nasa/openmctweb/issues/79)
|
https://github.com/nasa/openmctweb/issues/79)
|
||||||
@ -197,7 +197,7 @@ to develop a tabular visualization plugin.
|
|||||||
## Long-term Developer Notes
|
## Long-term Developer Notes
|
||||||
|
|
||||||
The following notes are from original platform developer, with long
|
The following notes are from original platform developer, with long
|
||||||
term experience using Open MCT Web.
|
term experience using Open MCT.
|
||||||
|
|
||||||
* Bundle mechanism allows for grouping related components across concerns,
|
* Bundle mechanism allows for grouping related components across concerns,
|
||||||
and adding and removing these easily. (e.g. model and view components of
|
and adding and removing these easily. (e.g. model and view components of
|
||||||
@ -214,13 +214,13 @@ to an entirely different framework.
|
|||||||
|
|
||||||
We can expect AngularJS 1.x to reach end-of-life reasonably soon thereafter.
|
We can expect AngularJS 1.x to reach end-of-life reasonably soon thereafter.
|
||||||
|
|
||||||
Our API is currently a superset of Angular's API, so this directly effects
|
Our API is currently a superset of Angular's API, so this directly affects
|
||||||
our API. Specifically, API changes should be oriented towards removing
|
our API. Specifically, API changes should be oriented towards removing
|
||||||
or reducing the Angular dependency.
|
or reducing the Angular dependency.
|
||||||
|
|
||||||
### Angular's Role
|
### Angular's Role
|
||||||
|
|
||||||
Angular is Open MCT Web's:
|
Angular is Open MCT's:
|
||||||
|
|
||||||
* Dependency injection framework.
|
* Dependency injection framework.
|
||||||
* Template rendering.
|
* Template rendering.
|
||||||
@ -268,7 +268,7 @@ by experience:
|
|||||||
|
|
||||||
* Feedback from new developers is that Angular was a hindrance to
|
* Feedback from new developers is that Angular was a hindrance to
|
||||||
training, not a benefit. ("One more thing to learn.") Significant
|
training, not a benefit. ("One more thing to learn.") Significant
|
||||||
documentation remains necessary for Open MCT Web.
|
documentation remains necessary for Open MCT.
|
||||||
* Expected enhancements to maintainability will be effectively
|
* Expected enhancements to maintainability will be effectively
|
||||||
invalidated by an expected Angular end-of-life.
|
invalidated by an expected Angular end-of-life.
|
||||||
* Data binding and automatic view updates do save development effort,
|
* Data binding and automatic view updates do save development effort,
|
||||||
@ -423,7 +423,7 @@ which can help with this, however.
|
|||||||
instead of separate approaches for static and substitutable
|
instead of separate approaches for static and substitutable
|
||||||
dependencies.
|
dependencies.
|
||||||
* Removes need to understand Angular's DI mechanism.
|
* Removes need to understand Angular's DI mechanism.
|
||||||
* Improves useability of documentation (`typeService` is an
|
* Improves usability of documentation (`typeService` is an
|
||||||
instance of `CompositeService` and implements `TypeService`
|
instance of `CompositeService` and implements `TypeService`
|
||||||
so you can easily traverse links in the JSDoc.)
|
so you can easily traverse links in the JSDoc.)
|
||||||
* Can be used more easily from Web Workers, allowing services
|
* Can be used more easily from Web Workers, allowing services
|
||||||
@ -456,7 +456,7 @@ Instead, propose that:
|
|||||||
For parity with actions, a `View` would be a constructor which
|
For parity with actions, a `View` would be a constructor which
|
||||||
takes an `ActionContext` as a parameter (with similarly-defined
|
takes an `ActionContext` as a parameter (with similarly-defined
|
||||||
properties) and exposes a method to retrieve the HTML elements
|
properties) and exposes a method to retrieve the HTML elements
|
||||||
associateed with it.
|
associated with it.
|
||||||
|
|
||||||
The platform would then additionally expose an `AngularView`
|
The platform would then additionally expose an `AngularView`
|
||||||
implementation to improve compatibility with existing
|
implementation to improve compatibility with existing
|
||||||
@ -526,7 +526,7 @@ subset of `$http`'s functionality.
|
|||||||
|
|
||||||
### Detriments
|
### Detriments
|
||||||
|
|
||||||
* Increases the number of interfaces in Open MCT Web. (Arguably,
|
* Increases the number of interfaces in Open MCT. (Arguably,
|
||||||
not really, since the same interfaces would exist if exposed
|
not really, since the same interfaces would exist if exposed
|
||||||
by Angular.)
|
by Angular.)
|
||||||
|
|
||||||
@ -574,7 +574,7 @@ This would also allow for "composite bundles" which serve as
|
|||||||
proxies for multiple bundles. The `BundleContext` could contain
|
proxies for multiple bundles. The `BundleContext` could contain
|
||||||
(or later be amended to contain) filtering rules to ignore
|
(or later be amended to contain) filtering rules to ignore
|
||||||
other bundles and so forth (this has been useful for administering
|
other bundles and so forth (this has been useful for administering
|
||||||
Open MCT Web in subtly different configurations in the past.)
|
Open MCT in subtly different configurations in the past.)
|
||||||
|
|
||||||
### Benefits
|
### Benefits
|
||||||
|
|
||||||
@ -827,7 +827,7 @@ This could be resolved by:
|
|||||||
|
|
||||||
## Nomenclature Change
|
## Nomenclature Change
|
||||||
|
|
||||||
Instead of presenting Open MCT Web as a "framework" or
|
Instead of presenting Open MCT as a "framework" or
|
||||||
"platform", present it as an "extensible application."
|
"platform", present it as an "extensible application."
|
||||||
|
|
||||||
This is mostly a change for the developer guide. A
|
This is mostly a change for the developer guide. A
|
||||||
@ -1040,7 +1040,7 @@ This is a more specific variant of
|
|||||||
* Removes a whole category of API (bundle definitions), reducing
|
* Removes a whole category of API (bundle definitions), reducing
|
||||||
learning curve associated with the software.
|
learning curve associated with the software.
|
||||||
* Closer to Angular style, reducing disconnect between learning
|
* Closer to Angular style, reducing disconnect between learning
|
||||||
Angular and learning Open MCT Web (reducing burden of having
|
Angular and learning Open MCT (reducing burden of having
|
||||||
to learn multiple paradigms.)
|
to learn multiple paradigms.)
|
||||||
* Clarifies "what can be found where" (albeit not perfectly)
|
* Clarifies "what can be found where" (albeit not perfectly)
|
||||||
since you can look to module dependencies and follow back from there.
|
since you can look to module dependencies and follow back from there.
|
||||||
@ -1124,7 +1124,7 @@ app.config(['actionRegistryProvider', function (arp) {
|
|||||||
### Detriments
|
### Detriments
|
||||||
|
|
||||||
* Slightly increases dependency on Angular; other dependency injectors
|
* Slightly increases dependency on Angular; other dependency injectors
|
||||||
may not offer comparable ways to specificy dependencies non-globally.
|
may not offer comparable ways to specify dependencies non-globally.
|
||||||
* Not clear (or will take effort to make clear) which dependencies are
|
* Not clear (or will take effort to make clear) which dependencies are
|
||||||
available for which extensions. Could be mitigated by standardizing
|
available for which extensions. Could be mitigated by standardizing
|
||||||
descriptions of context across actions and views, but that may offer
|
descriptions of context across actions and views, but that may offer
|
||||||
@ -1250,7 +1250,7 @@ take. Should not be default behavior.
|
|||||||
|
|
||||||
Proposal | Consensus
|
Proposal | Consensus
|
||||||
------|------
|
------|------
|
||||||
Imperitive component registries | [:+1:](https://github.com/nasa/openmctweb/issues/462)
|
Imperative component registries | [:+1:](https://github.com/nasa/openmctweb/issues/462)
|
||||||
Get rid of "extension category" concept. | [:+1:](https://github.com/nasa/openmctweb/issues/462)
|
Get rid of "extension category" concept. | [:+1:](https://github.com/nasa/openmctweb/issues/462)
|
||||||
Reduce number and depth of extension points | :+1:
|
Reduce number and depth of extension points | :+1:
|
||||||
Composite services should not be the default | [:question:](https://github.com/nasa/openmctweb/issues/463)
|
Composite services should not be the default | [:question:](https://github.com/nasa/openmctweb/issues/463)
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
|
**Table of Contents** *generated with [DocToc](https://github.com/thlorenz/doctoc)*
|
||||||
|
|
||||||
- [Reducing interface depth (the bundle.json version)](#reducing-interface-depth-the-bundlejson-version)
|
- [Reducing interface depth (the bundle.json version)](#reducing-interface-depth-the-bundlejson-version)
|
||||||
- [Imperitive component registries](#imperitive-component-registries)
|
- [Imperative component registries](#imperative-component-registries)
|
||||||
- [Get rid of "extension category" concept.](#get-rid-of-extension-category-concept)
|
- [Get rid of "extension category" concept.](#get-rid-of-extension-category-concept)
|
||||||
- [Reduce number and depth of extension points](#reduce-number-and-depth-of-extension-points)
|
- [Reduce number and depth of extension points](#reduce-number-and-depth-of-extension-points)
|
||||||
- [Composite services should not be the default](#composite-services-should-not-be-the-default)
|
- [Composite services should not be the default](#composite-services-should-not-be-the-default)
|
||||||
@ -30,11 +30,11 @@
|
|||||||
|
|
||||||
# Reducing interface depth (the bundle.json version)
|
# Reducing interface depth (the bundle.json version)
|
||||||
|
|
||||||
## Imperitive component registries
|
## Imperative component registries
|
||||||
|
|
||||||
Transition component registries to javascript, get rid of bundle.json and bundles.json. Prescribe a method for application configuration, but allow flexibility in how application configuration is defined.
|
Transition component registries to javascript, get rid of bundle.json and bundles.json. Prescribe a method for application configuration, but allow flexibility in how application configuration is defined.
|
||||||
|
|
||||||
Register components in an imperitive fashion, see angularApp.factory, angularApp.controller, etc. Alternatively, implement our own application object with new registries and it's own form of registering objects.
|
Register components in an imperative fashion, see angularApp.factory, angularApp.controller, etc. Alternatively, implement our own application object with new registries and it's own form of registering objects.
|
||||||
|
|
||||||
## Get rid of "extension category" concept.
|
## Get rid of "extension category" concept.
|
||||||
|
|
||||||
@ -99,7 +99,7 @@ To reduce interface depth, we can replace our own provider and registry patterns
|
|||||||
|
|
||||||
## More angular: for all services
|
## More angular: for all services
|
||||||
|
|
||||||
Increasing our commitment to angular would mean using more of the angular factorys, services, etc, and less of our home grown tools. We'd implement our services and extension points as angular providers, and make them configurable via app.config.
|
Increasing our commitment to angular would mean using more of the angular factories, services, etc, and less of our home grown tools. We'd implement our services and extension points as angular providers, and make them configurable via app.config.
|
||||||
|
|
||||||
As an example, registering a specific type of model provider in angular would look like:
|
As an example, registering a specific type of model provider in angular would look like:
|
||||||
|
|
||||||
@ -126,9 +126,9 @@ Allow developers to use whatever module loading system they'd like to use, while
|
|||||||
|
|
||||||
## Use gulp or grunt for standard tooling
|
## Use gulp or grunt for standard tooling
|
||||||
|
|
||||||
Using gulp or grunt as a task runner would bring us in line with standard web developer workflows and help standardize rendering, deployment, and packaging. Additional tools can be added to the workflow at low cost, simplifying the set up of developer environments.
|
Using gulp or grunt as a task runner would bring us in line with standard web developer workflows and help standardize rendering, deployment, and packaging. Additional tools can be added to the workflow at low cost, simplifying the setup of developer environments.
|
||||||
|
|
||||||
Gulp and grunt provide useful developer tooling such as live reload, automatic scss/less/etc compiliation, and ease of extensibility for standard production build processes. They're key in decoupling code.
|
Gulp and grunt provide useful developer tooling such as live reload, automatic scss/less/etc compilation, and ease of extensibility for standard production build processes. They're key in decoupling code.
|
||||||
|
|
||||||
## Package openmctweb as single versioned file.
|
## Package openmctweb as single versioned file.
|
||||||
|
|
||||||
@ -145,7 +145,7 @@ Then, if we're using imperative methods for extending the application we can use
|
|||||||
<script>
|
<script>
|
||||||
// can configure from object
|
// can configure from object
|
||||||
var myApp = new OpenMCTWeb({
|
var myApp = new OpenMCTWeb({
|
||||||
persitence: {
|
persistence: {
|
||||||
providers: [
|
providers: [
|
||||||
{
|
{
|
||||||
type: 'elastic',
|
type: 'elastic',
|
||||||
|
@ -1,4 +1,4 @@
|
|||||||
# Open MCT Web Developer Guide
|
# Open MCT Developer Guide
|
||||||
Victor Woeltjen
|
Victor Woeltjen
|
||||||
|
|
||||||
[victor.woeltjen@nasa.gov](mailto:victor.woeltjen@nasa.gov)
|
[victor.woeltjen@nasa.gov](mailto:victor.woeltjen@nasa.gov)
|
||||||
@ -18,24 +18,24 @@ April 5, 2016 | 1.2 | Added Mct-table directive | Andrew Henry
|
|||||||
The purpose of this guide is to familiarize software developers with the Open
|
The purpose of this guide is to familiarize software developers with the Open
|
||||||
MCT Web platform.
|
MCT Web platform.
|
||||||
|
|
||||||
## What is Open MCT Web
|
## What is Open MCT
|
||||||
Open MCT Web is a platform for building user interface and display tools,
|
Open MCT is a platform for building user interface and display tools,
|
||||||
developed at the NASA Ames Research Center in collaboration with teams at the
|
developed at the NASA Ames Research Center in collaboration with teams at the
|
||||||
Jet Propulsion Laboratory. It is written in HTML5, CSS3, and JavaScript, using
|
Jet Propulsion Laboratory. It is written in HTML5, CSS3, and JavaScript, using
|
||||||
[AngularJS](http://www.angularjs.org) as a framework. Its intended use is to
|
[AngularJS](http://www.angularjs.org) as a framework. Its intended use is to
|
||||||
create single-page web applications which integrate data and behavior from a
|
create single-page web applications which integrate data and behavior from a
|
||||||
variety of sources and domains.
|
variety of sources and domains.
|
||||||
|
|
||||||
Open MCT Web has been developed to support the remote operation of space
|
Open MCT has been developed to support the remote operation of space
|
||||||
vehicles, so some of its features are specific to that task; however, it is
|
vehicles, so some of its features are specific to that task; however, it is
|
||||||
flexible enough to be adapted to a variety of other application domains where a
|
flexible enough to be adapted to a variety of other application domains where a
|
||||||
display tool oriented toward browsing, composing, and visualizing would be
|
display tool oriented toward browsing, composing, and visualizing would be
|
||||||
useful.
|
useful.
|
||||||
|
|
||||||
Open MCT Web provides:
|
Open MCT provides:
|
||||||
|
|
||||||
* A common user interface paradigm which can be applied to a variety of domains
|
* A common user interface paradigm which can be applied to a variety of domains
|
||||||
and tasks. Open MCT Web is more than a widget toolkit - it provides a standard
|
and tasks. Open MCT is more than a widget toolkit - it provides a standard
|
||||||
tree-on-the-left, view-on-the-right browsing environment which you customize by
|
tree-on-the-left, view-on-the-right browsing environment which you customize by
|
||||||
adding new browsable object types, visualizations, and back-end adapters.
|
adding new browsable object types, visualizations, and back-end adapters.
|
||||||
* A plugin framework and an extensible API for introducing new application
|
* A plugin framework and an extensible API for introducing new application
|
||||||
@ -44,17 +44,17 @@ features of a variety of types.
|
|||||||
visualizations and infrastructure specific to telemetry display.
|
visualizations and infrastructure specific to telemetry display.
|
||||||
|
|
||||||
## Client-Server Relationship
|
## Client-Server Relationship
|
||||||
Open MCT Web is client software - it runs entirely in the user's web browser. As
|
Open MCT is client software - it runs entirely in the user's web browser. As
|
||||||
such, it is largely 'server agnostic'; any web server capable of serving files
|
such, it is largely 'server agnostic'; any web server capable of serving files
|
||||||
from paths is capable of providing Open MCT Web.
|
from paths is capable of providing Open MCT.
|
||||||
|
|
||||||
While Open MCT Web can be configured to run as a standalone client, this is
|
While Open MCT can be configured to run as a standalone client, this is
|
||||||
rarely very useful. Instead, it is intended to be used as a display and
|
rarely very useful. Instead, it is intended to be used as a display and
|
||||||
interaction layer for information obtained from a variety of back-end services.
|
interaction layer for information obtained from a variety of back-end services.
|
||||||
Doing so requires authoring or utilizing adapter plugins which allow Open MCT
|
Doing so requires authoring or utilizing adapter plugins which allow Open MCT
|
||||||
Web to interact with these services.
|
Web to interact with these services.
|
||||||
|
|
||||||
Typically, the pattern here is to provide a known interface that Open MCT Web
|
Typically, the pattern here is to provide a known interface that Open MCT
|
||||||
can utilize, and implement it such that it interacts with whatever back-end
|
can utilize, and implement it such that it interacts with whatever back-end
|
||||||
provides the relevant information. Examples of back-ends that can be utilized in
|
provides the relevant information. Examples of back-ends that can be utilized in
|
||||||
this fashion include databases for the persistence of user-created objects, or
|
this fashion include databases for the persistence of user-created objects, or
|
||||||
@ -63,52 +63,52 @@ sources of telemetry data.
|
|||||||
See the [Architecture Guide](../architecture/index.md#Overview) for information
|
See the [Architecture Guide](../architecture/index.md#Overview) for information
|
||||||
on the client-server relationship.
|
on the client-server relationship.
|
||||||
|
|
||||||
## Developing with Open MCT Web
|
## Developing with Open MCT
|
||||||
Building applications with Open MCT Web typically means authoring and utilizing
|
Building applications with Open MCT typically means authoring and utilizing
|
||||||
a set of plugins which provide application-specific details about how Open MCT
|
a set of plugins which provide application-specific details about how Open MCT
|
||||||
Web should behave.
|
Web should behave.
|
||||||
|
|
||||||
### Technologies
|
### Technologies
|
||||||
|
|
||||||
Open MCT Web sources are written in JavaScript, with a number of configuration
|
Open MCT sources are written in JavaScript, with a number of configuration
|
||||||
files written in JSON. Displayable components are written in HTML5 and CSS3.
|
files written in JSON. Displayable components are written in HTML5 and CSS3.
|
||||||
Open MCT Web is built using [AngularJS](http://www.angularjs.org) from Google. A
|
Open MCT is built using [AngularJS](http://www.angularjs.org) from Google. A
|
||||||
good understanding of Angular is recommended for developers working with Open
|
good understanding of Angular is recommended for developers working with Open
|
||||||
MCT Web.
|
MCT Web.
|
||||||
|
|
||||||
### Forking
|
### Forking
|
||||||
Open MCT Web does not currently have a single stand-alone artifact that can be
|
Open MCT does not currently have a single stand-alone artifact that can be
|
||||||
used as a library. Instead, the recommended approach for creating a new
|
used as a library. Instead, the recommended approach for creating a new
|
||||||
application is to start by forking/branching Open MCT Web, and then adding new
|
application is to start by forking/branching Open MCT, and then adding new
|
||||||
features from there. Put another way, Open MCT Web's source structure is built
|
features from there. Put another way, Open MCT's source structure is built
|
||||||
to serve as a template for specific applications.
|
to serve as a template for specific applications.
|
||||||
|
|
||||||
Forking in this manner should not require that you edit Open MCT Web's sources.
|
Forking in this manner should not require that you edit Open MCT's sources.
|
||||||
The preferred approach is to create a new directory (peer to `index.html`) for
|
The preferred approach is to create a new directory (peer to `index.html`) for
|
||||||
the new application, then add new bundles (as described in the Framework
|
the new application, then add new bundles (as described in the Framework
|
||||||
chapter) within that directory.
|
chapter) within that directory.
|
||||||
|
|
||||||
To initially clone the Open MCT Web repository:
|
To initially clone the Open MCT repository:
|
||||||
`git clone <repository URL> <local repo directory> -b open-master`
|
`git clone <repository URL> <local repo directory> -b open-master`
|
||||||
|
|
||||||
To create a fork to begin working on a new application using Open MCT Web:
|
To create a fork to begin working on a new application using Open MCT:
|
||||||
|
|
||||||
cd <local repo directory>
|
cd <local repo directory>
|
||||||
git checkout open-master
|
git checkout open-master
|
||||||
git checkout -b <new branch name>
|
git checkout -b <new branch name>
|
||||||
|
|
||||||
As a convention used internally, applications built using Open MCT Web have
|
As a convention used internally, applications built using Open MCT have
|
||||||
master branch names with an identifying prefix. For instance, if building an
|
master branch names with an identifying prefix. For instance, if building an
|
||||||
application called 'Foo', the last statement above would look like:
|
application called 'Foo', the last statement above would look like:
|
||||||
|
|
||||||
git checkout -b foo-master
|
git checkout -b foo-master
|
||||||
|
|
||||||
This convention is not enforced or understood by Open MCT Web in any way; it is
|
This convention is not enforced or understood by Open MCT in any way; it is
|
||||||
mentioned here as a more general recommendation.
|
mentioned here as a more general recommendation.
|
||||||
|
|
||||||
# Overview
|
# Overview
|
||||||
|
|
||||||
Open MCT Web is implemented as a framework component which manages a set of
|
Open MCT is implemented as a framework component which manages a set of
|
||||||
other components. These components, called _bundles_, act as containers to group
|
other components. These components, called _bundles_, act as containers to group
|
||||||
sets of related functionality; individual units of functionality are expressed
|
sets of related functionality; individual units of functionality are expressed
|
||||||
within these bundles as _extensions_.
|
within these bundles as _extensions_.
|
||||||
@ -119,7 +119,7 @@ run-time to satisfy these declared dependency. This dependency injection
|
|||||||
approach allows software components which have been authored separately (e.g. as
|
approach allows software components which have been authored separately (e.g. as
|
||||||
plugins) but to collaborate at run-time.
|
plugins) but to collaborate at run-time.
|
||||||
|
|
||||||
Open MCT Web's framework layer is implemented on top of AngularJS's [dependency
|
Open MCT's framework layer is implemented on top of AngularJS's [dependency
|
||||||
injection mechanism](https://docs.angularjs.org/guide/di) and is modelled after
|
injection mechanism](https://docs.angularjs.org/guide/di) and is modelled after
|
||||||
[OSGi](hhttp://www.osgi.org/) and its [Declarative Services component model](http://wiki.osgi.org/wiki/Declarative_Services).
|
[OSGi](hhttp://www.osgi.org/) and its [Declarative Services component model](http://wiki.osgi.org/wiki/Declarative_Services).
|
||||||
In particular, this is where the term _bundle_ comes from.
|
In particular, this is where the term _bundle_ comes from.
|
||||||
@ -134,7 +134,7 @@ The framework is described in more detail in the [Framework Overview](../archite
|
|||||||
architecture guide.
|
architecture guide.
|
||||||
|
|
||||||
### Tiers
|
### Tiers
|
||||||
While all bundles in a running Open MCT Web instance are effectively peers, it
|
While all bundles in a running Open MCT instance are effectively peers, it
|
||||||
is useful to think of them as a tiered architecture, where each tier adds more
|
is useful to think of them as a tiered architecture, where each tier adds more
|
||||||
specificity to the application.
|
specificity to the application.
|
||||||
```nomnoml
|
```nomnoml
|
||||||
@ -152,7 +152,7 @@ It additionally interprets bundle definitions (see explanation below, as well as
|
|||||||
further detail in the Framework chapter.) At this tier, we are at our most
|
further detail in the Framework chapter.) At this tier, we are at our most
|
||||||
general: We know only that we are a plugin-based application.
|
general: We know only that we are a plugin-based application.
|
||||||
* __Platform__: Components in the Platform tier describe both the general user
|
* __Platform__: Components in the Platform tier describe both the general user
|
||||||
interface and corresponding developer-facing interfaces of Open MCT Web. This
|
interface and corresponding developer-facing interfaces of Open MCT. This
|
||||||
tier provides the general infrastructure for applications. It is less general
|
tier provides the general infrastructure for applications. It is less general
|
||||||
than the framework tier, insofar as this tier introduces a specific user
|
than the framework tier, insofar as this tier introduces a specific user
|
||||||
interface paradigm, but it is still non-specific as to what useful features
|
interface paradigm, but it is still non-specific as to what useful features
|
||||||
@ -160,7 +160,7 @@ will be provided. Although they can be removed or replaced easily, bundles
|
|||||||
provided by the Platform tier generally should not be thought of as optional.
|
provided by the Platform tier generally should not be thought of as optional.
|
||||||
* __Application__: The application tier consists of components which utilize the
|
* __Application__: The application tier consists of components which utilize the
|
||||||
infrastructure provided by the Platform to provide functionality which will (or
|
infrastructure provided by the Platform to provide functionality which will (or
|
||||||
could) be useful to specific applications built using Open MCT Web. These
|
could) be useful to specific applications built using Open MCT. These
|
||||||
include adapters to specific persistence back-ends (such as ElasticSearch or
|
include adapters to specific persistence back-ends (such as ElasticSearch or
|
||||||
CouchDB) as well as bundles which describe more user-facing features (such as
|
CouchDB) as well as bundles which describe more user-facing features (such as
|
||||||
_Plot_ views for visualizing time series data, or _Layout_ objects for
|
_Plot_ views for visualizing time series data, or _Layout_ objects for
|
||||||
@ -169,20 +169,20 @@ compromising basic application functionality, with the caveat that at least one
|
|||||||
persistence adapter needs to be present.
|
persistence adapter needs to be present.
|
||||||
* __Plugins__: Conceptually, this tier is not so different from the application
|
* __Plugins__: Conceptually, this tier is not so different from the application
|
||||||
tier; it consists of bundles describing new features, back-end adapters, that
|
tier; it consists of bundles describing new features, back-end adapters, that
|
||||||
are specific to the application being built on Open MCT Web. It is described as
|
are specific to the application being built on Open MCT. It is described as
|
||||||
a separate tier here because it has one important distinction from the
|
a separate tier here because it has one important distinction from the
|
||||||
application tier: It consists of bundles that are not included with the platform
|
application tier: It consists of bundles that are not included with the platform
|
||||||
(either authored anew for the specific application, or obtained from elsewhere.)
|
(either authored anew for the specific application, or obtained from elsewhere.)
|
||||||
|
|
||||||
Note that bundles in any tier can go off and consult back-end services. In
|
Note that bundles in any tier can go off and consult back-end services. In
|
||||||
practice, this responsibility is handled at the Application and/or Plugin tiers;
|
practice, this responsibility is handled at the Application and/or Plugin tiers;
|
||||||
Open MCT Web is built to be server-agnostic, so any back-end is considered an
|
Open MCT is built to be server-agnostic, so any back-end is considered an
|
||||||
application-specific detail.
|
application-specific detail.
|
||||||
|
|
||||||
## Platform Overview
|
## Platform Overview
|
||||||
|
|
||||||
The "tiered" architecture described in the preceding text describes a way of
|
The "tiered" architecture described in the preceding text describes a way of
|
||||||
thinking of and categorizing software components of a Open MCT Web application,
|
thinking of and categorizing software components of a Open MCT application,
|
||||||
as well as the framework layer's role in mediating between these components.
|
as well as the framework layer's role in mediating between these components.
|
||||||
Once the framework layer has wired these software components together, however,
|
Once the framework layer has wired these software components together, however,
|
||||||
the application's logical architecture emerges.
|
the application's logical architecture emerges.
|
||||||
@ -193,7 +193,7 @@ section of the Platform guide
|
|||||||
|
|
||||||
### Web Services
|
### Web Services
|
||||||
|
|
||||||
As mentioned in the Introduction, Open MCT Web is a platform single-page
|
As mentioned in the Introduction, Open MCT is a platform single-page
|
||||||
applications which runs entirely in the browser. Most applications will want to
|
applications which runs entirely in the browser. Most applications will want to
|
||||||
additionally interact with server-side resources, to (for example) read
|
additionally interact with server-side resources, to (for example) read
|
||||||
telemetry data or store user-created objects. This interaction is handled by
|
telemetry data or store user-created objects. This interaction is handled by
|
||||||
@ -206,7 +206,7 @@ individual bundles using APIs which are supported in browser (such as
|
|||||||
[Web Service #2] <- [Web Browser]
|
[Web Service #2] <- [Web Browser]
|
||||||
[Web Service #3] <- [Web Browser]
|
[Web Service #3] <- [Web Browser]
|
||||||
[<package> Web Browser |
|
[<package> Web Browser |
|
||||||
[<package> Open MCT Web |
|
[<package> Open MCT |
|
||||||
[Plugin Bundle #1]-->[Core API]
|
[Plugin Bundle #1]-->[Core API]
|
||||||
[Core API]<--[Plugin Bundle #2]
|
[Core API]<--[Plugin Bundle #2]
|
||||||
[Platform Bundle #1]-->[Core API]
|
[Platform Bundle #1]-->[Core API]
|
||||||
@ -216,16 +216,16 @@ individual bundles using APIs which are supported in browser (such as
|
|||||||
[Core API]<--[Platform Bundle #5]
|
[Core API]<--[Platform Bundle #5]
|
||||||
[Core API]<--[Plugin Bundle #3]
|
[Core API]<--[Plugin Bundle #3]
|
||||||
]
|
]
|
||||||
[Open MCT Web] ->[Browser APIs]
|
[Open MCT] ->[Browser APIs]
|
||||||
]
|
]
|
||||||
```
|
```
|
||||||
|
|
||||||
This architectural approach ensures a loose coupling between applications built
|
This architectural approach ensures a loose coupling between applications built
|
||||||
using Open MCT Web and the backends which support them.
|
using Open MCT and the backends which support them.
|
||||||
|
|
||||||
### Glossary
|
### Glossary
|
||||||
|
|
||||||
Certain terms are used throughout Open MCT Web with consistent meanings or
|
Certain terms are used throughout Open MCT with consistent meanings or
|
||||||
conventions. Other developer documentation, particularly in-line documentation,
|
conventions. Other developer documentation, particularly in-line documentation,
|
||||||
may presume an understanding of these terms.
|
may presume an understanding of these terms.
|
||||||
|
|
||||||
@ -247,7 +247,7 @@ readable description of a thing; usually a single sentence or short paragraph.
|
|||||||
(Most often used in the context of extensions, domain object models, or other
|
(Most often used in the context of extensions, domain object models, or other
|
||||||
similar application-specific objects.)
|
similar application-specific objects.)
|
||||||
* __domain object__: A meaningful object to the user; a distinct thing in the
|
* __domain object__: A meaningful object to the user; a distinct thing in the
|
||||||
work support by Open MCT Web. Anything that appears in the left-hand tree is a
|
work support by Open MCT. Anything that appears in the left-hand tree is a
|
||||||
domain object.
|
domain object.
|
||||||
* __extension__: An extension is a unit of functionality exposed to the platform
|
* __extension__: An extension is a unit of functionality exposed to the platform
|
||||||
in a declarative fashion by a bundle. The term 'extension category' is used to
|
in a declarative fashion by a bundle. The term 'extension category' is used to
|
||||||
@ -279,10 +279,10 @@ side-by-side without conflicting.
|
|||||||
|
|
||||||
# Framework
|
# Framework
|
||||||
|
|
||||||
Open MCT Web is built on the [AngularJS framework]( http://www.angularjs.org ). A
|
Open MCT is built on the [AngularJS framework]( http://www.angularjs.org ). A
|
||||||
good understanding of that framework is recommended.
|
good understanding of that framework is recommended.
|
||||||
|
|
||||||
Open MCT Web adds an extra layer on top of AngularJS to (a) generalize its
|
Open MCT adds an extra layer on top of AngularJS to (a) generalize its
|
||||||
dependency injection mechanism slightly, particularly to handle many-to-one
|
dependency injection mechanism slightly, particularly to handle many-to-one
|
||||||
relationships; and (b) handle script loading. Combined, these features become a
|
relationships; and (b) handle script loading. Combined, these features become a
|
||||||
plugin mechanism.
|
plugin mechanism.
|
||||||
@ -301,7 +301,7 @@ MCT Web.)
|
|||||||
are collected together in bundles, and may interact with other extensions.
|
are collected together in bundles, and may interact with other extensions.
|
||||||
|
|
||||||
The framework layer, loaded and initiated from `index.html`, is the main point
|
The framework layer, loaded and initiated from `index.html`, is the main point
|
||||||
of entry for an application built on Open MCT Web. It is responsible for wiring
|
of entry for an application built on Open MCT. It is responsible for wiring
|
||||||
together the application at run time (much of this responsibility is actually
|
together the application at run time (much of this responsibility is actually
|
||||||
delegated to Angular); at a high-level, the framework does this by proceeding
|
delegated to Angular); at a high-level, the framework does this by proceeding
|
||||||
through four stages:
|
through four stages:
|
||||||
@ -321,7 +321,7 @@ have been registered.
|
|||||||
|
|
||||||
## Bundles
|
## Bundles
|
||||||
|
|
||||||
The basic configurable unit of Open MCT Web is the _bundle_. This term has been
|
The basic configurable unit of Open MCT is the _bundle_. This term has been
|
||||||
used a bit already; now we'll get to a more formal definition.
|
used a bit already; now we'll get to a more formal definition.
|
||||||
|
|
||||||
A bundle is a directory which contains:
|
A bundle is a directory which contains:
|
||||||
@ -329,13 +329,13 @@ A bundle is a directory which contains:
|
|||||||
* A bundle definition; a file named `bundle.json`.
|
* A bundle definition; a file named `bundle.json`.
|
||||||
* Subdirectories for sources, resources, and tests.
|
* Subdirectories for sources, resources, and tests.
|
||||||
* Optionally, a `README.md` Markdown file describing its contents (this is not
|
* Optionally, a `README.md` Markdown file describing its contents (this is not
|
||||||
used by Open MCT Web in any way, but it's a helpful convention to follow.)
|
used by Open MCT in any way, but it's a helpful convention to follow.)
|
||||||
|
|
||||||
The bundle definition is the main point of entry for the bundle. The framework
|
The bundle definition is the main point of entry for the bundle. The framework
|
||||||
looks at this to determine which components need to be loaded and how they
|
looks at this to determine which components need to be loaded and how they
|
||||||
interact.
|
interact.
|
||||||
|
|
||||||
A plugin in Open MCT Web is a bundle. The platform itself is also decomposed
|
A plugin in Open MCT is a bundle. The platform itself is also decomposed
|
||||||
into bundles, each of which provides some category of functionality. The
|
into bundles, each of which provides some category of functionality. The
|
||||||
difference between a _bundle_ and a _plugin_ is purely a matter of the intended
|
difference between a _bundle_ and a _plugin_ is purely a matter of the intended
|
||||||
use; a plugin is just a bundle that is meant to be easily added or removed. When
|
use; a plugin is just a bundle that is meant to be easily added or removed. When
|
||||||
@ -356,7 +356,7 @@ For instance, if `bundles.json` contained:
|
|||||||
"example/extensions"
|
"example/extensions"
|
||||||
]
|
]
|
||||||
|
|
||||||
...then the Open MCT Web framework would look for bundle definitions at
|
...then the Open MCT framework would look for bundle definitions at
|
||||||
`example/builtins/bundle.json` and `example/extensions/bundle.json`, relative
|
`example/builtins/bundle.json` and `example/extensions/bundle.json`, relative
|
||||||
to the path of `index.html`. No other bundles would be loaded.
|
to the path of `index.html`. No other bundles would be loaded.
|
||||||
|
|
||||||
@ -425,14 +425,14 @@ tests, as well as a file named `suite.json` describing which files to test.
|
|||||||
Should have the same folder structure as the `src` directory; see the section on
|
Should have the same folder structure as the `src` directory; see the section on
|
||||||
automated testing for more information.
|
automated testing for more information.
|
||||||
|
|
||||||
For example, the directory structure for bundle `platform/commonUI/about` looks
|
For example, the directory structure for bundle `platform/commonUI/dialog` looks
|
||||||
like:
|
like:
|
||||||
|
|
||||||
Platform
|
Platform
|
||||||
|
|
|
|
||||||
|-commonUI
|
|-commonUI
|
||||||
|
|
|
|
||||||
+-about
|
+-dialog
|
||||||
|
|
|
|
||||||
|-res
|
|-res
|
||||||
|
|
|
|
||||||
@ -457,7 +457,7 @@ arrays of extension definitions.
|
|||||||
### General Extensions
|
### General Extensions
|
||||||
|
|
||||||
Extensions are intended as a general-purpose mechanism for adding new types of
|
Extensions are intended as a general-purpose mechanism for adding new types of
|
||||||
functionality to Open MCT Web.
|
functionality to Open MCT.
|
||||||
|
|
||||||
An extension category is registered with Angular under the name of the
|
An extension category is registered with Angular under the name of the
|
||||||
extension, plus a suffix of two square brackets; so, an Angular service (or,
|
extension, plus a suffix of two square brackets; so, an Angular service (or,
|
||||||
@ -466,7 +466,7 @@ extensions, from all bundles, by including this string (e.g. `types[]` to get
|
|||||||
all type definitions) in a dependency declaration.
|
all type definitions) in a dependency declaration.
|
||||||
|
|
||||||
As a convention, extension categories are given single-word, plural nouns for
|
As a convention, extension categories are given single-word, plural nouns for
|
||||||
names within Open MCT Web (e.g. `types`.) This convention is not enforced by the
|
names within Open MCT (e.g. `types`.) This convention is not enforced by the
|
||||||
platform in any way. For extension categories introduced by external plugins, it
|
platform in any way. For extension categories introduced by external plugins, it
|
||||||
is recommended to prefix the extension category with a vendor identifier (or
|
is recommended to prefix the extension category with a vendor identifier (or
|
||||||
similar) followed by a dot, to avoid collisions.
|
similar) followed by a dot, to avoid collisions.
|
||||||
@ -505,7 +505,7 @@ the Angular-supported method for dependency injection is (effectively)
|
|||||||
constructor-style injection; so, both declared dependencies and run-time
|
constructor-style injection; so, both declared dependencies and run-time
|
||||||
arguments are competing for space in a constructor's arguments.
|
arguments are competing for space in a constructor's arguments.
|
||||||
|
|
||||||
To resolve this, the Open MCT Web framework registers extension instances in a
|
To resolve this, the Open MCT framework registers extension instances in a
|
||||||
partially constructed form. That is, the constructor exposed by the extension's
|
partially constructed form. That is, the constructor exposed by the extension's
|
||||||
implementation is effectively decomposed into two calls; the first takes the
|
implementation is effectively decomposed into two calls; the first takes the
|
||||||
dependencies, and returns the constructor in its second form, which takes the
|
dependencies, and returns the constructor in its second form, which takes the
|
||||||
@ -549,7 +549,7 @@ sorted according to these conventions when using them.
|
|||||||
### Angular Built-ins
|
### Angular Built-ins
|
||||||
|
|
||||||
Several entities supported Angular are expressed and managed as extensions in
|
Several entities supported Angular are expressed and managed as extensions in
|
||||||
Open MCT Web. Specifically, these extension categories are _directives_,
|
Open MCT. Specifically, these extension categories are _directives_,
|
||||||
_controllers_, _services_, _constants_, _runs_, and _routes_.
|
_controllers_, _services_, _constants_, _runs_, and _routes_.
|
||||||
|
|
||||||
#### Angular Directives
|
#### Angular Directives
|
||||||
@ -592,7 +592,7 @@ property value , which is the constant value that will be registered.
|
|||||||
In some cases, you want to register code to run as soon as the application
|
In some cases, you want to register code to run as soon as the application
|
||||||
starts; these can be registered as extensions of the [ runs category](https://docs.angularjs.org/api/ng/type/angular.Module#run ).
|
starts; these can be registered as extensions of the [ runs category](https://docs.angularjs.org/api/ng/type/angular.Module#run ).
|
||||||
Implementations registered in this category will be invoked (with their declared
|
Implementations registered in this category will be invoked (with their declared
|
||||||
dependencies) when the Open MCT Web application first starts. (Note that, in
|
dependencies) when the Open MCT application first starts. (Note that, in
|
||||||
this case, the implementation is better thought of as just a function, as
|
this case, the implementation is better thought of as just a function, as
|
||||||
opposed to a constructor function.)
|
opposed to a constructor function.)
|
||||||
|
|
||||||
@ -627,13 +627,13 @@ providers of the same service (that is, with matching `provides` properties);
|
|||||||
for a decorator, this will be whichever provider, decorator, or aggregator is
|
for a decorator, this will be whichever provider, decorator, or aggregator is
|
||||||
next in the sequence of decorators.
|
next in the sequence of decorators.
|
||||||
|
|
||||||
Services exposed by the Open MCT Web platform are often declared as composite
|
Services exposed by the Open MCT platform are often declared as composite
|
||||||
services, as this form is open for a variety of common modifications.
|
services, as this form is open for a variety of common modifications.
|
||||||
|
|
||||||
# Core API
|
# Core API
|
||||||
|
|
||||||
Most of Open MCT Web's relevant API is provided and/or mediated by the
|
Most of Open MCT's relevant API is provided and/or mediated by the
|
||||||
framework; that is, much of developing for Open MCT Web is a matter of adding
|
framework; that is, much of developing for Open MCT is a matter of adding
|
||||||
extensions which access other parts of the platform by means of dependency
|
extensions which access other parts of the platform by means of dependency
|
||||||
injection.
|
injection.
|
||||||
|
|
||||||
@ -642,9 +642,9 @@ to be passed along by other services.
|
|||||||
|
|
||||||
## Domain Objects
|
## Domain Objects
|
||||||
|
|
||||||
Domain objects are the most fundamental component of Open MCT Web's information
|
Domain objects are the most fundamental component of Open MCT's information
|
||||||
model. A domain object is some distinct thing relevant to a user's work flow,
|
model. A domain object is some distinct thing relevant to a user's workflow,
|
||||||
such as a telemetry channel, display, or similar. Open MCT Web is a tool for
|
such as a telemetry channel, display, or similar. Open MCT is a tool for
|
||||||
viewing, browsing, manipulating, and otherwise interacting with a graph of
|
viewing, browsing, manipulating, and otherwise interacting with a graph of
|
||||||
domain objects.
|
domain objects.
|
||||||
|
|
||||||
@ -681,7 +681,7 @@ exposed.
|
|||||||
### Identifier Syntax
|
### Identifier Syntax
|
||||||
|
|
||||||
For most purposes, a domain object identifier can be treated as a purely
|
For most purposes, a domain object identifier can be treated as a purely
|
||||||
symbolic string; these are typically generated by Open MCT Web and plug-ins
|
symbolic string; these are typically generated by Open MCT and plug-ins
|
||||||
should rarely be concerned with its internal structure.
|
should rarely be concerned with its internal structure.
|
||||||
|
|
||||||
A domain object identifier has one or two parts, separated by a colon.
|
A domain object identifier has one or two parts, separated by a colon.
|
||||||
@ -724,7 +724,7 @@ exposed it to be removed from its container.
|
|||||||
containing:
|
containing:
|
||||||
* `name`: Human-readable name.
|
* `name`: Human-readable name.
|
||||||
* `description`: Human-readable summary of this action.
|
* `description`: Human-readable summary of this action.
|
||||||
* `glyph`: Single character to be displayed in Open MCT Web's icon font set.
|
* `glyph`: Single character to be displayed in Open MCT's icon font set.
|
||||||
* `context`: The context in which this action is being performed (see below)
|
* `context`: The context in which this action is being performed (see below)
|
||||||
|
|
||||||
Action instances are typically obtained via a domain object's `action`
|
Action instances are typically obtained via a domain object's `action`
|
||||||
@ -740,7 +740,7 @@ dragged object in a drag-and-drop operation.)
|
|||||||
|
|
||||||
## Telemetry
|
## Telemetry
|
||||||
|
|
||||||
Telemetry series data in Open MCT Web is represented by a common interface, and
|
Telemetry series data in Open MCT is represented by a common interface, and
|
||||||
packaged in a consistent manner to facilitate passing telemetry updates around
|
packaged in a consistent manner to facilitate passing telemetry updates around
|
||||||
multiple visualizations.
|
multiple visualizations.
|
||||||
|
|
||||||
@ -753,7 +753,7 @@ is useful when multiple distinct data sources are in use side-by-side.
|
|||||||
* `key`: A machine-readable identifier for a unique series of telemetry within
|
* `key`: A machine-readable identifier for a unique series of telemetry within
|
||||||
that source.
|
that source.
|
||||||
* _Note: This API is still under development; additional properties, such as
|
* _Note: This API is still under development; additional properties, such as
|
||||||
start and end time, should be present in future versions of Open MCT Web._
|
start and end time, should be present in future versions of Open MCT._
|
||||||
|
|
||||||
Additional properties may be included in telemetry requests which have specific
|
Additional properties may be included in telemetry requests which have specific
|
||||||
interpretations for specific sources.
|
interpretations for specific sources.
|
||||||
@ -777,7 +777,7 @@ not. (Typically, domain values are interpreted as UTC timestamps in milliseconds
|
|||||||
relative to the UNIX epoch.) A series must have at least one domain and one
|
relative to the UNIX epoch.) A series must have at least one domain and one
|
||||||
range, and may have more than one.
|
range, and may have more than one.
|
||||||
|
|
||||||
Telemetry series data in Open MCT Web is expressed via the following
|
Telemetry series data in Open MCT is expressed via the following
|
||||||
`TelemetrySeries` interface:
|
`TelemetrySeries` interface:
|
||||||
|
|
||||||
* `getPointCount()`: Returns the number of unique points/samples in this series.
|
* `getPointCount()`: Returns the number of unique points/samples in this series.
|
||||||
@ -816,7 +816,7 @@ interface:
|
|||||||
* `getName()`: Get the human-readable name for this type.
|
* `getName()`: Get the human-readable name for this type.
|
||||||
* `getDescription()`: Get a human-readable summary of this type.
|
* `getDescription()`: Get a human-readable summary of this type.
|
||||||
* `getGlyph()`: Get the single character to be rendered as an icon for this type
|
* `getGlyph()`: Get the single character to be rendered as an icon for this type
|
||||||
in Open MCT Web's custom font set.
|
in Open MCT's custom font set.
|
||||||
* `getInitialModel()`: Get a domain object model that represents the initial
|
* `getInitialModel()`: Get a domain object model that represents the initial
|
||||||
state (before user specification of properties) for domain objects of this type.
|
state (before user specification of properties) for domain objects of this type.
|
||||||
* `getDefinition()`: Get the extension definition for this type, as a JavaScript
|
* `getDefinition()`: Get the extension definition for this type, as a JavaScript
|
||||||
@ -832,7 +832,7 @@ an array of `TypeProperty` instances.
|
|||||||
### Type Features
|
### Type Features
|
||||||
|
|
||||||
Features of a domain object type are expressed as symbolic string identifiers.
|
Features of a domain object type are expressed as symbolic string identifiers.
|
||||||
They are defined in practice by usage; currently, the Open MCT Web platform only
|
They are defined in practice by usage; currently, the Open MCT platform only
|
||||||
uses the creation feature to determine which domain object types should appear
|
uses the creation feature to determine which domain object types should appear
|
||||||
in the Create menu.
|
in the Create menu.
|
||||||
|
|
||||||
@ -886,7 +886,7 @@ Categories supported by the platform include:
|
|||||||
* `key`: A machine-readable identifier for this action.
|
* `key`: A machine-readable identifier for this action.
|
||||||
* `name`: A human-readable name for this action (e.g. to show in a menu)
|
* `name`: A human-readable name for this action (e.g. to show in a menu)
|
||||||
* `description`: A human-readable summary of the behavior of this action.
|
* `description`: A human-readable summary of the behavior of this action.
|
||||||
* `glyph`: A single character which will be rendered in Open MCT Web's custom
|
* `glyph`: A single character which will be rendered in Open MCT's custom
|
||||||
font set as an icon for this action.
|
font set as an icon for this action.
|
||||||
|
|
||||||
## Capabilities Category
|
## Capabilities Category
|
||||||
@ -933,15 +933,22 @@ Note that `templateUrl` is not supported for `containers`.
|
|||||||
|
|
||||||
Controls provide options for the `mct-control` directive.
|
Controls provide options for the `mct-control` directive.
|
||||||
|
|
||||||
Six standard control types are included in the forms bundle:
|
These standard control types are included in the forms bundle:
|
||||||
|
|
||||||
* `textfield`: An area to enter plain text.
|
* `textfield`: A text input to enter plain text.
|
||||||
|
* `numberfield`: A text input to enter numbers.
|
||||||
* `select`: A drop-down list of options.
|
* `select`: A drop-down list of options.
|
||||||
* `checkbox`: A box which may be checked/unchecked.
|
* `checkbox`: A box which may be checked/unchecked.
|
||||||
* `color`: A color picker.
|
* `color`: A color picker.
|
||||||
* `button`: A button.
|
* `button`: A button.
|
||||||
* `datetime`: An input for UTC date/time entry; gives result as a UNIX
|
* `datetime`: An input for UTC date/time entry; gives result as a UNIX
|
||||||
timestamp, in milliseconds since start of 1970, UTC.
|
timestamp, in milliseconds since start of 1970, UTC.
|
||||||
|
* `composite`: A control parenting an array of other controls.
|
||||||
|
* `menu-button`: A drop-down list of items supporting custom behavior
|
||||||
|
on click.
|
||||||
|
* `dialog-button`: A button which opens a dialog allowing a single property
|
||||||
|
to be edited.
|
||||||
|
* `radio`: A radio button.
|
||||||
|
|
||||||
New controls may be added as extensions of the controls category. Extensions of
|
New controls may be added as extensions of the controls category. Extensions of
|
||||||
this category have two properties:
|
this category have two properties:
|
||||||
@ -981,7 +988,7 @@ Examples of gestures included in the platform are:
|
|||||||
composition.
|
composition.
|
||||||
* `drop`: For representations that can be drop targets for drag-and-drop
|
* `drop`: For representations that can be drop targets for drag-and-drop
|
||||||
composition.
|
composition.
|
||||||
* `menu`: For representations that can be used to pop up a context menu.
|
* `menu`: For representations that can be used to popup a context menu.
|
||||||
|
|
||||||
Gesture definitions have a property `key` which is used as a machine-readable
|
Gesture definitions have a property `key` which is used as a machine-readable
|
||||||
identifier for the gesture (e.g. `drag`, `drop`, `menu` above.)
|
identifier for the gesture (e.g. `drag`, `drop`, `menu` above.)
|
||||||
@ -997,7 +1004,7 @@ of unremoved listeners.
|
|||||||
## Indicators Category
|
## Indicators Category
|
||||||
|
|
||||||
An indicator is an element that should appear in the status area at the bottom
|
An indicator is an element that should appear in the status area at the bottom
|
||||||
of a running Open MCT Web client instance.
|
of a running Open MCT client instance.
|
||||||
|
|
||||||
### Standard Indicators
|
### Standard Indicators
|
||||||
|
|
||||||
@ -1007,7 +1014,7 @@ provide implementations with the following methods:
|
|||||||
* `getText()`: Provides the human-readable text that will be displayed for this
|
* `getText()`: Provides the human-readable text that will be displayed for this
|
||||||
indicator.
|
indicator.
|
||||||
* `getGlyph()`: Provides a single-character string that will be displayed as an
|
* `getGlyph()`: Provides a single-character string that will be displayed as an
|
||||||
icon in Open MCT Web's custom font set.
|
icon in Open MCT's custom font set.
|
||||||
* `getDescription()`: Provides a human-readable summary of the current state of
|
* `getDescription()`: Provides a human-readable summary of the current state of
|
||||||
this indicator; will be displayed in a tooltip on hover.
|
this indicator; will be displayed in a tooltip on hover.
|
||||||
* `getClass()`: Get a CSS class that will be applied to this indicator.
|
* `getClass()`: Get a CSS class that will be applied to this indicator.
|
||||||
@ -1033,7 +1040,7 @@ this variety do not need to provide an implementation.
|
|||||||
## Licenses Category
|
## Licenses Category
|
||||||
|
|
||||||
The extension category `licenses` can be used to add entries into the 'Licensing
|
The extension category `licenses` can be used to add entries into the 'Licensing
|
||||||
information' page, reachable from Open MCT Web's About dialog.
|
information' page, reachable from Open MCT's About dialog.
|
||||||
|
|
||||||
Licenses may have the following properties, all of which are strings:
|
Licenses may have the following properties, all of which are strings:
|
||||||
|
|
||||||
@ -1046,11 +1053,11 @@ Licenses may have the following properties, all of which are strings:
|
|||||||
|
|
||||||
## Policies Category
|
## Policies Category
|
||||||
|
|
||||||
Policies are used to handle decisions made using Open MCT Web's `policyService`;
|
Policies are used to handle decisions made using Open MCT's `policyService`;
|
||||||
examples of these decisions are determining the applicability of certain
|
examples of these decisions are determining the applicability of certain
|
||||||
actions, or checking whether or not a domain object of one type can contain a
|
actions, or checking whether or not a domain object of one type can contain a
|
||||||
domain object of a different type. See the section on the Policies for an
|
domain object of a different type. See the section on the Policies for an
|
||||||
overview of Open MCT Web's policy model.
|
overview of Open MCT's policy model.
|
||||||
|
|
||||||
A policy's extension definition should include:
|
A policy's extension definition should include:
|
||||||
|
|
||||||
@ -1066,7 +1073,7 @@ context)`. The specific types used for `candidate` and `context` vary by policy
|
|||||||
category; in general, what is being asked is 'is this candidate allowed in this
|
category; in general, what is being asked is 'is this candidate allowed in this
|
||||||
context?' This method should return a boolean value.
|
context?' This method should return a boolean value.
|
||||||
|
|
||||||
Open MCT Web's policy model requires consensus; a policy decision is allowed
|
Open MCT's policy model requires consensus; a policy decision is allowed
|
||||||
when and only when all policies choose to allow it. As such, policies should
|
when and only when all policies choose to allow it. As such, policies should
|
||||||
generally be written to reject a certain case, and allow (by returning `true`)
|
generally be written to reject a certain case, and allow (by returning `true`)
|
||||||
anything else.
|
anything else.
|
||||||
@ -1153,7 +1160,7 @@ For example, the _My Items_ folder is added as an extension of this category.
|
|||||||
|
|
||||||
Extensions of this category should have the following properties:
|
Extensions of this category should have the following properties:
|
||||||
|
|
||||||
* `id`: The machine-readable identifier for the domaiwn object being exposed.
|
* `id`: The machine-readable identifier for the domain object being exposed.
|
||||||
* `model`: The model, as a JSON object, for the domain object being exposed.
|
* `model`: The model, as a JSON object, for the domain object being exposed.
|
||||||
|
|
||||||
## Stylesheets Category
|
## Stylesheets Category
|
||||||
@ -1195,7 +1202,7 @@ Templates do not have implementations.
|
|||||||
## Types Category
|
## Types Category
|
||||||
|
|
||||||
The types extension category describes types of domain objects which may
|
The types extension category describes types of domain objects which may
|
||||||
appear within Open MCT Web.
|
appear within Open MCT.
|
||||||
|
|
||||||
A type's extension definition should have the following properties:
|
A type's extension definition should have the following properties:
|
||||||
|
|
||||||
@ -1203,7 +1210,7 @@ A type's extension definition should have the following properties:
|
|||||||
stored to and matched against the type property of domain object models.
|
stored to and matched against the type property of domain object models.
|
||||||
* `name`: The human-readable name for this domain object type.
|
* `name`: The human-readable name for this domain object type.
|
||||||
* `description`: A human-readable summary of this domain object type.
|
* `description`: A human-readable summary of this domain object type.
|
||||||
* `glyph`: A single character to be rendered as an icon in Open MCT Web's custom
|
* `glyph`: A single character to be rendered as an icon in Open MCT's custom
|
||||||
font set.
|
font set.
|
||||||
* `model`: A domain object model, used as the initial state for created domain
|
* `model`: A domain object model, used as the initial state for created domain
|
||||||
objects of this type (before any properties are specified.)
|
objects of this type (before any properties are specified.)
|
||||||
@ -1252,7 +1259,7 @@ utilized via `mct-representation`); additionally:
|
|||||||
|
|
||||||
* `name`: The human-readable name for this view type.
|
* `name`: The human-readable name for this view type.
|
||||||
* description : A human-readable summary of this view type.
|
* description : A human-readable summary of this view type.
|
||||||
* `glyph`: A single character to be rendered as an icon in Open MCT Web's custom
|
* `glyph`: A single character to be rendered as an icon in Open MCT's custom
|
||||||
font set.
|
font set.
|
||||||
* `type`: Optional; if present, this representation is only applicable for
|
* `type`: Optional; if present, this representation is only applicable for
|
||||||
domain object's of this type.
|
domain object's of this type.
|
||||||
@ -1294,7 +1301,7 @@ are visible, and what state they manage and/or behavior they invoke.
|
|||||||
|
|
||||||
This set may contain up to two different objects: The _view proxy_, which is
|
This set may contain up to two different objects: The _view proxy_, which is
|
||||||
used to make changes to the view as a whole, and the _selected object_, which is
|
used to make changes to the view as a whole, and the _selected object_, which is
|
||||||
used to represent some state within the view. (Future versions of Open MCT Web
|
used to represent some state within the view. (Future versions of Open MCT
|
||||||
may support multiple selected objects.)
|
may support multiple selected objects.)
|
||||||
|
|
||||||
The `selection` object made available during Edit mode has the following
|
The `selection` object made available during Edit mode has the following
|
||||||
@ -1330,58 +1337,9 @@ are supported:
|
|||||||
|
|
||||||
# Directives
|
# Directives
|
||||||
|
|
||||||
Open MCT Web defines several Angular directives that are intended for use both
|
Open MCT defines several Angular directives that are intended for use both
|
||||||
internally within the platform, and by plugins.
|
internally within the platform, and by plugins.
|
||||||
|
|
||||||
## Before Unload
|
|
||||||
|
|
||||||
The `mct-before-unload` directive is used to listen for (and prompt for user
|
|
||||||
confirmation) of navigation changes in the browser. This includes reloading,
|
|
||||||
following links out of Open MCT Web, or changing routes. It is used to hook into
|
|
||||||
both `onbeforeunload` event handling as well as route changes from within
|
|
||||||
Angular.
|
|
||||||
|
|
||||||
This directive is useable as an attribute. Its value should be an Angular
|
|
||||||
expression. When an action that would trigger an unload and/or route change
|
|
||||||
occurs, this Angular expression is evaluated. Its result should be a message to
|
|
||||||
display to the user to confirm their navigation change; if this expression
|
|
||||||
evaluates to a falsy value, no message will be displayed.
|
|
||||||
|
|
||||||
## Chart
|
|
||||||
|
|
||||||
The `mct-chart` directive is used to support drawing of simple charts. It is
|
|
||||||
present to support the Plot view, and its functionality is limited to the
|
|
||||||
functionality that is relevant for that view.
|
|
||||||
|
|
||||||
This directive is used at the element level and takes one attribute, `draw`
|
|
||||||
which is an Angular expression which will should evaluate to a drawing object.
|
|
||||||
This drawing object should contain the following properties:
|
|
||||||
|
|
||||||
* `dimensions`: The size, in logical coordinates, of the chart area. A
|
|
||||||
two-element array or numbers.
|
|
||||||
* `origin`: The position, in logical coordinates, of the lower-left corner of
|
|
||||||
the chart area. A two-element array or numbers.
|
|
||||||
* `lines`: An array of lines (e.g. as a plot line) to draw, where each line is
|
|
||||||
expressed as an object containing:
|
|
||||||
* `buffer`: A Float32Array containing points in the line, in logical
|
|
||||||
coordinates, in sequential x,y pairs.
|
|
||||||
* `color`: The color of the line, as a four-element RGBA array, where
|
|
||||||
each element is a number in the range of 0.0-1.0.
|
|
||||||
* `points`: The number of points in the line.
|
|
||||||
* `boxes`: An array of rectangles to draw in the chart area. Each is an object
|
|
||||||
containing:
|
|
||||||
* `start`: The first corner of the rectangle, as a two-element array of
|
|
||||||
numbers, in logical coordinates.
|
|
||||||
* `end`: The opposite corner of the rectangle, as a two-element array of
|
|
||||||
numbers, in logical coordinates. color : The color of the line, as a
|
|
||||||
four-element RGBA array, where each element is a number in the range of
|
|
||||||
0.0-1.0.
|
|
||||||
|
|
||||||
While `mct-chart` is intended to support plots specifically, it does perform
|
|
||||||
some useful management of canvas objects (e.g. choosing between WebGL and Canvas
|
|
||||||
2D APIs for drawing based on browser support) so its usage is recommended when
|
|
||||||
its supported drawing primitives are sufficient for other charting tasks.
|
|
||||||
|
|
||||||
## Container
|
## Container
|
||||||
|
|
||||||
The `mct-container` is similar to the `mct-include` directive insofar as it allows
|
The `mct-container` is similar to the `mct-include` directive insofar as it allows
|
||||||
@ -1449,7 +1407,7 @@ Passed as plain text in the attribute.
|
|||||||
|
|
||||||
### Form Structure
|
### Form Structure
|
||||||
|
|
||||||
Forms in Open MCT Web have a common structure to permit consistent display. A
|
Forms in Open MCT have a common structure to permit consistent display. A
|
||||||
form is broken down into sections, which will be displayed in groups; each
|
form is broken down into sections, which will be displayed in groups; each
|
||||||
section is broken down into rows, each of which provides a control for a single
|
section is broken down into rows, each of which provides a control for a single
|
||||||
property. Input from this form is two-way bound to the object passed via
|
property. Input from this form is two-way bound to the object passed via
|
||||||
@ -1658,7 +1616,7 @@ by scrolling to the bottom of the table rows.
|
|||||||
|
|
||||||
# Services
|
# Services
|
||||||
|
|
||||||
The Open MCT Web platform provides a variety of services which can be retrieved
|
The Open MCT platform provides a variety of services which can be retrieved
|
||||||
and utilized via dependency injection. These services fall into two categories:
|
and utilized via dependency injection. These services fall into two categories:
|
||||||
|
|
||||||
* _Composite Services_ are defined by a set of components extensions; plugins may
|
* _Composite Services_ are defined by a set of components extensions; plugins may
|
||||||
@ -1670,7 +1628,7 @@ utilized by plugins but are not intended to be modified or augmented.
|
|||||||
|
|
||||||
## Composite Type Services
|
## Composite Type Services
|
||||||
|
|
||||||
This section describes the composite services exposed by Open MCT Web,
|
This section describes the composite services exposed by Open MCT,
|
||||||
specifically focusing on their interface and contract.
|
specifically focusing on their interface and contract.
|
||||||
|
|
||||||
In many cases, the platform will include a provider for a service which consumes
|
In many cases, the platform will include a provider for a service which consumes
|
||||||
@ -1988,7 +1946,7 @@ The `workerService` may be used to run web workers defined via the
|
|||||||
as a shared worker); if the `key` is unknown, returns `undefined`.
|
as a shared worker); if the `key` is unknown, returns `undefined`.
|
||||||
|
|
||||||
# Models
|
# Models
|
||||||
Domain object models in Open MCT Web are JavaScript objects describing the
|
Domain object models in Open MCT are JavaScript objects describing the
|
||||||
persistent state of the domain objects they describe. Their contents include a
|
persistent state of the domain objects they describe. Their contents include a
|
||||||
mix of commonly understood metadata attributes; attributes which are recognized
|
mix of commonly understood metadata attributes; attributes which are recognized
|
||||||
by and/or determine the applicability of specific extensions; and properties
|
by and/or determine the applicability of specific extensions; and properties
|
||||||
@ -2004,7 +1962,7 @@ MCT Web and can be utilized directly:
|
|||||||
## Extension-specific Properties
|
## Extension-specific Properties
|
||||||
|
|
||||||
Other properties of domain object models have specific meaning imposed by other
|
Other properties of domain object models have specific meaning imposed by other
|
||||||
extensions within the Open MCT Web platform.
|
extensions within the Open MCT platform.
|
||||||
|
|
||||||
### Capability-specific Properties
|
### Capability-specific Properties
|
||||||
|
|
||||||
@ -2288,7 +2246,7 @@ way of its `composition` capability.)
|
|||||||
|
|
||||||
# Policies
|
# Policies
|
||||||
|
|
||||||
Policies are consulted to determine when certain behavior in Open MCT Web is
|
Policies are consulted to determine when certain behavior in Open MCT is
|
||||||
allowed. Policy questions are assigned to certain categories, which broadly
|
allowed. Policy questions are assigned to certain categories, which broadly
|
||||||
describe the type of decision being made; within each category, policies have a
|
describe the type of decision being made; within each category, policies have a
|
||||||
candidate (the thing which may or may not be allowed) and, optionally, a context
|
candidate (the thing which may or may not be allowed) and, optionally, a context
|
||||||
@ -2304,22 +2262,19 @@ The platform understands the following policy categories (specifiable as the
|
|||||||
|
|
||||||
* `action`: Determines whether or not a given action is allowable. The candidate
|
* `action`: Determines whether or not a given action is allowable. The candidate
|
||||||
argument here is an Action; the context is its action context object.
|
argument here is an Action; the context is its action context object.
|
||||||
* `composition`: Determines whether or not domain objects of a given type are
|
* `composition`: Determines whether or not a given domain object(first argument, `parent`) can contain a candidate child object (second argument, `child`).
|
||||||
allowed to contain domain objects of another type. The candidate argument here
|
|
||||||
is the container's `Type`; the context argument is the `Type` of the object to be
|
|
||||||
contained.
|
|
||||||
* `view`: Determines whether or not a view is applicable for a domain object.
|
* `view`: Determines whether or not a view is applicable for a domain object.
|
||||||
The candidate argument is the view's extension definition; the context argument
|
The candidate argument is the view's extension definition; the context argument
|
||||||
is the `DomainObject` to be viewed.
|
is the `DomainObject` to be viewed.
|
||||||
|
|
||||||
# Build-Test-Deploy
|
# Build-Test-Deploy
|
||||||
Open MCT Web is designed to support a broad variety of build and deployment
|
Open MCT is designed to support a broad variety of build and deployment
|
||||||
options. The sources can be deployed in the same directory structure used during
|
options. The sources can be deployed in the same directory structure used during
|
||||||
development. A few utilities are included to support development processes.
|
development. A few utilities are included to support development processes.
|
||||||
|
|
||||||
## Command-line Build
|
## Command-line Build
|
||||||
|
|
||||||
Open MCT Web is built using [`npm`](http://npmjs.com/)
|
Open MCT is built using [`npm`](http://npmjs.com/)
|
||||||
and [`gulp`](http://gulpjs.com/).
|
and [`gulp`](http://gulpjs.com/).
|
||||||
|
|
||||||
To install build dependencies (only needs to be run once):
|
To install build dependencies (only needs to be run once):
|
||||||
@ -2328,15 +2283,15 @@ To install build dependencies (only needs to be run once):
|
|||||||
|
|
||||||
To build:
|
To build:
|
||||||
|
|
||||||
`npm run prepublish`
|
`npm run prepare`
|
||||||
|
|
||||||
This will compile and minify JavaScript sources, as well as copy over assets.
|
This will compile and minify JavaScript sources, as well as copy over assets.
|
||||||
The contents of the `dist` folder will contain a runnable Open MCT Web
|
The contents of the `dist` folder will contain a runnable Open MCT
|
||||||
instance (e.g. by starting an HTTP server in that directory), including:
|
instance (e.g. by starting an HTTP server in that directory), including:
|
||||||
|
|
||||||
* A `main.js` file containing Open MCT Web source code.
|
* A `main.js` file containing Open MCT source code.
|
||||||
* Various assets in the `example` and `platform` directories.
|
* Various assets in the `example` and `platform` directories.
|
||||||
* An `index.html` that runs Open MCT Web in its default configuration.
|
* An `index.html` that runs Open MCT in its default configuration.
|
||||||
|
|
||||||
Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js).
|
Additional `gulp` tasks are defined in [the gulpfile](gulpfile.js).
|
||||||
|
|
||||||
@ -2345,7 +2300,7 @@ download build dependencies.
|
|||||||
|
|
||||||
## Test Suite
|
## Test Suite
|
||||||
|
|
||||||
Open MCT Web uses [Jasmine 1.3](http://jasmine.github.io/) and
|
Open MCT uses [Jasmine 1.3](http://jasmine.github.io/) and
|
||||||
[Karma](http://karma-runner.github.io) for automated testing.
|
[Karma](http://karma-runner.github.io) for automated testing.
|
||||||
|
|
||||||
The test suite is configured to load any scripts ending with `Spec.js` found
|
The test suite is configured to load any scripts ending with `Spec.js` found
|
||||||
@ -2383,8 +2338,8 @@ information using [Blanket.JS](http://blanketjs.org/) and display this at the
|
|||||||
bottom of the screen. Currently, only statement coverage is displayed.
|
bottom of the screen. Currently, only statement coverage is displayed.
|
||||||
|
|
||||||
## Deployment
|
## Deployment
|
||||||
Open MCT Web is built to be flexible in terms of the deployment strategies it
|
Open MCT is built to be flexible in terms of the deployment strategies it
|
||||||
supports. In order to run in the browser, Open MCT Web needs:
|
supports. In order to run in the browser, Open MCT needs:
|
||||||
|
|
||||||
1. HTTP access to sources/resources for the framework, platform, and all active
|
1. HTTP access to sources/resources for the framework, platform, and all active
|
||||||
bundles.
|
bundles.
|
||||||
@ -2393,13 +2348,13 @@ external services need to support HTTP or some other web-accessible interface,
|
|||||||
like WebSockets.)
|
like WebSockets.)
|
||||||
|
|
||||||
Any HTTP server capable of serving flat files is sufficient for the first point.
|
Any HTTP server capable of serving flat files is sufficient for the first point.
|
||||||
The command-line build also packages Open MCT Web into a `.war` file for easier
|
The command-line build also packages Open MCT into a `.war` file for easier
|
||||||
deployment on containers such as Apache Tomcat.
|
deployment on containers such as Apache Tomcat.
|
||||||
|
|
||||||
The second point may be less flexible, as it depends upon the specific services
|
The second point may be less flexible, as it depends upon the specific services
|
||||||
to be utilized by Open MCT Web. Because of this, it is often the set of external
|
to be utilized by Open MCT. Because of this, it is often the set of external
|
||||||
services (and the manner in which they are exposed) that determine how to deploy
|
services (and the manner in which they are exposed) that determine how to deploy
|
||||||
Open MCT Web.
|
Open MCT.
|
||||||
|
|
||||||
One important constraint to consider in this context is the browser's same
|
One important constraint to consider in this context is the browser's same
|
||||||
origin policy. If external services are not on the same apparent host and port
|
origin policy. If external services are not on the same apparent host and port
|
||||||
@ -2416,7 +2371,7 @@ configuration does not create a security vulnerability.
|
|||||||
Examples of deployment strategies (and the conditions under which they make the
|
Examples of deployment strategies (and the conditions under which they make the
|
||||||
most sense) include:
|
most sense) include:
|
||||||
|
|
||||||
* If the external services that Open MCT Web will utilize are all running on
|
* If the external services that Open MCT will utilize are all running on
|
||||||
[Apache Tomcat](https://tomcat.apache.org/), then it makes sense to run Open
|
[Apache Tomcat](https://tomcat.apache.org/), then it makes sense to run Open
|
||||||
MCT Web from the same Tomcat instance as a separate web application. The
|
MCT Web from the same Tomcat instance as a separate web application. The
|
||||||
`.war` artifact produced by the command line build facilitates this deployment
|
`.war` artifact produced by the command line build facilitates this deployment
|
||||||
@ -2427,28 +2382,28 @@ hosts/ports, then it may make sense to use a web server that supports proxying,
|
|||||||
such as the [Apache HTTP Server](http://httpd.apache.org/). In this
|
such as the [Apache HTTP Server](http://httpd.apache.org/). In this
|
||||||
configuration, the HTTP server would be configured to proxy (or reverse proxy)
|
configuration, the HTTP server would be configured to proxy (or reverse proxy)
|
||||||
requests at specific paths to the various external services, while providing
|
requests at specific paths to the various external services, while providing
|
||||||
Open MCT Web as flat files from a different path.
|
Open MCT as flat files from a different path.
|
||||||
* If a single server component is being developed to handle all server-side
|
* If a single server component is being developed to handle all server-side
|
||||||
needs of an Open MCT Web instance, it can make sense to serve Open MCT Web (as
|
needs of an Open MCT instance, it can make sense to serve Open MCT (as
|
||||||
flat files) from the same component using an embedded HTTP server such as
|
flat files) from the same component using an embedded HTTP server such as
|
||||||
[Nancy](http://nancyfx.org/).
|
[Nancy](http://nancyfx.org/).
|
||||||
* If no external services are needed (or if the 'external services' will just
|
* If no external services are needed (or if the 'external services' will just
|
||||||
be generating flat files to read) it makes sense to utilize a lightweight flat
|
be generating flat files to read) it makes sense to utilize a lightweight flat
|
||||||
file HTTP server such as [Lighttpd](http://www.lighttpd.net/). In this
|
file HTTP server such as [Lighttpd](http://www.lighttpd.net/). In this
|
||||||
configuration, Open MCT Web sources/resources would be placed at one path, while
|
configuration, Open MCT sources/resources would be placed at one path, while
|
||||||
the files generated by the external service are placed at another path.
|
the files generated by the external service are placed at another path.
|
||||||
* If all external services support CORS, it may make sense to have an HTTP
|
* If all external services support CORS, it may make sense to have an HTTP
|
||||||
server that is solely responsible for making Open MCT Web sources/resources
|
server that is solely responsible for making Open MCT sources/resources
|
||||||
available, and to have Open MCT Web contact these external services directly.
|
available, and to have Open MCT contact these external services directly.
|
||||||
Again, lightweight HTTP servers such as [Lighttpd](http://www.lighttpd.net/)
|
Again, lightweight HTTP servers such as [Lighttpd](http://www.lighttpd.net/)
|
||||||
are useful in this circumstance. The downside of this option is that additional
|
are useful in this circumstance. The downside of this option is that additional
|
||||||
configuration effort is required, both to enable CORS on the external services,
|
configuration effort is required, both to enable CORS on the external services,
|
||||||
and to ensure that Open MCT Web can correctly locate these services.
|
and to ensure that Open MCT can correctly locate these services.
|
||||||
|
|
||||||
Another important consideration is authentication. By design, Open MCT Web does
|
Another important consideration is authentication. By design, Open MCT does
|
||||||
not handle user authentication. Instead, this should typically be treated as a
|
not handle user authentication. Instead, this should typically be treated as a
|
||||||
deployment-time concern, where authentication is handled by the HTTP server
|
deployment-time concern, where authentication is handled by the HTTP server
|
||||||
which provides Open MCT Web, or an external access management system.
|
which provides Open MCT, or an external access management system.
|
||||||
|
|
||||||
### Configuration
|
### Configuration
|
||||||
In most of the deployment options above, some level of configuration is likely
|
In most of the deployment options above, some level of configuration is likely
|
||||||
@ -2456,7 +2411,7 @@ to be needed or desirable to make sure that bundles can reach the external
|
|||||||
services they need to reach. Most commonly this means providing the path or URL
|
services they need to reach. Most commonly this means providing the path or URL
|
||||||
to an external service.
|
to an external service.
|
||||||
|
|
||||||
Configurable parameters within Open MCT Web are specified via constants
|
Configurable parameters within Open MCT are specified via constants
|
||||||
(literally, as extensions of the `constants` category) and accessed via
|
(literally, as extensions of the `constants` category) and accessed via
|
||||||
dependency injection by the scripts which need them. Reasonable defaults for
|
dependency injection by the scripts which need them. Reasonable defaults for
|
||||||
these constants are provided in the bundle where they are used. Plugins are
|
these constants are provided in the bundle where they are used. Plugins are
|
||||||
@ -2475,7 +2430,7 @@ for error, but is viable if there are a small number of constants to change.
|
|||||||
constants. This is particularly appropriate when multiple configurations (e.g.
|
constants. This is particularly appropriate when multiple configurations (e.g.
|
||||||
development, test, production) need to be managed easily; these can be swapped
|
development, test, production) need to be managed easily; these can be swapped
|
||||||
quickly by changing the set of active bundles in bundles.json.
|
quickly by changing the set of active bundles in bundles.json.
|
||||||
* Deploy Open MCT Web and its external services in such a fashion that the
|
* Deploy Open MCT and its external services in such a fashion that the
|
||||||
default paths to reach external services are all correct.
|
default paths to reach external services are all correct.
|
||||||
|
|
||||||
### Configuration Constants
|
### Configuration Constants
|
||||||
@ -2486,7 +2441,7 @@ The following constants have global significance:
|
|||||||
to be overridden by other bundles, but persistence adapters may wish to
|
to be overridden by other bundles, but persistence adapters may wish to
|
||||||
consume this constant in order to provide persistence for that space.
|
consume this constant in order to provide persistence for that space.
|
||||||
|
|
||||||
The following configuration constants are recognized by Open MCT Web bundles:
|
The following configuration constants are recognized by Open MCT bundles:
|
||||||
* Common UI elements - `platform/commonUI/general`
|
* Common UI elements - `platform/commonUI/general`
|
||||||
* `THEME`: A string identifying the current theme symbolically. Individual
|
* `THEME`: A string identifying the current theme symbolically. Individual
|
||||||
stylesheets (the `stylesheets` extension category) may specify an optional
|
stylesheets (the `stylesheets` extension category) may specify an optional
|
||||||
|
121
docs/src/guide/security.md
Normal file
@ -0,0 +1,121 @@
|
|||||||
|
# Security Guide
|
||||||
|
|
||||||
|
Open MCT is a rich client with plugin support that executes as a single page
|
||||||
|
web application in a browser environment. Security concerns and
|
||||||
|
vulnerabilities associated with the web as a platform should be considered
|
||||||
|
before deploying Open MCT (or any other web application) for mission or
|
||||||
|
production usage.
|
||||||
|
|
||||||
|
This document describes several important points to consider when developing
|
||||||
|
for or deploying Open MCT securely. Other resources such as
|
||||||
|
[Open Web Application Security Project (OWASP)](https://www.owasp.org)
|
||||||
|
provide a deeper and more general overview of security for web applications.
|
||||||
|
|
||||||
|
|
||||||
|
## Security Model
|
||||||
|
|
||||||
|
Open MCT has been architected assuming the following deployment pattern:
|
||||||
|
|
||||||
|
* A tagged, tested Open MCT version will be used.
|
||||||
|
* Externally authored plugins will be installed.
|
||||||
|
* A server will provide persistent storage, telemetry, and other shared data.
|
||||||
|
* Authorization, authentication, and auditing will be handled by a server.
|
||||||
|
|
||||||
|
|
||||||
|
## Security Procedures
|
||||||
|
|
||||||
|
The Open MCT team secures our code base using a combination of code review,
|
||||||
|
dependency review, and periodic security reviews. Static analysis performed
|
||||||
|
during automated verification additionally safeguards against common
|
||||||
|
coding errors which may result in vulnerabilities.
|
||||||
|
|
||||||
|
|
||||||
|
### Code Review
|
||||||
|
|
||||||
|
All contributions are reviewed by internal team members. External
|
||||||
|
contributors receive increased scrutiny for security and quality,
|
||||||
|
and must sign a licensing agreement.
|
||||||
|
|
||||||
|
### Dependency Review
|
||||||
|
|
||||||
|
Before integrating third-party dependencies, they are reviewed for security
|
||||||
|
and quality, with consideration given to authors and users of these
|
||||||
|
dependencies, as well as review of open source code.
|
||||||
|
|
||||||
|
### Periodic Security Reviews
|
||||||
|
|
||||||
|
Open MCT's code, design, and architecture are periodically reviewed
|
||||||
|
(approximately annually) for common security issues, such as the
|
||||||
|
[OWASP Top Ten](https://www.owasp.org/index.php/Category:OWASP_Top_Ten_Project).
|
||||||
|
|
||||||
|
|
||||||
|
## Security Concerns
|
||||||
|
|
||||||
|
Certain security concerns deserve special attention when deploying Open MCT,
|
||||||
|
or when authoring plugins.
|
||||||
|
|
||||||
|
### Identity Spoofing
|
||||||
|
|
||||||
|
Open MCT issues calls to web services with the privileges of a logged in user.
|
||||||
|
Compromised sources (either for Open MCT itself or a plugin) could
|
||||||
|
therefore allow malicious code to execute with those privileges.
|
||||||
|
|
||||||
|
To avoid this:
|
||||||
|
|
||||||
|
* Serve Open MCT and other scripts over SSL (https rather than http)
|
||||||
|
to prevent man-in-the-middle attacks.
|
||||||
|
* Exercise precautions such as security reviews for any plugins or
|
||||||
|
applications built for or with Open MCT to reject malicious changes.
|
||||||
|
|
||||||
|
### Information Disclosure
|
||||||
|
|
||||||
|
If Open MCT is used to handle or display sensitive data, any components
|
||||||
|
(such as adapter plugins) must take care to avoid leaking or disclosing
|
||||||
|
this information. For example, avoid sending sensitive data to third-party
|
||||||
|
servers or insecure APIs.
|
||||||
|
|
||||||
|
### Data Tampering
|
||||||
|
|
||||||
|
The web application architecture leaves open the possibility that direct
|
||||||
|
calls will be made to back-end services, circumventing Open MCT entirely.
|
||||||
|
As such, Open MCT assumes that server components will perform any necessary
|
||||||
|
data validation during calls issues to the server.
|
||||||
|
|
||||||
|
Additionally, plugins which serialize and write data to the server must
|
||||||
|
escape that data to avoid database injection attacks, and similar.
|
||||||
|
|
||||||
|
### Repudiation
|
||||||
|
|
||||||
|
Open MCT assumes that servers log any relevant interactions and associates
|
||||||
|
these with a user identity; the specific user actions taken within the
|
||||||
|
application are assumed not to be of concern for auditing.
|
||||||
|
|
||||||
|
In the absence of server-side logging, users may disclaim (maliciously,
|
||||||
|
mistakenly, or otherwise) actions taken within the system without any
|
||||||
|
way to prove otherwise.
|
||||||
|
|
||||||
|
If keeping client-level interactions is important, this will need to be
|
||||||
|
implemented via a plugin.
|
||||||
|
|
||||||
|
### Denial-of-service
|
||||||
|
|
||||||
|
Open MCT assumes that server-side components will be insulated against
|
||||||
|
denial-of-service attacks. Services should only permit resource-intensive
|
||||||
|
tasks to be initiated by known or trusted users.
|
||||||
|
|
||||||
|
### Elevation of Privilege
|
||||||
|
|
||||||
|
Corollary to the assumption that servers guide against identity spoofing,
|
||||||
|
Open MCT assumes that services do not allow a user to act with
|
||||||
|
inappropriately escalated privileges. Open MCT cannot protect against
|
||||||
|
such escalation; in the clearest case, a malicious actor could interact
|
||||||
|
with web services directly to exploit such a vulnerability.
|
||||||
|
|
||||||
|
## Additional Reading
|
||||||
|
|
||||||
|
The following resources have been used as a basis for identifying potential
|
||||||
|
security threats to Open MCT deployments in preparation of this document:
|
||||||
|
|
||||||
|
* [STRIDE model](https://www.owasp.org/index.php/Threat_Risk_Modeling#STRIDE)
|
||||||
|
* [Attack Surface Analysis Cheat Sheet](https://www.owasp.org/index.php/Attack_Surface_Analysis_Cheat_Sheet)
|
||||||
|
* [XSS Prevention Cheat Sheet](https://www.owasp.org/index.php/XSS_(Cross_Site_Scripting)_Prevention_Cheat_Sheet)
|
@ -1,35 +1,37 @@
|
|||||||
# Open MCT Web Documentation
|
# Open MCT Documentation
|
||||||
|
|
||||||
## Overview
|
## Overview
|
||||||
|
|
||||||
Documentation is provided to support the use and development of
|
Documentation is provided to support the use and development of
|
||||||
Open MCT Web. It's recommended that before doing
|
Open MCT. It's recommended that before doing
|
||||||
any development with Open MCT Web you take some time to familiarize yourself
|
any development with Open MCT you take some time to familiarize yourself
|
||||||
with the documentation below.
|
with the documentation below.
|
||||||
|
|
||||||
Open MCT Web provides functionality out of the box, but it's also a platform for
|
Open MCT provides functionality out of the box, but it's also a platform for
|
||||||
building rich mission operations applications based on modern web technology.
|
building rich mission operations applications based on modern web technology.
|
||||||
The platform is configured declaratively, and defines conventions for
|
The platform is configured by plugins which extend the platform at a variety
|
||||||
building on the provided capabilities by creating modular 'bundles' that
|
of extension points. The details of how to
|
||||||
extend the platform at a variety of extension points. The details of how to
|
|
||||||
extend the platform are provided in the following documentation.
|
extend the platform are provided in the following documentation.
|
||||||
|
|
||||||
## Sections
|
## Sections
|
||||||
|
|
||||||
* The [Architecture Overview](architecture/) describes the concepts used
|
|
||||||
throughout Open MCT Web, and gives a high level overview of the platform's design.
|
|
||||||
|
|
||||||
* The [Developer's Guide](guide/) goes into more detail about how to use the
|
|
||||||
platform and the functionality that it provides.
|
|
||||||
|
|
||||||
* The [Tutorials](tutorials/) give examples of extending the platform to add
|
|
||||||
functionality,
|
|
||||||
and integrate with data sources.
|
|
||||||
|
|
||||||
* The [API](api/) document is generated from inline documentation
|
* The [API](api/) document is generated from inline documentation
|
||||||
using [JSDoc](http://usejsdoc.org/), and describes the JavaScript objects and
|
using [JSDoc](http://usejsdoc.org/), and describes the JavaScript objects and
|
||||||
functions that make up the software platform.
|
functions that make up the software platform.
|
||||||
|
|
||||||
* Finally, the [Development Process](process/) document describes the
|
* The [Development Process](process/) document describes the
|
||||||
Open MCT Web software development cycle.
|
Open MCT software development cycle.
|
||||||
|
|
||||||
|
## Legacy Documentation
|
||||||
|
|
||||||
|
As we transition to a new API, the following documentation for the old API
|
||||||
|
(which is supported during the transition) may be useful as well:
|
||||||
|
|
||||||
|
* The [Architecture Overview](architecture/) describes the concepts used
|
||||||
|
throughout Open MCT, and gives a high level overview of the platform's design.
|
||||||
|
|
||||||
|
* The [Developer's Guide](guide/) goes into more detail about how to use the
|
||||||
|
platform and the functionality that it provides.
|
||||||
|
|
||||||
|
* The [Tutorials](https://github.com/nasa/openmct-tutorial) give examples of extending the platform to add
|
||||||
|
functionality, and integrate with data sources.
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Development Cycle
|
# Development Cycle
|
||||||
|
|
||||||
Development of Open MCT Web occurs on an iterative cycle of
|
Development of Open MCT occurs on an iterative cycle of
|
||||||
sprints and releases.
|
sprints and releases.
|
||||||
|
|
||||||
* A _sprint_ is three weeks in duration, and represents a
|
* A _sprint_ is three weeks in duration, and represents a
|
||||||
@ -73,11 +73,11 @@ acceptance testing (e.g. by resolving any blockers found); any
|
|||||||
resources not needed for this effort should be used to begin work
|
resources not needed for this effort should be used to begin work
|
||||||
for the subsequent sprint.
|
for the subsequent sprint.
|
||||||
|
|
||||||
| Week | Mon | Tue | Wed | Thu | Fri |
|
| Week | Mon | Tue | Wed | Thu | Fri |
|
||||||
|:-----:|:-------------------------:|:------:|:---:|:----------------------------:|:-----------:|
|
|:-----:|:-------------------------:|:------:|:---:|:----------------------------:|:-------------------------------------:|
|
||||||
| __1__ | Sprint plan | Tag-up | | | |
|
| __1__ | Sprint plan | Tag-up | | | |
|
||||||
| __2__ | | Tag-up | | | Code freeze |
|
| __2__ | | Tag-up | | | Code freeze and sprint branch |
|
||||||
| __3__ | Per-sprint testing | Triage | | _Per-sprint testing*_ | Ship |
|
| __3__ | Per-sprint testing | Triage | | _Per-sprint testing*_ | Ship and merge sprint branch to master|
|
||||||
|
|
||||||
* If necessary.
|
* If necessary.
|
||||||
|
|
||||||
@ -105,14 +105,20 @@ emphasis on testing.
|
|||||||
that team may begin work for that sprint during the
|
that team may begin work for that sprint during the
|
||||||
third week, since testing and blocker resolution is unlikely
|
third week, since testing and blocker resolution is unlikely
|
||||||
to require all available resources.
|
to require all available resources.
|
||||||
|
* Testing success criteria identified per issue (where necessary). This could be in the form of acceptance tests on the issue or detailing performance tests, for example.
|
||||||
* __Tag-up.__ Check in and status update among development team.
|
* __Tag-up.__ Check in and status update among development team.
|
||||||
May amend plan for sprint as-needed.
|
May amend plan for sprint as-needed.
|
||||||
* __Code freeze.__ Any new work from this sprint
|
* __Code freeze.__ Any new work from this sprint
|
||||||
(features, bug fixes, enhancements) must be integrated by the
|
(features, bug fixes, enhancements) must be integrated by the
|
||||||
end of the second week of the sprint. After code freeze
|
end of the second week of the sprint. After code freeze, a sprint
|
||||||
(and until the end of the sprint) the only changes that should be
|
branch will be created (and until the end of the sprint) the only
|
||||||
merged into the master branch should directly address issues
|
changes that should be merged into the sprint branch should
|
||||||
needed to pass acceptance testing.
|
directly address issues needed to pass acceptance testing.
|
||||||
|
During this time, any other feature development will continue to
|
||||||
|
be merged into the master branch for the next sprint.
|
||||||
|
* __Sprint branch merge to master.__ After acceptance testing, the sprint branch
|
||||||
|
will be merged back to the master branch. Any code conflicts that
|
||||||
|
arise will be resolved by the team.
|
||||||
* [__Per-release Testing.__](testing/plan.md#per-release-testing)
|
* [__Per-release Testing.__](testing/plan.md#per-release-testing)
|
||||||
Structured testing with predefined
|
Structured testing with predefined
|
||||||
success criteria. No release should ship without passing
|
success criteria. No release should ship without passing
|
||||||
@ -126,8 +132,8 @@ emphasis on testing.
|
|||||||
* [__Testathon.__](testing/plan.md#user-testing)
|
* [__Testathon.__](testing/plan.md#user-testing)
|
||||||
Multi-user testing, involving as many users as
|
Multi-user testing, involving as many users as
|
||||||
is feasible, plus development team. Open-ended; should verify
|
is feasible, plus development team. Open-ended; should verify
|
||||||
completed work from this sprint, test exploratorily for
|
completed work from this sprint using the sprint branch, test
|
||||||
regressions, et cetera.
|
exploratorily for regressions, et cetera.
|
||||||
* [__Long-Duration Test.__](testing/plan.md#long-duration-testing) A
|
* [__Long-Duration Test.__](testing/plan.md#long-duration-testing) A
|
||||||
test to verify that the software remains
|
test to verify that the software remains
|
||||||
stable after running for longer durations. May include some
|
stable after running for longer durations. May include some
|
||||||
@ -143,7 +149,7 @@ emphasis on testing.
|
|||||||
Subset of Pre-release Testing
|
Subset of Pre-release Testing
|
||||||
which should be performed before shipping at the end of any
|
which should be performed before shipping at the end of any
|
||||||
sprint. Time is allocated for a second round of
|
sprint. Time is allocated for a second round of
|
||||||
Pre-release Testing if the first round is not passed.
|
Pre-release Testing if the first round is not passed. Smoke tests collected from issues/PRs
|
||||||
* __Triage.__ Team reviews issues from acceptance testing and uses
|
* __Triage.__ Team reviews issues from acceptance testing and uses
|
||||||
success criteria to determine whether or not they should block
|
success criteria to determine whether or not they should block
|
||||||
release, then formulates a plan to address these issues before
|
release, then formulates a plan to address these issues before
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# Development Process
|
# Development Process
|
||||||
|
|
||||||
The process used to develop Open MCT Web is described in the following
|
The process used to develop Open MCT is described in the following
|
||||||
documents:
|
documents:
|
||||||
|
|
||||||
* The [Development Cycle](cycle.md) describes how and when specific
|
* The [Development Cycle](cycle.md) describes how and when specific
|
||||||
@ -9,7 +9,7 @@ documents:
|
|||||||
Open MCT (both semantics and process.)
|
Open MCT (both semantics and process.)
|
||||||
* Testing is described in two documents:
|
* Testing is described in two documents:
|
||||||
* The [Test Plan](testing/plan.md) summarizes the approaches used
|
* The [Test Plan](testing/plan.md) summarizes the approaches used
|
||||||
to test Open MCT Web.
|
to test Open MCT.
|
||||||
* The [Test Procedures](testing/procedures.md) document what
|
* The [Test Procedures](testing/procedures.md) document what
|
||||||
specific tests are performed to verify correctness, and how
|
specific tests are performed to verify correctness, and how
|
||||||
they should be carried out.
|
they should be carried out.
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
## Test Levels
|
## Test Levels
|
||||||
|
|
||||||
Testing for Open MCT Web includes:
|
Testing for Open MCT includes:
|
||||||
|
|
||||||
* _Smoke testing_: Brief, informal testing to verify that no major issues
|
* _Smoke testing_: Brief, informal testing to verify that no major issues
|
||||||
or regressions are present in the software, or in specific features of
|
or regressions are present in the software, or in specific features of
|
||||||
@ -19,7 +19,7 @@ Testing for Open MCT Web includes:
|
|||||||
|
|
||||||
Manual, non-rigorous testing of the software and/or specific features
|
Manual, non-rigorous testing of the software and/or specific features
|
||||||
of interest. Verifies that the software runs and that basic functionality
|
of interest. Verifies that the software runs and that basic functionality
|
||||||
is present.
|
is present. The outcome of Smoke Testing should be a simplified list of Acceptance Tests which could be executed by another team member with sufficient context.
|
||||||
|
|
||||||
### Unit Testing
|
### Unit Testing
|
||||||
|
|
||||||
@ -49,7 +49,7 @@ User testing will focus on the following activities:
|
|||||||
* General "trying to break things."
|
* General "trying to break things."
|
||||||
|
|
||||||
During user testing, users will
|
During user testing, users will
|
||||||
[report issues](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#issue-reporting)
|
[report issues](https://github.com/nasa/openmct/issues/new/choose)
|
||||||
as they are encountered.
|
as they are encountered.
|
||||||
|
|
||||||
Desired outcomes of user testing are:
|
Desired outcomes of user testing are:
|
||||||
@ -71,7 +71,7 @@ usage. After twenty-four hours, the software is evaluated for:
|
|||||||
at the start of the test? Is it as responsive?
|
at the start of the test? Is it as responsive?
|
||||||
|
|
||||||
Any defects or unexpected behavior identified during testing should be
|
Any defects or unexpected behavior identified during testing should be
|
||||||
[reported as issues](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#issue-reporting)
|
[reported as issues](https://github.com/nasa/openmct/issues/new/choose)
|
||||||
and reviewed for severity.
|
and reviewed for severity.
|
||||||
|
|
||||||
## Test Performance
|
## Test Performance
|
||||||
@ -102,7 +102,7 @@ perform:
|
|||||||
|
|
||||||
* A relevant subset of [_user testing_](procedures.md#user-test-procedures)
|
* A relevant subset of [_user testing_](procedures.md#user-test-procedures)
|
||||||
identified by the acting [project manager](../cycle.md#roles).
|
identified by the acting [project manager](../cycle.md#roles).
|
||||||
* [_Long-duration testing_](procedures.md#long-duration-testng)
|
* [_Long-duration testing_](procedures.md#long-duration-testing)
|
||||||
(specifically, for 24 hours.)
|
(specifically, for 24 hours.)
|
||||||
|
|
||||||
Issues are reported as a product of both forms of testing.
|
Issues are reported as a product of both forms of testing.
|
||||||
@ -125,3 +125,22 @@ A release is not closed until both categories have been performed on
|
|||||||
the latest snapshot of the software, _and_ no issues labelled as
|
the latest snapshot of the software, _and_ no issues labelled as
|
||||||
["blocker" or "critical"](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#issue-reporting)
|
["blocker" or "critical"](https://github.com/nasa/openmctweb/blob/master/CONTRIBUTING.md#issue-reporting)
|
||||||
remain open.
|
remain open.
|
||||||
|
|
||||||
|
### Testathons
|
||||||
|
Testathons can be used as a means of performing per-sprint and per-release testing.
|
||||||
|
|
||||||
|
#### Timing
|
||||||
|
For per-sprint testing, a testathon is typically performed at the beginning of the third week of a sprint, and again later that week to verify any fixes. For per-release testing, a testathon is typically performed prior to any formal testing processes that are applicable to that release.
|
||||||
|
|
||||||
|
#### Process
|
||||||
|
|
||||||
|
1. Prior to the scheduled testathon, a list will be compiled of all issues that are closed and unverified.
|
||||||
|
2. For each issue, testers should review the associated PR for testing instructions. See the contributing guide for instructions on [pull requests](https://github.com/nasa/openmct/blob/master/CONTRIBUTING.md#merging).
|
||||||
|
3. As each issue is verified via testing, any team members testing it should leave a comment on that issue indicating that it has been verified fixed.
|
||||||
|
4. If a bug is found that relates to an issue being tested, notes should be included on the associated issue, and the issue should be reopened. Bug notes should include reproduction steps.
|
||||||
|
5. For any bugs that are not obviously related to any of the issues under test, a new issue should be created with details about the bug, including reproduction steps. If unsure about whether a bug relates to an issue being tested, just create a new issue.
|
||||||
|
6. At the end of the testathon, triage will take place, where all tested issues will be reviewed.
|
||||||
|
7. If verified fixed, an issue will remain closed, and will have the “unverified” label removed.
|
||||||
|
8. For any bugs found, a severity will be assigned.
|
||||||
|
9. A second testathon will be scheduled for later in the week that will aim to address all issues identified as blockers, as well as any other issues scoped by the team during triage.
|
||||||
|
10. Any issues that were not tested will remain "unverified" and will be picked up in the next testathon.
|
||||||
|
@ -4,7 +4,7 @@
|
|||||||
|
|
||||||
This document is intended to be used:
|
This document is intended to be used:
|
||||||
|
|
||||||
* By testers, to verify that Open MCT Web behaves as specified.
|
* By testers, to verify that Open MCT behaves as specified.
|
||||||
* By the development team, to document new test cases and to provide
|
* By the development team, to document new test cases and to provide
|
||||||
guidance on how to author these.
|
guidance on how to author these.
|
||||||
|
|
||||||
@ -62,7 +62,7 @@ Test cases should be narrow in scope; if a list of steps is excessively
|
|||||||
long (or must be written vaguely to be kept short) it should be broken
|
long (or must be written vaguely to be kept short) it should be broken
|
||||||
down into multiple tests which reference one another.
|
down into multiple tests which reference one another.
|
||||||
|
|
||||||
All requirements satisfied by Open MCT Web should be verifiable using
|
All requirements satisfied by Open MCT should be verifiable using
|
||||||
one or more test procedures.
|
one or more test procedures.
|
||||||
|
|
||||||
## Glossary
|
## Glossary
|
||||||
|
@ -92,47 +92,60 @@ should update (or delegate the task of updating) Open MCT version
|
|||||||
numbers by the following process:
|
numbers by the following process:
|
||||||
|
|
||||||
1. Update version number in `package.json`
|
1. Update version number in `package.json`
|
||||||
1. Remove `-SNAPSHOT` suffix.
|
1. Checkout branch created for the last sprint that has been successfully tested.
|
||||||
2. Verify that resulting version number meets semantic versioning
|
2. Remove a `-SNAPSHOT` suffix from the version in `package.json`.
|
||||||
requirements relative to previous stable version. Increment if
|
3. Verify that resulting version number meets semantic versioning
|
||||||
necessary.
|
requirements relative to previous stable version. Increment the
|
||||||
3. If version is considered unstable (which may be the case during
|
version number if necessary.
|
||||||
|
4. If version is considered unstable (which may be the case during
|
||||||
the first three sprints of a release), apply a new suffix per
|
the first three sprints of a release), apply a new suffix per
|
||||||
[Version Numbering](#version-numbering) guidance above.
|
[Version Numbering](#version-numbering) guidance above.
|
||||||
2. Tag the release.
|
2. Tag the release.
|
||||||
1. Commit changes to `package.json` on the `master` branch.
|
1. Commit changes to `package.json` on the new branch created in
|
||||||
|
the previous step.
|
||||||
The commit message should reference the sprint being closed,
|
The commit message should reference the sprint being closed,
|
||||||
preferably by a URL reference to the associated Milestone in
|
preferably by a URL reference to the associated Milestone in
|
||||||
GitHub.
|
GitHub.
|
||||||
2. Verify that build still completes, that application passes
|
2. Verify that build still completes, that application passes
|
||||||
smoke-testing, and that only differences from tested versions
|
smoke-testing, and that only differences from tested versions
|
||||||
are the changes to version number above.
|
are the changes to version number above.
|
||||||
3. Push the `master` branch.
|
3. Push the new branch.
|
||||||
4. Tag this commit with the version number, prepending the letter "v".
|
4. Tag this commit with the version number, prepending the letter "v".
|
||||||
(e.g. `git tag v0.9.3-alpha`)
|
(e.g. `git tag v0.9.3-alpha`)
|
||||||
5. Push the tag to GitHub. (e.g. `git push origin v0.9.3-alpha`).
|
5. Push the tag to GitHub. (e.g. `git push origin v0.9.3-alpha`).
|
||||||
3. Upload a release archive.
|
3. Upload a release archive.
|
||||||
1. Run `npm pack` to generate the archive.
|
1. Use the [GitHub release interface](https://github.com/nasa/openmct/releases)
|
||||||
2. Use the [GitHub release interface](https://github.com/nasa/openmct/releases)
|
|
||||||
to draft a new release.
|
to draft a new release.
|
||||||
3. Choose the existing tag for the new version (created and pushed above.)
|
2. Choose the existing tag for the new version (created and pushed above.)
|
||||||
Enter the tag name as the release name as well; see existing releases
|
Enter the tag name as the release name as well; see existing releases
|
||||||
for examples.
|
for examples. (e.g. `Open MCT v0.9.3-alpha`)
|
||||||
4. Attach the release archive.
|
3. Designate the release as a "pre-release" as appropriate (for instance,
|
||||||
5. Designate the release as a "pre-release" as appropriate (for instance,
|
|
||||||
when the version number has been suffixed as unstable, or when
|
when the version number has been suffixed as unstable, or when
|
||||||
the version number is below 1.0.0.)
|
the version number is below 1.0.0.)
|
||||||
4. Restore snapshot status in `package.json`
|
4. Add release notes including any breaking changes, enhancements,
|
||||||
1. Remove any suffix from the version number, or increment the
|
bug fixes with solutions in brief.
|
||||||
_patch_ version if there is no suffix.
|
5. Publish the release.
|
||||||
2. Append a `-SNAPSHOT` suffix.
|
4. Publish the release to npm
|
||||||
3. Commit changes to `package.json` on the `master` branch.
|
1. Login to npm
|
||||||
|
2. Checkout the tag created in the previous step.
|
||||||
|
3. In `package.json` change package to be public (private: false)
|
||||||
|
4. Test the package before publishing by doing `npm publish --dry-run`
|
||||||
|
if necessary.
|
||||||
|
5. Publish the package to the npmjs registry (e.g. `npm publish --access public`)
|
||||||
|
NOTE: Use the `--tag unstable` flag to the npm publishj if this is a prerelease.
|
||||||
|
6. Confirm the package has been published (e.g. `https://www.npmjs.com/package/openmct`)
|
||||||
|
5. Update snapshot status in `package.json`
|
||||||
|
1. Create a new branch off the `master` branch.
|
||||||
|
2. Remove any suffix from the version number,
|
||||||
|
or increment the _patch_ version if there is no suffix.
|
||||||
|
3. Append a `-SNAPSHOT` suffix.
|
||||||
|
4. Commit changes to `package.json` on the `master` branch.
|
||||||
The commit message should reference the sprint being opened,
|
The commit message should reference the sprint being opened,
|
||||||
preferably by a URL reference to the associated Milestone in
|
preferably by a URL reference to the associated Milestone in
|
||||||
GitHub.
|
GitHub.
|
||||||
4. Verify that build still completes, that application passes
|
5. Verify that build still completes, that application passes
|
||||||
smoke-testing.
|
smoke-testing.
|
||||||
5. Push the `master` branch.
|
6. Create a PR to be merged into the `master` branch.
|
||||||
|
|
||||||
Projects dependent on Open MCT being co-developed by the Open MCT
|
Projects dependent on Open MCT being co-developed by the Open MCT
|
||||||
team should follow a similar process, except that they should
|
team should follow a similar process, except that they should
|
||||||
|
Before Width: | Height: | Size: 23 KiB |
Before Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 42 KiB |
Before Width: | Height: | Size: 30 KiB |
Before Width: | Height: | Size: 34 KiB |
Before Width: | Height: | Size: 140 KiB |
Before Width: | Height: | Size: 11 KiB |
Before Width: | Height: | Size: 16 KiB |
Before Width: | Height: | Size: 39 KiB |
Before Width: | Height: | Size: 51 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 25 KiB |
Before Width: | Height: | Size: 31 KiB |
Before Width: | Height: | Size: 43 KiB |
4
e2e/.eslintrc.js
Normal file
@ -0,0 +1,4 @@
|
|||||||
|
/* eslint-disable no-undef */
|
||||||
|
module.exports = {
|
||||||
|
"extends": ["plugin:playwright/playwright-test"]
|
||||||
|
};
|
33
e2e/playwright-ci.config.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* eslint-disable no-undef */
|
||||||
|
// playwright.config.js
|
||||||
|
// @ts-check
|
||||||
|
|
||||||
|
/** @type {import('@playwright/test').PlaywrightTestConfig} */
|
||||||
|
const config = {
|
||||||
|
retries: 2,
|
||||||
|
testDir: 'tests',
|
||||||
|
timeout: 90 * 1000,
|
||||||
|
webServer: {
|
||||||
|
command: 'npm run start',
|
||||||
|
port: 8080,
|
||||||
|
timeout: 200 * 1000,
|
||||||
|
reuseExistingServer: !process.env.CI
|
||||||
|
},
|
||||||
|
workers: 2, //Limit to 2 for CircleCI Agent
|
||||||
|
use: {
|
||||||
|
browserName: "chromium",
|
||||||
|
baseURL: 'http://localhost:8080/',
|
||||||
|
headless: true,
|
||||||
|
ignoreHTTPSErrors: true,
|
||||||
|
screenshot: 'on',
|
||||||
|
trace: 'on',
|
||||||
|
video: 'on'
|
||||||
|
},
|
||||||
|
reporter: [
|
||||||
|
['list'],
|
||||||
|
['junit', { outputFile: 'test-results/results.xml' }],
|
||||||
|
['allure-playwright']
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = config;
|
31
e2e/playwright-local.config.js
Normal file
@ -0,0 +1,31 @@
|
|||||||
|
/* eslint-disable no-undef */
|
||||||
|
// playwright.config.js
|
||||||
|
// @ts-check
|
||||||
|
|
||||||
|
/** @type {import('@playwright/test').PlaywrightTestConfig} */
|
||||||
|
const config = {
|
||||||
|
retries: 0,
|
||||||
|
testDir: 'tests',
|
||||||
|
timeout: 30 * 1000,
|
||||||
|
webServer: {
|
||||||
|
command: 'npm run start',
|
||||||
|
port: 8080,
|
||||||
|
timeout: 120 * 1000,
|
||||||
|
reuseExistingServer: !process.env.CI
|
||||||
|
},
|
||||||
|
use: {
|
||||||
|
browserName: "chromium",
|
||||||
|
baseURL: 'http://localhost:8080/',
|
||||||
|
headless: false,
|
||||||
|
ignoreHTTPSErrors: true,
|
||||||
|
screenshot: 'on',
|
||||||
|
trace: 'on',
|
||||||
|
video: 'on'
|
||||||
|
},
|
||||||
|
reporter: [
|
||||||
|
['list'],
|
||||||
|
['allure-playwright']
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = config;
|
33
e2e/playwright-visual.config.js
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
/* eslint-disable no-undef */
|
||||||
|
// playwright.config.js
|
||||||
|
// @ts-check
|
||||||
|
|
||||||
|
/** @type {import('@playwright/test').PlaywrightTestConfig} */
|
||||||
|
const config = {
|
||||||
|
retries: 0,
|
||||||
|
testDir: 'tests',
|
||||||
|
timeout: 90 * 1000,
|
||||||
|
workers: 1,
|
||||||
|
webServer: {
|
||||||
|
command: 'npm run start',
|
||||||
|
port: 8080,
|
||||||
|
timeout: 200 * 1000,
|
||||||
|
reuseExistingServer: !process.env.CI
|
||||||
|
},
|
||||||
|
use: {
|
||||||
|
browserName: "chromium",
|
||||||
|
baseURL: 'http://localhost:8080/',
|
||||||
|
headless: true,
|
||||||
|
ignoreHTTPSErrors: true,
|
||||||
|
screenshot: 'on',
|
||||||
|
trace: 'off',
|
||||||
|
video: 'on'
|
||||||
|
},
|
||||||
|
reporter: [
|
||||||
|
['list'],
|
||||||
|
['junit', { outputFile: 'test-results/results.xml' }],
|
||||||
|
['allure-playwright']
|
||||||
|
]
|
||||||
|
};
|
||||||
|
|
||||||
|
module.exports = config;
|
48
e2e/tests/plugins/condition/condition.e2e.spec.js
Normal file
@ -0,0 +1,48 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is 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.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
This test suite is dedicated to tests which verify the basic operations surrounding conditionSets.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const { test, expect } = require('@playwright/test');
|
||||||
|
|
||||||
|
test.describe('condition set', () => {
|
||||||
|
test('create new button `condition set` creates new condition object', async ({ page }) => {
|
||||||
|
//Go to baseURL
|
||||||
|
await page.goto('/', { waitUntil: 'networkidle' });
|
||||||
|
|
||||||
|
//Click the Create button
|
||||||
|
await page.click('button:has-text("Create")');
|
||||||
|
|
||||||
|
// Click text=Condition Set
|
||||||
|
await page.click('text=Condition Set');
|
||||||
|
|
||||||
|
// Click text=OK
|
||||||
|
await Promise.all([
|
||||||
|
page.waitForNavigation(/*{ url: 'http://localhost:8080/#/browse/mine/dab945d4-5a84-480e-8180-222b4aa730fa?tc.mode=fixed&tc.startBound=1639696164435&tc.endBound=1639697964435&tc.timeSystem=utc&view=conditionSet.view' }*/),
|
||||||
|
page.click('text=OK')
|
||||||
|
]);
|
||||||
|
|
||||||
|
await expect(page.locator('.l-browse-bar__object-name')).toContainText('Unnamed Condition Set');
|
||||||
|
});
|
||||||
|
});
|
49
e2e/tests/smoke.spec.js
Normal file
@ -0,0 +1,49 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is 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.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
This test suite is dedicated to tests which can quickly verify that any openmct installation is
|
||||||
|
operable and that any type of testing can proceed.
|
||||||
|
|
||||||
|
Ideally, smoke tests should make zero assumptions about how and where they are run. This makes them
|
||||||
|
more resilient to change and therefor a better indicator of failure. Smoke tests will also run quickly
|
||||||
|
as they cover a very "thin surface" of functionality.
|
||||||
|
|
||||||
|
When deciding between authoring new smoke tests or functional tests, ask yourself "would I feel
|
||||||
|
comfortable running this test during a live mission?" Avoid creating or deleting Domain Objects.
|
||||||
|
Make no assumptions about the order that elements appear in the DOM.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const { test, expect } = require('@playwright/test');
|
||||||
|
|
||||||
|
test('Verify that the create button appears and that the Folder Domain Object is available for selection', async ({ page }) => {
|
||||||
|
|
||||||
|
//Go to baseURL
|
||||||
|
await page.goto('/', { waitUntil: 'networkidle' });
|
||||||
|
|
||||||
|
//Click the Create button
|
||||||
|
await page.click('button:has-text("Create")');
|
||||||
|
|
||||||
|
// Verify that Create Folder appears in the dropdown
|
||||||
|
const locator = page.locator(':nth-match(:text("Folder"), 2)');
|
||||||
|
await expect(locator).toBeEnabled();
|
||||||
|
});
|
113
e2e/tests/visual/default.spec.js
Normal file
@ -0,0 +1,113 @@
|
|||||||
|
/*****************************************************************************
|
||||||
|
* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
|
* Administration. All rights reserved.
|
||||||
|
*
|
||||||
|
* Open MCT is 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.
|
||||||
|
*
|
||||||
|
* Open MCT includes source code licensed under additional open source
|
||||||
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
|
* this source code distribution or the Licensing information page available
|
||||||
|
* at runtime from the About dialog for additional information.
|
||||||
|
*****************************************************************************/
|
||||||
|
|
||||||
|
/*
|
||||||
|
Collection of Visual Tests set to run in a default context. The tests within this suite
|
||||||
|
are only meant to run against openmct's app.js started by `npm run start` within the
|
||||||
|
`./e2e/playwright-visual.config.js` file.
|
||||||
|
|
||||||
|
These should only use functional expect statements to verify assumptions about the state
|
||||||
|
in a test and not for functional verification of correctness. Visual tests are not supposed
|
||||||
|
to "fail" on assertions. Instead, they should be used to detect changes between builds or branches.
|
||||||
|
|
||||||
|
Note: Larger testsuite sizes are OK due to the setup time associated with these tests.
|
||||||
|
*/
|
||||||
|
|
||||||
|
const { test, expect } = require('@playwright/test');
|
||||||
|
const percySnapshot = require('@percy/playwright');
|
||||||
|
const path = require('path');
|
||||||
|
const sinon = require('sinon');
|
||||||
|
|
||||||
|
const VISUAL_GRACE_PERIOD = 5 * 1000; //Lets the application "simmer" before the snapshot is taken
|
||||||
|
|
||||||
|
// Snippet from https://github.com/microsoft/playwright/issues/6347#issuecomment-965887758
|
||||||
|
// Will replace with cy.clock() equivalent
|
||||||
|
test.beforeEach(async ({ context }) => {
|
||||||
|
await context.addInitScript({
|
||||||
|
// eslint-disable-next-line no-undef
|
||||||
|
path: path.join(__dirname, '../../..', './node_modules/sinon/pkg/sinon.js')
|
||||||
|
});
|
||||||
|
await context.addInitScript(() => {
|
||||||
|
window.__clock = sinon.useFakeTimers(); //Set browser clock to UNIX Epoch
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Visual - Root and About', async ({ page }) => {
|
||||||
|
// Go to baseURL
|
||||||
|
await page.goto('/', { waitUntil: 'networkidle' });
|
||||||
|
|
||||||
|
// Verify that Create button is actionable
|
||||||
|
const createButtonLocator = page.locator('button:has-text("Create")');
|
||||||
|
await expect(createButtonLocator).toBeEnabled();
|
||||||
|
|
||||||
|
// Take a snapshot of the Dashboard
|
||||||
|
await page.waitForTimeout(VISUAL_GRACE_PERIOD);
|
||||||
|
await percySnapshot(page, 'Root');
|
||||||
|
|
||||||
|
// Click About button
|
||||||
|
await page.click('.l-shell__app-logo');
|
||||||
|
|
||||||
|
// Modify the Build information in 'about' to be consistent run-over-run
|
||||||
|
const versionInformationLocator = page.locator('ul.t-info.l-info.s-info');
|
||||||
|
await expect(versionInformationLocator).toBeEnabled();
|
||||||
|
await versionInformationLocator.evaluate(node => node.innerHTML = '<li>Version: visual-snapshot</li> <li>Build Date: Mon Nov 15 2021 08:07:51 GMT-0800 (Pacific Standard Time)</li> <li>Revision: 93049cdbc6c047697ca204893db9603b864b8c9f</li> <li>Branch: master</li>');
|
||||||
|
|
||||||
|
// Take a snapshot of the About modal
|
||||||
|
await page.waitForTimeout(VISUAL_GRACE_PERIOD);
|
||||||
|
await percySnapshot(page, 'About');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Visual - Default Condition Set', async ({ page }) => {
|
||||||
|
//Go to baseURL
|
||||||
|
await page.goto('/', { waitUntil: 'networkidle' });
|
||||||
|
|
||||||
|
//Click the Create button
|
||||||
|
await page.click('button:has-text("Create")');
|
||||||
|
|
||||||
|
// Click text=Condition Set
|
||||||
|
await page.click('text=Condition Set');
|
||||||
|
|
||||||
|
// Click text=OK
|
||||||
|
await page.click('text=OK');
|
||||||
|
|
||||||
|
// Take a snapshot of the newly created Condition Set object
|
||||||
|
await page.waitForTimeout(VISUAL_GRACE_PERIOD);
|
||||||
|
await percySnapshot(page, 'Default Condition Set');
|
||||||
|
});
|
||||||
|
|
||||||
|
test('Visual - Default Condition Widget', async ({ page }) => {
|
||||||
|
//Go to baseURL
|
||||||
|
await page.goto('/', { waitUntil: 'networkidle' });
|
||||||
|
|
||||||
|
//Click the Create button
|
||||||
|
await page.click('button:has-text("Create")');
|
||||||
|
|
||||||
|
// Click text=Condition Widget
|
||||||
|
await page.click('text=Condition Widget');
|
||||||
|
|
||||||
|
// Click text=OK
|
||||||
|
await page.click('text=OK');
|
||||||
|
|
||||||
|
// Take a snapshot of the newly created Condition Widget object
|
||||||
|
await page.waitForTimeout(VISUAL_GRACE_PERIOD);
|
||||||
|
await percySnapshot(page, 'Default Condition Widget');
|
||||||
|
});
|
@ -1,2 +1,2 @@
|
|||||||
This directory is for example bundles, which are intended to illustrate
|
This directory is for example bundles, which are intended to illustrate
|
||||||
how to author new software components using Open MCT Web.
|
how to author new software components using Open MCT.
|
||||||
|
@ -1,8 +0,0 @@
|
|||||||
This bundle is intended to serve as an example of registering
|
|
||||||
extensions which are mapped directly to built-in Angular features.
|
|
||||||
|
|
||||||
These are:
|
|
||||||
* Controllers
|
|
||||||
* Directives
|
|
||||||
* Routes
|
|
||||||
* Services
|
|
@ -1,74 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT Web is 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.
|
|
||||||
*
|
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define([
|
|
||||||
"./src/ExampleController",
|
|
||||||
"./src/ExampleDirective",
|
|
||||||
"./src/ExampleService",
|
|
||||||
'legacyRegistry'
|
|
||||||
], function (
|
|
||||||
ExampleController,
|
|
||||||
ExampleDirective,
|
|
||||||
ExampleService,
|
|
||||||
legacyRegistry
|
|
||||||
) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
legacyRegistry.register("example/builtins", {
|
|
||||||
"name": "Angular Built-ins Example",
|
|
||||||
"description": "Example showing how to declare extensions with built-in support from Angular.",
|
|
||||||
"sources": "src",
|
|
||||||
"extensions": {
|
|
||||||
"controllers": [
|
|
||||||
{
|
|
||||||
"key": "ExampleController",
|
|
||||||
"implementation": ExampleController,
|
|
||||||
"depends": [
|
|
||||||
"$scope",
|
|
||||||
"exampleService"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"directives": [
|
|
||||||
{
|
|
||||||
"key": "exampleDirective",
|
|
||||||
"implementation": ExampleDirective,
|
|
||||||
"depends": [
|
|
||||||
"examples[]"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"routes": [
|
|
||||||
{
|
|
||||||
"templateUrl": "templates/example.html"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"services": [
|
|
||||||
{
|
|
||||||
"key": "exampleService",
|
|
||||||
"implementation": ExampleService
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,24 +0,0 @@
|
|||||||
<!--
|
|
||||||
Open MCT Web, Copyright (c) 2014-2015, United States Government
|
|
||||||
as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
Administration. All rights reserved.
|
|
||||||
|
|
||||||
Open MCT Web is 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.
|
|
||||||
|
|
||||||
Open MCT Web includes source code licensed under additional open source
|
|
||||||
licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
this source code distribution or the Licensing information page available
|
|
||||||
at runtime from the About dialog for additional information.
|
|
||||||
-->
|
|
||||||
<p>Hello, world! I am the default route.</p>
|
|
||||||
<p ng-controller="ExampleController">My controller has told me: "{{phrase}}"</p>
|
|
||||||
<span example-directive></span>
|
|
@ -1,66 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT Web is 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.
|
|
||||||
*
|
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
/*global define,Promise*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module defining ExampleDirective. Created by vwoeltje on 11/4/14.
|
|
||||||
*/
|
|
||||||
define(
|
|
||||||
[],
|
|
||||||
function () {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
var HAS_EXTENSIONS = "A directive loaded these message from " +
|
|
||||||
"example extensions.",
|
|
||||||
NO_EXTENSIONS = "A directive tried to load example extensions," +
|
|
||||||
" but found none.",
|
|
||||||
MESSAGE = "I heard this from my partial constructor.";
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
function ExampleDirective(examples) {
|
|
||||||
// Build up a template from example extensions
|
|
||||||
var template = examples.length > 0 ?
|
|
||||||
HAS_EXTENSIONS : NO_EXTENSIONS;
|
|
||||||
|
|
||||||
template += "<ul>";
|
|
||||||
examples.forEach(function (E) {
|
|
||||||
template += "<li>";
|
|
||||||
if (typeof E === 'function') {
|
|
||||||
template += (new E(MESSAGE)).getText();
|
|
||||||
} else {
|
|
||||||
template += E.text;
|
|
||||||
}
|
|
||||||
template += "</li>";
|
|
||||||
});
|
|
||||||
template += "</ul>";
|
|
||||||
|
|
||||||
return {
|
|
||||||
template: template
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return ExampleDirective;
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,82 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT Web is 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.
|
|
||||||
*
|
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define([
|
|
||||||
"./src/SomeProvider",
|
|
||||||
"./src/SomeOtherProvider",
|
|
||||||
"./src/SomeDecorator",
|
|
||||||
"./src/SomeOtherDecorator",
|
|
||||||
"./src/SomeAggregator",
|
|
||||||
"./src/SomeOtherExample",
|
|
||||||
'legacyRegistry'
|
|
||||||
], function (
|
|
||||||
SomeProvider,
|
|
||||||
SomeOtherProvider,
|
|
||||||
SomeDecorator,
|
|
||||||
SomeOtherDecorator,
|
|
||||||
SomeAggregator,
|
|
||||||
SomeOtherExample,
|
|
||||||
legacyRegistry
|
|
||||||
) {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
legacyRegistry.register("example/composite", {
|
|
||||||
"extensions": {
|
|
||||||
"components": [
|
|
||||||
{
|
|
||||||
"implementation": SomeProvider,
|
|
||||||
"provides": "someService",
|
|
||||||
"type": "provider"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"implementation": SomeOtherProvider,
|
|
||||||
"provides": "someService",
|
|
||||||
"type": "provider"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"implementation": SomeDecorator,
|
|
||||||
"provides": "someService",
|
|
||||||
"type": "decorator"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"implementation": SomeOtherDecorator,
|
|
||||||
"provides": "someService",
|
|
||||||
"type": "decorator"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"implementation": SomeAggregator,
|
|
||||||
"provides": "someService",
|
|
||||||
"type": "aggregator"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"examples": [
|
|
||||||
{
|
|
||||||
"implementation": SomeOtherExample,
|
|
||||||
"depends": [
|
|
||||||
"someService"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
});
|
|
||||||
});
|
|
@ -1,48 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT Web is 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.
|
|
||||||
*
|
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
/*global define,Promise*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module defining SomeOtherDecorator. Created by vwoeltje on 11/5/14.
|
|
||||||
*/
|
|
||||||
define(
|
|
||||||
[],
|
|
||||||
function () {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
function SomeOtherDecorator(someProvider) {
|
|
||||||
return {
|
|
||||||
getMessages: function () {
|
|
||||||
return someProvider.getMessages().map(function (msg) {
|
|
||||||
return msg + "...";
|
|
||||||
});
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return SomeOtherDecorator;
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,48 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT Web is 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.
|
|
||||||
*
|
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
/*global define,Promise*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module defining SomeOtherProvider. Created by vwoeltje on 11/5/14.
|
|
||||||
*/
|
|
||||||
define(
|
|
||||||
[],
|
|
||||||
function () {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
function SomeOtherProvider() {
|
|
||||||
return {
|
|
||||||
getMessages: function () {
|
|
||||||
return [
|
|
||||||
"I am a message from some other provider."
|
|
||||||
];
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return SomeOtherProvider;
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,9 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
@ -14,67 +14,67 @@
|
|||||||
* License for the specific language governing permissions and limitations
|
* License for the specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*
|
*
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
* Open MCT includes source code licensed under additional open source
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define([
|
define([
|
||||||
"./src/EventTelemetryProvider",
|
"./src/EventTelemetryProvider"
|
||||||
'legacyRegistry'
|
|
||||||
], function (
|
], function (
|
||||||
EventTelemetryProvider,
|
EventTelemetryProvider
|
||||||
legacyRegistry
|
|
||||||
) {
|
) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
legacyRegistry.register("example/eventGenerator", {
|
return {
|
||||||
"name": "Event Message Generator",
|
name: "example/eventGenerator",
|
||||||
"description": "For development use. Creates sample event message data that mimics a live data stream.",
|
definition: {
|
||||||
"extensions": {
|
"name": "Event Message Generator",
|
||||||
"components": [
|
"description": "For development use. Creates sample event message data that mimics a live data stream.",
|
||||||
{
|
"extensions": {
|
||||||
"implementation": EventTelemetryProvider,
|
"components": [
|
||||||
"type": "provider",
|
{
|
||||||
"provides": "telemetryService",
|
"implementation": EventTelemetryProvider,
|
||||||
"depends": [
|
"type": "provider",
|
||||||
"$q",
|
"provides": "telemetryService",
|
||||||
"$timeout"
|
"depends": [
|
||||||
]
|
"$q",
|
||||||
}
|
"$timeout"
|
||||||
],
|
|
||||||
"types": [
|
|
||||||
{
|
|
||||||
"key": "eventGenerator",
|
|
||||||
"name": "Event Message Generator",
|
|
||||||
"glyph": "\u0066",
|
|
||||||
"description": "For development use. Creates sample event message data that mimics a live data stream.",
|
|
||||||
"priority": 10,
|
|
||||||
"features": "creation",
|
|
||||||
"model": {
|
|
||||||
"telemetry": {}
|
|
||||||
},
|
|
||||||
"telemetry": {
|
|
||||||
"source": "eventGenerator",
|
|
||||||
"domains": [
|
|
||||||
{
|
|
||||||
"key": "time",
|
|
||||||
"name": "Time",
|
|
||||||
"format": "utc"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"ranges": [
|
|
||||||
{
|
|
||||||
"key": "message",
|
|
||||||
"name": "Message",
|
|
||||||
"format": "string"
|
|
||||||
}
|
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
}
|
],
|
||||||
]
|
"types": [
|
||||||
|
{
|
||||||
|
"key": "eventGenerator",
|
||||||
|
"name": "Event Message Generator",
|
||||||
|
"cssClass": "icon-generator-events",
|
||||||
|
"description": "For development use. Creates sample event message data that mimics a live data stream.",
|
||||||
|
"priority": 10,
|
||||||
|
"features": "creation",
|
||||||
|
"model": {
|
||||||
|
"telemetry": {}
|
||||||
|
},
|
||||||
|
"telemetry": {
|
||||||
|
"source": "eventGenerator",
|
||||||
|
"domains": [
|
||||||
|
{
|
||||||
|
"key": "utc",
|
||||||
|
"name": "Timestamp",
|
||||||
|
"format": "utc"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"ranges": [
|
||||||
|
{
|
||||||
|
"key": "message",
|
||||||
|
"name": "Message",
|
||||||
|
"format": "string"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
});
|
});
|
||||||
|
58
example/eventGenerator/data/transcript.json
Normal file
@ -0,0 +1,58 @@
|
|||||||
|
[
|
||||||
|
"CC: Eagle, Houston. You're GO for landing. Over.",
|
||||||
|
"LMP: Roger. Understand. GO for landing. 3000 feet. PROGRAM ALARM.",
|
||||||
|
"CC: Copy.",
|
||||||
|
"LMP: 1201",
|
||||||
|
"CDR: 1201.",
|
||||||
|
"CC: Roger. 1201 alarm. We're GO. Same type. We're GO.",
|
||||||
|
"LMP: 2000 feet. 2000 feet, Into the AGS, 47 degrees.",
|
||||||
|
"CC: Roger.",
|
||||||
|
"LMP: 47 degrees.",
|
||||||
|
"CC: Eagle, looking great. You're GO.",
|
||||||
|
"CC: Roger. 1202. We copy it.",
|
||||||
|
"O1: LMP 35 degrees. 35 degrees. 750. Coming down to 23.fl",
|
||||||
|
"LMP: 700 feet, 21 down, 33 degrees.",
|
||||||
|
"LMP: 600 feet, down at 19.",
|
||||||
|
"LMP: 540 feet, down at - 30. Down at 15.",
|
||||||
|
"LMP: At 400 feet, down at 9.",
|
||||||
|
"LMP: ...forward.",
|
||||||
|
"LMP: 350 feet, down at 4.",
|
||||||
|
"LMP: 30, ... one-half down.",
|
||||||
|
"LMP: We're pegged on horizontal velocity.",
|
||||||
|
"LMP: 300 feet, down 3 1/2, 47 forward.",
|
||||||
|
"LMP: ... up.",
|
||||||
|
"LMP: On 1 a minute, 1 1/2 down.",
|
||||||
|
"CDR: 70.",
|
||||||
|
"LMP: Watch your shadow out there.",
|
||||||
|
"LMP: 50, down at 2 1/2, 19 forward.",
|
||||||
|
"LMP: Altitude-velocity light.",
|
||||||
|
"LMP: 3 1/2 down s 220 feet, 13 forward.",
|
||||||
|
"LMP: 1t forward. Coming down nicely.",
|
||||||
|
"LMP: 200 feet, 4 1/2 down.",
|
||||||
|
"LMP: 5 1/2 down.",
|
||||||
|
"LMP: 160, 6 - 6 1/2 down.",
|
||||||
|
"LMP: 5 1/2 down, 9 forward. That's good.",
|
||||||
|
"LMP: 120 feet.",
|
||||||
|
"LMP: 100 feet, 3 1/2 down, 9 forward. Five percent.",
|
||||||
|
"LMP: ...",
|
||||||
|
"LMP: Okay. 75 feet. There's looking good. Down a half, 6 forward.",
|
||||||
|
"CC: 60 seconds.",
|
||||||
|
"LMP: Lights on. ...",
|
||||||
|
"LMP: Down 2 1/2. Forward. Forward. Good.",
|
||||||
|
"LMP: 40 feet, down 2 1/2. Kicking up some dust.",
|
||||||
|
"LMP: 30 feet, 2 1/2 down. Faint shadow.",
|
||||||
|
"LMP: 4 forward. 4 forward. Drifting to the right a little. Okay. Down a half.",
|
||||||
|
"CC: 30 seconds.",
|
||||||
|
"CDR: Forward drift?",
|
||||||
|
"LMP: Yes.",
|
||||||
|
"LMP: Okay.",
|
||||||
|
"LMP: CONTACT LIGHT.",
|
||||||
|
"LMP: Okay. ENGINE STOP.",
|
||||||
|
"LMP: ACA - out of DETENT.",
|
||||||
|
"CDR: Out of DETENT.",
|
||||||
|
"LMP: MODE CONTROL - both AUTO. DESCENT ENGINE COMMAND OVERRIDE - OFF. ENGINE ARM - OFF.",
|
||||||
|
"LMP: 413 is in.",
|
||||||
|
"CC: We copy you down, Eagle.",
|
||||||
|
"CDR: Houston, Tranquility Base here.",
|
||||||
|
"CDR: THE EAGLE HAS LANDED."
|
||||||
|
]
|
@ -1,9 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
@ -14,12 +14,11 @@
|
|||||||
* License for the specific language governing permissions and limitations
|
* License for the specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*
|
*
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
* Open MCT includes source code licensed under additional open source
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define */
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Module defining EventTelemetry.
|
* Module defining EventTelemetry.
|
||||||
@ -27,45 +26,11 @@
|
|||||||
* Modified by shale on 06/23/2015.
|
* Modified by shale on 06/23/2015.
|
||||||
*/
|
*/
|
||||||
define(
|
define(
|
||||||
[],
|
['../data/transcript.json'],
|
||||||
function () {
|
function (messages) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
var
|
var firstObservedTime = Date.now();
|
||||||
firstObservedTime = Date.now(),
|
|
||||||
messages = [];
|
|
||||||
|
|
||||||
messages.push(["CMD: SYS- MSG: Open the pod bay doors, please, Hal...Open the pod bay doors, please, Hal...Hullo, Hal, do you read me?...Hullo, Hal, do you read me?...Do you read me, Hal?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Affirmative, Dave, I read you."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Open the pod bay doors, Hal."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: I'm sorry, Dave, I'm afraid I can't do that."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: What's the problem?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: I think you know what the problem is just as well as I do."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: What're you talking about, Hal?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: This mission is too important for me to allow you to jeopardise it."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: I don't know what you're talking about, Hal."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: I know that you and Frank were planning to disconnect me, and I'm afraid that's something I cannot allow to happen."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Where the hell'd you get that idea, Hal?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Dave, although you took very thorough precautions in the pod against my hearing you, I could see your lips move."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Alright, I'll go in through the emergency airlock."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Without your space-helmet, Dave, you're going to find that rather difficult."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Hal, I won't argue with you any more. Open the doors."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Dave, this conversation can serve no purpose any more. Goodbye."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: I hope the two of you are not concerned about this."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: No, I'm not, Hal."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Are you quite sure?"]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Yeh. I'd like to ask you a question, though."]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Of course."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: How would you account for this discrepancy between you and the twin 9000?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: Well, I don't think there is any question about it. It can only be attributable to human error. This sort of thing has cropped up before, and it has always been due to human error."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Listen, There's never been any instance at all of a computer error occurring in the 9000 series, has there?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: None whatsoever, The 9000 series has a perfect operational record."]);
|
|
||||||
messages.push(["CMD: SYS-COMM MSG: Well, of course, I know all the wonderful achievements of the 9000 series, but - er - huh - are you certain there's never been any case of even the most insignificant computer error?"]);
|
|
||||||
messages.push(["RESP: SYS-HAL9K MSG: None whatsoever, Quite honestly, I wouldn't worry myself about that."]);
|
|
||||||
messages.push(["RESP: SYS-COMM MSG: (Pause) Well, I'm sure you're right, Umm - fine, thanks very much. Oh, Frank, I'm having a bit of trouble with my transmitter in C-pod, I wonder if you'd come down and take a look at it with me?"]);
|
|
||||||
messages.push(["CMD: SYS-HAL9K MSG: Sure."]);
|
|
||||||
messages.push(["RESP: SYS-COMM MSG: See you later, Hal."]);
|
|
||||||
|
|
||||||
|
|
||||||
function EventTelemetry(request, interval) {
|
function EventTelemetry(request, interval) {
|
||||||
|
|
||||||
@ -78,16 +43,16 @@ define(
|
|||||||
};
|
};
|
||||||
|
|
||||||
generatorData.getDomainValue = function (i, domain) {
|
generatorData.getDomainValue = function (i, domain) {
|
||||||
return i * interval +
|
return i * interval
|
||||||
(domain !== 'delta' ? firstObservedTime : 0);
|
+ (domain !== 'delta' ? firstObservedTime : 0);
|
||||||
};
|
};
|
||||||
|
|
||||||
generatorData.getRangeValue = function (i, range) {
|
generatorData.getRangeValue = function (i, range) {
|
||||||
var domainDelta = this.getDomainValue(i) - firstObservedTime,
|
var domainDelta = this.getDomainValue(i) - firstObservedTime,
|
||||||
ind = i % messages.length;
|
ind = i % messages.length;
|
||||||
return "TEMP " + i.toString() + "-" + messages[ind][0] + "[" + domainDelta.toString() + "]";
|
|
||||||
// TODO: Unsure why we are prepeding 'TEMP'
|
return messages[ind] + " - [" + domainDelta.toString() + "]";
|
||||||
};
|
};
|
||||||
|
|
||||||
return generatorData;
|
return generatorData;
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
@ -14,12 +14,11 @@
|
|||||||
* License for the specific language governing permissions and limitations
|
* License for the specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*
|
*
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
* Open MCT includes source code licensed under additional open source
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define,Promise*/
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Module defining EventTelemetryProvider. Created by chacskaylo on 06/18/2015.
|
* Module defining EventTelemetryProvider. Created by chacskaylo on 06/18/2015.
|
||||||
@ -34,11 +33,9 @@ define(
|
|||||||
* @constructor
|
* @constructor
|
||||||
*/
|
*/
|
||||||
function EventTelemetryProvider($q, $timeout) {
|
function EventTelemetryProvider($q, $timeout) {
|
||||||
var
|
var subscriptions = [],
|
||||||
subscriptions = [],
|
genInterval = 1000,
|
||||||
genInterval = 1000,
|
generating = false;
|
||||||
generating = false,
|
|
||||||
id = Math.random() * 100000;
|
|
||||||
|
|
||||||
//
|
//
|
||||||
function matchesSource(request) {
|
function matchesSource(request) {
|
||||||
@ -47,7 +44,6 @@ define(
|
|||||||
|
|
||||||
// Used internally; this will be repacked by doPackage
|
// Used internally; this will be repacked by doPackage
|
||||||
function generateData(request) {
|
function generateData(request) {
|
||||||
//console.log("generateData " + (Date.now() - startTime).toString());
|
|
||||||
return {
|
return {
|
||||||
key: request.key,
|
key: request.key,
|
||||||
telemetry: new EventTelemetry(request, genInterval)
|
telemetry: new EventTelemetry(request, genInterval)
|
||||||
@ -60,6 +56,7 @@ define(
|
|||||||
results.forEach(function (result) {
|
results.forEach(function (result) {
|
||||||
packaged[result.key] = result.telemetry;
|
packaged[result.key] = result.telemetry;
|
||||||
});
|
});
|
||||||
|
|
||||||
// Format as expected (sources -> keys -> telemetry)
|
// Format as expected (sources -> keys -> telemetry)
|
||||||
return { eventGenerator: packaged };
|
return { eventGenerator: packaged };
|
||||||
}
|
}
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
@ -14,12 +14,11 @@
|
|||||||
* License for the specific language governing permissions and limitations
|
* License for the specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*
|
*
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
* Open MCT includes source code licensed under additional open source
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define([], function () {
|
define([], function () {
|
||||||
'use strict';
|
'use strict';
|
||||||
@ -58,15 +57,15 @@ define([], function () {
|
|||||||
row,
|
row,
|
||||||
i;
|
i;
|
||||||
|
|
||||||
function copyDomainsToRow(row, index) {
|
function copyDomainsToRow(telemetryRow, index) {
|
||||||
domains.forEach(function (domain) {
|
domains.forEach(function (domain) {
|
||||||
row[domain.name] = series.getDomainValue(index, domain.key);
|
telemetryRow[domain.name] = series.getDomainValue(index, domain.key);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function copyRangesToRow(row, index) {
|
function copyRangesToRow(telemetryRow, index) {
|
||||||
ranges.forEach(function (range) {
|
ranges.forEach(function (range) {
|
||||||
row[range.name] = series.getRangeValue(index, range.key);
|
telemetryRow[range.name] = series.getRangeValue(index, range.key);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -76,13 +75,14 @@ define([], function () {
|
|||||||
copyRangesToRow(row, i);
|
copyRangesToRow(row, i);
|
||||||
rows.push(row);
|
rows.push(row);
|
||||||
}
|
}
|
||||||
|
|
||||||
exportService.exportCSV(rows, { headers: headers });
|
exportService.exportCSV(rows, { headers: headers });
|
||||||
});
|
});
|
||||||
};
|
};
|
||||||
|
|
||||||
ExportTelemetryAsCSVAction.appliesTo = function (context) {
|
ExportTelemetryAsCSVAction.appliesTo = function (context) {
|
||||||
return context.domainObject &&
|
return context.domainObject
|
||||||
context.domainObject.hasCapability("telemetry");
|
&& context.domainObject.hasCapability("telemetry");
|
||||||
};
|
};
|
||||||
|
|
||||||
return ExportTelemetryAsCSVAction;
|
return ExportTelemetryAsCSVAction;
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
@ -14,32 +14,33 @@
|
|||||||
* License for the specific language governing permissions and limitations
|
* License for the specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*
|
*
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
* Open MCT includes source code licensed under additional open source
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define([
|
define([
|
||||||
'legacyRegistry',
|
|
||||||
'./ExportTelemetryAsCSVAction'
|
'./ExportTelemetryAsCSVAction'
|
||||||
], function (legacyRegistry, ExportTelemetryAsCSVAction) {
|
], function (ExportTelemetryAsCSVAction) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
legacyRegistry.register("example/export", {
|
return {
|
||||||
"name": "Example of using CSV Export",
|
name: "example/export",
|
||||||
"extensions": {
|
definition: {
|
||||||
"actions": [
|
"name": "Example of using CSV Export",
|
||||||
{
|
"extensions": {
|
||||||
"key": "example.export",
|
"actions": [
|
||||||
"name": "Export Telemetry as CSV",
|
{
|
||||||
"implementation": ExportTelemetryAsCSVAction,
|
"key": "example.export",
|
||||||
"category": "contextual",
|
"name": "Export Telemetry as CSV",
|
||||||
"glyph": "\u0033",
|
"implementation": ExportTelemetryAsCSVAction,
|
||||||
"depends": [ "exportService" ]
|
"category": "contextual",
|
||||||
}
|
"cssClass": "icon-download",
|
||||||
]
|
"depends": ["exportService"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
});
|
});
|
||||||
|
@ -1,52 +0,0 @@
|
|||||||
/*****************************************************************************
|
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
|
||||||
* Administration. All rights reserved.
|
|
||||||
*
|
|
||||||
* Open MCT Web is 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.
|
|
||||||
*
|
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
|
||||||
* this source code distribution or the Licensing information page available
|
|
||||||
* at runtime from the About dialog for additional information.
|
|
||||||
*****************************************************************************/
|
|
||||||
/*global define,Promise*/
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Module defining SomeExample. Created by vwoeltje on 11/5/14.
|
|
||||||
*/
|
|
||||||
define(
|
|
||||||
[],
|
|
||||||
function () {
|
|
||||||
"use strict";
|
|
||||||
|
|
||||||
/**
|
|
||||||
*
|
|
||||||
* @constructor
|
|
||||||
*/
|
|
||||||
function SomeExample(exampleService, message) {
|
|
||||||
return {
|
|
||||||
getText: function () {
|
|
||||||
return [
|
|
||||||
'"',
|
|
||||||
exampleService.getMessage(),
|
|
||||||
'" and "',
|
|
||||||
message,
|
|
||||||
'"'
|
|
||||||
].join("");
|
|
||||||
}
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return SomeExample;
|
|
||||||
}
|
|
||||||
);
|
|
@ -1,9 +1,9 @@
|
|||||||
/*****************************************************************************
|
/*****************************************************************************
|
||||||
* Open MCT Web, Copyright (c) 2014-2015, United States Government
|
* Open MCT, Copyright (c) 2014-2021, United States Government
|
||||||
* as represented by the Administrator of the National Aeronautics and Space
|
* as represented by the Administrator of the National Aeronautics and Space
|
||||||
* Administration. All rights reserved.
|
* Administration. All rights reserved.
|
||||||
*
|
*
|
||||||
* Open MCT Web is licensed under the Apache License, Version 2.0 (the
|
* Open MCT is licensed under the Apache License, Version 2.0 (the
|
||||||
* "License"); you may not use this file except in compliance with the License.
|
* "License"); you may not use this file except in compliance with the License.
|
||||||
* You may obtain a copy of the License at
|
* You may obtain a copy of the License at
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0.
|
* http://www.apache.org/licenses/LICENSE-2.0.
|
||||||
@ -14,40 +14,40 @@
|
|||||||
* License for the specific language governing permissions and limitations
|
* License for the specific language governing permissions and limitations
|
||||||
* under the License.
|
* under the License.
|
||||||
*
|
*
|
||||||
* Open MCT Web includes source code licensed under additional open source
|
* Open MCT includes source code licensed under additional open source
|
||||||
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
* licenses. See the Open Source Licenses file (LICENSES.md) included with
|
||||||
* this source code distribution or the Licensing information page available
|
* this source code distribution or the Licensing information page available
|
||||||
* at runtime from the About dialog for additional information.
|
* at runtime from the About dialog for additional information.
|
||||||
*****************************************************************************/
|
*****************************************************************************/
|
||||||
/*global define*/
|
|
||||||
|
|
||||||
define([
|
define([
|
||||||
"./src/ExampleFormController",
|
"./src/ExampleFormController"
|
||||||
'legacyRegistry'
|
|
||||||
], function (
|
], function (
|
||||||
ExampleFormController,
|
ExampleFormController
|
||||||
legacyRegistry
|
|
||||||
) {
|
) {
|
||||||
"use strict";
|
"use strict";
|
||||||
|
|
||||||
legacyRegistry.register("example/forms", {
|
return {
|
||||||
"name": "Declarative Forms example",
|
name: "example/forms",
|
||||||
"sources": "src",
|
definition: {
|
||||||
"extensions": {
|
"name": "Declarative Forms example",
|
||||||
"controllers": [
|
"sources": "src",
|
||||||
{
|
"extensions": {
|
||||||
"key": "ExampleFormController",
|
"controllers": [
|
||||||
"implementation": ExampleFormController,
|
{
|
||||||
"depends": [
|
"key": "ExampleFormController",
|
||||||
"$scope"
|
"implementation": ExampleFormController,
|
||||||
]
|
"depends": [
|
||||||
}
|
"$scope"
|
||||||
],
|
]
|
||||||
"routes": [
|
}
|
||||||
{
|
],
|
||||||
"templateUrl": "templates/exampleForm.html"
|
"routes": [
|
||||||
}
|
{
|
||||||
]
|
"templateUrl": "templates/exampleForm.html"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
}
|
}
|
||||||
});
|
};
|
||||||
});
|
});
|
||||||
|