Compare commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
6e39f74f2c | ||
|
|
9a64c2cb63 | ||
|
|
dc2ac0b78b | ||
|
|
e969832946 | ||
|
|
95a9531ec1 | ||
|
|
7637a2de19 | ||
|
|
a589be2826 | ||
|
|
b53096f4a2 | ||
|
|
687d8277e7 | ||
|
|
4c0cf27cfc | ||
|
|
149527ddb8 | ||
|
|
c4b707e9ca | ||
|
|
9d35d59fb3 | ||
|
|
877b37d3cc | ||
|
|
f14f55c951 | ||
|
|
8a16a551e0 | ||
|
|
2a5239578a | ||
|
|
d28eb696ec | ||
|
|
4c0c2559c3 | ||
|
|
ee0a3deb6a | ||
|
|
076f051bb5 | ||
|
|
658c57546c | ||
|
|
223a650e3e | ||
|
|
4b6316e510 | ||
|
|
41546230dc | ||
|
|
8413c0f94b | ||
|
|
8828b47cea | ||
|
|
b0f300e61b | ||
|
|
3ad83dd70e | ||
|
|
496b53d84d | ||
|
|
e9c547c1c6 | ||
|
|
0307e2c586 | ||
|
|
e29c2360e7 | ||
|
|
2b38b65392 | ||
|
|
baf12e7aa4 | ||
|
|
064efd6876 | ||
|
|
f615ac58b3 | ||
|
|
2af170dbc9 | ||
|
|
39ad2cf3fe | ||
|
|
21387ecdae | ||
|
|
78fbae3293 | ||
|
|
a8ead811bf | ||
|
|
9696dd0c2b | ||
|
|
5e9ffb4c56 | ||
|
|
e9587cf68f | ||
|
|
1771825e81 | ||
|
|
e5b838a01b | ||
|
|
cd23a21bbf | ||
|
|
42946d72ba | ||
|
|
2c836ede76 | ||
|
|
26d29abef1 | ||
|
|
14d0f14c82 | ||
|
|
a260f7d288 | ||
|
|
16772e8d8b | ||
|
|
e3e11b1a90 | ||
|
|
8576581574 | ||
|
|
2042bb8502 | ||
|
|
18cd9b137f | ||
|
|
1495e7134f | ||
|
|
a7a941ce78 | ||
|
|
1c98c52535 | ||
|
|
9a3d1c6de1 | ||
|
|
a8d43eb2ec | ||
|
|
d81b25c3bf | ||
|
|
c95ec71e09 | ||
|
|
6188f764d1 | ||
|
|
dc9084b5ad | ||
|
|
330e91ef08 | ||
|
|
9caff8d778 | ||
|
|
6f6ce33588 | ||
|
|
8101132352 | ||
|
|
96a3be3ca8 | ||
|
|
75e5cc19e0 | ||
|
|
0692d486f4 | ||
|
|
cfc1071c73 | ||
|
|
6bcd4f0551 | ||
|
|
71f50b841f | ||
|
|
d70f2a462c | ||
|
|
dce403afd9 | ||
|
|
ef4a3fd933 | ||
|
|
c21f32d012 | ||
|
|
66780c03d4 | ||
|
|
6b53ab4b61 | ||
|
|
334ca07eae | ||
|
|
7e01dc1358 | ||
|
|
84f14cab58 | ||
|
|
85992928a7 | ||
|
|
582a027df1 | ||
|
|
db71de2858 | ||
|
|
c1446d6385 | ||
|
|
0151805864 | ||
|
|
408d0995dd | ||
|
|
6a232765f4 | ||
|
|
f516346e09 | ||
|
|
c207edd49c | ||
|
|
828603cfab | ||
|
|
d7cebc312e | ||
|
|
5badbd3a6f | ||
|
|
a1e85a4eb5 | ||
|
|
0433fb8a4b | ||
|
|
9e206415b8 | ||
|
|
ffc61258f9 | ||
|
|
a095c100ce | ||
|
|
3c790ffbc5 | ||
|
|
04c1782f2f | ||
|
|
1efd52af30 | ||
|
|
cc78831262 | ||
|
|
a7b98de833 | ||
|
|
2c11eae732 | ||
|
|
bb7393b1cb | ||
|
|
23e3905529 | ||
|
|
2774a27500 | ||
|
|
763d2e773a | ||
|
|
38d340d176 | ||
|
|
baf5cf45c3 | ||
|
|
ff9a3a1067 | ||
|
|
7541cf2fd7 | ||
|
|
e882f4a46a | ||
|
|
33a5457407 | ||
|
|
112cfbeac8 | ||
|
|
d1b01c58f8 | ||
|
|
9912e7b331 | ||
|
|
c7a1e0aea3 | ||
|
|
5bfb130f03 | ||
|
|
0521378e70 | ||
|
|
ad08a2e15b | ||
|
|
a61fff6a93 | ||
|
|
cd5438c2c5 | ||
|
|
ef67b42fbd | ||
|
|
601efc3745 | ||
|
|
62656b8375 | ||
|
|
af4208dad0 | ||
|
|
db925ad65d | ||
|
|
ce095b3593 | ||
|
|
5230e5aad0 | ||
|
|
d44f7818c4 | ||
|
|
f824083324 | ||
|
|
82598e94a9 | ||
|
|
b579649a39 | ||
|
|
fb2e96e1b0 | ||
|
|
d5a2fed679 | ||
|
|
318f3dc378 | ||
|
|
18c9eb1960 | ||
|
|
da22b0308e | ||
|
|
3e998387fe | ||
|
|
5018a07f3c | ||
|
|
b74ec267e2 | ||
|
|
d12b825ed4 | ||
|
|
9f9bb3c11c | ||
|
|
9824230caf | ||
|
|
94ca05c8d6 | ||
|
|
569e854a03 | ||
|
|
f0fd3683d5 | ||
|
|
80c57221ef | ||
|
|
6bb2210a91 | ||
|
|
1978399259 | ||
|
|
bc7288a389 | ||
|
|
e826f6b69f | ||
|
|
0d67393072 | ||
|
|
65899a9b50 | ||
|
|
d7364faeee | ||
|
|
ae2622e5ce | ||
|
|
904ddbc884 | ||
|
|
92c21a6950 | ||
|
|
780f9a31ff | ||
|
|
9aba07f8f8 | ||
|
|
db621d7294 | ||
|
|
9c66ad1139 | ||
|
|
8d23cbc051 | ||
|
|
9e1d5ba7db | ||
|
|
41e8ae3959 | ||
|
|
7fab293cd6 | ||
|
|
b3f3cf1216 | ||
|
|
77885ed63d | ||
|
|
3d9b1073d0 | ||
|
|
aca9c89ece | ||
|
|
3948482dc7 | ||
|
|
6684c406e8 | ||
|
|
952ac61761 | ||
|
|
a1b438cea6 | ||
|
|
932b65ef67 | ||
|
|
f701d073d1 | ||
|
|
9c74c81608 | ||
|
|
687126970d | ||
|
|
39bd429835 | ||
|
|
8faf097e83 | ||
|
|
d3298935b7 | ||
|
|
f9cf9b9782 | ||
|
|
a5fc111d62 | ||
|
|
5623ba6b63 | ||
|
|
3d9668f8fa | ||
|
|
621c702ff8 | ||
|
|
9186c724c4 | ||
|
|
f764c0ac91 | ||
|
|
f56675f7e5 | ||
|
|
aa94fd6cfe | ||
|
|
e011513b15 | ||
|
|
5c10617981 | ||
|
|
c7f5ec4064 | ||
|
|
7642f55a1c | ||
|
|
3d9d526977 | ||
|
|
4e9233d150 | ||
|
|
ac79c18090 | ||
|
|
08221f17d6 | ||
|
|
d910cfd696 | ||
|
|
0bf10e525e | ||
|
|
7cc921693a | ||
|
|
ee3901f5da | ||
|
|
8bd4e10643 | ||
|
|
44f9fa39ae | ||
|
|
fd0bb58379 | ||
|
|
13d078ecc7 | ||
|
|
9a9ccbe29c | ||
|
|
7ebbb86b50 | ||
|
|
6b54599ca7 | ||
|
|
1f60a244c2 | ||
|
|
54789266b6 | ||
|
|
2d8c6be264 | ||
|
|
1b48cd04b8 | ||
|
|
b307adb081 | ||
|
|
a07d97a9d3 | ||
|
|
4914c4322c | ||
|
|
f186475ec9 | ||
|
|
be84a02c8d | ||
|
|
fcad91a682 | ||
|
|
ad38b1a166 | ||
|
|
c6a50d5a1a | ||
|
|
dd54ef13bc | ||
|
|
c2aee5b6c1 | ||
|
|
abe0640331 | ||
|
|
cb3bd463a5 | ||
|
|
56ec86242a | ||
|
|
2a6cd8230c | ||
|
|
b192ba2304 | ||
|
|
bf41eb4204 | ||
|
|
8a2a7ac6db | ||
|
|
93adffa819 | ||
|
|
144bdb5dd0 | ||
|
|
aee936264b | ||
|
|
866bc9eb90 | ||
|
|
a7952ff36c | ||
|
|
9712057b91 | ||
|
|
9d8bba7a18 | ||
|
|
060ce7ad28 | ||
|
|
180fd3c9ac | ||
|
|
bd700fe515 | ||
|
|
b6b19babc1 | ||
|
|
618954b5d6 | ||
|
|
03c2b2f68e | ||
|
|
ae8f2dd61a | ||
|
|
460a1370d7 | ||
|
|
68e0eb714d | ||
|
|
10b97f4856 | ||
|
|
26c73b8ead | ||
|
|
e267f05141 | ||
|
|
9c7e2ea98e | ||
|
|
9141b525a6 | ||
|
|
90ff6f3d06 | ||
|
|
9187cd3d0a | ||
|
|
d0d759155b | ||
|
|
618e47204d | ||
|
|
e9fd5c70ba | ||
|
|
cbcd195cad | ||
|
|
55303647c1 | ||
|
|
f3bfe80995 | ||
|
|
90a1da28bd | ||
|
|
73ee951807 | ||
|
|
0f373512d2 | ||
|
|
721d483cc3 | ||
|
|
2da5eca384 | ||
|
|
a644b5d068 | ||
|
|
d532a15bf2 | ||
|
|
31e0af745d | ||
|
|
444c07fd81 | ||
|
|
f155d67c45 | ||
|
|
59a8f0cf8e | ||
|
|
1096b7f17f | ||
|
|
d6f7133fa6 | ||
|
|
55c627572c | ||
|
|
2b8ccb5e51 | ||
|
|
d1d25a5bf7 | ||
|
|
ade5591d60 | ||
|
|
eca0800b9d | ||
|
|
884141cd8f | ||
|
|
c7f80986c8 | ||
|
|
9b26bb4436 | ||
|
|
75bf192af5 | ||
|
|
416f12fcc3 | ||
|
|
c2b90c6dae | ||
|
|
8b83f44a46 | ||
|
|
522b39be86 | ||
|
|
1b0078ad20 | ||
|
|
345b6906f9 | ||
|
|
c3c787eaa7 | ||
|
|
1dada9f256 | ||
|
|
d904f2fce5 | ||
|
|
27195b003a | ||
|
|
b401865957 | ||
|
|
381200bce1 | ||
|
|
c33ed46161 | ||
|
|
86c875f7e9 | ||
|
|
99db197472 | ||
|
|
4789c24e1e | ||
|
|
c30bffc60c | ||
|
|
190e1f014e | ||
|
|
995ccc72f8 | ||
|
|
5eb592f8c0 | ||
|
|
cb9b96dbbb | ||
|
|
6382067e5b | ||
|
|
844315f05a | ||
|
|
c5d352bbe1 | ||
|
|
aa6907335a | ||
|
|
d5921cd21b | ||
|
|
f341d0a3e9 | ||
|
|
ab8453c773 | ||
|
|
2fc8acf81e | ||
|
|
89e315ab2b | ||
|
|
faed3e7c80 | ||
|
|
215315b377 | ||
|
|
b6a9c24c7d | ||
|
|
ff01995691 | ||
|
|
62c5747e3f | ||
|
|
c337fa8dc5 | ||
|
|
1911d19cf8 | ||
|
|
4d45215622 | ||
|
|
804a2b7693 | ||
|
|
992fa015a4 | ||
|
|
208d6e96f8 | ||
|
|
93bf18c5b0 | ||
|
|
057abba08b | ||
|
|
40c5fbf0cb | ||
|
|
24813f56ed | ||
|
|
6135757349 | ||
|
|
c9baa366ab | ||
|
|
be49bb6263 | ||
|
|
9c3694af5a | ||
|
|
ba3ba899a5 | ||
|
|
1f11c7e46c | ||
|
|
5b5e262dff | ||
|
|
a7b248ea9b | ||
|
|
039cd02482 | ||
|
|
7b3927a810 | ||
|
|
4a9e52ee44 | ||
|
|
8f8c94a734 | ||
|
|
7b2e8a6ce1 | ||
|
|
8927d5c50f | ||
|
|
132553f521 | ||
|
|
795839cbe1 | ||
|
|
a1b2a1c5ee | ||
|
|
cae6fa0561 | ||
|
|
224409d7d6 | ||
|
|
f0d2cb8d05 | ||
|
|
aee480afd3 | ||
|
|
fbd430af6e | ||
|
|
a884f91b22 | ||
|
|
46a3676634 | ||
|
|
46a1221fc6 | ||
|
|
b6ea2c4a99 | ||
|
|
d0782ad6b1 | ||
|
|
11a909453f | ||
|
|
fec21b6e8e | ||
|
|
11b9eb4a1c | ||
|
|
2b735a0159 | ||
|
|
135c038167 | ||
|
|
7489ddc4f7 | ||
|
|
a9fd92eba6 | ||
|
|
bc5074116e | ||
|
|
b9fbbfbb8e | ||
|
|
26c072f45c | ||
|
|
b7988bf00a | ||
|
|
cca051041f | ||
|
|
3c84cfe610 | ||
|
|
e2c5d91a2d | ||
|
|
7970eb3b3b | ||
|
|
f44d68ef4a | ||
|
|
54a20c511b | ||
|
|
147b542c9d | ||
|
|
0f37152a9b | ||
|
|
efd4c5b340 | ||
|
|
580bb082b5 | ||
|
|
779ec7fad8 | ||
|
|
89f3353a83 | ||
|
|
ab2cb9a809 | ||
|
|
c9ad9cbf0e | ||
|
|
6047093325 | ||
|
|
713f765731 | ||
|
|
4295dfaf20 | ||
|
|
57bac91904 | ||
|
|
958ae9b0ce | ||
|
|
50032e2820 | ||
|
|
daa2440a40 | ||
|
|
645b698f37 | ||
|
|
4b6c8f1fe4 | ||
|
|
9a7941c004 | ||
|
|
f77a763858 | ||
|
|
2b716cd436 | ||
|
|
a3024a98fe | ||
|
|
12e5841959 | ||
|
|
599cbc49f7 | ||
|
|
c73793fa11 | ||
|
|
dd106ae9b8 | ||
|
|
baa4e1b0e8 | ||
|
|
f02d68b36d | ||
|
|
80d2ee78e7 | ||
|
|
d52f09de3c | ||
|
|
3c017f2291 | ||
|
|
9b1396fb32 | ||
|
|
2edc65baaa | ||
|
|
6ed1f42fbe | ||
|
|
826c057047 | ||
|
|
1709d44697 | ||
|
|
d77b41ed25 | ||
|
|
0e77f839ff | ||
|
|
487278ac79 | ||
|
|
499afa1e30 | ||
|
|
af8a663f70 | ||
|
|
6be1c3fdf2 | ||
|
|
f1bb8f48c5 | ||
|
|
7938dfcc17 | ||
|
|
ce3e0852d8 | ||
|
|
ca269907dc | ||
|
|
bca4e717b8 | ||
|
|
cbb3472780 | ||
|
|
b0c55d1bbf | ||
|
|
f1e0737c5e | ||
|
|
650ecb0640 | ||
|
|
75491f4152 | ||
|
|
770c17318e | ||
|
|
c52b4c3ed5 | ||
|
|
a7df139c46 | ||
|
|
bada1d28d6 | ||
|
|
e4bbbcf1fb | ||
|
|
292042e813 | ||
|
|
3cedfbe9bf | ||
|
|
0d799ba69b | ||
|
|
7b66da2706 | ||
|
|
6b4bf428de | ||
|
|
a4a7ce843c | ||
|
|
73fe7015b7 | ||
|
|
ef1152a8fb | ||
|
|
71dddbc8b9 | ||
|
|
45fd3c900f | ||
|
|
69c4966804 | ||
|
|
3af11c2b1f | ||
|
|
dc541d5495 | ||
|
|
5c8a9084e3 | ||
|
|
24b04e9243 | ||
|
|
0562f32af6 | ||
|
|
21d7f784d1 | ||
|
|
16db227119 | ||
|
|
9ebfb11ac8 | ||
|
|
98b0e16984 | ||
|
|
87169ee3ac | ||
|
|
47a46870b6 | ||
|
|
8458bb4c4f | ||
|
|
5238461f3f | ||
|
|
1f7db053cd | ||
|
|
8a9cb37273 | ||
|
|
d2b8e6c125 | ||
|
|
e845abc784 | ||
|
|
70dd76f954 | ||
|
|
887e5a6cba | ||
|
|
acc0a2ef78 | ||
|
|
6ac75d88c4 | ||
|
|
00514d41b6 | ||
|
|
52e8a75e9f | ||
|
|
ce9e92f8e5 | ||
|
|
a709187007 | ||
|
|
fad97bc4d5 | ||
|
|
94648eb4e9 | ||
|
|
805cabafe8 | ||
|
|
9ba6c00a19 | ||
|
|
78297e52aa | ||
|
|
431045619e | ||
|
|
55e34cb174 | ||
|
|
cdb45c743f | ||
|
|
9886d60be0 | ||
|
|
53bc9f8442 | ||
|
|
4c90009a0e | ||
|
|
bee4fd0914 | ||
|
|
f8ae7edaa0 | ||
|
|
9ec9dca5f8 | ||
|
|
a4f1299f42 | ||
|
|
7b76ca7e49 | ||
|
|
18147b2134 | ||
|
|
c78af2b448 | ||
|
|
e2dc01cf6e | ||
|
|
14fbdd3e9c | ||
|
|
3e5d0015af | ||
|
|
b4c1007075 | ||
|
|
e0533db4d9 | ||
|
|
4071f41f52 | ||
|
|
37efeeb044 | ||
|
|
47409f39f6 | ||
|
|
b40e58bc77 | ||
|
|
b7b9d27627 | ||
|
|
6b3d485d77 | ||
|
|
48c6e96a78 | ||
|
|
44feecfc9a | ||
|
|
df559e3444 | ||
|
|
33a7a9b6a2 | ||
|
|
0658719d23 | ||
|
|
c32313a471 | ||
|
|
553b9f261a | ||
|
|
fe22671a6e | ||
|
|
1da0db435f | ||
|
|
17fd7389c4 | ||
|
|
9da5f1401f | ||
|
|
da3aad4497 | ||
|
|
9a512d1abd | ||
|
|
6ca8dc54ad | ||
|
|
cff944fe8a | ||
|
|
72dea6279e | ||
|
|
37ecb9a6b5 | ||
|
|
fb867a914a | ||
|
|
8ef3c10844 | ||
|
|
10fe249877 | ||
|
|
5143f904ee | ||
|
|
768452a519 | ||
|
|
547bda6e4f | ||
|
|
88bfc4ad9c | ||
|
|
9107ee905a | ||
|
|
b5ca41d658 | ||
|
|
6a281bd90e | ||
|
|
1c4e0111cb | ||
|
|
8d1771ef64 | ||
|
|
fb54bb0b6c | ||
|
|
546bcb5133 | ||
|
|
b1a72b2e83 | ||
|
|
dce6e31c89 | ||
|
|
cddc888065 | ||
|
|
06aa2c86df | ||
|
|
c51a0b7454 | ||
|
|
cae42772e8 | ||
|
|
09a0dd658d | ||
|
|
bbd1a1dbe2 | ||
|
|
f1e563ad5f | ||
|
|
8e015ebf87 | ||
|
|
3c88c767cd | ||
|
|
d83f442cff | ||
|
|
67e8e60a69 | ||
|
|
d5827ec77d | ||
|
|
c0044dc4a5 | ||
|
|
8696cf8789 | ||
|
|
693ec1b2bc | ||
|
|
330d7b3100 | ||
|
|
d8f96ab9c7 | ||
|
|
072cd029e4 | ||
|
|
46baff8459 | ||
|
|
8d6fff7000 | ||
|
|
f84fff5f87 | ||
|
|
1a67241f67 | ||
|
|
7f7de14e6f | ||
|
|
815758529d | ||
|
|
99df13b085 | ||
|
|
f03d870bcd | ||
|
|
856666d5bd | ||
|
|
819254e540 | ||
|
|
f486989697 | ||
|
|
9e98b631da | ||
|
|
b0667aacca | ||
|
|
750f3179de | ||
|
|
b1d9b4751d | ||
|
|
1940bbec75 | ||
|
|
7b7fb73611 | ||
|
|
b97baa7ff1 | ||
|
|
a7bf3b22c1 | ||
|
|
442c1583e7 | ||
|
|
217acef6b2 | ||
|
|
0eed746638 | ||
|
|
1b4f0606ca | ||
|
|
3c4d567be9 | ||
|
|
82d50a4f89 | ||
|
|
379c382fe7 | ||
|
|
559026bbf3 | ||
|
|
08e67a3a0b | ||
|
|
1a82e0d421 | ||
|
|
2e03680128 | ||
|
|
94a9ce8566 | ||
|
|
6e351dd4ac | ||
|
|
53604e427b | ||
|
|
1b52c97fd0 | ||
|
|
dbcb43f1d3 | ||
|
|
d7c8d063b6 | ||
|
|
de41c9f306 | ||
|
|
8733d2cfa2 | ||
|
|
b3737d6ff0 | ||
|
|
56a6a010ab | ||
|
|
341d9f0597 | ||
|
|
a4505ed724 | ||
|
|
b843e0fc8e | ||
|
|
c0fac5e5f1 | ||
|
|
78a945ae9e | ||
|
|
9b62849bb8 | ||
|
|
66b426311e | ||
|
|
7bee001868 | ||
|
|
22f1ce4a11 | ||
|
|
805823df7a | ||
|
|
7c5ad6b7a9 | ||
|
|
0904078bf4 | ||
|
|
9f995c6ff8 | ||
|
|
427b4f6c6d | ||
|
|
81a4d860c5 | ||
|
|
7ac95fab28 | ||
|
|
1f15c47a43 | ||
|
|
88ba66d00b | ||
|
|
2592e1e84d | ||
|
|
97750f672f | ||
|
|
54608bf38d | ||
|
|
b4226bc0f5 | ||
|
|
1943636f02 | ||
|
|
d218bff2c4 | ||
|
|
26dc69446e | ||
|
|
fb2c39cb57 | ||
|
|
b595940bcf | ||
|
|
a0da287b9c | ||
|
|
49eab6b1d9 | ||
|
|
2861a4dd39 | ||
|
|
b4fa7c6c06 | ||
|
|
5c1d9b28cd | ||
|
|
0aeeebdd64 | ||
|
|
bdcba308df | ||
|
|
aed94e5317 | ||
|
|
a4e6713823 | ||
|
|
58bb7fc73e | ||
|
|
b16724f06a | ||
|
|
5630239a6d | ||
|
|
13be985b36 | ||
|
|
a5646a58d5 | ||
|
|
b0407e20cf | ||
|
|
8a1790d6d5 | ||
|
|
86074c9210 | ||
|
|
2f074b87f3 | ||
|
|
6214f4c2e6 | ||
|
|
390e4f30c8 | ||
|
|
4036ab7055 | ||
|
|
139bf361b4 | ||
|
|
c9f15454e4 | ||
|
|
b6a09d67e2 | ||
|
|
1770bb1b65 | ||
|
|
52549f0a7a | ||
|
|
0d7cc9e9fd | ||
|
|
e8da73799f | ||
|
|
588da4f3b8 | ||
|
|
4beb7d0595 | ||
|
|
4c275a287f | ||
|
|
5ed2b013d5 | ||
|
|
19bdcab93e | ||
|
|
45e7efce67 | ||
|
|
fbc51ae691 | ||
|
|
92eb78230b | ||
|
|
31925596f1 | ||
|
|
88b0b4a5c7 | ||
|
|
c8b2783b85 | ||
|
|
2744549c0f | ||
|
|
1c522e16a4 | ||
|
|
4b2e52f13c | ||
|
|
bbbde9261f | ||
|
|
eac8124320 | ||
|
|
64534e1b7a | ||
|
|
71ec216161 | ||
|
|
2df591c5f7 | ||
|
|
d95f0177c8 | ||
|
|
b4b128709f | ||
|
|
0fd04aa76d | ||
|
|
4abb4c674f | ||
|
|
485fb455d6 | ||
|
|
765a8b21a3 | ||
|
|
dcc940c32e | ||
|
|
059acb2da6 | ||
|
|
a1f87809b2 | ||
|
|
2fb9702a3a | ||
|
|
5196ac5c8f | ||
|
|
9db2178d05 | ||
|
|
8c6d16486d | ||
|
|
cef869a206 | ||
|
|
efbcd41fab | ||
|
|
bb9728ccd1 | ||
|
|
905285efda | ||
|
|
e1d19e00a5 | ||
|
|
add7f8133e | ||
|
|
33100818d7 | ||
|
|
974b275f6e | ||
|
|
ea2d775595 | ||
|
|
f741d42165 | ||
|
|
6945e881a8 | ||
|
|
804ff187fa | ||
|
|
de1304d19e | ||
|
|
96fcfbded1 | ||
|
|
9fff1e6e44 | ||
|
|
0d0166b4bc | ||
|
|
6c5fb36c36 | ||
|
|
1c880f5199 | ||
|
|
4681b319ca | ||
|
|
78a6aac409 | ||
|
|
20a26a6589 | ||
|
|
a4e09d0ad8 | ||
|
|
dfd5385602 | ||
|
|
7dab4601d2 | ||
|
|
81e0718a74 | ||
|
|
6e12d94f11 | ||
|
|
92535e539f | ||
|
|
4cc51ca08f | ||
|
|
63790f8854 | ||
|
|
45605db3c5 | ||
|
|
c80453f602 | ||
|
|
eb4277e7bd | ||
|
|
4245283e05 | ||
|
|
41c62288f0 | ||
|
|
c3aa63cffa | ||
|
|
1b940de0bf | ||
|
|
023c778c4d | ||
|
|
6b5fc260ca | ||
|
|
d3e075f37b | ||
|
|
194b810ad5 | ||
|
|
2a8ddcd508 | ||
|
|
7cbaacde40 | ||
|
|
34017f32fb | ||
|
|
57e2adc042 | ||
|
|
e9390d0d91 | ||
|
|
f6c4aee928 | ||
|
|
a673b110f5 | ||
|
|
cfde4d634f | ||
|
|
4e4110aeb4 | ||
|
|
4149aa0945 | ||
|
|
810cc1d47e | ||
|
|
c08062420f | ||
|
|
bde7bdc11d | ||
|
|
d245e90185 | ||
|
|
092aeaeb6f | ||
|
|
b22762b472 | ||
|
|
db5bfc7525 | ||
|
|
a3e933d98b | ||
|
|
543b82567f | ||
|
|
cfc94b332a | ||
|
|
f391cf6d43 | ||
|
|
da2687174f | ||
|
|
a8ef1d49a1 | ||
|
|
feb75a7f4d | ||
|
|
27fd011e35 | ||
|
|
03f1336042 | ||
|
|
fbf7d7adb5 | ||
|
|
da041f43ee | ||
|
|
a6f57262f6 | ||
|
|
aa5ec44c27 | ||
|
|
446549a043 | ||
|
|
ef21ed901f | ||
|
|
aaadefa548 | ||
|
|
0e66d608a1 | ||
|
|
1618092b91 | ||
|
|
2f9439b690 | ||
|
|
66c8e33b47 | ||
|
|
9048ded5eb | ||
|
|
17575e1d7b | ||
|
|
49dc046b9f | ||
|
|
27d89c2311 | ||
|
|
871400f407 | ||
|
|
a1229c78a2 | ||
|
|
457060f89d | ||
|
|
cc14bc4515 | ||
|
|
bdb25c2dbe | ||
|
|
32c616512d | ||
|
|
16bd8de78e | ||
|
|
3ad0ef1ac4 | ||
|
|
cb8917557d | ||
|
|
8183d1d221 | ||
|
|
9ab0cd648e | ||
|
|
249e1152f4 | ||
|
|
d41b747aa1 | ||
|
|
f69fcb971c | ||
|
|
bfa6f656ef | ||
|
|
24b932d67a | ||
|
|
9e536ca9c3 | ||
|
|
17c4d097bb | ||
|
|
1b5756c1b1 | ||
|
|
a003034b02 | ||
|
|
bddff604c2 | ||
|
|
b2c123e0e2 | ||
|
|
be82ffc01d | ||
|
|
efcca3fb3e | ||
|
|
b91de01a4d | ||
|
|
6b1c1e0751 | ||
|
|
8985326dd8 | ||
|
|
c609f5cca0 | ||
|
|
3b15fb6211 | ||
|
|
a7eb112d36 | ||
|
|
cc43fe5191 | ||
|
|
cfced0caf1 | ||
|
|
fc18e6e774 | ||
|
|
1d57ac5c63 | ||
|
|
b55d699451 | ||
|
|
4241704261 | ||
|
|
b50d21434e | ||
|
|
c3fd1c2c40 | ||
|
|
fe4528c9be | ||
|
|
b0868967cb | ||
|
|
1aac37e14f | ||
|
|
851c2e39af | ||
|
|
d2387342ce | ||
|
|
1792eaf05f | ||
|
|
36bf3ebff3 | ||
|
|
681ba4887f | ||
|
|
b7f28c56a9 | ||
|
|
575cd8d28b | ||
|
|
3d440e21bd | ||
|
|
a10113543b | ||
|
|
50369713de | ||
|
|
2f2154c13b | ||
|
|
056206d7a4 | ||
|
|
57ab29bb85 | ||
|
|
4e69307074 | ||
|
|
608a5e2329 | ||
|
|
5126481de2 | ||
|
|
fa168bd4c0 | ||
|
|
f159a862e4 | ||
|
|
9f5ff468e1 | ||
|
|
65e07dcebc | ||
|
|
cc83b9a4ca | ||
|
|
14872e091e | ||
|
|
3d3f58b6ff | ||
|
|
b99158f8f0 | ||
|
|
2d74505208 | ||
|
|
534b03b99f | ||
|
|
4af4d8dcc6 | ||
|
|
298c5b2041 | ||
|
|
328e97336b | ||
|
|
2e10a7f097 | ||
|
|
1798cab222 | ||
|
|
ebd27de4e1 | ||
|
|
beeff131a9 | ||
|
|
408240dd97 | ||
|
|
71eb897708 | ||
|
|
02aadf7c3e | ||
|
|
98e8c6ac73 | ||
|
|
34933d2c76 | ||
|
|
a0c34b19df | ||
|
|
48ba5e5856 | ||
|
|
47183b2939 | ||
|
|
9b9062aea4 | ||
|
|
cdf02d54da | ||
|
|
413e884efb | ||
|
|
070d194c6c | ||
|
|
e54755b074 | ||
|
|
db608e33fb | ||
|
|
b543842fc0 | ||
|
|
97be015234 | ||
|
|
a656409bb5 | ||
|
|
ea45b04105 | ||
|
|
66a6ecea14 | ||
|
|
f23af3661b | ||
|
|
2f233f2389 | ||
|
|
393a8b3a86 | ||
|
|
c64115e0a0 | ||
|
|
427c472f6f | ||
|
|
c1882eb1ff | ||
|
|
9963c58511 | ||
|
|
930e5c4280 | ||
|
|
630d213bd0 | ||
|
|
82b6dd1ac8 | ||
|
|
ceef536b79 | ||
|
|
7fa56fde0b | ||
|
|
44e19775f5 | ||
|
|
42d6c2bd6b | ||
|
|
810e62665f | ||
|
|
bec1642123 | ||
|
|
08f7b4c53c | ||
|
|
d15abd7f28 | ||
|
|
dc6dd6d2a8 | ||
|
|
f4881872f7 | ||
|
|
f1f0191d98 | ||
|
|
6ace416224 | ||
|
|
52c87bc8b3 | ||
|
|
edfacbb5c6 | ||
|
|
564371eae7 | ||
|
|
e09ed98cf1 | ||
|
|
2b0106f7e2 | ||
|
|
5ccf4d3311 | ||
|
|
1f3143cfab | ||
|
|
f5d128b0d5 | ||
|
|
25afc19895 | ||
|
|
68ded1a5b4 | ||
|
|
5f0647f0ab | ||
|
|
fe7f17f422 | ||
|
|
e5a2ebda0e | ||
|
|
2204375788 | ||
|
|
c81dfee43c | ||
|
|
cb175e513d | ||
|
|
32da1d81d5 | ||
|
|
e21e52569c | ||
|
|
00fd2b8503 | ||
|
|
21fd545381 | ||
|
|
6c1eb97a18 | ||
|
|
2070cc45d4 | ||
|
|
f1bc95622d | ||
|
|
e3d3cdb9d2 | ||
|
|
5994e25841 | ||
|
|
cf243adfe3 | ||
|
|
aac5d4704e | ||
|
|
fb2c6801d4 | ||
|
|
9b21786062 | ||
|
|
3bfe5d86c0 | ||
|
|
b9a4760b44 | ||
|
|
302da18c81 | ||
|
|
4fbc623706 | ||
|
|
b9abbc0a85 | ||
|
|
f1035405e6 | ||
|
|
720297946b | ||
|
|
988b3b1ab2 | ||
|
|
88bfc6bb2b | ||
|
|
a0dc88165f | ||
|
|
dccfc11b4f | ||
|
|
42042155d4 | ||
|
|
6b2459317b | ||
|
|
08a0914a78 | ||
|
|
7baff4e249 | ||
|
|
556823328f | ||
|
|
dc6818de2b | ||
|
|
693f6b2d14 | ||
|
|
cf403bc45c | ||
|
|
fa89e1776b | ||
|
|
1a8c7dad5f | ||
|
|
e87fa1600d | ||
|
|
3003185676 | ||
|
|
ebfa2018dd | ||
|
|
68abf10c25 | ||
|
|
284cde8b1b | ||
|
|
466501c62f | ||
|
|
9c34bb4160 | ||
|
|
8e730cdc61 | ||
|
|
41760dfb09 | ||
|
|
67e968926c | ||
|
|
2f7fe1189c |
@@ -1,13 +1,15 @@
|
||||
{
|
||||
"name": "xterm.js",
|
||||
"image": "mcr.microsoft.com/devcontainers/typescript-node:0-18-buster",
|
||||
"image": "mcr.microsoft.com/devcontainers/typescript-node:18-bookworm",
|
||||
"features": {
|
||||
"ghcr.io/devcontainers/features/node:1": {} // yarn
|
||||
"ghcr.io/devcontainers/features/node:1": {
|
||||
"version": 18
|
||||
} // yarn
|
||||
},
|
||||
"forwardPorts": [
|
||||
3000
|
||||
],
|
||||
"postCreateCommand": "yarn install",
|
||||
"postCreateCommand": "yarn install && yarn setup",
|
||||
"customizations": {
|
||||
"vscode": {
|
||||
"extensions": [
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es6": true,
|
||||
"es2021": true,
|
||||
"node": true
|
||||
},
|
||||
"parser": "@typescript-eslint/parser",
|
||||
@@ -11,43 +11,70 @@
|
||||
"src/browser/tsconfig.json",
|
||||
"src/common/tsconfig.json",
|
||||
"src/headless/tsconfig.json",
|
||||
"test/api/tsconfig.json",
|
||||
"src/vs/tsconfig.json",
|
||||
"test/benchmark/tsconfig.json",
|
||||
"test/playwright/tsconfig.json",
|
||||
"addons/xterm-addon-attach/src/tsconfig.json",
|
||||
"addons/xterm-addon-attach/test/tsconfig.json",
|
||||
"addons/xterm-addon-canvas/src/tsconfig.json",
|
||||
"addons/xterm-addon-fit/src/tsconfig.json",
|
||||
"addons/xterm-addon-fit/test/tsconfig.json",
|
||||
"addons/xterm-addon-image/src/tsconfig.json",
|
||||
"addons/xterm-addon-image/test/tsconfig.json",
|
||||
"addons/xterm-addon-ligatures/src/tsconfig.json",
|
||||
"addons/xterm-addon-search/src/tsconfig.json",
|
||||
"addons/xterm-addon-search/test/tsconfig.json",
|
||||
"addons/xterm-addon-serialize/src/tsconfig.json",
|
||||
"addons/xterm-addon-serialize/test/tsconfig.json",
|
||||
"addons/xterm-addon-serialize/benchmark/tsconfig.json",
|
||||
"addons/xterm-addon-unicode11/src/tsconfig.json",
|
||||
"addons/xterm-addon-unicode11/test/tsconfig.json",
|
||||
"addons/xterm-addon-web-links/src/tsconfig.json",
|
||||
"addons/xterm-addon-web-links/test/tsconfig.json",
|
||||
"addons/xterm-addon-webgl/src/tsconfig.json",
|
||||
"addons/xterm-addon-webgl/test/tsconfig.json"
|
||||
"addons/addon-attach/src/tsconfig.json",
|
||||
"addons/addon-attach/test/tsconfig.json",
|
||||
"addons/addon-clipboard/src/tsconfig.json",
|
||||
"addons/addon-clipboard/test/tsconfig.json",
|
||||
"addons/addon-fit/src/tsconfig.json",
|
||||
"addons/addon-fit/test/tsconfig.json",
|
||||
"addons/addon-image/src/tsconfig.json",
|
||||
"addons/addon-image/test/tsconfig.json",
|
||||
"addons/addon-ligatures/src/tsconfig.json",
|
||||
"addons/addon-progress/src/tsconfig.json",
|
||||
"addons/addon-progress/test/tsconfig.json",
|
||||
"addons/addon-search/src/tsconfig.json",
|
||||
"addons/addon-search/test/tsconfig.json",
|
||||
"addons/addon-serialize/src/tsconfig.json",
|
||||
"addons/addon-serialize/test/tsconfig.json",
|
||||
"addons/addon-serialize/benchmark/tsconfig.json",
|
||||
"addons/addon-unicode11/src/tsconfig.json",
|
||||
"addons/addon-unicode11/test/tsconfig.json",
|
||||
"addons/addon-unicode-graphemes/src/tsconfig.json",
|
||||
"addons/addon-unicode-graphemes/test/tsconfig.json",
|
||||
"addons/addon-unicode-graphemes/benchmark/tsconfig.json",
|
||||
"addons/addon-web-links/src/tsconfig.json",
|
||||
"addons/addon-web-links/test/tsconfig.json",
|
||||
"addons/addon-webgl/src/tsconfig.json",
|
||||
"addons/addon-webgl/test/tsconfig.json"
|
||||
],
|
||||
"sourceType": "module"
|
||||
},
|
||||
"ignorePatterns": [
|
||||
"addons/*/src/third-party/*.ts",
|
||||
"src/vs/*",
|
||||
"out/*",
|
||||
"out-test/*",
|
||||
"out-esbuild/*",
|
||||
"out-esbuild-test/*",
|
||||
"**/inwasm-sdks/*",
|
||||
"**/typings/*.d.ts",
|
||||
"**/node_modules",
|
||||
"**/*.js"
|
||||
"**/*.js",
|
||||
"**/*.mjs"
|
||||
],
|
||||
"plugins": [
|
||||
"@stylistic/ts",
|
||||
"@typescript-eslint",
|
||||
"jsdoc"
|
||||
],
|
||||
"rules": {
|
||||
"no-extra-semi": "error",
|
||||
"@stylistic/ts/indent": [
|
||||
"warn",
|
||||
2
|
||||
],
|
||||
"@stylistic/ts/semi": [
|
||||
"warn",
|
||||
"always"
|
||||
],
|
||||
"@stylistic/ts/quotes": [
|
||||
"warn",
|
||||
"single",
|
||||
{ "allowTemplateLiterals": true }
|
||||
],
|
||||
|
||||
"@typescript-eslint/array-type": [
|
||||
"warn",
|
||||
{
|
||||
@@ -72,10 +99,6 @@
|
||||
}
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/indent": [
|
||||
"warn",
|
||||
2
|
||||
],
|
||||
"@typescript-eslint/member-delimiter-style": [
|
||||
"warn",
|
||||
{
|
||||
@@ -135,15 +158,7 @@
|
||||
"@typescript-eslint/no-useless-constructor": "warn",
|
||||
"@typescript-eslint/prefer-namespace-keyword": "warn",
|
||||
"@typescript-eslint/type-annotation-spacing": "warn",
|
||||
"@typescript-eslint/quotes": [
|
||||
"warn",
|
||||
"single",
|
||||
{ "allowTemplateLiterals": true }
|
||||
],
|
||||
"@typescript-eslint/semi": [
|
||||
"warn",
|
||||
"always"
|
||||
],
|
||||
|
||||
"comma-dangle": [
|
||||
"warn",
|
||||
{
|
||||
@@ -184,6 +199,7 @@
|
||||
}
|
||||
],
|
||||
"no-eval": "warn",
|
||||
"no-extra-semi": "error",
|
||||
"no-irregular-whitespace": "warn",
|
||||
"no-restricted-imports": [
|
||||
"warn",
|
||||
|
||||
@@ -1,16 +1,30 @@
|
||||
{
|
||||
"env": {
|
||||
"browser": true,
|
||||
"es6": true,
|
||||
"es2021": true,
|
||||
"node": true
|
||||
},
|
||||
"parser": "@typescript-eslint/parser",
|
||||
"plugins": [
|
||||
"@stylistic/ts",
|
||||
"@typescript-eslint",
|
||||
"jsdoc"
|
||||
],
|
||||
"rules": {
|
||||
"no-extra-semi": "error",
|
||||
"@stylistic/ts/indent": [
|
||||
"warn",
|
||||
2
|
||||
],
|
||||
"@stylistic/ts/semi": [
|
||||
"warn",
|
||||
"always"
|
||||
],
|
||||
"@stylistic/ts/quotes": [
|
||||
"warn",
|
||||
"single",
|
||||
{ "allowTemplateLiterals": true }
|
||||
],
|
||||
|
||||
"@typescript-eslint/array-type": [
|
||||
"warn",
|
||||
{
|
||||
@@ -24,10 +38,6 @@
|
||||
"allowExpressions": true
|
||||
}
|
||||
],
|
||||
"@typescript-eslint/indent": [
|
||||
"warn",
|
||||
2
|
||||
],
|
||||
"@typescript-eslint/member-delimiter-style": [
|
||||
"warn",
|
||||
{
|
||||
@@ -48,15 +58,7 @@
|
||||
],
|
||||
"@typescript-eslint/prefer-namespace-keyword": "warn",
|
||||
"@typescript-eslint/type-annotation-spacing": "warn",
|
||||
"@typescript-eslint/quotes": [
|
||||
"warn",
|
||||
"single",
|
||||
{ "allowTemplateLiterals": true }
|
||||
],
|
||||
"@typescript-eslint/semi": [
|
||||
"warn",
|
||||
"always"
|
||||
],
|
||||
|
||||
"comma-dangle": [
|
||||
"warn",
|
||||
{
|
||||
@@ -86,6 +88,7 @@
|
||||
"ignorePattern": "^ *(?<ps_description>\\* Ps=)"
|
||||
}
|
||||
],
|
||||
"no-extra-semi": "error",
|
||||
"no-irregular-whitespace": "warn",
|
||||
"no-trailing-spaces": "warn",
|
||||
"object-curly-spacing": [
|
||||
|
||||
@@ -0,0 +1,10 @@
|
||||
This is a TypeScript-based repository with a Ruby client for certain API endpoints. It includes several sub projects called addons which are built separately. It contains a demo application which showcases the functionality of the project.
|
||||
|
||||
Please follow these guidelines when contributing:
|
||||
|
||||
## Development Flow
|
||||
|
||||
- Install dependencies: `npm install && npm run setup`
|
||||
- Build and bundle demo: `npm run build && npm run esbuild`
|
||||
- Run unit tests: `npm run test-unit`
|
||||
- Run playwright-based integration tests: `npm run test-integration`
|
||||
@@ -19,35 +19,54 @@ jobs:
|
||||
cache: 'yarn'
|
||||
- name: Install dependencies
|
||||
run: yarn --frozen-lockfile
|
||||
- name: Build
|
||||
- name: Setup and run tsc
|
||||
run: yarn setup
|
||||
- name: Esbuild
|
||||
run: yarn esbuild
|
||||
- name: Zip artifacts
|
||||
run: |
|
||||
zip -r compressed-build \
|
||||
./lib/* \
|
||||
./out/* \
|
||||
./out-test/* \
|
||||
./addons/xterm-addon-attach/out/* \
|
||||
./addons/xterm-addon-attach/out-test/* \
|
||||
./addons/xterm-addon-canvas/out/* \
|
||||
./addons/xterm-addon-canvas/out-test/* \
|
||||
./addons/xterm-addon-fit/out/* \
|
||||
./addons/xterm-addon-fit/out-test/* \
|
||||
./addons/xterm-addon-image/out/* \
|
||||
./addons/xterm-addon-image/out-test/* \
|
||||
./addons/xterm-addon-ligatures/out/* \
|
||||
./addons/xterm-addon-ligatures/out-test/* \
|
||||
./addons/xterm-addon-search/out/* \
|
||||
./addons/xterm-addon-search/out-test/* \
|
||||
./addons/xterm-addon-serialize/out/* \
|
||||
./addons/xterm-addon-serialize/out-test/* \
|
||||
./addons/xterm-addon-unicode11/out/* \
|
||||
./addons/xterm-addon-unicode11/out-test/* \
|
||||
./addons/xterm-addon-web-links/out/* \
|
||||
./addons/xterm-addon-web-links/out-test/* \
|
||||
./addons/xterm-addon-webgl/out/* \
|
||||
./addons/xterm-addon-webgl/out-test/*
|
||||
./out-*/* \
|
||||
./addons/addon-attach/lib/* \
|
||||
./addons/addon-attach/out/* \
|
||||
./addons/addon-attach/out-*/* \
|
||||
./addons/addon-clipboard/lib/* \
|
||||
./addons/addon-clipboard/out/* \
|
||||
./addons/addon-clipboard/out-*/* \
|
||||
./addons/addon-fit/lib/* \
|
||||
./addons/addon-fit/out/* \
|
||||
./addons/addon-fit/out-*/* \
|
||||
./addons/addon-image/lib/* \
|
||||
./addons/addon-image/out/* \
|
||||
./addons/addon-image/out-*/* \
|
||||
./addons/addon-ligatures/lib/* \
|
||||
./addons/addon-ligatures/out/* \
|
||||
./addons/addon-ligatures/out-*/* \
|
||||
./addons/addon-progress/lib/* \
|
||||
./addons/addon-progress/out/* \
|
||||
./addons/addon-progress/out-*/* \
|
||||
./addons/addon-search/lib/* \
|
||||
./addons/addon-search/out/* \
|
||||
./addons/addon-search/out-*/* \
|
||||
./addons/addon-serialize/lib/* \
|
||||
./addons/addon-serialize/out/* \
|
||||
./addons/addon-serialize/out-*/* \
|
||||
./addons/addon-unicode11/lib/* \
|
||||
./addons/addon-unicode11/out/* \
|
||||
./addons/addon-unicode11/out-*/* \
|
||||
./addons/addon-unicode-graphemes/lib/* \
|
||||
./addons/addon-unicode-graphemes/out/* \
|
||||
./addons/addon-unicode-graphemes/out-*/* \
|
||||
./addons/addon-web-links/lib/* \
|
||||
./addons/addon-web-links/out/* \
|
||||
./addons/addon-web-links/out-*/* \
|
||||
./addons/addon-webgl/lib/* \
|
||||
./addons/addon-webgl/out/* \
|
||||
./addons/addon-webgl/out-*st/*
|
||||
- name: Upload artifacts
|
||||
uses: actions/upload-artifact@v3
|
||||
uses: actions/upload-artifact@v4
|
||||
with:
|
||||
name: build-artifacts
|
||||
path: compressed-build.zip
|
||||
@@ -68,6 +87,8 @@ jobs:
|
||||
yarn --frozen-lockfile
|
||||
yarn install-addons
|
||||
- name: Lint code
|
||||
env:
|
||||
NODE_OPTIONS: --max_old_space_size=4096
|
||||
run: yarn lint
|
||||
- name: Lint API
|
||||
run: yarn lint-api
|
||||
@@ -87,7 +108,7 @@ jobs:
|
||||
run: |
|
||||
yarn --frozen-lockfile
|
||||
yarn install-addons
|
||||
- uses: actions/download-artifact@v3
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: build-artifacts
|
||||
- name: Unzip artifacts
|
||||
@@ -106,7 +127,7 @@ jobs:
|
||||
./node_modules/.bin/nyc report --reporter=cobertura
|
||||
exit $EXIT_CODE
|
||||
|
||||
test-unit-parallel:
|
||||
test-unit:
|
||||
timeout-minutes: 20
|
||||
strategy:
|
||||
matrix:
|
||||
@@ -129,7 +150,7 @@ jobs:
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
job: build
|
||||
- uses: actions/download-artifact@v3
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: build-artifacts
|
||||
- name: Unzip artifacts
|
||||
@@ -144,89 +165,14 @@ jobs:
|
||||
- name: Unit tests
|
||||
run: yarn test-unit --forbid-only
|
||||
|
||||
test-unit:
|
||||
needs: build
|
||||
timeout-minutes: 20
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [16]
|
||||
runs-on: [ubuntu, macos, windows]
|
||||
runs-on: ${{ matrix.runs-on }}-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}.x
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}.x
|
||||
cache: 'yarn'
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
yarn --frozen-lockfile
|
||||
yarn install-addons
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: build-artifacts
|
||||
- name: Unzip artifacts
|
||||
shell: bash
|
||||
run: |
|
||||
if [ "$RUNNER_OS" == "Windows" ]; then
|
||||
pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}"
|
||||
else
|
||||
unzip -o compressed-build.zip
|
||||
fi
|
||||
ls -R
|
||||
- name: Unit tests
|
||||
run: yarn test-unit --forbid-only
|
||||
|
||||
test-api-parallel:
|
||||
test-integration:
|
||||
timeout-minutes: 20
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18] # just one as integration tests are about testing in browser
|
||||
runs-on: [ubuntu] # macos is flaky
|
||||
browser: [chromium, firefox]
|
||||
runs-on: ${{ matrix.runs-on }}-latest
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}.x
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: ${{ matrix.node-version }}.x
|
||||
cache: 'yarn'
|
||||
- name: Install dependencies
|
||||
run: |
|
||||
yarn --frozen-lockfile
|
||||
yarn install-addons
|
||||
- name: Install playwright
|
||||
run: npx playwright install
|
||||
- name: Wait for build job
|
||||
uses: NathanFirmo/wait-for-other-job@v1.1.1
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
job: build
|
||||
- uses: actions/download-artifact@v3
|
||||
with:
|
||||
name: build-artifacts
|
||||
- name: Unzip artifacts
|
||||
shell: bash
|
||||
run: |
|
||||
if [ "$RUNNER_OS" == "Windows" ]; then
|
||||
pwsh -Command "7z x compressed-build.zip -aoa -o${{ github.workspace }}"
|
||||
else
|
||||
unzip -o compressed-build.zip
|
||||
fi
|
||||
ls -R
|
||||
- name: Integration tests (${{ matrix.browser }})
|
||||
run: yarn test-api-${{ matrix.browser }} --headless --forbid-only
|
||||
|
||||
test-playwright-parallel:
|
||||
timeout-minutes: 20
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18] # just one as integration tests are about testing in browser
|
||||
runs-on: [ubuntu] # macos is flaky
|
||||
runs-on: [ubuntu-22.04] # macos is flaky
|
||||
browser: [chromium, firefox, webkit]
|
||||
runs-on: ${{ matrix.runs-on }}-latest
|
||||
runs-on: ${{ matrix.runs-on }}
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}.x
|
||||
@@ -245,7 +191,7 @@ jobs:
|
||||
with:
|
||||
token: ${{ secrets.GITHUB_TOKEN }}
|
||||
job: build
|
||||
- uses: actions/download-artifact@v3
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: build-artifacts
|
||||
- name: Unzip artifacts
|
||||
@@ -258,19 +204,38 @@ jobs:
|
||||
fi
|
||||
ls -R
|
||||
- name: Build demo
|
||||
run: yarn build-demo
|
||||
- name: Integration tests
|
||||
run: yarn test-playwright-${{ matrix.browser }} --forbid-only
|
||||
run: yarn esbuild-demo
|
||||
- name: Integration tests (core) # Tests use 50% workers to reduce flakiness
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=core
|
||||
- name: Integration tests (addon-attach)
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-attach
|
||||
- name: Integration tests (addon-clipboard)
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-clipboard
|
||||
- name: Integration tests (addon-fit)
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-fit
|
||||
- name: Integration tests (addon-image)
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-image
|
||||
- name: Integration tests (addon-progress)
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-progress
|
||||
- name: Integration tests (addon-search)
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-search
|
||||
- name: Integration tests (addon-serialize)
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-serialize
|
||||
- name: Integration tests (addon-unicode-graphemes)
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode-graphemes
|
||||
- name: Integration tests (addon-unicode11)
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-unicode11
|
||||
- name: Integration tests (addon-web-links)
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-web-links
|
||||
- name: Integration tests (addon-webgl)
|
||||
run: yarn test-integration-${{ matrix.browser }} --workers=50% --forbid-only --suite=addon-webgl
|
||||
|
||||
test-api:
|
||||
release-dry-run:
|
||||
needs: build
|
||||
timeout-minutes: 20
|
||||
runs-on: ubuntu-latest
|
||||
strategy:
|
||||
matrix:
|
||||
node-version: [18] # just one as integration tests are about testing in browser
|
||||
runs-on: [windows] # macos is flaky
|
||||
browser: [chromium, firefox]
|
||||
runs-on: ${{ matrix.runs-on }}-latest
|
||||
node-version: [18]
|
||||
steps:
|
||||
- uses: actions/checkout@v3
|
||||
- name: Use Node.js ${{ matrix.node-version }}.x
|
||||
@@ -284,7 +249,7 @@ jobs:
|
||||
yarn install-addons
|
||||
- name: Install playwright
|
||||
run: npx playwright install
|
||||
- uses: actions/download-artifact@v3
|
||||
- uses: actions/download-artifact@v4
|
||||
with:
|
||||
name: build-artifacts
|
||||
- name: Unzip artifacts
|
||||
@@ -296,5 +261,9 @@ jobs:
|
||||
unzip -o compressed-build.zip
|
||||
fi
|
||||
ls -R
|
||||
- name: Integration tests (${{ matrix.browser }})
|
||||
run: yarn test-api-${{ matrix.browser }} --headless --forbid-only
|
||||
- name: Package headless
|
||||
run: |
|
||||
yarn package-headless
|
||||
node ./bin/package_headless.js
|
||||
- name: Publish to npm (dry run)
|
||||
run: node ./bin/publish.js --dry
|
||||
|
||||
@@ -0,0 +1,36 @@
|
||||
name: "Copilot Setup Steps"
|
||||
|
||||
on:
|
||||
workflow_dispatch:
|
||||
push:
|
||||
paths:
|
||||
- .github/workflows/copilot-setup-steps.yml
|
||||
pull_request:
|
||||
paths:
|
||||
- .github/workflows/copilot-setup-steps.yml
|
||||
|
||||
jobs:
|
||||
copilot-setup-steps:
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
permissions:
|
||||
contents: read
|
||||
|
||||
steps:
|
||||
- name: Checkout code
|
||||
uses: actions/checkout@v4
|
||||
|
||||
- name: Use Node.js 20.x
|
||||
uses: actions/setup-node@v3
|
||||
with:
|
||||
node-version: 20.x
|
||||
cache: 'yarn'
|
||||
|
||||
- name: Install dependencies
|
||||
run: yarn --frozen-lockfile
|
||||
|
||||
- name: Setup and run tsc
|
||||
run: yarn setup
|
||||
|
||||
- name: Esbuild
|
||||
run: yarn esbuild
|
||||
@@ -4,6 +4,8 @@ node_modules/
|
||||
lib/
|
||||
out/
|
||||
out-test/
|
||||
out-esbuild/
|
||||
out-esbuild-test/
|
||||
.nyc_output/
|
||||
Makefile.gyp
|
||||
*.Makefile
|
||||
|
||||
@@ -17,6 +17,9 @@
|
||||
!lib/**/*.js
|
||||
!lib/**/*.js.map
|
||||
|
||||
!lib/**/*.mjs
|
||||
!lib/**/*.mjs.map
|
||||
|
||||
!lib/**/*.css
|
||||
|
||||
# Whitelist - src/
|
||||
|
||||
@@ -43,7 +43,14 @@
|
||||
{
|
||||
"type": "chrome",
|
||||
"request": "launch",
|
||||
"name": "Demo Client",
|
||||
"name": "Demo Client (Chrome)",
|
||||
"url": "http://127.0.0.1:3000",
|
||||
"webRoot": "${workspaceFolder}/"
|
||||
},
|
||||
{
|
||||
"type": "msedge",
|
||||
"request": "launch",
|
||||
"name": "Demo Client (Edge)",
|
||||
"url": "http://127.0.0.1:3000",
|
||||
"webRoot": "${workspaceFolder}/"
|
||||
},
|
||||
@@ -52,11 +59,9 @@
|
||||
"request": "launch",
|
||||
"name": "Demo Server",
|
||||
"runtimeExecutable": "npm",
|
||||
"runtimeArgs": [
|
||||
"run",
|
||||
"start-debug"
|
||||
],
|
||||
"port": 9229,
|
||||
"runtimeArgs": ["start"],
|
||||
"stopOnEntry": true,
|
||||
"runtimeVersion": "18",
|
||||
"serverReadyAction": {
|
||||
"action": "openExternally",
|
||||
"pattern": "App listening to (http://.*?:[0-9]+)"
|
||||
|
||||
@@ -2,15 +2,22 @@
|
||||
"files.associations": {
|
||||
".eslintrc.json.typings": "jsonc"
|
||||
},
|
||||
"files.exclude": {
|
||||
"**/.nyc_output": true
|
||||
},
|
||||
"typescript.preferences.importModuleSpecifier": "non-relative",
|
||||
"typescript.preferences.quoteStyle": "single",
|
||||
"mochaExplorer.envPath": ".mocha.env",
|
||||
"mochaExplorer.files": [
|
||||
"out/**/*.test.js",
|
||||
"addons/**/out/*.test.js"
|
||||
"addons/**/out/*.test.js",
|
||||
"out-*/**/*.test.js",
|
||||
"addons/**/out-*/*.test.js"
|
||||
],
|
||||
"mochaExplorer.watch": [
|
||||
"out/**/*.js",
|
||||
"addons/**/out/*.js"
|
||||
"addons/**/out/*.js",
|
||||
"out-*/**/*.js",
|
||||
"addons/**/out-*/*.js"
|
||||
]
|
||||
}
|
||||
|
||||
@@ -8,6 +8,66 @@
|
||||
"showReuseMessage": true
|
||||
},
|
||||
"tasks": [
|
||||
// Compound tasks
|
||||
{
|
||||
"label": "Development",
|
||||
"dependsOn": ["demo-server", "tsc", "esbuild", "esbuild-demo"],
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
}
|
||||
},
|
||||
|
||||
// Demo
|
||||
{
|
||||
"label": "demo-server",
|
||||
"type": "npm",
|
||||
"script": "start",
|
||||
"group": "build",
|
||||
"isBackground": true,
|
||||
"problemMatcher": [],
|
||||
"presentation": {
|
||||
"group": "xterm-demo"
|
||||
}
|
||||
},
|
||||
|
||||
// Build
|
||||
{
|
||||
"label": "tsc",
|
||||
"type": "npm",
|
||||
"script": "tsc-watch",
|
||||
"group": "build",
|
||||
"isBackground": true,
|
||||
"problemMatcher": "$tsc-watch",
|
||||
"presentation": {
|
||||
"group": "xterm-build"
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "esbuild",
|
||||
"type": "npm",
|
||||
"script": "esbuild-watch",
|
||||
"group": "build",
|
||||
"isBackground": true,
|
||||
"problemMatcher": "$esbuild-watch",
|
||||
"presentation": {
|
||||
"group": "xterm-build"
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "esbuild-demo",
|
||||
"type": "npm",
|
||||
"script": "esbuild-demo-watch",
|
||||
"dependsOn": ["esbuild", "tsc"],
|
||||
"group": "build",
|
||||
"isBackground": true,
|
||||
"problemMatcher": "$esbuild-watch",
|
||||
"presentation": {
|
||||
"group": "xterm-demo"
|
||||
}
|
||||
},
|
||||
|
||||
// Test
|
||||
{
|
||||
"type": "npm",
|
||||
"script": "test",
|
||||
@@ -16,59 +76,6 @@
|
||||
"isDefault": true
|
||||
},
|
||||
"problemMatcher": []
|
||||
},
|
||||
{
|
||||
"label": "watch",
|
||||
"type": "npm",
|
||||
"script": "watch",
|
||||
"group": "build",
|
||||
"isBackground": true,
|
||||
"problemMatcher": "$tsc-watch",
|
||||
"presentation": {
|
||||
"group": "vscode"
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "start",
|
||||
"type": "npm",
|
||||
"script": "start",
|
||||
"group": "build",
|
||||
"isBackground": true,
|
||||
"problemMatcher": [],
|
||||
"presentation": {
|
||||
"group": "vscode"
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "Start demo",
|
||||
"dependsOn": ["start", "watch"],
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
},
|
||||
"isBackground": true,
|
||||
"problemMatcher": {
|
||||
"owner": "typescript",
|
||||
"fileLocation": [
|
||||
"relative",
|
||||
"${workspaceFolder}"
|
||||
],
|
||||
"pattern": [
|
||||
{
|
||||
"regexp": "^([^\\\\s].*)\\\\((\\\\d+,\\\\d+)\\\\):\\\\s*(.*)$",
|
||||
"file": 1,
|
||||
"location": 2,
|
||||
"message": 3
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"beginsPattern": "assets by",
|
||||
"endsPattern": "webpack \\d+\\.\\d+\\.\\d+ compiled successfully"
|
||||
}
|
||||
},
|
||||
"presentation": {
|
||||
"group": "vscode"
|
||||
}
|
||||
}
|
||||
]
|
||||
}
|
||||
|
||||
@@ -60,3 +60,45 @@ By contributing code to xterm.js you:
|
||||
### Test coverage
|
||||
|
||||
One area that always needs attention is improving out unit test coverage, you can view the code coverage report on [Azure Pipelines](https://dev.azure.com/xtermjs/xterm.js/_build/latest?definitionId=3) by clicking the Code Coverage tab.
|
||||
|
||||
## Testing
|
||||
|
||||
### Unit tests
|
||||
|
||||
Unit tests are run with `yarn test-unit`:
|
||||
|
||||
```sh
|
||||
# All unit tests
|
||||
yarn test-unit
|
||||
|
||||
# Absolute file path
|
||||
yarn test-unit out-esbuild/browser/Terminal.test.js
|
||||
|
||||
# Filter by wildcard
|
||||
yarn test-unit out-esbuild/**/Terminal.test.js
|
||||
|
||||
# Specific addon unit tests tests
|
||||
yarn test-unit addons/addon-image/out-esbuild/*.test.js
|
||||
|
||||
# Multiple files
|
||||
yarn test-unit out-esbuild/**/Terminal.test.js out-esbuild/**/InputHandler.test.js
|
||||
```
|
||||
|
||||
These use mocha to run all `.test.js` files within the esbuild output (`out-esbuild/`).
|
||||
|
||||
### Integration tests
|
||||
|
||||
Integration tests are run with `yarn test-integration`:
|
||||
|
||||
```sh
|
||||
# All integration tests
|
||||
yarn test-integration
|
||||
|
||||
# Core integration tests
|
||||
yarn test-integration --suite=core
|
||||
|
||||
# Specific addon integration tests
|
||||
yarn test-integration --suite=addon-search
|
||||
```
|
||||
|
||||
These use `@playwright/test` to run all tests within the esbuild test output (`out-esbuild-test/`).
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
# [](https://xtermjs.org)
|
||||
# [](https://xtermjs.org)
|
||||
|
||||
Xterm.js is a front-end component written in TypeScript that lets applications bring fully-featured terminals to their users in the browser. It's used by popular projects such as VS Code, Hyper and Theia.
|
||||
|
||||
@@ -21,7 +21,7 @@ Xterm.js is a front-end component written in TypeScript that lets applications b
|
||||
First, you need to install the module, we ship exclusively through [npm](https://www.npmjs.com/), so you need that installed and then add xterm.js as a dependency by running:
|
||||
|
||||
```bash
|
||||
npm install xterm
|
||||
npm install @xterm/xterm
|
||||
```
|
||||
|
||||
To start using xterm.js on your browser, add the `xterm.js` and `xterm.css` to the head of your HTML page. Then create a `<div id="terminal"></div>` onto which xterm can attach itself. Finally, instantiate the `Terminal` object and then call the `open` function with the DOM object of the `div`.
|
||||
@@ -30,8 +30,8 @@ To start using xterm.js on your browser, add the `xterm.js` and `xterm.css` to t
|
||||
<!doctype html>
|
||||
<html>
|
||||
<head>
|
||||
<link rel="stylesheet" href="node_modules/xterm/css/xterm.css" />
|
||||
<script src="node_modules/xterm/lib/xterm.js"></script>
|
||||
<link rel="stylesheet" href="node_modules/@xterm/xterm/css/xterm.css" />
|
||||
<script src="node_modules/@xterm/xterm/lib/xterm.js"></script>
|
||||
</head>
|
||||
<body>
|
||||
<div id="terminal"></div>
|
||||
@@ -49,7 +49,7 @@ To start using xterm.js on your browser, add the `xterm.js` and `xterm.css` to t
|
||||
The recommended way to load xterm.js is via the ES6 module syntax:
|
||||
|
||||
```javascript
|
||||
import { Terminal } from 'xterm';
|
||||
import { Terminal } from '@xterm/xterm';
|
||||
```
|
||||
|
||||
### Addons
|
||||
@@ -59,14 +59,14 @@ import { Terminal } from 'xterm';
|
||||
Addons are separate modules that extend the `Terminal` by building on the [xterm.js API](https://github.com/xtermjs/xterm.js/blob/master/typings/xterm.d.ts). To use an addon, you first need to install it in your project:
|
||||
|
||||
```bash
|
||||
npm i -S xterm-addon-web-links
|
||||
npm i -S @xterm/addon-web-links
|
||||
```
|
||||
|
||||
Then import the addon, instantiate it and call `Terminal.loadAddon`:
|
||||
|
||||
```ts
|
||||
import { Terminal } from 'xterm';
|
||||
import { WebLinksAddon } from 'xterm-addon-web-links';
|
||||
import { Terminal } from '@xterm/xterm';
|
||||
import { WebLinksAddon } from '@xterm/addon-web-links';
|
||||
|
||||
const terminal = new Terminal();
|
||||
// Load WebLinksAddon on terminal, this is all that's needed to get web links
|
||||
@@ -76,10 +76,15 @@ terminal.loadAddon(new WebLinksAddon());
|
||||
|
||||
The xterm.js team maintains the following addons, but anyone can build them:
|
||||
|
||||
- [`xterm-addon-attach`](https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-attach): Attaches to a server running a process via a websocket
|
||||
- [`xterm-addon-fit`](https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-fit): Fits the terminal to the containing element
|
||||
- [`xterm-addon-search`](https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-search): Adds search functionality
|
||||
- [`xterm-addon-web-links`](https://github.com/xtermjs/xterm.js/tree/master/addons/xterm-addon-web-links): Adds web link detection and interaction
|
||||
- [`@xterm/addon-attach`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-attach): Attaches to a server running a process via a websocket
|
||||
- [`@xterm/addon-clipboard`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-clipboard): Access the browser's clipboard
|
||||
- [`@xterm/addon-fit`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-fit): Fits the terminal to the containing element
|
||||
- [`@xterm/addon-image`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image): Adds image support
|
||||
- [`@xterm/addon-search`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-search): Adds search functionality
|
||||
- [`@xterm/addon-serialize`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-serialize): Serializes the terminal's buffer to a VT sequences or HTML
|
||||
- [`@xterm/addon-unicode11`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-unicode11): Updates character widths to their unicode11 values
|
||||
- [`@xterm/addon-web-links`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-web-links): Adds web link detection and interaction
|
||||
- [`@xterm/addon-webgl`](https://github.com/xtermjs/xterm.js/tree/master/addons/addon-webgl): Renders xterm.js using a `canvas` element's webgl2 context
|
||||
|
||||
## Browser Support
|
||||
|
||||
@@ -108,7 +113,7 @@ All current and past releases are available on this repo's [Releases page](https
|
||||
Our CI releases beta builds to npm for every change that goes into master. Install the latest beta build with:
|
||||
|
||||
```bash
|
||||
npm install -S xterm@beta
|
||||
npm install -S @xterm/xterm@beta
|
||||
```
|
||||
|
||||
These should generally be stable, but some bugs may slip in. We recommend using the beta build primarily to test out new features and to verify bug fixes.
|
||||
@@ -123,7 +128,6 @@ Xterm.js is used in several world-class applications to provide great terminal e
|
||||
- [**SourceLair**](https://www.sourcelair.com/): In-browser IDE that provides its users with fully-featured Linux terminals based on xterm.js.
|
||||
- [**Microsoft Visual Studio Code**](http://code.visualstudio.com/): Modern, versatile, and powerful open source code editor that provides an integrated terminal based on xterm.js.
|
||||
- [**ttyd**](https://github.com/tsl0922/ttyd): A command-line tool for sharing terminal over the web, with fully-featured terminal emulation based on xterm.js.
|
||||
- [**Katacoda**](https://www.katacoda.com/): Katacoda is an Interactive Learning Platform for software developers, covering the latest Cloud Native technologies.
|
||||
- [**Eclipse Che**](http://www.eclipse.org/che): Developer workspace server, cloud IDE, and Eclipse next-generation IDE.
|
||||
- [**Codenvy**](http://www.codenvy.com): Cloud workspaces for development teams.
|
||||
- [**CoderPad**](https://coderpad.io): Online interviewing platform for programmers. Run code in many programming languages, with results displayed by xterm.js.
|
||||
@@ -217,6 +221,14 @@ Xterm.js is used in several world-class applications to provide great terminal e
|
||||
- [**Cloudtutor.io**](https://cloudtutor.io): innovative online learning platform that offers users access to an interactive lab.
|
||||
- [**Helix Editor Playground**](https://github.com/tomgroenwoldt/helix-editor-playground): Online playground for the terminal based helix editor.
|
||||
- [**Coder**](https://github.com/coder/coder): Self-Hosted Remote Development Environments
|
||||
- [**Wave Terminal**](https://waveterm.dev): An open-source, ai-native, terminal built for seamless workflows.
|
||||
- [**eva**](https://github.com/info24/eva): Eva is a web application for SSH remote login, developed in Go.
|
||||
- [**OpenSFTP**](https://opensftp.com): Super beautiful SSH and SFTP integrated workspace client.
|
||||
- [**balena**](https://www.balena.io/): Balena is a full-stack solution for developing, deploying, updating, and troubleshooting IoT Edge devices. We use xterm.js to manage & debug devices on [balenaCloud](https://www.balena.io/cloud).
|
||||
- [**Filet Cloud**](https://github.com/fuglaro/filet-cloud): The lean and powerful personal cloud ⛅.
|
||||
- [**pyTermTk**](https://github.com/ceccopierangiolieugenio/pyTermTk): Python Terminal Toolkit - a Spiced Up Cross Compatible TUI Library 🌶️, use xterm.js for the [HTML5 exporter](https://ceccopierangiolieugenio.github.io/pyTermTk/sandbox/sandbox.html).
|
||||
- [**ecmaOS**](https://ecmaos.sh): A kernel and suite of applications tying modern web technologies into a browser-based operating system.
|
||||
- [**LabEx**](https://labex.io): Interactive learning platform with hands-on labs and xterm.js-based online terminals, focused on learn-by-doing approach.
|
||||
- [And much more...](https://github.com/xtermjs/xterm.js/network/dependents?package_id=UGFja2FnZS0xNjYzMjc4OQ%3D%3D)
|
||||
|
||||
Do you use xterm.js in your application as well? Please [open a Pull Request](https://github.com/sourcelair/xterm.js/pulls) to include it here. We would love to have it on our list. Note: Please add any new contributions to the end of the list only.
|
||||
|
||||
@@ -8,6 +8,9 @@
|
||||
!lib/**/*.js
|
||||
!lib/**/*.js.map
|
||||
|
||||
!lib/**/*.mjs
|
||||
!lib/**/*.mjs.map
|
||||
|
||||
!lib/**/*.css
|
||||
|
||||
# Whitelist - src/
|
||||
@@ -1,22 +1,22 @@
|
||||
## xterm-addon-attach
|
||||
## @xterm/addon-attach
|
||||
|
||||
An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables attaching to a web socket. This addon requires xterm.js v4+.
|
||||
|
||||
### Install
|
||||
|
||||
```bash
|
||||
npm install --save xterm-addon-attach
|
||||
npm install --save @xterm/addon-attach
|
||||
```
|
||||
|
||||
### Usage
|
||||
|
||||
```ts
|
||||
import { Terminal } from 'xterm';
|
||||
import { AttachAddon } from 'xterm-addon-attach';
|
||||
import { Terminal } from '@xterm/xterm';
|
||||
import { AttachAddon } from '@xterm/addon-attach';
|
||||
|
||||
const terminal = new Terminal();
|
||||
const attachAddon = new AttachAddon(webSocket);
|
||||
terminal.loadAddon(attachAddon);
|
||||
```
|
||||
|
||||
See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/xterm-addon-attach/typings/xterm-addon-attach.d.ts) for more advanced usage.
|
||||
See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/addon-attach/typings/addon-attach.d.ts) for more advanced usage.
|
||||
@@ -1,13 +1,14 @@
|
||||
{
|
||||
"name": "xterm-addon-search",
|
||||
"version": "0.13.0",
|
||||
"name": "@xterm/addon-attach",
|
||||
"version": "0.11.0",
|
||||
"author": {
|
||||
"name": "The xterm.js authors",
|
||||
"url": "https://xtermjs.org/"
|
||||
},
|
||||
"main": "lib/xterm-addon-search.js",
|
||||
"types": "typings/xterm-addon-search.d.ts",
|
||||
"repository": "https://github.com/xtermjs/xterm.js",
|
||||
"main": "lib/addon-attach.js",
|
||||
"module": "lib/addon-attach.mjs",
|
||||
"types": "typings/addon-attach.d.ts",
|
||||
"repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-attach",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"terminal",
|
||||
@@ -18,9 +19,10 @@
|
||||
"build": "../../node_modules/.bin/tsc -p .",
|
||||
"prepackage": "npm run build",
|
||||
"package": "../../node_modules/.bin/webpack",
|
||||
"prepublishOnly": "npm run package"
|
||||
"prepublishOnly": "npm run package",
|
||||
"start": "node ../../demo/start"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"xterm": "^5.0.0"
|
||||
"@xterm/xterm": "^5.0.0"
|
||||
}
|
||||
}
|
||||
@@ -5,13 +5,14 @@
|
||||
* Implements the attach method, that attaches the terminal to a WebSocket stream.
|
||||
*/
|
||||
|
||||
import { Terminal, IDisposable, ITerminalAddon } from 'xterm';
|
||||
import type { Terminal, IDisposable, ITerminalAddon } from '@xterm/xterm';
|
||||
import type { AttachAddon as IAttachApi } from '@xterm/addon-attach';
|
||||
|
||||
interface IAttachOptions {
|
||||
bidirectional?: boolean;
|
||||
}
|
||||
|
||||
export class AttachAddon implements ITerminalAddon {
|
||||
export class AttachAddon implements ITerminalAddon , IAttachApi {
|
||||
private _socket: WebSocket;
|
||||
private _bidirectional: boolean;
|
||||
private _disposables: IDisposable[] = [];
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "es2015",
|
||||
"target": "es2021",
|
||||
"lib": [
|
||||
"dom",
|
||||
"es2015"
|
||||
@@ -13,7 +13,12 @@
|
||||
"strict": true,
|
||||
"types": [
|
||||
"../../../node_modules/@types/mocha"
|
||||
]
|
||||
],
|
||||
"paths": {
|
||||
"@xterm/addon-attach": [
|
||||
"../typings/addon-attach.d.ts"
|
||||
]
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
"./**/*",
|
||||
@@ -0,0 +1,42 @@
|
||||
/**
|
||||
* Copyright (c) 2019 The xterm.js authors. All rights reserved.
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
import WebSocket = require('ws');
|
||||
|
||||
import test from '@playwright/test';
|
||||
import { ITestContext, createTestContext, openTerminal, pollFor, timeout } from '../../../test/playwright/TestUtils';
|
||||
|
||||
let ctx: ITestContext;
|
||||
test.beforeAll(async ({ browser }) => {
|
||||
ctx = await createTestContext(browser);
|
||||
await openTerminal(ctx);
|
||||
});
|
||||
test.afterAll(async () => await ctx.page.close());
|
||||
|
||||
test.describe('Search Tests', () => {
|
||||
|
||||
test.beforeEach(async () => {
|
||||
await ctx.proxy.reset();
|
||||
});
|
||||
|
||||
test('string', async function(): Promise<any> {
|
||||
const port = 8080;
|
||||
const server = new WebSocket.Server({ port });
|
||||
server.on('connection', socket => socket.send('foo'));
|
||||
await ctx.page.evaluate(`window.term.loadAddon(new window.AttachAddon(new WebSocket('ws://localhost:${port}')))`);
|
||||
await pollFor(ctx.page, `window.term.buffer.active.getLine(0).translateToString(true)`, 'foo');
|
||||
server.close();
|
||||
});
|
||||
|
||||
test('utf8', async function(): Promise<any> {
|
||||
const port = 8080;
|
||||
const server = new WebSocket.Server({ port });
|
||||
const data = new Uint8Array([102, 111, 111]);
|
||||
server.on('connection', socket => socket.send(data));
|
||||
await ctx.page.evaluate(`window.term.loadAddon(new window.AttachAddon(new WebSocket('ws://localhost:${port}')))`);
|
||||
await pollFor(ctx.page, `window.term.buffer.active.getLine(0).translateToString(true)`, 'foo');
|
||||
server.close();
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,35 @@
|
||||
import { PlaywrightTestConfig } from '@playwright/test';
|
||||
|
||||
const config: PlaywrightTestConfig = {
|
||||
testDir: '.',
|
||||
timeout: 10000,
|
||||
projects: [
|
||||
{
|
||||
name: 'ChromeStable',
|
||||
use: {
|
||||
browserName: 'chromium',
|
||||
channel: 'chrome'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'FirefoxStable',
|
||||
use: {
|
||||
browserName: 'firefox'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'WebKit',
|
||||
use: {
|
||||
browserName: 'webkit'
|
||||
}
|
||||
}
|
||||
],
|
||||
reporter: 'list',
|
||||
webServer: {
|
||||
command: 'npm run start',
|
||||
port: 3000,
|
||||
timeout: 120000,
|
||||
reuseExistingServer: !process.env.CI
|
||||
}
|
||||
};
|
||||
export default config;
|
||||
@@ -1,13 +1,12 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "es2015",
|
||||
"target": "ESNext",
|
||||
"lib": [
|
||||
"dom",
|
||||
"es6"
|
||||
"es2021",
|
||||
],
|
||||
"rootDir": ".",
|
||||
"outDir": "../out",
|
||||
"outDir": "../out-test",
|
||||
"sourceMap": true,
|
||||
"removeComments": true,
|
||||
"baseUrl": ".",
|
||||
@@ -20,9 +19,8 @@
|
||||
]
|
||||
},
|
||||
"strict": true,
|
||||
"downlevelIteration": true,
|
||||
"types": [
|
||||
"../../../node_modules/@types/mocha"
|
||||
"../../../node_modules/@types/node"
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
@@ -35,6 +33,9 @@
|
||||
},
|
||||
{
|
||||
"path": "../../../src/browser"
|
||||
},
|
||||
{
|
||||
"path": "../../../test/playwright"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -3,9 +3,9 @@
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
import { Terminal, ITerminalAddon } from 'xterm';
|
||||
import { Terminal, ITerminalAddon } from '@xterm/xterm';
|
||||
|
||||
declare module 'xterm-addon-attach' {
|
||||
declare module '@xterm/addon-attach' {
|
||||
export interface IAttachOptions {
|
||||
/**
|
||||
* Whether input should be written to the backend. Defaults to `true`.
|
||||
@@ -6,7 +6,7 @@
|
||||
const path = require('path');
|
||||
|
||||
const addonName = 'AttachAddon';
|
||||
const mainFile = 'xterm-addon-attach.js';
|
||||
const mainFile = 'addon-attach.js';
|
||||
|
||||
module.exports = {
|
||||
entry: `./out/${addonName}.js`,
|
||||
@@ -25,7 +25,9 @@ module.exports = {
|
||||
filename: mainFile,
|
||||
path: path.resolve('./lib'),
|
||||
library: addonName,
|
||||
libraryTarget: 'umd'
|
||||
libraryTarget: 'umd',
|
||||
// Force usage of globalThis instead of global / self. (This is cross-env compatible)
|
||||
globalObject: 'globalThis',
|
||||
},
|
||||
mode: 'production'
|
||||
};
|
||||
@@ -8,6 +8,9 @@
|
||||
!lib/**/*.js
|
||||
!lib/**/*.js.map
|
||||
|
||||
!lib/**/*.mjs
|
||||
!lib/**/*.mjs.map
|
||||
|
||||
!lib/**/*.css
|
||||
|
||||
# Whitelist - src/
|
||||
@@ -1,4 +1,4 @@
|
||||
Copyright (c) 2017, The xterm.js authors (https://github.com/xtermjs/xterm.js)
|
||||
Copyright (c) 2023, The xterm.js authors (https://github.com/xtermjs/xterm.js)
|
||||
|
||||
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||
of this software and associated documentation files (the "Software"), to deal
|
||||
@@ -0,0 +1,53 @@
|
||||
## @xterm/addon-clipboard
|
||||
|
||||
An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables
|
||||
accessing the system clipboard. This addon requires xterm.js v4+.
|
||||
|
||||
### Install
|
||||
|
||||
```bash
|
||||
npm install --save @xterm/addon-clipboard
|
||||
```
|
||||
|
||||
### Usage
|
||||
|
||||
```ts
|
||||
import { Terminal } from 'xterm';
|
||||
import { ClipboardAddon } from '@xterm/addon-clipboard';
|
||||
|
||||
const terminal = new Terminal();
|
||||
const clipboardAddon = new ClipboardAddon();
|
||||
terminal.loadAddon(clipboardAddon);
|
||||
```
|
||||
|
||||
To use a custom clipboard provider
|
||||
|
||||
```ts
|
||||
import { Terminal } from '@xterm/xterm';
|
||||
import { ClipboardAddon, IClipboardProvider, ClipboardSelectionType } from '@xterm/addon-clipboard';
|
||||
|
||||
function b64Encode(data: string): string {
|
||||
// Base64 encode impl
|
||||
}
|
||||
|
||||
function b64Decode(data: string): string {
|
||||
// Base64 decode impl
|
||||
}
|
||||
|
||||
class MyCustomClipboardProvider implements IClipboardProvider {
|
||||
private _data: string
|
||||
public readText(selection: ClipboardSelectionType): Promise<string> {
|
||||
return Promise.resolve(b64Encode(this._data));
|
||||
}
|
||||
public writeText(selection: ClipboardSelectionType, data: string): Promise<void> {
|
||||
this._data = b64Decode(data);
|
||||
return Promise.resolve();
|
||||
}
|
||||
}
|
||||
|
||||
const terminal = new Terminal();
|
||||
const clipboardAddon = new ClipboardAddon(new MyCustomClipboardProvider());
|
||||
terminal.loadAddon(clipboardAddon);
|
||||
```
|
||||
|
||||
See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/addon-clipboard/typings/addon-clipboard.d.ts) for more advanced usage.
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"name": "@xterm/addon-clipboard",
|
||||
"version": "0.1.0",
|
||||
"author": {
|
||||
"name": "The xterm.js authors",
|
||||
"url": "https://xtermjs.org/"
|
||||
},
|
||||
"main": "lib/addon-clipboard.js",
|
||||
"module": "lib/addon-clipboard.mjs",
|
||||
"types": "typings/addon-clipboard.d.ts",
|
||||
"repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-clipboard",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"terminal",
|
||||
"xterm",
|
||||
"xterm.js"
|
||||
],
|
||||
"scripts": {
|
||||
"build": "../../node_modules/.bin/tsc -p .",
|
||||
"prepackage": "npm run build",
|
||||
"package": "../../node_modules/.bin/webpack",
|
||||
"prepublishOnly": "npm run package",
|
||||
"start": "node ../../demo/start"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"@xterm/xterm": "^5.4.0"
|
||||
},
|
||||
"dependencies": {
|
||||
"js-base64": "^3.7.5"
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,99 @@
|
||||
/**
|
||||
* Copyright (c) 2023 The xterm.js authors. All rights reserved.
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
import type { IDisposable, ITerminalAddon, Terminal } from '@xterm/xterm';
|
||||
import { type IClipboardProvider, ClipboardSelectionType, type IBase64 } from '@xterm/addon-clipboard';
|
||||
import { Base64 as JSBase64 } from 'js-base64';
|
||||
|
||||
export class ClipboardAddon implements ITerminalAddon {
|
||||
private _terminal?: Terminal;
|
||||
private _disposable?: IDisposable;
|
||||
|
||||
constructor(
|
||||
private _base64: IBase64 = new Base64(),
|
||||
private _provider: IClipboardProvider = new BrowserClipboardProvider()
|
||||
) {}
|
||||
|
||||
public activate(terminal: Terminal): void {
|
||||
this._terminal = terminal;
|
||||
this._disposable = terminal.parser.registerOscHandler(52, data => this._setOrReportClipboard(data));
|
||||
}
|
||||
|
||||
public dispose(): void {
|
||||
return this._disposable?.dispose();
|
||||
}
|
||||
|
||||
private _readText(sel: ClipboardSelectionType, data: string): void {
|
||||
const b64 = this._base64.encodeText(data);
|
||||
this._terminal?.input(`\x1b]52;${sel};${b64}\x07`, false);
|
||||
}
|
||||
|
||||
private _setOrReportClipboard(data: string): boolean | Promise<boolean> {
|
||||
const args = data.split(';');
|
||||
if (args.length < 2) {
|
||||
return true;
|
||||
}
|
||||
|
||||
const pc = args[0] as ClipboardSelectionType;
|
||||
const pd = args[1];
|
||||
if (pd === '?') {
|
||||
const text = this._provider.readText(pc);
|
||||
|
||||
// Report clipboard
|
||||
if (text instanceof Promise) {
|
||||
return text.then((data) => {
|
||||
this._readText(pc, data);
|
||||
return true;
|
||||
});
|
||||
}
|
||||
|
||||
this._readText(pc, text);
|
||||
return true;
|
||||
}
|
||||
|
||||
// Clear clipboard if text is not a base64 encoded string.
|
||||
let text = '';
|
||||
try {
|
||||
text = this._base64.decodeText(pd);
|
||||
} catch {}
|
||||
|
||||
|
||||
const result = this._provider.writeText(pc, text);
|
||||
if (result instanceof Promise) {
|
||||
return result.then(() => true);
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
export class BrowserClipboardProvider implements IClipboardProvider {
|
||||
public async readText(selection: ClipboardSelectionType): Promise<string> {
|
||||
if (selection !== 'c') {
|
||||
return Promise.resolve('');
|
||||
}
|
||||
return navigator.clipboard.readText();
|
||||
}
|
||||
|
||||
public async writeText(selection: ClipboardSelectionType, text: string): Promise<void> {
|
||||
if (selection !== 'c') {
|
||||
return Promise.resolve();
|
||||
}
|
||||
return navigator.clipboard.writeText(text);
|
||||
}
|
||||
}
|
||||
|
||||
export class Base64 implements IBase64 {
|
||||
public encodeText(data: string): string {
|
||||
return JSBase64.encode(data);
|
||||
}
|
||||
public decodeText(data: string): string {
|
||||
const text = JSBase64.decode(data);
|
||||
if (!JSBase64.isValid(data) || JSBase64.encode(text) !== data) {
|
||||
return '';
|
||||
}
|
||||
return text;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "es2021",
|
||||
"lib": [
|
||||
"dom",
|
||||
"es2015"
|
||||
],
|
||||
"rootDir": ".",
|
||||
"outDir": "../out",
|
||||
"sourceMap": true,
|
||||
"removeComments": true,
|
||||
"strict": true,
|
||||
"types": [
|
||||
"../../../node_modules/@types/mocha"
|
||||
],
|
||||
"paths": {
|
||||
"browser/*": [
|
||||
"../../../src/browser/*"
|
||||
],
|
||||
"@xterm/addon-clipboard": [
|
||||
"../typings/addon-clipboard.d.ts"
|
||||
]
|
||||
}
|
||||
},
|
||||
"include": [
|
||||
"./**/*",
|
||||
"../../../typings/xterm.d.ts"
|
||||
],
|
||||
"references": [
|
||||
{
|
||||
"path": "../../../src/browser"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,78 @@
|
||||
/**
|
||||
* Copyright (c) 2023 The xterm.js authors. All rights reserved.
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
import test from '@playwright/test';
|
||||
import { deepEqual, ok, strictEqual } from 'assert';
|
||||
import { ITestContext, createTestContext, launchBrowser, openTerminal, timeout } from '../../../test/playwright/TestUtils';
|
||||
|
||||
let ctx: ITestContext;
|
||||
test.beforeAll(async ({ browser }, testInfo) => {
|
||||
ctx = await createTestContext(browser);
|
||||
await openTerminal(ctx);
|
||||
});
|
||||
test.afterAll(async () => {
|
||||
await ctx.page.close();
|
||||
});
|
||||
|
||||
test.describe('ClipboardAddon', () => {
|
||||
|
||||
test.beforeEach(async ({}, testInfo) => {
|
||||
// DEBT: This test doesn't work since the migration to @playwright/test
|
||||
if (ctx.browser.browserType().name() !== 'chromium') {
|
||||
testInfo.skip();
|
||||
return;
|
||||
}
|
||||
if (ctx.browser.browserType().name() === 'chromium') {
|
||||
// Enable clipboard access in chromium without user gesture
|
||||
await ctx.page.context().grantPermissions(['clipboard-read', 'clipboard-write']);
|
||||
}
|
||||
await ctx.page.evaluate(`
|
||||
window.term.reset()
|
||||
window.clipboard?.dispose();
|
||||
window.clipboard = new ClipboardAddon();
|
||||
window.term.loadAddon(window.clipboard);
|
||||
`);
|
||||
});
|
||||
|
||||
test.beforeEach(async () => {
|
||||
await ctx.proxy.reset();
|
||||
});
|
||||
|
||||
const testDataEncoded = 'aGVsbG8gd29ybGQ=';
|
||||
const testDataDecoded = 'hello world';
|
||||
|
||||
test.describe('write data', async function (): Promise<any> {
|
||||
test('simple string', async () => {
|
||||
await ctx.proxy.write(`\x1b]52;c;${testDataEncoded}\x07`);
|
||||
deepEqual(await ctx.page.evaluate(() => window.navigator.clipboard.readText()), testDataDecoded);
|
||||
});
|
||||
test('invalid base64 string', async () => {
|
||||
await ctx.proxy.write(`\x1b]52;c;${testDataEncoded}invalid\x07`);
|
||||
deepEqual(await ctx.page.evaluate(() => window.navigator.clipboard.readText()), '');
|
||||
});
|
||||
test('empty string', async () => {
|
||||
await ctx.proxy.write(`\x1b]52;c;${testDataEncoded}\x07`);
|
||||
await ctx.proxy.write(`\x1b]52;c;\x07`);
|
||||
deepEqual(await ctx.page.evaluate(() => window.navigator.clipboard.readText()), '');
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('read data', async function (): Promise<any> {
|
||||
test('simple string', async () => {
|
||||
await ctx.page.evaluate(`
|
||||
window.data = [];
|
||||
window.term.onData(e => data.push(e));
|
||||
`);
|
||||
await ctx.page.evaluate(() => window.navigator.clipboard.writeText('hello world'));
|
||||
await ctx.proxy.write(`\x1b]52;c;?\x07`);
|
||||
deepEqual(await ctx.page.evaluate('window.data'), [`\x1b]52;c;${testDataEncoded}\x07`]);
|
||||
});
|
||||
test('clear clipboard', async () => {
|
||||
await ctx.proxy.write(`\x1b]52;c;!\x07`);
|
||||
await ctx.proxy.write(`\x1b]52;c;?\x07`);
|
||||
deepEqual(await ctx.page.evaluate(() => window.navigator.clipboard.readText()), '');
|
||||
});
|
||||
});
|
||||
});
|
||||
@@ -0,0 +1,35 @@
|
||||
import { PlaywrightTestConfig } from '@playwright/test';
|
||||
|
||||
const config: PlaywrightTestConfig = {
|
||||
testDir: '.',
|
||||
timeout: 10000,
|
||||
projects: [
|
||||
{
|
||||
name: 'ChromeStable',
|
||||
use: {
|
||||
browserName: 'chromium',
|
||||
channel: 'chrome'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'FirefoxStable',
|
||||
use: {
|
||||
browserName: 'firefox'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'WebKit',
|
||||
use: {
|
||||
browserName: 'webkit'
|
||||
}
|
||||
}
|
||||
],
|
||||
reporter: 'list',
|
||||
webServer: {
|
||||
command: 'npm run start',
|
||||
port: 3000,
|
||||
timeout: 120000,
|
||||
reuseExistingServer: !process.env.CI
|
||||
}
|
||||
};
|
||||
export default config;
|
||||
@@ -1,13 +1,12 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "es2015",
|
||||
"target": "ESNext",
|
||||
"lib": [
|
||||
"dom",
|
||||
"es6"
|
||||
"es2021",
|
||||
],
|
||||
"rootDir": ".",
|
||||
"outDir": "../out",
|
||||
"outDir": "../out-test",
|
||||
"sourceMap": true,
|
||||
"removeComments": true,
|
||||
"baseUrl": ".",
|
||||
@@ -20,10 +19,8 @@
|
||||
]
|
||||
},
|
||||
"strict": true,
|
||||
"downlevelIteration": true,
|
||||
"experimentalDecorators": true,
|
||||
"types": [
|
||||
"../../../node_modules/@types/mocha"
|
||||
"../../../node_modules/@types/node"
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
@@ -36,6 +33,9 @@
|
||||
},
|
||||
{
|
||||
"path": "../../../src/browser"
|
||||
},
|
||||
{
|
||||
"path": "../../../test/playwright"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,113 @@
|
||||
/**
|
||||
* Copyright (c) 2023 The xterm.js authors. All rights reserved.
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
import { Terminal, ITerminalAddon } from '@xterm/xterm';
|
||||
|
||||
declare module '@xterm/addon-clipboard' {
|
||||
/**
|
||||
* An xterm.js addon that enables accessing the system clipboard from
|
||||
* xterm.js.
|
||||
*/
|
||||
export class ClipboardAddon implements ITerminalAddon {
|
||||
/**
|
||||
* Creates a new clipboard addon.
|
||||
* @param base64 An optional base64 encoder/decoder.
|
||||
* @param provider An optional clipboard provider.
|
||||
*/
|
||||
constructor(base64?: IBase64, provider?: IClipboardProvider);
|
||||
|
||||
/**
|
||||
* Activates the addon
|
||||
* @param terminal The terminal the addon is being loaded in.
|
||||
*/
|
||||
public activate(terminal: Terminal): void;
|
||||
|
||||
/**
|
||||
* Disposes the addon.
|
||||
*/
|
||||
public dispose(): void
|
||||
}
|
||||
|
||||
/**
|
||||
* Clipboard selection type. This is used to specify which selection buffer to
|
||||
* read or write to.
|
||||
* - SYSTEM `c`: The system clipboard.
|
||||
* - PRIMARY `p`: The primary clipboard. This is provided for compatibility
|
||||
* with Linux X11.
|
||||
*/
|
||||
export const enum ClipboardSelectionType {
|
||||
SYSTEM = 'c',
|
||||
PRIMARY = 'p',
|
||||
}
|
||||
|
||||
export interface IBase64 {
|
||||
/**
|
||||
* Converts a utf-8 string to a base64 string.
|
||||
* @param data The utf-8 string to convert to base64 string.
|
||||
*/
|
||||
encodeText(data: string): string;
|
||||
|
||||
/**
|
||||
* Converts a base64 string to a utf-8 string.
|
||||
* @param data The base64 string to convert to utf-8 string.
|
||||
* @throws An error if the input is not valid base64.
|
||||
*/
|
||||
decodeText(data: string): string;
|
||||
}
|
||||
|
||||
/**
|
||||
* A default Base64 encoding and decoding type.
|
||||
**/
|
||||
export class Base64 implements IBase64 {
|
||||
/**
|
||||
* Converts a utf-8 string to a base64 string.
|
||||
* @param data The utf-8 string to convert to base64 string.
|
||||
*/
|
||||
public encodeText(data: string): string;
|
||||
|
||||
/**
|
||||
* Converts a base64 string to a utf-8 string.
|
||||
* @param data The base64 string to convert to utf-8 string.
|
||||
* @throws An error if the input is not valid base64.
|
||||
*/
|
||||
public decodeText(data: string): string;
|
||||
}
|
||||
|
||||
export interface IClipboardProvider {
|
||||
/**
|
||||
* Gets the clipboard content.
|
||||
* @param selection The clipboard selection to read.
|
||||
* @returns A promise that resolves with clipboard selection data.
|
||||
*/
|
||||
readText(selection: ClipboardSelectionType): string | Promise<string>;
|
||||
|
||||
/**
|
||||
* Sets the clipboard content.
|
||||
* @param selection The clipboard selection to set.
|
||||
* @param data The clipboard text to write.
|
||||
*/
|
||||
writeText(selection: ClipboardSelectionType, text: string): void | Promise<void>;
|
||||
}
|
||||
|
||||
/**
|
||||
* The clipboard provider interface that enables xterm.js to access the system clipboard.
|
||||
*/
|
||||
export class BrowserClipboardProvider implements IClipboardProvider{
|
||||
/**
|
||||
* Reads text from the clipboard.
|
||||
* @param selection The selection type to read from.
|
||||
* @returns A promise that resolves with the text from the clipboard.
|
||||
*/
|
||||
public readText(selection: ClipboardSelectionType): Promise<string>;
|
||||
|
||||
/**
|
||||
* Writes text to the clipboard.
|
||||
* @param selection The selection type to write to.
|
||||
* @param data The text to write to the clipboard.
|
||||
* @returns A promise that resolves when the text has been written to the clipboard.
|
||||
*/
|
||||
public writeText(selection: ClipboardSelectionType, data: string): Promise<void>;
|
||||
}
|
||||
}
|
||||
@@ -1,12 +1,12 @@
|
||||
/**
|
||||
* Copyright (c) 2019 The xterm.js authors. All rights reserved.
|
||||
* Copyright (c) 2023 The xterm.js authors. All rights reserved.
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
const path = require('path');
|
||||
|
||||
const addonName = 'FitAddon';
|
||||
const mainFile = 'xterm-addon-fit.js';
|
||||
const addonName = 'ClipboardAddon';
|
||||
const mainFile = 'addon-clipboard.js';
|
||||
|
||||
module.exports = {
|
||||
entry: `./out/${addonName}.js`,
|
||||
@@ -0,0 +1,8 @@
|
||||
# THIS IS AN AUTOGENERATED FILE. DO NOT EDIT THIS FILE DIRECTLY.
|
||||
# yarn lockfile v1
|
||||
|
||||
|
||||
js-base64@^3.7.5:
|
||||
version "3.7.7"
|
||||
resolved "https://registry.yarnpkg.com/js-base64/-/js-base64-3.7.7.tgz#e51b84bf78fbf5702b9541e2cb7bfcb893b43e79"
|
||||
integrity sha512-7rCnleh0z2CkXhH67J8K1Ytz0b2Y+yxTPL+/KOJoa20hfnVQ/3/T6W/KflYI4bRHRagNeXeU2bkNGI3v1oS/lw==
|
||||
@@ -8,6 +8,9 @@
|
||||
!lib/**/*.js
|
||||
!lib/**/*.js.map
|
||||
|
||||
!lib/**/*.mjs
|
||||
!lib/**/*.mjs.map
|
||||
|
||||
!lib/**/*.css
|
||||
|
||||
# Whitelist - src/
|
||||
@@ -1,18 +1,18 @@
|
||||
## xterm-addon-fit
|
||||
## @xterm/addon-fit
|
||||
|
||||
An addon for [xterm.js](https://github.com/xtermjs/xterm.js) that enables fitting the terminal's dimensions to a containing element. This addon requires xterm.js v4+.
|
||||
|
||||
### Install
|
||||
|
||||
```bash
|
||||
npm install --save xterm-addon-fit
|
||||
npm install --save @xterm/addon-fit
|
||||
```
|
||||
|
||||
### Usage
|
||||
|
||||
```ts
|
||||
import { Terminal } from 'xterm';
|
||||
import { FitAddon } from 'xterm-addon-fit';
|
||||
import { Terminal } from '@xterm/xterm';
|
||||
import { FitAddon } from '@xterm/addon-fit';
|
||||
|
||||
const terminal = new Terminal();
|
||||
const fitAddon = new FitAddon();
|
||||
@@ -21,4 +21,4 @@ terminal.open(containerElement);
|
||||
fitAddon.fit();
|
||||
```
|
||||
|
||||
See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/xterm-addon-fit/typings/xterm-addon-fit.d.ts) for more advanced usage.
|
||||
See the full [API](https://github.com/xtermjs/xterm.js/blob/master/addons/addon-fit/typings/addon-fit.d.ts) for more advanced usage.
|
||||
@@ -1,17 +1,17 @@
|
||||
{
|
||||
"name": "xterm-addon-canvas",
|
||||
"version": "0.5.0",
|
||||
"name": "@xterm/addon-fit",
|
||||
"version": "0.10.0",
|
||||
"author": {
|
||||
"name": "The xterm.js authors",
|
||||
"url": "https://xtermjs.org/"
|
||||
},
|
||||
"main": "lib/xterm-addon-canvas.js",
|
||||
"types": "typings/xterm-addon-canvas.d.ts",
|
||||
"repository": "https://github.com/xtermjs/xterm.js",
|
||||
"main": "lib/addon-fit.js",
|
||||
"module": "lib/addon-fit.mjs",
|
||||
"types": "typings/addon-fit.d.ts",
|
||||
"repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-fit",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"terminal",
|
||||
"canvas",
|
||||
"xterm",
|
||||
"xterm.js"
|
||||
],
|
||||
@@ -19,9 +19,10 @@
|
||||
"build": "../../node_modules/.bin/tsc -p .",
|
||||
"prepackage": "npm run build",
|
||||
"package": "../../node_modules/.bin/webpack",
|
||||
"prepublishOnly": "npm run package"
|
||||
"prepublishOnly": "npm run package",
|
||||
"start": "node ../../demo/start"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"xterm": "^5.0.0"
|
||||
"@xterm/xterm": "^5.0.0"
|
||||
}
|
||||
}
|
||||
@@ -3,8 +3,10 @@
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
import { Terminal, ITerminalAddon } from 'xterm';
|
||||
import type { Terminal, ITerminalAddon } from '@xterm/xterm';
|
||||
import type { FitAddon as IFitApi } from '@xterm/addon-fit';
|
||||
import { IRenderDimensions } from 'browser/renderer/shared/Types';
|
||||
import { ViewportConstants } from 'browser/shared/Constants';
|
||||
|
||||
interface ITerminalDimensions {
|
||||
/**
|
||||
@@ -21,7 +23,7 @@ interface ITerminalDimensions {
|
||||
const MINIMUM_COLS = 2;
|
||||
const MINIMUM_ROWS = 1;
|
||||
|
||||
export class FitAddon implements ITerminalAddon {
|
||||
export class FitAddon implements ITerminalAddon , IFitApi {
|
||||
private _terminal: Terminal | undefined;
|
||||
|
||||
public activate(terminal: Terminal): void {
|
||||
@@ -63,8 +65,9 @@ export class FitAddon implements ITerminalAddon {
|
||||
return undefined;
|
||||
}
|
||||
|
||||
const scrollbarWidth = this._terminal.options.scrollback === 0 ?
|
||||
0 : core.viewport.scrollBarWidth;
|
||||
const scrollbarWidth = (this._terminal.options.scrollback === 0
|
||||
? 0
|
||||
: (this._terminal.options.overviewRuler?.width || ViewportConstants.DEFAULT_SCROLL_BAR_WIDTH));
|
||||
|
||||
const parentElementStyle = window.getComputedStyle(this._terminal.element.parentElement);
|
||||
const parentElementHeight = parseInt(parentElementStyle.getPropertyValue('height'));
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "es2015",
|
||||
"target": "es2021",
|
||||
"lib": [
|
||||
"dom",
|
||||
"es2015"
|
||||
@@ -17,6 +17,9 @@
|
||||
"paths": {
|
||||
"browser/*": [
|
||||
"../../../src/browser/*"
|
||||
],
|
||||
"@xterm/addon-fit": [
|
||||
"../typings/addon-fit.d.ts"
|
||||
]
|
||||
}
|
||||
},
|
||||
@@ -0,0 +1,133 @@
|
||||
/**
|
||||
* Copyright (c) 2019 The xterm.js authors. All rights reserved.
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
import test from '@playwright/test';
|
||||
import { deepEqual, ok, strictEqual } from 'assert';
|
||||
import { ITestContext, createTestContext, openTerminal, timeout } from '../../../test/playwright/TestUtils';
|
||||
|
||||
let ctx: ITestContext;
|
||||
test.beforeAll(async ({ browser }) => {
|
||||
ctx = await createTestContext(browser);
|
||||
ctx.page.setViewportSize({ width: 1024, height: 768 });
|
||||
await openTerminal(ctx);
|
||||
});
|
||||
test.afterAll(async () => await ctx.page.close());
|
||||
|
||||
test.describe('FitAddon', () => {
|
||||
test.beforeEach(async function(): Promise<any> {
|
||||
await ctx.page.evaluate(`document.querySelector('#terminal-container').style.display=''`);
|
||||
await ctx.page.evaluate(`
|
||||
window.term.reset()
|
||||
window.fit?.dispose();
|
||||
window.fit = new FitAddon();
|
||||
window.term.loadAddon(window.fit);
|
||||
`);
|
||||
});
|
||||
|
||||
// test.beforeEach(async function(): Promise<any> {
|
||||
// await ctx.page.evaluate(`document.querySelector('#terminal-container').style.display=''`);
|
||||
// await openTerminal(page);
|
||||
// });
|
||||
|
||||
// after(async () => {
|
||||
// await browser.close();
|
||||
// });
|
||||
|
||||
// afterEach(async function(): Promise<any> {
|
||||
// await ctx.proxy.dispose();
|
||||
// });
|
||||
|
||||
test('no terminal', async function(): Promise<any> {
|
||||
await ctx.page.evaluate(`window.fit2 = new FitAddon();`);
|
||||
strictEqual(await ctx.page.evaluate(`window.fit2.proposeDimensions()`), undefined);
|
||||
await ctx.page.evaluate(`window.fit2.dispose();`);
|
||||
});
|
||||
|
||||
test.describe('proposeDimensions', () => {
|
||||
test('default', async function(): Promise<any> {
|
||||
await setDimensions();
|
||||
const dimensions: {cols: number, rows: number} = await ctx.page.evaluate(`window.fit.proposeDimensions()`);
|
||||
ok(dimensions.cols > 85);
|
||||
ok(dimensions.cols < 88);
|
||||
ok(dimensions.rows > 24);
|
||||
ok(dimensions.rows < 29);
|
||||
});
|
||||
|
||||
test('width', async function(): Promise<any> {
|
||||
await setDimensions(1008);
|
||||
const dimensions: {cols: number, rows: number} = await ctx.page.evaluate(`window.fit.proposeDimensions()`);
|
||||
ok(dimensions.cols > 108);
|
||||
ok(dimensions.cols < 111);
|
||||
ok(dimensions.rows > 24);
|
||||
ok(dimensions.rows < 29);
|
||||
});
|
||||
|
||||
test('small', async function(): Promise<any> {
|
||||
await setDimensions(1, 1);
|
||||
deepEqual(await ctx.page.evaluate(`window.fit.proposeDimensions()`), {
|
||||
cols: 2,
|
||||
rows: 1
|
||||
});
|
||||
});
|
||||
|
||||
test('hidden', async function(): Promise<any> {
|
||||
await ctx.proxy.dispose();
|
||||
await ctx.page.evaluate(`document.querySelector('#terminal-container').style.display='none'`);
|
||||
await ctx.page.evaluate(`window.term = new Terminal()`);
|
||||
await ctx.page.evaluate(`window.term.open(document.querySelector('#terminal-container'))`);
|
||||
await setDimensions();
|
||||
const dimensions: { cols: number, rows: number } | undefined = await ctx.page.evaluate(`window.fit.proposeDimensions()`);
|
||||
// The value of dims will be undefined if the char measure strategy falls back to the DOM
|
||||
// method, so only assert if it's not undefined.
|
||||
if (dimensions) {
|
||||
ok(dimensions.cols > 85);
|
||||
ok(dimensions.cols < 88);
|
||||
ok(dimensions.rows > 24);
|
||||
ok(dimensions.rows < 29);
|
||||
}
|
||||
});
|
||||
});
|
||||
|
||||
test.describe('fit', () => {
|
||||
test('default', async function(): Promise<any> {
|
||||
await setDimensions();
|
||||
await ctx.page.evaluate(`window.fit.fit()`);
|
||||
const cols: number = await ctx.proxy.cols;
|
||||
const rows: number = await ctx.proxy.rows;
|
||||
ok(cols > 85);
|
||||
ok(cols < 88);
|
||||
ok(rows > 24);
|
||||
ok(rows < 29);
|
||||
});
|
||||
|
||||
test('width', async function(): Promise<any> {
|
||||
await setDimensions(1008);
|
||||
await ctx.page.evaluate(`window.fit.fit()`);
|
||||
const cols: number = await ctx.proxy.cols;
|
||||
const rows: number = await ctx.proxy.rows;
|
||||
ok(cols > 108);
|
||||
ok(cols < 111);
|
||||
ok(rows > 24);
|
||||
ok(rows < 29);
|
||||
});
|
||||
|
||||
test('small', async function(): Promise<any> {
|
||||
await setDimensions(1, 1);
|
||||
await ctx.page.evaluate(`window.fit.fit()`);
|
||||
strictEqual(await ctx.proxy.cols, 2);
|
||||
strictEqual(await ctx.proxy.rows, 1);
|
||||
});
|
||||
});
|
||||
});
|
||||
|
||||
async function setDimensions(width: number = 800, height: number = 450): Promise<void> {
|
||||
await ctx.page.evaluate(`
|
||||
document.querySelector('#terminal-container').style.width='${width}px';
|
||||
document.querySelector('#terminal-container').style.height='${height}px';
|
||||
document.querySelector('#terminal-container').style.display='';
|
||||
`);
|
||||
// HACK: Await a short period as hiding #terminal-container can mess with other tests
|
||||
await timeout(500);
|
||||
}
|
||||
@@ -0,0 +1,35 @@
|
||||
import { PlaywrightTestConfig } from '@playwright/test';
|
||||
|
||||
const config: PlaywrightTestConfig = {
|
||||
testDir: '.',
|
||||
timeout: 10000,
|
||||
projects: [
|
||||
{
|
||||
name: 'ChromeStable',
|
||||
use: {
|
||||
browserName: 'chromium',
|
||||
channel: 'chrome'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'FirefoxStable',
|
||||
use: {
|
||||
browserName: 'firefox'
|
||||
}
|
||||
},
|
||||
{
|
||||
name: 'WebKit',
|
||||
use: {
|
||||
browserName: 'webkit'
|
||||
}
|
||||
}
|
||||
],
|
||||
reporter: 'list',
|
||||
webServer: {
|
||||
command: 'npm run start',
|
||||
port: 3000,
|
||||
timeout: 120000,
|
||||
reuseExistingServer: !process.env.CI
|
||||
}
|
||||
};
|
||||
export default config;
|
||||
@@ -0,0 +1,41 @@
|
||||
{
|
||||
"compilerOptions": {
|
||||
"module": "commonjs",
|
||||
"target": "ESNext",
|
||||
"lib": [
|
||||
"es2021",
|
||||
],
|
||||
"rootDir": ".",
|
||||
"outDir": "../out-test",
|
||||
"sourceMap": true,
|
||||
"removeComments": true,
|
||||
"baseUrl": ".",
|
||||
"paths": {
|
||||
"common/*": [
|
||||
"../../../src/common/*"
|
||||
],
|
||||
"browser/*": [
|
||||
"../../../src/browser/*"
|
||||
]
|
||||
},
|
||||
"strict": true,
|
||||
"types": [
|
||||
"../../../node_modules/@types/node"
|
||||
]
|
||||
},
|
||||
"include": [
|
||||
"./**/*",
|
||||
"../../../typings/xterm.d.ts"
|
||||
],
|
||||
"references": [
|
||||
{
|
||||
"path": "../../../src/common"
|
||||
},
|
||||
{
|
||||
"path": "../../../src/browser"
|
||||
},
|
||||
{
|
||||
"path": "../../../test/playwright"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -3,9 +3,9 @@
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
import { Terminal, ITerminalAddon } from 'xterm';
|
||||
import { Terminal, ITerminalAddon } from '@xterm/xterm';
|
||||
|
||||
declare module 'xterm-addon-fit' {
|
||||
declare module '@xterm/addon-fit' {
|
||||
/**
|
||||
* An xterm.js addon that enables resizing the terminal to the dimensions of
|
||||
* its containing element.
|
||||
@@ -39,7 +39,7 @@ declare module 'xterm-addon-fit' {
|
||||
}
|
||||
|
||||
/**
|
||||
* Reprepresents the dimensions of a terminal.
|
||||
* Represents the dimensions of a terminal.
|
||||
*/
|
||||
export interface ITerminalDimensions {
|
||||
/**
|
||||
@@ -0,0 +1,33 @@
|
||||
/**
|
||||
* Copyright (c) 2019 The xterm.js authors. All rights reserved.
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
const path = require('path');
|
||||
|
||||
const addonName = 'FitAddon';
|
||||
const mainFile = 'addon-fit.js';
|
||||
|
||||
module.exports = {
|
||||
entry: `./out/${addonName}.js`,
|
||||
devtool: 'source-map',
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.js$/,
|
||||
use: ["source-map-loader"],
|
||||
enforce: "pre",
|
||||
exclude: /node_modules/
|
||||
}
|
||||
]
|
||||
},
|
||||
output: {
|
||||
filename: mainFile,
|
||||
path: path.resolve('./lib'),
|
||||
library: addonName,
|
||||
libraryTarget: 'umd',
|
||||
// Force usage of globalThis instead of global / self. (This is cross-env compatible)
|
||||
globalObject: 'globalThis',
|
||||
},
|
||||
mode: 'production'
|
||||
};
|
||||
@@ -6,5 +6,7 @@ tsconfig.json
|
||||
webpack.config.js
|
||||
test
|
||||
out-test
|
||||
out-esbuild
|
||||
out-esbuild-test
|
||||
inwasm-sdks
|
||||
inwasm-builds
|
||||
@@ -1,4 +1,4 @@
|
||||
## xterm-addon-image
|
||||
## @xterm/addon-image
|
||||
|
||||
Inline image output in xterm.js. Supports SIXEL and iTerm's inline image protocol (IIP).
|
||||
|
||||
@@ -9,15 +9,15 @@ Inline image output in xterm.js. Supports SIXEL and iTerm's inline image protoco
|
||||
### Install from npm
|
||||
|
||||
```bash
|
||||
npm install --save xterm-addon-image
|
||||
npm install --save @xterm/addon-image
|
||||
```
|
||||
|
||||
|
||||
### Usage
|
||||
|
||||
```ts
|
||||
import { Terminal } from 'xterm';
|
||||
import { ImageAddon, IImageAddonOptions } from 'xterm-addon-image';
|
||||
import { Terminal } from '@xterm/xterm';
|
||||
import { ImageAddon, IImageAddonOptions } from '@xterm/addon-image';
|
||||
|
||||
// customize as needed (showing addon defaults)
|
||||
const customSettings: IImageAddonOptions = {
|
||||
@@ -227,5 +227,5 @@ _How can I adjust the memory usage?_
|
||||
- 0.1.2 bugfix: reset clear flag
|
||||
- 0.1.1 bugfixes:
|
||||
- clear sticky image tiles on render
|
||||
- create xterm-addon-image folder from bootstrap.sh
|
||||
- create folder from bootstrap.sh
|
||||
- fix peer dependency in package.json
|
||||
|
Before Width: | Height: | Size: 76 KiB After Width: | Height: | Size: 76 KiB |
|
Before Width: | Height: | Size: 525 B After Width: | Height: | Size: 525 B |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 8.4 KiB |
|
Before Width: | Height: | Size: 1.9 MiB After Width: | Height: | Size: 1.9 MiB |
|
Before Width: | Height: | Size: 160 KiB After Width: | Height: | Size: 160 KiB |
|
Before Width: | Height: | Size: 6.3 MiB After Width: | Height: | Size: 6.3 MiB |
|
Before Width: | Height: | Size: 599 KiB After Width: | Height: | Size: 599 KiB |
|
Before Width: | Height: | Size: 988 B After Width: | Height: | Size: 988 B |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 333 B After Width: | Height: | Size: 333 B |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 2.3 KiB |
|
Before Width: | Height: | Size: 324 B After Width: | Height: | Size: 324 B |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.1 KiB After Width: | Height: | Size: 2.1 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 1.9 KiB After Width: | Height: | Size: 1.9 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
Before Width: | Height: | Size: 2.0 KiB After Width: | Height: | Size: 2.0 KiB |
|
Before Width: | Height: | Size: 1.6 KiB After Width: | Height: | Size: 1.6 KiB |
|
After Width: | Height: | Size: 2.1 KiB |
@@ -1,13 +1,14 @@
|
||||
{
|
||||
"name": "xterm-addon-image",
|
||||
"version": "0.6.0",
|
||||
"name": "@xterm/addon-image",
|
||||
"version": "0.8.0",
|
||||
"author": {
|
||||
"name": "The xterm.js authors",
|
||||
"url": "https://xtermjs.org/"
|
||||
},
|
||||
"main": "lib/xterm-addon-image.js",
|
||||
"types": "typings/xterm-addon-image.d.ts",
|
||||
"repository": "https://github.com/xtermjs/xterm.js",
|
||||
"main": "lib/addon-image.js",
|
||||
"module": "lib/addon-image.mjs",
|
||||
"types": "typings/addon-image.d.ts",
|
||||
"repository": "https://github.com/xtermjs/xterm.js/tree/master/addons/addon-image",
|
||||
"license": "MIT",
|
||||
"keywords": [
|
||||
"terminal",
|
||||
@@ -19,10 +20,11 @@
|
||||
"scripts": {
|
||||
"prepackage": "../../node_modules/.bin/tsc -p .",
|
||||
"package": "../../node_modules/.bin/webpack",
|
||||
"prepublishOnly": "npm run package"
|
||||
"prepublishOnly": "npm run package",
|
||||
"start": "node ../../demo/start"
|
||||
},
|
||||
"peerDependencies": {
|
||||
"xterm": "^5.2.0"
|
||||
"@xterm/xterm": "^5.2.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"sixel": "^0.16.0",
|
||||
@@ -25,6 +25,7 @@ const TEST_IMAGES: [string, IMetrics][] = [
|
||||
['w3c_home_gray.png', { mime: 'image/png', width: 72, height: 48 }],
|
||||
['w3c_home.jpg', { mime: 'image/jpeg', width: 72, height: 48 }],
|
||||
['w3c_home.png', { mime: 'image/png', width: 72, height: 48 }],
|
||||
['w3c_home_noexif.jpg', { mime: 'image/jpeg', width: 72, height: 48 }],
|
||||
['spinfox.png', { mime: 'image/png', width: 148, height: 148 }],
|
||||
['iphone_hdr_YES.jpg', { mime: 'image/jpeg', width: 3264, height: 2448 }],
|
||||
['nikon-e950.jpg', { mime: 'image/jpeg', width: 800, height: 600 }],
|
||||
@@ -36,7 +37,7 @@ const TEST_IMAGES: [string, IMetrics][] = [
|
||||
describe('IIPMetrics', () => {
|
||||
it('bunch of testimages', () => {
|
||||
for (let i = 0; i < TEST_IMAGES.length; ++i) {
|
||||
const imageData = fs.readFileSync('./addons/xterm-addon-image/fixture/testimages/' + TEST_IMAGES[i][0]);
|
||||
const imageData = fs.readFileSync('./addons/addon-image/fixture/testimages/' + TEST_IMAGES[i][0]);
|
||||
assert.deepStrictEqual(imageType(imageData), TEST_IMAGES[i][1]);
|
||||
}
|
||||
});
|
||||
@@ -32,13 +32,8 @@ export function imageType(d: Uint8Array): IMetrics {
|
||||
height: d[20] << 24 | d[21] << 16 | d[22] << 8 | d[23]
|
||||
};
|
||||
}
|
||||
// JPEG: FF D8 FF E0 xx xx JFIF or FF D8 FF E1 xx xx Exif 00 00
|
||||
if ((d32[0] === 0xE0FFD8FF || d32[0] === 0xE1FFD8FF)
|
||||
&& (
|
||||
(d[6] === 0x4a && d[7] === 0x46 && d[8] === 0x49 && d[9] === 0x46)
|
||||
|| (d[6] === 0x45 && d[7] === 0x78 && d[8] === 0x69 && d[9] === 0x66)
|
||||
)
|
||||
) {
|
||||
// JPEG: FF D8 FF
|
||||
if (d[0] === 0xFF && d[1] === 0xD8 && d[2] === 0xFF) {
|
||||
const [width, height] = jpgSize(d);
|
||||
return { mime: 'image/jpeg', width, height };
|
||||
}
|
||||
@@ -3,14 +3,14 @@
|
||||
* @license MIT
|
||||
*/
|
||||
|
||||
import type { ITerminalAddon, IDisposable } from '@xterm/xterm';
|
||||
import type { ImageAddon as IImageApi } from '@xterm/addon-image';
|
||||
import { IIPHandler } from './IIPHandler';
|
||||
import { ITerminalAddon, IDisposable } from 'xterm';
|
||||
import { ImageRenderer } from './ImageRenderer';
|
||||
import { ImageStorage, CELL_SIZE_DEFAULT } from './ImageStorage';
|
||||
import { SixelHandler } from './SixelHandler';
|
||||
import { ITerminalExt, IImageAddonOptions, IResetHandler } from './Types';
|
||||
|
||||
|
||||
// default values of addon ctor options
|
||||
const DEFAULT_OPTIONS: IImageAddonOptions = {
|
||||
enableSizeReports: true,
|
||||
@@ -48,7 +48,7 @@ const enum GaStatus {
|
||||
}
|
||||
|
||||
|
||||
export class ImageAddon implements ITerminalAddon {
|
||||
export class ImageAddon implements ITerminalAddon , IImageApi {
|
||||
private _opts: IImageAddonOptions;
|
||||
private _defaultOpts: IImageAddonOptions;
|
||||
private _storage: ImageStorage | undefined;
|
||||