Compare commits
493 Commits
1.1106-vsc
...
3.0.0
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
0a5687bacf | ||
|
|
27320465b7 | ||
|
|
6df454e006 | ||
|
|
216652fb31 | ||
|
|
0f066d30b4 | ||
|
|
d1687c1533 | ||
|
|
f5f29c0120 | ||
|
|
8a6faa39c9 | ||
|
|
5887c1d339 | ||
|
|
664ef17af8 | ||
|
|
004004c047 | ||
|
|
09db0ffad5 | ||
|
|
a349ea8ff9 | ||
|
|
cfebf2c67f | ||
|
|
ddd44999c6 | ||
|
|
89d78a5921 | ||
|
|
99dd2db97c | ||
|
|
b52fbb4cb9 | ||
|
|
3463d56114 | ||
|
|
5f63d2b822 | ||
|
|
db4a4f0f50 | ||
|
|
d192726e80 | ||
|
|
d832f61d5b | ||
|
|
88f4b986c5 | ||
|
|
aeb6261189 | ||
|
|
6cb228037b | ||
|
|
a00fa85d77 | ||
|
|
57de78e12a | ||
|
|
2342443368 | ||
|
|
26647c54c9 | ||
|
|
253cf1c438 | ||
|
|
f6a5eaa965 | ||
|
|
f83a57a010 | ||
|
|
92cec80b0e | ||
|
|
1f601f27a2 | ||
|
|
71f1291623 | ||
|
|
9b07078b47 | ||
|
|
8433a3d081 | ||
|
|
c8269fb54d | ||
|
|
0b9a478289 | ||
|
|
c7e6e58387 | ||
|
|
8c515029fd | ||
|
|
1f6ff2f763 | ||
|
|
04542c99fd | ||
|
|
8c47ba255a | ||
|
|
4e6f6bc2cc | ||
|
|
7c65a54fcf | ||
|
|
1f43a673df | ||
|
|
744327ffd4 | ||
|
|
a442d3e3f9 | ||
|
|
3e8a6f93a4 | ||
|
|
308a84e6ec | ||
|
|
cc139acfd1 | ||
|
|
32f8f481b6 | ||
|
|
ec55ed39ee | ||
|
|
ee4b939efa | ||
|
|
538e8d8085 | ||
|
|
2c4ca14d53 | ||
|
|
8d934be6dc | ||
|
|
c54450941c | ||
|
|
e0e019fbd5 | ||
|
|
77af2a5b0e | ||
|
|
ecac0dd751 | ||
|
|
79b4c64a03 | ||
|
|
ccd01c49b9 | ||
|
|
069c5230cd | ||
|
|
c146457de4 | ||
|
|
88cab27165 | ||
|
|
a8914b025f | ||
|
|
0f87798ed6 | ||
|
|
963ebaca5b | ||
|
|
eef2ed0e78 | ||
|
|
0e3720169f | ||
|
|
21cfeb9da0 | ||
|
|
fd65cadaea | ||
|
|
70ad2354bb | ||
|
|
01710cf6ff | ||
|
|
b5c425b3a6 | ||
|
|
b00f6bf078 | ||
|
|
a2639ac617 | ||
|
|
07fcf1be7a | ||
|
|
75ca5b2b0b | ||
|
|
082f25faf1 | ||
|
|
595ce6f5e3 | ||
|
|
b1760c8d29 | ||
|
|
c870398c86 | ||
|
|
f76c809f7d | ||
|
|
4c6e4bedeb | ||
|
|
04e449c546 | ||
|
|
c147711ade | ||
|
|
bd7583a254 | ||
|
|
33b3523bf4 | ||
|
|
cf0f11105b | ||
|
|
9b7a203fe5 | ||
|
|
e44ac0a30e | ||
|
|
319cd3f7ab | ||
|
|
815dc06118 | ||
|
|
3a2644a2bc | ||
|
|
65690fca65 | ||
|
|
25288b1afd | ||
|
|
288e794c99 | ||
|
|
c567a06ff5 | ||
|
|
e5b68a8f4c | ||
|
|
51a5c77cb8 | ||
|
|
b9e7a3daa7 | ||
|
|
80b2d9481f | ||
|
|
0e2eaa9b34 | ||
|
|
0263188431 | ||
|
|
fa30639784 | ||
|
|
015b8dcf13 | ||
|
|
9f3240346c | ||
|
|
b76364db31 | ||
|
|
a065c12e83 | ||
|
|
76831f11fc | ||
|
|
b6aa0cbcba | ||
|
|
5681c87e33 | ||
|
|
46d6e17508 | ||
|
|
1aaa53622d | ||
|
|
bdb189a9bb | ||
|
|
8793110941 | ||
|
|
16bcf59cb0 | ||
|
|
f6b092b12d | ||
|
|
d47591e253 | ||
|
|
1a91588c42 | ||
|
|
39a57700bc | ||
|
|
1a54f6b7ef | ||
|
|
eb3cf303ad | ||
|
|
0d31a51eeb | ||
|
|
61d1af0413 | ||
|
|
4aa15401c3 | ||
|
|
80b1b1b672 | ||
|
|
0ec83f8736 | ||
|
|
db54f78e8e | ||
|
|
b8fa7da972 | ||
|
|
bf1be16d11 | ||
|
|
cc79edb312 | ||
|
|
ac4f2b8215 | ||
|
|
c8fc54bfb1 | ||
|
|
d574012871 | ||
|
|
250a54220c | ||
|
|
5baf16622f | ||
|
|
256419004d | ||
|
|
6a693e7181 | ||
|
|
b38cfa473e | ||
|
|
26f8216ec8 | ||
|
|
63f3c04c57 | ||
|
|
8a0f1d846e | ||
|
|
efaeb3b110 | ||
|
|
6cebfa469d | ||
|
|
205775ac97 | ||
|
|
4cc181cedc | ||
|
|
a149c5fc60 | ||
|
|
6e809b6a31 | ||
|
|
7c6fe56043 | ||
|
|
8cc11d1688 | ||
|
|
dbc5c065f8 | ||
|
|
4a54e914fc | ||
|
|
b30aefcfb1 | ||
|
|
b29346ecdf | ||
|
|
ef8da3864f | ||
|
|
108eb297d8 | ||
|
|
19f3acd9f0 | ||
|
|
3ee6b0ff0b | ||
|
|
e270f7da1b | ||
|
|
e6117decd0 | ||
|
|
c7127cb248 | ||
|
|
50234e5f04 | ||
|
|
5f562dc113 | ||
|
|
bb8bad49dc | ||
|
|
a674d882bf | ||
|
|
f51e045cd5 | ||
|
|
8122b7f69e | ||
|
|
25f18beda4 | ||
|
|
7e7923706f | ||
|
|
ae35673489 | ||
|
|
23f142fdc6 | ||
|
|
101139fabf | ||
|
|
e2d354c8f2 | ||
|
|
7c178805ea | ||
|
|
45f70e741f | ||
|
|
1474a82c7d | ||
|
|
d97feca3ba | ||
|
|
b2669e78bf | ||
|
|
66ee6e8201 | ||
|
|
62f050fda7 | ||
|
|
57425377e5 | ||
|
|
174cb2f8a9 | ||
|
|
42bddce21f | ||
|
|
f2a15795a1 | ||
|
|
6dd5e515c5 | ||
|
|
92da02ef3e | ||
|
|
3ce7129492 | ||
|
|
336ee28888 | ||
|
|
3f2240ab65 | ||
|
|
1087037728 | ||
|
|
1959d82912 | ||
|
|
8024144381 | ||
|
|
6a1dcab7a6 | ||
|
|
e6d1f2a7c8 | ||
|
|
44c4722edf | ||
|
|
e5fc63f2c8 | ||
|
|
015a99e87d | ||
|
|
884491d72b | ||
|
|
e14362f322 | ||
|
|
917aa48072 | ||
|
|
938c6ef829 | ||
|
|
0add01d383 | ||
|
|
2018024810 | ||
|
|
a1d6bcb8e5 | ||
|
|
727ac6483b | ||
|
|
2c15c09fc0 | ||
|
|
2ad2582cc0 | ||
|
|
cee0ac213c | ||
|
|
780a673017 | ||
|
|
af71203955 | ||
|
|
fc3acfabb2 | ||
|
|
3d5db8313a | ||
|
|
73cf8f34e3 | ||
|
|
766efd6079 | ||
|
|
87485948ad | ||
|
|
7e4a73ce2d | ||
|
|
2f0878d9b7 | ||
|
|
f65c9b23fc | ||
|
|
cd859d117f | ||
|
|
e22964915a | ||
|
|
197d0b6ca9 | ||
|
|
422503ef98 | ||
|
|
ea36345d2c | ||
|
|
a89d83cbba | ||
|
|
83ff31b620 | ||
|
|
3a9b032c72 | ||
|
|
f73e9225b4 | ||
|
|
168ccb0dfc | ||
|
|
58f7f5b769 | ||
|
|
b8e6369fbe | ||
|
|
d81d5f499f | ||
|
|
4be178d234 | ||
|
|
9c40466b4b | ||
|
|
95693fb58e | ||
|
|
e7945bea94 | ||
|
|
91f49e1efd | ||
|
|
eea9c1618c | ||
|
|
f1b38e4e48 | ||
|
|
ff99a1d768 | ||
|
|
7f07b8f66c | ||
|
|
faae03da6b | ||
|
|
a6e4f96737 | ||
|
|
cc7585bbc2 | ||
|
|
14a0cd3ffd | ||
|
|
3ff83eda45 | ||
|
|
f133b00851 | ||
|
|
ece840834d | ||
|
|
76f6ff4145 | ||
|
|
2458cde498 | ||
|
|
82e2b8a169 | ||
|
|
5aa2abaf9f | ||
|
|
fdb2308c62 | ||
|
|
4cd2f2cd52 | ||
|
|
88cef85f62 | ||
|
|
bdd11f741b | ||
|
|
56ce780522 | ||
|
|
567010e163 | ||
|
|
4ae2c81157 | ||
|
|
ae43e2016f | ||
|
|
3f6cbfa4dd | ||
|
|
1c50b5285e | ||
|
|
ea9c511db8 | ||
|
|
e1e3f32643 | ||
|
|
4290cffe3b | ||
|
|
548d095611 | ||
|
|
846dcbb947 | ||
|
|
d7d3368cc2 | ||
|
|
134040fea3 | ||
|
|
65caa26d40 | ||
|
|
7812f6b75a | ||
|
|
637e58f255 | ||
|
|
6135630fc0 | ||
|
|
22058c5f86 | ||
|
|
616bdb35f3 | ||
|
|
42f7b5d12b | ||
|
|
53818b0e36 | ||
|
|
6f08b13540 | ||
|
|
d36526b1c8 | ||
|
|
1252eb6a8a | ||
|
|
4733c31a2f | ||
|
|
17c5173d8b | ||
|
|
d0a08f6dd7 | ||
|
|
7b5d6d186b | ||
|
|
3851927396 | ||
|
|
7eececead6 | ||
|
|
b8c3d96fcd | ||
|
|
a2ee6c8e73 | ||
|
|
ef069d9b0e | ||
|
|
6a864f9f47 | ||
|
|
5c16399810 | ||
|
|
0141ded35d | ||
|
|
bb46e80d44 | ||
|
|
1bd5eca73d | ||
|
|
48a97abe1d | ||
|
|
0ff8a11c7f | ||
|
|
8b1cdaa4a1 | ||
|
|
0bbaa9763b | ||
|
|
dbe5f23e21 | ||
|
|
7353be413c | ||
|
|
398bc2ff41 | ||
|
|
ae1126d43f | ||
|
|
46d16811b9 | ||
|
|
f8635a124f | ||
|
|
c3c50e9a6a | ||
|
|
cb0f9c58d2 | ||
|
|
8643bdc9d7 | ||
|
|
5b51999df7 | ||
|
|
64cc2895f3 | ||
|
|
51a82655a9 | ||
|
|
0e1fed3c24 | ||
|
|
e9fce801a0 | ||
|
|
1164801376 | ||
|
|
12e608468b | ||
|
|
ed3e9d31f4 | ||
|
|
44000459da | ||
|
|
9d8906d250 | ||
|
|
a26844ea45 | ||
|
|
da7d8b04a8 | ||
|
|
12bc26b6b4 | ||
|
|
976a326f47 | ||
|
|
b901043bfc | ||
|
|
624a4c08b9 | ||
|
|
c9ce9ebb2e | ||
|
|
a3ee7c96a0 | ||
|
|
d33b2d2af9 | ||
|
|
830ccfe245 | ||
|
|
78b6b3afdf | ||
|
|
c4fd725875 | ||
|
|
4800ec6392 | ||
|
|
3e2d12a224 | ||
|
|
ddd5a9ae79 | ||
|
|
950dad9489 | ||
|
|
c19223b7fe | ||
|
|
80050d0d9d | ||
|
|
c2be0ec71b | ||
|
|
ccc4f87ada | ||
|
|
534600c1ff | ||
|
|
0f1bbc3161 | ||
|
|
615948c73f | ||
|
|
b9fc40409a | ||
|
|
e53d6bce68 | ||
|
|
ce3b7dfb1e | ||
|
|
19541c27ff | ||
|
|
c94761f312 | ||
|
|
b4e1a62cb4 | ||
|
|
7caef7f49c | ||
|
|
6737384d27 | ||
|
|
f61a0ae78a | ||
|
|
d1662d7658 | ||
|
|
72fe124e30 | ||
|
|
a48c2fb119 | ||
|
|
07ec4ca63e | ||
|
|
83f86a45b6 | ||
|
|
45ad7f020a | ||
|
|
2470081789 | ||
|
|
c11d5fe9e6 | ||
|
|
90e8714e71 | ||
|
|
5539519691 | ||
|
|
b566b66590 | ||
|
|
7389d9e2cb | ||
|
|
1d61cbe536 | ||
|
|
2807ce495e | ||
|
|
ba7285192c | ||
|
|
8c39e085f4 | ||
|
|
b257c60636 | ||
|
|
6b579d65ef | ||
|
|
d4ed2efa71 | ||
|
|
3667b16cba | ||
|
|
2b3e8e1a89 | ||
|
|
f5a6f14ade | ||
|
|
01a9ab332e | ||
|
|
9d688e0894 | ||
|
|
7d35144952 | ||
|
|
7e794bd134 | ||
|
|
dc333d4321 | ||
|
|
590f699687 | ||
|
|
dde683d911 | ||
|
|
950bfce420 | ||
|
|
5b64cb3400 | ||
|
|
712274d912 | ||
|
|
bdd9d65146 | ||
|
|
60ed0653bc | ||
|
|
bce0cac48f | ||
|
|
bd0f1d024b | ||
|
|
5944b842de | ||
|
|
12af311ce7 | ||
|
|
62719ab544 | ||
|
|
0315b004a7 | ||
|
|
87be3ac235 | ||
|
|
011530e11b | ||
|
|
4bfa686433 | ||
|
|
c67844d356 | ||
|
|
8ded89e8d4 | ||
|
|
4c4a179bce | ||
|
|
a4f21fb0d4 | ||
|
|
329acbb251 | ||
|
|
fd55139c82 | ||
|
|
7b7f5b542e | ||
|
|
92daabc75c | ||
|
|
068e07bd5d | ||
|
|
436ef7bd5c | ||
|
|
09cd1e8540 | ||
|
|
cd54aec2f9 | ||
|
|
078af59fd8 | ||
|
|
36b8731cfe | ||
|
|
9fdfacb314 | ||
|
|
e8cb6ffaa0 | ||
|
|
2be452d83e | ||
|
|
b0e6c1cc4e | ||
|
|
45d348b03d | ||
|
|
4b0cceb91a | ||
|
|
db41f106bc | ||
|
|
b6fdb7d0e7 | ||
|
|
1a3fc86894 | ||
|
|
83819cb3f9 | ||
|
|
feabfc86fa | ||
|
|
9b0b337dc0 | ||
|
|
9446cc8245 | ||
|
|
68c62087dc | ||
|
|
8dcc1e3567 | ||
|
|
e22791ec88 | ||
|
|
286f9a8978 | ||
|
|
97167e75ff | ||
|
|
2b2aa9a211 | ||
|
|
81862d4fa1 | ||
|
|
2fdf09e6e7 | ||
|
|
09e3cfd881 | ||
|
|
54ffd1d351 | ||
|
|
86e8ba12e7 | ||
|
|
f482087475 | ||
|
|
fe1d609d1a | ||
|
|
a20fa4a97a | ||
|
|
f51751ad21 | ||
|
|
197d8dba93 | ||
|
|
3ca90a5f89 | ||
|
|
6156eb9ff4 | ||
|
|
f8f4bfd76f | ||
|
|
5677ff2edf | ||
|
|
61c281ec6b | ||
|
|
770e0db7b8 | ||
|
|
6a35ab1dc0 | ||
|
|
3a78c0964f | ||
|
|
4685f6793d | ||
|
|
2e77c9d449 | ||
|
|
a6703ecb98 | ||
|
|
57a8186e88 | ||
|
|
d808bfaec6 | ||
|
|
7072bf1e83 | ||
|
|
4e0a6d2941 | ||
|
|
0d618bb1ef | ||
|
|
a0121f2f0c | ||
|
|
98f001395c | ||
|
|
68fe085aa3 | ||
|
|
4861405683 | ||
|
|
310bfe509e | ||
|
|
f25a614333 | ||
|
|
0ae8c1820a | ||
|
|
e776f18192 | ||
|
|
72d71664b3 | ||
|
|
1046fc192e | ||
|
|
c48a275d33 | ||
|
|
79e08c74ed | ||
|
|
3f2ad7b719 | ||
|
|
5e8c3f8ff3 | ||
|
|
ddab1a0626 | ||
|
|
d950e3c9de | ||
|
|
46298c7675 | ||
|
|
14d917179c | ||
|
|
a65773338c | ||
|
|
9b5a43e4bd | ||
|
|
46207cfe10 | ||
|
|
242bb6ffa2 | ||
|
|
e6713db677 | ||
|
|
11784e55b2 | ||
|
|
a72e8a698d | ||
|
|
28c93612e6 | ||
|
|
a9d17882e7 | ||
|
|
cf63bbd003 | ||
|
|
02f62882b8 | ||
|
|
362715bbeb | ||
|
|
ec70ea6994 | ||
|
|
04adf14146 | ||
|
|
406ec0ba71 | ||
|
|
e2eaa0aa4e | ||
|
|
a2ad3d4ff4 | ||
|
|
4a29cd1664 | ||
|
|
0462a93f11 | ||
|
|
91bcbe496b |
@@ -1,10 +1,2 @@
|
||||
Dockerfile
|
||||
# Docs
|
||||
doc/
|
||||
# GitHub stuff
|
||||
.github
|
||||
.gitignore
|
||||
.travis.yml
|
||||
LICENSE
|
||||
README.md
|
||||
node_modules
|
||||
**
|
||||
!release
|
||||
|
||||
6
.editorconfig
Normal file
@@ -0,0 +1,6 @@
|
||||
root = true
|
||||
|
||||
[*]
|
||||
indent_style = space
|
||||
trim_trailing_whitespace = true
|
||||
indent_size = 2
|
||||
23
.eslintrc.yaml
Normal file
@@ -0,0 +1,23 @@
|
||||
parser: "@typescript-eslint/parser"
|
||||
env:
|
||||
browser: true
|
||||
es6: true # Map, etc.
|
||||
mocha: true
|
||||
node: true
|
||||
|
||||
parserOptions:
|
||||
ecmaVersion: 2018
|
||||
sourceType: module
|
||||
|
||||
extends:
|
||||
- eslint:recommended
|
||||
- plugin:@typescript-eslint/recommended
|
||||
- plugin:import/recommended
|
||||
- plugin:import/typescript
|
||||
- plugin:prettier/recommended
|
||||
- prettier # Removes eslint rules that conflict with prettier.
|
||||
- prettier/@typescript-eslint # Remove conflicts again.
|
||||
|
||||
rules:
|
||||
# For overloads.
|
||||
no-dupe-class-members: off
|
||||
3
.github/CODEOWNERS
vendored
@@ -1,2 +1 @@
|
||||
* @code-asher @kylecarbs
|
||||
Dockerfile @nhooyr
|
||||
* @code-asher @nhooyr
|
||||
|
||||
22
.github/ISSUE_TEMPLATE/bug_report.md
vendored
@@ -1,22 +0,0 @@
|
||||
---
|
||||
name: Bug Report
|
||||
about: Report problems and unexpected behavior.
|
||||
title: ''
|
||||
labels: 'bug'
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
<!-- Please search existing issues to avoid creating duplicates. -->
|
||||
<!-- All extension-specific issues should be created with the `Extension Bug` template. -->
|
||||
|
||||
- `code-server` version: <!-- The version of code-server -->
|
||||
- OS Version: <!-- OS version, cloud provider, -->
|
||||
|
||||
## Description
|
||||
|
||||
<!-- Describes the problem here -->
|
||||
|
||||
## Steps to Reproduce
|
||||
|
||||
1. <!-- step 1: click ... -->
|
||||
1. <!-- step 2: ... -->
|
||||
22
.github/ISSUE_TEMPLATE/extension_bug.md
vendored
@@ -1,22 +0,0 @@
|
||||
---
|
||||
name: Extension Bug
|
||||
about: Report problems and unexpected behavior with extensions.
|
||||
title: ''
|
||||
labels: 'extension-specific'
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
<!-- Please search existing issues to avoid creating duplicates. -->
|
||||
|
||||
- `code-server` version: <!-- The version of code-server -->
|
||||
- OS Version: <!-- OS version, cloud provider, -->
|
||||
- Extension: <!-- Link to extension -->
|
||||
|
||||
## Description
|
||||
|
||||
<!-- Describes the problem here -->
|
||||
|
||||
## Steps to Reproduce
|
||||
|
||||
1. <!-- step 1: click ... -->
|
||||
1. <!-- step 2: ... -->
|
||||
11
.github/ISSUE_TEMPLATE/feature_request.md
vendored
@@ -1,11 +0,0 @@
|
||||
---
|
||||
name: Feature Request
|
||||
about: Suggest an idea for this project.
|
||||
title: ''
|
||||
labels: 'feature'
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
<!-- Please search existing issues to avoid creating duplicates. -->
|
||||
|
||||
<!-- Describe the feature you'd like. -->
|
||||
17
.github/ISSUE_TEMPLATE/question.md
vendored
@@ -1,17 +0,0 @@
|
||||
---
|
||||
name: Question
|
||||
about: Ask a question.
|
||||
title: ''
|
||||
labels: 'question'
|
||||
assignees: ''
|
||||
---
|
||||
|
||||
<!-- Please search existing issues to avoid creating duplicates. -->
|
||||
|
||||
## Description
|
||||
|
||||
<!-- A description of the the question. -->
|
||||
|
||||
## Related Issues
|
||||
|
||||
<!-- Any issues related to your question. -->
|
||||
6
.github/issue_template.md
vendored
Normal file
@@ -0,0 +1,6 @@
|
||||
<!--
|
||||
Please file all questions and support requests at https://www.reddit.com/r/codeserver/
|
||||
The issue tracker is only for bugs.
|
||||
|
||||
Please search for existing issues before filing.
|
||||
-->
|
||||
10
.github/pull_request_template.md
vendored
@@ -1,6 +1,4 @@
|
||||
<!-- Please answer these questions before submitting your PR. Thanks! -->
|
||||
|
||||
### Describe in detail the problem you had and how this PR fixes it
|
||||
|
||||
### Is there an open issue you can link to?
|
||||
|
||||
<!--
|
||||
Please link to the issue this PR solves.
|
||||
If there is no existing issue, please first create one unless the fix is minor.
|
||||
-->
|
||||
|
||||
14
.gitignore
vendored
@@ -1,8 +1,8 @@
|
||||
/lib
|
||||
node_modules
|
||||
dist
|
||||
out
|
||||
.DS_Store
|
||||
release
|
||||
.vscode
|
||||
*.tsbuildinfo
|
||||
.cache
|
||||
build
|
||||
dist*
|
||||
out*
|
||||
release*
|
||||
node_modules
|
||||
binaries
|
||||
|
||||
3
.gitmodules
vendored
Normal file
@@ -0,0 +1,3 @@
|
||||
[submodule "lib/vscode"]
|
||||
path = lib/vscode
|
||||
url = https://github.com/microsoft/vscode
|
||||
@@ -1 +0,0 @@
|
||||
10.15.1
|
||||
4
.prettierrc.yaml
Normal file
@@ -0,0 +1,4 @@
|
||||
printWidth: 120
|
||||
semi: false
|
||||
trailingComma: all
|
||||
arrowParens: always
|
||||
2
.stylelintrc.yaml
Normal file
@@ -0,0 +1,2 @@
|
||||
extends:
|
||||
- stylelint-config-recommended
|
||||
94
.travis.yml
@@ -1,51 +1,55 @@
|
||||
language: node_js
|
||||
node_js:
|
||||
- 10.15.1
|
||||
services:
|
||||
- docker
|
||||
matrix:
|
||||
language: minimal
|
||||
|
||||
jobs:
|
||||
include:
|
||||
- os: linux
|
||||
dist: trusty
|
||||
env:
|
||||
- VSCODE_VERSION="1.33.1" MAJOR_VERSION="1" VERSION="$MAJOR_VERSION.$TRAVIS_BUILD_NUMBER-vsc$VSCODE_VERSION" TARGET="centos"
|
||||
- os: linux
|
||||
dist: trusty
|
||||
env:
|
||||
- VSCODE_VERSION="1.33.1" MAJOR_VERSION="1" VERSION="$MAJOR_VERSION.$TRAVIS_BUILD_NUMBER-vsc$VSCODE_VERSION" TARGET="alpine"
|
||||
- os: osx
|
||||
env:
|
||||
- VSCODE_VERSION="1.33.1" MAJOR_VERSION="1" VERSION="$MAJOR_VERSION.$TRAVIS_BUILD_NUMBER-vsc$VSCODE_VERSION"
|
||||
before_install:
|
||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then sudo apt-get install libxkbfile-dev
|
||||
libsecret-1-dev; fi
|
||||
- npm install -g yarn@1.12.3
|
||||
script:
|
||||
- scripts/build.sh
|
||||
- name: Test
|
||||
if: tag IS blank
|
||||
script: ./ci/image/run.sh "yarn && GITHUB_TOKEN=3229b0eec0a1622d6d1d1e00fca5b626070f5a10 yarn vscode && ./ci/ci.sh"
|
||||
deploy: null
|
||||
- name: Linux Release
|
||||
if: tag IS present
|
||||
script:
|
||||
- travis_wait 60 ./ci/image/run.sh "yarn && yarn vscode && ci/release.sh"
|
||||
- ./ci/release-image/push.sh
|
||||
- name: Linux ARM64 Release
|
||||
if: tag IS present
|
||||
script:
|
||||
- ./ci/image/run.sh "yarn && yarn vscode && ci/release.sh"
|
||||
- ./ci/release-image/push.sh
|
||||
arch: arm64
|
||||
- name: MacOS Release
|
||||
if: tag IS present
|
||||
os: osx
|
||||
language: node_js
|
||||
node_js: 12
|
||||
script: yarn && yarn vscode && travis_wait 60 ci/release.sh
|
||||
|
||||
before_deploy:
|
||||
- echo "$VERSION" "$TRAVIS_COMMIT"
|
||||
- git config --local user.name "$USER_NAME"
|
||||
- git config --local user.email "$USER_EMAIL"
|
||||
- git tag "$VERSION" "$TRAVIS_COMMIT"
|
||||
- if [[ “$TRAVIS_OS_NAME” == “osx” ]]; then yarn task package $VERSION; fi
|
||||
- echo "$JSON_KEY" | base64 --decode > ./ci/key.json
|
||||
|
||||
deploy:
|
||||
provider: releases
|
||||
file_glob: true
|
||||
draft: true
|
||||
tag_name: "$VERSION"
|
||||
target_commitish: "$TRAVIS_COMMIT"
|
||||
name: "$VERSION"
|
||||
skip_cleanup: true
|
||||
api_key:
|
||||
secure: YL/x24KjYjgYXPcJWk3FV7FGxI79Mh6gBECQEcdlf3fkLEoKFVgzHBoUNWrFPzyR4tgLyWNAgcpD9Lkme1TRWTom7UPjXcwMNyLcLa+uec7ciSAnYD9ntLTpiCuPDD1u0LtRGclSi/EHQ+F8YVq+HZJpXTsJeAmOmihma3GVbGKSZr+BRum+0YZSG4w+o4TOlYzw/4bLWS52MogZcwpjd+hemBbgXLuGU2ziKv2vEKCZFbEeA16II4x1WLI4mutDdCeh7+3aLzGLwDa49NxtsVYNjyNFF75JhCTCNA55e2YMiLz9Uq69IXe/mi5F7xUaFfhIqqLNyKBnKeEOzu3dYnc+8n3LjnQ+00PmkF05nx9kBn3UfV1kwQGh6QbyDmTtBP07rtUMyI14aeQqHjxsaVRdMnwj9Q2DjXRr8UDqESZF0rmK3pHCXS2fBhIzLE8tLVW5Heiba2pQRFMHMZW+KBE97FzcFh7is90Ait3T8enfcd/PWFPYoBejDAdjwxwOkezh5N5ZkYquEfDYuWrFi6zRFCktsruaAcA+xGtTf9oilBBzUqu8Ie+YFWH5me83xakcblJWdaW/D2rLJAJH3m6LFm8lBqyUgDX5t/etob6CpDuYHu5D1J3XINOj/+aLAcadq6qlh70PMZS3zYffUu3JlzaD2amlSHIT8b5YXFc=
|
||||
file:
|
||||
- release/*.tar.gz
|
||||
- release/*.zip
|
||||
on:
|
||||
repo: cdr/code-server
|
||||
branch: master
|
||||
- provider: releases
|
||||
edge: true
|
||||
draft: true
|
||||
tag_name: $TRAVIS_TAG
|
||||
target_commitish: $TRAVIS_COMMIT
|
||||
name: $TRAVIS_TAG
|
||||
file:
|
||||
- release/*.tar.gz
|
||||
- release/*.zip
|
||||
on:
|
||||
tags: true
|
||||
- provider: gcs
|
||||
edge: true
|
||||
bucket: "codesrv-ci.cdr.sh"
|
||||
upload_dir: "releases"
|
||||
key_file: ./ci/key.json
|
||||
local_dir: release-upload
|
||||
on:
|
||||
tags: true
|
||||
|
||||
cache:
|
||||
timeout: 600
|
||||
yarn: true
|
||||
timeout: 1000
|
||||
directories:
|
||||
- .cache
|
||||
- lib/vscode/.build/extensions
|
||||
|
||||
53
Dockerfile
@@ -1,53 +0,0 @@
|
||||
FROM node:10.15.1
|
||||
|
||||
# Install VS Code's deps. These are the only two it seems we need.
|
||||
RUN apt-get update && apt-get install -y \
|
||||
libxkbfile-dev \
|
||||
libsecret-1-dev
|
||||
|
||||
# Ensure latest yarn.
|
||||
RUN npm install -g yarn@1.13
|
||||
|
||||
WORKDIR /src
|
||||
COPY . .
|
||||
|
||||
# In the future, we can use https://github.com/yarnpkg/rfcs/pull/53 to make yarn use the node_modules
|
||||
# directly which should be fast as it is slow because it populates its own cache every time.
|
||||
RUN yarn && NODE_ENV=production yarn task build:server:binary
|
||||
|
||||
# We deploy with ubuntu so that devs have a familiar environment.
|
||||
FROM ubuntu:18.04
|
||||
|
||||
RUN apt-get update && apt-get install -y \
|
||||
openssl \
|
||||
net-tools \
|
||||
git \
|
||||
locales \
|
||||
sudo \
|
||||
dumb-init \
|
||||
vim \
|
||||
curl \
|
||||
wget
|
||||
|
||||
RUN locale-gen en_US.UTF-8
|
||||
# We unfortunately cannot use update-locale because docker will not use the env variables
|
||||
# configured in /etc/default/locale so we need to set it manually.
|
||||
ENV LC_ALL=en_US.UTF-8
|
||||
|
||||
RUN adduser --gecos '' --disabled-password coder && \
|
||||
echo "coder ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/nopasswd
|
||||
|
||||
USER coder
|
||||
# We create first instead of just using WORKDIR as when WORKDIR creates, the user is root.
|
||||
RUN mkdir -p /home/coder/project
|
||||
|
||||
WORKDIR /home/coder/project
|
||||
|
||||
# This assures we have a volume mounted even if the user forgot to do bind mount.
|
||||
# So that they do not lose their data if they delete the container.
|
||||
VOLUME [ "/home/coder/project" ]
|
||||
|
||||
COPY --from=0 /src/packages/server/cli-linux-x64 /usr/local/bin/code-server
|
||||
EXPOSE 8443
|
||||
|
||||
ENTRYPOINT ["dumb-init", "code-server"]
|
||||
96
README.md
@@ -1,90 +1,58 @@
|
||||
# code-server
|
||||
|
||||
[](https://github.com/cdr/code-server/issues)
|
||||
[](https://github.com/cdr/code-server/releases/latest)
|
||||
[](https://github.com/cdr/code-server/blob/master/LICENSE)
|
||||
[](https://discord.gg/zxSwN8Z)
|
||||
|
||||
`code-server` is [VS Code](https://github.com/Microsoft/vscode) running on a remote server, accessible through the browser.
|
||||
`code-server` is [VS Code](https://github.com/Microsoft/vscode) running on a
|
||||
remote server, accessible through the browser.
|
||||
|
||||
Try it out:
|
||||
|
||||
```bash
|
||||
docker run -it -p 127.0.0.1:8443:8443 -v "${PWD}:/home/coder/project" codercom/code-server --allow-http --no-auth
|
||||
docker run -it -p 127.0.0.1:8080:8080 -v "$PWD:/home/coder/project" codercom/code-server
|
||||
```
|
||||
|
||||
- Code on your Chromebook, tablet, and laptop with a consistent dev environment.
|
||||
- If you have a Windows or Mac workstation, more easily develop for Linux.
|
||||
- Take advantage of large cloud servers to speed up tests, compilations, downloads, and more.
|
||||
- Preserve battery life when you're on the go.
|
||||
- All intensive computation runs on your server.
|
||||
- You're no longer running excess instances of Chrome.
|
||||
- **Code anywhere:** Code on your Chromebook, tablet, and laptop with a
|
||||
consistent dev environment. Develop on a Linux machine and pick up from any
|
||||
device with a web browser.
|
||||
- **Server-powered:** Take advantage of large cloud servers to speed up tests,
|
||||
compilations, downloads, and more. Preserve battery life when you're on the go
|
||||
since all intensive computation runs on your server.
|
||||
|
||||

|
||||

|
||||
|
||||
## Getting Started
|
||||
|
||||
### Requirements
|
||||
|
||||
- 64-bit host.
|
||||
- At least 1GB of RAM.
|
||||
- 2 cores or more are recommended (1 core works but not optimally).
|
||||
- Secure connection over HTTPS or localhost (required for service workers and
|
||||
clipboard support).
|
||||
- For Linux: GLIBC 2.17 or later and GLIBCXX 3.4.15 or later.
|
||||
|
||||
### Run over SSH
|
||||
|
||||
Use [sshcode](https://github.com/codercom/sshcode) for a simple setup.
|
||||
|
||||
### Docker
|
||||
### Digital Ocean
|
||||
|
||||
See docker oneliner mentioned above. Dockerfile is at [/Dockerfile](/Dockerfile).
|
||||
[](https://marketplace.digitalocean.com/apps/code-server)
|
||||
|
||||
### Binaries
|
||||
### Releases
|
||||
|
||||
1. [Download a binary](https://github.com/cdr/code-server/releases) (Linux and OS X supported. Windows coming soon)
|
||||
2. Start the binary with the project directory as the first argument
|
||||
1. [Download a release](https://github.com/cdr/code-server/releases). (Linux and
|
||||
OS X supported. Windows support planned.)
|
||||
2. Unpack the downloaded release then run the included `code-server` script.
|
||||
3. In your browser navigate to `localhost:8080`.
|
||||
|
||||
```
|
||||
code-server <initial directory to open>
|
||||
```
|
||||
> You will be prompted to enter the password shown in the CLI
|
||||
`code-server` should now be running at https://localhost:8443.
|
||||
## FAQ
|
||||
|
||||
> code-server uses a self-signed SSL certificate that may prompt your browser to ask you some additional questions before you proceed. Please [read here](doc/self-hosted/index.md) for more information.
|
||||
|
||||
For detailed instructions and troubleshooting, see the [self-hosted quick start guide](doc/self-hosted/index.md).
|
||||
|
||||
Quickstart guides for [Google Cloud](doc/admin/install/google_cloud.md), [AWS](doc/admin/install/aws.md), and [DigitalOcean](doc/admin/install/digitalocean.md).
|
||||
|
||||
How to [secure your setup](/doc/security/ssl.md).
|
||||
|
||||
## Development
|
||||
|
||||
### Known Issues
|
||||
|
||||
- Creating custom VS Code extensions and debugging them doesn't work.
|
||||
|
||||
### Future
|
||||
- **Stay up to date!** Get notified about new releases of code-server.
|
||||

|
||||
- Windows support.
|
||||
- Electron and Chrome OS applications to bridge the gap between local<->remote.
|
||||
- Run VS Code unit tests against our builds to ensure features work as expected.
|
||||
|
||||
### Extensions
|
||||
|
||||
At the moment we can't use the official VSCode Marketplace. We've created a custom extension marketplace focused around open-sourced extensions. However, if you have access to the `.vsix` file, you can manually install the extension.
|
||||
|
||||
## Telemetry
|
||||
|
||||
Use the `--disable-telemetry` flag or set `DISABLE_TELEMETRY=true` to disable tracking ENTIRELY.
|
||||
|
||||
We use data collected to improve code-server.
|
||||
See [./doc/FAQ.md](./doc/FAQ.md).
|
||||
|
||||
## Contributing
|
||||
|
||||
Development guides are coming soon.
|
||||
|
||||
## License
|
||||
|
||||
[MIT](LICENSE)
|
||||
See [./doc/CONTRIBUTING.md](./doc/CONTRIBUTING.md).
|
||||
|
||||
## Enterprise
|
||||
|
||||
Visit [our enterprise page](https://coder.com/enterprise) for more information about our enterprise offering.
|
||||
|
||||
## Commercialization
|
||||
|
||||
If you would like to commercialize code-server, please contact contact@coder.com.
|
||||
Visit [our enterprise page](https://coder.com) for more information about our
|
||||
enterprise offerings.
|
||||
|
||||
@@ -1,42 +0,0 @@
|
||||
/**
|
||||
* Script that detects platform name and arch.
|
||||
* Cannot use os.platform() as that won't detect libc version
|
||||
*/
|
||||
import * as cp from "child_process";
|
||||
import * as fs from "fs";
|
||||
import * as os from "os";
|
||||
|
||||
enum Lib {
|
||||
GLIBC,
|
||||
MUSL,
|
||||
}
|
||||
|
||||
const CLIB: Lib | undefined = ((): Lib | undefined => {
|
||||
if (os.platform() !== "linux") {
|
||||
return;
|
||||
}
|
||||
const glibc = cp.spawnSync("getconf", ["GNU_LIBC_VERSION"]);
|
||||
if (glibc.status === 0) {
|
||||
return Lib.GLIBC;
|
||||
}
|
||||
|
||||
const ldd = cp.spawnSync("ldd", ["--version"]);
|
||||
if (ldd.stdout && ldd.stdout.indexOf("musl") !== -1) {
|
||||
return Lib.MUSL;
|
||||
}
|
||||
|
||||
const muslFile = fs.readdirSync("/lib").find((value) => value.startsWith("libc.musl"));
|
||||
if (muslFile) {
|
||||
return Lib.MUSL;
|
||||
}
|
||||
|
||||
return Lib.GLIBC;
|
||||
})();
|
||||
|
||||
export const platform = (): NodeJS.Platform | "musl" => {
|
||||
if (CLIB === Lib.MUSL) {
|
||||
return "musl";
|
||||
}
|
||||
|
||||
return os.platform();
|
||||
};
|
||||
209
build/tasks.ts
@@ -1,209 +0,0 @@
|
||||
import { register, run } from "@coder/runner";
|
||||
import { logger, field } from "@coder/logger";
|
||||
import * as fs from "fs";
|
||||
import * as fse from "fs-extra";
|
||||
import * as os from "os";
|
||||
import { platform } from "./platform";
|
||||
import * as path from "path";
|
||||
import * as zlib from "zlib";
|
||||
import * as https from "https";
|
||||
import * as tar from "tar";
|
||||
|
||||
const isWin = os.platform() === "win32";
|
||||
const libPath = path.join(__dirname, "../lib");
|
||||
const vscodePath = path.join(libPath, "vscode");
|
||||
const defaultExtensionsPath = path.join(libPath, "extensions");
|
||||
const pkgsPath = path.join(__dirname, "../packages");
|
||||
const vscodeVersion = process.env.VSCODE_VERSION || "1.33.1";
|
||||
const vsSourceUrl = `https://codesrv-ci.cdr.sh/vstar-${vscodeVersion}.tar.gz`;
|
||||
|
||||
const buildServerBinary = register("build:server:binary", async (runner) => {
|
||||
logger.info("Building with environment", field("env", {
|
||||
NODE_ENV: process.env.NODE_ENV,
|
||||
VERSION: process.env.VERSION,
|
||||
}));
|
||||
|
||||
await ensureInstalled();
|
||||
await Promise.all([
|
||||
buildBootstrapFork(),
|
||||
buildWeb(),
|
||||
buildServerBundle(),
|
||||
buildAppBrowser(),
|
||||
]);
|
||||
|
||||
await buildServerBinaryPackage();
|
||||
});
|
||||
|
||||
const buildServerBinaryPackage = register("build:server:binary:package", async (runner) => {
|
||||
const cliPath = path.join(pkgsPath, "server");
|
||||
runner.cwd = cliPath;
|
||||
if (!fs.existsSync(path.join(cliPath, "out"))) {
|
||||
throw new Error("Cannot build binary without server bundle built");
|
||||
}
|
||||
await buildServerBinaryCopy();
|
||||
const resp = await runner.execute(isWin ? "npm.cmd" : "npm", ["run", "build:binary"]);
|
||||
if (resp.exitCode !== 0) {
|
||||
throw new Error(`Failed to package binary: ${resp.stderr}`);
|
||||
}
|
||||
});
|
||||
|
||||
const buildServerBinaryCopy = register("build:server:binary:copy", async (runner) => {
|
||||
const cliPath = path.join(pkgsPath, "server");
|
||||
const cliBuildPath = path.join(cliPath, "build");
|
||||
fse.removeSync(cliBuildPath);
|
||||
fse.mkdirpSync(path.join(cliBuildPath, "extensions"));
|
||||
const bootstrapForkPath = path.join(pkgsPath, "vscode", "out", "bootstrap-fork.js");
|
||||
const webOutputPath = path.join(pkgsPath, "web", "out");
|
||||
const browserAppOutputPath = path.join(pkgsPath, "app", "browser", "out");
|
||||
let ripgrepPath = path.join(pkgsPath, "..", "lib", "vscode", "node_modules", "vscode-ripgrep", "bin", "rg");
|
||||
if (isWin) {
|
||||
ripgrepPath += ".exe";
|
||||
}
|
||||
|
||||
if (!fs.existsSync(webOutputPath)) {
|
||||
throw new Error("Web bundle must be built");
|
||||
}
|
||||
if (!fs.existsSync(defaultExtensionsPath)) {
|
||||
throw new Error("Default extensions must be built");
|
||||
}
|
||||
if (!fs.existsSync(bootstrapForkPath)) {
|
||||
throw new Error("Bootstrap fork must exist");
|
||||
}
|
||||
if (!fs.existsSync(ripgrepPath)) {
|
||||
throw new Error("Ripgrep must exist");
|
||||
}
|
||||
fse.copySync(defaultExtensionsPath, path.join(cliBuildPath, "extensions"));
|
||||
fs.writeFileSync(path.join(cliBuildPath, "bootstrap-fork.js.gz"), zlib.gzipSync(fs.readFileSync(bootstrapForkPath)));
|
||||
const cpDir = (dir: string, rootPath: string, subdir?: "login"): void => {
|
||||
const stat = fs.statSync(dir);
|
||||
if (stat.isDirectory()) {
|
||||
const paths = fs.readdirSync(dir);
|
||||
paths.forEach((p) => cpDir(path.join(dir, p), rootPath, subdir));
|
||||
} else if (stat.isFile()) {
|
||||
const newPath = path.join(cliBuildPath, "web", subdir || "", path.relative(rootPath, dir));
|
||||
fse.mkdirpSync(path.dirname(newPath));
|
||||
fs.writeFileSync(newPath + ".gz", zlib.gzipSync(fs.readFileSync(dir)));
|
||||
} else {
|
||||
// Nothing
|
||||
}
|
||||
};
|
||||
cpDir(webOutputPath, webOutputPath);
|
||||
cpDir(browserAppOutputPath, browserAppOutputPath, "login");
|
||||
fse.mkdirpSync(path.join(cliBuildPath, "dependencies"));
|
||||
fse.copySync(ripgrepPath, path.join(cliBuildPath, "dependencies", "rg"));
|
||||
});
|
||||
|
||||
const buildServerBundle = register("build:server:bundle", async (runner) => {
|
||||
const cliPath = path.join(pkgsPath, "server");
|
||||
runner.cwd = cliPath;
|
||||
await runner.execute(isWin ? "npm.cmd" : "npm", ["run", "build"]);
|
||||
});
|
||||
|
||||
const buildBootstrapFork = register("build:bootstrap-fork", async (runner) => {
|
||||
await ensureInstalled();
|
||||
await ensurePatched();
|
||||
|
||||
const vscodePkgPath = path.join(pkgsPath, "vscode");
|
||||
runner.cwd = vscodePkgPath;
|
||||
await runner.execute(isWin ? "npm.cmd" : "npm", ["run", "build:bootstrap-fork"]);
|
||||
});
|
||||
|
||||
const buildAppBrowser = register("build:app:browser", async (runner) => {
|
||||
await ensureInstalled();
|
||||
|
||||
const appPath = path.join(pkgsPath, "app/browser");
|
||||
runner.cwd = appPath;
|
||||
fse.removeSync(path.join(appPath, "out"));
|
||||
await runner.execute(isWin ? "npm.cmd" : "npm", ["run", "build"]);
|
||||
});
|
||||
|
||||
const buildWeb = register("build:web", async (runner) => {
|
||||
await ensureInstalled();
|
||||
await ensurePatched();
|
||||
|
||||
const webPath = path.join(pkgsPath, "web");
|
||||
runner.cwd = webPath;
|
||||
fse.removeSync(path.join(webPath, "out"));
|
||||
await runner.execute(isWin ? "npm.cmd" : "npm", ["run", "build"]);
|
||||
});
|
||||
|
||||
const ensureInstalled = register("vscode:install", async (runner) => {
|
||||
runner.cwd = libPath;
|
||||
|
||||
if (fs.existsSync(vscodePath) && fs.existsSync(defaultExtensionsPath)) {
|
||||
const pkgVersion = JSON.parse(fs.readFileSync(path.join(vscodePath, "package.json")).toString("utf8")).version;
|
||||
if (pkgVersion === vscodeVersion) {
|
||||
runner.cwd = vscodePath;
|
||||
|
||||
const reset = await runner.execute("git", ["reset", "--hard"]);
|
||||
if (reset.exitCode !== 0) {
|
||||
throw new Error(`Failed to clean git repository: ${reset.stderr}`);
|
||||
}
|
||||
|
||||
return;
|
||||
}
|
||||
}
|
||||
|
||||
fse.removeSync(libPath);
|
||||
fse.mkdirpSync(libPath);
|
||||
|
||||
await new Promise<void>((resolve, reject): void => {
|
||||
https.get(vsSourceUrl, (res) => {
|
||||
if (res.statusCode !== 200) {
|
||||
return reject(res.statusMessage);
|
||||
}
|
||||
|
||||
res.pipe(tar.x({
|
||||
C: libPath,
|
||||
}).on("finish", () => {
|
||||
resolve();
|
||||
}).on("error", (err: Error) => {
|
||||
reject(err);
|
||||
}));
|
||||
}).on("error", (err) => {
|
||||
reject(err);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
const ensurePatched = register("vscode:patch", async (runner) => {
|
||||
if (!fs.existsSync(vscodePath)) {
|
||||
throw new Error("vscode must be cloned to patch");
|
||||
}
|
||||
await ensureInstalled();
|
||||
|
||||
runner.cwd = vscodePath;
|
||||
const patchPath = path.join(__dirname, "../scripts/vscode.patch");
|
||||
const apply = await runner.execute("git", ["apply", "--unidiff-zero", patchPath]);
|
||||
if (apply.exitCode !== 0) {
|
||||
throw new Error(`Failed to apply patches: ${apply.stderr}`);
|
||||
}
|
||||
});
|
||||
|
||||
register("package", async (runner, releaseTag) => {
|
||||
if (!releaseTag) {
|
||||
throw new Error("Please specify the release tag.");
|
||||
}
|
||||
|
||||
const releasePath = path.resolve(__dirname, "../release");
|
||||
|
||||
const archiveName = `code-server${releaseTag}-${platform()}-${os.arch()}`;
|
||||
const archiveDir = path.join(releasePath, archiveName);
|
||||
fse.removeSync(archiveDir);
|
||||
fse.mkdirpSync(archiveDir);
|
||||
|
||||
const binaryPath = path.join(__dirname, `../packages/server/cli-${platform()}-${os.arch()}`);
|
||||
const binaryDestination = path.join(archiveDir, "code-server");
|
||||
fse.copySync(binaryPath, binaryDestination);
|
||||
fs.chmodSync(binaryDestination, "755");
|
||||
["README.md", "LICENSE"].forEach((fileName) => {
|
||||
fse.copySync(path.resolve(__dirname, `../${fileName}`), path.join(archiveDir, fileName));
|
||||
});
|
||||
|
||||
runner.cwd = releasePath;
|
||||
await (os.platform() === "linux"
|
||||
? runner.execute("tar", ["-cvzf", `${archiveName}.tar.gz`, `${archiveName}`])
|
||||
: runner.execute("zip", ["-r", `${archiveName}.zip`, `${archiveName}`]));
|
||||
});
|
||||
|
||||
run();
|
||||
372
ci/build.ts
Normal file
@@ -0,0 +1,372 @@
|
||||
import * as cp from "child_process"
|
||||
import * as fs from "fs-extra"
|
||||
import Bundler from "parcel-bundler"
|
||||
import * as path from "path"
|
||||
import * as util from "util"
|
||||
|
||||
enum Task {
|
||||
Build = "build",
|
||||
Watch = "watch",
|
||||
}
|
||||
|
||||
class Builder {
|
||||
private readonly rootPath = path.resolve(__dirname, "..")
|
||||
private readonly vscodeSourcePath = path.join(this.rootPath, "lib/vscode")
|
||||
private readonly buildPath = path.join(this.rootPath, "build")
|
||||
private readonly codeServerVersion: string
|
||||
private currentTask?: Task
|
||||
|
||||
public constructor() {
|
||||
this.ensureArgument("rootPath", this.rootPath)
|
||||
this.codeServerVersion = this.ensureArgument(
|
||||
"codeServerVersion",
|
||||
process.env.VERSION || require(path.join(this.rootPath, "package.json")).version,
|
||||
)
|
||||
}
|
||||
|
||||
public run(task: Task | undefined): void {
|
||||
this.currentTask = task
|
||||
this.doRun(task).catch((error) => {
|
||||
console.error(error.message)
|
||||
process.exit(1)
|
||||
})
|
||||
}
|
||||
|
||||
private async task<T>(message: string, fn: () => Promise<T>): Promise<T> {
|
||||
const time = Date.now()
|
||||
this.log(`${message}...`, !process.env.CI)
|
||||
try {
|
||||
const t = await fn()
|
||||
process.stdout.write(`took ${Date.now() - time}ms\n`)
|
||||
return t
|
||||
} catch (error) {
|
||||
process.stdout.write("failed\n")
|
||||
throw error
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Writes to stdout with an optional newline.
|
||||
*/
|
||||
private log(message: string, skipNewline = false): void {
|
||||
process.stdout.write(`[${this.currentTask || "default"}] ${message}`)
|
||||
if (!skipNewline) {
|
||||
process.stdout.write("\n")
|
||||
}
|
||||
}
|
||||
|
||||
private async doRun(task: Task | undefined): Promise<void> {
|
||||
if (!task) {
|
||||
throw new Error("No task provided")
|
||||
}
|
||||
|
||||
switch (task) {
|
||||
case Task.Watch:
|
||||
return this.watch()
|
||||
case Task.Build:
|
||||
return this.build()
|
||||
default:
|
||||
throw new Error(`No task matching "${task}"`)
|
||||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Make sure the argument is set. Display the value if it is.
|
||||
*/
|
||||
private ensureArgument(name: string, arg?: string): string {
|
||||
if (!arg) {
|
||||
throw new Error(`${name} is missing`)
|
||||
}
|
||||
this.log(`${name} is "${arg}"`)
|
||||
return arg
|
||||
}
|
||||
|
||||
/**
|
||||
* Build VS Code and code-server.
|
||||
*/
|
||||
private async build(): Promise<void> {
|
||||
process.env.NODE_OPTIONS = "--max-old-space-size=32384 " + (process.env.NODE_OPTIONS || "")
|
||||
process.env.NODE_ENV = "production"
|
||||
|
||||
await this.task("cleaning up old build", async () => {
|
||||
if (!process.env.SKIP_VSCODE) {
|
||||
return fs.remove(this.buildPath)
|
||||
}
|
||||
// If skipping VS Code, keep the existing build if any.
|
||||
try {
|
||||
const files = await fs.readdir(this.buildPath)
|
||||
return Promise.all(files.filter((f) => f !== "lib").map((f) => fs.remove(path.join(this.buildPath, f))))
|
||||
} catch (error) {
|
||||
if (error.code !== "ENOENT") {
|
||||
throw error
|
||||
}
|
||||
}
|
||||
})
|
||||
|
||||
const commit = require(path.join(this.vscodeSourcePath, "build/lib/util")).getVersion(this.rootPath) as string
|
||||
if (!process.env.SKIP_VSCODE) {
|
||||
await this.buildVscode(commit)
|
||||
} else {
|
||||
this.log("skipping vs code build")
|
||||
}
|
||||
await this.buildCodeServer(commit)
|
||||
|
||||
this.log(`final build: ${this.buildPath}`)
|
||||
}
|
||||
|
||||
private async buildCodeServer(commit: string): Promise<void> {
|
||||
await this.task("building code-server", async () => {
|
||||
return util.promisify(cp.exec)("tsc --outDir ./out-build --tsBuildInfoFile ./.prod.tsbuildinfo", {
|
||||
cwd: this.rootPath,
|
||||
})
|
||||
})
|
||||
|
||||
await this.task("bundling code-server", async () => {
|
||||
return this.createBundler("dist-build", commit).bundle()
|
||||
})
|
||||
|
||||
await this.task("copying code-server into build directory", async () => {
|
||||
await fs.mkdirp(this.buildPath)
|
||||
await Promise.all([
|
||||
fs.copy(path.join(this.rootPath, "out-build"), path.join(this.buildPath, "out")),
|
||||
fs.copy(path.join(this.rootPath, "dist-build"), path.join(this.buildPath, "dist")),
|
||||
// For source maps and images.
|
||||
fs.copy(path.join(this.rootPath, "src"), path.join(this.buildPath, "src")),
|
||||
])
|
||||
})
|
||||
|
||||
await this.copyDependencies("code-server", this.rootPath, this.buildPath, false, {
|
||||
commit,
|
||||
version: this.codeServerVersion,
|
||||
})
|
||||
}
|
||||
|
||||
private async buildVscode(commit: string): Promise<void> {
|
||||
await this.task("building vs code", () => {
|
||||
return util.promisify(cp.exec)("yarn gulp compile-build", { cwd: this.vscodeSourcePath })
|
||||
})
|
||||
|
||||
await this.task("building builtin extensions", async () => {
|
||||
const exists = await fs.pathExists(path.join(this.vscodeSourcePath, ".build/extensions"))
|
||||
if (exists && !process.env.CI) {
|
||||
process.stdout.write("already built, skipping...")
|
||||
} else {
|
||||
await util.promisify(cp.exec)("yarn gulp compile-extensions-build", { cwd: this.vscodeSourcePath })
|
||||
}
|
||||
})
|
||||
|
||||
await this.task("optimizing vs code", async () => {
|
||||
return util.promisify(cp.exec)("yarn gulp optimize --gulpfile ./coder.js", { cwd: this.vscodeSourcePath })
|
||||
})
|
||||
|
||||
if (process.env.MINIFY) {
|
||||
await this.task("minifying vs code", () => {
|
||||
return util.promisify(cp.exec)("yarn gulp minify --gulpfile ./coder.js", { cwd: this.vscodeSourcePath })
|
||||
})
|
||||
}
|
||||
|
||||
const vscodeBuildPath = path.join(this.buildPath, "lib/vscode")
|
||||
await this.task("copying vs code into build directory", async () => {
|
||||
await fs.mkdirp(path.join(vscodeBuildPath, "resources/linux"))
|
||||
await Promise.all([
|
||||
fs.move(
|
||||
path.join(this.vscodeSourcePath, `out-vscode${process.env.MINIFY ? "-min" : ""}`),
|
||||
path.join(vscodeBuildPath, "out"),
|
||||
),
|
||||
fs.copy(path.join(this.vscodeSourcePath, ".build/extensions"), path.join(vscodeBuildPath, "extensions")),
|
||||
fs.copy(
|
||||
path.join(this.vscodeSourcePath, "resources/linux/code.png"),
|
||||
path.join(vscodeBuildPath, "resources/linux/code.png"),
|
||||
),
|
||||
])
|
||||
})
|
||||
|
||||
await this.copyDependencies("vs code", this.vscodeSourcePath, vscodeBuildPath, true, {
|
||||
commit,
|
||||
date: new Date().toISOString(),
|
||||
})
|
||||
}
|
||||
|
||||
private async copyDependencies(
|
||||
name: string,
|
||||
sourcePath: string,
|
||||
buildPath: string,
|
||||
ignoreScripts: boolean,
|
||||
merge: object,
|
||||
): Promise<void> {
|
||||
await this.task(`copying ${name} dependencies`, async () => {
|
||||
return Promise.all(
|
||||
["node_modules", "package.json", "yarn.lock"].map((fileName) => {
|
||||
return fs.copy(path.join(sourcePath, fileName), path.join(buildPath, fileName))
|
||||
}),
|
||||
)
|
||||
})
|
||||
|
||||
const fileName = name === "code-server" ? "package" : "product"
|
||||
await this.task(`writing final ${name} ${fileName}.json`, async () => {
|
||||
const json = JSON.parse(await fs.readFile(path.join(sourcePath, `${fileName}.json`), "utf8"))
|
||||
return fs.writeFile(
|
||||
path.join(buildPath, `${fileName}.json`),
|
||||
JSON.stringify(
|
||||
{
|
||||
...json,
|
||||
...merge,
|
||||
},
|
||||
null,
|
||||
2,
|
||||
),
|
||||
)
|
||||
})
|
||||
|
||||
if (process.env.MINIFY) {
|
||||
await this.task(`restricting ${name} to production dependencies`, async () => {
|
||||
await util.promisify(cp.exec)(`yarn --production ${ignoreScripts ? "--ignore-scripts" : ""}`, {
|
||||
cwd: buildPath,
|
||||
})
|
||||
})
|
||||
}
|
||||
}
|
||||
|
||||
private async watch(): Promise<void> {
|
||||
let server: cp.ChildProcess | undefined
|
||||
const restartServer = (): void => {
|
||||
if (server) {
|
||||
server.kill()
|
||||
}
|
||||
const s = cp.fork(path.join(this.rootPath, "out/node/entry.js"), process.argv.slice(3))
|
||||
console.log(`[server] spawned process ${s.pid}`)
|
||||
s.on("exit", () => console.log(`[server] process ${s.pid} exited`))
|
||||
server = s
|
||||
}
|
||||
|
||||
const vscode = cp.spawn("yarn", ["watch"], { cwd: this.vscodeSourcePath })
|
||||
const tsc = cp.spawn("tsc", ["--watch", "--pretty", "--preserveWatchOutput"], { cwd: this.rootPath })
|
||||
const bundler = this.createBundler()
|
||||
|
||||
const cleanup = (code?: number | null): void => {
|
||||
this.log("killing vs code watcher")
|
||||
vscode.removeAllListeners()
|
||||
vscode.kill()
|
||||
|
||||
this.log("killing tsc")
|
||||
tsc.removeAllListeners()
|
||||
tsc.kill()
|
||||
|
||||
if (server) {
|
||||
this.log("killing server")
|
||||
server.removeAllListeners()
|
||||
server.kill()
|
||||
}
|
||||
|
||||
this.log("killing bundler")
|
||||
process.exit(code || 0)
|
||||
}
|
||||
|
||||
process.on("SIGINT", () => cleanup())
|
||||
process.on("SIGTERM", () => cleanup())
|
||||
|
||||
vscode.on("exit", (code) => {
|
||||
this.log("vs code watcher terminated unexpectedly")
|
||||
cleanup(code)
|
||||
})
|
||||
tsc.on("exit", (code) => {
|
||||
this.log("tsc terminated unexpectedly")
|
||||
cleanup(code)
|
||||
})
|
||||
const bundle = bundler.bundle().catch(() => {
|
||||
this.log("parcel watcher terminated unexpectedly")
|
||||
cleanup(1)
|
||||
})
|
||||
bundler.on("buildEnd", () => {
|
||||
console.log("[parcel] bundled")
|
||||
})
|
||||
bundler.on("buildError", (error) => {
|
||||
console.error("[parcel]", error)
|
||||
})
|
||||
|
||||
vscode.stderr.on("data", (d) => process.stderr.write(d))
|
||||
tsc.stderr.on("data", (d) => process.stderr.write(d))
|
||||
|
||||
// From https://github.com/chalk/ansi-regex
|
||||
const pattern = [
|
||||
"[\\u001B\\u009B][[\\]()#;?]*(?:(?:(?:[a-zA-Z\\d]*(?:;[-a-zA-Z\\d\\/#&.:=?%@~_]*)*)?\\u0007)",
|
||||
"(?:(?:\\d{1,4}(?:;\\d{0,4})*)?[\\dA-PR-TZcf-ntqry=><~]))",
|
||||
].join("|")
|
||||
const re = new RegExp(pattern, "g")
|
||||
|
||||
/**
|
||||
* Split stdout on newlines and strip ANSI codes.
|
||||
*/
|
||||
const onLine = (proc: cp.ChildProcess, callback: (strippedLine: string, originalLine: string) => void): void => {
|
||||
let buffer = ""
|
||||
if (!proc.stdout) {
|
||||
throw new Error("no stdout")
|
||||
}
|
||||
proc.stdout.setEncoding("utf8")
|
||||
proc.stdout.on("data", (d) => {
|
||||
const data = buffer + d
|
||||
const split = data.split("\n")
|
||||
const last = split.length - 1
|
||||
|
||||
for (let i = 0; i < last; ++i) {
|
||||
callback(split[i].replace(re, ""), split[i])
|
||||
}
|
||||
|
||||
// The last item will either be an empty string (the data ended with a
|
||||
// newline) or a partial line (did not end with a newline) and we must
|
||||
// wait to parse it until we get a full line.
|
||||
buffer = split[last]
|
||||
})
|
||||
}
|
||||
|
||||
let startingVscode = false
|
||||
let startedVscode = false
|
||||
onLine(vscode, (line, original) => {
|
||||
console.log("[vscode]", original)
|
||||
// Wait for watch-client since "Finished compilation" will appear multiple
|
||||
// times before the client starts building.
|
||||
if (!startingVscode && line.includes("Starting watch-client")) {
|
||||
startingVscode = true
|
||||
} else if (startingVscode && line.includes("Finished compilation")) {
|
||||
if (startedVscode) {
|
||||
bundle.then(restartServer)
|
||||
}
|
||||
startedVscode = true
|
||||
}
|
||||
})
|
||||
|
||||
onLine(tsc, (line, original) => {
|
||||
// tsc outputs blank lines; skip them.
|
||||
if (line !== "") {
|
||||
console.log("[tsc]", original)
|
||||
}
|
||||
if (line.includes("Watching for file changes")) {
|
||||
bundle.then(restartServer)
|
||||
}
|
||||
})
|
||||
}
|
||||
|
||||
private createBundler(out = "dist", commit?: string): Bundler {
|
||||
return new Bundler(
|
||||
[
|
||||
path.join(this.rootPath, "src/browser/pages/app.ts"),
|
||||
path.join(this.rootPath, "src/browser/register.ts"),
|
||||
path.join(this.rootPath, "src/browser/serviceWorker.ts"),
|
||||
],
|
||||
{
|
||||
cache: true,
|
||||
cacheDir: path.join(this.rootPath, ".cache"),
|
||||
detailedReport: true,
|
||||
minify: !!process.env.MINIFY,
|
||||
hmr: false,
|
||||
logLevel: 1,
|
||||
outDir: path.join(this.rootPath, out),
|
||||
publicUrl: `/static/${commit || "development"}/dist`,
|
||||
target: "browser",
|
||||
},
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
const builder = new Builder()
|
||||
builder.run(process.argv[2] as Task)
|
||||
12
ci/ci.sh
Executable file
@@ -0,0 +1,12 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
main() {
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
yarn fmt
|
||||
yarn lint
|
||||
yarn test
|
||||
}
|
||||
|
||||
main "$@"
|
||||
11
ci/clean.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
main() {
|
||||
git clean -Xffd
|
||||
git submodule foreach --recursive git clean -xffd
|
||||
git submodule foreach --recursive git reset --hard
|
||||
}
|
||||
|
||||
main "$@"
|
||||
6
ci/code-server.sh
Executable file
@@ -0,0 +1,6 @@
|
||||
#!/usr/bin/env sh
|
||||
# code-server.sh -- Run code-server with the bundled Node binary.
|
||||
|
||||
dir="$(dirname "$(readlink -f "$0" || realpath "$0")")"
|
||||
|
||||
exec "$dir/node" "$dir/out/node/entry.js" "$@"
|
||||
32
ci/fmt.sh
Executable file
@@ -0,0 +1,32 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
main() {
|
||||
shfmt -i 2 -w -s -sr $(git ls-files "*.sh")
|
||||
|
||||
local prettierExts
|
||||
prettierExts=(
|
||||
"*.js"
|
||||
"*.ts"
|
||||
"*.tsx"
|
||||
"*.html"
|
||||
"*.json"
|
||||
"*.css"
|
||||
"*.md"
|
||||
"*.toml"
|
||||
"*.yaml"
|
||||
"*.yml"
|
||||
)
|
||||
prettier --write --loglevel=warn $(git ls-files "${prettierExts[@]}")
|
||||
|
||||
if [[ ${CI-} && $(git ls-files --other --modified --exclude-standard) ]]; then
|
||||
echo "Files need generation or are formatted incorrectly:"
|
||||
git -c color.ui=always status | grep --color=no '\[31m'
|
||||
echo "Please run the following locally:"
|
||||
echo " yarn fmt"
|
||||
exit 1
|
||||
fi
|
||||
}
|
||||
|
||||
main "$@"
|
||||
23
ci/image/Dockerfile
Normal file
@@ -0,0 +1,23 @@
|
||||
FROM centos:7
|
||||
|
||||
RUN yum update -y && yum install -y \
|
||||
devtoolset-6 \
|
||||
gcc-c++ \
|
||||
xz \
|
||||
ccache \
|
||||
git \
|
||||
wget \
|
||||
openssl \
|
||||
libxkbfile-devel \
|
||||
libsecret-devel \
|
||||
libx11-devel
|
||||
|
||||
RUN mkdir /usr/share/node && cd /usr/share/node \
|
||||
&& curl "https://nodejs.org/dist/v12.14.0/node-v12.14.0-linux-$(uname -m | sed 's/86_//; s/aarch/arm/').tar.xz" | tar xJ --strip-components=1 --
|
||||
ENV PATH "$PATH:/usr/share/node/bin"
|
||||
RUN npm install -g yarn
|
||||
|
||||
RUN curl -L "https://github.com/mvdan/sh/releases/download/v3.0.1/shfmt_v3.0.1_linux_$(uname -m | sed 's/x86_/amd/; s/aarch64/arm/')" > /usr/local/bin/shfmt \
|
||||
&& chmod +x /usr/local/bin/shfmt
|
||||
|
||||
ENTRYPOINT ["/bin/bash", "-c"]
|
||||
13
ci/image/run.sh
Executable file
@@ -0,0 +1,13 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
main() {
|
||||
cd "$(dirname "$0")/../.."
|
||||
|
||||
docker build ci/image
|
||||
imageTag="$(docker build -q ci/image)"
|
||||
docker run -t --rm -e CI -e GITHUB_TOKEN -e TRAVIS_TAG -v "$(yarn cache dir):/usr/local/share/.cache/yarn/v6" -v "$PWD:/repo" -w /repo "$imageTag" "$*"
|
||||
}
|
||||
|
||||
main "$@"
|
||||
10
ci/lib.sh
Normal file
@@ -0,0 +1,10 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
set_version() {
|
||||
local code_server_version=${VERSION:-${TRAVIS_TAG:-}}
|
||||
if [[ -z $code_server_version ]]; then
|
||||
code_server_version=$(grep version ./package.json | head -1 | awk -F: '{ print $2 }' | sed 's/[",]//g' | tr -d '[:space:]')
|
||||
fi
|
||||
export VERSION=$code_server_version
|
||||
}
|
||||
11
ci/lint.sh
Executable file
@@ -0,0 +1,11 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
main() {
|
||||
eslint --max-warnings=0 --fix $(git ls-files "*.ts" "*.tsx" "*.js")
|
||||
stylelint $(git ls-files "*.css")
|
||||
tsc --noEmit
|
||||
}
|
||||
|
||||
main "$@"
|
||||
43
ci/release-image/Dockerfile
Normal file
@@ -0,0 +1,43 @@
|
||||
FROM debian:10
|
||||
|
||||
RUN apt-get update \
|
||||
&& apt-get install -y \
|
||||
curl \
|
||||
dumb-init \
|
||||
htop \
|
||||
locales \
|
||||
man \
|
||||
nano \
|
||||
git \
|
||||
procps \
|
||||
ssh \
|
||||
sudo \
|
||||
vim \
|
||||
&& rm -rf /var/lib/apt/lists/*
|
||||
|
||||
# https://wiki.debian.org/Locale#Manually
|
||||
RUN sed -i "s/# en_US.UTF-8/en_US.UTF-8/" /etc/locale.gen \
|
||||
&& locale-gen
|
||||
ENV LANG=en_US.UTF-8
|
||||
|
||||
RUN chsh -s /bin/bash
|
||||
ENV SHELL=/bin/bash
|
||||
|
||||
RUN adduser --gecos '' --disabled-password coder && \
|
||||
echo "coder ALL=(ALL) NOPASSWD:ALL" >> /etc/sudoers.d/nopasswd
|
||||
|
||||
RUN curl -SsL https://github.com/boxboat/fixuid/releases/download/v0.4/fixuid-0.4-linux-amd64.tar.gz | tar -C /usr/local/bin -xzf - && \
|
||||
chown root:root /usr/local/bin/fixuid && \
|
||||
chmod 4755 /usr/local/bin/fixuid && \
|
||||
mkdir -p /etc/fixuid && \
|
||||
printf "user: coder\ngroup: coder\n" > /etc/fixuid/config.yml
|
||||
|
||||
COPY release/code-server*.tar.gz /tmp/
|
||||
RUN cd /tmp && tar -xzf code-server*.tar.gz && rm code-server*.tar.gz && \
|
||||
mv code-server* /usr/local/lib/code-server && \
|
||||
ln -s /usr/local/lib/code-server/code-server /usr/local/bin/code-server
|
||||
|
||||
EXPOSE 8080
|
||||
USER coder
|
||||
WORKDIR /home/coder
|
||||
ENTRYPOINT ["dumb-init", "fixuid", "-q", "/usr/local/bin/code-server", "--host", "0.0.0.0", "."]
|
||||
22
ci/release-image/push.sh
Executable file
@@ -0,0 +1,22 @@
|
||||
#!/usr/bin/env bash
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
main() {
|
||||
cd "$(dirname "$0")/../.."
|
||||
source ./ci/lib.sh
|
||||
set_version
|
||||
|
||||
if [[ ${CI:-} ]]; then
|
||||
echo "$DOCKER_PASSWORD" | docker login -u "$DOCKER_USERNAME" --password-stdin
|
||||
fi
|
||||
|
||||
imageTag="codercom/code-server:$VERSION"
|
||||
if [[ ${TRAVIS_CPU_ARCH:-} == "arm64" ]]; then
|
||||
imageTag+="-arm64"
|
||||
fi
|
||||
docker build -t "$imageTag" -f ./ci/release-image/Dockerfile .
|
||||
docker push codercom/code-server
|
||||
}
|
||||
|
||||
main "$@"
|
||||
75
ci/release.sh
Executable file
@@ -0,0 +1,75 @@
|
||||
#!/usr/bin/env bash
|
||||
# ci.bash -- Build code-server in the CI.
|
||||
|
||||
set -euo pipefail
|
||||
|
||||
function package() {
|
||||
local target
|
||||
target=$(uname | tr '[:upper:]' '[:lower:]')
|
||||
if [[ $target == "linux" ]]; then
|
||||
# Alpine's ldd doesn't have a version flag but if you use an invalid flag
|
||||
# (like --version) it outputs the version to stderr and exits with 1.
|
||||
local ldd_output
|
||||
ldd_output=$(ldd --version 2>&1 || true)
|
||||
if echo "$ldd_output" | grep -iq musl; then
|
||||
target="alpine"
|
||||
fi
|
||||
fi
|
||||
|
||||
local arch
|
||||
arch="$(uname -m)"
|
||||
|
||||
echo -n "Creating release..."
|
||||
|
||||
cp "$(command -v node)" ./build
|
||||
cp README.md ./build
|
||||
cp LICENSE.txt ./build
|
||||
cp ./lib/vscode/ThirdPartyNotices.txt ./build
|
||||
cp ./ci/code-server.sh ./build/code-server
|
||||
|
||||
local archive_name="code-server-$VERSION-$target-$arch"
|
||||
mkdir -p ./release
|
||||
|
||||
local ext
|
||||
if [[ $target == "linux" ]]; then
|
||||
ext=".tar.gz"
|
||||
tar -czf "release/$archive_name$ext" --transform "s/^\.\/build/$archive_name/" ./build
|
||||
else
|
||||
mv ./build "./$archive_name"
|
||||
ext=".zip"
|
||||
zip -r "release/$archive_name$ext" "./$archive_name"
|
||||
mv "./$archive_name" ./build
|
||||
fi
|
||||
|
||||
echo "done (release/$archive_name)"
|
||||
|
||||
mkdir -p "./release-upload/$VERSION"
|
||||
cp "./release/$archive_name$ext" "./release-upload/$VERSION/$target-$arch$ext"
|
||||
mkdir -p "./release-upload/latest"
|
||||
cp "./release/$archive_name$ext" "./release-upload/latest/$target-$arch$ext"
|
||||
}
|
||||
|
||||
# This script assumes that yarn has already ran.
|
||||
function build() {
|
||||
# Always minify and package on CI.
|
||||
if [[ ${CI:-} ]]; then
|
||||
export MINIFY="true"
|
||||
fi
|
||||
|
||||
yarn build
|
||||
}
|
||||
|
||||
function main() {
|
||||
cd "$(dirname "${0}")/.."
|
||||
source ./ci/lib.sh
|
||||
|
||||
set_version
|
||||
|
||||
build
|
||||
|
||||
if [[ ${CI:-} ]]; then
|
||||
package
|
||||
fi
|
||||
}
|
||||
|
||||
main "$@"
|
||||
4
ci/tsconfig.json
Normal file
@@ -0,0 +1,4 @@
|
||||
{
|
||||
"extends": "../tsconfig.json",
|
||||
"include": ["./**/*.ts"]
|
||||
}
|
||||
3180
ci/vscode.patch
Normal file
25
ci/vscode.sh
Executable file
@@ -0,0 +1,25 @@
|
||||
#!/usr/bin/env bash
|
||||
set -euo pipefail
|
||||
|
||||
# 1. Ensures VS Code is cloned.
|
||||
# 2. Patches it.
|
||||
# 3. Installs it.
|
||||
main() {
|
||||
cd "$(dirname "$0")/.."
|
||||
|
||||
git submodule update --init
|
||||
|
||||
# If the patch fails to apply, then it's likely already applied
|
||||
yarn vscode:patch &> /dev/null || true
|
||||
|
||||
(
|
||||
cd lib/vscode
|
||||
# Install VS Code dependencies.
|
||||
yarn
|
||||
|
||||
# NODE_MODULE_VERSION mismatch errors without this.
|
||||
npm rebuild
|
||||
)
|
||||
}
|
||||
|
||||
main "$@"
|
||||
@@ -1,74 +0,0 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: code-server
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: code-server
|
||||
namespace: code-server
|
||||
spec:
|
||||
ports:
|
||||
- port: 8443
|
||||
name: https
|
||||
protocol: TCP
|
||||
selector:
|
||||
app: code-server
|
||||
type: ClusterIP
|
||||
---
|
||||
kind: StorageClass
|
||||
apiVersion: storage.k8s.io/v1
|
||||
metadata:
|
||||
name: gp2
|
||||
annotations:
|
||||
storageclass.kubernetes.io/is-default-class: "true"
|
||||
provisioner: kubernetes.io/aws-ebs
|
||||
parameters:
|
||||
type: gp2
|
||||
fsType: ext4
|
||||
---
|
||||
kind: PersistentVolumeClaim
|
||||
apiVersion: v1
|
||||
metadata:
|
||||
name: code-store
|
||||
namespace: code-server
|
||||
spec:
|
||||
accessModes:
|
||||
- ReadWriteOnce
|
||||
resources:
|
||||
requests:
|
||||
storage: 60Gi
|
||||
---
|
||||
apiVersion: extensions/v1beta1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app: code-server
|
||||
name: code-server
|
||||
namespace: code-server
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: code-server
|
||||
replicas: 1
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: code-server
|
||||
spec:
|
||||
containers:
|
||||
- image: codercom/code-server
|
||||
imagePullPolicy: Always
|
||||
name: code-servery
|
||||
ports:
|
||||
- containerPort: 8443
|
||||
name: https
|
||||
volumeMounts:
|
||||
- name: code-server-storage
|
||||
mountPath: /go/src
|
||||
volumes:
|
||||
- name: code-server-storage
|
||||
persistentVolumeClaim:
|
||||
claimName: code-store
|
||||
|
||||
@@ -1,43 +0,0 @@
|
||||
apiVersion: v1
|
||||
kind: Namespace
|
||||
metadata:
|
||||
name: code-server
|
||||
---
|
||||
apiVersion: v1
|
||||
kind: Service
|
||||
metadata:
|
||||
name: code-server
|
||||
namespace: code-server
|
||||
spec:
|
||||
ports:
|
||||
- port: 8443
|
||||
name: https
|
||||
protocol: TCP
|
||||
selector:
|
||||
app: code-server
|
||||
type: ClusterIP
|
||||
---
|
||||
apiVersion: extensions/v1beta1
|
||||
kind: Deployment
|
||||
metadata:
|
||||
labels:
|
||||
app: code-server
|
||||
name: code-server
|
||||
namespace: code-server
|
||||
spec:
|
||||
selector:
|
||||
matchLabels:
|
||||
app: code-server
|
||||
replicas: 1
|
||||
template:
|
||||
metadata:
|
||||
labels:
|
||||
app: code-server
|
||||
spec:
|
||||
containers:
|
||||
- image: codercom/code-server
|
||||
imagePullPolicy: Always
|
||||
name: code-server
|
||||
ports:
|
||||
- containerPort: 8443
|
||||
name: https
|
||||
30
doc/CONTRIBUTING.md
Normal file
@@ -0,0 +1,30 @@
|
||||
# Contributing
|
||||
|
||||
## Development Workflow
|
||||
|
||||
- [VS Code prerequisites](https://github.com/Microsoft/vscode/wiki/How-to-Contribute#prerequisites)
|
||||
|
||||
```shell
|
||||
yarn
|
||||
yarn vscode
|
||||
yarn watch # Visit http://localhost:8080 once completed.
|
||||
```
|
||||
|
||||
Any changes made to the source will be live reloaded.
|
||||
|
||||
If changes are made to the patch and you've built previously you must manually
|
||||
reset VS Code then run `yarn vscode:patch`.
|
||||
|
||||
Some docs are available at [../src/node/app](../src/node/app) on how code-server
|
||||
works internally.
|
||||
|
||||
## Build
|
||||
|
||||
- [VS Code prerequisites](https://github.com/Microsoft/vscode/wiki/How-to-Contribute#prerequisites)
|
||||
|
||||
```shell
|
||||
yarn
|
||||
yarn vscode
|
||||
yarn build
|
||||
node ./build/out/node/entry.js # Run the built JavaScript with Node.
|
||||
```
|
||||
110
doc/FAQ.md
Normal file
@@ -0,0 +1,110 @@
|
||||
# FAQ
|
||||
|
||||
## Questions?
|
||||
|
||||
Please file all questions and support requests at https://www.reddit.com/r/codeserver/
|
||||
The issue tracker is only for bugs.
|
||||
|
||||
## What's the deal with extensions?
|
||||
|
||||
Unfortunately, the Microsoft VS Code Marketplace license prohibits use with any non Microsoft
|
||||
product.
|
||||
|
||||
See https://cdn.vsassets.io/v/M146_20190123.39/_content/Microsoft-Visual-Studio-Marketplace-Terms-of-Use.pdf
|
||||
|
||||
> Marketplace Offerings are intended for use only with Visual Studio Products and Services
|
||||
> and you may only install and use Marketplace Offerings with Visual Studio Products and Services.
|
||||
|
||||
As a result, Coder has created its own marketplace for open source extensions. It works by scraping
|
||||
GitHub for VS Code extensions and building them. It's not perfect but getting better by the day with
|
||||
more and more extensions.
|
||||
|
||||
Issue [https://github.com/cdr/code-server/issues/1299](#1299) is a big one in making the experience here
|
||||
better by allowing the community to submit extensions and repos to avoid waiting until the scraper finds
|
||||
an extension.
|
||||
|
||||
If an extension does not work, try to grab its VSIX from its Github releases or build it yourself and
|
||||
copy it to the extensions folder.
|
||||
|
||||
## How is this different from VS Code Online?
|
||||
|
||||
VS Code Online is a closed source managed service by Microsoft and only runs on Azure.
|
||||
|
||||
code-server is open source and can be freely run on any machine.
|
||||
|
||||
## How should I expose code-server to the internet?
|
||||
|
||||
By far the most secure method of using code-server is via
|
||||
[sshcode](https://github.com/codercom/sshcode) as it runs code-server and then forwards
|
||||
its port over SSH and requires no setup on your part other than having a working SSH server.
|
||||
|
||||
You can also forward your SSH key and GPG agent to the remote machine to securely access GitHub
|
||||
and securely sign commits without duplicating your keys onto the the remote machine.
|
||||
|
||||
1. https://developer.github.com/v3/guides/using-ssh-agent-forwarding/
|
||||
1. https://wiki.gnupg.org/AgentForwarding
|
||||
|
||||
If you cannot use sshcode, then you will need to ensure there is some sort of authorization in
|
||||
front of code-server and that you are using HTTPS to secure all connections.
|
||||
|
||||
By default when listening externally, code-server enables password authentication using a
|
||||
randomly generated password so you can use that. You can set the `PASSWORD` environment variable
|
||||
to use your own instead. If you want to handle authentication yourself, use `--auth none`
|
||||
to disable password authentication.
|
||||
|
||||
If you want to use external authentication you should handle this with a reverse
|
||||
proxy using something like [oauth2_proxy](https://github.com/pusher/oauth2_proxy).
|
||||
|
||||
For HTTPS, you can use a self signed certificate by passing in just `--cert` or pass in an existing
|
||||
certificate by providing the path to `--cert` and the path to its key with `--cert-key`.
|
||||
|
||||
If `code-server` has been passed a certificate it will also respond to HTTPS
|
||||
requests and will redirect all HTTP requests to HTTPS. Otherwise it will respond
|
||||
only to HTTP requests.
|
||||
|
||||
You can use [Let's Encrypt](https://letsencrypt.org/) to get an SSL certificate
|
||||
for free.
|
||||
|
||||
## x86 releases?
|
||||
|
||||
node has dropped support for x86 and so we decided to as well. See
|
||||
[nodejs/build/issues/885](https://github.com/nodejs/build/issues/885).
|
||||
|
||||
## Alpine builds?
|
||||
|
||||
Just install `libc-dev` and code-server should work.
|
||||
|
||||
## Multi Tenancy
|
||||
|
||||
If you want to run multiple code-server's on shared infrastructure, we recommend using virtual
|
||||
machines with a VM per user. This will easily allow users to run a docker daemon. If you want
|
||||
to use kubernetes, you'll definitely want to use [kubevirt](https://kubevirt.io) to give each
|
||||
user a virtual machine instead of just a container. Docker in docker while supported requires
|
||||
privileged containers which are a security risk in a multi tenant infrastructure.
|
||||
|
||||
## Docker in code-server docker container?
|
||||
|
||||
If you'd like to access docker inside of code-server, we'd recommend running a docker:dind container
|
||||
and mounting in a directory to share between dind and the code-server container at /var/run. After, install
|
||||
the docker CLI in the code-server container and you should be able to access the daemon as the socket
|
||||
will be shared at /var/run/docker.sock.
|
||||
|
||||
In order to make volume mounts work, mount the home directory in the code-server container and the
|
||||
dind container at the same path. i.e you'd volume mount a directory from the host to `/home/coder`
|
||||
on both. This will allow any volume mounts in the home directory to work. Similar process
|
||||
to make volume mounts in any other directory work.
|
||||
|
||||
## Collaboration
|
||||
|
||||
At the moment we have no plans for multi user collaboration on code-server but we understand there is strong
|
||||
demand and will work on it when the time is right.
|
||||
|
||||
## How can I disable telemetry?
|
||||
|
||||
Use the `--disable-telemetry` flag to completely disable telemetry. We use the
|
||||
data collected only to improve code-server.
|
||||
|
||||
## Enterprise
|
||||
|
||||
Visit [our enterprise page](https://coder.com) for more information about our
|
||||
enterprise offerings.
|
||||
@@ -1,69 +0,0 @@
|
||||
# Deploy on AWS
|
||||
|
||||
This tutorial shows you how to deploy `code-server` on an EC2 AWS instance.
|
||||
|
||||
If you're just starting out, we recommend [installing code-server locally](../../self-hosted/index.md). It takes only a few minutes and lets you try out all of the features.
|
||||
|
||||
---
|
||||
|
||||
## Deploy to EC2
|
||||
|
||||
### Use the AWS wizard
|
||||
|
||||
- Click **Launch Instance** from your [EC2 dashboard](https://console.aws.amazon.com/ec2/v2/home).
|
||||
- Select the Ubuntu Server 16.04 LTS (HVM), SSD Volume Type (`ami-0f9cf087c1f27d9b1)` at this time of writing)
|
||||
- Select an appropriate instance size (we recommend t2.medium/large, depending on team size and number of repositories/languages enabled), then **Next: Configure Instance Details**
|
||||
- Select **Next: ...** until you get to the **Configure Security Group** page, then add the default **HTTP** rule (port range "80", source "0.0.0.0/0, ::/0")
|
||||
> Rules with source of 0.0.0.0/0 allow all IP addresses to access your instance. We recommend setting [security group rules](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/using-network-security.html?icmpid=docs_ec2_console) to allow access from known IP addresses only.
|
||||
- Click **Launch**
|
||||
- You will be prompted to create a key pair
|
||||
> A key pair consists of a public key that AWS stores, and a private key file that you store. Together, they allow you to connect to your instance securely. For Windows AMIs, the private key file is required to obtain the password used to log into your instance. For Linux AMIs, the private key file allows you to securely SSH into your instance.
|
||||
- From the dropdown choose "create a new pair", give the key pair a name
|
||||
- Click **Download Key Pair**
|
||||
> This is necessary before you proceed. A `.pem` file will be downloaded. make sure you store is in a safe location because it can't be retrieved once we move on.
|
||||
- Finally, click **Launch Instances**
|
||||
---
|
||||
### SSH Into EC2 Instance
|
||||
- First head to your [EC2 dashboard](https://console.aws.amazon.com/ec2/v2/home) and choose instances from the left panel
|
||||
- In the description of your EC2 instance copy the public DNS (iPv4) address using the copy to clipboard button
|
||||
- Open a terminal on your computer and use the following command to SSH into your EC2 instance
|
||||
```
|
||||
ssh -i "path/to/your/keypair.pem" ubuntu@(paste the public DNS here)
|
||||
```
|
||||
>example: `ssh -i "/Users/John/Downloads/TestInstance.pem" ubuntu@ec2-3-45-678-910.compute-1.amazonaws.co`
|
||||
- You should see a prompt for your EC2 instance like so<img src="../../assets/aws_ubuntu.png">
|
||||
- At this point it is time to download the `code-server` binary. We will of course want the linux version.
|
||||
- Find the latest Linux release from this URL:
|
||||
```
|
||||
https://github.com/cdr/code-server/releases/latest
|
||||
```
|
||||
- Replace {version} in the following command with the version found on the releases page and run it (or just copy the download URL from the releases page):
|
||||
```
|
||||
wget https://github.com/cdr/code-server/releases/download/{version}/code-server-{version}-linux-x64.tar.gz
|
||||
```
|
||||
- Extract the downloaded tar.gz file with this command, for example:
|
||||
```
|
||||
tar -xvzf code-server-{version}-linux-x64.tar.gz
|
||||
```
|
||||
- Navigate to extracted directory with this command:
|
||||
```
|
||||
cd code-server-{version}-linux-x64
|
||||
```
|
||||
- If you run into any permission errors, make the binary executable by running:
|
||||
```
|
||||
chmod +x code-server
|
||||
```
|
||||
> To ensure the connection between you and your server is encrypted view our guide on [securing your setup](../../security/ssl.md)
|
||||
- Finally, run
|
||||
```
|
||||
sudo ./code-server -p 80
|
||||
```
|
||||
- When you visit the public IP for your AWS instance, you will be greeted with this page. Code-server is using a self-signed SSL certificate for easy setup. To proceed to the IDE, click **"Advanced"**<img src ="../../assets/chrome_warning.png">
|
||||
- Then click **"proceed anyway"**<img src="../../assets/chrome_confirm.png">
|
||||
|
||||
> For instructions on how to keep the server running after you end your SSH session please checkout [how to use systemd](https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/) to start linux based services if they are killed
|
||||
|
||||
> The `-p 80` flag is necessary in order to make the IDE accessible from the public IP of your instance (also available from the description in the instances page.
|
||||
|
||||
---
|
||||
> NOTE: If you get stuck or need help, [file an issue](https://github.com/cdr/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
||||
@@ -1,49 +0,0 @@
|
||||
# Deploy on DigitalOcean
|
||||
|
||||
This tutorial shows you how to deploy `code-server` to a single node running on DigitalOcean.
|
||||
|
||||
If you're just starting out, we recommend [installing code-server locally](../../self-hosted/index.md). It takes only a few minutes and lets you try out all of the features.
|
||||
|
||||
---
|
||||
|
||||
## Use the "Create Droplets" wizard
|
||||
|
||||
[Open your DigitalOcean dashboard](https://cloud.digitalocean.com/droplets/new) to create a new droplet
|
||||
|
||||
- **Choose an image -** Select the **Distributions** tab and then choose Ubuntu
|
||||
- **Choose a size -** We recommend at least 4GB RAM and 2 CPU, more depending on team size and number of repositories/languages enabled.
|
||||
- Launch your instance
|
||||
- Open a terminal on your computer and SSH into your instance
|
||||
> example: ssh root@203.0.113.0
|
||||
- Once in the SSH session, visit code-server [releases page](https://github.com/cdr/code-server/releases/) and copy the link to the download for the latest linux release
|
||||
- Find the latest Linux release from this URL:
|
||||
```
|
||||
https://github.com/cdr/code-server/releases/latest
|
||||
```
|
||||
- Replace {version} in the following command with the version found on the releases page and run it (or just copy the download URL from the releases page):
|
||||
```
|
||||
wget https://github.com/cdr/code-server/releases/download/{version}/code-server-{version}-linux-x64.tar.gz
|
||||
```
|
||||
- Extract the downloaded tar.gz file with this command, for example:
|
||||
```
|
||||
tar -xvzf code-server-{version}-linux-x64.tar.gz
|
||||
```
|
||||
- Navigate to extracted directory with this command:
|
||||
```
|
||||
cd code-server-{version}-linux-x64
|
||||
```
|
||||
- If you run into any permission errors when attempting to run the binary:
|
||||
```
|
||||
chmod +x code-server
|
||||
```
|
||||
> To ensure the connection between you and your server is encrypted view our guide on [securing your setup](../../security/ssl.md)
|
||||
- Finally start the code-server
|
||||
```
|
||||
sudo ./code-server -p 80
|
||||
```
|
||||
> For instructions on how to keep the server running after you end your SSH session please checkout [how to use systemd](https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/) to start linux based services if they are killed
|
||||
- When you visit the public IP for your Digital Ocean instance, you will be greeted with this page. Code-server is using a self-signed SSL certificate for easy setup. To proceed to the IDE, click **"Advanced"**<img src ="../../assets/chrome_warning.png">
|
||||
- Then click **"proceed anyway"**<img src="../../assets/chrome_confirm.png">
|
||||
|
||||
---
|
||||
> NOTE: If you get stuck or need help, [file an issue](https://github.com/cdr/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
||||
@@ -1,71 +0,0 @@
|
||||
# Deploy on Google Cloud
|
||||
|
||||
This tutorial shows you how to deploy `code-server` to a single node running on Google Cloud.
|
||||
|
||||
If you're just starting out, we recommend [installing code-server locally](../../self-hosted/index.md). It takes only a few minutes and lets you try out all of the features.
|
||||
|
||||
---
|
||||
|
||||
## Deploy to Google Cloud VM
|
||||
> Pre-requisite: Please [set up Google Cloud SDK](https://cloud.google.com/sdk/docs/) on your local machine
|
||||
|
||||
- [Open your Google Cloud console](https://console.cloud.google.com/compute/instances) to create a new VM instance and click **Create Instance**
|
||||
- Choose an appropriate machine type (we recommend 2 vCPU and 7.5 GB RAM, more depending on team size and number of repositories/languages enabled)
|
||||
- Choose Ubuntu 16.04 LTS as your boot disk
|
||||
- Check the boxes for **Allow HTTP traffic** and **Allow HTTPS traffic** in the **Firewall** section
|
||||
- Create your VM, and **take note** of its public IP address.
|
||||
- Copy the link to download the latest Linux binary from our [releases page](https://github.com/cdr/code-server/releases)
|
||||
|
||||
---
|
||||
|
||||
## Final Steps
|
||||
|
||||
- SSH into your Google Cloud VM
|
||||
```
|
||||
gcloud compute ssh --zone [region] [instance name]
|
||||
```
|
||||
|
||||
- Find the latest Linux release from this URL:
|
||||
```
|
||||
https://github.com/cdr/code-server/releases/latest
|
||||
```
|
||||
|
||||
- Replace {version} in the following command with the version found on the releases page and run it (or just copy the download URL from the releases page):
|
||||
```
|
||||
wget https://github.com/cdr/code-server/releases/download/{version}/code-server-{version}-linux-x64.tar.gz
|
||||
```
|
||||
|
||||
- Extract the downloaded tar.gz file with this command, for example:
|
||||
```
|
||||
tar -xvzf code-server-{version}-linux-x64.tar.gz
|
||||
```
|
||||
|
||||
- Navigate to extracted directory with this command:
|
||||
```
|
||||
cd code-server-{version}-linux-x64
|
||||
```
|
||||
|
||||
- Make the binary executable if you run into any errors regarding permission:
|
||||
```
|
||||
chmod +x code-server
|
||||
```
|
||||
|
||||
> To ensure the connection between you and your server is encrypted view our guide on [securing your setup](../security/ssl.md)
|
||||
|
||||
- Start the code-server
|
||||
```
|
||||
sudo ./code-server -p 80
|
||||
```
|
||||
|
||||
> For instructions on how to keep the server running after you end your SSH session please checkout [how to use systemd](https://www.linode.com/docs/quick-answers/linux/start-service-at-boot/) to start linux based services if they are killed
|
||||
|
||||
- Access code-server from the public IP of your Google Cloud instance we noted earlier in your browser.
|
||||
> example: 32.32.32.234
|
||||
|
||||
- You will be greeted with this page. Code-server is using a self-signed SSL certificate for easy setup. To proceed to the IDE, click **"Advanced"**<img src ="../../assets/chrome_warning.png">
|
||||
|
||||
- Then click **"proceed anyway"**<img src="../../assets/chrome_confirm.png">
|
||||
|
||||
---
|
||||
|
||||
> NOTE: If you get stuck or need help, [file an issue](https://github.com/cdr/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
||||
|
Before Width: | Height: | Size: 44 KiB |
|
Before Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 137 KiB |
BIN
doc/assets/code-server.gif
Normal file
|
After Width: | Height: | Size: 4.0 MiB |
|
Before Width: | Height: | Size: 121 KiB |
24
doc/assets/droplet.svg
Normal file
@@ -0,0 +1,24 @@
|
||||
<?xml version="1.0" encoding="UTF-8"?>
|
||||
<svg width="200px" height="40px" viewBox="0 0 200 40" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlns:xlink="http://www.w3.org/1999/xlink">
|
||||
<!-- Generator: Sketch 52.5 (67469) - http://www.bohemiancoding.com/sketch -->
|
||||
<title>do-btn-blue-ghost</title>
|
||||
<desc>Created with Sketch.</desc>
|
||||
<g id="Page-1" stroke="none" stroke-width="1" fill="none" fill-rule="evenodd">
|
||||
<g id="Partner-welcome-kit-Copy-3" transform="translate(-651.000000, -828.000000)">
|
||||
<g id="do-btn-blue-ghost" transform="translate(651.000000, 828.000000)">
|
||||
<rect id="Rectangle-Copy-4" stroke="#0069FF" x="0.5" y="0.5" width="199" height="39" rx="6"></rect>
|
||||
<path d="M6,0 L47,0 L47,40 L6,40 C2.6862915,40 4.05812251e-16,37.3137085 0,34 L-8.8817842e-16,6 C-1.29399067e-15,2.6862915 2.6862915,6.08718376e-16 6,0 Z" id="Rectangle-Copy-5" fill="#0069FF"></path>
|
||||
<g id="DO_Logo_horizontal_blue-Copy-3" transform="translate(13.000000, 10.000000)" fill="#FFFFFF">
|
||||
<path d="M10.0098493,20 L10.0098493,16.1262429 C14.12457,16.1262429 17.2897398,12.0548452 15.7269372,7.74627862 C15.1334679,6.14538921 13.8674,4.86072487 12.2650328,4.28756693 C7.952489,2.72620566 3.87733294,5.88845634 3.87733294,9.99938223 C3.87733294,9.99938223 3.87733294,9.99938223 3.87733294,9.99938223 L0,9.99938223 C0,3.45747613 6.3303395,-1.64165309 13.1948014,0.492866119 C16.2017127,1.42177726 18.57559,3.81322933 19.5053586,6.79760341 C21.6418482,13.6754986 16.5577943,20 10.0098493,20 Z" id="XMLID_49_"></path>
|
||||
<polygon id="XMLID_47_" points="9.52380952 16.1904762 5.71428571 16.1904762 5.71428571 12.3809524 5.71428571 12.3809524 9.52380952 12.3809524 9.52380952 12.3809524"></polygon>
|
||||
<polygon id="XMLID_46_" points="6.66666667 19.047619 3.80952381 19.047619 3.80952381 19.047619 3.80952381 16.1904762 6.66666667 16.1904762"></polygon>
|
||||
<polygon id="XMLID_45_" points="3.80952381 16.1904762 0.952380952 16.1904762 0.952380952 16.1904762 0.952380952 13.3333333 0.952380952 13.3333333 3.80952381 13.3333333 3.80952381 13.3333333"></polygon>
|
||||
</g>
|
||||
<!-- Modified to add GitHub font-family after DigitalOcean's font-family, otherwise it looks bad on GitHub -->
|
||||
<text id="Create-a-Droplet-Copy-3" font-family="Sailec-Medium, Sailec, -apple-system, BlinkMacSystemFont, Segoe UI, Helvetica, Arial, sans-serif, Apple Color Emoji, Segoe UI Emoji, Segoe UI Symbol" font-size="16" font-weight="400" fill="#0069FF">
|
||||
<tspan x="58" y="26">Create a Droplet</tspan>
|
||||
</text>
|
||||
</g>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
|
After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 603 KiB |
|
Before Width: | Height: | Size: 18 KiB |
|
Before Width: | Height: | Size: 66 KiB |
|
Before Width: | Height: | Size: 58 KiB |
@@ -1,53 +0,0 @@
|
||||
# Generate a self-signed certificate đź”’
|
||||
|
||||
code-server has the ability to secure your connection between client and server using SSL/TSL certificates. By default, the server will start with an unencrypted connection. We recommend Self-signed TLS/SSL certificates for personal use of code-server or within an organization.
|
||||
|
||||
This guide will show you how to create a self-signed certificate and start code-server using your certificate/key.
|
||||
|
||||
## TLS / HTTPS
|
||||
|
||||
You can specify any location that you want to save the certificate and key. In this example, we will navigate to the root directory, create a folder called `certs` and cd into it.
|
||||
|
||||
```shell
|
||||
mkdir ~/certs && cd ~/certs
|
||||
```
|
||||
|
||||
If you don't already have a TLS certificate and key, you can generate them with the command below. They will be placed in `~/certs`
|
||||
|
||||
```shell
|
||||
openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout ~/certs/MyKey.key -out ~/certs/MyCertificate.crt
|
||||
```
|
||||
|
||||
You will be prompted to add some identifying information about your organization
|
||||
```shell
|
||||
You are about to be asked to enter information that will be incorporated
|
||||
into your certificate request.
|
||||
What you are about to enter is what is called a Distinguished Name or a DN.
|
||||
There are quite a few fields but you can leave some blank
|
||||
For some fields there will be a default value,
|
||||
If you enter '.', the field will be left blank.
|
||||
-----
|
||||
Country Name (2 letter code) [AU]:US
|
||||
State or Province Name (full name) [Some-State]:TX
|
||||
Locality Name (eg, city) []:Austin
|
||||
Organization Name (eg, company) [Coder Technologies]:Coder
|
||||
Organizational Unit Name (eg, section) []:Docs
|
||||
Common Name (e.g. server FQDN or YOUR name) []:hostname.example.com
|
||||
Email Address []:admin@example.com
|
||||
```
|
||||
>If you already have a TLS certificate and key, you can simply reference them in the `--cert` and `--cert-key` flags when launching code-server
|
||||
|
||||
|
||||
## Starting code-server with certificate and key
|
||||
|
||||
1. At the end of the path to your binary, add the following flags followed by the path to your certificate and key like so. Then press enter to run code-server.
|
||||
```shell
|
||||
./code-server --cert=~/certs/MyCertificate.crt --cert-key=~/certs/MyKey.key
|
||||
```
|
||||
2. After that you will be running a secure code-server.
|
||||
|
||||
> You will know your connection is secure if the lines `WARN No certificate specified. This could be insecure. WARN Documentation on securing your setup: https://coder.com/docs` no longer appear.
|
||||
|
||||
## Other options
|
||||
|
||||
For larger organizations you may wish to rely on a Certificate Authority as opposed to a self-signed certificate. For more information on generating free and open certificates for your site, please check out EFF's [certbot](https://certbot.eff.org/). Certbot is a cli to generate certificates using [LetsEncrypt](https://letsencrypt.org/).
|
||||
@@ -1,53 +0,0 @@
|
||||
# Installng code-server in your ChromiumOS/ChromeOS/CloudReady machine
|
||||
|
||||
This guide will show you how to install code-server into your CrOS machine.
|
||||
|
||||
## Using Crostini
|
||||
|
||||
One of the easier ways to run code-server is via [Crostini](https://www.aboutchromebooks.com/tag/project-crostini/), the Linux apps support feature in CrOS. Make sure you have enough RAM, HDD space and your CPU has VT-x/ AMD-V support. If your chromebook has this, then you are qualified to use Crostini.
|
||||
|
||||
If you are running R69, you might want to enable this on [Chrome Flags](chrome://flags/#enable-experimental-crostini-ui). If you run R72, however, this is already enabled for you.
|
||||
|
||||
After checking your prerequisites, follow the steps in [the self-host install guide](index.md) on installing code-server. Once done, make sure code-server works by running it. After running it, simply go to `penguin.linux.test:8443` to access code-server. Now you should be greeted with this screen. If you did, congratulations, you have installed code-server in your Chromebook!
|
||||
|
||||

|
||||
|
||||
Alternatively, if you ran code-server in another container and you need the IP for that specific container, simply go to Termina's shell via `crosh` and type `vsh termina`.
|
||||
|
||||
```bash
|
||||
Loading extra module: /usr/share/crosh/dev.d/50-crosh.sh
|
||||
Welcome to crosh, the Chrome OS developer shell.
|
||||
|
||||
If you got here by mistake, don't panic! Just close this tab and carry on.
|
||||
|
||||
Type 'help' for a list of commands.
|
||||
|
||||
If you want to customize the look/behavior, you can use the options page.
|
||||
Load it by using the Ctrl+Shift+P keyboard shortcut.
|
||||
|
||||
crosh> vsh termina
|
||||
(termina) chronos@localhost ~ $
|
||||
```
|
||||
While in termina, run `lxc list`. It should output the list of running containers.
|
||||
|
||||
```bash
|
||||
(termina) chronos@localhost ~ $ lxc list
|
||||
+---------+---------+-----------------------+------+------------+-----------+
|
||||
| NAME | STATE | IPV4 | IPV6 | TYPE | SNAPSHOTS |
|
||||
+---------+---------+-----------------------+------+------------+-----------+
|
||||
| penguin | RUNNING | 100.115.92.199 (eth0) | | PERSISTENT | 0 |
|
||||
+---------+---------+-----------------------+------+------------+-----------+
|
||||
(termina) chronos@localhost ~ $
|
||||
```
|
||||
|
||||
For this example, we show the default `penguin` container, which is exposed on `eth0` at 100.115.92.199. Simply enter the IP of the container where the code-server runs to Chrome.
|
||||
|
||||
## Using Crouton
|
||||
|
||||
[Crouton](https://github.com/dnschneid/crouton) is one of the old ways to get a running full Linux via `chroot` on a Chromebook. To use crouton, enable developer mode and go to `crosh`. This time, run `shell`, which should drop you to `bash`.
|
||||
|
||||
Make sure you downloaded `crouton`, if so, go ahead and run it under `~/Downloads`. After installing your chroot container via crouton, go ahead and enter `enter-chroot` to enter your container.
|
||||
|
||||
Follow the instructions set in [the self-host install guide](index.md) to install code-server. After that is done, run `code-server` and verify it works by going to `localhost:8443`.
|
||||
|
||||
> At this point in writing, `localhost` seems to work in this method. However, the author is not sure if it applies still to newer Chromebooks.
|
||||
@@ -1,123 +0,0 @@
|
||||
# Getting Started
|
||||
|
||||
[code-server](https://coder.com) is used by developers at Azure, Google, Reddit, and more to give them access to VS Code in the browser.
|
||||
|
||||
## Quickstart Guide
|
||||
|
||||
> NOTE: If you get stuck or need help, [file an issue](https://github.com/cdr/code-server/issues/new?&title=Improve+self-hosted+quickstart+guide), [tweet (@coderhq)](https://twitter.com/coderhq) or [email](mailto:support@coder.com?subject=Self-hosted%20quickstart%20guide).
|
||||
|
||||
This document pertains to Coder specific implementations of VS Code. For documentation on how to use VS Code itself, please refer to the official [documentation for VS Code](https://code.visualstudio.com/docs)
|
||||
|
||||
It takes just a few minutes to get your own self-hosted server running. If you've got a machine running macOS, Windows, or Linux, you're ready to start the binary which listens on port `8443` by default.
|
||||
|
||||
<!--
|
||||
DO NOT CHANGE THIS TO A CODEBLOCK.
|
||||
We want line breaks for readability, but backslashes to escape them do not work cross-platform.
|
||||
This uses line breaks that are rendered but not copy-pasted to the clipboard.
|
||||
-->
|
||||
|
||||
|
||||
1. Visit [the releases](https://github.com/cdr/code-server/releases) page and download the latest cli for your operating system
|
||||
2. Double click the executable to run in the current directory
|
||||
3. Copy the password that appears in the cli<img src="../assets/cli.png">
|
||||
4. In your browser navigate to `localhost:8443`
|
||||
5. Paste the password from the cli into the login window<img src="../assets/server-password-modal.png">
|
||||
> NOTE: Be careful with your password as sharing it will grant those users access to your server's file system
|
||||
|
||||
### Things To Know
|
||||
- When you visit the IP for your code-server, you will be greeted with this page. Code-server is using a self-signed SSL certificate for easy setup. To proceed to the IDE, click **"Advanced"**<img src ="../assets/chrome_warning.png">
|
||||
- Then click **"proceed anyway"**<img src="../assets/chrome_confirm.png">
|
||||
|
||||
## Usage
|
||||
<pre class="pre-wrap"><code>code-server<span class="virtual-br"></span> --help</code></pre>
|
||||
|
||||
code-server can be ran with a number of arguments to customize your working directory, host, port, and SSL certificate.
|
||||
|
||||
```
|
||||
Usage: code-server [options]
|
||||
|
||||
Run VS Code on a remote server.
|
||||
|
||||
Options:
|
||||
-V, --version output the version number
|
||||
--cert <value>
|
||||
--cert-key <value>
|
||||
-e, --extensions-dir <dir> Set the root path for extensions.
|
||||
-d --user-data-dir <dir> Specifies the directory that user data is kept in, useful when running as root.
|
||||
--data-dir <value> DEPRECATED: Use '--user-data-dir' instead. Customize where user-data is stored.
|
||||
-h, --host <value> Customize the hostname. (default: "0.0.0.0")
|
||||
-o, --open Open in the browser on startup.
|
||||
-p, --port <number> Port to bind on. (default: 8443)
|
||||
-N, --no-auth Start without requiring authentication.
|
||||
-H, --allow-http Allow http connections.
|
||||
-P, --password <value> Specify a password for authentication.
|
||||
--disable-telemetry Disables ALL telemetry.
|
||||
--help output usage information
|
||||
```
|
||||
|
||||
### Data Directory
|
||||
Use `code-server -d (path/to/directory)` or `code-server --user-data-dir=(path/to/directory)`, excluding the parentheses to specify the root folder that VS Code will start in.
|
||||
|
||||
### Host
|
||||
By default, code-server will use `0.0.0.0` as its address. This can be changed by using `code-server -h` or `code-server --host=` followed by the address you want to use.
|
||||
> Example: `code-server -h 127.0.0.1`
|
||||
|
||||
### Open
|
||||
You can have the server automatically open the VS Code in your browser on startup by using the `code-server -o` or `code-server --open` flags
|
||||
|
||||
### Port
|
||||
By default, code-server will use `8443` as its port. This can be changed by using `code-server -p` or `code-server --port=` followed by the port you want to use.
|
||||
> Example: `code-server -p 9000`
|
||||
|
||||
### Telemetry
|
||||
Disable all telemetry with `code-server --disable-telemetry`.
|
||||
|
||||
### Cert and Cert Key
|
||||
To encrypt the traffic between the browser and server use `code-server --cert=` followed by the path to your `.cer` file. Additionally, you can use certificate keys with `code-server --cert-key` followed by the path to your `.key` file.
|
||||
> Example (certificate and key): `code-server --cert /etc/letsencrypt/live/example.com/fullchain.cer --cert-key /etc/letsencrypt/live/example.com/fullchain.key`
|
||||
> Example (if you are using Letsencrypt or similar): `code-server --cert /etc/letsencrypt/live/example.com/fullchain.pem --cert-key /etc/letsencrypt/live/example.com/privkey.key`
|
||||
|
||||
> To ensure the connection between you and your server is encrypted view our guide on [securing your setup](../security/ssl.md)
|
||||
|
||||
### Nginx Reverse Proxy
|
||||
Nginx is for reverse proxy. Below is a virtual host example that works with code-server. Please also pass --allow-http. You can also use certbot by EFF to get a ssl certificates for free.
|
||||
```
|
||||
server {
|
||||
listen 80;
|
||||
listen [::]:80;
|
||||
server_name code.example.com code.example.org;
|
||||
location / {
|
||||
proxy_pass http://localhost:8443/;
|
||||
proxy_set_header Upgrade $http_upgrade;
|
||||
proxy_set_header Connection upgrade;
|
||||
proxy_set_header Accept-Encoding gzip;
|
||||
}
|
||||
}
|
||||
```
|
||||
|
||||
### Apache Reverse Proxy
|
||||
Example of https virtualhost configuration for Apache as a reverse proxy. Please also pass --allow-http on code-server startup to allow the proxy to connect.
|
||||
```
|
||||
<VirtualHost *:80>
|
||||
ServerName code.example.com
|
||||
|
||||
RewriteEngine On
|
||||
RewriteCond %{HTTP:Upgrade} =websocket [NC]
|
||||
RewriteRule /(.*) ws://localhost:8443/$1 [P,L]
|
||||
RewriteCond %{HTTP:Upgrade} !=websocket [NC]
|
||||
RewriteRule /(.*) http://localhost:8443/$1 [P,L]
|
||||
|
||||
ProxyRequests off
|
||||
|
||||
RequestHeader set X-Forwarded-Proto https
|
||||
RequestHeader set X-Forwarded-Port 443
|
||||
|
||||
ProxyPass / http://localhost:8443/ nocanon
|
||||
ProxyPassReverse / http://localhost:8443/
|
||||
|
||||
</VirtualHost>
|
||||
```
|
||||
*Important:* For more details about Apache reverse proxy configuration checkout the [documentation](https://httpd.apache.org/docs/current/mod/mod_proxy.html) - especially the [Securing your Server](https://httpd.apache.org/docs/current/mod/mod_proxy.html#access) section
|
||||
|
||||
### Help
|
||||
Use `code-server --help` to view the usage for the CLI. This is also shown at the beginning of this section.
|
||||
1
lib/vscode
Submodule
113
package.json
@@ -1,70 +1,65 @@
|
||||
{
|
||||
"name": "@coder/code-server",
|
||||
"repository": "https://github.com/cdr/code-server",
|
||||
"author": "Coder",
|
||||
"name": "code-server",
|
||||
"license": "MIT",
|
||||
"description": "Run VS Code remotely.",
|
||||
"version": "3.0.1",
|
||||
"scripts": {
|
||||
"build:rules": "cd ./rules && tsc -p .",
|
||||
"packages:install": "cd ./packages && yarn",
|
||||
"postinstall": "npm-run-all --parallel packages:install build:rules",
|
||||
"start": "cd ./packages/server && yarn start",
|
||||
"task": "ts-node -r tsconfig-paths/register build/tasks.ts",
|
||||
"test": "cd ./packages && yarn test"
|
||||
"clean": "ci/clean.sh",
|
||||
"vscode": "ci/vscode.sh",
|
||||
"vscode:patch": "cd ./lib/vscode && git apply ../../ci/vscode.patch",
|
||||
"vscode:diff": "cd ./lib/vscode && git diff HEAD > ../../ci/vscode.patch",
|
||||
"test": "mocha -r ts-node/register ./test/*.test.ts",
|
||||
"lint": "ci/lint.sh",
|
||||
"fmt": "ci/fmt.sh",
|
||||
"runner": "cd ./ci && NODE_OPTIONS=--max_old_space_size=32384 ts-node ./build.ts",
|
||||
"build": "yarn runner build",
|
||||
"watch": "yarn runner watch"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/fs-extra": "^5.0.4",
|
||||
"@types/node": "^10.12.18",
|
||||
"@types/tar": "^4.0.0",
|
||||
"@types/trash": "^4.3.1",
|
||||
"cache-loader": "^2.0.1",
|
||||
"cross-env": "^5.2.0",
|
||||
"crypto-browserify": "^3.12.0",
|
||||
"css-loader": "^2.1.0",
|
||||
"file-loader": "^3.0.1",
|
||||
"fork-ts-checker-webpack-plugin": "^0.5.2",
|
||||
"fs-extra": "^7.0.1",
|
||||
"happypack": "^5.0.1",
|
||||
"html-webpack-plugin": "^3.2.0",
|
||||
"http-browserify": "^1.7.0",
|
||||
"ignore-loader": "^0.1.2",
|
||||
"mini-css-extract-plugin": "^0.5.0",
|
||||
"node-sass": "^4.11.0",
|
||||
"npm-run-all": "^4.1.5",
|
||||
"path-browserify": "^1.0.0",
|
||||
"preload-webpack-plugin": "^3.0.0-beta.2",
|
||||
"sass-loader": "^7.1.0",
|
||||
"string-replace-loader": "^2.1.1",
|
||||
"style-loader": "^0.23.1",
|
||||
"tar": "^4.4.8",
|
||||
"terser-webpack-plugin": "^1.2.3",
|
||||
"ts-loader": "^5.3.3",
|
||||
"ts-node": "^7.0.1",
|
||||
"tsconfig-paths": "^3.8.0",
|
||||
"tslib": "^1.9.3",
|
||||
"tslint": "^5.12.1",
|
||||
"typescript": "^3.2.2",
|
||||
"typescript-tslint-plugin": "^0.2.1",
|
||||
"uglifyjs-webpack-plugin": "^2.1.1",
|
||||
"url-loader": "^1.1.2",
|
||||
"util": "^0.11.1",
|
||||
"webpack": "^4.28.4",
|
||||
"webpack-bundle-analyzer": "^3.0.3",
|
||||
"webpack-cli": "^3.2.1",
|
||||
"webpack-dev-middleware": "^3.5.0",
|
||||
"webpack-dev-server": "^3.1.14",
|
||||
"webpack-hot-middleware": "^2.24.3",
|
||||
"webpack-pwa-manifest": "^4.0.0",
|
||||
"workbox-webpack-plugin": "^4.1.0",
|
||||
"write-file-webpack-plugin": "^4.5.0"
|
||||
"@types/adm-zip": "^0.4.32",
|
||||
"@types/fs-extra": "^8.0.1",
|
||||
"@types/mocha": "^5.2.7",
|
||||
"@types/node": "^12.12.7",
|
||||
"@types/parcel-bundler": "^1.12.1",
|
||||
"@types/pem": "^1.9.5",
|
||||
"@types/safe-compare": "^1.1.0",
|
||||
"@types/semver": "^7.1.0",
|
||||
"@types/tar-fs": "^1.16.2",
|
||||
"@types/ssh2": "0.5.39",
|
||||
"@types/ssh2-streams": "^0.1.6",
|
||||
"@types/tar-stream": "^1.6.1",
|
||||
"@types/ws": "^6.0.4",
|
||||
"@typescript-eslint/eslint-plugin": "^2.0.0",
|
||||
"@typescript-eslint/parser": "^2.0.0",
|
||||
"eslint": "^6.2.0",
|
||||
"eslint-config-prettier": "^6.0.0",
|
||||
"eslint-plugin-import": "^2.18.2",
|
||||
"eslint-plugin-prettier": "^3.1.0",
|
||||
"leaked-handles": "^5.2.0",
|
||||
"mocha": "^6.2.0",
|
||||
"parcel-bundler": "^1.12.4",
|
||||
"prettier": "^1.18.2",
|
||||
"stylelint": "^13.0.0",
|
||||
"stylelint-config-recommended": "^3.0.0",
|
||||
"ts-node": "^8.4.1",
|
||||
"typescript": "3.7.2"
|
||||
},
|
||||
"resolutions": {
|
||||
"bindings": "1.3.0"
|
||||
"@types/node": "^12.12.7",
|
||||
"safe-buffer": "^5.1.1",
|
||||
"vfile-message": "^2.0.2"
|
||||
},
|
||||
"dependencies": {
|
||||
"node-loader": "^0.6.0",
|
||||
"node-pty": "0.8.1",
|
||||
"spdlog": "0.8.1",
|
||||
"webpack-merge": "^4.2.1"
|
||||
"@coder/logger": "1.1.11",
|
||||
"adm-zip": "^0.4.14",
|
||||
"fs-extra": "^8.1.0",
|
||||
"httpolyglot": "^0.1.2",
|
||||
"node-pty": "^0.9.0",
|
||||
"pem": "^1.14.2",
|
||||
"safe-compare": "^1.1.4",
|
||||
"semver": "^7.1.3",
|
||||
"tar": "^6.0.1",
|
||||
"ssh2": "^0.8.7",
|
||||
"tar-fs": "^2.0.0",
|
||||
"ws": "^7.2.0"
|
||||
}
|
||||
}
|
||||
|
||||
@@ -1,12 +0,0 @@
|
||||
{
|
||||
"name": "@coder/app",
|
||||
"scripts": {
|
||||
"start": "node ../../../node_modules/webpack-dev-server/bin/webpack-dev-server.js --config ./webpack.config.js",
|
||||
"build": "node ../../../node_modules/webpack/bin/webpack.js --config ./webpack.config.js"
|
||||
},
|
||||
"dependencies": {
|
||||
"@material/checkbox": "^0.44.1",
|
||||
"@material/textfield": "^0.44.1",
|
||||
"material-components-web": "^0.44.0"
|
||||
}
|
||||
}
|
||||
@@ -1,30 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html lang="en">
|
||||
|
||||
<head>
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1, minimum-scale=1, maximum-scale=1">
|
||||
<title>Authenticate: code-server</title>
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<form id="login-form">
|
||||
<div class="login">
|
||||
<div class="back">
|
||||
<- Back </div> <h4 class="title">code-server</h4>
|
||||
<h2 class="subtitle">
|
||||
Enter server password
|
||||
</h2>
|
||||
<div class="mdc-text-field">
|
||||
<input type="password" id="password" class="mdc-text-field__input" required>
|
||||
<label class="mdc-floating-label" for="password">Password</label>
|
||||
<div class="mdc-line-ripple"></div>
|
||||
</div>
|
||||
<button id="submit" class="mdc-button mdc-button--unelevated">
|
||||
<span class="mdc-button__label">Enter IDE</span>
|
||||
</button>
|
||||
<div id="error-display"></div>
|
||||
</div>
|
||||
</form>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,121 +0,0 @@
|
||||
@import url("https://use.typekit.net/vzk7ygg.css");
|
||||
|
||||
html, body {
|
||||
background-color: #FFFFFF;
|
||||
min-height: 100%;
|
||||
}
|
||||
|
||||
body {
|
||||
font-family: 'aktiv-grotesk';
|
||||
display: flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
height: calc(100vh - 20px);
|
||||
margin: 0;
|
||||
padding: 10px;
|
||||
--mdc-theme-primary: #AAADA1;
|
||||
--mdc-theme-secondary: #AAADA1;
|
||||
|
||||
&.in-app {
|
||||
.back {
|
||||
pointer-events: all;
|
||||
opacity: 1;
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.login {
|
||||
box-shadow: 0 18px 80px 10px rgba(69, 65, 78, 0.08);
|
||||
max-width: 328px;
|
||||
width: 100%;
|
||||
padding: 40px;
|
||||
border-radius: 5px;
|
||||
position: relative;
|
||||
color: #575962;
|
||||
|
||||
.title {
|
||||
margin-bottom: 0px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
letter-spacing: 1.5px;
|
||||
line-height: 15px;
|
||||
margin-bottom: 5px;
|
||||
margin-top: 0px;
|
||||
text-align: center;
|
||||
text-transform: uppercase;
|
||||
}
|
||||
|
||||
.subtitle {
|
||||
text-align: center;
|
||||
margin: 0;
|
||||
font-size: 19px;
|
||||
font-weight: bold;
|
||||
line-height: 25px;
|
||||
margin-bottom: 45px;
|
||||
}
|
||||
|
||||
.mdc-text-field {
|
||||
width: 100%;
|
||||
background: none !important;
|
||||
|
||||
&::before {
|
||||
background: none !important;
|
||||
}
|
||||
}
|
||||
|
||||
.mdc-form-field {
|
||||
text-align: left;
|
||||
font-size: 12px;
|
||||
color: #797E84;
|
||||
margin-top: 16px;
|
||||
}
|
||||
|
||||
.mdc-button {
|
||||
border-radius: 24px;
|
||||
padding-left: 75px;
|
||||
padding-right: 75px;
|
||||
padding-top: 15px;
|
||||
padding-bottom: 15px;
|
||||
height: 48px;
|
||||
margin: 0 auto;
|
||||
display: block;
|
||||
box-shadow: 0 12px 17px 2px rgba(171,173,163,0.14), 0 5px 22px 4px rgba(171,173,163,0.12), 0 7px 8px -4px rgba(171,173,163,0.2);
|
||||
margin-top: 40px;
|
||||
}
|
||||
}
|
||||
|
||||
.mdc-text-field--focused:not(.mdc-text-field--disabled) .mdc-floating-label {
|
||||
color: var(--mdc-theme-primary);
|
||||
}
|
||||
|
||||
.mdc-floating-label--float-above {
|
||||
transform: translateY(-70%) scale(0.75);
|
||||
}
|
||||
|
||||
.mdc-text-field:not(.mdc-text-field--disabled):not(.mdc-text-field--outlined):not(.mdc-text-field--textarea) .mdc-text-field__input, .mdc-text-field:not(.mdc-text-field--disabled):not(.mdc-text-field--outlined):not(.mdc-text-field--textarea) .mdc-text-field__input:hover {
|
||||
border-bottom-color: #EBEDF2;
|
||||
}
|
||||
|
||||
.back {
|
||||
position: absolute;
|
||||
top: -50px;
|
||||
left: -50px;
|
||||
font-weight: bold;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
|
||||
// transition: 500ms opacity ease;
|
||||
}
|
||||
|
||||
#error-display {
|
||||
box-sizing: border-box;
|
||||
color: #bb2d0f;
|
||||
font-size: 14px;
|
||||
font-weight: 400;
|
||||
letter-spacing: 0.3px;
|
||||
line-height: 12px;
|
||||
padding: 8px;
|
||||
padding-bottom: 0;
|
||||
padding-top: 20px;
|
||||
text-align: center;
|
||||
}
|
||||
@@ -1,46 +0,0 @@
|
||||
//@ts-ignore
|
||||
import { MDCTextField } from "@material/textfield";
|
||||
//@ts-ignore
|
||||
import { MDCCheckbox } from "@material/checkbox";
|
||||
import "material-components-web/dist/material-components-web.css";
|
||||
import "./app.scss";
|
||||
|
||||
document.querySelectorAll(".mdc-text-field").forEach((d) => new MDCTextField(d));
|
||||
document.querySelectorAll(".mdc-checkbox").forEach((d) => new MDCCheckbox(d));
|
||||
|
||||
window.addEventListener("message", (event) => {
|
||||
if (event.data === "app") {
|
||||
document.body.classList.add("in-app");
|
||||
|
||||
const back = document.querySelector(".back")!;
|
||||
back.addEventListener("click", () => {
|
||||
(event.source as Window).postMessage("back", event.origin);
|
||||
});
|
||||
}
|
||||
});
|
||||
|
||||
const password = document.getElementById("password") as HTMLInputElement;
|
||||
const form = document.getElementById("login-form") as HTMLFormElement;
|
||||
|
||||
if (!form) {
|
||||
throw new Error("No password form found");
|
||||
}
|
||||
|
||||
form.addEventListener("submit", (e) => {
|
||||
e.preventDefault();
|
||||
document.cookie = `password=${password.value}; `
|
||||
+ `path=${location.pathname.replace(/\/login\/?$/, "/")}; `
|
||||
+ `domain=${location.hostname}`;
|
||||
location.reload();
|
||||
});
|
||||
|
||||
/**
|
||||
* Notify user on load of page if previous password was unsuccessful
|
||||
*/
|
||||
const reg = new RegExp(`password=(\\w+);?`);
|
||||
const matches = document.cookie.match(reg);
|
||||
const errorDisplay = document.getElementById("error-display") as HTMLDivElement;
|
||||
|
||||
if (document.referrer === document.location.href && matches) {
|
||||
errorDisplay.innerText = "Password is incorrect!";
|
||||
}
|
||||
@@ -1,16 +0,0 @@
|
||||
const path = require("path");
|
||||
const webpack = require("webpack");
|
||||
const merge = require("webpack-merge");
|
||||
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
||||
|
||||
const root = path.resolve(__dirname, "../../..");
|
||||
|
||||
module.exports = merge(
|
||||
require(path.join(root, "scripts/webpack.client.config.js"))({
|
||||
dirname: __dirname,
|
||||
entry: path.join(__dirname, "src/app.ts"),
|
||||
name: "login",
|
||||
template: path.join(__dirname, "src/app.html"),
|
||||
}), {
|
||||
},
|
||||
);
|
||||
@@ -1,606 +0,0 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@material/animation@^0.41.0":
|
||||
version "0.41.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/animation/-/animation-0.41.0.tgz#315b45b32e1aeebee8a4cf555b8ad52076d09ddd"
|
||||
integrity sha512-yYAwJbX3Q2AFd4dr6IYOsWLQy2HN8zWOFVl9AbUXunjzTfJCa/ecfXCriaT6qkmoNoHeTdJHRrsQJZC5GsPvzA==
|
||||
|
||||
"@material/auto-init@^0.41.0":
|
||||
version "0.41.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-0.41.0.tgz#8a59bb0b83e0f51ead9508074f9a29b2b6a20eec"
|
||||
integrity sha512-jp6L8MpYu7DudgDfA8iTyD9BwQrYPEDsIJGbqzN9vcCBl5FoBatkB8pcFXKr+1mRBk7T1Qmf6+H5nDtxyXjHEQ==
|
||||
|
||||
"@material/base@^0.41.0":
|
||||
version "0.41.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/base/-/base-0.41.0.tgz#badadce711b4c25b1eb889a5e7581e32cd07c421"
|
||||
integrity sha512-tEyzwBRu3d1H120SfKsDVYZHcqT5lKohh/7cWKR93aAaPDkSvjpKJIjyu2yuSkjpDduVZGzVocYbOvhUKhhzXQ==
|
||||
|
||||
"@material/button@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/button/-/button-0.44.0.tgz#f01dcbea88bdc314e7640b76e5558101c8b4d69d"
|
||||
integrity sha512-T8u8s8rlB49D9/5Nh5b0XsKRgSq3X0yWGo71MgaTnCnwxt8oZ6PxW/cH6Nn3Xp0NCr3mlSVQs08BviUfAmtlsg==
|
||||
dependencies:
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/feature-targeting" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/card@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/card/-/card-0.44.0.tgz#e62050e3e77f525173a015119200055cd7b71bf0"
|
||||
integrity sha512-fUixXuh133bVp5c1gPIHreL5jwMJEeVIQf0E4xdxhkA+i4ku8fIAvIW62EuCmfJsXicv4q8NG3Ip6pCY+NW3ZA==
|
||||
dependencies:
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/checkbox@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-0.44.0.tgz#5d0eee1db006db9f0fb700bf1c20408292305cf7"
|
||||
integrity sha512-IzucxG+NuPNyByGmHg/cuYJ5ooMKouuj994PZXZyqb7owfrjjtXm7wjav66cvCowbVbcoa1owQMGBi18C9f4TQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/selection-control" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/checkbox@^0.44.1":
|
||||
version "0.44.1"
|
||||
resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-0.44.1.tgz#7e69271ccab7c57914a475da3a15d4d36702c1c4"
|
||||
integrity sha512-RFUNc+9RKRozL+gXfJ8V57tXfC31Q9R9tRMTHpe62NXZriTrwNJDnSkFIERDXqtMGtkKUnIlPfPE5znF6XyPUw==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/feature-targeting" "^0.44.1"
|
||||
"@material/ripple" "^0.44.1"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/selection-control" "^0.44.1"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/chips@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/chips/-/chips-0.44.0.tgz#bf553a5bf5db7320978402ac92069c9688b84d5a"
|
||||
integrity sha512-+qrme6sGwYmX/ixHAo3Z1M7lorsxRyKexn1l+BSBX5PBc2f4w5Ml1eYYYcyVGfLX9LXmefRk0G6dUXXPyCE00g==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/checkbox" "^0.44.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/dialog@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-0.44.0.tgz#388f93f9f225824c75cbe9da8c464a52d79972e8"
|
||||
integrity sha512-V6ButfknOMKOscL0Y39yLjamxvrIuyugobjf5s44ZeJc+9jUSkC7M3zP+T7rh358NcX+JSPP8iCGmUn/+LXpMQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/dom" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
focus-trap "^4.0.2"
|
||||
|
||||
"@material/dom@^0.41.0":
|
||||
version "0.41.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/dom/-/dom-0.41.0.tgz#6756865f97bad4c91ee75e69d769d7cdc25398ae"
|
||||
integrity sha512-wOJrMwjPddYXpQFZAIaCLWI3TO/6KU1lxESTBzunni8A4FHQVWhokml5Xt85GqZwmPFeIF2s+D0wfbWyrGBuKQ==
|
||||
|
||||
"@material/drawer@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-0.44.0.tgz#74b3ddfb741bffc72331c7a73cf62716fd3f0ab3"
|
||||
integrity sha512-AYwFe0jgqqSmJd1bny8JJTA2SScF86Wfbk99lXXEwd/acS8IbnnuH6zfAg6MyJX12FDb8dE8Z/Ok1IwLiVa9sQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/list" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
focus-trap "^4.0.2"
|
||||
|
||||
"@material/elevation@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-0.44.0.tgz#ca16a67188ce9810dc2fa3d7a39073e72df4b754"
|
||||
integrity sha512-edNou34yFCSMb6XXe/6Y7AEh8DigWAhBUyIeMiMBD4k1km2xYCJbcnl8FBPJFteOrca97KoJComRlJPB6EurRQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/fab@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/fab/-/fab-0.44.0.tgz#0bcbbdfb6f24c53d59e08c9c0d400d2616dea184"
|
||||
integrity sha512-1CEP4NlXDYioJ/YpSjh/MlIygtoC7CaHqIbucxX1O5WRPmS7K1uPt+o7netbLErAmcJdV/JrI/tqh9kKuX2x/Q==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/feature-targeting@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-0.44.0.tgz#52cc73f0c8a83159de0357aebe74f15f9856fb4c"
|
||||
integrity sha512-ShuC2TOLfjFpYUCQFtvkqDJhM6HTaucSx5HkRbOvOG+VlpzDx6pAqRUmdVaq2p7tHoQf2vwPMlSVm3gOjWt4VQ==
|
||||
|
||||
"@material/feature-targeting@^0.44.1":
|
||||
version "0.44.1"
|
||||
resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-0.44.1.tgz#afafc80294e5efab94bee31a187273d43d34979a"
|
||||
integrity sha512-90cc7njn4aHbH9UxY8qgZth1W5JgOgcEdWdubH1t7sFkwqFxS5g3zgxSBt46TygFBVIXNZNq35Xmg80wgqO7Pg==
|
||||
|
||||
"@material/floating-label@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-0.44.0.tgz#8694cd49f6905641b67a9e7a112b820d028f09c7"
|
||||
integrity sha512-k4npGNxyMtnjgJZNjU5VvqqaUqlbzlbVAhepT8PxYTpj+4Skg6PjHwieTCDCgsbqHvFcQX+WfUrSZXY7wFV7cw==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/floating-label@^0.44.1":
|
||||
version "0.44.1"
|
||||
resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-0.44.1.tgz#39af84a3a0abbfa6d210911d5f4200a65c2ef59b"
|
||||
integrity sha512-umj5q5feJcZuB8snRX5aVBrwQNnrt/HcvN7pENzgqaYZNcmBnxRl0OutTlHCn6l7OVU9VlWhFMf77DYwmMWKJQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.1"
|
||||
|
||||
"@material/form-field@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-0.44.0.tgz#b7518e885c0e953a2a5fe0140af927c30e066f4e"
|
||||
integrity sha512-SK+V34dzoBCQ/CHn5nBp8BAh21Vj9p1pcok+/WpYBTeg4EphTYP2nUQLMNEN92l6zjgAYf+g9Ocj3t26HNHWqA==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/selection-control" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/grid-list@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/grid-list/-/grid-list-0.44.0.tgz#bd31d992ab1a910731e4a47c11fe91d44e3bc02b"
|
||||
integrity sha512-NxLL0A48K1O14ZZymFIyf6HDbF33+NgXYXqP2yosTC3Jw4iwmUcJTpFTmSw1U/m1xT4zEpeKEGJ4vjVUWpS9Mg==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/icon-button@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-0.44.0.tgz#febbcfd27d91eca8096ae042b9c07ed0f65345e9"
|
||||
integrity sha512-n6L7RaRyEci6eGsuBTSEG+t9ATHAHaMlf9zuTWorEnIXY4DAmGO7ggBjw4+1XIOjhpLeIjyJdcvUK6Yz/UVM6Q==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/icon-toggle@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/icon-toggle/-/icon-toggle-0.44.0.tgz#b9de32f194b5aa9721ca799d59be0f477a5c5305"
|
||||
integrity sha512-8T1b4iK61/q/3U0iIjEDJ9do5viCQ45IbrQqa8EYCZ1KDU/Q8z5N+bvOzQK8XnTL51BdDRMgP9lfQZh6nszmkA==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/image-list@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/image-list/-/image-list-0.44.0.tgz#a27996962044ac8c9ce6cb509f63746f08ed2e98"
|
||||
integrity sha512-kI9aKJdc1Bd02l8nRTGG1wy/lNkECScfnBmCiLQ3XjAFtRYd2eWO0Z/AVvUG3egsIZnZBxqFGGsf5Htm9E/HiQ==
|
||||
dependencies:
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/layout-grid@^0.41.0":
|
||||
version "0.41.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-0.41.0.tgz#2e7d3be76313e0684d573b10c2c6a88b3230d251"
|
||||
integrity sha512-Sa5RNoTGgfIojqJ9E94p7/k11V6q/tGk7HwKi4AQNAPjxield0zcl3G/SbsSb8YSHoK+D+7OXDN+n11x6EqF7g==
|
||||
|
||||
"@material/line-ripple@^0.43.0":
|
||||
version "0.43.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/line-ripple/-/line-ripple-0.43.0.tgz#6cb530bab53f055f3583646a21ad20c1703f3a83"
|
||||
integrity sha512-sXZYW4Em5uLEnAuVsQCO+sVHsTg7J2TOTJ0+akwZFMmd2tmNicjarQdlGIE9iU7Wjm51NOoLAu6Mz+8kLg90bQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/linear-progress@^0.43.0":
|
||||
version "0.43.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-0.43.0.tgz#4821424aa24c78de256e74a91d5be3df55c534d9"
|
||||
integrity sha512-bqkDcob+xp1mFkyBsOkoaLgrtapmz7jznGoI3nmkqyk75EB2XQcn1H8Vr6cnp/jkF4nbKu0GdVJO3VXUFmGmrQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/list@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/list/-/list-0.44.0.tgz#cf1910e15b66759334b8618d1110fbcc72c3d326"
|
||||
integrity sha512-35gkN1+XZaau9d9ngyN2x14bzkj/ajZCDm7mbWibDQy272A16j6KuFLQFA8RUQV04OgL4YPVxY87dpCn/p+uTg==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/dom" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/menu-surface@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-0.44.0.tgz#902c081df42859b925a5b4502791b3febf48f1ae"
|
||||
integrity sha512-s49kvIlQ4H5wvMD4yeHMMqnamPod06IUagMK6Ry0oTpUANSnyeNXxa3HkScl7DMJiS8IJeV21fSLAzlZYP2PDQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/menu@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/menu/-/menu-0.44.0.tgz#776ec8a04406266a0a0a13eb140b1fd691e442cb"
|
||||
integrity sha512-92XvAcv9rBW1jQ3UvwJ8zk9hbSRe/FqSuFdZ9fNPE348dCY2pbcdQfnUJTe3ycAN/I1c5frkrhx8F0II+nfbNQ==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/list" "^0.44.0"
|
||||
"@material/menu-surface" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
|
||||
"@material/notched-outline@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-0.44.0.tgz#d5a2e1d649921575a7cd2e88ee4581e4a1809573"
|
||||
integrity sha512-c3nqOqUQAmW3h4zBbZVbMRdf4nNTYm0tVwXIAwmcCs5nvAthEHnzHwwFddNP7/9Wju6LZ0uqWn6xlyKly0uipw==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/floating-label" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/notched-outline@^0.44.1":
|
||||
version "0.44.1"
|
||||
resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-0.44.1.tgz#dba4812286ba4c20f0361e6040bf9b9cad307434"
|
||||
integrity sha512-x1ZJtrrqZgXT8gYE7aRF+6hTWpX7XaKZzsuwD+e0HBsogYNNsYmkBdLjl4YwhhFuHhX8vWzgkay41GtbgQx84Q==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/floating-label" "^0.44.1"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.44.1"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/radio@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/radio/-/radio-0.44.0.tgz#f4cacdfabc7d765aa000cb34c5a37966f6d4fd6d"
|
||||
integrity sha512-ar7uhlfHuSwM9JUUjpv7pLDLE0p436cCMxNTpmMjWabfvo3pMWlExvk72Oj81tBgfxY/uASLB3oj4neudXu9JQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/selection-control" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/ripple@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-0.44.0.tgz#98920ff8ec4bf5714c97df3d190f02f8a5b476cc"
|
||||
integrity sha512-MlaW4nUDgzS0JOBfsUawXyTOilr0jn+xvTVn6PEaGh2rmhNA54AhixXvdsVUWE9lfmHAsZV0AJHz2z7nunNhbQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/feature-targeting" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/ripple@^0.44.1":
|
||||
version "0.44.1"
|
||||
resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-0.44.1.tgz#79cb2ddf1f998498d877d3e3c46b50fed6f13b01"
|
||||
integrity sha512-prJ1p3bR+GvwAtJgtdeIixsnRVApN3bizGnX7upKoqxsqbBDHj84JxaO8EsG9bjruG/LJu8Fb6WKKdIp2oXHTA==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/feature-targeting" "^0.44.1"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/rtl@^0.42.0":
|
||||
version "0.42.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-0.42.0.tgz#1836e78186c2d8b996f6fbf97adab203535335bc"
|
||||
integrity sha512-VrnrKJzhmspsN8WXHuxxBZ69yM5IwhCUqWr1t1eNfw3ZEvEj7i1g3P31HGowKThIN1dc1Wh4LE14rCISWCtv5w==
|
||||
|
||||
"@material/select@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/select/-/select-0.44.0.tgz#8041b4fe6247d013b0f12685fbdf50aa9ff57b35"
|
||||
integrity sha512-tw3/QIBLuRCT+5IXx4IPiJk7FzeGeR65JEizdRUItH8yzoIiQLs/b2i3KtHM2YBXHgeUcEBF2AOqPX2opdYhug==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/floating-label" "^0.44.0"
|
||||
"@material/line-ripple" "^0.43.0"
|
||||
"@material/menu" "^0.44.0"
|
||||
"@material/menu-surface" "^0.44.0"
|
||||
"@material/notched-outline" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/selection-control@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/selection-control/-/selection-control-0.44.0.tgz#63d5c65a47a9f54f5a0316b5ecdb5e5f35108609"
|
||||
integrity sha512-HgCAPnMVMEj4X4ILkFSifqtZ3Tcc5HkU+Lfk9g0807sCaN/qBKWkYKLH2WJUbW8uk+MXK7DgP1khtS5zzanJWA==
|
||||
dependencies:
|
||||
"@material/ripple" "^0.44.0"
|
||||
|
||||
"@material/selection-control@^0.44.1":
|
||||
version "0.44.1"
|
||||
resolved "https://registry.yarnpkg.com/@material/selection-control/-/selection-control-0.44.1.tgz#77a47354a4c5128fa34e3ba98d9cc26e8a92839a"
|
||||
integrity sha512-Xf1ee2ZV2XJ+rK8OcOD1DZOihfU0uVRdY6iYX/Bqi8k8RXnAbLIBoh6zG3xSwjRNODNvAyHEQaS/ozEfH8eehg==
|
||||
dependencies:
|
||||
"@material/ripple" "^0.44.1"
|
||||
|
||||
"@material/shape@^0.43.0":
|
||||
version "0.43.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/shape/-/shape-0.43.0.tgz#b877acfd8be8abc9ddcf6601eb60dd0588292415"
|
||||
integrity sha512-KGnoQV4G2OQbMe5Lr5Xbk8XNlO93Qi/juxXtd2wrAfiaPmktD8ug0CwdVDOPBOmj9a0gX3Ofi9XWcoU+tLEVjg==
|
||||
|
||||
"@material/shape@^0.44.1":
|
||||
version "0.44.1"
|
||||
resolved "https://registry.yarnpkg.com/@material/shape/-/shape-0.44.1.tgz#ff4d5d42b07c5781306677bffee43234b756ea8e"
|
||||
integrity sha512-8mCDQmyTEhDK+HX8Tap2Lc82QlVySlXU8zDCNkWoIn1ge+UnRezSDjE4y4P1ABegN5PrkJZPartuQ1U0ttIYXw==
|
||||
dependencies:
|
||||
"@material/feature-targeting" "^0.44.1"
|
||||
|
||||
"@material/slider@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/slider/-/slider-0.44.0.tgz#2055df894eb725e541cde50a544719c07934755b"
|
||||
integrity sha512-Lnn2fdUesXX4O0UpJzveEuOj+og+dXCwhal73u3l3NXEdc/eRgYxwWdF3ww4MmCZ786EwUmjb4vIc9olN4DO3A==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/snackbar@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-0.44.0.tgz#d98672b849f5f295e4fac2d474a9c80f11945518"
|
||||
integrity sha512-KhCrmJm8Zu/ZZPuRCGfMKsZ0vudINlNgTjlOau0kQ/UgR1xBUvLOE8NjyXZr0RQz5obyW7xpyIWIpscn0IUeyw==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/button" "^0.44.0"
|
||||
"@material/dom" "^0.41.0"
|
||||
"@material/icon-button" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/switch@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/switch/-/switch-0.44.0.tgz#f2cbb447437b12eb3bc7f0ec8318dbd3b4f0afce"
|
||||
integrity sha512-EadCg6lHUF260R2Q/l++vXIITqacvbXlobSoewA5ib6y9BU2g7l13wL1W8xAVJNUMgFa/PyN+EKT3oCql7jZLg==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/selection-control" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/tab-bar@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-0.44.0.tgz#b17d791bd557b1d84892fef1a1d8b8d6fef7c6d6"
|
||||
integrity sha512-kCrt05d61YXyY43SNc0dPGuqysbcLr/KRDBvzpXgE4gv2jCCVhhjAH10KPlx8pthp/UtvrYJHb34acAKEGzdHA==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/tab" "^0.44.0"
|
||||
"@material/tab-scroller" "^0.44.0"
|
||||
|
||||
"@material/tab-indicator@^0.43.0":
|
||||
version "0.43.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-0.43.0.tgz#37fd05513ba55ae218d9068c986c2676096fd6eb"
|
||||
integrity sha512-RMNMQpWYghWpM6d0ayfuHEPzTiebKG0bMthViiD6tly8PubmOT8mShNhPm8ihybhDPUOLSz+7V4QNE5wikLEYg==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/tab-scroller@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-0.44.0.tgz#82d092ed45d2ee9d82038bed318e6ff6bdc36dad"
|
||||
integrity sha512-Ufd3NWBN11kY2oA7bGmTYWGP1uz2mq0tfDM0JOiqoLMgD7y3Z18kmxnpq2qkg1vi4kvix28hBYGGMfLlq9rGDA==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/tab" "^0.44.0"
|
||||
|
||||
"@material/tab@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/tab/-/tab-0.44.0.tgz#254b92cff99015f0bd59a86d08d3f1c4744d0742"
|
||||
integrity sha512-czrbGjtKkmUS3iYBX523xT5GOkjP0h+0x9fTnw+heFNpw5dCn6cZvlj3D9ayZU+ZH93x68TFhFVBuLU5f0EBXw==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/tab-indicator" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/textfield@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-0.44.0.tgz#277b33948ddff33f7f643323895e5a683f013601"
|
||||
integrity sha512-IMBwMcE82eVU+Wifpu0t84tozvBPLCeqQELDtZNYujKg3RxaultzJLwIyGKPMZ9R4yPEpV2vgXPGKE+2/AWt0g==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/floating-label" "^0.44.0"
|
||||
"@material/line-ripple" "^0.43.0"
|
||||
"@material/notched-outline" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/textfield@^0.44.1":
|
||||
version "0.44.1"
|
||||
resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-0.44.1.tgz#2bba41cc94e68e328683997a1acf222b643dea9c"
|
||||
integrity sha512-zy+56+uqr+L9DGrdOfQjOIMdKlai/7ruyqVfqIY6ieABM7LEGsOsxHhyExQmXo9IiuFhrOceWKFa4yIb8jBsmQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/floating-label" "^0.44.1"
|
||||
"@material/line-ripple" "^0.43.0"
|
||||
"@material/notched-outline" "^0.44.1"
|
||||
"@material/ripple" "^0.44.1"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.44.1"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.1"
|
||||
|
||||
"@material/theme@^0.43.0":
|
||||
version "0.43.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/theme/-/theme-0.43.0.tgz#6d9fa113c82e841817882172c152d60d2d203ca6"
|
||||
integrity sha512-/zndZL6EihI18v2mYd4O8xvOBAAXmLeHyHVK28LozSAaJ9okQgD25wq5Ktk95oMTmPIC+rH66KcK6371ivNk8g==
|
||||
|
||||
"@material/toolbar@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/toolbar/-/toolbar-0.44.0.tgz#6689aecdeccc78b7a890a3abbe8b68a2c6339307"
|
||||
integrity sha512-YgLlOFQ5VzFLQBpXYSMviEbYox0fia+sasHuYPUhTAtas1ExVt9EEiIolDSVvhv2PruTReKKefxSbXAqGlOHog==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/top-app-bar@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-0.44.0.tgz#2495c7f9567568fb961ccced24f479c4806a72af"
|
||||
integrity sha512-tf0yXQJARYs8UPaH8oo3LnsSHEiur7Zm8Fc3hv3F0gNRRaZYBjwsMQMVbZZaWoQCWskMALyntBg+Fo18zdgDxw==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/typography@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/typography/-/typography-0.44.0.tgz#cf61dce2ee89bfa084d86e1b0f270a585bf9dfaf"
|
||||
integrity sha512-m4SjA9OjZRDKowN3cPzEa8e2GlTlEn3ZmW/Fy9eRNSp83iY+8a0xl6kCaF80v5qAVwVcpfEFyEHWxMJtkBw2uA==
|
||||
|
||||
"@material/typography@^0.44.1":
|
||||
version "0.44.1"
|
||||
resolved "https://registry.yarnpkg.com/@material/typography/-/typography-0.44.1.tgz#a94f01172f9122180bc2ce0aa55658183a35590d"
|
||||
integrity sha512-wMXHusg+Lp5Fdgoj3m0c+Lt6GCeGSh3EPRtQ1TQ2bwdBa0et2FqBaQRgXoq3tVmr0O/7unTfa0DoXlh4nVp1wA==
|
||||
dependencies:
|
||||
"@material/feature-targeting" "^0.44.1"
|
||||
|
||||
focus-trap@^4.0.2:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-4.0.2.tgz#4ee2b96547c9ea0e4252a2d4b2cca68944194663"
|
||||
integrity sha512-HtLjfAK7Hp2qbBtLS6wEznID1mPT+48ZnP2nkHzgjpL4kroYHg0CdqJ5cTXk+UO5znAxF5fRUkhdyfgrhh8Lzw==
|
||||
dependencies:
|
||||
tabbable "^3.1.2"
|
||||
xtend "^4.0.1"
|
||||
|
||||
material-components-web@^0.44.0:
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/material-components-web/-/material-components-web-0.44.0.tgz#ff782e8d7bdd8212d3c6022a731258d0d42da531"
|
||||
integrity sha512-BSRLf58SMVhAvlDhJDlcgYuvzeMwbMHKTJ7oIB8LaM24ZpXBxP9XCYJpKheMtiVLrgllCGDlJ/47OIDReHQXdQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/auto-init" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/button" "^0.44.0"
|
||||
"@material/card" "^0.44.0"
|
||||
"@material/checkbox" "^0.44.0"
|
||||
"@material/chips" "^0.44.0"
|
||||
"@material/dialog" "^0.44.0"
|
||||
"@material/dom" "^0.41.0"
|
||||
"@material/drawer" "^0.44.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/fab" "^0.44.0"
|
||||
"@material/feature-targeting" "^0.44.0"
|
||||
"@material/floating-label" "^0.44.0"
|
||||
"@material/form-field" "^0.44.0"
|
||||
"@material/grid-list" "^0.44.0"
|
||||
"@material/icon-button" "^0.44.0"
|
||||
"@material/icon-toggle" "^0.44.0"
|
||||
"@material/image-list" "^0.44.0"
|
||||
"@material/layout-grid" "^0.41.0"
|
||||
"@material/line-ripple" "^0.43.0"
|
||||
"@material/linear-progress" "^0.43.0"
|
||||
"@material/list" "^0.44.0"
|
||||
"@material/menu" "^0.44.0"
|
||||
"@material/menu-surface" "^0.44.0"
|
||||
"@material/notched-outline" "^0.44.0"
|
||||
"@material/radio" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/select" "^0.44.0"
|
||||
"@material/selection-control" "^0.44.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/slider" "^0.44.0"
|
||||
"@material/snackbar" "^0.44.0"
|
||||
"@material/switch" "^0.44.0"
|
||||
"@material/tab" "^0.44.0"
|
||||
"@material/tab-bar" "^0.44.0"
|
||||
"@material/tab-indicator" "^0.43.0"
|
||||
"@material/tab-scroller" "^0.44.0"
|
||||
"@material/textfield" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/toolbar" "^0.44.0"
|
||||
"@material/top-app-bar" "^0.44.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
tabbable@^3.1.2:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-3.1.2.tgz#f2d16cccd01f400e38635c7181adfe0ad965a4a2"
|
||||
integrity sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ==
|
||||
|
||||
xtend@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
|
||||
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
|
||||
|
Before Width: | Height: | Size: 537 B |
@@ -1,42 +0,0 @@
|
||||
{
|
||||
"manifest_version": 2,
|
||||
"name": "Coder",
|
||||
"version": "1",
|
||||
"icons": {
|
||||
"128": "icon_128.png"
|
||||
},
|
||||
"permissions": [
|
||||
"storage",
|
||||
"webview",
|
||||
"http://*/*",
|
||||
"https://*/*"
|
||||
],
|
||||
"app": {
|
||||
"background": {
|
||||
"scripts": [
|
||||
"out/background.js"
|
||||
]
|
||||
},
|
||||
"content": {
|
||||
"scripts": [
|
||||
"out/content.js"
|
||||
]
|
||||
}
|
||||
},
|
||||
"commands": {
|
||||
"toggle-feature-foo": {
|
||||
"suggested_key": {
|
||||
"default": "Ctrl+W"
|
||||
},
|
||||
"description": "Toggle feature foo",
|
||||
"global": true
|
||||
}
|
||||
},
|
||||
"sockets": {
|
||||
"tcpServer": {
|
||||
"listen": [
|
||||
""
|
||||
]
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -1,9 +0,0 @@
|
||||
{
|
||||
"name": "@coder/chrome-app",
|
||||
"dependencies": {
|
||||
"@types/chrome": "^0.0.79"
|
||||
},
|
||||
"scripts": {
|
||||
"build": "../../../node_modules/.bin/webpack --config ./webpack.config.js"
|
||||
}
|
||||
}
|
||||
@@ -1,13 +0,0 @@
|
||||
/// <reference path="../node_modules/@types/chrome/index.d.ts" />
|
||||
|
||||
// tslint:disable-next-line:no-any
|
||||
const chromeApp = (<any>chrome).app;
|
||||
|
||||
chromeApp.runtime.onLaunched.addListener(() => {
|
||||
chromeApp.window.create("src/index.html", {
|
||||
outerBounds: {
|
||||
width: 400,
|
||||
height: 500,
|
||||
},
|
||||
});
|
||||
});
|
||||
@@ -1,92 +0,0 @@
|
||||
//@ts-ignore
|
||||
import { TcpHost, TcpServer, TcpConnection } from "@coder/app/common/src/app";
|
||||
import { Event, Emitter } from "@coder/events/src";
|
||||
|
||||
export const tcpHost: TcpHost = {
|
||||
listen(host: string, port: number): Promise<TcpServer> {
|
||||
const socketApi: {
|
||||
readonly tcpServer: {
|
||||
create(props: {}, cb: (createInfo: { readonly socketId: number }) => void): void;
|
||||
listen(socketId: number, address: string, port: number, callback: (result: number) => void): void;
|
||||
disconnect(socketId: number, callback: () => void): void;
|
||||
|
||||
readonly onAccept: {
|
||||
addListener(callback: (info: { readonly socketId: number; readonly clientSocketId: number }) => void): void;
|
||||
};
|
||||
};
|
||||
readonly tcp: {
|
||||
readonly onReceive: {
|
||||
addListener(callback: (info: { readonly socketId: number; readonly data: ArrayBuffer; }) => void): void;
|
||||
};
|
||||
close(socketId: number, callback?: () => void): void;
|
||||
send(socketId: number, data: ArrayBuffer, callback?: () => void): void;
|
||||
setPaused(socketId: number, value: boolean): void;
|
||||
};
|
||||
// tslint:disable-next-line:no-any
|
||||
} = (<any>chrome).sockets;
|
||||
|
||||
return new Promise((resolve, reject): void => {
|
||||
socketApi.tcpServer.create({}, (createInfo) => {
|
||||
const serverSocketId = createInfo.socketId;
|
||||
socketApi.tcpServer.listen(serverSocketId, host, port, (result) => {
|
||||
if (result < 0) {
|
||||
return reject("Failed to listen: " + chrome.runtime.lastError);
|
||||
}
|
||||
|
||||
const connectionEmitter = new Emitter<TcpConnection>();
|
||||
|
||||
socketApi.tcpServer.onAccept.addListener((info) => {
|
||||
if (info.socketId !== serverSocketId) {
|
||||
return;
|
||||
}
|
||||
|
||||
const dataEmitter = new Emitter<ArrayBuffer>();
|
||||
|
||||
socketApi.tcp.onReceive.addListener((recvInfo) => {
|
||||
if (recvInfo.socketId !== info.clientSocketId) {
|
||||
return;
|
||||
}
|
||||
|
||||
dataEmitter.emit(recvInfo.data);
|
||||
});
|
||||
|
||||
socketApi.tcp.setPaused(info.clientSocketId, false);
|
||||
|
||||
connectionEmitter.emit({
|
||||
send: (data): Promise<void> => {
|
||||
return new Promise<void>((res): void => {
|
||||
socketApi.tcp.send(info.clientSocketId, data, () => {
|
||||
res();
|
||||
});
|
||||
});
|
||||
},
|
||||
close: (): Promise<void> => {
|
||||
return new Promise((res): void => {
|
||||
socketApi.tcp.close(info.clientSocketId, () => {
|
||||
res();
|
||||
});
|
||||
});
|
||||
},
|
||||
get onData(): Event<ArrayBuffer> {
|
||||
return dataEmitter.event;
|
||||
},
|
||||
});
|
||||
});
|
||||
|
||||
resolve({
|
||||
get onConnection(): Event<TcpConnection> {
|
||||
return connectionEmitter.event;
|
||||
},
|
||||
close: (): Promise<void> => {
|
||||
return new Promise((res): void => {
|
||||
socketApi.tcpServer.disconnect(serverSocketId, () => {
|
||||
res();
|
||||
});
|
||||
});
|
||||
},
|
||||
});
|
||||
});
|
||||
});
|
||||
});
|
||||
},
|
||||
};
|
||||
@@ -1,33 +0,0 @@
|
||||
import { create } from "@coder/app/common/src/app";
|
||||
import { tcpHost } from "./chome";
|
||||
|
||||
create({
|
||||
storage: {
|
||||
get: <T>(key: string): Promise<T | undefined> => {
|
||||
return new Promise<T | undefined>((resolve, reject): void => {
|
||||
try {
|
||||
chrome.storage.sync.get(key, (items) => {
|
||||
resolve(items[key]);
|
||||
});
|
||||
} catch (ex) {
|
||||
reject(ex);
|
||||
}
|
||||
});
|
||||
},
|
||||
set: <T>(key: string, value: T): Promise<void> => {
|
||||
return new Promise<void>((resolve, reject): void => {
|
||||
try {
|
||||
chrome.storage.sync.set({
|
||||
[key]: value,
|
||||
}, () => {
|
||||
resolve();
|
||||
});
|
||||
} catch (ex) {
|
||||
reject(ex);
|
||||
}
|
||||
});
|
||||
},
|
||||
},
|
||||
tcp: tcpHost,
|
||||
node: document.getElementById("main") as HTMLDivElement,
|
||||
});
|
||||
@@ -1,15 +0,0 @@
|
||||
<!DOCTYPE html>
|
||||
<html>
|
||||
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta http-equiv="Content-Security-Policy" content="style-src 'self' https://use.typekit.net; font-src 'self' https://use.typekit.net;">
|
||||
<link rel="stylesheet" type="text/css" href="/out/main.css">
|
||||
</head>
|
||||
|
||||
<body>
|
||||
<div id="main"></div>
|
||||
<script src="/out/content.js"></script>
|
||||
</body>
|
||||
|
||||
</html>
|
||||
@@ -1,37 +0,0 @@
|
||||
const path = require("path");
|
||||
const webpack = require("webpack");
|
||||
const merge = require("webpack-merge");
|
||||
const BundleAnalyzerPlugin = require("webpack-bundle-analyzer").BundleAnalyzerPlugin;
|
||||
const HtmlWebpackPlugin = require("html-webpack-plugin");
|
||||
const prod = process.env.NODE_ENV === "production";
|
||||
|
||||
module.exports = [
|
||||
merge(require(path.join(__dirname, "../../../scripts", "webpack.general.config.js"))(), {
|
||||
devtool: "none",
|
||||
mode: "development",
|
||||
target: "web",
|
||||
output: {
|
||||
path: path.join(__dirname, "out"),
|
||||
filename: "background.js",
|
||||
},
|
||||
entry: [
|
||||
"./packages/app/chrome/src/background.ts"
|
||||
],
|
||||
plugins: [
|
||||
]
|
||||
}),
|
||||
merge(require(path.join(__dirname, "../../../scripts", "webpack.general.config.js"))(), {
|
||||
devtool: "none",
|
||||
mode: "development",
|
||||
target: "web",
|
||||
output: {
|
||||
path: path.join(__dirname, "out"),
|
||||
filename: "content.js",
|
||||
},
|
||||
entry: [
|
||||
"./packages/app/chrome/src/content.ts"
|
||||
],
|
||||
plugins: [
|
||||
]
|
||||
}),
|
||||
];
|
||||
@@ -1,22 +0,0 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@types/chrome@^0.0.79":
|
||||
version "0.0.79"
|
||||
resolved "https://registry.yarnpkg.com/@types/chrome/-/chrome-0.0.79.tgz#1c83b35bd9b21b6204fb56e4816a1ea65dc013e5"
|
||||
integrity sha512-4+Xducpig6lpwVX65Hk8KSZwRoURHXMDbd38SDNcV8TBaw4xyJki39fjB1io2h7ip+BsyFvgTm9OxR5qneLPiA==
|
||||
dependencies:
|
||||
"@types/filesystem" "*"
|
||||
|
||||
"@types/filesystem@*":
|
||||
version "0.0.29"
|
||||
resolved "https://registry.yarnpkg.com/@types/filesystem/-/filesystem-0.0.29.tgz#ee3748eb5be140dcf980c3bd35f11aec5f7a3748"
|
||||
integrity sha512-85/1KfRedmfPGsbK8YzeaQUyV1FQAvMPMTuWFQ5EkLd2w7szhNO96bk3Rh/SKmOfd9co2rCLf0Voy4o7ECBOvw==
|
||||
dependencies:
|
||||
"@types/filewriter" "*"
|
||||
|
||||
"@types/filewriter@*":
|
||||
version "0.0.28"
|
||||
resolved "https://registry.yarnpkg.com/@types/filewriter/-/filewriter-0.0.28.tgz#c054e8af4d9dd75db4e63abc76f885168714d4b3"
|
||||
integrity sha1-wFTor02d11205jq8dviFFocU1LM=
|
||||
@@ -1,13 +0,0 @@
|
||||
{
|
||||
"name": "@coder/app-common",
|
||||
"main": "src/app.ts",
|
||||
"dependencies": {
|
||||
"material-components-web": "^0.44.0",
|
||||
"react": "^16.8.1",
|
||||
"react-dom": "^16.8.1"
|
||||
},
|
||||
"devDependencies": {
|
||||
"@types/react": "^16.8.2",
|
||||
"@types/react-dom": "^16.8.0"
|
||||
}
|
||||
}
|
||||
@@ -1,279 +0,0 @@
|
||||
@font-face {
|
||||
font-family: 'aktiv-grotesk';
|
||||
font-weight: 400;
|
||||
// src: url("fonts/AktivGroteskRegular.ttf"); /* IE9 Compat Modes */
|
||||
src: url("fonts/AktivGroteskRegular.woff2") format("woff2"), url("fonts/AktivGroteskRegular.woff") format("woff"); /* Pretty Modern Browsers */
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'aktiv-grotesk';
|
||||
font-weight: 500;
|
||||
src: url("fonts/AktivGroteskMedium.woff2") format("woff2"), url("fonts/AktivGroteskMedium.woff") format("woff"); /* Pretty Modern Browsers */
|
||||
// src: url("fonts/AktivGroteskMedium.ttf");
|
||||
}
|
||||
|
||||
@font-face {
|
||||
font-family: 'aktiv-grotesk';
|
||||
font-weight: 700;
|
||||
src: url("fonts/AktivGroteskBold.woff2") format("woff2"), url("fonts/AktivGroteskBold.woff") format("woff"); /* Pretty Modern Browsers */
|
||||
// src: url("fonts/AktivGroteskBold.ttf") format("ttf"); /* IE9 Compat Modes */
|
||||
}
|
||||
|
||||
body, button, input {
|
||||
font-family: 'aktiv-grotesk',sans-serif !important;
|
||||
}
|
||||
|
||||
body {
|
||||
margin: 0;
|
||||
background-color: #F6F8FB;
|
||||
--mdc-theme-primary: #2A2E37;
|
||||
}
|
||||
|
||||
webview {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
right: 0;
|
||||
bottom: 0;
|
||||
width: 100%;
|
||||
height: 100%;
|
||||
opacity: 0;
|
||||
pointer-events: none;
|
||||
transition: 150ms opacity ease;
|
||||
|
||||
&.active {
|
||||
opacity: 1;
|
||||
pointer-events: all;
|
||||
}
|
||||
}
|
||||
|
||||
.logo-fill {
|
||||
fill: #2A2E37;
|
||||
}
|
||||
|
||||
.main {
|
||||
& > .header {
|
||||
width: 100%;
|
||||
height: 71px;
|
||||
border-bottom: 1px solid rgba(117, 122, 131, 0.1);
|
||||
display: flex;
|
||||
margin-bottom: 60px;
|
||||
|
||||
.logo {
|
||||
max-height: fit-content;
|
||||
width: 145px;
|
||||
}
|
||||
|
||||
.shrinker {
|
||||
max-width: 1145px;
|
||||
width: 100%;
|
||||
margin: 0 auto;
|
||||
display: flex;
|
||||
}
|
||||
}
|
||||
|
||||
.content {
|
||||
max-width: 960px;
|
||||
width: 100%;
|
||||
padding-bottom: 100px;
|
||||
margin: 0 auto;
|
||||
}
|
||||
}
|
||||
|
||||
.servers {
|
||||
color: #2B343B;
|
||||
|
||||
& > .header {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
align-items: center;
|
||||
padding-bottom: 21px;
|
||||
|
||||
h3 {
|
||||
font-size: 24px;
|
||||
font-weight: 500;
|
||||
letter-spacing: 0.35px;
|
||||
line-height: 33px;
|
||||
margin: 0;
|
||||
margin-left: 30px;
|
||||
}
|
||||
|
||||
.add-server {
|
||||
margin-left: auto;
|
||||
border-radius: 24px;
|
||||
font-weight: bold;
|
||||
font-size: 14px;
|
||||
letter-spacing: 1.25px;
|
||||
}
|
||||
|
||||
.refresh {
|
||||
margin-left: 16px;
|
||||
margin-right: 15px;
|
||||
cursor: pointer;
|
||||
|
||||
svg {
|
||||
@keyframes rotate {
|
||||
100% { transform: rotate(360deg); }
|
||||
}
|
||||
|
||||
&.refreshing {
|
||||
animation: rotate 1s linear infinite;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
& > .grid {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1.6fr 1.3fr 1.1fr 0.6fr 0.4fr;
|
||||
box-shadow: 0 18px 80px 10px rgba(69, 65, 78, 0.08);
|
||||
border-radius: 0 0 5px 5px;
|
||||
|
||||
.mdc-linear-progress {
|
||||
grid-column-start: 1;
|
||||
grid-column-end: 7;
|
||||
// height: 0;
|
||||
position: relative;
|
||||
--mdc-theme-primary: rgb(107, 109, 102);
|
||||
height: 5px;
|
||||
|
||||
&:after {
|
||||
position: absolute;
|
||||
top: 0;
|
||||
left: 0;
|
||||
bottom: 0;
|
||||
right: 0;
|
||||
background-color: #2A2E37;
|
||||
transition: 500ms opacity ease;
|
||||
content: " ";
|
||||
}
|
||||
|
||||
&.loading {
|
||||
&:after {
|
||||
opacity: 0;
|
||||
}
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.title, .value {
|
||||
padding-top: 14px;
|
||||
padding-bottom: 14px;
|
||||
}
|
||||
|
||||
.title {
|
||||
background-color: var(--mdc-theme-primary);
|
||||
font-size: 10px;
|
||||
color: #9D9FA4;
|
||||
font-weight: bold;
|
||||
letter-spacing: 2px;
|
||||
line-height: 12px;
|
||||
text-transform: uppercase;
|
||||
// padding-top: 15px;
|
||||
// padding-bottom: 10px;
|
||||
|
||||
&:first-child {
|
||||
padding-left: 30px;
|
||||
border-radius: 10px 0 0 0;
|
||||
}
|
||||
|
||||
&:nth-child(6) {
|
||||
padding-right: 30px;
|
||||
border-radius: 0 10px 0 0;
|
||||
}
|
||||
|
||||
&.servername {
|
||||
color: white;
|
||||
}
|
||||
}
|
||||
|
||||
.value {
|
||||
border-top: 1px solid #EBEBF2;
|
||||
font-size: 14px;
|
||||
letter-spacing: 0.2px;
|
||||
display: flex;
|
||||
align-items: center;
|
||||
color: #717680;
|
||||
background-color: white;
|
||||
|
||||
&.dark {
|
||||
background-color: #F6F8FB;
|
||||
}
|
||||
|
||||
&.servername {
|
||||
.logo {
|
||||
height: 25px;
|
||||
}
|
||||
}
|
||||
|
||||
&.strong {
|
||||
font-weight: 600;
|
||||
color: #2B343B;
|
||||
font-size: 14px;
|
||||
letter-spacing: 0.6px;
|
||||
}
|
||||
|
||||
&.status {
|
||||
padding-left: 36px;
|
||||
|
||||
span {
|
||||
margin-left: 7px;
|
||||
line-height: 0px;
|
||||
}
|
||||
}
|
||||
|
||||
&.buttons {
|
||||
button {
|
||||
margin-left: auto;
|
||||
border-radius: 24px;
|
||||
border: 1px solid #CFD1D7;
|
||||
font-size: 14px;
|
||||
font-weight: bold;
|
||||
letter-spacing: 1.25px;
|
||||
line-height: 16px;
|
||||
padding-left: 18px;
|
||||
padding-right: 18px;
|
||||
}
|
||||
}
|
||||
|
||||
&.icons {
|
||||
padding-left: 16px;
|
||||
}
|
||||
|
||||
&:last-child {
|
||||
border-bottom-right-radius: 5px;
|
||||
}
|
||||
|
||||
&:nth-last-child(6) {
|
||||
border-bottom-left-radius: 5px;
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
.flex-row {
|
||||
display: flex;
|
||||
flex-direction: row;
|
||||
}
|
||||
|
||||
.floater {
|
||||
box-shadow: 0 8px 80px 10px rgba(69, 65, 78, 0.08);
|
||||
border-radius: 10px;
|
||||
padding: 3em;
|
||||
min-width: 300px;
|
||||
width: 100%;
|
||||
|
||||
& > h1 {
|
||||
font-size: 3.5em;
|
||||
margin-top: 0px;
|
||||
|
||||
// margin-bottom: 0px;
|
||||
|
||||
}
|
||||
}
|
||||
|
||||
.mdc-ripple-upgraded--unbounded {
|
||||
padding: 2px;
|
||||
padding-top: 5px;
|
||||
cursor: pointer;
|
||||
}
|
||||
@@ -1,33 +0,0 @@
|
||||
//@ts-ignore
|
||||
import { MDCTextField } from "@material/textfield";
|
||||
import { TcpHost } from "./connection";
|
||||
import { StorageProvider } from "./storage";
|
||||
import "material-components-web/dist/material-components-web.css";
|
||||
import "./app.scss";
|
||||
import "./tooltip.scss";
|
||||
|
||||
import * as React from "react";
|
||||
import { render } from "react-dom";
|
||||
import { Main } from "./containers";
|
||||
|
||||
export * from "./connection";
|
||||
export interface App {
|
||||
readonly tcp: TcpHost;
|
||||
readonly storage: StorageProvider;
|
||||
readonly node: HTMLElement;
|
||||
}
|
||||
|
||||
export interface RegisteredServer {
|
||||
readonly host: "coder" | "self";
|
||||
readonly hostname: string;
|
||||
readonly name: string;
|
||||
}
|
||||
|
||||
export const create = async (app: App): Promise<void> => {
|
||||
let servers = await app.storage.get<RegisteredServer[]>("servers");
|
||||
if (!servers) {
|
||||
servers = [];
|
||||
}
|
||||
|
||||
render(<Main />, app.node);
|
||||
};
|
||||
@@ -1,17 +0,0 @@
|
||||
import { Event } from "@coder/events";
|
||||
import { TunnelCloseEvent } from "@coder/tunnel/src/client";
|
||||
|
||||
export interface TcpHost {
|
||||
listen(host: string, port: number): Promise<TcpServer>;
|
||||
}
|
||||
|
||||
export interface TcpServer {
|
||||
readonly onConnection: Event<TcpConnection>;
|
||||
close(): Promise<void>;
|
||||
}
|
||||
|
||||
export interface TcpConnection {
|
||||
readonly onData: Event<ArrayBuffer>;
|
||||
send(data: ArrayBuffer): Promise<void>;
|
||||
close(): Promise<void>;
|
||||
}
|
||||
@@ -1,573 +0,0 @@
|
||||
//@ts-ignore
|
||||
import { MDCRipple } from "@material/ripple";
|
||||
//@ts-ignore
|
||||
import { MDCTextField } from "@material/textfield";
|
||||
//@ts-ignore
|
||||
import { MDCLinearProgress } from "@material/linear-progress";
|
||||
import * as React from "react";
|
||||
import * as ReactDOM from "react-dom";
|
||||
import { RegisteredServer } from "./app";
|
||||
|
||||
// tslint:disable-next-line:no-any
|
||||
declare var WebSettings: any;
|
||||
|
||||
interface AuthedUser {
|
||||
readonly username: string;
|
||||
}
|
||||
|
||||
export class Main extends React.Component<void, {
|
||||
readonly view: "servers" | "add-server";
|
||||
readonly loading: boolean;
|
||||
}> {
|
||||
private webview: HTMLWebViewElement | undefined;
|
||||
|
||||
public constructor(props: void) {
|
||||
super(props);
|
||||
this.state = {
|
||||
view: "servers",
|
||||
loading: false,
|
||||
};
|
||||
}
|
||||
|
||||
public componentDidMount(): void {
|
||||
window.addEventListener("message", (event) => {
|
||||
if (event.data === "back") {
|
||||
if (this.webview) {
|
||||
this.webview.classList.remove("active");
|
||||
}
|
||||
}
|
||||
if (event.data === "loaded") {
|
||||
if (this.webview) {
|
||||
// this.setState({ loading: false });
|
||||
// this.webview.classList.add("active");
|
||||
}
|
||||
}
|
||||
});
|
||||
|
||||
if (this.webview) {
|
||||
this.webview.addEventListener("error", (event) => {
|
||||
console.error(event);
|
||||
});
|
||||
this.webview.addEventListener("loadstart", (event) => {
|
||||
this.setState({ loading: true });
|
||||
});
|
||||
this.webview.addEventListener("loadstop", (event) => {
|
||||
this.setState({ loading: false });
|
||||
this.webview!.classList.add("active");
|
||||
// tslint:disable-next-line:no-any
|
||||
const cw = (this.webview as any).contentWindow as Window;
|
||||
cw.postMessage("app", "*");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
public render(): JSX.Element {
|
||||
return (
|
||||
<div className="main">
|
||||
<div className="header">
|
||||
<div className="shrinker">
|
||||
<Logo />
|
||||
</div>
|
||||
</div>
|
||||
<div className="content">
|
||||
{((): JSX.Element => {
|
||||
switch (this.state.view) {
|
||||
case "servers":
|
||||
return (
|
||||
<Servers servers={[
|
||||
{
|
||||
host: "coder",
|
||||
hostname: "--",
|
||||
name: "Coder",
|
||||
},
|
||||
{
|
||||
host: "self",
|
||||
hostname: "http://localhost:8080",
|
||||
name: "Dev Server",
|
||||
},
|
||||
]}
|
||||
user={{
|
||||
username: "Kyle",
|
||||
}}
|
||||
onSelect={(server): void => {
|
||||
if (this.webview) {
|
||||
this.webview.setAttribute("src", server.hostname);
|
||||
}
|
||||
}}
|
||||
onAddServer={() => this.setState({ view: "add-server" })}
|
||||
loading={this.state.loading}
|
||||
/>
|
||||
);
|
||||
case "add-server":
|
||||
return (
|
||||
<div>Add server</div>
|
||||
);
|
||||
}
|
||||
})()}
|
||||
</div>
|
||||
<webview ref={(wv: HTMLWebViewElement): HTMLWebViewElement => this.webview = wv}></webview>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class AddServer extends React.Component {
|
||||
public render(): JSX.Element {
|
||||
return (
|
||||
<div className="add-server">
|
||||
<h3>Add Server</h3>
|
||||
<p>Something about what you can do once you add your own server. A link to setup guides for this would be great as well.</p>
|
||||
<Input label="Address" id="address" />
|
||||
<br></br>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class Servers extends React.Component<{
|
||||
readonly user?: AuthedUser;
|
||||
readonly servers: ReadonlyArray<RegisteredServer>;
|
||||
readonly onSelect: (server: RegisteredServer) => void;
|
||||
readonly onAddServer: () => void;
|
||||
readonly loading: boolean;
|
||||
}, {
|
||||
readonly refreshing: boolean;
|
||||
}> {
|
||||
// tslint:disable-next-line:no-any
|
||||
public constructor(props: any) {
|
||||
super(props);
|
||||
this.state = {
|
||||
refreshing: false,
|
||||
};
|
||||
}
|
||||
|
||||
public render(): JSX.Element {
|
||||
return (
|
||||
<div className="servers">
|
||||
<div className="header">
|
||||
<h3>Servers</h3>
|
||||
<Button onClick={(): void => this.props.onAddServer()} className="add-server" type="unelevated">Add Server</Button>
|
||||
<Ripple>
|
||||
<div className="refresh">
|
||||
<svg onClick={(): void => this.doRefresh()} className={this.state.refreshing ? "refreshing" : ""} width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink">
|
||||
<g stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
|
||||
<g>
|
||||
<g transform="translate(4.000000, 4.000000)" fill="#2A2E37">
|
||||
<path d="M8,3 C9.179,3 10.311,3.423 11.205,4.17 L8.883,6.492 L15.094,7.031 L14.555,0.82 L12.625,2.75 C11.353,1.632 9.71,1 8,1 C4.567,1 1.664,3.454 1.097,6.834 L3.07,7.165 C3.474,4.752 5.548,3 8,3 Z" id="Path"></path>
|
||||
<path d="M8,13 C6.821,13 5.689,12.577 4.795,11.83 L7.117,9.508 L0.906,8.969 L1.445,15.18 L3.375,13.25 C4.647,14.368 6.29,15 8,15 C11.433,15 14.336,12.546 14.903,9.166 L12.93,8.835 C12.526,11.248 10.452,13 8,13 Z" id="Path"></path>
|
||||
</g>
|
||||
<rect id="Rectangle" fillRule="nonzero" x="0" y="0" width="24" height="24"></rect>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
</div>
|
||||
</Ripple>
|
||||
</div>
|
||||
<div className="grid">
|
||||
<div className="title status">
|
||||
Status
|
||||
</div>
|
||||
<div className="title servername">
|
||||
Server Name
|
||||
</div>
|
||||
<div className="title hostname">
|
||||
Hostname
|
||||
</div>
|
||||
<div className="title details">
|
||||
Details
|
||||
</div>
|
||||
<div className="title">
|
||||
{/* Used for continue/launch buttons */}
|
||||
</div>
|
||||
<div className="title">
|
||||
{/* Used for logout and delete buttons */}
|
||||
</div>
|
||||
|
||||
<div role="progressbar" className={`mdc-linear-progress mdc-linear-progress--indeterminate ${this.props.loading ? "loading" : ""}`} ref={(d) => {
|
||||
if (d) new MDCLinearProgress(d)}}>
|
||||
<div className="mdc-linear-progress__buffering-dots"></div>
|
||||
<div className="mdc-linear-progress__buffer"></div>
|
||||
<div className="mdc-linear-progress__bar mdc-linear-progress__primary-bar">
|
||||
<span className="mdc-linear-progress__bar-inner"></span>
|
||||
</div>
|
||||
<div className="mdc-linear-progress__bar mdc-linear-progress__secondary-bar">
|
||||
<span className="mdc-linear-progress__bar-inner"></span>
|
||||
</div>
|
||||
</div>
|
||||
|
||||
{this.props.servers.map((server, i) => {
|
||||
return (
|
||||
<Server key={server.hostname + i} user={this.props.user} server={server} onSelect={(): void => this.props.onSelect(server)} />
|
||||
);
|
||||
})}
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
|
||||
private doRefresh(): void {
|
||||
if (this.state.refreshing) {
|
||||
return;
|
||||
}
|
||||
|
||||
this.setState({
|
||||
refreshing: true,
|
||||
}, () => {
|
||||
setTimeout(() => {
|
||||
this.setState({
|
||||
refreshing: false,
|
||||
});
|
||||
}, 1500);
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
interface ServerProps {
|
||||
readonly user?: AuthedUser;
|
||||
readonly server: RegisteredServer;
|
||||
readonly onSelect: () => void;
|
||||
}
|
||||
|
||||
export class Server extends React.Component<ServerProps, {
|
||||
readonly user?: AuthedUser;
|
||||
readonly status: "Online" | "Offline" | "Checking";
|
||||
readonly version: string;
|
||||
}> {
|
||||
// tslint:disable-next-line:no-any
|
||||
public constructor(props: ServerProps) {
|
||||
super(props);
|
||||
this.state = {
|
||||
status: props.server.host === "coder" ? "Online" : "Checking",
|
||||
version: "",
|
||||
};
|
||||
}
|
||||
|
||||
public componentWillMount(): void {
|
||||
if (this.props.server.host !== "self") {
|
||||
return;
|
||||
}
|
||||
|
||||
const xhr = new XMLHttpRequest();
|
||||
xhr.open("GET", this.props.server.hostname);
|
||||
xhr.addEventListener("error", (err) => {
|
||||
this.setState({
|
||||
status: "Offline",
|
||||
});
|
||||
});
|
||||
xhr.addEventListener("loadend", () => {
|
||||
if (xhr.status === 200) {
|
||||
this.setState({
|
||||
status: "Online",
|
||||
version: process.env.VERSION,
|
||||
});
|
||||
} else {
|
||||
this.setState({
|
||||
status: "Offline",
|
||||
});
|
||||
}
|
||||
});
|
||||
xhr.send();
|
||||
}
|
||||
|
||||
public render(): JSX.Element {
|
||||
return (
|
||||
<>
|
||||
<div className={`status value ${this.extraClasses}`}>
|
||||
{((): JSX.Element => {
|
||||
switch (this.state.status) {
|
||||
case "Offline":
|
||||
return (
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink">
|
||||
<g id="Artboard-Copy-3" stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
|
||||
<circle id="Oval" stroke="#2B343B" strokeWidth="1.5" fillRule="nonzero" cx="8" cy="8" r="7.25"></circle>
|
||||
<path d="M5.15444712,5.15444712 L10.8455529,10.8455529" id="Path-4" stroke="#2B343B" strokeWidth="1.5" fillRule="nonzero"></path>
|
||||
<path d="M5.15444712,5.15444712 L10.8455529,10.8455529" id="Path-4" stroke="#2B343B" strokeWidth="1.5" fillRule="nonzero" transform="translate(8.000000, 8.000000) scale(-1, 1) translate(-8.000000, -8.000000) "></path>
|
||||
</g>
|
||||
</svg>
|
||||
);
|
||||
case "Online":
|
||||
return (
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink">
|
||||
<g id="Artboard-Copy-4" stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
|
||||
<g id="checkmark-copy-21" fillRule="nonzero">
|
||||
<circle id="Oval" fill="#2B343B" cx="8" cy="8" r="8"></circle>
|
||||
<polyline id="Path-2" stroke="#FFFFFF" strokeWidth="1.5" points="3.46296296 8.62222222 6.05555556 11.1111111 12.537037 4.88888889"></polyline>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
);
|
||||
case "Checking":
|
||||
return (
|
||||
<svg width="16px" height="16px" viewBox="0 0 16 16" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink">
|
||||
<g id="Artboard-Copy-5" stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
|
||||
<circle id="Oval" stroke="#2B343B" strokeWidth="1.5" fillRule="nonzero" cx="8" cy="8" r="7.25"></circle>
|
||||
<polyline id="Path" stroke="#2B343B" strokeWidth="1.5" points="7.90558664 4.63916767 7.90558664 8.63916767 11.9055866 8.63916767"></polyline>
|
||||
</g>
|
||||
</svg>
|
||||
);
|
||||
default:
|
||||
throw new Error("unsupported status");
|
||||
}
|
||||
})()}
|
||||
<span>
|
||||
{this.state.status}
|
||||
</span>
|
||||
</div>
|
||||
<div className={`servername value strong ${this.extraClasses}`}>
|
||||
{this.props.server.host === "coder" ? (
|
||||
<Logo />
|
||||
) : this.props.server.name}
|
||||
</div>
|
||||
<div className={`hostname value ${this.extraClasses}`}>
|
||||
{this.props.server.hostname}
|
||||
</div>
|
||||
<div className={`details value ${this.extraClasses}`}>
|
||||
{this.props.server.host === "coder" && this.props.user ? `Logged in as ${this.props.user.username}` : this.state.version}
|
||||
</div>
|
||||
<div className={`buttons value ${this.extraClasses}`}>
|
||||
<Button onClick={(): void => this.props.onSelect()} className="add-server" type="outlined">{this.props.server.host === "coder" ? "Continue" : "Launch"}</Button>
|
||||
</div>
|
||||
<div className={`icons value ${this.extraClasses}`}>
|
||||
<Ripple>
|
||||
<div>
|
||||
{this.props.server.host === "coder" ? (
|
||||
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink">
|
||||
<g id="Artboard" stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
|
||||
<g id="log-out-copy-2" transform="translate(4.000000, 4.000000)" fill="#2A2E37">
|
||||
<polygon id="Path" points="4 4 0 8 4 12 4 9 10 9 10 7 4 7"></polygon>
|
||||
<path d="M15,16 L6,16 C5.4,16 5,15.6 5,15 L5,12 L7,12 L7,14 L14,14 L14,2 L7,2 L7,4 L5,4 L5,1 C5,0.4 5.4,0 6,0 L15,0 C15.6,0 16,0.4 16,1 L16,15 C16,15.6 15.6,16 15,16 Z" id="Path"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
) : (
|
||||
<svg width="24px" height="24px" viewBox="0 0 24 24" version="1.1" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink">
|
||||
<g id="Artboard" stroke="none" strokeWidth="1" fill="none" fillRule="evenodd">
|
||||
<g id="bin" transform="translate(4.000000, 4.000000)" fill="#2B343B">
|
||||
<rect id="Rectangle" x="5" y="7" width="2" height="6"></rect>
|
||||
<rect id="Rectangle" x="9" y="7" width="2" height="6"></rect>
|
||||
<path d="M12,1 C12,0.4 11.6,0 11,0 L5,0 C4.4,0 4,0.4 4,1 L4,3 L0,3 L0,5 L1,5 L1,15 C1,15.6 1.4,16 2,16 L14,16 C14.6,16 15,15.6 15,15 L15,5 L16,5 L16,3 L12,3 L12,1 Z M6,2 L10,2 L10,3 L6,3 L6,2 Z M13,5 L13,14 L3,14 L3,5 L13,5 Z" id="Shape" fillRule="nonzero"></path>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
)}
|
||||
</div>
|
||||
</Ripple>
|
||||
</div>
|
||||
</>
|
||||
);
|
||||
}
|
||||
|
||||
private get extraClasses(): string {
|
||||
return this.props.server.host === "coder" ? "dark" : "";
|
||||
}
|
||||
}
|
||||
|
||||
export class Input extends React.Component<{
|
||||
readonly label: string;
|
||||
readonly id: string;
|
||||
readonly type?: string;
|
||||
}> {
|
||||
private wrapper: HTMLDivElement | undefined;
|
||||
|
||||
public componentDidMount(): void {
|
||||
if (this.wrapper) {
|
||||
const textInput = new MDCTextField(this.wrapper);
|
||||
}
|
||||
}
|
||||
|
||||
public render(): JSX.Element {
|
||||
return (
|
||||
<div className="mdc-text-field mdc-text-field--outlined" ref={(i: HTMLDivElement): HTMLDivElement => this.wrapper = i}>
|
||||
<input type={this.props.type || "text"} id={this.props.id} className="mdc-text-field__input" spellCheck={false}></input>
|
||||
<div className="mdc-notched-outline">
|
||||
<div className="mdc-notched-outline__leading"></div>
|
||||
<div className="mdc-notched-outline__notch">
|
||||
<label htmlFor={this.props.id} className="mdc-floating-label">{this.props.label}</label>
|
||||
</div>
|
||||
<div className="mdc-notched-outline__trailing"></div>
|
||||
</div>
|
||||
</div>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class Button extends React.Component<{
|
||||
readonly type: "outlined" | "unelevated";
|
||||
readonly className?: string;
|
||||
readonly onClick?: () => void;
|
||||
}> {
|
||||
private button: HTMLButtonElement | undefined;
|
||||
|
||||
public componentDidMount(): void {
|
||||
if (this.button) {
|
||||
const b = new MDCRipple(this.button);
|
||||
}
|
||||
}
|
||||
|
||||
public render(): JSX.Element {
|
||||
return (
|
||||
<button onClick={() => this.props.onClick ? this.props.onClick() : undefined} className={`mdc-button mdc-button--${this.props.type} ${this.props.className || ""}`} ref={(b: HTMLButtonElement): HTMLButtonElement => this.button = b}>
|
||||
<span className="mdc-button__label">{this.props.children}</span>
|
||||
</button>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class Tooltip extends React.Component<{
|
||||
readonly message: string;
|
||||
}> {
|
||||
public componentDidMount(): void {
|
||||
Object.keys(this.refs).forEach((ref) => {
|
||||
const el = this.refs[ref];
|
||||
if (el) {
|
||||
const element = ReactDOM.findDOMNode(el);
|
||||
if (element) {
|
||||
const te = document.createElement("div");
|
||||
te.className = "md-tooltip-content";
|
||||
te.innerHTML = this.props.message;
|
||||
element.appendChild(te);
|
||||
(element as HTMLElement).classList.add("md-tooltip");
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public render(): JSX.Element {
|
||||
return (
|
||||
<>
|
||||
{React.Children.map(this.props.children, (element, idx) => {
|
||||
return React.cloneElement(element as any, { ref: idx });
|
||||
})}
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class Ripple extends React.Component<{
|
||||
readonly className?: string;
|
||||
}> {
|
||||
public componentDidMount(): void {
|
||||
Object.keys(this.refs).forEach((ref) => {
|
||||
const el = this.refs[ref];
|
||||
if (el) {
|
||||
const element = ReactDOM.findDOMNode(el);
|
||||
if (element) {
|
||||
(element as HTMLElement).classList.add("mdc-ripple-surface");
|
||||
(element as HTMLElement).setAttribute("data-mdc-ripple-is-unbounded", "");
|
||||
const r = new MDCRipple(element);
|
||||
}
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
public render(): JSX.Element {
|
||||
return (
|
||||
<>
|
||||
{React.Children.map(this.props.children, (element, idx) => {
|
||||
return React.cloneElement(element as any, { ref: idx });
|
||||
})}
|
||||
</>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
export class Logo extends React.Component {
|
||||
public render(): JSX.Element {
|
||||
return (
|
||||
<svg className="logo" version="1.1" id="Layer_1" xmlns="http://www.w3.org/2000/svg" xmlnsXlink="http://www.w3.org/1999/xlink" x="0px" y="0px" viewBox="0 0 471 117"
|
||||
style={{enableBackground: "new 0 0 471 117"} as any} xmlSpace="preserve">
|
||||
<g>
|
||||
<g>
|
||||
<path className="logo-fill" d="M217,75.6c5.9,0,10.7-2.3,14.5-7l7.7,7.9c-6.1,6.9-13.3,10.3-21.6,10.3s-15.1-2.6-20.5-7.9
|
||||
C191.7,73.7,189,67,189,59s2.7-14.7,8.2-20s12.2-8,20.1-8c8.8,0,16.2,3.4,22.2,10.1l-7.5,8.5c-3.8-4.7-8.5-7.1-14.2-7.1
|
||||
c-4.5,0-8.4,1.5-11.6,4.4c-3.2,3-4.8,6.9-4.8,11.9s1.5,9,4.5,12.1C209,74.1,212.6,75.6,217,75.6z M284.1,46.7
|
||||
c-3.1-3.4-6.9-5.1-11.4-5.1s-8.3,1.7-11.4,5.1s-4.6,7.5-4.6,12.3s1.5,8.9,4.6,12.3s6.9,5,11.4,5s8.3-1.7,11.4-5
|
||||
c3.1-3.4,4.6-7.5,4.6-12.3S287.2,50.1,284.1,46.7z M272.7,86.8c-8,0-14.7-2.7-20.1-8s-8.2-11.9-8.2-19.9c0-7.9,2.7-14.5,8.2-19.9
|
||||
c5.4-5.3,12.2-8,20.1-8c8,0,14.7,2.7,20.1,8s8.2,11.9,8.2,19.9c0,7.9-2.7,14.5-8.2,19.9C287.4,84.1,280.7,86.8,272.7,86.8z
|
||||
M352.3,39.4c5.1,4.7,7.7,11.2,7.7,19.6s-2.5,15-7.5,19.9s-12.7,7.3-22.9,7.3h-18.4V32.3h19C339.8,32.4,347.2,34.7,352.3,39.4z
|
||||
M343.5,71.5c3-2.8,4.4-6.8,4.4-12.1s-1.5-9.4-4.4-12.2c-3-2.9-7.5-4.3-13.6-4.3h-6.7v32.8h7.6C336.3,75.6,340.5,74.2,343.5,71.5z
|
||||
M409.3,32.4v10.7h-26.8v11.1h24.1v10.3h-24.1v11.2h27.7v10.6h-39.7V32.4H409.3L409.3,32.4z M464.6,50.3c0,8.6-3.4,14.2-10.3,16.7
|
||||
l13.6,19.3h-14.8l-11.9-17.2h-8.3v17.2h-12V32.4h20.4c8.4,0,14.4,1.4,17.9,4.2C462.8,39.4,464.6,44,464.6,50.3z M450.1,56.7
|
||||
c1.5-1.3,2.2-3.5,2.2-6.4s-0.8-4.9-2.3-6s-4.2-1.6-8.1-1.6h-9v16h8.8C445.8,58.7,448.6,58,450.1,56.7z"/>
|
||||
</g>
|
||||
<g>
|
||||
<path className="logo-fill" d="M164.8,50.9c-3.3,0-5.5-1.9-5.5-5.8V22.7c0-14.3-6-22.2-21.5-22.2h-7.2v15.1h2.2c6.1,0,9,3.3,9,9.2v19.8
|
||||
c0,8.6,2.6,12.1,8.3,13.9c-5.7,1.7-8.3,5.3-8.3,13.9c0,4.9,0,9.8,0,14.7c0,4.1,0,8.1-1.1,12.2c-1.1,3.8-2.9,7.4-5.4,10.5
|
||||
c-1.4,1.8-3,3.3-4.8,4.7v2h7.2c15.5,0,21.5-7.9,21.5-22.2V71.9c0-4,2.1-5.8,5.5-5.8h4.1V51h-4V50.9L164.8,50.9z"/>
|
||||
<path className="logo-fill" d="M115.8,23.3H93.6c-0.5,0-0.9-0.4-0.9-0.9v-1.7c0-0.5,0.4-0.9,0.9-0.9h22.3c0.5,0,0.9,0.4,0.9,0.9v1.7
|
||||
C116.8,22.9,116.3,23.3,115.8,23.3z"/>
|
||||
<path className="logo-fill" d="M119.6,44.9h-16.2c-0.5,0-0.9-0.4-0.9-0.9v-1.7c0-0.5,0.4-0.9,0.9-0.9h16.2c0.5,0,0.9,0.4,0.9,0.9V44
|
||||
C120.5,44.4,120.1,44.9,119.6,44.9z"/>
|
||||
<path className="logo-fill" d="M126,34.1H93.6c-0.5,0-0.9-0.4-0.9-0.9v-1.7c0-0.5,0.4-0.9,0.9-0.9h32.3c0.5,0,0.9,0.4,0.9,0.9v1.7
|
||||
C126.8,33.6,126.5,34.1,126,34.1z"/>
|
||||
<g>
|
||||
<path className="logo-fill" d="M67.9,28.2c2.2,0,4.4,0.2,6.5,0.7v-4.1c0-5.8,3-9.2,9-9.2h2.2V0.5h-7.2c-15.5,0-21.5,7.9-21.5,22.2v7.4
|
||||
C60.4,28.9,64.1,28.2,67.9,28.2z"/>
|
||||
</g>
|
||||
<path className="logo-fill" d="M132.8,82.6c-1.6-12.7-11.4-23.3-24-25.7c-3.5-0.7-7-0.8-10.4-0.2c-0.1,0-0.1-0.1-0.2-0.1
|
||||
c-5.5-11.5-17.3-19.1-30.1-19.1S43.6,44.9,38,56.4c-0.1,0-0.1,0.1-0.2,0.1c-3.6-0.4-7.2-0.2-10.8,0.7c-12.4,3-21.8,13.4-23.5,26
|
||||
c-0.2,1.3-0.3,2.6-0.3,3.8c0,3.8,2.6,7.3,6.4,7.8c4.7,0.7,8.8-2.9,8.7-7.5c0-0.7,0-1.5,0.1-2.2c0.8-6.4,5.7-11.8,12.1-13.3
|
||||
c2-0.5,4-0.6,5.9-0.3c6.1,0.8,12.1-2.3,14.7-7.7c1.9-4,4.9-7.5,8.9-9.4c4.4-2.1,9.4-2.4,14-0.8c4.8,1.7,8.4,5.3,10.6,9.8
|
||||
c2.3,4.4,3.4,7.5,8.3,8.1c2,0.3,7.6,0.2,9.7,0.1c4.1,0,8.2,1.4,11.1,4.3c1.9,2,3.3,4.5,3.9,7.3c0.9,4.5-0.2,9-2.9,12.4
|
||||
c-1.9,2.4-4.5,4.2-7.4,5c-1.4,0.4-2.8,0.5-4.2,0.5c-0.8,0-1.9,0-3.2,0c-4,0-12.5,0-18.9,0c-4.4,0-7.9-3.5-7.9-7.9V78.4V63.9
|
||||
c0-1.2-1-2.2-2.2-2.2h-3.1c-6.1,0.1-11,6.9-11,14.1s0,26.3,0,26.3c0,7.8,6.3,14.1,14.1,14.1c0,0,34.7-0.1,35.2-0.1
|
||||
c8-0.8,15.4-4.9,20.4-11.2C131.5,98.8,133.8,90.8,132.8,82.6z"/>
|
||||
</g>
|
||||
</g>
|
||||
</svg>
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
// const $ = <K extends keyof HTMLElementTagNameMap>(tagName: K, className?: string, content?: string): HTMLElementTagNameMap[K] => {
|
||||
// const el = document.createElement(tagName);
|
||||
// if (className) {
|
||||
// el.className = className;
|
||||
// }
|
||||
// if (content) {
|
||||
// el.innerText = content;
|
||||
// }
|
||||
|
||||
// return el;
|
||||
// };
|
||||
|
||||
// const createInput = (id: string, labelName: string, type: string = "text"): HTMLDivElement => {
|
||||
// // <div class="mdc-text-field mdc-text-field--outlined">
|
||||
// // <input type="password" id="password" class="mdc-text-field__input">
|
||||
// // <!-- <label class="mdc-floating-label" for="name">Name</label>
|
||||
// // <div class="mdc-line-ripple"></div> -->
|
||||
// // <div class="mdc-notched-outline">
|
||||
// // <div class="mdc-notched-outline__leading"></div>
|
||||
// // <div class="mdc-notched-outline__notch">
|
||||
// // <label for="password" class="mdc-floating-label">Password</label>
|
||||
// // </div>
|
||||
// // <div class="mdc-notched-outline__trailing"></div>
|
||||
// // </div>
|
||||
|
||||
// const wrapper = $("div", "mdc-text-field mdc-text-field--outlined");
|
||||
// const input = $("input", "mdc-text-field__input");
|
||||
// input.type = type;
|
||||
// input.id = id;
|
||||
// wrapper.appendChild(input);
|
||||
// const notchedOutline = $("div", "mdc-notched-outline");
|
||||
// notchedOutline.appendChild($("div", "mdc-notched-outline__leading"));
|
||||
// const notch = $("div", "mdc-notched-outline__notch");
|
||||
// const label = $("label", "mdc-floating-label", labelName);
|
||||
// label.setAttribute("for", id);
|
||||
// notch.appendChild(label);
|
||||
// notchedOutline.appendChild(notch);
|
||||
// wrapper.appendChild(notchedOutline);
|
||||
// wrapper.appendChild($("div", "mdc-notched-outline__trailing"));
|
||||
|
||||
// const field = new MDCTextField(wrapper);
|
||||
|
||||
// return wrapper;
|
||||
// };
|
||||
|
||||
// export const createCoderLogin = (parentNode: HTMLElement): void => {
|
||||
// parentNode.appendChild($("h1", "header", "Login with Coder"));
|
||||
// parentNode.appendChild(createInput("username", "Username"));
|
||||
// parentNode.appendChild($("br"));
|
||||
// parentNode.appendChild($("br"));
|
||||
// parentNode.appendChild(createInput("password", "Password", "password"));
|
||||
// };
|
||||
@@ -1,5 +0,0 @@
|
||||
|
||||
export interface StorageProvider {
|
||||
set<T>(key: string, value: T): Promise<void>;
|
||||
get<T>(key: string): Promise<T | undefined>;
|
||||
}
|
||||
@@ -1,24 +0,0 @@
|
||||
.md-tooltip {
|
||||
position: relative;
|
||||
}
|
||||
|
||||
.md-tooltip-content {
|
||||
position: absolute;
|
||||
bottom: -35px;
|
||||
left: 50%;
|
||||
padding: 7px;
|
||||
transform: translateX(-50%) scale(0);
|
||||
transition: transform 0.15s cubic-bezier(0, 0, 0.2, 1);
|
||||
transform-origin: top;
|
||||
background: rgba(67, 67, 67, 0.97);
|
||||
color: white;
|
||||
letter-spacing: 0.3px;
|
||||
border-radius: 3px;
|
||||
font-size: 12px;
|
||||
font-weight: 500;
|
||||
z-index: 2;
|
||||
}
|
||||
|
||||
.md-tooltip:hover .md-tooltip-content {
|
||||
transform: translateX(-50%) scale(1);
|
||||
}
|
||||
@@ -1,601 +0,0 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
"@material/animation@^0.41.0":
|
||||
version "0.41.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/animation/-/animation-0.41.0.tgz#315b45b32e1aeebee8a4cf555b8ad52076d09ddd"
|
||||
integrity sha512-yYAwJbX3Q2AFd4dr6IYOsWLQy2HN8zWOFVl9AbUXunjzTfJCa/ecfXCriaT6qkmoNoHeTdJHRrsQJZC5GsPvzA==
|
||||
|
||||
"@material/auto-init@^0.41.0":
|
||||
version "0.41.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/auto-init/-/auto-init-0.41.0.tgz#8a59bb0b83e0f51ead9508074f9a29b2b6a20eec"
|
||||
integrity sha512-jp6L8MpYu7DudgDfA8iTyD9BwQrYPEDsIJGbqzN9vcCBl5FoBatkB8pcFXKr+1mRBk7T1Qmf6+H5nDtxyXjHEQ==
|
||||
|
||||
"@material/base@^0.41.0":
|
||||
version "0.41.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/base/-/base-0.41.0.tgz#badadce711b4c25b1eb889a5e7581e32cd07c421"
|
||||
integrity sha512-tEyzwBRu3d1H120SfKsDVYZHcqT5lKohh/7cWKR93aAaPDkSvjpKJIjyu2yuSkjpDduVZGzVocYbOvhUKhhzXQ==
|
||||
|
||||
"@material/button@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/button/-/button-0.44.0.tgz#f01dcbea88bdc314e7640b76e5558101c8b4d69d"
|
||||
integrity sha512-T8u8s8rlB49D9/5Nh5b0XsKRgSq3X0yWGo71MgaTnCnwxt8oZ6PxW/cH6Nn3Xp0NCr3mlSVQs08BviUfAmtlsg==
|
||||
dependencies:
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/feature-targeting" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/card@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/card/-/card-0.44.0.tgz#e62050e3e77f525173a015119200055cd7b71bf0"
|
||||
integrity sha512-fUixXuh133bVp5c1gPIHreL5jwMJEeVIQf0E4xdxhkA+i4ku8fIAvIW62EuCmfJsXicv4q8NG3Ip6pCY+NW3ZA==
|
||||
dependencies:
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/checkbox@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/checkbox/-/checkbox-0.44.0.tgz#5d0eee1db006db9f0fb700bf1c20408292305cf7"
|
||||
integrity sha512-IzucxG+NuPNyByGmHg/cuYJ5ooMKouuj994PZXZyqb7owfrjjtXm7wjav66cvCowbVbcoa1owQMGBi18C9f4TQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/selection-control" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/chips@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/chips/-/chips-0.44.0.tgz#bf553a5bf5db7320978402ac92069c9688b84d5a"
|
||||
integrity sha512-+qrme6sGwYmX/ixHAo3Z1M7lorsxRyKexn1l+BSBX5PBc2f4w5Ml1eYYYcyVGfLX9LXmefRk0G6dUXXPyCE00g==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/checkbox" "^0.44.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/dialog@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/dialog/-/dialog-0.44.0.tgz#388f93f9f225824c75cbe9da8c464a52d79972e8"
|
||||
integrity sha512-V6ButfknOMKOscL0Y39yLjamxvrIuyugobjf5s44ZeJc+9jUSkC7M3zP+T7rh358NcX+JSPP8iCGmUn/+LXpMQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/dom" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
focus-trap "^4.0.2"
|
||||
|
||||
"@material/dom@^0.41.0":
|
||||
version "0.41.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/dom/-/dom-0.41.0.tgz#6756865f97bad4c91ee75e69d769d7cdc25398ae"
|
||||
integrity sha512-wOJrMwjPddYXpQFZAIaCLWI3TO/6KU1lxESTBzunni8A4FHQVWhokml5Xt85GqZwmPFeIF2s+D0wfbWyrGBuKQ==
|
||||
|
||||
"@material/drawer@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/drawer/-/drawer-0.44.0.tgz#74b3ddfb741bffc72331c7a73cf62716fd3f0ab3"
|
||||
integrity sha512-AYwFe0jgqqSmJd1bny8JJTA2SScF86Wfbk99lXXEwd/acS8IbnnuH6zfAg6MyJX12FDb8dE8Z/Ok1IwLiVa9sQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/list" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
focus-trap "^4.0.2"
|
||||
|
||||
"@material/elevation@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/elevation/-/elevation-0.44.0.tgz#ca16a67188ce9810dc2fa3d7a39073e72df4b754"
|
||||
integrity sha512-edNou34yFCSMb6XXe/6Y7AEh8DigWAhBUyIeMiMBD4k1km2xYCJbcnl8FBPJFteOrca97KoJComRlJPB6EurRQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/fab@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/fab/-/fab-0.44.0.tgz#0bcbbdfb6f24c53d59e08c9c0d400d2616dea184"
|
||||
integrity sha512-1CEP4NlXDYioJ/YpSjh/MlIygtoC7CaHqIbucxX1O5WRPmS7K1uPt+o7netbLErAmcJdV/JrI/tqh9kKuX2x/Q==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/feature-targeting@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/feature-targeting/-/feature-targeting-0.44.0.tgz#52cc73f0c8a83159de0357aebe74f15f9856fb4c"
|
||||
integrity sha512-ShuC2TOLfjFpYUCQFtvkqDJhM6HTaucSx5HkRbOvOG+VlpzDx6pAqRUmdVaq2p7tHoQf2vwPMlSVm3gOjWt4VQ==
|
||||
|
||||
"@material/floating-label@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/floating-label/-/floating-label-0.44.0.tgz#8694cd49f6905641b67a9e7a112b820d028f09c7"
|
||||
integrity sha512-k4npGNxyMtnjgJZNjU5VvqqaUqlbzlbVAhepT8PxYTpj+4Skg6PjHwieTCDCgsbqHvFcQX+WfUrSZXY7wFV7cw==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/form-field@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/form-field/-/form-field-0.44.0.tgz#b7518e885c0e953a2a5fe0140af927c30e066f4e"
|
||||
integrity sha512-SK+V34dzoBCQ/CHn5nBp8BAh21Vj9p1pcok+/WpYBTeg4EphTYP2nUQLMNEN92l6zjgAYf+g9Ocj3t26HNHWqA==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/selection-control" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/grid-list@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/grid-list/-/grid-list-0.44.0.tgz#bd31d992ab1a910731e4a47c11fe91d44e3bc02b"
|
||||
integrity sha512-NxLL0A48K1O14ZZymFIyf6HDbF33+NgXYXqP2yosTC3Jw4iwmUcJTpFTmSw1U/m1xT4zEpeKEGJ4vjVUWpS9Mg==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/icon-button@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/icon-button/-/icon-button-0.44.0.tgz#febbcfd27d91eca8096ae042b9c07ed0f65345e9"
|
||||
integrity sha512-n6L7RaRyEci6eGsuBTSEG+t9ATHAHaMlf9zuTWorEnIXY4DAmGO7ggBjw4+1XIOjhpLeIjyJdcvUK6Yz/UVM6Q==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/icon-toggle@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/icon-toggle/-/icon-toggle-0.44.0.tgz#b9de32f194b5aa9721ca799d59be0f477a5c5305"
|
||||
integrity sha512-8T1b4iK61/q/3U0iIjEDJ9do5viCQ45IbrQqa8EYCZ1KDU/Q8z5N+bvOzQK8XnTL51BdDRMgP9lfQZh6nszmkA==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/image-list@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/image-list/-/image-list-0.44.0.tgz#a27996962044ac8c9ce6cb509f63746f08ed2e98"
|
||||
integrity sha512-kI9aKJdc1Bd02l8nRTGG1wy/lNkECScfnBmCiLQ3XjAFtRYd2eWO0Z/AVvUG3egsIZnZBxqFGGsf5Htm9E/HiQ==
|
||||
dependencies:
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/layout-grid@^0.41.0":
|
||||
version "0.41.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/layout-grid/-/layout-grid-0.41.0.tgz#2e7d3be76313e0684d573b10c2c6a88b3230d251"
|
||||
integrity sha512-Sa5RNoTGgfIojqJ9E94p7/k11V6q/tGk7HwKi4AQNAPjxield0zcl3G/SbsSb8YSHoK+D+7OXDN+n11x6EqF7g==
|
||||
|
||||
"@material/line-ripple@^0.43.0":
|
||||
version "0.43.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/line-ripple/-/line-ripple-0.43.0.tgz#6cb530bab53f055f3583646a21ad20c1703f3a83"
|
||||
integrity sha512-sXZYW4Em5uLEnAuVsQCO+sVHsTg7J2TOTJ0+akwZFMmd2tmNicjarQdlGIE9iU7Wjm51NOoLAu6Mz+8kLg90bQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/linear-progress@^0.43.0":
|
||||
version "0.43.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/linear-progress/-/linear-progress-0.43.0.tgz#4821424aa24c78de256e74a91d5be3df55c534d9"
|
||||
integrity sha512-bqkDcob+xp1mFkyBsOkoaLgrtapmz7jznGoI3nmkqyk75EB2XQcn1H8Vr6cnp/jkF4nbKu0GdVJO3VXUFmGmrQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/list@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/list/-/list-0.44.0.tgz#cf1910e15b66759334b8618d1110fbcc72c3d326"
|
||||
integrity sha512-35gkN1+XZaau9d9ngyN2x14bzkj/ajZCDm7mbWibDQy272A16j6KuFLQFA8RUQV04OgL4YPVxY87dpCn/p+uTg==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/dom" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/menu-surface@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/menu-surface/-/menu-surface-0.44.0.tgz#902c081df42859b925a5b4502791b3febf48f1ae"
|
||||
integrity sha512-s49kvIlQ4H5wvMD4yeHMMqnamPod06IUagMK6Ry0oTpUANSnyeNXxa3HkScl7DMJiS8IJeV21fSLAzlZYP2PDQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/menu@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/menu/-/menu-0.44.0.tgz#776ec8a04406266a0a0a13eb140b1fd691e442cb"
|
||||
integrity sha512-92XvAcv9rBW1jQ3UvwJ8zk9hbSRe/FqSuFdZ9fNPE348dCY2pbcdQfnUJTe3ycAN/I1c5frkrhx8F0II+nfbNQ==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/list" "^0.44.0"
|
||||
"@material/menu-surface" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
|
||||
"@material/notched-outline@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/notched-outline/-/notched-outline-0.44.0.tgz#d5a2e1d649921575a7cd2e88ee4581e4a1809573"
|
||||
integrity sha512-c3nqOqUQAmW3h4zBbZVbMRdf4nNTYm0tVwXIAwmcCs5nvAthEHnzHwwFddNP7/9Wju6LZ0uqWn6xlyKly0uipw==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/floating-label" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/radio@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/radio/-/radio-0.44.0.tgz#f4cacdfabc7d765aa000cb34c5a37966f6d4fd6d"
|
||||
integrity sha512-ar7uhlfHuSwM9JUUjpv7pLDLE0p436cCMxNTpmMjWabfvo3pMWlExvk72Oj81tBgfxY/uASLB3oj4neudXu9JQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/selection-control" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/ripple@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/ripple/-/ripple-0.44.0.tgz#98920ff8ec4bf5714c97df3d190f02f8a5b476cc"
|
||||
integrity sha512-MlaW4nUDgzS0JOBfsUawXyTOilr0jn+xvTVn6PEaGh2rmhNA54AhixXvdsVUWE9lfmHAsZV0AJHz2z7nunNhbQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/feature-targeting" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/rtl@^0.42.0":
|
||||
version "0.42.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/rtl/-/rtl-0.42.0.tgz#1836e78186c2d8b996f6fbf97adab203535335bc"
|
||||
integrity sha512-VrnrKJzhmspsN8WXHuxxBZ69yM5IwhCUqWr1t1eNfw3ZEvEj7i1g3P31HGowKThIN1dc1Wh4LE14rCISWCtv5w==
|
||||
|
||||
"@material/select@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/select/-/select-0.44.0.tgz#8041b4fe6247d013b0f12685fbdf50aa9ff57b35"
|
||||
integrity sha512-tw3/QIBLuRCT+5IXx4IPiJk7FzeGeR65JEizdRUItH8yzoIiQLs/b2i3KtHM2YBXHgeUcEBF2AOqPX2opdYhug==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/floating-label" "^0.44.0"
|
||||
"@material/line-ripple" "^0.43.0"
|
||||
"@material/menu" "^0.44.0"
|
||||
"@material/menu-surface" "^0.44.0"
|
||||
"@material/notched-outline" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/selection-control@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/selection-control/-/selection-control-0.44.0.tgz#63d5c65a47a9f54f5a0316b5ecdb5e5f35108609"
|
||||
integrity sha512-HgCAPnMVMEj4X4ILkFSifqtZ3Tcc5HkU+Lfk9g0807sCaN/qBKWkYKLH2WJUbW8uk+MXK7DgP1khtS5zzanJWA==
|
||||
dependencies:
|
||||
"@material/ripple" "^0.44.0"
|
||||
|
||||
"@material/shape@^0.43.0":
|
||||
version "0.43.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/shape/-/shape-0.43.0.tgz#b877acfd8be8abc9ddcf6601eb60dd0588292415"
|
||||
integrity sha512-KGnoQV4G2OQbMe5Lr5Xbk8XNlO93Qi/juxXtd2wrAfiaPmktD8ug0CwdVDOPBOmj9a0gX3Ofi9XWcoU+tLEVjg==
|
||||
|
||||
"@material/slider@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/slider/-/slider-0.44.0.tgz#2055df894eb725e541cde50a544719c07934755b"
|
||||
integrity sha512-Lnn2fdUesXX4O0UpJzveEuOj+og+dXCwhal73u3l3NXEdc/eRgYxwWdF3ww4MmCZ786EwUmjb4vIc9olN4DO3A==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/snackbar@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/snackbar/-/snackbar-0.44.0.tgz#d98672b849f5f295e4fac2d474a9c80f11945518"
|
||||
integrity sha512-KhCrmJm8Zu/ZZPuRCGfMKsZ0vudINlNgTjlOau0kQ/UgR1xBUvLOE8NjyXZr0RQz5obyW7xpyIWIpscn0IUeyw==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/button" "^0.44.0"
|
||||
"@material/dom" "^0.41.0"
|
||||
"@material/icon-button" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/switch@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/switch/-/switch-0.44.0.tgz#f2cbb447437b12eb3bc7f0ec8318dbd3b4f0afce"
|
||||
integrity sha512-EadCg6lHUF260R2Q/l++vXIITqacvbXlobSoewA5ib6y9BU2g7l13wL1W8xAVJNUMgFa/PyN+EKT3oCql7jZLg==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/selection-control" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/tab-bar@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/tab-bar/-/tab-bar-0.44.0.tgz#b17d791bd557b1d84892fef1a1d8b8d6fef7c6d6"
|
||||
integrity sha512-kCrt05d61YXyY43SNc0dPGuqysbcLr/KRDBvzpXgE4gv2jCCVhhjAH10KPlx8pthp/UtvrYJHb34acAKEGzdHA==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/tab" "^0.44.0"
|
||||
"@material/tab-scroller" "^0.44.0"
|
||||
|
||||
"@material/tab-indicator@^0.43.0":
|
||||
version "0.43.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/tab-indicator/-/tab-indicator-0.43.0.tgz#37fd05513ba55ae218d9068c986c2676096fd6eb"
|
||||
integrity sha512-RMNMQpWYghWpM6d0ayfuHEPzTiebKG0bMthViiD6tly8PubmOT8mShNhPm8ihybhDPUOLSz+7V4QNE5wikLEYg==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
|
||||
"@material/tab-scroller@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/tab-scroller/-/tab-scroller-0.44.0.tgz#82d092ed45d2ee9d82038bed318e6ff6bdc36dad"
|
||||
integrity sha512-Ufd3NWBN11kY2oA7bGmTYWGP1uz2mq0tfDM0JOiqoLMgD7y3Z18kmxnpq2qkg1vi4kvix28hBYGGMfLlq9rGDA==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/tab" "^0.44.0"
|
||||
|
||||
"@material/tab@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/tab/-/tab-0.44.0.tgz#254b92cff99015f0bd59a86d08d3f1c4744d0742"
|
||||
integrity sha512-czrbGjtKkmUS3iYBX523xT5GOkjP0h+0x9fTnw+heFNpw5dCn6cZvlj3D9ayZU+ZH93x68TFhFVBuLU5f0EBXw==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/tab-indicator" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/textfield@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/textfield/-/textfield-0.44.0.tgz#277b33948ddff33f7f643323895e5a683f013601"
|
||||
integrity sha512-IMBwMcE82eVU+Wifpu0t84tozvBPLCeqQELDtZNYujKg3RxaultzJLwIyGKPMZ9R4yPEpV2vgXPGKE+2/AWt0g==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/floating-label" "^0.44.0"
|
||||
"@material/line-ripple" "^0.43.0"
|
||||
"@material/notched-outline" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/theme@^0.43.0":
|
||||
version "0.43.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/theme/-/theme-0.43.0.tgz#6d9fa113c82e841817882172c152d60d2d203ca6"
|
||||
integrity sha512-/zndZL6EihI18v2mYd4O8xvOBAAXmLeHyHVK28LozSAaJ9okQgD25wq5Ktk95oMTmPIC+rH66KcK6371ivNk8g==
|
||||
|
||||
"@material/toolbar@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/toolbar/-/toolbar-0.44.0.tgz#6689aecdeccc78b7a890a3abbe8b68a2c6339307"
|
||||
integrity sha512-YgLlOFQ5VzFLQBpXYSMviEbYox0fia+sasHuYPUhTAtas1ExVt9EEiIolDSVvhv2PruTReKKefxSbXAqGlOHog==
|
||||
dependencies:
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/top-app-bar@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/top-app-bar/-/top-app-bar-0.44.0.tgz#2495c7f9567568fb961ccced24f479c4806a72af"
|
||||
integrity sha512-tf0yXQJARYs8UPaH8oo3LnsSHEiur7Zm8Fc3hv3F0gNRRaZYBjwsMQMVbZZaWoQCWskMALyntBg+Fo18zdgDxw==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
"@material/typography@^0.44.0":
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/@material/typography/-/typography-0.44.0.tgz#cf61dce2ee89bfa084d86e1b0f270a585bf9dfaf"
|
||||
integrity sha512-m4SjA9OjZRDKowN3cPzEa8e2GlTlEn3ZmW/Fy9eRNSp83iY+8a0xl6kCaF80v5qAVwVcpfEFyEHWxMJtkBw2uA==
|
||||
|
||||
"@types/prop-types@*":
|
||||
version "15.5.8"
|
||||
resolved "https://registry.yarnpkg.com/@types/prop-types/-/prop-types-15.5.8.tgz#8ae4e0ea205fe95c3901a5a1df7f66495e3a56ce"
|
||||
integrity sha512-3AQoUxQcQtLHsK25wtTWIoIpgYjH3vSDroZOUr7PpCHw/jLY1RB9z9E8dBT/OSmwStVgkRNvdh+ZHNiomRieaw==
|
||||
|
||||
"@types/react-dom@^16.8.0":
|
||||
version "16.8.0"
|
||||
resolved "https://registry.yarnpkg.com/@types/react-dom/-/react-dom-16.8.0.tgz#c565f43f9d2ec911f9e0b8f3b74e25e67879aa3f"
|
||||
integrity sha512-Jp4ufcEEjVJEB0OHq2MCZcE1u3KYUKO6WnSuiU/tZeYeiZxUoQavfa/TZeiIT+1XoN6l0lQVNM30VINZFDeolQ==
|
||||
dependencies:
|
||||
"@types/react" "*"
|
||||
|
||||
"@types/react@*", "@types/react@^16.8.2":
|
||||
version "16.8.2"
|
||||
resolved "https://registry.yarnpkg.com/@types/react/-/react-16.8.2.tgz#3b7a7f7ea89d1c7d68b00849fb5de839011c077b"
|
||||
integrity sha512-6mcKsqlqkN9xADrwiUz2gm9Wg4iGnlVGciwBRYFQSMWG6MQjhOZ/AVnxn+6v8nslFgfYTV8fNdE6XwKu6va5PA==
|
||||
dependencies:
|
||||
"@types/prop-types" "*"
|
||||
csstype "^2.2.0"
|
||||
|
||||
csstype@^2.2.0:
|
||||
version "2.6.2"
|
||||
resolved "https://registry.yarnpkg.com/csstype/-/csstype-2.6.2.tgz#3043d5e065454579afc7478a18de41909c8a2f01"
|
||||
integrity sha512-Rl7PvTae0pflc1YtxtKbiSqq20Ts6vpIYOD5WBafl4y123DyHUeLrRdQP66sQW8/6gmX8jrYJLXwNeMqYVJcow==
|
||||
|
||||
focus-trap@^4.0.2:
|
||||
version "4.0.2"
|
||||
resolved "https://registry.yarnpkg.com/focus-trap/-/focus-trap-4.0.2.tgz#4ee2b96547c9ea0e4252a2d4b2cca68944194663"
|
||||
integrity sha512-HtLjfAK7Hp2qbBtLS6wEznID1mPT+48ZnP2nkHzgjpL4kroYHg0CdqJ5cTXk+UO5znAxF5fRUkhdyfgrhh8Lzw==
|
||||
dependencies:
|
||||
tabbable "^3.1.2"
|
||||
xtend "^4.0.1"
|
||||
|
||||
"js-tokens@^3.0.0 || ^4.0.0":
|
||||
version "4.0.0"
|
||||
resolved "https://registry.yarnpkg.com/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499"
|
||||
integrity sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==
|
||||
|
||||
loose-envify@^1.1.0:
|
||||
version "1.4.0"
|
||||
resolved "https://registry.yarnpkg.com/loose-envify/-/loose-envify-1.4.0.tgz#71ee51fa7be4caec1a63839f7e682d8132d30caf"
|
||||
integrity sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==
|
||||
dependencies:
|
||||
js-tokens "^3.0.0 || ^4.0.0"
|
||||
|
||||
material-components-web@^0.44.0:
|
||||
version "0.44.0"
|
||||
resolved "https://registry.yarnpkg.com/material-components-web/-/material-components-web-0.44.0.tgz#ff782e8d7bdd8212d3c6022a731258d0d42da531"
|
||||
integrity sha512-BSRLf58SMVhAvlDhJDlcgYuvzeMwbMHKTJ7oIB8LaM24ZpXBxP9XCYJpKheMtiVLrgllCGDlJ/47OIDReHQXdQ==
|
||||
dependencies:
|
||||
"@material/animation" "^0.41.0"
|
||||
"@material/auto-init" "^0.41.0"
|
||||
"@material/base" "^0.41.0"
|
||||
"@material/button" "^0.44.0"
|
||||
"@material/card" "^0.44.0"
|
||||
"@material/checkbox" "^0.44.0"
|
||||
"@material/chips" "^0.44.0"
|
||||
"@material/dialog" "^0.44.0"
|
||||
"@material/dom" "^0.41.0"
|
||||
"@material/drawer" "^0.44.0"
|
||||
"@material/elevation" "^0.44.0"
|
||||
"@material/fab" "^0.44.0"
|
||||
"@material/feature-targeting" "^0.44.0"
|
||||
"@material/floating-label" "^0.44.0"
|
||||
"@material/form-field" "^0.44.0"
|
||||
"@material/grid-list" "^0.44.0"
|
||||
"@material/icon-button" "^0.44.0"
|
||||
"@material/icon-toggle" "^0.44.0"
|
||||
"@material/image-list" "^0.44.0"
|
||||
"@material/layout-grid" "^0.41.0"
|
||||
"@material/line-ripple" "^0.43.0"
|
||||
"@material/linear-progress" "^0.43.0"
|
||||
"@material/list" "^0.44.0"
|
||||
"@material/menu" "^0.44.0"
|
||||
"@material/menu-surface" "^0.44.0"
|
||||
"@material/notched-outline" "^0.44.0"
|
||||
"@material/radio" "^0.44.0"
|
||||
"@material/ripple" "^0.44.0"
|
||||
"@material/rtl" "^0.42.0"
|
||||
"@material/select" "^0.44.0"
|
||||
"@material/selection-control" "^0.44.0"
|
||||
"@material/shape" "^0.43.0"
|
||||
"@material/slider" "^0.44.0"
|
||||
"@material/snackbar" "^0.44.0"
|
||||
"@material/switch" "^0.44.0"
|
||||
"@material/tab" "^0.44.0"
|
||||
"@material/tab-bar" "^0.44.0"
|
||||
"@material/tab-indicator" "^0.43.0"
|
||||
"@material/tab-scroller" "^0.44.0"
|
||||
"@material/textfield" "^0.44.0"
|
||||
"@material/theme" "^0.43.0"
|
||||
"@material/toolbar" "^0.44.0"
|
||||
"@material/top-app-bar" "^0.44.0"
|
||||
"@material/typography" "^0.44.0"
|
||||
|
||||
object-assign@^4.1.1:
|
||||
version "4.1.1"
|
||||
resolved "https://registry.yarnpkg.com/object-assign/-/object-assign-4.1.1.tgz#2109adc7965887cfc05cbbd442cac8bfbb360863"
|
||||
integrity sha1-IQmtx5ZYh8/AXLvUQsrIv7s2CGM=
|
||||
|
||||
prop-types@^15.6.2:
|
||||
version "15.7.1"
|
||||
resolved "https://registry.yarnpkg.com/prop-types/-/prop-types-15.7.1.tgz#2fa61e0a699d428b40320127733ee2931f05d9d1"
|
||||
integrity sha512-f8Lku2z9kERjOCcnDOPm68EBJAO2K00Q5mSgPAUE/gJuBgsYLbVy6owSrtcHj90zt8PvW+z0qaIIgsIhHOa1Qw==
|
||||
dependencies:
|
||||
object-assign "^4.1.1"
|
||||
react-is "^16.8.1"
|
||||
|
||||
react-dom@^16.8.1:
|
||||
version "16.8.1"
|
||||
resolved "https://registry.yarnpkg.com/react-dom/-/react-dom-16.8.1.tgz#ec860f98853d09d39bafd3a6f1e12389d283dbb4"
|
||||
integrity sha512-N74IZUrPt6UiDjXaO7UbDDFXeUXnVhZzeRLy/6iqqN1ipfjrhR60Bp5NuBK+rv3GMdqdIuwIl22u1SYwf330bg==
|
||||
dependencies:
|
||||
loose-envify "^1.1.0"
|
||||
object-assign "^4.1.1"
|
||||
prop-types "^15.6.2"
|
||||
scheduler "^0.13.1"
|
||||
|
||||
react-is@^16.8.1:
|
||||
version "16.8.1"
|
||||
resolved "https://registry.yarnpkg.com/react-is/-/react-is-16.8.1.tgz#a80141e246eb894824fb4f2901c0c50ef31d4cdb"
|
||||
integrity sha512-ioMCzVDWvCvKD8eeT+iukyWrBGrA3DiFYkXfBsVYIRdaREZuBjENG+KjrikavCLasozqRWTwFUagU/O4vPpRMA==
|
||||
|
||||
react@^16.8.1:
|
||||
version "16.8.1"
|
||||
resolved "https://registry.yarnpkg.com/react/-/react-16.8.1.tgz#ae11831f6cb2a05d58603a976afc8a558e852c4a"
|
||||
integrity sha512-wLw5CFGPdo7p/AgteFz7GblI2JPOos0+biSoxf1FPsGxWQZdN/pj6oToJs1crn61DL3Ln7mN86uZ4j74p31ELQ==
|
||||
dependencies:
|
||||
loose-envify "^1.1.0"
|
||||
object-assign "^4.1.1"
|
||||
prop-types "^15.6.2"
|
||||
scheduler "^0.13.1"
|
||||
|
||||
scheduler@^0.13.1:
|
||||
version "0.13.1"
|
||||
resolved "https://registry.yarnpkg.com/scheduler/-/scheduler-0.13.1.tgz#1a217df1bfaabaf4f1b92a9127d5d732d85a9591"
|
||||
integrity sha512-VJKOkiKIN2/6NOoexuypwSrybx13MY7NSy9RNt8wPvZDMRT1CW6qlpF5jXRToXNHz3uWzbm2elNpZfXfGPqP9A==
|
||||
dependencies:
|
||||
loose-envify "^1.1.0"
|
||||
object-assign "^4.1.1"
|
||||
|
||||
tabbable@^3.1.2:
|
||||
version "3.1.2"
|
||||
resolved "https://registry.yarnpkg.com/tabbable/-/tabbable-3.1.2.tgz#f2d16cccd01f400e38635c7181adfe0ad965a4a2"
|
||||
integrity sha512-wjB6puVXTYO0BSFtCmWQubA/KIn7Xvajw0x0l6eJUudMG/EAiJvIUnyNX6xO4NpGrJ16lbD0eUseB9WxW0vlpQ==
|
||||
|
||||
xtend@^4.0.1:
|
||||
version "4.0.1"
|
||||
resolved "https://registry.yarnpkg.com/xtend/-/xtend-4.0.1.tgz#a5c6d532be656e23db820efb943a1f04998d63af"
|
||||
integrity sha1-pcbVMr5lbiPbgg77lDofBJmNY68=
|
||||
@@ -1,4 +0,0 @@
|
||||
{
|
||||
"name": "@coder/disposable",
|
||||
"main": "src/index.ts"
|
||||
}
|
||||
@@ -1,3 +0,0 @@
|
||||
export interface IDisposable {
|
||||
dispose(): void;
|
||||
}
|
||||
@@ -1 +0,0 @@
|
||||
export * from "./disposable";
|
||||
@@ -1,4 +0,0 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
@@ -1,18 +0,0 @@
|
||||
# This file specifies files that are *not* uploaded to Google Cloud Platform
|
||||
# using gcloud. It follows the same syntax as .gitignore, with the addition of
|
||||
# "#!include" directives (which insert the entries of the given .gitignore-style
|
||||
# file at that point).
|
||||
#
|
||||
# For more information, run:
|
||||
# $ gcloud topic gcloudignore
|
||||
#
|
||||
.gcloudignore
|
||||
# If you would like to upload your .git directory, .gitignore file or files
|
||||
# from your .gitignore file, remove the corresponding line
|
||||
# below:
|
||||
.git
|
||||
.gitignore
|
||||
src
|
||||
|
||||
# Node.js dependencies:
|
||||
node_modules/
|
||||
@@ -1,8 +0,0 @@
|
||||
FROM node
|
||||
|
||||
COPY out/main.js /main.js
|
||||
COPY package.json /package.json
|
||||
RUN yarn
|
||||
ENV NODE_ENV production
|
||||
|
||||
CMD ["node", "/main.js"]
|
||||