mirror of
https://github.com/ckaczor/azuredatastudio.git
synced 2026-02-19 11:01:38 -05:00
Compare commits
1045 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
f74080c963 | ||
|
|
32cd41d076 | ||
|
|
0d7d1cf375 | ||
|
|
8b826063b4 | ||
|
|
6a500715a7 | ||
|
|
5e02486ace | ||
|
|
16dbef978e | ||
|
|
f9081773dd | ||
|
|
b3799d4506 | ||
|
|
2ab9e4b861 | ||
|
|
a1d8bae654 | ||
|
|
b265c53f9c | ||
|
|
ac7d19133a | ||
|
|
ab3895a4c2 | ||
|
|
a230e24af0 | ||
|
|
8354ccd76d | ||
|
|
3d60ee9030 | ||
|
|
7973f0f178 | ||
|
|
11f0ca371b | ||
|
|
0131746919 | ||
|
|
5774b1f69a | ||
|
|
34d36c1de1 | ||
|
|
cca84e6455 | ||
|
|
82ce1ace28 | ||
|
|
e59d5a766f | ||
|
|
98a8103f5a | ||
|
|
5faf2d9cb2 | ||
|
|
81a8593eb6 | ||
|
|
b6584c9ddf | ||
|
|
08d4cc9690 | ||
|
|
0565162fde | ||
|
|
31614247cf | ||
|
|
e9390dcd48 | ||
|
|
c9b3e2b156 | ||
|
|
ace6012c1c | ||
|
|
17901fbf3d | ||
|
|
2c7b5578e7 | ||
|
|
b2b7d18802 | ||
|
|
965da0535a | ||
|
|
ebd187ec06 | ||
|
|
b495fb7a37 | ||
|
|
58e5125cde | ||
|
|
dadfbd2ddb | ||
|
|
9fdeec6128 | ||
|
|
e783aeab66 | ||
|
|
53a94cc7bb | ||
|
|
839a9b6cb8 | ||
|
|
2557d77ae3 | ||
|
|
6a7df2f1ae | ||
|
|
2db83b3892 | ||
|
|
08c7cc0918 | ||
|
|
d555dcb6d7 | ||
|
|
7226f25c67 | ||
|
|
77a3be6fd7 | ||
|
|
2397df7f22 | ||
|
|
118d2c7273 | ||
|
|
b44d2b1bb3 | ||
|
|
9867d88067 | ||
|
|
037c49e2c6 | ||
|
|
1e989060f9 | ||
|
|
4d6271c161 | ||
|
|
c3900f6984 | ||
|
|
aa1a036f66 | ||
|
|
26274e6c5d | ||
|
|
bcfbe5a284 | ||
|
|
496243fbc7 | ||
|
|
036ffe595a | ||
|
|
2a903e9f03 | ||
|
|
36e5bbb752 | ||
|
|
96a976d826 | ||
|
|
ff514a0568 | ||
|
|
a4d99b78d5 | ||
|
|
029c69ecd3 | ||
|
|
9e1f04e476 | ||
|
|
c8bde41451 | ||
|
|
e16c01623d | ||
|
|
7de294a58e | ||
|
|
060343f096 | ||
|
|
addba0d007 | ||
|
|
68418f2c8f | ||
|
|
428dd17d54 | ||
|
|
7344b41f47 | ||
|
|
5f003b0dd7 | ||
|
|
b8f454b8ac | ||
|
|
b45e03a45a | ||
|
|
0a268f35bc | ||
|
|
e3709533b4 | ||
|
|
acc8d5f7b2 | ||
|
|
da06a96630 | ||
|
|
7eaf8cfd2f | ||
|
|
5248c8f78d | ||
|
|
f4365dbd3a | ||
|
|
2309b16bd4 | ||
|
|
c65af61a68 | ||
|
|
a48e9bc64c | ||
|
|
b4984d7f2d | ||
|
|
1017d62f0d | ||
|
|
ebc208cacd | ||
|
|
0236c8e7f8 | ||
|
|
db8a92f5c2 | ||
|
|
c1e5408492 | ||
|
|
84890eb1b4 | ||
|
|
220685a522 | ||
|
|
8ebf5dbcb4 | ||
|
|
dad807d62d | ||
|
|
8e52ffa30e | ||
|
|
18970ff0b9 | ||
|
|
630698459b | ||
|
|
f8e854a087 | ||
|
|
3b2274b0aa | ||
|
|
0d1ebce1a1 | ||
|
|
70d86ce9a2 | ||
|
|
291f591af3 | ||
|
|
5a48c52a95 | ||
|
|
5625ef956d | ||
|
|
969733ab77 | ||
|
|
12a1ac1a7d | ||
|
|
4da322a03f | ||
|
|
d5754c00e2 | ||
|
|
2e9b5f3a2b | ||
|
|
b11a8e9c0c | ||
|
|
e37533afbb | ||
|
|
4a476673ac | ||
|
|
fe5386cc08 | ||
|
|
8bfb1a9d39 | ||
|
|
109aafcbc0 | ||
|
|
e289c06d8d | ||
|
|
78c1c318c5 | ||
|
|
07983d75ea | ||
|
|
d0a4a4242d | ||
|
|
a71be2b193 | ||
|
|
779ca13d48 | ||
|
|
f3b0a50db7 | ||
|
|
c831596e02 | ||
|
|
2ae369fbdb | ||
|
|
f2c9d968a4 | ||
|
|
c3f02980a0 | ||
|
|
7d5ce7b5d7 | ||
|
|
8bb71eeb51 | ||
|
|
5a88598811 | ||
|
|
da3fbd386d | ||
|
|
1e915aad20 | ||
|
|
889d5e5b28 | ||
|
|
51cf2df2f8 | ||
|
|
e690285d9d | ||
|
|
81d6423f24 | ||
|
|
046dee7389 | ||
|
|
a33a24dddf | ||
|
|
636bdbd12c | ||
|
|
0ab3492afd | ||
|
|
666ae11639 | ||
|
|
826856c390 | ||
|
|
a764a481f3 | ||
|
|
e345090015 | ||
|
|
cc97198fe4 | ||
|
|
5a146e34fa | ||
|
|
70838c3e24 | ||
|
|
2dd71cbe26 | ||
|
|
32c013a72c | ||
|
|
db6e1ae558 | ||
|
|
4117da6e93 | ||
|
|
02b1ba03ed | ||
|
|
1f501f4553 | ||
|
|
0205d0afb5 | ||
|
|
ccf9bf4613 | ||
|
|
d4704e39ac | ||
|
|
4a82abc19b | ||
|
|
3ae32ab0a0 | ||
|
|
1cc6a108a7 | ||
|
|
d4ffe53dbd | ||
|
|
f43b3508e9 | ||
|
|
ea0c326d3d | ||
|
|
4843480fbf | ||
|
|
930e14e258 | ||
|
|
87bbb41fb6 | ||
|
|
e767f68f89 | ||
|
|
b4d304c21e | ||
|
|
db1f412dae | ||
|
|
a73f5e83ec | ||
|
|
49b2e98a8f | ||
|
|
b3a16fd0ce | ||
|
|
dd6735ec04 | ||
|
|
9ebf1436d2 | ||
|
|
0aa71b5237 | ||
|
|
7ef2d52efd | ||
|
|
a5c6dfe62b | ||
|
|
4a606e0cb2 | ||
|
|
27370c655d | ||
|
|
887f4e8985 | ||
|
|
c91c4b01f9 | ||
|
|
5f198dba08 | ||
|
|
67f9a7f5e4 | ||
|
|
62404721ed | ||
|
|
6d37329e74 | ||
|
|
0c316d3225 | ||
|
|
131644477d | ||
|
|
b964dd0895 | ||
|
|
7dd32ed44b | ||
|
|
0b6aedfc93 | ||
|
|
b692088c94 | ||
|
|
160ab8d0ae | ||
|
|
a599cb436a | ||
|
|
294aa81298 | ||
|
|
ddc4b3dd6e | ||
|
|
4c5bf3ad2b | ||
|
|
88c33214c6 | ||
|
|
393be65aa6 | ||
|
|
9ce9a1598f | ||
|
|
d9079fe18e | ||
|
|
3cde070d3b | ||
|
|
b2a5f65a77 | ||
|
|
69dff5a2cb | ||
|
|
40e0d5cfbf | ||
|
|
5a0100757f | ||
|
|
f9fe88898d | ||
|
|
a2d6955f79 | ||
|
|
8fa247145e | ||
|
|
04bb65dcf7 | ||
|
|
e4884c7835 | ||
|
|
8b9ce3e8de | ||
|
|
327a5f5fae | ||
|
|
50b971477b | ||
|
|
07c7eea2df | ||
|
|
42135d3e53 | ||
|
|
d74e5e6457 | ||
|
|
a2c7377134 | ||
|
|
0e54393d5a | ||
|
|
8cf8cefc92 | ||
|
|
098c40e9ac | ||
|
|
80c1c4c6c8 | ||
|
|
ef8afab7e8 | ||
|
|
84e0e08aec | ||
|
|
2fce771214 | ||
|
|
15929e8cf2 | ||
|
|
f1c8ec141a | ||
|
|
a62393e0ed | ||
|
|
a6defd9b62 | ||
|
|
374212beaa | ||
|
|
5132e62045 | ||
|
|
9504ede1f3 | ||
|
|
afb6e6b5ba | ||
|
|
60b2b92803 | ||
|
|
6113311fda | ||
|
|
ecac6201d0 | ||
|
|
90d8c37f91 | ||
|
|
c43085beab | ||
|
|
d9c383b2ef | ||
|
|
100938b0e5 | ||
|
|
83a6ee0a22 | ||
|
|
0dab7f02ed | ||
|
|
0e6f2eb1cd | ||
|
|
9a371f8998 | ||
|
|
8a7bbd1795 | ||
|
|
d1fef24723 | ||
|
|
3ddc5e7846 | ||
|
|
b439ea45ec | ||
|
|
5680785f86 | ||
|
|
e8eb7bec1b | ||
|
|
565b7404f9 | ||
|
|
9cffe4d476 | ||
|
|
43be88a37c | ||
|
|
ea67859de7 | ||
|
|
c8986464ec | ||
|
|
7804f94d8b | ||
|
|
bfa77aebfc | ||
|
|
487fb02313 | ||
|
|
ef64038107 | ||
|
|
5d336accbc | ||
|
|
99047b2866 | ||
|
|
f611cf3b5a | ||
|
|
4ad059605c | ||
|
|
dc2ff97dd8 | ||
|
|
2b5265c103 | ||
|
|
2e98fde053 | ||
|
|
d5176e0eb7 | ||
|
|
eb0b2a847b | ||
|
|
cff5482f69 | ||
|
|
afc37973d0 | ||
|
|
3eada6c6ab | ||
|
|
7c39268fe5 | ||
|
|
eb67b299de | ||
|
|
3e7a09c1e3 | ||
|
|
637dc9b9b2 | ||
|
|
1de16d4715 | ||
|
|
49090d774d | ||
|
|
9a695b5cdd | ||
|
|
e0339b50c0 | ||
|
|
d0c584672f | ||
|
|
27816acaeb | ||
|
|
4de3cc8a09 | ||
|
|
5c16ceb2fa | ||
|
|
9db3f73413 | ||
|
|
e0ceddce09 | ||
|
|
6dc4096299 | ||
|
|
1fa03b5c74 | ||
|
|
f8f57a93c3 | ||
|
|
960fe63312 | ||
|
|
7545b94128 | ||
|
|
1263a27c1c | ||
|
|
e1c084d365 | ||
|
|
7465ec0bbd | ||
|
|
17ed57836f | ||
|
|
d0acb51fd7 | ||
|
|
71c1ed6c49 | ||
|
|
bfb68254a4 | ||
|
|
18f7662209 | ||
|
|
a0d84f383c | ||
|
|
1f447ae681 | ||
|
|
8bd6691331 | ||
|
|
42afcf9322 | ||
|
|
3d3694bb8d | ||
|
|
589b913960 | ||
|
|
7ba4f42494 | ||
|
|
c96118d2b5 | ||
|
|
0285d8cd38 | ||
|
|
ee87604a4d | ||
|
|
2235ebaf20 | ||
|
|
954d0d954f | ||
|
|
e31747d087 | ||
|
|
fc581253a4 | ||
|
|
47c4609f23 | ||
|
|
2d52bc2a49 | ||
|
|
5367101330 | ||
|
|
db145b4999 | ||
|
|
7f950ddb80 | ||
|
|
50e2251e74 | ||
|
|
33d5455b6f | ||
|
|
ac018500cd | ||
|
|
3e661db283 | ||
|
|
18fb78b3ec | ||
|
|
58ff13d399 | ||
|
|
0ac0175bb1 | ||
|
|
f39007cd2d | ||
|
|
2349aa4df8 | ||
|
|
a93a173183 | ||
|
|
42e55dd2dd | ||
|
|
ca3146d38f | ||
|
|
7f6cd514a5 | ||
|
|
88e24e92b5 | ||
|
|
8b447e361f | ||
|
|
a92dd2d4e4 | ||
|
|
852ec44567 | ||
|
|
b6e32cdeb4 | ||
|
|
4bd264d9be | ||
|
|
4a4b8574d0 | ||
|
|
ded073edd9 | ||
|
|
568f95e7a3 | ||
|
|
5adcabc8de | ||
|
|
e3bce7172c | ||
|
|
96fb618390 | ||
|
|
2d4fdcb661 | ||
|
|
7a84cff5b4 | ||
|
|
2af627b704 | ||
|
|
77fdf18686 | ||
|
|
944a77fe42 | ||
|
|
049678b32e | ||
|
|
3325e4d854 | ||
|
|
1e90e88d4b | ||
|
|
8aeb33c98c | ||
|
|
3b08721835 | ||
|
|
5a30878599 | ||
|
|
c8a8935db0 | ||
|
|
ec196f57bb | ||
|
|
f7809ec3a7 | ||
|
|
71d3ec3616 | ||
|
|
4a7cf8d870 | ||
|
|
4bf8836c0a | ||
|
|
1ca36ee29c | ||
|
|
3446ff88cf | ||
|
|
de5a91a13f | ||
|
|
814cd73019 | ||
|
|
c21611661b | ||
|
|
8f817ce689 | ||
|
|
971b5111e7 | ||
|
|
07069a64ae | ||
|
|
6acea51f12 | ||
|
|
7aa2dab307 | ||
|
|
3091be8f67 | ||
|
|
487531cc52 | ||
|
|
58bfcb4273 | ||
|
|
8d8be27f22 | ||
|
|
27a978cba5 | ||
|
|
71b4e6afa4 | ||
|
|
e1f3b19c0c | ||
|
|
649c2aa5a6 | ||
|
|
cac8cc99e1 | ||
|
|
cb162b16f2 | ||
|
|
86e54ce145 | ||
|
|
efd809971f | ||
|
|
38ae14cc4d | ||
|
|
c7e33a90fe | ||
|
|
5add835750 | ||
|
|
734c614cba | ||
|
|
f6b347fa62 | ||
|
|
08d2f3125e | ||
|
|
385c48dcad | ||
|
|
0926057bfe | ||
|
|
6912e3893e | ||
|
|
d3052657df | ||
|
|
a5ca4d8edf | ||
|
|
afb1ebebd5 | ||
|
|
a04a9eb5ad | ||
|
|
027badd21f | ||
|
|
1affc760e6 | ||
|
|
3ca72b7398 | ||
|
|
702dbddd78 | ||
|
|
8fbecc0227 | ||
|
|
421271acfa | ||
|
|
98af76b3ac | ||
|
|
3952fdbe2d | ||
|
|
bc13beaa85 | ||
|
|
59b2e706ca | ||
|
|
8bf835c531 | ||
|
|
087ed7c132 | ||
|
|
4c075df327 | ||
|
|
9ea8baca05 | ||
|
|
9b6784720e | ||
|
|
3761e1dd60 | ||
|
|
b3eb809550 | ||
|
|
cb72865dcc | ||
|
|
d646b4729b | ||
|
|
a2dd903d0d | ||
|
|
28ed378ee7 | ||
|
|
15ae55136f | ||
|
|
b18abd954f | ||
|
|
b45f79a1f8 | ||
|
|
01a03b4c84 | ||
|
|
e48328af34 | ||
|
|
8925d44807 | ||
|
|
213283510f | ||
|
|
9f8190dc28 | ||
|
|
c32d4ee2f7 | ||
|
|
2c867a4b2c | ||
|
|
da5194bdcb | ||
|
|
bbb27aed10 | ||
|
|
c02fbaeae7 | ||
|
|
847218da73 | ||
|
|
90dc788893 | ||
|
|
f3525cc555 | ||
|
|
198f243181 | ||
|
|
8e049f4af5 | ||
|
|
ff465a59b6 | ||
|
|
68b4f3ca04 | ||
|
|
6b31f2b3f2 | ||
|
|
63cf0f1548 | ||
|
|
e607f68b3e | ||
|
|
db3bb82dbd | ||
|
|
5889c600fa | ||
|
|
d7d4c7236c | ||
|
|
f54d8ce36f | ||
|
|
43faa13cb5 | ||
|
|
85a2d994f3 | ||
|
|
d8cd78cd6b | ||
|
|
3e59a5bcd2 | ||
|
|
0efb89d6ff | ||
|
|
6697c075cb | ||
|
|
06660160e7 | ||
|
|
0b571737b7 | ||
|
|
0a486a280d | ||
|
|
bd53e685d0 | ||
|
|
a2bbf3f44e | ||
|
|
410bb62906 | ||
|
|
cbb4ac3e20 | ||
|
|
7508192ab9 | ||
|
|
bbf6cbd8fb | ||
|
|
9765269d27 | ||
|
|
61746b7ff7 | ||
|
|
e6066c2cb5 | ||
|
|
633a918590 | ||
|
|
71c14a0837 | ||
|
|
9bbed2c275 | ||
|
|
d9ba4d9130 | ||
|
|
ecd40de7ec | ||
|
|
e2bd6c06ec | ||
|
|
a26be76d79 | ||
|
|
3b68c1eb69 | ||
|
|
f7879bdbf9 | ||
|
|
dbb0fc519f | ||
|
|
b931ccfabf | ||
|
|
eeab048f46 | ||
|
|
5da89ac05b | ||
|
|
e2b446be1c | ||
|
|
5f2e17a738 | ||
|
|
399d6d0045 | ||
|
|
f36f3ffd21 | ||
|
|
3c785ae7d8 | ||
|
|
00cd772cbc | ||
|
|
d434724a54 | ||
|
|
b6c9a3bb89 | ||
|
|
fc3bf45a7f | ||
|
|
cbf6c06e4b | ||
|
|
cff21124da | ||
|
|
ce7893c2e5 | ||
|
|
f7dcaa38ff | ||
|
|
8ce1013a26 | ||
|
|
114d67b408 | ||
|
|
56c2d16560 | ||
|
|
2238c42432 | ||
|
|
64f6cf6747 | ||
|
|
c0e9f1ca43 | ||
|
|
7f66087d8c | ||
|
|
18671b7cca | ||
|
|
233156c744 | ||
|
|
ac0ffab99c | ||
|
|
5e964d2105 | ||
|
|
59e7a5fa4b | ||
|
|
8452f577d2 | ||
|
|
726eb8d0e1 | ||
|
|
2c0d6b93ee | ||
|
|
98d06b2892 | ||
|
|
533f2734f1 | ||
|
|
856c19fa17 | ||
|
|
3237507bb2 | ||
|
|
ff5a248240 | ||
|
|
fc3bdc9037 | ||
|
|
533c0bf0b1 | ||
|
|
afb6862035 | ||
|
|
92d9d04a78 | ||
|
|
0704e5ee67 | ||
|
|
7dfcd89a04 | ||
|
|
2859bee4c0 | ||
|
|
724c49f5c4 | ||
|
|
48c4a473df | ||
|
|
3d39272536 | ||
|
|
0a63966cbd | ||
|
|
89e959c2e3 | ||
|
|
c56dd2cdbd | ||
|
|
363f28a46b | ||
|
|
5549f51a13 | ||
|
|
972f857c71 | ||
|
|
d2eb1488fd | ||
|
|
82486ee22e | ||
|
|
29cc57f52a | ||
|
|
f7d92caae5 | ||
|
|
201174e293 | ||
|
|
dc2f6235a1 | ||
|
|
0824c779db | ||
|
|
e002ad3b6a | ||
|
|
8a570069f8 | ||
|
|
bfe44c1621 | ||
|
|
b17882a1c1 | ||
|
|
f309979126 | ||
|
|
5a0490e81f | ||
|
|
2c007115f7 | ||
|
|
508e4eac61 | ||
|
|
ac47fb84a8 | ||
|
|
7ba14a3925 | ||
|
|
67514ccc5f | ||
|
|
6ee3886ecf | ||
|
|
76282ed1ef | ||
|
|
fd1d807012 | ||
|
|
906c4c7f39 | ||
|
|
bfa9e8c495 | ||
|
|
425eecf692 | ||
|
|
ac1f7542a9 | ||
|
|
225d168fdd | ||
|
|
e073b2cf42 | ||
|
|
1cb366d822 | ||
|
|
c9c8e30ced | ||
|
|
c50941ac7d | ||
|
|
58f950ffbd | ||
|
|
a1341ba503 | ||
|
|
620f4a8bfb | ||
|
|
668e43f57c | ||
|
|
7f11d44130 | ||
|
|
5c77e752f6 | ||
|
|
6d260c195f | ||
|
|
fdfecbb3f7 | ||
|
|
1d8132bcaa | ||
|
|
5f1bde5885 | ||
|
|
0adb025573 | ||
|
|
f8e7623f23 | ||
|
|
9243cceb9a | ||
|
|
5a62035ed7 | ||
|
|
c3a81b5bf3 | ||
|
|
34f6811eea | ||
|
|
c800e70ec1 | ||
|
|
7aa2ee08bf | ||
|
|
933aa88dc7 | ||
|
|
4b79ecc3d9 | ||
|
|
0bd179c6ca | ||
|
|
70141bd049 | ||
|
|
65cc585697 | ||
|
|
bd39468b96 | ||
|
|
dad831bc8c | ||
|
|
8a8745701b | ||
|
|
48b899b5d0 | ||
|
|
210447cd37 | ||
|
|
e672fbf6e2 | ||
|
|
004464c699 | ||
|
|
6f39a37656 | ||
|
|
b097b54792 | ||
|
|
0693080630 | ||
|
|
75d27837c2 | ||
|
|
597f29e90a | ||
|
|
a77bb50b9e | ||
|
|
3f84e8e652 | ||
|
|
1df7f25cad | ||
|
|
a0c30517bd | ||
|
|
dc36a9c3e7 | ||
|
|
0e61ad27da | ||
|
|
b3009c3366 | ||
|
|
810073a79b | ||
|
|
79c69d03fa | ||
|
|
22996da737 | ||
|
|
82d0b6c9f0 | ||
|
|
77c997b91e | ||
|
|
bb5d52d72c | ||
|
|
1474bab34a | ||
|
|
05f6f4ea5b | ||
|
|
05feb39501 | ||
|
|
ce92c3329b | ||
|
|
216b6eecc0 | ||
|
|
c0917e9276 | ||
|
|
0bbcbf0d2d | ||
|
|
9b998e3fca | ||
|
|
d7d65cdf21 | ||
|
|
27925289d4 | ||
|
|
03ea265bab | ||
|
|
917f9eead3 | ||
|
|
08f2e72af8 | ||
|
|
a2fb0ec029 | ||
|
|
084042ad13 | ||
|
|
8da3defe24 | ||
|
|
58f9cd32a5 | ||
|
|
f7abf5a2d5 | ||
|
|
c8c6d072f6 | ||
|
|
4d9cc604b9 | ||
|
|
1dc76fa171 | ||
|
|
1d37b9ae9c | ||
|
|
26828602a8 | ||
|
|
e253f3ac89 | ||
|
|
4d59fdea1b | ||
|
|
98a313eb5b | ||
|
|
77e1cd8b32 | ||
|
|
dede5c5ef5 | ||
|
|
d156c0be3d | ||
|
|
dc0bc6e606 | ||
|
|
05040425df | ||
|
|
36f7c283b8 | ||
|
|
9fe4237033 | ||
|
|
b03c0a3e2d | ||
|
|
87946996ed | ||
|
|
cc55023440 | ||
|
|
1f19dfc50d | ||
|
|
950a440350 | ||
|
|
c92b88bfaf | ||
|
|
10875f26dc | ||
|
|
d62e809c18 | ||
|
|
d85bf4f6dd | ||
|
|
801e201cc3 | ||
|
|
e18e0da0c1 | ||
|
|
d046b0a412 | ||
|
|
72084b8fc1 | ||
|
|
2639b2bd2c | ||
|
|
82aa493dfd | ||
|
|
6c3c7c40b5 | ||
|
|
5616751c04 | ||
|
|
7d898ca34d | ||
|
|
e26556b21a | ||
|
|
89e6d363e2 | ||
|
|
c559ac7be9 | ||
|
|
b3fbe47f0a | ||
|
|
c73af4c480 | ||
|
|
8887fe1eac | ||
|
|
ed861a6c96 | ||
|
|
e63bb6a8ec | ||
|
|
8ec09d25ce | ||
|
|
a9a01ae479 | ||
|
|
31a3864789 | ||
|
|
a5c537197c | ||
|
|
4ea13bdbc0 | ||
|
|
b06ddf2dc7 | ||
|
|
2c45ac9df3 | ||
|
|
7735f68502 | ||
|
|
ffb0f5a1c7 | ||
|
|
80c7f9e855 | ||
|
|
709ef4e39f | ||
|
|
4ceb869420 | ||
|
|
432a209184 | ||
|
|
8444271c58 | ||
|
|
2bc97c23d4 | ||
|
|
9ea02bf125 | ||
|
|
2b4de52af4 | ||
|
|
d3492ebf2f | ||
|
|
ff8698f619 | ||
|
|
16bc218ea7 | ||
|
|
72d2920dc3 | ||
|
|
fb8de0d753 | ||
|
|
352afc9827 | ||
|
|
ce699a1c84 | ||
|
|
cde20d338e | ||
|
|
8ab22e9cc8 | ||
|
|
0f2442a7a5 | ||
|
|
ba91140ea5 | ||
|
|
10f05e75ce | ||
|
|
287811f4ab | ||
|
|
a68462c7cb | ||
|
|
005c28dd3a | ||
|
|
197e1c651f | ||
|
|
c01da0f263 | ||
|
|
81ff542d0b | ||
|
|
efee27559b | ||
|
|
dc5408f874 | ||
|
|
7cf9217158 | ||
|
|
401fc8161a | ||
|
|
be2f9a6099 | ||
|
|
21989aa88e | ||
|
|
461d041a50 | ||
|
|
de8662c52f | ||
|
|
0dbbbad370 | ||
|
|
2e05c0a7d9 | ||
|
|
f12f1cb392 | ||
|
|
b6891850a7 | ||
|
|
f147d799e0 | ||
|
|
534bbe9b9a | ||
|
|
b7f4f6af3a | ||
|
|
ac96919caf | ||
|
|
05cf06656d | ||
|
|
1356f0bcf6 | ||
|
|
ce0c955c29 | ||
|
|
0e7f89169e | ||
|
|
81329fa7fa | ||
|
|
3763278366 | ||
|
|
8600dbb04e | ||
|
|
b27f69aace | ||
|
|
8e0c19fc8d | ||
|
|
54ee1c23f0 | ||
|
|
39b33160c2 | ||
|
|
d94f86b44a | ||
|
|
4ae0daa17f | ||
|
|
8d548413bd | ||
|
|
f2e7a99b1e | ||
|
|
a8c31f68b3 | ||
|
|
db49b42e4a | ||
|
|
e77c2fc9bb | ||
|
|
5197ef591a | ||
|
|
898f8ec006 | ||
|
|
37ff96ba95 | ||
|
|
fa961832f3 | ||
|
|
b66ac2781c | ||
|
|
86a0f2d4a7 | ||
|
|
f5e2a67924 | ||
|
|
45cf626230 | ||
|
|
9717b7516d | ||
|
|
b92c23df2b | ||
|
|
df617f19e0 | ||
|
|
fb565c2548 | ||
|
|
2bfc3a6c85 | ||
|
|
4ab5d84b94 | ||
|
|
154213b705 | ||
|
|
4cce29ea9d | ||
|
|
9d5d00aa8f | ||
|
|
70d47c1757 | ||
|
|
befa34790f | ||
|
|
84da9d289b | ||
|
|
7a30d535e8 | ||
|
|
199701d26b | ||
|
|
3ac2cfa528 | ||
|
|
78d68aa1b9 | ||
|
|
8042b78f1e | ||
|
|
000d064276 | ||
|
|
600a78f35f | ||
|
|
6f5e4c30dc | ||
|
|
8e7457911e | ||
|
|
43b3207937 | ||
|
|
22f2151c21 | ||
|
|
7c744f2307 | ||
|
|
08d57fed86 | ||
|
|
6e8a0fe0ef | ||
|
|
6668ec4b5d | ||
|
|
08a8288293 | ||
|
|
3001640eec | ||
|
|
efa3658ced | ||
|
|
92bc253cf7 | ||
|
|
a190190843 | ||
|
|
9c40bd1a23 | ||
|
|
dc2193138d | ||
|
|
033c8cb8b1 | ||
|
|
21c4429c6e | ||
|
|
348a96b033 | ||
|
|
0c930d7c0f | ||
|
|
98aca2b988 | ||
|
|
8d7f497e0c | ||
|
|
1b6328b451 | ||
|
|
d10e08e63e | ||
|
|
a8f21b56f0 | ||
|
|
173842510c | ||
|
|
19c08fe0eb | ||
|
|
db817a7192 | ||
|
|
2c8e93cc96 | ||
|
|
44e9a97f09 | ||
|
|
298ddc4195 | ||
|
|
d9134d6085 | ||
|
|
b17b4ce880 | ||
|
|
2304c32453 | ||
|
|
2b68e4a7df | ||
|
|
8f06e72318 | ||
|
|
5fa740ead4 | ||
|
|
e5096e61e5 | ||
|
|
2a3195636e | ||
|
|
5fb9b8ccd3 | ||
|
|
7089e2299a | ||
|
|
b553cbb68c | ||
|
|
c712411e77 | ||
|
|
48d5cc554c | ||
|
|
39bfd69dc9 | ||
|
|
d690b80493 | ||
|
|
eb48a9f993 | ||
|
|
5a54abaf44 | ||
|
|
47c161f9f1 | ||
|
|
807f8e68f3 | ||
|
|
fba8536c33 | ||
|
|
36fc1bb71a | ||
|
|
ccaa96c81e | ||
|
|
ac2f279c88 | ||
|
|
91cb99b8c8 | ||
|
|
02b1a525e3 | ||
|
|
9bf4a4b18c | ||
|
|
8a01553c49 | ||
|
|
21b913845f | ||
|
|
220e4feb1d | ||
|
|
13884c0457 | ||
|
|
b3bb6ebc6e | ||
|
|
424eb90dd8 | ||
|
|
df804d0729 | ||
|
|
79269cdfd5 | ||
|
|
2a650d4d74 | ||
|
|
017b4ecdb3 | ||
|
|
9c84bf3fd5 | ||
|
|
397b54a8c3 | ||
|
|
cb3604c0a1 | ||
|
|
1a7f0673ea | ||
|
|
0d043207b9 | ||
|
|
f995dea971 | ||
|
|
49e20488bc | ||
|
|
3e47b27192 | ||
|
|
f4fa18ec05 | ||
|
|
c6d1fa2b7d | ||
|
|
c4df7667ff | ||
|
|
6a303cfa25 | ||
|
|
4ffa5cc1da | ||
|
|
172e1cf3bf | ||
|
|
e6a32e52f5 | ||
|
|
d2b6f6844d | ||
|
|
e9ef95ef1f | ||
|
|
10eeb5374f | ||
|
|
332951bc8e | ||
|
|
4daf3280ff | ||
|
|
87bb2c74d9 | ||
|
|
ba011853a0 | ||
|
|
461a158ac3 | ||
|
|
85f59f1103 | ||
|
|
335b9f445f | ||
|
|
7cda45c904 | ||
|
|
4159fdc1a3 | ||
|
|
190da30979 | ||
|
|
ed9c74b900 | ||
|
|
6783766c33 | ||
|
|
b27018b379 | ||
|
|
021d07e04a | ||
|
|
bf0baec392 | ||
|
|
923cbac400 | ||
|
|
ab938f2536 | ||
|
|
a55b1804e9 | ||
|
|
4bfa6b3a5d | ||
|
|
d20f24be18 | ||
|
|
8a17bae7a6 | ||
|
|
d14c73fad5 | ||
|
|
ce878e1def | ||
|
|
a64a0d1db6 | ||
|
|
feab43f16d | ||
|
|
0d60fe775f | ||
|
|
6680be6a73 | ||
|
|
e026ab85a7 | ||
|
|
e53c903205 | ||
|
|
03dbe8565f | ||
|
|
708793cb23 | ||
|
|
43ae4fb0aa | ||
|
|
6b1d552277 | ||
|
|
f24f576b72 | ||
|
|
c23328564f | ||
|
|
cd6dd3dafa | ||
|
|
4081e15bef | ||
|
|
b05e3813d1 | ||
|
|
3048311f40 | ||
|
|
1045392d91 | ||
|
|
7b23ca8ee7 | ||
|
|
4d67eca8bb | ||
|
|
74c4b7311e | ||
|
|
713c74adfd | ||
|
|
408a8a6f19 | ||
|
|
e1485e49d3 | ||
|
|
30b66934cd | ||
|
|
fd49c081c2 | ||
|
|
1327120024 | ||
|
|
d2b5043972 | ||
|
|
a0e55ea3fd | ||
|
|
1f32de29c1 | ||
|
|
12be06d682 | ||
|
|
27ca9b13f8 | ||
|
|
be45905830 | ||
|
|
05d0a89655 | ||
|
|
3ba575dcd0 | ||
|
|
3e200b7f0f | ||
|
|
cbce1f7008 | ||
|
|
e99101447e | ||
|
|
0ddb326e44 | ||
|
|
460446a15c | ||
|
|
4eea24997f | ||
|
|
0b1e9c7c66 | ||
|
|
d51a7a9eb7 | ||
|
|
0f0b959e14 | ||
|
|
b2ceb09e4d | ||
|
|
53953f5cda | ||
|
|
fbd5e819a2 | ||
|
|
bdc391d376 | ||
|
|
6b618fb121 | ||
|
|
1f3e59c9f9 | ||
|
|
1956078c8c | ||
|
|
11230f59fc | ||
|
|
21bad7a01f | ||
|
|
6f9a27ecc7 | ||
|
|
c504113d13 | ||
|
|
c92ff60592 | ||
|
|
e9013d1a2a | ||
|
|
9c4580fe40 | ||
|
|
cb060cb5db | ||
|
|
6c3d85cc45 | ||
|
|
14ae89e87c | ||
|
|
24c48f025d | ||
|
|
f0a556f004 | ||
|
|
fd4d6abb4d | ||
|
|
41cc839380 | ||
|
|
c2a4380b96 | ||
|
|
6f402ac79f | ||
|
|
bf7c1306b1 | ||
|
|
c1509cf09d | ||
|
|
014bca031c | ||
|
|
4f864fd5bd | ||
|
|
2da67567e4 | ||
|
|
5b19d2b1fc | ||
|
|
a6837dcd40 | ||
|
|
af80751a1f | ||
|
|
dd02597c3b | ||
|
|
2926a3cbd8 | ||
|
|
b02bb3bfd4 | ||
|
|
67a4683bb1 | ||
|
|
9baee1c22c | ||
|
|
8cb67b4f9d | ||
|
|
0cd47bc328 | ||
|
|
07fb58d5e1 | ||
|
|
2d80d5e611 | ||
|
|
4bd63b615b | ||
|
|
335f667507 | ||
|
|
1819036d7d | ||
|
|
4f76f116ac | ||
|
|
1eba7c7d2a | ||
|
|
83234dd52c | ||
|
|
bae23b7fce | ||
|
|
3db61eaa82 | ||
|
|
5cf85a0361 | ||
|
|
ffe27f5bde | ||
|
|
78bcd9d54c | ||
|
|
1a9797f0ff | ||
|
|
0de94ff8a4 | ||
|
|
472233d9a7 | ||
|
|
f69e31b0d5 | ||
|
|
60b696cc31 | ||
|
|
549037f744 | ||
|
|
ca5e1e6133 | ||
|
|
3e3ff163db | ||
|
|
ca755365ce | ||
|
|
ea979de19f | ||
|
|
473ddfcdf1 | ||
|
|
a627285a4c | ||
|
|
322847469d | ||
|
|
6c5fac997f | ||
|
|
1871fd383e | ||
|
|
f5b147ca4b | ||
|
|
9d2b206156 | ||
|
|
a372c76e07 | ||
|
|
b1ce07d3ae | ||
|
|
bc09fb30d8 | ||
|
|
c13f219318 | ||
|
|
6b018c5d06 | ||
|
|
e69158d9b2 | ||
|
|
520cfb780a | ||
|
|
e686fed209 | ||
|
|
80ab19ac23 | ||
|
|
25228fa58e | ||
|
|
676d35090f | ||
|
|
e1a36a356c | ||
|
|
3274c0b734 | ||
|
|
9c95e1289f | ||
|
|
ef29871b62 | ||
|
|
a2a87f8d2b | ||
|
|
83c01c6bcb | ||
|
|
c1d850804c | ||
|
|
6590d5f58a | ||
|
|
a225925bc4 | ||
|
|
ab39f1f44f | ||
|
|
8d89364d72 | ||
|
|
af2bc859d1 | ||
|
|
8e72fdaa52 | ||
|
|
e9661f90d0 | ||
|
|
30b111034d | ||
|
|
df18359309 | ||
|
|
03857e0afd | ||
|
|
eaf1e08752 | ||
|
|
d39ceffa94 | ||
|
|
406b171c66 | ||
|
|
6d89b9e203 | ||
|
|
733bb69d25 | ||
|
|
4609694141 | ||
|
|
3be0c5130a | ||
|
|
e50b512580 | ||
|
|
eb62d054de | ||
|
|
e870a309c0 | ||
|
|
3afd3b0ff3 | ||
|
|
e3a2ed95d4 | ||
|
|
20c4f085c8 | ||
|
|
02af7e9299 | ||
|
|
0ae9b36d93 | ||
|
|
2bbb2842e5 | ||
|
|
a5b4eeb932 | ||
|
|
44de602e52 | ||
|
|
63fb4e2827 | ||
|
|
0a839c7321 | ||
|
|
e9747a61ac | ||
|
|
43c3bf4d24 | ||
|
|
0bf642d200 | ||
|
|
b2b69376c4 | ||
|
|
38ad60478c | ||
|
|
cf6a7198f9 | ||
|
|
ac8a926a70 | ||
|
|
aef7244939 | ||
|
|
628e2adc64 | ||
|
|
0c58f09e59 | ||
|
|
e3baf5c443 | ||
|
|
f70bf590cd | ||
|
|
473a414bc3 | ||
|
|
9ad4ec6464 | ||
|
|
a15c315a1c | ||
|
|
58036bb364 |
19
.eslintrc
19
.eslintrc
@@ -1,19 +0,0 @@
|
|||||||
{
|
|
||||||
"env": {
|
|
||||||
"node": true,
|
|
||||||
"es6": true
|
|
||||||
},
|
|
||||||
"rules": {
|
|
||||||
"no-console": 0,
|
|
||||||
"no-cond-assign": 0,
|
|
||||||
"no-unused-vars": 1,
|
|
||||||
"no-extra-semi": "warn",
|
|
||||||
"semi": "warn"
|
|
||||||
},
|
|
||||||
"extends": "eslint:recommended",
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaFeatures": {
|
|
||||||
"experimentalObjectRestSpread": true
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
20
.eslintrc.json
Normal file
20
.eslintrc.json
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
{
|
||||||
|
"root": true,
|
||||||
|
"env": {
|
||||||
|
"node": true,
|
||||||
|
"es6": true
|
||||||
|
},
|
||||||
|
"rules": {
|
||||||
|
"no-console": 0,
|
||||||
|
"no-cond-assign": 0,
|
||||||
|
"no-unused-vars": 1,
|
||||||
|
"no-extra-semi": "warn",
|
||||||
|
"semi": "warn"
|
||||||
|
},
|
||||||
|
"extends": "eslint:recommended",
|
||||||
|
"parserOptions": {
|
||||||
|
"ecmaFeatures": {
|
||||||
|
"experimentalObjectRestSpread": true
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
9
.gitattributes
vendored
Normal file
9
.gitattributes
vendored
Normal file
@@ -0,0 +1,9 @@
|
|||||||
|
* text=auto
|
||||||
|
|
||||||
|
LICENSE.txt eol=crlf
|
||||||
|
ThirdPartyNotices.txt eol=crlf
|
||||||
|
|
||||||
|
*.bat eol=crlf
|
||||||
|
*.cmd eol=crlf
|
||||||
|
*.ps1 eol=lf
|
||||||
|
*.sh eol=lf
|
||||||
18
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
18
.github/ISSUE_TEMPLATE/bug_report.md
vendored
Normal file
@@ -0,0 +1,18 @@
|
|||||||
|
---
|
||||||
|
name: Bug report
|
||||||
|
about: Create a report to help us improve
|
||||||
|
title: ''
|
||||||
|
labels: ''
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
<!-- Please search existing issues to avoid creating duplicates. -->
|
||||||
|
<!-- Also please test using the latest insiders build to make sure your issue has not already been fixed. -->
|
||||||
|
|
||||||
|
<!-- Use Help > Report Issue to prefill these. -->
|
||||||
|
- Azure Data Studio Version:
|
||||||
|
|
||||||
|
Steps to Reproduce:
|
||||||
|
|
||||||
|
1.
|
||||||
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
20
.github/ISSUE_TEMPLATE/feature_request.md
vendored
Normal file
@@ -0,0 +1,20 @@
|
|||||||
|
---
|
||||||
|
name: Feature request
|
||||||
|
about: Suggest an idea for this project
|
||||||
|
title: ''
|
||||||
|
labels: feature request
|
||||||
|
assignees: ''
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
**Is your feature request related to a problem? Please describe.**
|
||||||
|
A clear and concise description of what the problem is. Ex. I'm always frustrated when [...]
|
||||||
|
|
||||||
|
**Describe the solution or feature you'd like**
|
||||||
|
A clear and concise description of what you want to happen.
|
||||||
|
|
||||||
|
**Describe alternatives you've considered**
|
||||||
|
A clear and concise description of any alternative solutions or features you've considered.
|
||||||
|
|
||||||
|
**Additional context**
|
||||||
|
Add any other context or screenshots about the feature request here.
|
||||||
49
.github/classifier.yml
vendored
Normal file
49
.github/classifier.yml
vendored
Normal file
@@ -0,0 +1,49 @@
|
|||||||
|
{
|
||||||
|
perform: true,
|
||||||
|
alwaysRequireAssignee: false,
|
||||||
|
labelsRequiringAssignee: [],
|
||||||
|
autoAssignees: {
|
||||||
|
accessibility: [],
|
||||||
|
acquisition: [],
|
||||||
|
agent: [],
|
||||||
|
azure: [],
|
||||||
|
backup: [],
|
||||||
|
bcdr: [],
|
||||||
|
'chart viewer': [],
|
||||||
|
connection: [],
|
||||||
|
dacfx: [],
|
||||||
|
dashboard: [],
|
||||||
|
'data explorer': [],
|
||||||
|
documentation: [],
|
||||||
|
'edit data': [],
|
||||||
|
export: [],
|
||||||
|
extensibility: [],
|
||||||
|
extensionManager: [],
|
||||||
|
globalization: [],
|
||||||
|
grid: [],
|
||||||
|
import: [],
|
||||||
|
insights: [],
|
||||||
|
intellisense: [],
|
||||||
|
localization: [],
|
||||||
|
'managed instance': [],
|
||||||
|
notebooks: [],
|
||||||
|
'object explorer': [],
|
||||||
|
performance: [],
|
||||||
|
profiler: [],
|
||||||
|
'query editor': [],
|
||||||
|
'query execution': [],
|
||||||
|
reliability: [],
|
||||||
|
restore: [],
|
||||||
|
scripting: [],
|
||||||
|
'server group': [],
|
||||||
|
settings: [],
|
||||||
|
setup: [],
|
||||||
|
shell: [],
|
||||||
|
showplan: [],
|
||||||
|
snippet: [],
|
||||||
|
sql2019Preview: [],
|
||||||
|
sqldw: [],
|
||||||
|
supportability: [],
|
||||||
|
ux: []
|
||||||
|
}
|
||||||
|
}
|
||||||
12
.github/commands.yml
vendored
Normal file
12
.github/commands.yml
vendored
Normal file
@@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
perform: false,
|
||||||
|
commands: [
|
||||||
|
{
|
||||||
|
type: 'label',
|
||||||
|
name: 'duplicate',
|
||||||
|
allowTriggerByBot: true,
|
||||||
|
action: 'close',
|
||||||
|
comment: "Thanks for creating this issue! We figured it's covering the same as another one we already have. Thus, we closed this one as a duplicate. You can search for existing issues [here](https://aka.ms/vscodeissuesearch). See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
5
.github/copycat.yml
vendored
Normal file
5
.github/copycat.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
perform: true,
|
||||||
|
target_owner: 'anthonydresser',
|
||||||
|
target_repo: 'testissues'
|
||||||
|
}
|
||||||
6
.github/locker.yml
vendored
Normal file
6
.github/locker.yml
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
daysAfterClose: 45,
|
||||||
|
daysSinceLastUpdate: 3,
|
||||||
|
ignoredLabels: [],
|
||||||
|
perform: true
|
||||||
|
}
|
||||||
6
.github/needs_more_info.yml
vendored
Normal file
6
.github/needs_more_info.yml
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
daysUntilClose: 7,
|
||||||
|
needsMoreInfoLabel: 'more info',
|
||||||
|
perform: false,
|
||||||
|
closeComment: "This issue has been closed automatically because it needs more information and has not had recent activity. See also our [issue reporting](https://aka.ms/vscodeissuereporting) guidelines.\n\nHappy Coding!"
|
||||||
|
}
|
||||||
6
.github/new_release.yml
vendored
Normal file
6
.github/new_release.yml
vendored
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
newReleaseLabel: 'new-release',
|
||||||
|
newReleaseColor: '006b75',
|
||||||
|
daysAfterRelease: 5,
|
||||||
|
perform: true
|
||||||
|
}
|
||||||
5
.github/similarity.yml
vendored
Normal file
5
.github/similarity.yml
vendored
Normal file
@@ -0,0 +1,5 @@
|
|||||||
|
{
|
||||||
|
perform: true,
|
||||||
|
whenCreatedByTeam: true,
|
||||||
|
comment: "Thanks for submitting this issue. Please also check if it is already covered by an existing one, like:\n${potentialDuplicates}"
|
||||||
|
}
|
||||||
7
.gitignore
vendored
7
.gitignore
vendored
@@ -3,9 +3,13 @@ npm-debug.log
|
|||||||
Thumbs.db
|
Thumbs.db
|
||||||
node_modules/
|
node_modules/
|
||||||
.build/
|
.build/
|
||||||
|
extensions/**/dist/
|
||||||
out/
|
out/
|
||||||
out-build/
|
out-build/
|
||||||
out-editor/
|
out-editor/
|
||||||
|
out-editor-src/
|
||||||
|
out-editor-build/
|
||||||
|
out-editor-esm/
|
||||||
out-editor-min/
|
out-editor-min/
|
||||||
out-monaco-editor-core/
|
out-monaco-editor-core/
|
||||||
out-vscode/
|
out-vscode/
|
||||||
@@ -13,4 +17,5 @@ out-vscode-min/
|
|||||||
build/node_modules
|
build/node_modules
|
||||||
coverage/
|
coverage/
|
||||||
test_data/
|
test_data/
|
||||||
yarn-error.log
|
test-results/
|
||||||
|
yarn-error.log
|
||||||
|
|||||||
60
.travis.yml
60
.travis.yml
@@ -1,60 +0,0 @@
|
|||||||
sudo: false
|
|
||||||
language: cpp
|
|
||||||
|
|
||||||
os:
|
|
||||||
- linux
|
|
||||||
- osx
|
|
||||||
|
|
||||||
cache:
|
|
||||||
directories:
|
|
||||||
- $HOME/.cache/yarn
|
|
||||||
|
|
||||||
notifications:
|
|
||||||
email: false
|
|
||||||
webhooks:
|
|
||||||
- http://vscode-probot.westus.cloudapp.azure.com:3450/travis/notifications
|
|
||||||
- http://vscode-test-probot.westus.cloudapp.azure.com:3450/travis/notifications
|
|
||||||
|
|
||||||
addons:
|
|
||||||
apt:
|
|
||||||
sources:
|
|
||||||
- ubuntu-toolchain-r-test
|
|
||||||
packages:
|
|
||||||
- gcc-4.9
|
|
||||||
- g++-4.9
|
|
||||||
- gcc-4.9-multilib
|
|
||||||
- g++-4.9-multilib
|
|
||||||
- zip
|
|
||||||
- libgtk2.0-0
|
|
||||||
- libx11-dev
|
|
||||||
- libxkbfile-dev
|
|
||||||
- libsecret-1-dev
|
|
||||||
|
|
||||||
before_install:
|
|
||||||
- git submodule update --init --recursive
|
|
||||||
- git clone --depth 1 https://github.com/creationix/nvm.git ./.nvm
|
|
||||||
- source ./.nvm/nvm.sh
|
|
||||||
- nvm install 8.9.1
|
|
||||||
- nvm use 8.9.1
|
|
||||||
- npm i -g yarn
|
|
||||||
# - npm config set python `which python`
|
|
||||||
- if [ $TRAVIS_OS_NAME == "linux" ]; then
|
|
||||||
export CXX="g++-4.9" CC="gcc-4.9" DISPLAY=:99.0;
|
|
||||||
sh -e /etc/init.d/xvfb start;
|
|
||||||
sleep 3;
|
|
||||||
fi
|
|
||||||
# Make npm logs less verbose
|
|
||||||
# - npm config set depth 0
|
|
||||||
# - npm config set loglevel warn
|
|
||||||
|
|
||||||
install:
|
|
||||||
- yarn
|
|
||||||
|
|
||||||
script:
|
|
||||||
- node_modules/.bin/gulp electron --silent
|
|
||||||
- node_modules/.bin/gulp compile --silent --max_old_space_size=4096
|
|
||||||
- node_modules/.bin/gulp optimize-vscode --silent --max_old_space_size=4096
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then ./scripts/test.sh --coverage --reporter dot; else ./scripts/test.sh --reporter dot; fi
|
|
||||||
|
|
||||||
after_success:
|
|
||||||
- if [[ "$TRAVIS_OS_NAME" == "linux" ]]; then node_modules/.bin/coveralls < .build/coverage/lcov.info; fi
|
|
||||||
23
.vscode/cglicenses.schema.json
vendored
Normal file
23
.vscode/cglicenses.schema.json
vendored
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
{
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"name",
|
||||||
|
"licenseDetail"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The name of the dependency"
|
||||||
|
},
|
||||||
|
"licenseDetail": {
|
||||||
|
"type": "array",
|
||||||
|
"description": "The complete license text of the dependency",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
142
.vscode/cgmanifest.schema.json
vendored
Normal file
142
.vscode/cgmanifest.schema.json
vendored
Normal file
@@ -0,0 +1,142 @@
|
|||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"registrations": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "object",
|
||||||
|
"properties": {
|
||||||
|
"component": {
|
||||||
|
"oneOf": [
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type",
|
||||||
|
"git"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"git"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"git": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"name",
|
||||||
|
"repositoryUrl",
|
||||||
|
"commitHash"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"repositoryUrl": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"commitHash": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type",
|
||||||
|
"npm"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"npm"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"npm": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"name",
|
||||||
|
"version"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"version": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"type",
|
||||||
|
"other"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"type": {
|
||||||
|
"type": "string",
|
||||||
|
"enum": [
|
||||||
|
"other"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"other": {
|
||||||
|
"type": "object",
|
||||||
|
"required": [
|
||||||
|
"name",
|
||||||
|
"downloadUrl",
|
||||||
|
"version"
|
||||||
|
],
|
||||||
|
"properties": {
|
||||||
|
"name": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"downloadUrl": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"version": {
|
||||||
|
"type": "string"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
"repositoryUrl": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The git url of the component"
|
||||||
|
},
|
||||||
|
"version": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The version of the component"
|
||||||
|
},
|
||||||
|
"license": {
|
||||||
|
"type": "string",
|
||||||
|
"description": "The name of the license"
|
||||||
|
},
|
||||||
|
"developmentDependency": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "This component is inlined in the vscode repo and **is not shipped**."
|
||||||
|
},
|
||||||
|
"isOnlyProductionDependency": {
|
||||||
|
"type": "boolean",
|
||||||
|
"description": "This component is shipped and **is not inlined in the vscode repo**."
|
||||||
|
},
|
||||||
|
"licenseDetail": {
|
||||||
|
"type": "array",
|
||||||
|
"items": {
|
||||||
|
"type": "string"
|
||||||
|
},
|
||||||
|
"description": "The license text"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
6
.vscode/extensions.json
vendored
6
.vscode/extensions.json
vendored
@@ -1,9 +1,9 @@
|
|||||||
{
|
{
|
||||||
// See http://go.microsoft.com/fwlink/?LinkId=827846
|
// See https://go.microsoft.com/fwlink/?LinkId=827846
|
||||||
// for the documentation about the extensions.json format
|
// for the documentation about the extensions.json format
|
||||||
"recommendations": [
|
"recommendations": [
|
||||||
"eg2.tslint",
|
"ms-vscode.vscode-typescript-tslint-plugin",
|
||||||
"dbaeumer.vscode-eslint",
|
"dbaeumer.vscode-eslint",
|
||||||
"msjsdiag.debugger-for-chrome"
|
"msjsdiag.debugger-for-chrome"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
109
.vscode/launch.json
vendored
109
.vscode/launch.json
vendored
@@ -9,14 +9,12 @@
|
|||||||
"stopOnEntry": true,
|
"stopOnEntry": true,
|
||||||
"args": [
|
"args": [
|
||||||
"hygiene"
|
"hygiene"
|
||||||
],
|
]
|
||||||
"cwd": "${workspaceFolder}"
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "node",
|
"type": "node",
|
||||||
"request": "attach",
|
"request": "attach",
|
||||||
"name": "Attach to Extension Host",
|
"name": "Attach to Extension Host",
|
||||||
"protocol": "inspector",
|
|
||||||
"port": 5870,
|
"port": 5870,
|
||||||
"restart": true,
|
"restart": true,
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
@@ -24,19 +22,15 @@
|
|||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "node",
|
"type": "chrome",
|
||||||
"request": "attach",
|
"request": "attach",
|
||||||
"name": "Attach to Shared Process",
|
"name": "Attach to Shared Process",
|
||||||
"protocol": "inspector",
|
"port": 9222,
|
||||||
"port": 5871,
|
"urlFilter": "*"
|
||||||
"outFiles": [
|
|
||||||
"${workspaceFolder}/out/**/*.js"
|
|
||||||
]
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "node",
|
"type": "node",
|
||||||
"request": "attach",
|
"request": "attach",
|
||||||
"protocol": "inspector",
|
|
||||||
"name": "Attach to Search Process",
|
"name": "Attach to Search Process",
|
||||||
"port": 5876,
|
"port": 5876,
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
@@ -47,7 +41,6 @@
|
|||||||
"type": "node",
|
"type": "node",
|
||||||
"request": "attach",
|
"request": "attach",
|
||||||
"name": "Attach to CLI Process",
|
"name": "Attach to CLI Process",
|
||||||
"protocol": "inspector",
|
|
||||||
"port": 5874,
|
"port": 5874,
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
"${workspaceFolder}/out/**/*.js"
|
"${workspaceFolder}/out/**/*.js"
|
||||||
@@ -57,7 +50,6 @@
|
|||||||
"type": "node",
|
"type": "node",
|
||||||
"request": "attach",
|
"request": "attach",
|
||||||
"name": "Attach to Main Process",
|
"name": "Attach to Main Process",
|
||||||
"protocol": "inspector",
|
|
||||||
"port": 5875,
|
"port": 5875,
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
"${workspaceFolder}/out/**/*.js"
|
"${workspaceFolder}/out/**/*.js"
|
||||||
@@ -66,13 +58,36 @@
|
|||||||
{
|
{
|
||||||
"type": "chrome",
|
"type": "chrome",
|
||||||
"request": "attach",
|
"request": "attach",
|
||||||
"name": "Attach to sqlops",
|
"name": "Attach to azuredatastudio",
|
||||||
"port": 9222
|
"port": 9222
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "chrome",
|
"type": "chrome",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"name": "Launch sqlops",
|
"name": "Launch azuredatastudio",
|
||||||
|
"windows": {
|
||||||
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql.bat"
|
||||||
|
},
|
||||||
|
"osx": {
|
||||||
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh"
|
||||||
|
},
|
||||||
|
"linux": {
|
||||||
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql.sh"
|
||||||
|
},
|
||||||
|
"urlFilter": "*workbench.html*",
|
||||||
|
"runtimeArgs": [
|
||||||
|
"--inspect=5875", "--no-cached-data"
|
||||||
|
],
|
||||||
|
"skipFiles": [
|
||||||
|
"**/winjs*.js"
|
||||||
|
],
|
||||||
|
"webRoot": "${workspaceFolder}",
|
||||||
|
"timeout": 45000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "chrome",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Launch azuredatastudio with new notebook command",
|
||||||
"windows": {
|
"windows": {
|
||||||
"runtimeExecutable": "${workspaceFolder}/scripts/sql.bat"
|
"runtimeExecutable": "${workspaceFolder}/scripts/sql.bat"
|
||||||
},
|
},
|
||||||
@@ -84,37 +99,51 @@
|
|||||||
},
|
},
|
||||||
"urlFilter": "*index.html*",
|
"urlFilter": "*index.html*",
|
||||||
"runtimeArgs": [
|
"runtimeArgs": [
|
||||||
"--inspect=5875"
|
"--inspect=5875",
|
||||||
|
"--command=notebook.command.new"
|
||||||
],
|
],
|
||||||
"skipFiles": [
|
"skipFiles": [
|
||||||
"**/winjs*.js"
|
"**/winjs*.js"
|
||||||
],
|
],
|
||||||
"webRoot": "${workspaceFolder}",
|
"webRoot": "${workspaceFolder}",
|
||||||
"timeout": 15000
|
"timeout": 45000
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Launch Built-in Extension",
|
||||||
|
"type": "extensionHost",
|
||||||
|
"request": "launch",
|
||||||
|
"runtimeExecutable": "${execPath}",
|
||||||
|
"args": [
|
||||||
|
"--extensionDevelopmentPath=${workspaceRoot}/extensions/debug-auto-launch"
|
||||||
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"type": "node",
|
"type": "node",
|
||||||
"request": "launch",
|
"request": "launch",
|
||||||
"name": "Unit Tests",
|
"name": "Launch Smoke Test",
|
||||||
"protocol": "inspector",
|
"program": "${workspaceFolder}/test/smoke/test/index.js",
|
||||||
"program": "${workspaceFolder}/node_modules/mocha/bin/_mocha",
|
"cwd": "${workspaceFolder}/test/smoke",
|
||||||
"runtimeExecutable": "${workspaceFolder}/.build/electron/SQL Operations Studio.app/Contents/MacOS/Electron",
|
"env": {
|
||||||
|
"BUILD_ARTIFACTSTAGINGDIRECTORY": "${workspaceFolder}"
|
||||||
|
}
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "node",
|
||||||
|
"request": "launch",
|
||||||
|
"name": "Run Unit Tests",
|
||||||
|
"program": "${workspaceFolder}/test/electron/index.js",
|
||||||
|
"runtimeExecutable": "${workspaceFolder}/.build/electron/Azure Data Studio.app/Contents/MacOS/Electron",
|
||||||
"windows": {
|
"windows": {
|
||||||
"runtimeExecutable": "${workspaceFolder}/.build/electron/sqlops.exe"
|
"runtimeExecutable": "${workspaceFolder}/.build/electron/azuredatastudio.exe"
|
||||||
},
|
},
|
||||||
"linux": {
|
"linux": {
|
||||||
"runtimeExecutable": "${workspaceFolder}/.build/electron/sqlops"
|
"runtimeExecutable": "${workspaceFolder}/.build/electron/azuredatastudio"
|
||||||
},
|
},
|
||||||
"stopOnEntry": false,
|
"outputCapture": "std",
|
||||||
"args": [
|
"args": [
|
||||||
"--delay",
|
"--remote-debugging-port=9222"
|
||||||
"--timeout",
|
|
||||||
"2000"
|
|
||||||
],
|
],
|
||||||
"cwd": "${workspaceFolder}",
|
"cwd": "${workspaceFolder}",
|
||||||
"env": {
|
|
||||||
"ELECTRON_RUN_AS_NODE": "true"
|
|
||||||
},
|
|
||||||
"outFiles": [
|
"outFiles": [
|
||||||
"${workspaceFolder}/out/**/*.js"
|
"${workspaceFolder}/out/**/*.js"
|
||||||
]
|
]
|
||||||
@@ -122,18 +151,32 @@
|
|||||||
],
|
],
|
||||||
"compounds": [
|
"compounds": [
|
||||||
{
|
{
|
||||||
"name": "Debug sqlops Main and Renderer",
|
"name": "Debug Unit Tests",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
"Launch sqlops",
|
"Attach to azuredatastudio",
|
||||||
|
"Run Unit Tests"
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Debug azuredatastudio Main and Renderer",
|
||||||
|
"configurations": [
|
||||||
|
"Launch azuredatastudio",
|
||||||
"Attach to Main Process"
|
"Attach to Main Process"
|
||||||
]
|
]
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
"name": "Search and Renderer processes",
|
"name": "Search and Renderer processes",
|
||||||
"configurations": [
|
"configurations": [
|
||||||
"Launch sqlops",
|
"Launch azuredatastudio",
|
||||||
"Attach to Search Process"
|
"Attach to Search Process"
|
||||||
]
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "Renderer and Extension Host processes",
|
||||||
|
"configurations": [
|
||||||
|
"Launch azuredatastudio",
|
||||||
|
"Attach to Extension Host"
|
||||||
|
]
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
20
.vscode/settings.json
vendored
20
.vscode/settings.json
vendored
@@ -11,7 +11,7 @@
|
|||||||
}
|
}
|
||||||
},
|
},
|
||||||
"files.associations": {
|
"files.associations": {
|
||||||
"OSSREADME.json": "jsonc"
|
"cglicenses.json": "jsonc"
|
||||||
},
|
},
|
||||||
"search.exclude": {
|
"search.exclude": {
|
||||||
"**/node_modules": true,
|
"**/node_modules": true,
|
||||||
@@ -22,9 +22,9 @@
|
|||||||
"out-vscode/**": true,
|
"out-vscode/**": true,
|
||||||
"i18n/**": true,
|
"i18n/**": true,
|
||||||
"extensions/**/out/**": true,
|
"extensions/**/out/**": true,
|
||||||
"test/smoke/out/**": true
|
"test/smoke/out/**": true,
|
||||||
|
"src/vs/base/test/node/uri.test.data.txt": true
|
||||||
},
|
},
|
||||||
"tslint.enable": true,
|
|
||||||
"lcov.path": [
|
"lcov.path": [
|
||||||
"./.build/coverage/lcov.info",
|
"./.build/coverage/lcov.info",
|
||||||
"./.build/coverage-single/lcov.info"
|
"./.build/coverage-single/lcov.info"
|
||||||
@@ -38,5 +38,17 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
],
|
],
|
||||||
"typescript.tsdk": "node_modules/typescript/lib"
|
"typescript.tsdk": "node_modules/typescript/lib",
|
||||||
|
"npm.exclude": "**/extensions/**",
|
||||||
|
"git.ignoreLimitWarning": true,
|
||||||
|
"emmet.excludeLanguages": [],
|
||||||
|
"typescript.preferences.importModuleSpecifier": "non-relative",
|
||||||
|
"typescript.preferences.quoteStyle": "single",
|
||||||
|
"json.schemas": [{
|
||||||
|
"fileMatch": [ "cgmanifest.json" ],
|
||||||
|
"url": "./.vscode/cgmanifest.schema.json"
|
||||||
|
}, {
|
||||||
|
"fileMatch": [ "cglicenses.json" ],
|
||||||
|
"url": "./.vscode/cglicenses.schema.json"
|
||||||
|
}]
|
||||||
}
|
}
|
||||||
|
|||||||
38
.vscode/shared.code-snippets
vendored
Normal file
38
.vscode/shared.code-snippets
vendored
Normal file
@@ -0,0 +1,38 @@
|
|||||||
|
{
|
||||||
|
// Each snippet is defined under a snippet name and has a scope, prefix, body and
|
||||||
|
// description. The scope defines in watch languages the snippet is applicable. The prefix is what is
|
||||||
|
// used to trigger the snippet and the body will be expanded and inserted.Possible variables are:
|
||||||
|
// $1, $2 for tab stops, $0 for the final cursor position, and ${1:label}, ${2:another} for placeholders.
|
||||||
|
// Placeholders with the same ids are connected.
|
||||||
|
// Example:
|
||||||
|
"MSFT Copyright Header": {
|
||||||
|
"scope": "javascript,typescript,css",
|
||||||
|
"prefix": [
|
||||||
|
"header",
|
||||||
|
"stub",
|
||||||
|
"copyright"
|
||||||
|
],
|
||||||
|
"body": [
|
||||||
|
"/*---------------------------------------------------------------------------------------------",
|
||||||
|
" * Copyright (c) Microsoft Corporation. All rights reserved.",
|
||||||
|
" * Licensed under the Source EULA. See License.txt in the project root for license information.",
|
||||||
|
" *--------------------------------------------------------------------------------------------*/",
|
||||||
|
"",
|
||||||
|
"$0"
|
||||||
|
],
|
||||||
|
"description": "Insert Copyright Statement"
|
||||||
|
},
|
||||||
|
"TS -> Inject Service": {
|
||||||
|
"description": "Constructor Injection Pattern",
|
||||||
|
"prefix": "@inject",
|
||||||
|
"body": "@$1 private readonly _$2: ${1},$0"
|
||||||
|
},
|
||||||
|
"TS -> Event & Emitter": {
|
||||||
|
"prefix": "emitter",
|
||||||
|
"description": "Add emitter and event properties",
|
||||||
|
"body": [
|
||||||
|
"private readonly _onDid$1 = new Emitter<$2>();",
|
||||||
|
"readonly onDid$1: Event<$2> = this._onDid$1.event;"
|
||||||
|
],
|
||||||
|
}
|
||||||
|
}
|
||||||
17
.vscode/tasks.json
vendored
17
.vscode/tasks.json
vendored
@@ -28,6 +28,23 @@
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"type": "npm",
|
||||||
|
"script": "strict-null-check-watch",
|
||||||
|
"label": "TS - Strict Null Checks",
|
||||||
|
"isBackground": true,
|
||||||
|
"presentation": {
|
||||||
|
"reveal": "never"
|
||||||
|
},
|
||||||
|
"problemMatcher": {
|
||||||
|
"base": "$tsc-watch",
|
||||||
|
"owner": "typescript-strict-null",
|
||||||
|
"applyTo": "allDocuments"
|
||||||
|
},
|
||||||
|
"runOptions": {
|
||||||
|
"runOn": "folderOpen"
|
||||||
|
}
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"type": "gulp",
|
"type": "gulp",
|
||||||
"task": "tslint",
|
"task": "tslint",
|
||||||
|
|||||||
2
.yarnrc
2
.yarnrc
@@ -1,3 +1,3 @@
|
|||||||
disturl "https://atom.io/download/electron"
|
disturl "https://atom.io/download/electron"
|
||||||
target "1.7.12"
|
target "2.0.12"
|
||||||
runtime "electron"
|
runtime "electron"
|
||||||
|
|||||||
174
CHANGELOG.md
174
CHANGELOG.md
@@ -1,5 +1,173 @@
|
|||||||
# Change Log
|
# Change Log
|
||||||
|
|
||||||
|
## Version 1.4.5
|
||||||
|
* Release date: February 13, 2019
|
||||||
|
* Release status: General Availability
|
||||||
|
|
||||||
|
## What's new in this version
|
||||||
|
* Added **Admin pack for SQL Server** extension pack to make it easier to install SQL Server admin-related extensions. This includes:
|
||||||
|
* [SQL Server Agent](https://docs.microsoft.com/en-us/sql/azure-data-studio/sql-server-agent-extension?view=sql-server-2017)
|
||||||
|
* [SQL Server Profiler](https://docs.microsoft.com/en-us/sql/azure-data-studio/sql-server-profiler-extension?view=sql-server-2017)
|
||||||
|
* [SQL Server Import](https://docs.microsoft.com/en-us/sql/azure-data-studio/sql-server-import-extension?view=sql-server-2017)
|
||||||
|
* Added filtering extended event support in Profiler extension
|
||||||
|
* Added Save as XML feature that can save T-SQL results as XML
|
||||||
|
* Added Data-Tier Application Wizard improvements
|
||||||
|
* Added Generate script button
|
||||||
|
* Added view to give warnings of possible data loss during deployment
|
||||||
|
* Updates to the [SQL Server 2019 Preview extension](https://docs.microsoft.com/sql/azure-data-studio/sql-server-2019-extension?view=sql-server-ver15)
|
||||||
|
* Results streaming enabled by default for long running queries
|
||||||
|
* Resolved [bugs and issues](https://github.com/Microsoft/azuredatastudio/milestone/23?closed=1).
|
||||||
|
|
||||||
|
## Contributions and "thank you"
|
||||||
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
|
|
||||||
|
* AlexFsmn for `Added context menu for DBs in explorer view to backup & restore db. #2277`
|
||||||
|
* sadedil for `Missing feature request: Save as XML #3729`
|
||||||
|
* gbritton1 for `Removed reference to object explorer #3463`
|
||||||
|
|
||||||
|
## Version 1.3.8
|
||||||
|
* Release date: January 9, 2019
|
||||||
|
* Release status: General Availability
|
||||||
|
|
||||||
|
## What's new in this version
|
||||||
|
* #13 Feature Request: Azure Active Directory Authentication
|
||||||
|
* #1040 Stream initial query results as they become available
|
||||||
|
* #3298 Сan't add an azure account.
|
||||||
|
* #2387 Support Per-User Installer
|
||||||
|
* SQL Server Import updates for DACPAC\BACPAC
|
||||||
|
* SQL Server Profiler UI and UX improvements
|
||||||
|
* Updates to [SQL Server 2019 extension](https://docs.microsoft.com/sql/azure-data-studio/sql-server-2019-extension?view=sql-server-ver15)
|
||||||
|
* **sp_executesql to SQL** and **New Database** extensions
|
||||||
|
|
||||||
|
## Contributions and "thank you"
|
||||||
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
|
|
||||||
|
* Tarig0 for `Add Routine_Type to CreateStoredProc fixes #3257 (#3286)`
|
||||||
|
* oltruong for `typo fix #3025'`
|
||||||
|
* Thomas-S-B for `Removed unnecessary IErrorDetectionStrategy #749`
|
||||||
|
* Thomas-S-B for `Simplified code #750`
|
||||||
|
|
||||||
|
## Version 1.2.4
|
||||||
|
* Release date: November 6, 2018
|
||||||
|
* Release status: General Availability
|
||||||
|
|
||||||
|
## What's new in this version
|
||||||
|
* Update to the SQL Server 2019 Preview extension
|
||||||
|
* Introducing Paste the Plan extension
|
||||||
|
* Introducing High Color queries extension, including SSMS editor theme
|
||||||
|
* Fixes in SQL Server Agent, Profiler, and Import extensions
|
||||||
|
* Fix .Net Core Socket KeepAlive issue causing dropped inactive connections on macOS
|
||||||
|
* Upgrade SQL Tools Service to .Net Core 2.2 Preview 3 (for eventual AAD support)
|
||||||
|
* Fix customer reported GitHub issues
|
||||||
|
|
||||||
|
## Contributions and "thank you"
|
||||||
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
|
|
||||||
|
* rdaniels6813 for `Add query plan theme support #3031`
|
||||||
|
* Ruturaj123 for `Fixed some typos and grammatical errors #3027`
|
||||||
|
* PromoFaux for `Use emoji shortcodes in CONTRIBUTING.md instead of <20> #3009`
|
||||||
|
* ckaczor for `Fix: DATETIMEOFFSET data types should be ISO formatted #714`
|
||||||
|
* hi-im-T0dd for `Fixed sync issue with my forked master so this commit is correct #2948`
|
||||||
|
* hi-im-T0dd for `Fixed when right clicking and selecting Manage-correct name displays #2794`
|
||||||
|
|
||||||
|
## Version 1.1.3
|
||||||
|
* Release date: October 18, 2018
|
||||||
|
* Release status: General Availability
|
||||||
|
|
||||||
|
## What's new in this version
|
||||||
|
* Introducing the Azure Resource Explorer to browse Azure SQL Databases
|
||||||
|
* Improve Object Explorer and Query Editor connectivity robustness
|
||||||
|
* SQL Server 2019 and SQL Agent extension improvements
|
||||||
|
|
||||||
|
## Contributions and "thank you"
|
||||||
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
|
|
||||||
|
* philoushka for `center the icon #2760`
|
||||||
|
* anthonypants for `Typo #2775`
|
||||||
|
* kstolte for `Fix Invalid Configuration in Launch.json #2789`
|
||||||
|
* kstolte for `Fixing a reference to SQL Ops Studio #2788`
|
||||||
|
|
||||||
|
## Version 1.0.0
|
||||||
|
* Release date: September 24, 2018
|
||||||
|
* Release status: General Availability
|
||||||
|
|
||||||
|
## What's new in this version
|
||||||
|
* Announcing the SQL Server 2019 Preview extension.
|
||||||
|
* Support for SQL Server 2019 preview features including big data cluster support.
|
||||||
|
* Azure Data Studio Notebooks
|
||||||
|
* The Azure Resource Explorer viewlets you browse data-related endpoints for your Azure accounts and create connections to them in Object Explorer. In this release Azure SQL Databases and servers are supported.
|
||||||
|
* SQL Server Polybase Create External Table Wizard
|
||||||
|
* Query Results Grid performance and UX improvements for large number of result sets.
|
||||||
|
* Visual Studio Code source code refresh from 1.23 to 1.26.1 with Grid Layout and Improved Settings Editor (preview).
|
||||||
|
* Accessibility improvements for screen reader, keyboard navigation and high-contrast.
|
||||||
|
* Added Connection name option to provide an alternative display name in the Servers viewlet.
|
||||||
|
|
||||||
|
## Contributions and "thank you"
|
||||||
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
|
|
||||||
|
* AlexFsmn `Feature: Ability to add connection name #2332`
|
||||||
|
* AlexFsmn `Disabled connection name input when connecting to a server. #2566`
|
||||||
|
|
||||||
|
## Version 0.33.7
|
||||||
|
* Release date: August 30, 2018
|
||||||
|
* Release status: Public Preview
|
||||||
|
|
||||||
|
## What's new in this version
|
||||||
|
* Announcing the SQL Server Import Extension
|
||||||
|
* SQL Server Profiler Session management
|
||||||
|
* SQL Server Agent improvements
|
||||||
|
* New community extension: First Responder Kit
|
||||||
|
* Quality of Life improvements: Connection strings
|
||||||
|
* Fix many customer reported GitHub issues
|
||||||
|
|
||||||
|
## Contributions and "thank you"
|
||||||
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
|
|
||||||
|
* SebastianPfliegel `Added more saveAsCsv options #2099`
|
||||||
|
* ianychoi `Fixes a typo: Mimunum -> Minimum #1994`
|
||||||
|
* AlexFsmn `Fixed bug where proper file extension wasn't appended to filename. #2151`
|
||||||
|
* AlexFsmn `Added functionality for adding any file to import wizard #2329`
|
||||||
|
* AlexFsmn `Fixed background issue when copying a chart to clipboard #2215`
|
||||||
|
* AlexFsmn `Fixed problem where vertical charts didn't display labels correctly. #2263`
|
||||||
|
* AlexFsmn `Fixed Initial values for charts to match visuals #2266`
|
||||||
|
* AlexFsmn `Renamed chart option labels #2264`
|
||||||
|
* AlexFsmn `Added feature for opening file after exporting to CSV/XLS/JSON & query files #2216`
|
||||||
|
* AlexFsmm `Get Connection String should copy to clipboard #2175`
|
||||||
|
|
||||||
|
## Version 0.31.4
|
||||||
|
* Release date: July 19, 2018
|
||||||
|
* Release status: Public Preview
|
||||||
|
|
||||||
|
## What's new in this version
|
||||||
|
* SQL Server Agent for Azure Data Studio extension improvements
|
||||||
|
* Added view of Alerts, Operators, and Proxies and icons on left pane
|
||||||
|
* Added dialogs for New Job, New Job Step, New Alert, and New Operator
|
||||||
|
* Added Delete Job, Delete Alert, and Delete Operator (right-click)
|
||||||
|
* Added Previous Runs visualization
|
||||||
|
* Added Filters for each column name
|
||||||
|
* SQL Server Profiler for Azure Data Studio extension improvements
|
||||||
|
* Added Hotkeys to quickly launch and start/stop Profiler
|
||||||
|
* Added 5 Default Templates to view Extended Events
|
||||||
|
* Added Server/Database connection name
|
||||||
|
* Added support for Azure SQL Database instances
|
||||||
|
* Added suggestion to exit Profiler when tab is closed when Profiler is still running
|
||||||
|
* Release of Combine Scripts Extension
|
||||||
|
* Wizard and Dialog Extensibility
|
||||||
|
* Fix GitHub Issues
|
||||||
|
|
||||||
|
## Version 0.30.6
|
||||||
|
* Release date: June 20, 2018
|
||||||
|
* Release status: Public Preview
|
||||||
|
|
||||||
|
## What's new in this version
|
||||||
|
* **SQL Server Profiler for Azure Data Studio *Preview*** extension initial release
|
||||||
|
* The new **SQL Data Warehouse** extension includes rich customizable dashboard widgets surfacing insights to your data warehouse. This unlocks key scenarios around managing and tuning your data warehouse to ensure it is optimized for consistent performance.
|
||||||
|
* **Edit Data "Filtering and Sorting"** support
|
||||||
|
* **SQL Server Agent for Azure Data Studio *Preview*** extension enhancements for Jobs and Job History views
|
||||||
|
* Improved **Wizard & Dialog UI Builder Framework** extensibility APIs
|
||||||
|
* Update VS Code Platform source code integrating [March 2018 (1.22)](https://code.visualstudio.com/updates/v1_22) and [April 2018 (1.23)](https://code.visualstudio.com/updates/v1_23) releases
|
||||||
|
* Fix GitHub Issues
|
||||||
|
|
||||||
## Version 0.29.3
|
## Version 0.29.3
|
||||||
* Release date: May 7, 2018
|
* Release date: May 7, 2018
|
||||||
* Release status: Public Preview
|
* Release status: Public Preview
|
||||||
@@ -9,7 +177,7 @@ The May release is focused on stabilization and bug fixes leading up to the Buil
|
|||||||
|
|
||||||
* Announcing **Redgate SQL Search** extension available in Extension Manager
|
* Announcing **Redgate SQL Search** extension available in Extension Manager
|
||||||
* Community Localization available for 10 languages: **German, Spanish, French, Italian, Japanese, Korean, Portuguese, Russian, Simplified Chinese and Traditional Chinese!**
|
* Community Localization available for 10 languages: **German, Spanish, French, Italian, Japanese, Korean, Portuguese, Russian, Simplified Chinese and Traditional Chinese!**
|
||||||
* **GDPR-compliant** build has reduced telemetry collection, improved [opt-out](https://github.com/Microsoft/sqlopsstudio/wiki/How-to-Disable-Telemetry-Reporting) experience and in-product links to [Privacy Statement](https://privacy.microsoft.com/en-us/privacystatement)
|
* Reduced telemetry collection, improved [opt-out](https://github.com/Microsoft/azuredatastudio/wiki/How-to-Disable-Telemetry-Reporting) experience and in-product links to [Privacy Statement](https://privacy.microsoft.com/en-us/privacystatement)
|
||||||
* Extension Manager has improved Marketplace experience to easily discover community extensions
|
* Extension Manager has improved Marketplace experience to easily discover community extensions
|
||||||
* SQL Agent extension Jobs and Job History view improvement
|
* SQL Agent extension Jobs and Job History view improvement
|
||||||
* Updates for **whoisactive** and **Server Reports** extensions
|
* Updates for **whoisactive** and **Server Reports** extensions
|
||||||
@@ -35,8 +203,8 @@ The April Public Preview release contains some of the following highlights.
|
|||||||
* Release status: Public Preview
|
* Release status: Public Preview
|
||||||
|
|
||||||
## What's new in this version
|
## What's new in this version
|
||||||
The March Public Preview release enables some key aspects of the SQL Operations
|
The March Public Preview release enables some key aspects of the Azure Data Studio
|
||||||
Studio extensibility story. Here are some highlights in this release.
|
extensibility story. Here are some highlights in this release.
|
||||||
|
|
||||||
* Enhance the Manage Dashboard extensibility model to support tabbed Insights and Configuration panes
|
* Enhance the Manage Dashboard extensibility model to support tabbed Insights and Configuration panes
|
||||||
* Dashboard Insights extensions for `sp_whoisactive` from [whoisactive.com](http://whoisactive.com)
|
* Dashboard Insights extensions for `sp_whoisactive` from [whoisactive.com](http://whoisactive.com)
|
||||||
|
|||||||
@@ -1,13 +1,13 @@
|
|||||||
## Contributing Issues
|
## Contributing Issues
|
||||||
|
|
||||||
### Before Submitting an Issue
|
### Before Submitting an Issue
|
||||||
First, please do a search in [open issues](https://github.com/Microsoft/sqlopsstudio/issues) to see if the issue or feature request has already been filed. Use this [query](https://github.com/Microsoft/sqlopsstudio/issues?q=is%3Aopen+is%3Aissue+label%3Afeature-request+sort%3Areactions-%2B1-desc) to search for the most popular feature requests.
|
First, please do a search in [open issues](https://github.com/Microsoft/azuredatastudio/issues) to see if the issue or feature request has already been filed. Use this [query](https://github.com/Microsoft/azuredatastudio/issues?q=is%3Aopen+is%3Aissue+label%3Afeature-request+sort%3Areactions-%2B1-desc) to search for the most popular feature requests.
|
||||||
|
|
||||||
If you find your issue already exists, make relevant comments and add your [reaction](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments). Use a reaction in place of a "+1" comment.
|
If you find your issue already exists, make relevant comments and add your [reaction](https://github.com/blog/2119-add-reactions-to-pull-requests-issues-and-comments). Use a reaction in place of a "+1" comment.
|
||||||
|
|
||||||
👍 - upvote
|
:+1: - upvote
|
||||||
|
|
||||||
👎 - downvote
|
:-1: - downvote
|
||||||
|
|
||||||
If you cannot find an existing issue that describes your bug or feature, submit an issue using the guidelines below.
|
If you cannot find an existing issue that describes your bug or feature, submit an issue using the guidelines below.
|
||||||
|
|
||||||
@@ -18,29 +18,31 @@ File a single issue per problem and feature request.
|
|||||||
* Do not enumerate multiple bugs or feature requests in the same issue.
|
* Do not enumerate multiple bugs or feature requests in the same issue.
|
||||||
* Do not add your issue as a comment to an existing issue unless it's for the identical input. Many issues look similar, but have different causes.
|
* Do not add your issue as a comment to an existing issue unless it's for the identical input. Many issues look similar, but have different causes.
|
||||||
|
|
||||||
The more information you can provide, the more likely someone will be successful reproducing the issue and finding a fix.
|
The more information you can provide, the more likely someone will be successful at reproducing the issue and finding a fix.
|
||||||
|
|
||||||
Please include the following with each issue.
|
The built-in tool for reporting an issue, which you can access by using `Report Issue` in Azure Data Studio's Help menu, can help streamline this process by automatically providing the version of Azure Data Studio, all your installed extensions, and your system info.
|
||||||
|
|
||||||
* Version of SQL Ops Studio
|
Please include the following with each issue.
|
||||||
|
|
||||||
> **Tip:** You can easily create an issue using `Report Issues` from SQL Operations Studio Help menu.
|
* Version of Azure Data Studio (formerly SQL Operations Studio).
|
||||||
|
|
||||||
* Reproducible steps (1... 2... 3...) and what you expected versus what you actually saw.
|
> **Tip:** You can easily create an issue using `Report Issues` from Azure Data Studio Help menu.
|
||||||
* Images, animations, or a link to a video.
|
|
||||||
* A code snippet that demonstrates the issue or a link to a code repository we can easily pull down onto our machine to recreate the issue.
|
|
||||||
|
|
||||||
> **Note:** Because we need to copy and paste the code snippet, including a code snippet as a media file (i.e. .gif) is not sufficient.
|
* Reproducible steps (1... 2... 3...) and what you expected versus what you actually saw.
|
||||||
|
* Images, animations, or a link to a video.
|
||||||
|
* A code snippet that demonstrates the issue or a link to a code repository we can easily pull down onto our machine to recreate the issue.
|
||||||
|
|
||||||
|
> **Note:** Because we need to copy and paste the code snippet, including a code snippet as a media file (i.e. .gif) is not sufficient.
|
||||||
|
|
||||||
* Errors in the Dev Tools Console (Help | Toggle Developer Tools)
|
* Errors in the Dev Tools Console (Help | Toggle Developer Tools)
|
||||||
|
|
||||||
Please remember to do the following:
|
Please remember to do the following:
|
||||||
|
|
||||||
* Search the issue repository to see if there exists a duplicate.
|
* Search the issue repository to see if there exists a duplicate.
|
||||||
* Simplify your scripts around the issue so we can better isolate the problem.
|
* Simplify your scripts around the issue so we can better isolate the problem.
|
||||||
|
|
||||||
Don't feel bad if we can't reproduce the issue and ask for more information!
|
Don't feel bad if we can't reproduce the issue and ask for more information!
|
||||||
|
|
||||||
## Contributing Fixes
|
## Contributing Fixes
|
||||||
If you are interested in fixing issues and contributing directly to the code base,
|
If you are interested in fixing issues and contributing directly to the code base,
|
||||||
please see the document [How to Contribute](https://github.com/Microsoft/sqlopsstudio/wiki/How-to-Contribute).
|
please see the document [How to Contribute](https://github.com/Microsoft/azuredatastudio/wiki/How-to-Contribute).
|
||||||
|
|||||||
12
LICENSE.txt
12
LICENSE.txt
@@ -1,14 +1,14 @@
|
|||||||
MICROSOFT SOFTWARE LICENSE TERMS
|
MICROSOFT SOFTWARE LICENSE TERMS
|
||||||
|
|
||||||
MICROSOFT SQL OPERATIONS STUDIO
|
MICROSOFT AZURE DATA STUDIO
|
||||||
|
|
||||||
Microsoft Corporation ("Microsoft") grants you a nonexclusive, perpetual,
|
Microsoft Corporation ("Microsoft") grants you a nonexclusive, perpetual,
|
||||||
royalty-free right to use, copy, and modify the software code provided by us
|
royalty-free right to use, copy, and modify the software code provided by us
|
||||||
("Software Code"). You may not sublicense the Software Code or any use of it
|
("Software Code"). You may not sublicense the Software Code or any use of it
|
||||||
(except to your affiliates and to vendors to perform work on your behalf)
|
(except to your affiliates and to vendors to perform work on your behalf)
|
||||||
through distribution, network access, service agreement, lease, rental, or
|
through distribution, network access, service agreement, lease, rental, or
|
||||||
otherwise. Unless applicable law gives you more rights, Microsoft reserves all
|
otherwise. Unless applicable law gives you more rights, Microsoft reserves all
|
||||||
other rights not expressly granted herein, whether by implication, estoppel or
|
other rights not expressly granted herein, whether by implication, estoppel or
|
||||||
otherwise.
|
otherwise.
|
||||||
|
|
||||||
THE SOFTWARE CODE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
THE SOFTWARE CODE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY
|
||||||
|
|||||||
812
OSSREADME.json
812
OSSREADME.json
@@ -1,812 +0,0 @@
|
|||||||
// Listing in here platform dependencies that come in at build time
|
|
||||||
|
|
||||||
[{
|
|
||||||
"isLicense": true,
|
|
||||||
"name": "async-each",
|
|
||||||
"repositoryURL": "https://github.com/paulmillr/async-each",
|
|
||||||
"license": "MIT",
|
|
||||||
"licenseDetail": [
|
|
||||||
"The MIT License (MIT)",
|
|
||||||
"",
|
|
||||||
"Copyright (c) 2016 Paul Miller [(paulmillr.com)](http://paulmillr.com)",
|
|
||||||
"",
|
|
||||||
"Permission is hereby granted, free of charge, to any person obtaining a copy",
|
|
||||||
"of this software and associated documentation files (the “Software”), to deal",
|
|
||||||
"in the Software without restriction, including without limitation the rights",
|
|
||||||
"to use, copy, modify, merge, publish, distribute, sublicense, and/or sell",
|
|
||||||
"copies of the Software, and to permit persons to whom the Software is",
|
|
||||||
"furnished to do so, subject to the following conditions:",
|
|
||||||
"",
|
|
||||||
"The above copyright notice and this permission notice shall be included in",
|
|
||||||
"all copies or substantial portions of the Software.",
|
|
||||||
"",
|
|
||||||
"THE SOFTWARE IS PROVIDED “AS IS”, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
|
|
||||||
"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
|
|
||||||
"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
|
|
||||||
"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
|
|
||||||
"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,",
|
|
||||||
"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN",
|
|
||||||
"THE SOFTWARE."
|
|
||||||
],
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"isLicense": true,
|
|
||||||
"name": "chokidar",
|
|
||||||
"repositoryURL": "https://github.com/paulmillr/chokidar",
|
|
||||||
"license": "MIT",
|
|
||||||
"licenseDetail": [
|
|
||||||
"The MIT license.",
|
|
||||||
"",
|
|
||||||
"Copyright (c) 2012 - 2016 Paul Miller [paulmillr.com](http://paulmillr.com) & Elan Shanker",
|
|
||||||
"",
|
|
||||||
"Permission is hereby granted, free of charge, to any person obtaining a copy of",
|
|
||||||
"this software and associated documentation files (the \"Software\"), to deal in",
|
|
||||||
"the Software without restriction, including without limitation the rights to",
|
|
||||||
"use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies",
|
|
||||||
"of the Software, and to permit persons to whom the Software is furnished to do",
|
|
||||||
"so, subject to the following conditions:",
|
|
||||||
"",
|
|
||||||
"The above copyright notice and this permission notice shall be included in all",
|
|
||||||
"copies or substantial portions of the Software.",
|
|
||||||
"",
|
|
||||||
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
|
|
||||||
"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
|
|
||||||
"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
|
|
||||||
"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
|
|
||||||
"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,",
|
|
||||||
"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE",
|
|
||||||
"SOFTWARE."
|
|
||||||
],
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "chromium",
|
|
||||||
"version": "58.0.3029.110",
|
|
||||||
"repositoryURL": "http://www.chromium.org/Home",
|
|
||||||
"licenseDetail": [
|
|
||||||
"BSD License",
|
|
||||||
"",
|
|
||||||
"Copyright 2015 The Chromium Authors. All rights reserved.",
|
|
||||||
"",
|
|
||||||
"Redistribution and use in source and binary forms, with or without modification,",
|
|
||||||
"are permitted provided that the following conditions are met:",
|
|
||||||
"",
|
|
||||||
" * Redistributions of source code must retain the above copyright notice, this",
|
|
||||||
" list of conditions and the following disclaimer.",
|
|
||||||
"",
|
|
||||||
" * Redistributions in binary form must reproduce the above copyright notice,",
|
|
||||||
" this list of conditions and the following disclaimer in the documentation",
|
|
||||||
" and/or other materials provided with the distribution.",
|
|
||||||
"",
|
|
||||||
" * Neither the name Google Inc. nor the names of its contributors may be used to",
|
|
||||||
" endorse or promote products derived from this software without specific",
|
|
||||||
" prior written permission.",
|
|
||||||
"",
|
|
||||||
"THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS \"AS IS\" AND",
|
|
||||||
"ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED",
|
|
||||||
"WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE",
|
|
||||||
"DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE FOR",
|
|
||||||
"ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES",
|
|
||||||
"(INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;",
|
|
||||||
"LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON",
|
|
||||||
"ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT",
|
|
||||||
"(INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS",
|
|
||||||
"SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE."
|
|
||||||
],
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "libchromiumcontent",
|
|
||||||
"version": "58.0.3029.110",
|
|
||||||
"license": "MIT",
|
|
||||||
"repositoryURL": "https://github.com/electron/libchromiumcontent",
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "nodejs",
|
|
||||||
"version": "7.9.0",
|
|
||||||
"repositoryURL": "https://github.com/nodejs/node",
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "electron",
|
|
||||||
"version": "1.7.3",
|
|
||||||
"license": "MIT",
|
|
||||||
"repositoryURL": "https://github.com/electron/electron",
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "inno setup",
|
|
||||||
"version": "5.5.6",
|
|
||||||
"repositoryURL": "https://github.com/jrsoftware/issrc",
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"isLicense": true,
|
|
||||||
"name": "ripgrep",
|
|
||||||
"repositoryURL": "https://github.com/BurntSushi/ripgrep",
|
|
||||||
"license": "MIT",
|
|
||||||
"licenseDetail": [
|
|
||||||
"The MIT License (MIT)",
|
|
||||||
"",
|
|
||||||
"Copyright (c) 2015 Andrew Gallant",
|
|
||||||
"",
|
|
||||||
"Permission is hereby granted, free of charge, to any person obtaining a copy of",
|
|
||||||
"this software and associated documentation files (the \"Software\"), to deal in",
|
|
||||||
"the Software without restriction, including without limitation the rights to",
|
|
||||||
"use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies",
|
|
||||||
"of the Software, and to permit persons to whom the Software is furnished to do",
|
|
||||||
"so, subject to the following conditions:",
|
|
||||||
"",
|
|
||||||
"The above copyright notice and this permission notice shall be included in all",
|
|
||||||
"copies or substantial portions of the Software.",
|
|
||||||
"",
|
|
||||||
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
|
|
||||||
"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
|
|
||||||
"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
|
|
||||||
"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
|
|
||||||
"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,",
|
|
||||||
"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE",
|
|
||||||
"SOFTWARE."
|
|
||||||
],
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"isLicense": true,
|
|
||||||
"name": "jschardet",
|
|
||||||
"repositoryURL": "https://github.com/aadsm/jschardet",
|
|
||||||
"license": "LGPL",
|
|
||||||
"licenseDetail": [
|
|
||||||
"Chardet was originally ported from C++ by Mark Pilgrim. It is now maintained",
|
|
||||||
" by Dan Blanchard and Ian Cordasco, and was formerly maintained by Erik Rose.",
|
|
||||||
" JSChardet was ported from python to JavaScript by António Afonso ",
|
|
||||||
" (https://github.com/aadsm/jschardet) and transformed into an npm package by ",
|
|
||||||
"Markus Ast (https://github.com/brainafk)",
|
|
||||||
"",
|
|
||||||
"GNU LESSER GENERAL PUBLIC LICENSE",
|
|
||||||
"\t\t Version 2.1, February 1999",
|
|
||||||
"",
|
|
||||||
" Copyright (C) 1991,",
|
|
||||||
"1999 Free Software Foundation, Inc.",
|
|
||||||
" 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA",
|
|
||||||
" Everyone is permitted to copy and distribute verbatim copies",
|
|
||||||
" of this license document, but changing it is not allowed.",
|
|
||||||
"",
|
|
||||||
"[This is the first released version of the Lesser GPL. It also counts",
|
|
||||||
" as the successor of the GNU Library Public License, version 2, hence",
|
|
||||||
" the version number 2.1.",
|
|
||||||
"]",
|
|
||||||
"",
|
|
||||||
"\t\t\t Preamble",
|
|
||||||
"",
|
|
||||||
" The licenses for most software are designed to take away your",
|
|
||||||
"freedom to share and change it. By contrast, the GNU General Public",
|
|
||||||
"Licenses are intended to guarantee your freedom to share and change",
|
|
||||||
"free software--to make sure the software is free for all its users.",
|
|
||||||
"",
|
|
||||||
" This license, the Lesser General Public License, applies to some",
|
|
||||||
"specially designated software packages--typically libraries--of the",
|
|
||||||
"Free Software Foundation and other authors who decide to use it. You",
|
|
||||||
"can use it too, but we suggest you first think carefully about whether",
|
|
||||||
"this license or the ordinary General Public License is the better",
|
|
||||||
"strategy to use in any particular case, based on the explanations below.",
|
|
||||||
"",
|
|
||||||
" When we speak of free software, we are referring to freedom of use,",
|
|
||||||
"not price. Our General Public Licenses are designed to make sure that",
|
|
||||||
"you have the freedom to distribute copies of free software (and charge",
|
|
||||||
"for this service if you wish); that you receive source code or can get",
|
|
||||||
"it if you want it; that you can change the software and use pieces of",
|
|
||||||
"it in new free programs; and that you are informed that you can do",
|
|
||||||
"these things.",
|
|
||||||
"",
|
|
||||||
" To protect your rights, we need to make restrictions that forbid",
|
|
||||||
"distributors to deny you these rights or to ask you to surrender these",
|
|
||||||
"rights. These restrictions translate to certain responsibilities for",
|
|
||||||
"you if you distribute copies of the library or if you modify it.",
|
|
||||||
"",
|
|
||||||
" For example, if you distribute copies of the library, whether gratis",
|
|
||||||
"or for a fee, you must give the recipients all the rights that we gave",
|
|
||||||
"you. You must make sure that they, too, receive or can get the source",
|
|
||||||
"code. If you link other code with the library, you must provide",
|
|
||||||
"complete object files to the recipients, so that they can relink them",
|
|
||||||
"with the library after making changes to the library and recompiling",
|
|
||||||
"it. And you must show them these terms so they know their rights.",
|
|
||||||
"",
|
|
||||||
" We protect your rights with a two-step method: (1) we copyright the",
|
|
||||||
"library, and (2) we offer you this license, which gives you legal",
|
|
||||||
"permission to copy, distribute and/or modify the library.",
|
|
||||||
"",
|
|
||||||
" To protect each distributor, we want to make it very clear that",
|
|
||||||
"there is no warranty for the free library. Also, if the library is",
|
|
||||||
"modified by someone else and passed on, the recipients should know",
|
|
||||||
"that what they have is not the original version, so that the original",
|
|
||||||
"author's reputation will not be affected by problems that might be",
|
|
||||||
"introduced by others.",
|
|
||||||
"",
|
|
||||||
" Finally, software patents pose a constant threat to the existence of",
|
|
||||||
"any free program. We wish to make sure that a company cannot",
|
|
||||||
"effectively restrict the users of a free program by obtaining a",
|
|
||||||
"restrictive license from a patent holder. Therefore, we insist that",
|
|
||||||
"any patent license obtained for a version of the library must be",
|
|
||||||
"consistent with the full freedom of use specified in this license.",
|
|
||||||
"",
|
|
||||||
" Most GNU software, including some libraries, is covered by the",
|
|
||||||
"ordinary GNU General Public License. This license, the GNU Lesser",
|
|
||||||
"General Public License, applies to certain designated libraries, and",
|
|
||||||
"is quite different from the ordinary General Public License. We use",
|
|
||||||
"this license for certain libraries in order to permit linking those",
|
|
||||||
"libraries into non-free programs.",
|
|
||||||
"",
|
|
||||||
" When a program is linked with a library, whether statically or using",
|
|
||||||
"a shared library, the combination of the two is legally speaking a",
|
|
||||||
"combined work, a derivative of the original library. The ordinary",
|
|
||||||
"General Public License therefore permits such linking only if the",
|
|
||||||
"entire combination fits its criteria of freedom. The Lesser General",
|
|
||||||
"Public License permits more lax criteria for linking other code with",
|
|
||||||
"the library.",
|
|
||||||
"",
|
|
||||||
" We call this license the \"Lesser\" General Public License because it",
|
|
||||||
"does Less to protect the user's freedom than the ordinary General",
|
|
||||||
"Public License. It also provides other free software developers Less",
|
|
||||||
"of an advantage over competing non-free programs. These disadvantages",
|
|
||||||
"are the reason we use the ordinary General Public License for many",
|
|
||||||
"libraries. However, the Lesser license provides advantages in certain",
|
|
||||||
"special circumstances.",
|
|
||||||
"",
|
|
||||||
" For example, on rare occasions, there may be a special need to",
|
|
||||||
"encourage the widest possible use of a certain library, so that it becomes",
|
|
||||||
"a de-facto standard. To achieve this, non-free programs must be",
|
|
||||||
"allowed to use the library. A more frequent case is that a free",
|
|
||||||
"library does the same job as widely used non-free libraries. In this",
|
|
||||||
"case, there is little to gain by limiting the free library to free",
|
|
||||||
"software only, so we use the Lesser General Public License.",
|
|
||||||
"",
|
|
||||||
" In other cases, permission to use a particular library in non-free",
|
|
||||||
"programs enables a greater number of people to use a large body of",
|
|
||||||
"free software. For example, permission to use the GNU C Library in",
|
|
||||||
"non-free programs enables many more people to use the whole GNU",
|
|
||||||
"operating system, as well as its variant, the GNU/Linux operating",
|
|
||||||
"system.",
|
|
||||||
"",
|
|
||||||
" Although the Lesser General Public License is Less protective of the",
|
|
||||||
"users' freedom, it does ensure that the user of a program that is",
|
|
||||||
"linked with the Library has the freedom and the wherewithal to run",
|
|
||||||
"that program using a modified version of the Library.",
|
|
||||||
"",
|
|
||||||
" The precise terms and conditions for copying, distribution and",
|
|
||||||
"modification follow. Pay close attention to the difference between a",
|
|
||||||
"\"work based on the library\" and a \"work that uses the library\". The",
|
|
||||||
"former contains code derived from the library, whereas the latter must",
|
|
||||||
"be combined with the library in order to run.",
|
|
||||||
"",
|
|
||||||
"\t\t GNU LESSER GENERAL PUBLIC LICENSE",
|
|
||||||
" TERMS AND CONDITIONS FOR COPYING, DISTRIBUTION AND MODIFICATION",
|
|
||||||
"",
|
|
||||||
" 0. This License Agreement applies to any software library or other",
|
|
||||||
"program which contains a notice placed by the copyright holder or",
|
|
||||||
"other authorized party saying it may be distributed under the terms of",
|
|
||||||
"this Lesser General Public License (also called \"this License\").",
|
|
||||||
"Each licensee is addressed as \"you\".",
|
|
||||||
"",
|
|
||||||
" A \"library\" means a collection of software functions and/or data",
|
|
||||||
"prepared so as to be conveniently linked with application programs",
|
|
||||||
"(which use some of those functions and data) to form executables.",
|
|
||||||
"",
|
|
||||||
" The \"Library\", below, refers to any such software library or work",
|
|
||||||
"which has been distributed under these terms. A \"work based on the",
|
|
||||||
"Library\" means either the Library or any derivative work under",
|
|
||||||
"copyright law: that is to say, a work containing the Library or a",
|
|
||||||
"portion of it, either verbatim or with modifications and/or translated",
|
|
||||||
"straightforwardly into another language. (Hereinafter, translation is",
|
|
||||||
"included without limitation in the term \"modification\".)",
|
|
||||||
"",
|
|
||||||
" \"Source code\" for a work means the preferred form of the work for",
|
|
||||||
"making modifications to it. For a library, complete source code means",
|
|
||||||
"all the source code for all modules it contains, plus any associated",
|
|
||||||
"interface definition files, plus the scripts used to control compilation",
|
|
||||||
"and installation of the library.",
|
|
||||||
"",
|
|
||||||
" Activities other than copying, distribution and modification are not",
|
|
||||||
"covered by this License; they are outside its scope. The act of",
|
|
||||||
"running a program using the Library is not restricted, and output from",
|
|
||||||
"such a program is covered only if its contents constitute a work based",
|
|
||||||
"on the Library (independent of the use of the Library in a tool for",
|
|
||||||
"writing it). Whether that is true depends on what the Library does",
|
|
||||||
"and what the program that uses the Library does.",
|
|
||||||
"",
|
|
||||||
" 1. You may copy and distribute verbatim copies of the Library's",
|
|
||||||
"complete source code as you receive it, in any medium, provided that",
|
|
||||||
"you conspicuously and appropriately publish on each copy an",
|
|
||||||
"appropriate copyright notice and disclaimer of warranty; keep intact",
|
|
||||||
"all the notices that refer to this License and to the absence of any",
|
|
||||||
"warranty; and distribute a copy of this License along with the",
|
|
||||||
"Library.",
|
|
||||||
"",
|
|
||||||
" You may charge a fee for the physical act of transferring a copy,",
|
|
||||||
"and you may at your option offer warranty protection in exchange for a",
|
|
||||||
"fee.",
|
|
||||||
"",
|
|
||||||
" 2. You may modify your copy or copies of the Library or any portion",
|
|
||||||
"of it, thus forming a work based on the Library, and copy and",
|
|
||||||
"distribute such modifications or work under the terms of Section 1",
|
|
||||||
"above, provided that you also meet all of these conditions:",
|
|
||||||
"",
|
|
||||||
" a) The modified work must itself be a software library.",
|
|
||||||
"",
|
|
||||||
" b) You must cause the files modified to carry prominent notices",
|
|
||||||
" stating that you changed the files and the date of any change.",
|
|
||||||
"",
|
|
||||||
" c) You must cause the whole of the work to be licensed at no",
|
|
||||||
" charge to all third parties under the terms of this License.",
|
|
||||||
"",
|
|
||||||
" d) If a facility in the modified Library refers to a function or a",
|
|
||||||
" table of data to be supplied by an application program that uses",
|
|
||||||
" the facility, other than as an argument passed when the facility",
|
|
||||||
" is invoked, then you must make a good faith effort to ensure that,",
|
|
||||||
" in the event an application does not supply such function or",
|
|
||||||
" table, the facility still operates, and performs whatever part of",
|
|
||||||
" its purpose remains meaningful.",
|
|
||||||
"",
|
|
||||||
" (For example, a function in a library to compute square roots has",
|
|
||||||
" a purpose that is entirely well-defined independent of the",
|
|
||||||
" application. Therefore, Subsection 2d requires that any",
|
|
||||||
" application-supplied function or table used by this function must",
|
|
||||||
" be optional: if the application does not supply it, the square",
|
|
||||||
" root function must still compute square roots.)",
|
|
||||||
"",
|
|
||||||
"These requirements apply to the modified work as a whole. If",
|
|
||||||
"identifiable sections of that work are not derived from the Library,",
|
|
||||||
"and can be reasonably considered independent and separate works in",
|
|
||||||
"themselves, then this License, and its terms, do not apply to those",
|
|
||||||
"sections when you distribute them as separate works. But when you",
|
|
||||||
"distribute the same sections as part of a whole which is a work based",
|
|
||||||
"on the Library, the distribution of the whole must be on the terms of",
|
|
||||||
"this License, whose permissions for other licensees extend to the",
|
|
||||||
"entire whole, and thus to each and every part regardless of who wrote",
|
|
||||||
"it.",
|
|
||||||
"",
|
|
||||||
"Thus, it is not the intent of this section to claim rights or contest",
|
|
||||||
"your rights to work written entirely by you; rather, the intent is to",
|
|
||||||
"exercise the right to control the distribution of derivative or",
|
|
||||||
"collective works based on the Library.",
|
|
||||||
"",
|
|
||||||
"In addition, mere aggregation of another work not based on the Library",
|
|
||||||
"with the Library (or with a work based on the Library) on a volume of",
|
|
||||||
"a storage or distribution medium does not bring the other work under",
|
|
||||||
"the scope of this License.",
|
|
||||||
"",
|
|
||||||
" 3. You may opt to apply the terms of the ordinary GNU General Public",
|
|
||||||
"License instead of this License to a given copy of the Library. To do",
|
|
||||||
"this, you must alter all the notices that refer to this License, so",
|
|
||||||
"that they refer to the ordinary GNU General Public License, version 2,",
|
|
||||||
"instead of to this License. (If a newer version than version 2 of the",
|
|
||||||
"ordinary GNU General Public License has appeared, then you can specify",
|
|
||||||
"that version instead if you wish.) Do not make any other change in",
|
|
||||||
"these notices.",
|
|
||||||
"",
|
|
||||||
" Once this change is made in a given copy, it is irreversible for",
|
|
||||||
"that copy, so the ordinary GNU General Public License applies to all",
|
|
||||||
"subsequent copies and derivative works made from that copy.",
|
|
||||||
"",
|
|
||||||
" This option is useful when you wish to copy part of the code of",
|
|
||||||
"the Library into a program that is not a library.",
|
|
||||||
"",
|
|
||||||
" 4. You may copy and distribute the Library (or a portion or",
|
|
||||||
"derivative of it, under Section 2) in object code or executable form",
|
|
||||||
"under the terms of Sections 1 and 2 above provided that you accompany",
|
|
||||||
"it with the complete corresponding machine-readable source code, which",
|
|
||||||
"must be distributed under the terms of Sections 1 and 2 above on a",
|
|
||||||
"medium customarily used for software interchange.",
|
|
||||||
"",
|
|
||||||
" If distribution of object code is made by offering access to copy",
|
|
||||||
"from a designated place, then offering equivalent access to copy the",
|
|
||||||
"source code from the same place satisfies the requirement to",
|
|
||||||
"distribute the source code, even though third parties are not",
|
|
||||||
"compelled to copy the source along with the object code.",
|
|
||||||
"",
|
|
||||||
" 5. A program that contains no derivative of any portion of the",
|
|
||||||
"Library, but is designed to work with the Library by being compiled or",
|
|
||||||
"linked with it, is called a \"work that uses the Library\". Such a",
|
|
||||||
"work, in isolation, is not a derivative work of the Library, and",
|
|
||||||
"therefore falls outside the scope of this License.",
|
|
||||||
"",
|
|
||||||
" However, linking a \"work that uses the Library\" with the Library",
|
|
||||||
"creates an executable that is a derivative of the Library (because it",
|
|
||||||
"contains portions of the Library), rather than a \"work that uses the",
|
|
||||||
"library\". The executable is therefore covered by this License.",
|
|
||||||
"Section 6 states terms for distribution of such executables.",
|
|
||||||
"",
|
|
||||||
" When a \"work that uses the Library\" uses material from a header file",
|
|
||||||
"that is part of the Library, the object code for the work may be a",
|
|
||||||
"derivative work of the Library even though the source code is not.",
|
|
||||||
"Whether this is true is especially significant if the work can be",
|
|
||||||
"linked without the Library, or if the work is itself a library. The",
|
|
||||||
"threshold for this to be true is not precisely defined by law.",
|
|
||||||
"",
|
|
||||||
" If such an object file uses only numerical parameters, data",
|
|
||||||
"structure layouts and accessors, and small macros and small inline",
|
|
||||||
"functions (ten lines or less in length), then the use of the object",
|
|
||||||
"file is unrestricted, regardless of whether it is legally a derivative",
|
|
||||||
"work. (Executables containing this object code plus portions of the",
|
|
||||||
"Library will still fall under Section 6.)",
|
|
||||||
"",
|
|
||||||
" Otherwise, if the work is a derivative of the Library, you may",
|
|
||||||
"distribute the object code for the work under the terms of Section 6.",
|
|
||||||
"Any executables containing that work also fall under Section 6,",
|
|
||||||
"whether or not they are linked directly with the Library itself.",
|
|
||||||
"",
|
|
||||||
" 6. As an exception to the Sections above, you may also combine or",
|
|
||||||
"link a \"work that uses the Library\" with the Library to produce a",
|
|
||||||
"work containing portions of the Library, and distribute that work",
|
|
||||||
"under terms of your choice, provided that the terms permit",
|
|
||||||
"modification of the work for the customer's own use and reverse",
|
|
||||||
"engineering for debugging such modifications.",
|
|
||||||
"",
|
|
||||||
" You must give prominent notice with each copy of the work that the",
|
|
||||||
"Library is used in it and that the Library and its use are covered by",
|
|
||||||
"this License. You must supply a copy of this License. If the work",
|
|
||||||
"during execution displays copyright notices, you must include the",
|
|
||||||
"copyright notice for the Library among them, as well as a reference",
|
|
||||||
"directing the user to the copy of this License. Also, you must do one",
|
|
||||||
"of these things:",
|
|
||||||
"",
|
|
||||||
" a) Accompany the work with the complete corresponding",
|
|
||||||
" machine-readable source code for the Library including whatever",
|
|
||||||
" changes were used in the work (which must be distributed under",
|
|
||||||
" Sections 1 and 2 above); and, if the work is an executable linked",
|
|
||||||
" with the Library, with the complete machine-readable \"work that",
|
|
||||||
" uses the Library\", as object code and/or source code, so that the",
|
|
||||||
" user can modify the Library and then relink to produce a modified",
|
|
||||||
" executable containing the modified Library. (It is understood",
|
|
||||||
" that the user who changes the contents of definitions files in the",
|
|
||||||
" Library will not necessarily be able to recompile the application",
|
|
||||||
" to use the modified definitions.)",
|
|
||||||
"",
|
|
||||||
" b) Use a suitable shared library mechanism for linking with the",
|
|
||||||
" Library. A suitable mechanism is one that (1) uses at run time a",
|
|
||||||
" copy of the library already present on the user's computer system,",
|
|
||||||
" rather than copying library functions into the executable, and (2)",
|
|
||||||
" will operate properly with a modified version of the library, if",
|
|
||||||
" the user installs one, as long as the modified version is",
|
|
||||||
" interface-compatible with the version that the work was made with.",
|
|
||||||
"",
|
|
||||||
" c) Accompany the work with a written offer, valid for at",
|
|
||||||
" least three years, to give the same user the materials",
|
|
||||||
" specified in Subsection 6a, above, for a charge no more",
|
|
||||||
" than the cost of performing this distribution.",
|
|
||||||
"",
|
|
||||||
" d) If distribution of the work is made by offering access to copy",
|
|
||||||
" from a designated place, offer equivalent access to copy the above",
|
|
||||||
" specified materials from the same place.",
|
|
||||||
"",
|
|
||||||
" e) Verify that the user has already received a copy of these",
|
|
||||||
" materials or that you have already sent this user a copy.",
|
|
||||||
"",
|
|
||||||
" For an executable, the required form of the \"work that uses the",
|
|
||||||
"Library\" must include any data and utility programs needed for",
|
|
||||||
"reproducing the executable from it. However, as a special exception,",
|
|
||||||
"the materials to be distributed need not include anything that is",
|
|
||||||
"normally distributed (in either source or binary form) with the major",
|
|
||||||
"components (compiler, kernel, and so on) of the operating system on",
|
|
||||||
"which the executable runs, unless that component itself accompanies",
|
|
||||||
"the executable.",
|
|
||||||
"",
|
|
||||||
" It may happen that this requirement contradicts the license",
|
|
||||||
"restrictions of other proprietary libraries that do not normally",
|
|
||||||
"accompany the operating system. Such a contradiction means you cannot",
|
|
||||||
"use both them and the Library together in an executable that you",
|
|
||||||
"distribute.",
|
|
||||||
"",
|
|
||||||
" 7. You may place library facilities that are a work based on the",
|
|
||||||
"Library side-by-side in a single library together with other library",
|
|
||||||
"facilities not covered by this License, and distribute such a combined",
|
|
||||||
"library, provided that the separate distribution of the work based on",
|
|
||||||
"the Library and of the other library facilities is otherwise",
|
|
||||||
"permitted, and provided that you do these two things:",
|
|
||||||
"",
|
|
||||||
" a) Accompany the combined library with a copy of the same work",
|
|
||||||
" based on the Library, uncombined with any other library",
|
|
||||||
" facilities. This must be distributed under the terms of the",
|
|
||||||
" Sections above.",
|
|
||||||
"",
|
|
||||||
" b) Give prominent notice with the combined library of the fact",
|
|
||||||
" that part of it is a work based on the Library, and explaining",
|
|
||||||
" where to find the accompanying uncombined form of the same work.",
|
|
||||||
"",
|
|
||||||
" 8. You may not copy, modify, sublicense, link with, or distribute",
|
|
||||||
"the Library except as expressly provided under this License. Any",
|
|
||||||
"attempt otherwise to copy, modify, sublicense, link with, or",
|
|
||||||
"distribute the Library is void, and will automatically terminate your",
|
|
||||||
"rights under this License. However, parties who have received copies,",
|
|
||||||
"or rights, from you under this License will not have their licenses",
|
|
||||||
"terminated so long as such parties remain in full compliance.",
|
|
||||||
"",
|
|
||||||
" 9. You are not required to accept this License, since you have not",
|
|
||||||
"signed it. However, nothing else grants you permission to modify or",
|
|
||||||
"distribute the Library or its derivative works. These actions are",
|
|
||||||
"prohibited by law if you do not accept this License. Therefore, by",
|
|
||||||
"modifying or distributing the Library (or any work based on the",
|
|
||||||
"Library), you indicate your acceptance of this License to do so, and",
|
|
||||||
"all its terms and conditions for copying, distributing or modifying",
|
|
||||||
"the Library or works based on it.",
|
|
||||||
"",
|
|
||||||
" 10. Each time you redistribute the Library (or any work based on the",
|
|
||||||
"Library), the recipient automatically receives a license from the",
|
|
||||||
"original licensor to copy, distribute, link with or modify the Library",
|
|
||||||
"subject to these terms and conditions. You may not impose any further",
|
|
||||||
"restrictions on the recipients' exercise of the rights granted herein.",
|
|
||||||
"You are not responsible for enforcing compliance by third parties with",
|
|
||||||
"this License.",
|
|
||||||
"",
|
|
||||||
" 11. If, as a consequence of a court judgment or allegation of patent",
|
|
||||||
"infringement or for any other reason (not limited to patent issues),",
|
|
||||||
"conditions are imposed on you (whether by court order, agreement or",
|
|
||||||
"otherwise) that contradict the conditions of this License, they do not",
|
|
||||||
"excuse you from the conditions of this License. If you cannot",
|
|
||||||
"distribute so as to satisfy simultaneously your obligations under this",
|
|
||||||
"License and any other pertinent obligations, then as a consequence you",
|
|
||||||
"may not distribute the Library at all. For example, if a patent",
|
|
||||||
"license would not permit royalty-free redistribution of the Library by",
|
|
||||||
"all those who receive copies directly or indirectly through you, then",
|
|
||||||
"the only way you could satisfy both it and this License would be to",
|
|
||||||
"refrain entirely from distribution of the Library.",
|
|
||||||
"",
|
|
||||||
"If any portion of this section is held invalid or unenforceable under any",
|
|
||||||
"particular circumstance, the balance of the section is intended to apply,",
|
|
||||||
"and the section as a whole is intended to apply in other circumstances.",
|
|
||||||
"",
|
|
||||||
"It is not the purpose of this section to induce you to infringe any",
|
|
||||||
"patents or other property right claims or to contest validity of any",
|
|
||||||
"such claims; this section has the sole purpose of protecting the",
|
|
||||||
"integrity of the free software distribution system which is",
|
|
||||||
"implemented by public license practices. Many people have made",
|
|
||||||
"generous contributions to the wide range of software distributed",
|
|
||||||
"through that system in reliance on consistent application of that",
|
|
||||||
"system; it is up to the author/donor to decide if he or she is willing",
|
|
||||||
"to distribute software through any other system and a licensee cannot",
|
|
||||||
"impose that choice.",
|
|
||||||
"",
|
|
||||||
"This section is intended to make thoroughly clear what is believed to",
|
|
||||||
"be a consequence of the rest of this License.",
|
|
||||||
"",
|
|
||||||
" 12. If the distribution and/or use of the Library is restricted in",
|
|
||||||
"certain countries either by patents or by copyrighted interfaces, the",
|
|
||||||
"original copyright holder who places the Library under this License may add",
|
|
||||||
"an explicit geographical distribution limitation excluding those countries,",
|
|
||||||
"so that distribution is permitted only in or among countries not thus",
|
|
||||||
"excluded. In such case, this License incorporates the limitation as if",
|
|
||||||
"written in the body of this License.",
|
|
||||||
"",
|
|
||||||
" 13. The Free Software Foundation may publish revised and/or new",
|
|
||||||
"versions of the Lesser General Public License from time to time.",
|
|
||||||
"Such new versions will be similar in spirit to the present version,",
|
|
||||||
"but may differ in detail to address new problems or concerns.",
|
|
||||||
"",
|
|
||||||
"Each version is given a distinguishing version number. If the Library",
|
|
||||||
"specifies a version number of this License which applies to it and",
|
|
||||||
"\"any later version\", you have the option of following the terms and",
|
|
||||||
"conditions either of that version or of any later version published by",
|
|
||||||
"the Free Software Foundation. If the Library does not specify a",
|
|
||||||
"license version number, you may choose any version ever published by",
|
|
||||||
"the Free Software Foundation.",
|
|
||||||
"",
|
|
||||||
" 14. If you wish to incorporate parts of the Library into other free",
|
|
||||||
"programs whose distribution conditions are incompatible with these,",
|
|
||||||
"write to the author to ask for permission. For software which is",
|
|
||||||
"copyrighted by the Free Software Foundation, write to the Free",
|
|
||||||
"Software Foundation; we sometimes make exceptions for this. Our",
|
|
||||||
"decision will be guided by the two goals of preserving the free status",
|
|
||||||
"of all derivatives of our free software and of promoting the sharing",
|
|
||||||
"and reuse of software generally.",
|
|
||||||
"",
|
|
||||||
"\t\t\t NO WARRANTY",
|
|
||||||
"",
|
|
||||||
" 15. BECAUSE THE LIBRARY IS LICENSED FREE OF CHARGE, THERE IS NO",
|
|
||||||
"WARRANTY FOR THE LIBRARY, TO THE EXTENT PERMITTED BY APPLICABLE LAW.",
|
|
||||||
"EXCEPT WHEN OTHERWISE STATED IN WRITING THE COPYRIGHT HOLDERS AND/OR",
|
|
||||||
"OTHER PARTIES PROVIDE THE LIBRARY \"AS IS\" WITHOUT WARRANTY OF ANY",
|
|
||||||
"KIND, EITHER EXPRESSED OR IMPLIED, INCLUDING, BUT NOT LIMITED TO, THE",
|
|
||||||
"IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR",
|
|
||||||
"PURPOSE. THE ENTIRE RISK AS TO THE QUALITY AND PERFORMANCE OF THE",
|
|
||||||
"LIBRARY IS WITH YOU. SHOULD THE LIBRARY PROVE DEFECTIVE, YOU ASSUME",
|
|
||||||
"THE COST OF ALL NECESSARY SERVICING, REPAIR OR CORRECTION.",
|
|
||||||
"",
|
|
||||||
" 16. IN NO EVENT UNLESS REQUIRED BY APPLICABLE LAW OR AGREED TO IN",
|
|
||||||
"WRITING WILL ANY COPYRIGHT HOLDER, OR ANY OTHER PARTY WHO MAY MODIFY",
|
|
||||||
"AND/OR REDISTRIBUTE THE LIBRARY AS PERMITTED ABOVE, BE LIABLE TO YOU",
|
|
||||||
"FOR DAMAGES, INCLUDING ANY GENERAL, SPECIAL, INCIDENTAL OR",
|
|
||||||
"CONSEQUENTIAL DAMAGES ARISING OUT OF THE USE OR INABILITY TO USE THE",
|
|
||||||
"LIBRARY (INCLUDING BUT NOT LIMITED TO LOSS OF DATA OR DATA BEING",
|
|
||||||
"RENDERED INACCURATE OR LOSSES SUSTAINED BY YOU OR THIRD PARTIES OR A",
|
|
||||||
"FAILURE OF THE LIBRARY TO OPERATE WITH ANY OTHER SOFTWARE), EVEN IF",
|
|
||||||
"SUCH HOLDER OR OTHER PARTY HAS BEEN ADVISED OF THE POSSIBILITY OF SUCH",
|
|
||||||
"DAMAGES.",
|
|
||||||
"",
|
|
||||||
"\t\t END OF TERMS AND CONDITIONS",
|
|
||||||
"",
|
|
||||||
" How to Apply These Terms to Your New Libraries",
|
|
||||||
"",
|
|
||||||
" If you develop a new library, and you want it to be of the greatest",
|
|
||||||
"possible use to the public, we recommend making it free software that",
|
|
||||||
"everyone can redistribute and change. You can do so by permitting",
|
|
||||||
"redistribution under these terms (or, alternatively, under the terms of the",
|
|
||||||
"ordinary General Public License).",
|
|
||||||
"",
|
|
||||||
" To apply these terms, attach the following notices to the library. It is",
|
|
||||||
"safest to attach them to the start of each source file to most effectively",
|
|
||||||
"convey the exclusion of warranty; and each file should have at least the",
|
|
||||||
"\"copyright\" line and a pointer to where the full notice is found.",
|
|
||||||
"",
|
|
||||||
" <one line to give the library's name and a brief idea of what it does.>",
|
|
||||||
" Copyright (C) <year> <name of author>",
|
|
||||||
"",
|
|
||||||
" This library is free software; you can redistribute it and/or",
|
|
||||||
" modify it under the terms of the GNU Lesser General Public",
|
|
||||||
" License as published by the Free Software Foundation; either",
|
|
||||||
" version 2.1 of the License, or (at your option) any later version.",
|
|
||||||
"",
|
|
||||||
" This library is distributed in the hope that it will be useful,",
|
|
||||||
" but WITHOUT ANY WARRANTY; without even the implied warranty of",
|
|
||||||
" MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU",
|
|
||||||
" Lesser General Public License for more details.",
|
|
||||||
"",
|
|
||||||
" You should have received a copy of the GNU Lesser General Public",
|
|
||||||
" License along with this library; if not, write to the Free Software",
|
|
||||||
" Foundation, Inc.,",
|
|
||||||
"51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA",
|
|
||||||
"",
|
|
||||||
"Also add information on how to contact you by electronic and paper mail.",
|
|
||||||
"",
|
|
||||||
"You should also get your employer (if you work as a programmer) or your",
|
|
||||||
"school, if any, to sign a \"copyright disclaimer\" for the library, if",
|
|
||||||
"necessary. Here is a sample; alter the names:",
|
|
||||||
"",
|
|
||||||
" Yoyodyne, Inc., hereby disclaims all copyright interest in the",
|
|
||||||
" library `Frob' (a library for tweaking knobs) written by James Random Hacker.",
|
|
||||||
"",
|
|
||||||
" <signature of Ty Coon>,",
|
|
||||||
"1 April 1990",
|
|
||||||
" Ty Coon, President of Vice",
|
|
||||||
"",
|
|
||||||
"That's all there is to it!"
|
|
||||||
],
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"isLicense": true,
|
|
||||||
"name": "@types/node",
|
|
||||||
"repositoryURL": "https://www.github.com/DefinitelyTyped/DefinitelyTyped",
|
|
||||||
"license": "MIT",
|
|
||||||
"licenseDetail": [
|
|
||||||
"This project is licensed under the MIT license.",
|
|
||||||
"Copyrights are respective of each contributor listed at the beginning of each definition file.",
|
|
||||||
"",
|
|
||||||
"Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the \"Software\"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:",
|
|
||||||
"",
|
|
||||||
"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
|
|
||||||
"",
|
|
||||||
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
|
|
||||||
],
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"isLicense": true,
|
|
||||||
"name": "jsonfile",
|
|
||||||
"repositoryURL": "https+ssh://git@github.com/jprichardson/node-jsonfile",
|
|
||||||
"license": "MIT",
|
|
||||||
"licenseDetail": [
|
|
||||||
"(The MIT License)",
|
|
||||||
"",
|
|
||||||
"Copyright (c) 2012-2015, JP Richardson <jprichardson@gmail.com>",
|
|
||||||
"",
|
|
||||||
"Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files",
|
|
||||||
"(the 'Software'), to deal in the Software without restriction, including without limitation the rights to use, copy, modify,",
|
|
||||||
" merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is",
|
|
||||||
" furnished to do so, subject to the following conditions:",
|
|
||||||
"",
|
|
||||||
"The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.",
|
|
||||||
"",
|
|
||||||
"THE SOFTWARE IS PROVIDED 'AS IS', WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE",
|
|
||||||
"WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS",
|
|
||||||
"OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,",
|
|
||||||
" ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE."
|
|
||||||
],
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"isLicense": true,
|
|
||||||
"name": "string_decoder",
|
|
||||||
"repositoryURL": "https://github.com/rvagg/string_decoder",
|
|
||||||
"license": "MIT",
|
|
||||||
"licenseDetail": [
|
|
||||||
"The MIT License (MIT)",
|
|
||||||
"",
|
|
||||||
"Node.js is licensed for use as follows:",
|
|
||||||
"",
|
|
||||||
"\"\"\"",
|
|
||||||
"Copyright Node.js contributors. All rights reserved.",
|
|
||||||
"",
|
|
||||||
"Permission is hereby granted, free of charge, to any person obtaining a copy",
|
|
||||||
"of this software and associated documentation files (the \"Software\"), to",
|
|
||||||
"deal in the Software without restriction, including without limitation the",
|
|
||||||
"rights to use, copy, modify, merge, publish, distribute, sublicense, and/or",
|
|
||||||
"sell copies of the Software, and to permit persons to whom the Software is",
|
|
||||||
"furnished to do so, subject to the following conditions:",
|
|
||||||
"",
|
|
||||||
"The above copyright notice and this permission notice shall be included in",
|
|
||||||
"all copies or substantial portions of the Software.",
|
|
||||||
"",
|
|
||||||
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
|
|
||||||
"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
|
|
||||||
"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
|
|
||||||
"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
|
|
||||||
"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING",
|
|
||||||
"FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS",
|
|
||||||
"IN THE SOFTWARE.",
|
|
||||||
"\"\"\"",
|
|
||||||
"",
|
|
||||||
"This license applies to parts of Node.js originating from the",
|
|
||||||
"https://github.com/joyent/node repository:",
|
|
||||||
"",
|
|
||||||
"\"\"\"",
|
|
||||||
"Copyright Joyent, Inc. and other Node contributors. All rights reserved.",
|
|
||||||
"Permission is hereby granted, free of charge, to any person obtaining a copy",
|
|
||||||
"of this software and associated documentation files (the \"Software\"), to",
|
|
||||||
"deal in the Software without restriction, including without limitation the",
|
|
||||||
"rights to use, copy, modify, merge, publish, distribute, sublicense, and/or",
|
|
||||||
"sell copies of the Software, and to permit persons to whom the Software is",
|
|
||||||
"furnished to do so, subject to the following conditions:",
|
|
||||||
"",
|
|
||||||
"The above copyright notice and this permission notice shall be included in",
|
|
||||||
"all copies or substantial portions of the Software.",
|
|
||||||
"",
|
|
||||||
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
|
|
||||||
"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
|
|
||||||
"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
|
|
||||||
"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
|
|
||||||
"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING",
|
|
||||||
"FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS",
|
|
||||||
"IN THE SOFTWARE.",
|
|
||||||
"\"\"\""
|
|
||||||
],
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "spdlog original",
|
|
||||||
"version": "0.14.0",
|
|
||||||
"repositoryURL": "https://github.com/gabime/spdlog",
|
|
||||||
"license": "MIT",
|
|
||||||
"isProd": true
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"isLicense": true,
|
|
||||||
"name": "spdlog",
|
|
||||||
"version": "0.14.0",
|
|
||||||
"repositoryURL": "https://github.com/gabime/spdlog",
|
|
||||||
"license": "MIT",
|
|
||||||
"licenseDetail": [
|
|
||||||
"MIT License",
|
|
||||||
"",
|
|
||||||
"Copyright (c) Microsoft Corporation. All rights reserved.",
|
|
||||||
"",
|
|
||||||
"Permission is hereby granted, free of charge, to any person obtaining a copy",
|
|
||||||
"of this software and associated documentation files (the \"Software\"), to deal",
|
|
||||||
"in the Software without restriction, including without limitation the rights",
|
|
||||||
"to use, copy, modify, merge, publish, distribute, sublicense, and/or sell",
|
|
||||||
"copies of the Software, and to permit persons to whom the Software is",
|
|
||||||
"furnished to do so, subject to the following conditions:",
|
|
||||||
"",
|
|
||||||
"The above copyright notice and this permission notice shall be included in all",
|
|
||||||
"copies or substantial portions of the Software.",
|
|
||||||
"",
|
|
||||||
"THE SOFTWARE IS PROVIDED \"AS IS\", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR",
|
|
||||||
"IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,",
|
|
||||||
"FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE",
|
|
||||||
"AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER",
|
|
||||||
"LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,",
|
|
||||||
"OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE",
|
|
||||||
"SOFTWARE"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
96
README.md
96
README.md
@@ -1,25 +1,32 @@
|
|||||||
# SQL Operations Studio
|
# Azure Data Studio
|
||||||
|
|
||||||
[](https://gitter.im/Microsoft/sqlopsstudio?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
[](https://gitter.im/Microsoft/sqlopsstudio?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
||||||
|
[](https://dev.azure.com/ms/azuredatastudio/_build/latest?definitionId=4)
|
||||||
|
|
||||||
SQL Operations Studio is a data management tool that enables you to work with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.
|
Azure Data Studio is a data management tool that enables you to work with SQL Server, Azure SQL DB and SQL DW from Windows, macOS and Linux.
|
||||||
|
|
||||||
**Download SQL Operations Studio May Public Preview**
|
**Download the latest Azure Data Studio release**
|
||||||
|
|
||||||
Platform | Link
|
Platform | Link
|
||||||
-- | --
|
-- | --
|
||||||
Windows Setup Installer | https://go.microsoft.com/fwlink/?linkid=873386
|
Windows User Installer | https://go.microsoft.com/fwlink/?linkid=2072725
|
||||||
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=873387
|
Windows System Installer | https://go.microsoft.com/fwlink/?linkid=2072728
|
||||||
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=873388
|
Windows ZIP | https://go.microsoft.com/fwlink/?linkid=2072354
|
||||||
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=873389
|
macOS ZIP | https://go.microsoft.com/fwlink/?linkid=2072737
|
||||||
Linux RPM | https://go.microsoft.com/fwlink/?linkid=873390
|
Linux TAR.GZ | https://go.microsoft.com/fwlink/?linkid=2072360
|
||||||
Linux DEB | https://go.microsoft.com/fwlink/?linkid=873391
|
Linux RPM | https://go.microsoft.com/fwlink/?linkid=2072741
|
||||||
|
Linux DEB | https://go.microsoft.com/fwlink/?linkid=2072744
|
||||||
|
|
||||||
Go to our [download page](https://aka.ms/sqlopsstudio) for more specific instructions.
|
Go to our [download page](https://aka.ms/azuredatastudio) for more specific instructions.
|
||||||
|
|
||||||
Try out the latest insiders build from `master` at https://github.com/Microsoft/sqlopsstudio/releases.
|
Try out the latest insiders build from `master`:
|
||||||
|
- [Windows User Installer - **Insiders build**](https://azuredatastudio-update.azurewebsites.net/latest/win32-x64-user/insider)
|
||||||
|
- [Windows System Installer - **Insiders build**](https://azuredatastudio-update.azurewebsites.net/latest/win32-x64/insider)
|
||||||
|
- [Windows ZIP - **Insiders build**](https://azuredatastudio-update.azurewebsites.net/latest/win32-x64-archive/insider)
|
||||||
|
- [macOS ZIP - **Insiders build**](https://azuredatastudio-update.azurewebsites.net/latest/darwin/insider)
|
||||||
|
- [Linux TAR.GZ - **Insiders build**](https://azuredatastudio-update.azurewebsites.net/latest/linux-x64/insider)
|
||||||
|
|
||||||
See the [change log](https://github.com/Microsoft/sqlopsstudio/blob/master/CHANGELOG.md) for additional details of what's in this release.
|
See the [change log](https://github.com/Microsoft/azuredatastudio/blob/master/CHANGELOG.md) for additional details of what's in this release.
|
||||||
|
|
||||||
**Feature Highlights**
|
**Feature Highlights**
|
||||||
|
|
||||||
@@ -34,60 +41,89 @@ See the [change log](https://github.com/Microsoft/sqlopsstudio/blob/master/CHANG
|
|||||||
- Task History window to view current task execution status, completion results with error messages and task T-SQL scripting
|
- Task History window to view current task execution status, completion results with error messages and task T-SQL scripting
|
||||||
- Scripting support to generate CREATE, SELECT, ALTER and DROP statements for database objects
|
- Scripting support to generate CREATE, SELECT, ALTER and DROP statements for database objects
|
||||||
- Workspaces with full Git integration and Find In Files support to managing T-SQL script libraries
|
- Workspaces with full Git integration and Find In Files support to managing T-SQL script libraries
|
||||||
- Modern light-weight shell with theming, user settings, full screen support, integrated terminal and numerous other features
|
- Modern light-weight shell with theming, user settings, full-screen support, integrated terminal and numerous other features
|
||||||
|
|
||||||
Here's some of these features in action.
|
Here are some of these features in action.
|
||||||
|
|
||||||
<img src='https://github.com/Microsoft/sqlopsstudio/blob/master/docs/overview_screen.jpg' width='800px'>
|
<img src='https://github.com/Microsoft/azuredatastudio/blob/master/docs/overview_screen.jpg' width='800px'>
|
||||||
|
|
||||||
## Contributing
|
## Contributing
|
||||||
If you are interested in fixing issues and contributing directly to the code base,
|
If you are interested in fixing issues and contributing directly to the code base,
|
||||||
please see the document [How to Contribute](https://github.com/Microsoft/sqlopsstudio/wiki/How-to-Contribute), which covers the following:
|
please see the document [How to Contribute](https://github.com/Microsoft/azuredatastudio/wiki/How-to-Contribute), which covers the following:
|
||||||
|
|
||||||
* [How to build and run from source](https://github.com/Microsoft/sqlopsstudio/wiki/How-to-Contribute#Build-and-Run-From-Source)
|
* [How to build and run from source](https://github.com/Microsoft/azuredatastudio/wiki/How-to-Contribute#Build-and-Run-From-Source)
|
||||||
* [The development workflow, including debugging and running tests](https://github.com/Microsoft/sqlopsstudio/wiki/How-to-Contribute#development-workflow)
|
* [The development workflow, including debugging and running tests](https://github.com/Microsoft/azuredatastudio/wiki/How-to-Contribute#development-workflow)
|
||||||
* [Submitting pull requests](https://github.com/Microsoft/sqlopsstudio/wiki/How-to-Contribute#pull-requests)
|
* [Submitting pull requests](https://github.com/Microsoft/azuredatastudio/wiki/How-to-Contribute#pull-requests)
|
||||||
|
|
||||||
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
This project has adopted the [Microsoft Open Source Code of Conduct](https://opensource.microsoft.com/codeofconduct/). For more information see the [Code of Conduct FAQ](https://opensource.microsoft.com/codeofconduct/faq/) or contact [opencode@microsoft.com](mailto:opencode@microsoft.com) with any additional questions or comments.
|
||||||
|
|
||||||
## Localization
|
## Localization
|
||||||
SQL Operations Studio localization is now open for community contributions. You can contribute to localization for both software and docs. https://aka.ms/SQLOpsStudioLoc
|
Azure Data Studio localization is now open for community contributions. You can contribute to localization for both software and docs. https://aka.ms/SQLOpsStudioLoc
|
||||||
|
|
||||||
Localization is now opened for 10 languages: French, Italian, German, Spanish, Simplified Chinese, Traditional Chinese, Japanese, Korean, Russian, and Portuguese (Brazil). Help us make SQL Operations Studio available in your language!
|
Localization is now opened for 10 languages: French, Italian, German, Spanish, Simplified Chinese, Traditional Chinese, Japanese, Korean, Russian, and Portuguese (Brazil). Help us make Azure Data Studio available in your language!
|
||||||
|
|
||||||
## Privacy Statement
|
## Privacy Statement
|
||||||
The [Microsoft Enterprise and Developer Privacy Statement](https://privacy.microsoft.com/en-us/privacystatement) describes the privacy statement of this software.
|
The [Microsoft Enterprise and Developer Privacy Statement](https://privacy.microsoft.com/en-us/privacystatement) describes the privacy statement of this software.
|
||||||
|
|
||||||
## Contributions and "thank you"
|
## Contributions and "Thank You"
|
||||||
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
We would like to thank all our users who raised issues, and in particular the following users who helped contribute fixes:
|
||||||
|
|
||||||
|
* AlexFsmn for `Added context menu for DBs in explorer view to backup & restore db. #2277`
|
||||||
|
* sadedil for `Missing feature request: Save as XML #3729`
|
||||||
|
* gbritton1 for `Removed reference to object explorer #3463`
|
||||||
|
* Tarig0 for `Add Routine_Type to CreateStoredProc fixes #3257 (#3286)`
|
||||||
|
* oltruong for `typo fix #3025'`
|
||||||
|
* Thomas-S-B for `Removed unnecessary IErrorDetectionStrategy #749`
|
||||||
|
* Thomas-S-B for `Simplified code #750`
|
||||||
|
* rdaniels6813 for `Add query plan theme support #3031`
|
||||||
|
* Ruturaj123 for `Fixed some typos and grammatical errors #3027`
|
||||||
|
* PromoFaux for `Use emoji shortcodes in CONTRIBUTING.md instead of <20> #3009`
|
||||||
|
* ckaczor for `Fix: DATETIMEOFFSET data types should be ISO formatted #714`
|
||||||
|
* hi-im-T0dd for `Fixed sync issue with my forked master so this commit is correct #2948`
|
||||||
|
* hi-im-T0dd for `Fixed when right clicking and selecting Manage-correct name displays #2794`
|
||||||
|
* philoushka for `center the icon #2760`
|
||||||
|
* anthonypants for `Typo #2775`
|
||||||
|
* kstolte for `Fix Invalid Configuration in Launch.json #2789`
|
||||||
|
* kstolte for `Fixing a reference to SQL Ops Studio #2788`
|
||||||
|
* AlexFsmn `Feature: Ability to add connection name #2332`
|
||||||
|
* AlexFsmn `Disabled connection name input when connecting to a server. #2566`
|
||||||
|
* SebastianPfliegel `Added more saveAsCsv options #2099`
|
||||||
|
* ianychoi `Fixes a typo: Mimunum -> Minimum #1994`
|
||||||
|
* AlexFsmn `Fixed bug where proper file extension wasn't appended to the filename. #2151`
|
||||||
|
* AlexFsmn `Added functionality for adding any file to import wizard #2329`
|
||||||
|
* AlexFsmn `Fixed background issue when copying a chart to clipboard #2215`
|
||||||
|
* AlexFsmn `Fixed problem where vertical charts didn't display labels correctly. #2263`
|
||||||
|
* AlexFsmn `Fixed Initial values for charts to match visuals #2266`
|
||||||
|
* AlexFsmn `Renamed chart option labels #2264`
|
||||||
|
* AlexFsmn `Added feature for the opening file after exporting to CSV/XLS/JSON & query files #2216`
|
||||||
|
* AlexFsmm `Get Connection String should copy to clipboard #2175`
|
||||||
|
* lanceklinger `Fix for double-clicking column handle in results table #1504`
|
||||||
* westerncj for `Removed duplicate contribution from README.md (#753)`
|
* westerncj for `Removed duplicate contribution from README.md (#753)`
|
||||||
* ntovas for `Fix for duplicate extensions shown in "Save File" dialog. (#779)`
|
* ntovas for `Fix for duplicate extensions shown in "Save File" dialog. (#779)`
|
||||||
* SebastianPfliegel for `Add cursor snippet (#475)`
|
* SebastianPfliegel for `Add cursor snippet (#475)`
|
||||||
* mikaoelitiana for fix: `revert README and CONTRIBUTING after last VSCode merge (#574)`
|
* mikaoelitiana for the fix: `revert README and CONTRIBUTING after last VSCode merge (#574)`
|
||||||
* alextercete for `Reinstate menu item to install from VSIX (#682)`
|
* alextercete for `Reinstate menu item to install from VSIX (#682)`
|
||||||
* alextercete for `Fix "No extension gallery service configured" error (#427)`
|
* alextercete for `Fix "No extension gallery service configured" error (#427)`
|
||||||
* mwiedemeyer for `Fix #58: Default sort order for DB size widget (#111)`
|
* mwiedemeyer for `Fix #58: Default sort order for DB size widget (#111)`
|
||||||
* AlexTroshkin for `Show disconnect in context menu only when connectionProfile connected (#150)`
|
* AlexTroshkin for `Show disconnect in context menu only when connectionProfile connected (#150)`
|
||||||
* AlexTroshkin for `Fix #138: Invalid syntax color highlighting (identity not highlighting) (#140))`
|
* AlexTroshkin for `Fix #138: Invalid syntax color highlighting (identity not highlighting) (#140))`
|
||||||
* stebet for `Fix #153: Fixing sql snippets that failed on a DB with case-sensitive collation. (#152)`
|
* stebet for `Fix #153: Fixing sql snippets that failed on a DB with a case-sensitive collation. (#152)`
|
||||||
* SebastianPfliegel `Remove sqlExtensionHelp (#312)`
|
* SebastianPfliegel `Remove sqlExtensionHelp (#312)`
|
||||||
* olljanat for `Implemented npm version check (#314)`
|
* olljanat for `Implemented npm version check (#314)`
|
||||||
* Adam Mechanic for helping with the `whoisactive` extension
|
* Adam Machanic for helping with the `whoisactive` extension
|
||||||
* All community localization contributors
|
* All community localization contributors:
|
||||||
* French: Adrien Clerbois, ANAS BELABBES, Antoine Griffard, Arian Papillon, Eric Macarez, Eric Van Thorre, Jérémy LANDON, Matthias GROSPERRIN, Maxime COQUEREL, Olivier Guinart, thierry DEMAN-BARCELÒ, Thomas Potier
|
* French: Adrien Clerbois, ANAS BELABBES, Antoine Griffard, Arian Papillon, Eric Macarez, Eric Van Thorre, Jérémy LANDON, Matthias GROSPERRIN, Maxime COQUEREL, Olivier Guinart, thierry DEMAN-BARCELÒ, Thomas Potier
|
||||||
* Italian: Aldo Donetti, Alessandro Alpi, Andrea Dottor, Bruni Luca, Gianluca Hotz, Luca Nardi, Luigi Bruno, Marco Dal Pino, Mirco Vanini, Pasquale Ceglie, Riccardo Cappello, Sergio Govoni, Stefano Demiliani
|
* Italian: Aldo Donetti, Alessandro Alpi, Andrea Dottor, Bruni Luca, Gianluca Hotz, Luca Nardi, Luigi Bruno, Marco Dal Pino, Mirco Vanini, Pasquale Ceglie, Riccardo Cappello, Sergio Govoni, Stefano Demiliani
|
||||||
* German: Anna Henke-Gunvaldson, Ben Weissman, David Ullmer, J.M. ., Kai Modo, Konstantin Staschill, Kostja Klein, Lennart Trunk, Markus Ehrenmüller-Jensen, Mascha Kroenlein, Matthias Knoll, Mourad Louha, Thomas Hütter, Wolfgang Straßer
|
* German: Anna Henke-Gunvaldson, Ben Weissman, David Ullmer, J.M. ., Kai Modo, Konstantin Staschill, Kostja Klein, Lennart Trunk, Markus Ehrenmüller-Jensen, Mascha Kroenlein, Matthias Knoll, Mourad Louha, Thomas Hütter, Wolfgang Straßer
|
||||||
* Spanish: Alberto Poblacion, Andy Gonzalez, Carlos Mendible, Christian Araujo, Daniel D, Eickhel Mendoza, Ernesto Cardenas, Ivan Toledo Ivanovic, Fran Diaz, JESUS GIL, Jorge Serrano Pérez, José Saturnino Pimentel Juárez, Mauricio Hidalgo, Pablo Iglesias, Rikhardo Estrada Rdez, Thierry DEMAN, YOLANDA CUESTA ALTIERI
|
* Spanish: Alberto Poblacion, Andy Gonzalez, Carlos Mendible, Christian Araujo, Daniel D, Eickhel Mendoza, Ernesto Cardenas, Ivan Toledo Ivanovic, Fran Diaz, JESUS GIL, Jorge Serrano Pérez, José Saturnino Pimentel Juárez, Mauricio Hidalgo, Pablo Iglesias, Rikhardo Estrada Rdez, Thierry DEMAN, YOLANDA CUESTA ALTIERI
|
||||||
* Japanese: Fujio Kojima, Kazushi KAMEGAWA, Masayoshi Yamada, Masayuki Ozawa , Seiji Momoto, Takashi Kanai, Takayoshi Tanaka, Yoshihisa Ozaki, 庄垣内治
|
* Japanese: Fujio Kojima, Kazushi KAMEGAWA, Masayoshi Yamada, Masayuki Ozawa, Seiji Momoto, Takashi Kanai, Takayoshi Tanaka, Yoshihisa Ozaki, 庄垣内治
|
||||||
* Chinese (simplified): DAN YE, Joel Yang, Lynne Dong, Ryan(Yu) Zhang, Sheng Jiang, Wei Zhang, Zhiliang Xu
|
* Chinese (simplified): DAN YE, Joel Yang, Lynne Dong, Ryan(Yu) Zhang, Sheng Jiang, Wei Zhang, Zhiliang Xu
|
||||||
* Chinese (Traditional): Bruce Chen, Chiayi Yen, Kevin Yang, Winnie Lin, 保哥 Will, 謝政廷
|
* Chinese (Traditional): Bruce Chen, Chiayi Yen, Kevin Yang, Winnie Lin, 保哥 Will, 謝政廷
|
||||||
* Korean: Do-Kyun Kim, Evelyn Kim, Helen Jung, Hong Jmee, jeongwoo choi, Jun Hyoung Lee, Jungsun Kim정선, Justin Yoo, Kavrith mucha, Kiwoong Youm, MinGyu Ju, MVP_JUNO BEA, Sejun Kim, SOONMAN KWON, sung man ko, Yeongrak Choi, younggun kim, Youngjae Kim, 소영 이
|
* Korean: Do-Kyun Kim, Evelyn Kim, Helen Jung, Hong Jmee, jeongwoo choi, Jun Hyoung Lee, Jungsun Kim정선, Justin Yoo, Kavrith mucha, Kiwoong Youm, MinGyu Ju, MVP_JUNO BEA, Sejun Kim, SOONMAN KWON, sung man ko, Yeongrak Choi, younggun kim, Youngjae Kim, 소영 이
|
||||||
* Russian: Andrey Veselov, Anton Fontanov, Anton Savin, Elena Ostrovskaia, Igor Babichev, Maxim Zelensky, Rodion Fedechkin, Tasha T, Vladimir Zyryanov
|
* Russian: Andrey Veselov, Anton Fontanov, Anton Savin, Elena Ostrovskaia, Igor Babichev, Maxim Zelensky, Rodion Fedechkin, Tasha T, Vladimir Zyryanov
|
||||||
* Portuguese Brazil: Daniel de Sousa, Diogo Duarte, Douglas Correa, Douglas Eccker, José Emanuel Mendes, Marcelo Fernandes, Marcondes Alexandre, Roberto Fonseca, Rodrigo Crespi
|
* Portuguese Brazil: Daniel de Sousa, Diogo Duarte, Douglas Correa, Douglas Eccker, José Emanuel Mendes, Marcelo Fernandes, Marcondes Alexandre, Roberto Fonseca, Rodrigo Crespi
|
||||||
|
|
||||||
|
And of course, we'd like to thank the authors of all upstream dependencies. Please see a full list in the [ThirdPartyNotices.txt](https://raw.githubusercontent.com/Microsoft/azuredatastudio/master/ThirdPartyNotices.txt)
|
||||||
And of course we'd like to thank the authors of all upstream dependencies. Please see a full list in the [ThirdPartyNotices.txt](https://raw.githubusercontent.com/Microsoft/sqlopsstudio/master/ThirdPartyNotices.txt)
|
|
||||||
|
|
||||||
## License
|
## License
|
||||||
|
|
||||||
|
|||||||
@@ -1,4 +1,4 @@
|
|||||||
MICROSOFT SQL OPERATIONS STUDIO
|
MICROSOFT Azure Data Studio
|
||||||
|
|
||||||
THIRD-PARTY SOFTWARE NOTICES AND INFORMATION
|
THIRD-PARTY SOFTWARE NOTICES AND INFORMATION
|
||||||
Do Not Translate or Localize
|
Do Not Translate or Localize
|
||||||
@@ -17,10 +17,13 @@ expressly granted herein, whether by implication, estoppel or otherwise.
|
|||||||
chokidar: https://github.com/paulmillr/chokidar
|
chokidar: https://github.com/paulmillr/chokidar
|
||||||
comment-json: https://github.com/kaelzhang/node-comment-json
|
comment-json: https://github.com/kaelzhang/node-comment-json
|
||||||
core-js: https://github.com/zloirock/core-js
|
core-js: https://github.com/zloirock/core-js
|
||||||
|
decompress: https://github.com/kevva/decompress
|
||||||
emmet: https://github.com/emmetio/emmet
|
emmet: https://github.com/emmetio/emmet
|
||||||
error-ex: https://github.com/Qix-/node-error-ex
|
error-ex: https://github.com/Qix-/node-error-ex
|
||||||
escape-string-regexp: https://github.com/sindresorhus/escape-string-regexp
|
escape-string-regexp: https://github.com/sindresorhus/escape-string-regexp
|
||||||
fast-plist: https://github.com/Microsoft/node-fast-plist
|
fast-plist: https://github.com/Microsoft/node-fast-plist
|
||||||
|
figures: https://github.com/sindresorhus/figures
|
||||||
|
find-remove: https://www.npmjs.com/package/find-remove
|
||||||
fs-extra: https://github.com/jprichardson/node-fs-extra
|
fs-extra: https://github.com/jprichardson/node-fs-extra
|
||||||
gc-signals: https://github.com/Microsoft/node-gc-signals
|
gc-signals: https://github.com/Microsoft/node-gc-signals
|
||||||
getmac: https://github.com/bevry/getmac
|
getmac: https://github.com/bevry/getmac
|
||||||
@@ -33,28 +36,35 @@ expressly granted herein, whether by implication, estoppel or otherwise.
|
|||||||
jquery-ui: https://github.com/jquery/jquery-ui
|
jquery-ui: https://github.com/jquery/jquery-ui
|
||||||
jquery.event.drag: https://github.com/devongovett/jquery.event.drag
|
jquery.event.drag: https://github.com/devongovett/jquery.event.drag
|
||||||
jschardet: https://github.com/aadsm/jschardet
|
jschardet: https://github.com/aadsm/jschardet
|
||||||
|
JupyterLab: https://github.com/jupyterlab/jupyterlab
|
||||||
make-error: https://github.com/JsCommunity/make-error
|
make-error: https://github.com/JsCommunity/make-error
|
||||||
minimist: https://github.com/substack/minimist
|
minimist: https://github.com/substack/minimist
|
||||||
moment: https://github.com/moment/moment
|
moment: https://github.com/moment/moment
|
||||||
native-keymap: https://github.com/Microsoft/node-native-keymap
|
native-keymap: https://github.com/Microsoft/node-native-keymap
|
||||||
native-watchdog: https://github.com/Microsoft/node-native-watchdog
|
native-watchdog: https://github.com/Microsoft/node-native-watchdog
|
||||||
ng2-charts: https://github.com/valor-software/ng2-charts
|
ng2-charts: https://github.com/valor-software/ng2-charts
|
||||||
|
node-fetch: https://github.com/bitinn/node-fetch
|
||||||
node-pty: https://github.com/Tyriar/node-pty
|
node-pty: https://github.com/Tyriar/node-pty
|
||||||
nsfw: https://github.com/Axosoft/nsfw
|
nsfw: https://github.com/Axosoft/nsfw
|
||||||
pretty-data: https://github.com/vkiryukhin/pretty-data
|
pretty-data: https://github.com/vkiryukhin/pretty-data
|
||||||
primeng: https://github.com/primefaces/primeng
|
primeng: https://github.com/primefaces/primeng
|
||||||
|
process-nextick-args: https://github.com/calvinmetcalf/process-nextick-args
|
||||||
pty.js: https://github.com/chjj/pty.js
|
pty.js: https://github.com/chjj/pty.js
|
||||||
reflect-metadata: https://github.com/rbuckton/reflect-metadata
|
reflect-metadata: https://github.com/rbuckton/reflect-metadata
|
||||||
|
request: https://github.com/request/request
|
||||||
rxjs: https://github.com/ReactiveX/RxJS
|
rxjs: https://github.com/ReactiveX/RxJS
|
||||||
semver: https://github.com/npm/node-semver
|
semver: https://github.com/npm/node-semver
|
||||||
slickgrid: https://github.com/6pac/SlickGrid
|
slickgrid: https://github.com/6pac/SlickGrid
|
||||||
sqltoolsservice: https://github.com/Microsoft/sqltoolsservice
|
sqltoolsservice: https://github.com/Microsoft/sqltoolsservice
|
||||||
svg.js: https://github.com/svgdotjs/svg.js
|
svg.js: https://github.com/svgdotjs/svg.js
|
||||||
systemjs: https://github.com/systemjs/systemjs
|
systemjs: https://github.com/systemjs/systemjs
|
||||||
|
temp-write: https://github.com/sindresorhus/temp-write
|
||||||
underscore: https://github.com/jashkenas/underscore
|
underscore: https://github.com/jashkenas/underscore
|
||||||
v8-profiler: https://github.com/node-inspector/v8-profiler
|
v8-profiler: https://github.com/node-inspector/v8-profiler
|
||||||
vscode: https://github.com/microsoft/vscode
|
vscode: https://github.com/microsoft/vscode
|
||||||
vscode-debugprotocol: https://github.com/Microsoft/vscode-debugadapter-node
|
vscode-debugprotocol: https://github.com/Microsoft/vscode-debugadapter-node
|
||||||
|
vscode-languageclient: https://github.com/Microsoft/vscode-languageserver-node
|
||||||
|
vscode-nls: https://github.com/Microsoft/vscode-nls
|
||||||
vscode-ripgrep: https://github.com/roblourens/vscode-ripgrep
|
vscode-ripgrep: https://github.com/roblourens/vscode-ripgrep
|
||||||
vscode-textmate: https://github.com/Microsoft/vscode-textmate
|
vscode-textmate: https://github.com/Microsoft/vscode-textmate
|
||||||
winreg: https://github.com/fresc81/node-winreg
|
winreg: https://github.com/fresc81/node-winreg
|
||||||
@@ -62,10 +72,9 @@ expressly granted herein, whether by implication, estoppel or otherwise.
|
|||||||
yauzl: https://github.com/thejoshwolfe/yauzl
|
yauzl: https://github.com/thejoshwolfe/yauzl
|
||||||
zone.js: https://www.npmjs.com/package/zone
|
zone.js: https://www.npmjs.com/package/zone
|
||||||
|
|
||||||
|
Microsoft PROSE SDK: https://microsoft.github.io/prose
|
||||||
|
|
||||||
%% angular NOTICES AND INFORMATION BEGIN HERE
|
%% angular NOTICES AND INFORMATION BEGIN HERE
|
||||||
=========================================
|
|
||||||
The MIT License
|
|
||||||
|
|
||||||
Copyright (c) 2014-2017 Google, Inc. http://angular.io
|
Copyright (c) 2014-2017 Google, Inc. http://angular.io
|
||||||
|
|
||||||
@@ -291,6 +300,20 @@ THE SOFTWARE.
|
|||||||
=========================================
|
=========================================
|
||||||
END OF core-js NOTICES AND INFORMATION
|
END OF core-js NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% decompress NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) Kevin Mårtensson <kevinmartensson@gmail.com> (github.com/kevva)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
=========================================
|
||||||
|
END OF decompress NOTICES AND INFORMATION
|
||||||
|
|
||||||
%% emmet NOTICES AND INFORMATION BEGIN HERE
|
%% emmet NOTICES AND INFORMATION BEGIN HERE
|
||||||
=========================================
|
=========================================
|
||||||
The MIT License (MIT)
|
The MIT License (MIT)
|
||||||
@@ -392,6 +415,20 @@ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL
|
|||||||
=========================================
|
=========================================
|
||||||
END OF fast-plist NOTICES AND INFORMATION
|
END OF fast-plist NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% figures NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
=========================================
|
||||||
|
END OF figures NOTICES AND INFORMATION
|
||||||
|
|
||||||
%% fs-extra NOTICES AND INFORMATION BEGIN HERE
|
%% fs-extra NOTICES AND INFORMATION BEGIN HERE
|
||||||
=========================================
|
=========================================
|
||||||
(The MIT License)
|
(The MIT License)
|
||||||
@@ -1165,6 +1202,43 @@ That's all there is to it!
|
|||||||
=========================================
|
=========================================
|
||||||
END OF jschardet NOTICES AND INFORMATION
|
END OF jschardet NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% JupyterLab NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
Copyright (c) 2015 Project Jupyter Contributors
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Redistribution and use in source and binary forms, with or without
|
||||||
|
modification, are permitted provided that the following conditions are met:
|
||||||
|
|
||||||
|
1. Redistributions of source code must retain the above copyright notice, this
|
||||||
|
list of conditions and the following disclaimer.
|
||||||
|
|
||||||
|
2. Redistributions in binary form must reproduce the above copyright notice,
|
||||||
|
this list of conditions and the following disclaimer in the documentation
|
||||||
|
and/or other materials provided with the distribution.
|
||||||
|
|
||||||
|
3. Neither the name of the copyright holder nor the names of its
|
||||||
|
contributors may be used to endorse or promote products derived from
|
||||||
|
this software without specific prior written permission.
|
||||||
|
|
||||||
|
THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
|
||||||
|
AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
|
||||||
|
IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
|
||||||
|
DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT HOLDER OR CONTRIBUTORS BE LIABLE
|
||||||
|
FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
|
||||||
|
DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
|
||||||
|
SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
|
||||||
|
CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
|
||||||
|
OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
|
||||||
|
OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
|
||||||
|
|
||||||
|
Semver File License
|
||||||
|
===================
|
||||||
|
|
||||||
|
The semver.py file is from https://github.com/podhmo/python-semver
|
||||||
|
which is licensed under the "MIT" license. See the semver.py file for details.
|
||||||
|
|
||||||
|
END OF JupyterLab NOTICES AND INFORMATION
|
||||||
|
|
||||||
%% make-error NOTICES AND INFORMATION BEGIN HERE
|
%% make-error NOTICES AND INFORMATION BEGIN HERE
|
||||||
=========================================
|
=========================================
|
||||||
ISC © Julien Fontanet
|
ISC © Julien Fontanet
|
||||||
@@ -1296,6 +1370,32 @@ SOFTWARE.
|
|||||||
=========================================
|
=========================================
|
||||||
END OF ng2-charts NOTICES AND INFORMATION
|
END OF ng2-charts NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% node-fetch NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2016 David Frank
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
=========================================
|
||||||
|
END OF node-fetch NOTICES AND INFORMATION
|
||||||
|
|
||||||
%% node-pty NOTICES AND INFORMATION BEGIN HERE
|
%% node-pty NOTICES AND INFORMATION BEGIN HERE
|
||||||
=========================================
|
=========================================
|
||||||
Copyright (c) 2012-2015, Christopher Jeffrey (https://github.com/chjj/)
|
Copyright (c) 2012-2015, Christopher Jeffrey (https://github.com/chjj/)
|
||||||
@@ -1370,6 +1470,30 @@ THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLI
|
|||||||
=========================================
|
=========================================
|
||||||
END OF primeng NOTICES AND INFORMATION
|
END OF primeng NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% process-nextick-args NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
# Copyright (c) 2015 Calvin Metcalf
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
**THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.**
|
||||||
|
=========================================
|
||||||
|
END OF process-nextick-args NOTICES AND INFORMATION
|
||||||
|
|
||||||
%% pty.js NOTICES AND INFORMATION BEGIN HERE
|
%% pty.js NOTICES AND INFORMATION BEGIN HERE
|
||||||
=========================================
|
=========================================
|
||||||
Copyright (c) 2012-2015, Christopher Jeffrey (https://github.com/chjj/)
|
Copyright (c) 2012-2015, Christopher Jeffrey (https://github.com/chjj/)
|
||||||
@@ -1454,6 +1578,66 @@ END OF TERMS AND CONDITIONS
|
|||||||
=========================================
|
=========================================
|
||||||
END OF reflect-metadata NOTICES AND INFORMATION
|
END OF reflect-metadata NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% request NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
Apache License
|
||||||
|
|
||||||
|
Version 2.0, January 2004
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/
|
||||||
|
|
||||||
|
TERMS AND CONDITIONS FOR USE, REPRODUCTION, AND DISTRIBUTION
|
||||||
|
|
||||||
|
1. Definitions.
|
||||||
|
|
||||||
|
"License" shall mean the terms and conditions for use, reproduction, and distribution as defined by Sections 1 through 9 of this document.
|
||||||
|
|
||||||
|
"Licensor" shall mean the copyright owner or entity authorized by the copyright owner that is granting the License.
|
||||||
|
|
||||||
|
"Legal Entity" shall mean the union of the acting entity and all other entities that control, are controlled by, or are under common control with that entity. For the purposes of this definition, "control" means (i) the power, direct or indirect, to cause the direction or management of such entity, whether by contract or otherwise, or (ii) ownership of fifty percent (50%) or more of the outstanding shares, or (iii) beneficial ownership of such entity.
|
||||||
|
|
||||||
|
"You" (or "Your") shall mean an individual or Legal Entity exercising permissions granted by this License.
|
||||||
|
|
||||||
|
"Source" form shall mean the preferred form for making modifications, including but not limited to software source code, documentation source, and configuration files.
|
||||||
|
|
||||||
|
"Object" form shall mean any form resulting from mechanical transformation or translation of a Source form, including but not limited to compiled object code, generated documentation, and conversions to other media types.
|
||||||
|
|
||||||
|
"Work" shall mean the work of authorship, whether in Source or Object form, made available under the License, as indicated by a copyright notice that is included in or attached to the work (an example is provided in the Appendix below).
|
||||||
|
|
||||||
|
"Derivative Works" shall mean any work, whether in Source or Object form, that is based on (or derived from) the Work and for which the editorial revisions, annotations, elaborations, or other modifications represent, as a whole, an original work of authorship. For the purposes of this License, Derivative Works shall not include works that remain separable from, or merely link (or bind by name) to the interfaces of, the Work and Derivative Works thereof.
|
||||||
|
|
||||||
|
"Contribution" shall mean any work of authorship, including the original version of the Work and any modifications or additions to that Work or Derivative Works thereof, that is intentionally submitted to Licensor for inclusion in the Work by the copyright owner or by an individual or Legal Entity authorized to submit on behalf of the copyright owner. For the purposes of this definition, "submitted" means any form of electronic, verbal, or written communication sent to the Licensor or its representatives, including but not limited to communication on electronic mailing lists, source code control systems, and issue tracking systems that are managed by, or on behalf of, the Licensor for the purpose of discussing and improving the Work, but excluding communication that is conspicuously marked or otherwise designated in writing by the copyright owner as "Not a Contribution."
|
||||||
|
|
||||||
|
"Contributor" shall mean Licensor and any individual or Legal Entity on behalf of whom a Contribution has been received by Licensor and subsequently incorporated within the Work.
|
||||||
|
|
||||||
|
2. Grant of Copyright License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable copyright license to reproduce, prepare Derivative Works of, publicly display, publicly perform, sublicense, and distribute the Work and such Derivative Works in Source or Object form.
|
||||||
|
|
||||||
|
3. Grant of Patent License. Subject to the terms and conditions of this License, each Contributor hereby grants to You a perpetual, worldwide, non-exclusive, no-charge, royalty-free, irrevocable (except as stated in this section) patent license to make, have made, use, offer to sell, sell, import, and otherwise transfer the Work, where such license applies only to those patent claims licensable by such Contributor that are necessarily infringed by their Contribution(s) alone or by combination of their Contribution(s) with the Work to which such Contribution(s) was submitted. If You institute patent litigation against any entity (including a cross-claim or counterclaim in a lawsuit) alleging that the Work or a Contribution incorporated within the Work constitutes direct or contributory patent infringement, then any patent licenses granted to You under this License for that Work shall terminate as of the date such litigation is filed.
|
||||||
|
|
||||||
|
4. Redistribution. You may reproduce and distribute copies of the Work or Derivative Works thereof in any medium, with or without modifications, and in Source or Object form, provided that You meet the following conditions:
|
||||||
|
|
||||||
|
You must give any other recipients of the Work or Derivative Works a copy of this License; and
|
||||||
|
|
||||||
|
You must cause any modified files to carry prominent notices stating that You changed the files; and
|
||||||
|
|
||||||
|
You must retain, in the Source form of any Derivative Works that You distribute, all copyright, patent, trademark, and attribution notices from the Source form of the Work, excluding those notices that do not pertain to any part of the Derivative Works; and
|
||||||
|
|
||||||
|
If the Work includes a "NOTICE" text file as part of its distribution, then any Derivative Works that You distribute must include a readable copy of the attribution notices contained within such NOTICE file, excluding those notices that do not pertain to any part of the Derivative Works, in at least one of the following places: within a NOTICE text file distributed as part of the Derivative Works; within the Source form or documentation, if provided along with the Derivative Works; or, within a display generated by the Derivative Works, if and wherever such third-party notices normally appear. The contents of the NOTICE file are for informational purposes only and do not modify the License. You may add Your own attribution notices within Derivative Works that You distribute, alongside or as an addendum to the NOTICE text from the Work, provided that such additional attribution notices cannot be construed as modifying the License. You may add Your own copyright statement to Your modifications and may provide additional or different license terms and conditions for use, reproduction, or distribution of Your modifications, or for any such Derivative Works as a whole, provided Your use, reproduction, and distribution of the Work otherwise complies with the conditions stated in this License.
|
||||||
|
|
||||||
|
5. Submission of Contributions. Unless You explicitly state otherwise, any Contribution intentionally submitted for inclusion in the Work by You to the Licensor shall be under the terms and conditions of this License, without any additional terms or conditions. Notwithstanding the above, nothing herein shall supersede or modify the terms of any separate license agreement you may have executed with Licensor regarding such Contributions.
|
||||||
|
|
||||||
|
6. Trademarks. This License does not grant permission to use the trade names, trademarks, service marks, or product names of the Licensor, except as required for reasonable and customary use in describing the origin of the Work and reproducing the content of the NOTICE file.
|
||||||
|
|
||||||
|
7. Disclaimer of Warranty. Unless required by applicable law or agreed to in writing, Licensor provides the Work (and each Contributor provides its Contributions) on an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied, including, without limitation, any warranties or conditions of TITLE, NON-INFRINGEMENT, MERCHANTABILITY, or FITNESS FOR A PARTICULAR PURPOSE. You are solely responsible for determining the appropriateness of using or redistributing the Work and assume any risks associated with Your exercise of permissions under this License.
|
||||||
|
|
||||||
|
8. Limitation of Liability. In no event and under no legal theory, whether in tort (including negligence), contract, or otherwise, unless required by applicable law (such as deliberate and grossly negligent acts) or agreed to in writing, shall any Contributor be liable to You for damages, including any direct, indirect, special, incidental, or consequential damages of any character arising as a result of this License or out of the use or inability to use the Work (including but not limited to damages for loss of goodwill, work stoppage, computer failure or malfunction, or any and all other commercial damages or losses), even if such Contributor has been advised of the possibility of such damages.
|
||||||
|
|
||||||
|
9. Accepting Warranty or Additional Liability. While redistributing the Work or Derivative Works thereof, You may choose to offer, and charge a fee for, acceptance of support, warranty, indemnity, or other liability obligations and/or rights consistent with this License. However, in accepting such obligations, You may act only on Your own behalf and on Your sole responsibility, not on behalf of any other Contributor, and only if You agree to indemnify, defend, and hold each Contributor harmless for any liability incurred by, or claims asserted against, such Contributor by reason of your accepting any such warranty or additional liability.
|
||||||
|
|
||||||
|
END OF TERMS AND CONDITIONS
|
||||||
|
=========================================
|
||||||
|
END OF request NOTICES AND INFORMATION
|
||||||
|
|
||||||
%% rxjs NOTICES AND INFORMATION BEGIN HERE
|
%% rxjs NOTICES AND INFORMATION BEGIN HERE
|
||||||
=========================================
|
=========================================
|
||||||
Apache License
|
Apache License
|
||||||
@@ -1779,6 +1963,20 @@ ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEAL
|
|||||||
=========================================
|
=========================================
|
||||||
END OF systemjs NOTICES AND INFORMATION
|
END OF systemjs NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% temp-write NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Copyright (c) Sindre Sorhus <sindresorhus@gmail.com> (sindresorhus.com)
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy, modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
=========================================
|
||||||
|
END OF temp-write NOTICES AND INFORMATION
|
||||||
|
|
||||||
%% underscore NOTICES AND INFORMATION BEGIN HERE
|
%% underscore NOTICES AND INFORMATION BEGIN HERE
|
||||||
=========================================
|
=========================================
|
||||||
Copyright (c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative
|
Copyright (c) 2009-2017 Jeremy Ashkenas, DocumentCloud and Investigative
|
||||||
@@ -1881,6 +2079,50 @@ OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWA
|
|||||||
=========================================
|
=========================================
|
||||||
END OF vscode-debugprotocol NOTICES AND INFORMATION
|
END OF vscode-debugprotocol NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% vscode-languageclient NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
Copyright (c) Microsoft Corporation
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
MIT License
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
|
||||||
|
files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
|
||||||
|
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
|
||||||
|
is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
|
||||||
|
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
=========================================
|
||||||
|
END OF vscode-languageclient NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% vscode-nls NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) Microsoft Corporation
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy of this software and associated documentation
|
||||||
|
files (the "Software"), to deal in the Software without restriction, including without limitation the rights to use, copy,
|
||||||
|
modify, merge, publish, distribute, sublicense, and/or sell copies of the Software, and to permit persons to whom the Software
|
||||||
|
is furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED *AS IS*, WITHOUT WARRANTY OF ANY KIND, EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES
|
||||||
|
OF MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS
|
||||||
|
BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT
|
||||||
|
OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
|
||||||
|
=========================================
|
||||||
|
END OF vscode-nls NOTICES AND INFORMATION
|
||||||
|
|
||||||
%% vscode-ripgrep NOTICES AND INFORMATION BEGIN HERE
|
%% vscode-ripgrep NOTICES AND INFORMATION BEGIN HERE
|
||||||
=========================================
|
=========================================
|
||||||
vscode-ripgrep
|
vscode-ripgrep
|
||||||
@@ -2039,4 +2281,189 @@ LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|||||||
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
|
||||||
THE SOFTWARE.
|
THE SOFTWARE.
|
||||||
=========================================
|
=========================================
|
||||||
END OF zone.js NOTICES AND INFORMATION
|
END OF zone.js NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% Microsoft.ProgramSynthesis.Common NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
NOTICES AND INFORMATION
|
||||||
|
Do Not Translate or Localize
|
||||||
|
|
||||||
|
This software incorporates material from third parties. Microsoft makes certain
|
||||||
|
open source code available at http://3rdpartysource.microsoft.com, or you may
|
||||||
|
send a check or money order for US $5.00, including the product name, the open
|
||||||
|
source component name, and version number, to:
|
||||||
|
|
||||||
|
Source Code Compliance Team
|
||||||
|
Microsoft Corporation
|
||||||
|
One Microsoft Way
|
||||||
|
Redmond, WA 98052
|
||||||
|
USA
|
||||||
|
|
||||||
|
Notwithstanding any other terms, you may reverse engineer this software to the
|
||||||
|
extent required to debug changes to any libraries licensed under the GNU Lesser
|
||||||
|
General Public License.
|
||||||
|
|
||||||
|
-------------------------------START OF THIRD-PARTY NOTICES-------------------------------------------
|
||||||
|
|
||||||
|
===================================CoreFx (BEGIN)
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) .NET Foundation and Contributors
|
||||||
|
|
||||||
|
All rights reserved.
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
===================================CoreFx (END)
|
||||||
|
|
||||||
|
===================================CoreFxLab (BEGIN)
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) Microsoft Corporation
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
===================================CoreFxLab (END)
|
||||||
|
|
||||||
|
===================================Reactive Extensions (BEGIN)
|
||||||
|
Copyright (c) .NET Foundation and Contributors
|
||||||
|
All Rights Reserved
|
||||||
|
|
||||||
|
Licensed under the Apache License, Version 2.0 (the "License"); you
|
||||||
|
may not use this file except in compliance with the License. You may
|
||||||
|
obtain a copy of the License at
|
||||||
|
|
||||||
|
http://www.apache.org/licenses/LICENSE-2.0
|
||||||
|
|
||||||
|
Unless required by applicable law or agreed to in writing, software
|
||||||
|
distributed under the License is distributed on an "AS IS" BASIS,
|
||||||
|
WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or
|
||||||
|
implied. See the License for the specific language governing permissions
|
||||||
|
and limitations under the License.
|
||||||
|
|
||||||
|
List of contributors to the Rx libraries
|
||||||
|
|
||||||
|
Rx and Ix.NET:
|
||||||
|
Wes Dyer
|
||||||
|
Jeffrey van Gogh
|
||||||
|
Matthew Podwysocki
|
||||||
|
Bart De Smet
|
||||||
|
Danny van Velzen
|
||||||
|
Erik Meijer
|
||||||
|
Brian Beckman
|
||||||
|
Aaron Lahman
|
||||||
|
Georgi Chkodrov
|
||||||
|
Arthur Watson
|
||||||
|
Gert Drapers
|
||||||
|
Mark Shields
|
||||||
|
Eric Rozell
|
||||||
|
|
||||||
|
Rx.js and Ix.js:
|
||||||
|
Matthew Podwysocki
|
||||||
|
Jeffrey van Gogh
|
||||||
|
Bart De Smet
|
||||||
|
Brian Beckman
|
||||||
|
Wes Dyer
|
||||||
|
Erik Meijer
|
||||||
|
|
||||||
|
Tx:
|
||||||
|
Georgi Chkodrov
|
||||||
|
Bart De Smet
|
||||||
|
Aaron Lahman
|
||||||
|
Erik Meijer
|
||||||
|
Brian Grunkemeyer
|
||||||
|
Beysim Sezgin
|
||||||
|
Tiho Tarnavski
|
||||||
|
Collin Meek
|
||||||
|
Sajay Anthony
|
||||||
|
Karen Albrecht
|
||||||
|
John Allen
|
||||||
|
Zach Kramer
|
||||||
|
|
||||||
|
Rx++ and Ix++:
|
||||||
|
Aaron Lahman
|
||||||
|
===================================Reactive Extensions (END)
|
||||||
|
|
||||||
|
-------------------------------END OF THIRD-PARTY NOTICES-------------------------------------------
|
||||||
|
=========================================
|
||||||
|
END OF Microsoft.ProgramSynthesis.Common NOTICES AND INFORMATION
|
||||||
|
|
||||||
|
%% Microsoft.ProgramSynthesis.Detection NOTICES AND INFORMATION BEGIN HERE
|
||||||
|
=========================================
|
||||||
|
NOTICES AND INFORMATION
|
||||||
|
Do Not Translate or Localize
|
||||||
|
|
||||||
|
This software incorporates material from third parties. Microsoft makes certain
|
||||||
|
open source code available at http://3rdpartysource.microsoft.com, or you may
|
||||||
|
send a check or money order for US $5.00, including the product name, the open
|
||||||
|
source component name, and version number, to:
|
||||||
|
|
||||||
|
Source Code Compliance Team
|
||||||
|
Microsoft Corporation
|
||||||
|
One Microsoft Way
|
||||||
|
Redmond, WA 98052
|
||||||
|
USA
|
||||||
|
|
||||||
|
Notwithstanding any other terms, you may reverse engineer this software to the
|
||||||
|
extent required to debug changes to any libraries licensed under the GNU Lesser
|
||||||
|
General Public License.
|
||||||
|
|
||||||
|
-------------------------------START OF THIRD-PARTY NOTICES-------------------------------------------
|
||||||
|
|
||||||
|
===================================ExcelDataReader (BEGIN)
|
||||||
|
The MIT License (MIT)
|
||||||
|
|
||||||
|
Copyright (c) 2014 ExcelDataReader
|
||||||
|
|
||||||
|
Permission is hereby granted, free of charge, to any person obtaining a copy
|
||||||
|
of this software and associated documentation files (the "Software"), to deal
|
||||||
|
in the Software without restriction, including without limitation the rights
|
||||||
|
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
||||||
|
copies of the Software, and to permit persons to whom the Software is
|
||||||
|
furnished to do so, subject to the following conditions:
|
||||||
|
|
||||||
|
The above copyright notice and this permission notice shall be included in all
|
||||||
|
copies or substantial portions of the Software.
|
||||||
|
|
||||||
|
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
||||||
|
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
||||||
|
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
||||||
|
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
||||||
|
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
||||||
|
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
||||||
|
SOFTWARE.
|
||||||
|
===================================ExcelDataReader (END)
|
||||||
|
|
||||||
|
-------------------------------END OF THIRD-PARTY NOTICES-------------------------------------------
|
||||||
|
=========================================
|
||||||
|
END OF Microsoft.ProgramSynthesis.Detection NOTICES AND INFORMATION
|
||||||
20
appveyor.yml
20
appveyor.yml
@@ -1,20 +0,0 @@
|
|||||||
environment:
|
|
||||||
ELECTRON_RUN_AS_NODE: 1
|
|
||||||
VSCODE_BUILD_VERBOSE: true
|
|
||||||
|
|
||||||
cache:
|
|
||||||
- '%LOCALAPPDATA%\Yarn\cache'
|
|
||||||
|
|
||||||
install:
|
|
||||||
- ps: Install-Product node 8.9.1 x64
|
|
||||||
|
|
||||||
build_script:
|
|
||||||
- yarn
|
|
||||||
- .\node_modules\.bin\gulp electron
|
|
||||||
- .\node_modules\.bin\tsc -p .\src\tsconfig.monaco.json --noEmit
|
|
||||||
- npm run compile
|
|
||||||
|
|
||||||
test_script:
|
|
||||||
- node --version
|
|
||||||
- .\scripts\test.bat
|
|
||||||
- .\scripts\test-integration.bat
|
|
||||||
46
azure-pipelines-linux-mac.yml
Normal file
46
azure-pipelines-linux-mac.yml
Normal file
@@ -0,0 +1,46 @@
|
|||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '8.x'
|
||||||
|
displayName: 'Install Node.js'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
git submodule update --init --recursive
|
||||||
|
nvm install 8.9.1
|
||||||
|
nvm use 8.9.1
|
||||||
|
npm i -g yarn
|
||||||
|
displayName: 'preinstall'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
export CXX="g++-4.9" CC="gcc-4.9" DISPLAY=:10
|
||||||
|
sudo cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
|
||||||
|
sudo chmod +x /etc/init.d/xvfb
|
||||||
|
sudo update-rc.d xvfb defaults
|
||||||
|
sudo service xvfb start
|
||||||
|
# sh -e /etc/init.d/xvfb start
|
||||||
|
# sleep 3
|
||||||
|
displayName: 'Linux preinstall'
|
||||||
|
condition: eq(variables['Agent.OS'], 'Linux')
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
yarn
|
||||||
|
displayName: 'Install'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
node_modules/.bin/gulp electron
|
||||||
|
node_modules/.bin/gulp compile --max_old_space_size=4096
|
||||||
|
node_modules/.bin/gulp optimize-vscode --max_old_space_size=4096
|
||||||
|
displayName: 'Scripts'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
DISPLAY=:10 ./scripts/test.sh --reporter mocha-junit-reporter
|
||||||
|
displayName: 'Tests'
|
||||||
|
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: '**/test-results.xml'
|
||||||
|
condition: succeededOrFailed()
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
yarn run tslint
|
||||||
|
displayName: 'Run TSLint'
|
||||||
30
azure-pipelines-windows.yml
Normal file
30
azure-pipelines-windows.yml
Normal file
@@ -0,0 +1,30 @@
|
|||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '8.9'
|
||||||
|
displayName: 'Install Node.js'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
yarn
|
||||||
|
displayName: 'Yarn Install'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
.\node_modules\.bin\gulp electron
|
||||||
|
displayName: 'Electron'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
npm run compile
|
||||||
|
displayName: 'Compile'
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
.\scripts\test.bat --reporter mocha-junit-reporter
|
||||||
|
displayName: 'Test'
|
||||||
|
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: 'test-results.xml'
|
||||||
|
condition: succeededOrFailed()
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
yarn run tslint
|
||||||
|
displayName: 'Run TSLint'
|
||||||
29
azure-pipelines.yml
Normal file
29
azure-pipelines.yml
Normal file
@@ -0,0 +1,29 @@
|
|||||||
|
trigger:
|
||||||
|
- master
|
||||||
|
- releases/*
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
|
||||||
|
# All tasks on Windows
|
||||||
|
- job: build_all_windows
|
||||||
|
displayName: Build all tasks (Windows)
|
||||||
|
pool:
|
||||||
|
vmImage: vs2017-win2016
|
||||||
|
steps:
|
||||||
|
- template: azure-pipelines-windows.yml
|
||||||
|
|
||||||
|
# All tasks on Linux
|
||||||
|
- job: build_all_linux
|
||||||
|
displayName: Build all tasks (Linux)
|
||||||
|
pool:
|
||||||
|
vmImage: 'Ubuntu 16.04'
|
||||||
|
steps:
|
||||||
|
- template: azure-pipelines-linux-mac.yml
|
||||||
|
|
||||||
|
# All tasks on macOS
|
||||||
|
- job: build_all_darwin
|
||||||
|
displayName: Build all tasks (macOS)
|
||||||
|
pool:
|
||||||
|
vmImage: macos-10.13
|
||||||
|
steps:
|
||||||
|
- template: azure-pipelines-linux-mac.yml
|
||||||
@@ -3,10 +3,10 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
const cp = require('child_process');
|
import * as cp from 'child_process';
|
||||||
|
|
||||||
function yarnInstall(package: string): void {
|
function yarnInstall(packageName: string): void {
|
||||||
cp.execSync(`yarn add --no-lockfile ${package}`);
|
cp.execSync(`yarn add --no-lockfile ${packageName}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
const product = require('../../../product.json');
|
const product = require('../../../product.json');
|
||||||
@@ -44,7 +44,7 @@ function createDefaultConfig(quality: string): Config {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getConfig(quality: string): Promise<Config> {
|
function getConfig(quality: string): Promise<Config> {
|
||||||
const client = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT'], { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
const client = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT']!, { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
||||||
const collection = 'dbs/builds/colls/config';
|
const collection = 'dbs/builds/colls/config';
|
||||||
const query = {
|
const query = {
|
||||||
query: `SELECT TOP 1 * FROM c WHERE c.id = @quality`,
|
query: `SELECT TOP 1 * FROM c WHERE c.id = @quality`,
|
||||||
@@ -66,7 +66,8 @@ interface Asset {
|
|||||||
platform: string;
|
platform: string;
|
||||||
type: string;
|
type: string;
|
||||||
url: string;
|
url: string;
|
||||||
mooncakeUrl: string;
|
// {{SQL CARBON EDIT}}
|
||||||
|
mooncakeUrl: string | undefined;
|
||||||
hash: string;
|
hash: string;
|
||||||
sha256hash: string;
|
sha256hash: string;
|
||||||
size: number;
|
size: number;
|
||||||
@@ -74,7 +75,7 @@ interface Asset {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function createOrUpdate(commit: string, quality: string, platform: string, type: string, release: NewDocument, asset: Asset, isUpdate: boolean): Promise<void> {
|
function createOrUpdate(commit: string, quality: string, platform: string, type: string, release: NewDocument, asset: Asset, isUpdate: boolean): Promise<void> {
|
||||||
const client = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT'], { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
const client = new DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT']!, { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
||||||
const collection = 'dbs/builds/colls/' + quality;
|
const collection = 'dbs/builds/colls/' + quality;
|
||||||
const updateQuery = {
|
const updateQuery = {
|
||||||
query: 'SELECT TOP 1 * FROM c WHERE c.id = @id',
|
query: 'SELECT TOP 1 * FROM c WHERE c.id = @id',
|
||||||
@@ -128,7 +129,7 @@ async function assertContainer(blobService: azure.BlobService, quality: string):
|
|||||||
await new Promise((c, e) => blobService.createContainerIfNotExists(quality, { publicAccessLevel: 'blob' }, err => err ? e(err) : c()));
|
await new Promise((c, e) => blobService.createContainerIfNotExists(quality, { publicAccessLevel: 'blob' }, err => err ? e(err) : c()));
|
||||||
}
|
}
|
||||||
|
|
||||||
async function doesAssetExist(blobService: azure.BlobService, quality: string, blobName: string): Promise<boolean> {
|
async function doesAssetExist(blobService: azure.BlobService, quality: string, blobName: string): Promise<boolean | undefined> {
|
||||||
const existsResult = await new Promise<azure.BlobService.BlobResult>((c, e) => blobService.doesBlobExist(quality, blobName, (err, r) => err ? e(err) : c(r)));
|
const existsResult = await new Promise<azure.BlobService.BlobResult>((c, e) => blobService.doesBlobExist(quality, blobName, (err, r) => err ? e(err) : c(r)));
|
||||||
return existsResult.exists;
|
return existsResult.exists;
|
||||||
}
|
}
|
||||||
@@ -151,8 +152,8 @@ interface PublishOptions {
|
|||||||
async function publish(commit: string, quality: string, platform: string, type: string, name: string, version: string, _isUpdate: string, file: string, opts: PublishOptions): Promise<void> {
|
async function publish(commit: string, quality: string, platform: string, type: string, name: string, version: string, _isUpdate: string, file: string, opts: PublishOptions): Promise<void> {
|
||||||
const isUpdate = _isUpdate === 'true';
|
const isUpdate = _isUpdate === 'true';
|
||||||
|
|
||||||
const queuedBy = process.env['BUILD_QUEUEDBY'];
|
const queuedBy = process.env['BUILD_QUEUEDBY']!;
|
||||||
const sourceBranch = process.env['BUILD_SOURCEBRANCH'];
|
const sourceBranch = process.env['BUILD_SOURCEBRANCH']!;
|
||||||
const isReleased = quality === 'insider'
|
const isReleased = quality === 'insider'
|
||||||
&& /^master$|^refs\/heads\/master$/.test(sourceBranch)
|
&& /^master$|^refs\/heads\/master$/.test(sourceBranch)
|
||||||
&& /Project Collection Service Accounts|Microsoft.VisualStudio.Services.TFS/.test(queuedBy);
|
&& /Project Collection Service Accounts|Microsoft.VisualStudio.Services.TFS/.test(queuedBy);
|
||||||
@@ -180,9 +181,9 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
console.log('SHA256:', sha256hash);
|
console.log('SHA256:', sha256hash);
|
||||||
|
|
||||||
const blobName = commit + '/' + name;
|
const blobName = commit + '/' + name;
|
||||||
const storageAccount = process.env['AZURE_STORAGE_ACCOUNT_2'];
|
const storageAccount = process.env['AZURE_STORAGE_ACCOUNT_2']!;
|
||||||
|
|
||||||
const blobService = azure.createBlobService(storageAccount, process.env['AZURE_STORAGE_ACCESS_KEY_2'])
|
const blobService = azure.createBlobService(storageAccount, process.env['AZURE_STORAGE_ACCESS_KEY_2']!)
|
||||||
.withFilter(new azure.ExponentialRetryPolicyFilter(20));
|
.withFilter(new azure.ExponentialRetryPolicyFilter(20));
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
@@ -198,7 +199,7 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
if (process.env['MOONCAKE_STORAGE_ACCESS_KEY']) {
|
if (process.env['MOONCAKE_STORAGE_ACCESS_KEY']) {
|
||||||
const mooncakeBlobService = azure.createBlobService(storageAccount, process.env['MOONCAKE_STORAGE_ACCESS_KEY'], `${storageAccount}.blob.core.chinacloudapi.cn`)
|
const mooncakeBlobService = azure.createBlobService(storageAccount, process.env['MOONCAKE_STORAGE_ACCESS_KEY']!, `${storageAccount}.blob.core.chinacloudapi.cn`)
|
||||||
.withFilter(new azure.ExponentialRetryPolicyFilter(20));
|
.withFilter(new azure.ExponentialRetryPolicyFilter(20));
|
||||||
|
|
||||||
// mooncake is fussy and far away, this is needed!
|
// mooncake is fussy and far away, this is needed!
|
||||||
@@ -214,7 +215,7 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
doesAssetExist(mooncakeBlobService, quality, blobName)
|
doesAssetExist(mooncakeBlobService, quality, blobName)
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const promises = [];
|
const promises: Array<Promise<void>> = [];
|
||||||
|
|
||||||
if (!blobExists) {
|
if (!blobExists) {
|
||||||
promises.push(uploadBlob(blobService, quality, blobName, file));
|
promises.push(uploadBlob(blobService, quality, blobName, file));
|
||||||
@@ -227,7 +228,6 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
console.log('Skipping Mooncake publishing.');
|
console.log('Skipping Mooncake publishing.');
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
if (promises.length === 0) {
|
if (promises.length === 0) {
|
||||||
console.log(`Blob ${quality}, ${blobName} already exists, not publishing again.`);
|
console.log(`Blob ${quality}, ${blobName} already exists, not publishing again.`);
|
||||||
return;
|
return;
|
||||||
@@ -268,7 +268,7 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
isReleased: config.frozen ? false : isReleased,
|
isReleased: config.frozen ? false : isReleased,
|
||||||
sourceBranch,
|
sourceBranch,
|
||||||
queuedBy,
|
queuedBy,
|
||||||
assets: [],
|
assets: [] as Array<Asset>,
|
||||||
updates: {} as any
|
updates: {} as any
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -284,6 +284,11 @@ async function publish(commit: string, quality: string, platform: string, type:
|
|||||||
}
|
}
|
||||||
|
|
||||||
function main(): void {
|
function main(): void {
|
||||||
|
if (process.env['VSCODE_BUILD_SKIP_PUBLISH']) {
|
||||||
|
console.warn('Skipping publish due to VSCODE_BUILD_SKIP_PUBLISH');
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
const opts = minimist<PublishOptions>(process.argv.slice(2), {
|
const opts = minimist<PublishOptions>(process.argv.slice(2), {
|
||||||
boolean: ['upload-only']
|
boolean: ['upload-only']
|
||||||
});
|
});
|
||||||
219
build/azure-pipelines/common/symbols.ts
Normal file
219
build/azure-pipelines/common/symbols.ts
Normal file
@@ -0,0 +1,219 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as request from 'request';
|
||||||
|
import { createReadStream, createWriteStream, unlink, mkdir } from 'fs';
|
||||||
|
import * as github from 'github-releases';
|
||||||
|
import { join } from 'path';
|
||||||
|
import { tmpdir } from 'os';
|
||||||
|
import { promisify } from 'util';
|
||||||
|
|
||||||
|
const BASE_URL = 'https://rink.hockeyapp.net/api/2/';
|
||||||
|
const HOCKEY_APP_TOKEN_HEADER = 'X-HockeyAppToken';
|
||||||
|
|
||||||
|
export interface IVersions {
|
||||||
|
app_versions: IVersion[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IVersion {
|
||||||
|
id: number;
|
||||||
|
version: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IApplicationAccessor {
|
||||||
|
accessToken: string;
|
||||||
|
appId: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IVersionAccessor extends IApplicationAccessor {
|
||||||
|
id: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
enum Platform {
|
||||||
|
WIN_32 = 'win32-ia32',
|
||||||
|
WIN_64 = 'win32-x64',
|
||||||
|
LINUX_32 = 'linux-ia32',
|
||||||
|
LINUX_64 = 'linux-x64',
|
||||||
|
MAC_OS = 'darwin-x64'
|
||||||
|
}
|
||||||
|
|
||||||
|
function symbolsZipName(platform: Platform, electronVersion: string, insiders: boolean): string {
|
||||||
|
return `${insiders ? 'insiders' : 'stable'}-symbols-v${electronVersion}-${platform}.zip`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const SEED = "ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789";
|
||||||
|
async function tmpFile(name: string): Promise<string> {
|
||||||
|
let res = '';
|
||||||
|
for (let i = 0; i < 8; i++) {
|
||||||
|
res += SEED.charAt(Math.floor(Math.random() * SEED.length));
|
||||||
|
}
|
||||||
|
|
||||||
|
const tmpParent = join(tmpdir(), res);
|
||||||
|
|
||||||
|
await promisify(mkdir)(tmpParent);
|
||||||
|
|
||||||
|
return join(tmpParent, name);
|
||||||
|
}
|
||||||
|
|
||||||
|
function getVersions(accessor: IApplicationAccessor): Promise<IVersions> {
|
||||||
|
return asyncRequest<IVersions>({
|
||||||
|
url: `${BASE_URL}/apps/${accessor.appId}/app_versions`,
|
||||||
|
method: 'GET',
|
||||||
|
headers: {
|
||||||
|
[HOCKEY_APP_TOKEN_HEADER]: accessor.accessToken
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function createVersion(accessor: IApplicationAccessor, version: string): Promise<IVersion> {
|
||||||
|
return asyncRequest<IVersion>({
|
||||||
|
url: `${BASE_URL}/apps/${accessor.appId}/app_versions/new`,
|
||||||
|
method: 'POST',
|
||||||
|
headers: {
|
||||||
|
[HOCKEY_APP_TOKEN_HEADER]: accessor.accessToken
|
||||||
|
},
|
||||||
|
formData: {
|
||||||
|
bundle_version: version
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function updateVersion(accessor: IVersionAccessor, symbolsPath: string) {
|
||||||
|
return asyncRequest<IVersions>({
|
||||||
|
url: `${BASE_URL}/apps/${accessor.appId}/app_versions/${accessor.id}`,
|
||||||
|
method: 'PUT',
|
||||||
|
headers: {
|
||||||
|
[HOCKEY_APP_TOKEN_HEADER]: accessor.accessToken
|
||||||
|
},
|
||||||
|
formData: {
|
||||||
|
dsym: createReadStream(symbolsPath)
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function asyncRequest<T>(options: request.UrlOptions & request.CoreOptions): Promise<T> {
|
||||||
|
return new Promise<T>((resolve, reject) => {
|
||||||
|
request(options, (error, _response, body) => {
|
||||||
|
if (error) {
|
||||||
|
reject(error);
|
||||||
|
} else {
|
||||||
|
resolve(JSON.parse(body));
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function downloadAsset(repository: any, assetName: string, targetPath: string, electronVersion: string) {
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
repository.getReleases({ tag_name: `v${electronVersion}` }, (err: any, releases: any) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
const asset = releases[0].assets.filter((asset: any) => asset.name === assetName)[0];
|
||||||
|
if (!asset) {
|
||||||
|
reject(new Error(`Asset with name ${assetName} not found`));
|
||||||
|
} else {
|
||||||
|
repository.downloadAsset(asset, (err: any, reader: any) => {
|
||||||
|
if (err) {
|
||||||
|
reject(err);
|
||||||
|
} else {
|
||||||
|
const writer = createWriteStream(targetPath);
|
||||||
|
writer.on('error', reject);
|
||||||
|
writer.on('close', resolve);
|
||||||
|
reader.on('error', reject);
|
||||||
|
|
||||||
|
reader.pipe(writer);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
interface IOptions {
|
||||||
|
repository: string;
|
||||||
|
platform: Platform;
|
||||||
|
versions: { code: string; insiders: boolean; electron: string; };
|
||||||
|
access: { hockeyAppToken: string; hockeyAppId: string; githubToken: string };
|
||||||
|
}
|
||||||
|
|
||||||
|
async function ensureVersionAndSymbols(options: IOptions) {
|
||||||
|
|
||||||
|
// Check version does not exist
|
||||||
|
console.log(`HockeyApp: checking for existing version ${options.versions.code} (${options.platform})`);
|
||||||
|
const versions = await getVersions({ accessToken: options.access.hockeyAppToken, appId: options.access.hockeyAppId });
|
||||||
|
if (versions.app_versions.some(v => v.version === options.versions.code)) {
|
||||||
|
console.log(`HockeyApp: Returning without uploading symbols because version ${options.versions.code} (${options.platform}) was already found`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Download symbols for platform and electron version
|
||||||
|
const symbolsName = symbolsZipName(options.platform, options.versions.electron, options.versions.insiders);
|
||||||
|
const symbolsPath = await tmpFile('symbols.zip');
|
||||||
|
console.log(`HockeyApp: downloading symbols ${symbolsName} for electron ${options.versions.electron} (${options.platform}) into ${symbolsPath}`);
|
||||||
|
await downloadAsset(new (github as any)({ repo: options.repository, token: options.access.githubToken }), symbolsName, symbolsPath, options.versions.electron);
|
||||||
|
|
||||||
|
// Create version
|
||||||
|
console.log(`HockeyApp: creating new version ${options.versions.code} (${options.platform})`);
|
||||||
|
const version = await createVersion({ accessToken: options.access.hockeyAppToken, appId: options.access.hockeyAppId }, options.versions.code);
|
||||||
|
|
||||||
|
// Upload symbols
|
||||||
|
console.log(`HockeyApp: uploading symbols for version ${options.versions.code} (${options.platform})`);
|
||||||
|
await updateVersion({ id: String(version.id), accessToken: options.access.hockeyAppToken, appId: options.access.hockeyAppId }, symbolsPath);
|
||||||
|
|
||||||
|
// Cleanup
|
||||||
|
await promisify(unlink)(symbolsPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Environment
|
||||||
|
const pakage = require('../../../package.json');
|
||||||
|
const product = require('../../../product.json');
|
||||||
|
const repository = product.electronRepository;
|
||||||
|
const electronVersion = require('../../lib/electron').getElectronVersion();
|
||||||
|
const insiders = product.quality !== 'stable';
|
||||||
|
let codeVersion = pakage.version;
|
||||||
|
if (insiders) {
|
||||||
|
codeVersion = `${codeVersion}-insider`;
|
||||||
|
}
|
||||||
|
const githubToken = process.argv[2];
|
||||||
|
const hockeyAppToken = process.argv[3];
|
||||||
|
const is64 = process.argv[4] === 'x64';
|
||||||
|
const hockeyAppId = process.argv[5];
|
||||||
|
|
||||||
|
let platform: Platform;
|
||||||
|
if (process.platform === 'darwin') {
|
||||||
|
platform = Platform.MAC_OS;
|
||||||
|
} else if (process.platform === 'win32') {
|
||||||
|
platform = is64 ? Platform.WIN_64 : Platform.WIN_32;
|
||||||
|
} else {
|
||||||
|
platform = is64 ? Platform.LINUX_64 : Platform.LINUX_32;
|
||||||
|
}
|
||||||
|
|
||||||
|
// Create version and upload symbols in HockeyApp
|
||||||
|
if (repository && codeVersion && electronVersion && (product.quality === 'stable' || product.quality === 'insider')) {
|
||||||
|
ensureVersionAndSymbols({
|
||||||
|
repository,
|
||||||
|
platform,
|
||||||
|
versions: {
|
||||||
|
code: codeVersion,
|
||||||
|
insiders,
|
||||||
|
electron: electronVersion
|
||||||
|
},
|
||||||
|
access: {
|
||||||
|
githubToken,
|
||||||
|
hockeyAppToken,
|
||||||
|
hockeyAppId
|
||||||
|
}
|
||||||
|
}).then(() => {
|
||||||
|
console.log('HockeyApp: done');
|
||||||
|
}).catch(error => {
|
||||||
|
console.error(`HockeyApp: error (${error})`);
|
||||||
|
});
|
||||||
|
} else {
|
||||||
|
console.log(`HockeyApp: skipping due to unexpected context (repository: ${repository}, codeVersion: ${codeVersion}, electronVersion: ${electronVersion}, quality: ${product.quality})`);
|
||||||
|
}
|
||||||
40
build/azure-pipelines/darwin/continuous-build-darwin.yml
Normal file
40
build/azure-pipelines/darwin/continuous-build-darwin.yml
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: "8.12.0"
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.10.1"
|
||||||
|
- script: |
|
||||||
|
yarn
|
||||||
|
displayName: Install Dependencies
|
||||||
|
- script: |
|
||||||
|
yarn gulp electron-x64
|
||||||
|
displayName: Download Electron
|
||||||
|
- script: |
|
||||||
|
yarn gulp hygiene
|
||||||
|
displayName: Run Hygiene Checks
|
||||||
|
- script: |
|
||||||
|
yarn monaco-compile-check
|
||||||
|
displayName: Run Monaco Editor Checks
|
||||||
|
- script: |
|
||||||
|
yarn strict-null-check
|
||||||
|
displayName: Run Strict Null Checks
|
||||||
|
- script: |
|
||||||
|
yarn compile
|
||||||
|
displayName: Compile Sources
|
||||||
|
- script: |
|
||||||
|
yarn download-builtin-extensions
|
||||||
|
displayName: Download Built-in Extensions
|
||||||
|
- script: |
|
||||||
|
./scripts/test.sh --tfs "Unit Tests"
|
||||||
|
displayName: Run Unit Tests
|
||||||
|
- script: |
|
||||||
|
./scripts/test-integration.sh --tfs "Integration Tests"
|
||||||
|
displayName: Run Integration Tests
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
displayName: Publish Tests Results
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: '*-results.xml'
|
||||||
|
searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
|
||||||
|
condition: succeededOrFailed()
|
||||||
91
build/azure-pipelines/darwin/product-build-darwin.yml
Normal file
91
build/azure-pipelines/darwin/product-build-darwin.yml
Normal file
@@ -0,0 +1,91 @@
|
|||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: "8.12.0"
|
||||||
|
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.10.1"
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc
|
||||||
|
yarn
|
||||||
|
yarn gulp -- hygiene
|
||||||
|
yarn monaco-compile-check
|
||||||
|
yarn strict-null-check
|
||||||
|
VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" yarn gulp -- mixin
|
||||||
|
node build/azure-pipelines/common/installDistro.js
|
||||||
|
node build/lib/builtInExtensions.js
|
||||||
|
displayName: Prepare build
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" \
|
||||||
|
AZURE_STORAGE_ACCESS_KEY="$(AZURE_STORAGE_ACCESS_KEY)" \
|
||||||
|
yarn gulp -- vscode-darwin-min upload-vscode-sourcemaps
|
||||||
|
displayName: Build
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
./scripts/test.sh --build --tfs "Unit Tests"
|
||||||
|
# APP_NAME="`ls $(agent.builddirectory)/VSCode-darwin | head -n 1`"
|
||||||
|
# yarn smoketest -- --build "$(agent.builddirectory)/VSCode-darwin/$APP_NAME"
|
||||||
|
displayName: Run unit tests
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
pushd ../VSCode-darwin && zip -r -X -y ../VSCode-darwin.zip * && popd
|
||||||
|
displayName: Archive build
|
||||||
|
|
||||||
|
- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
|
||||||
|
inputs:
|
||||||
|
ConnectedServiceName: 'ESRP CodeSign'
|
||||||
|
FolderPath: '$(agent.builddirectory)'
|
||||||
|
Pattern: 'VSCode-darwin.zip'
|
||||||
|
signConfigType: inlineSignParams
|
||||||
|
inlineOperation: |
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"keyCode": "CP-401337-Apple",
|
||||||
|
"operationSetCode": "MacAppDeveloperSign",
|
||||||
|
"parameters": [ ],
|
||||||
|
"toolName": "sign",
|
||||||
|
"toolVersion": "1.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
SessionTimeout: 120
|
||||||
|
displayName: Codesign
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
|
||||||
|
# remove pkg from archive
|
||||||
|
zip -d ../VSCode-darwin.zip "*.pkg"
|
||||||
|
|
||||||
|
# publish the build
|
||||||
|
PACKAGEJSON=`ls ../VSCode-darwin/*.app/Contents/Resources/app/package.json`
|
||||||
|
VERSION=`node -p "require(\"$PACKAGEJSON\").version"`
|
||||||
|
AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \
|
||||||
|
AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \
|
||||||
|
MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \
|
||||||
|
node build/azure-pipelines/common/publish.js \
|
||||||
|
"$(VSCODE_QUALITY)" \
|
||||||
|
darwin \
|
||||||
|
archive \
|
||||||
|
"VSCode-darwin-$(VSCODE_QUALITY).zip" \
|
||||||
|
$VERSION \
|
||||||
|
true \
|
||||||
|
../VSCode-darwin.zip
|
||||||
|
|
||||||
|
# publish hockeyapp symbols
|
||||||
|
node build/azure-pipelines/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" "$(VSCODE_HOCKEYAPP_ID_MACOS)"
|
||||||
|
|
||||||
|
# upload configuration
|
||||||
|
AZURE_STORAGE_ACCESS_KEY="$(AZURE_STORAGE_ACCESS_KEY)" \
|
||||||
|
yarn gulp -- upload-vscode-configuration
|
||||||
|
displayName: Publish
|
||||||
|
|
||||||
|
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||||
|
displayName: 'Component Detection'
|
||||||
|
continueOnError: true
|
||||||
1
build/azure-pipelines/linux/.gitignore
vendored
Normal file
1
build/azure-pipelines/linux/.gitignore
vendored
Normal file
@@ -0,0 +1 @@
|
|||||||
|
pat
|
||||||
45
build/azure-pipelines/linux/continuous-build-linux.yml
Normal file
45
build/azure-pipelines/linux/continuous-build-linux.yml
Normal file
@@ -0,0 +1,45 @@
|
|||||||
|
steps:
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
sudo apt-get update
|
||||||
|
sudo apt-get install -y libxkbfile-dev pkg-config libsecret-1-dev libxss1 libgconf-2-4 dbus xvfb libgtk-3-0
|
||||||
|
sudo cp build/azure-pipelines/linux/xvfb.init /etc/init.d/xvfb
|
||||||
|
sudo chmod +x /etc/init.d/xvfb
|
||||||
|
sudo update-rc.d xvfb defaults
|
||||||
|
sudo service xvfb start
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: "8.12.0"
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.10.1"
|
||||||
|
- script: |
|
||||||
|
yarn
|
||||||
|
displayName: Install Dependencies
|
||||||
|
- script: |
|
||||||
|
yarn gulp electron-x64
|
||||||
|
displayName: Download Electron
|
||||||
|
- script: |
|
||||||
|
yarn gulp hygiene
|
||||||
|
displayName: Run Hygiene Checks
|
||||||
|
- script: |
|
||||||
|
yarn monaco-compile-check
|
||||||
|
displayName: Run Monaco Editor Checks
|
||||||
|
- script: |
|
||||||
|
yarn strict-null-check
|
||||||
|
displayName: Run Strict Null Checks
|
||||||
|
- script: |
|
||||||
|
yarn compile
|
||||||
|
displayName: Compile Sources
|
||||||
|
- script: |
|
||||||
|
yarn download-builtin-extensions
|
||||||
|
displayName: Download Built-in Extensions
|
||||||
|
- script: |
|
||||||
|
DISPLAY=:10 ./scripts/test.sh --tfs "Unit Tests"
|
||||||
|
displayName: Run Unit Tests
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
displayName: Publish Tests Results
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: '*-results.xml'
|
||||||
|
searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
|
||||||
|
condition: succeededOrFailed()
|
||||||
40
build/azure-pipelines/linux/frozen-check.js
Normal file
40
build/azure-pipelines/linux/frozen-check.js
Normal file
@@ -0,0 +1,40 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
'use strict';
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const documentdb_1 = require("documentdb");
|
||||||
|
function createDefaultConfig(quality) {
|
||||||
|
return {
|
||||||
|
id: quality,
|
||||||
|
frozen: false
|
||||||
|
};
|
||||||
|
}
|
||||||
|
function getConfig(quality) {
|
||||||
|
const client = new documentdb_1.DocumentClient(process.env['AZURE_DOCUMENTDB_ENDPOINT'], { masterKey: process.env['AZURE_DOCUMENTDB_MASTERKEY'] });
|
||||||
|
const collection = 'dbs/builds/colls/config';
|
||||||
|
const query = {
|
||||||
|
query: `SELECT TOP 1 * FROM c WHERE c.id = @quality`,
|
||||||
|
parameters: [
|
||||||
|
{ name: '@quality', value: quality }
|
||||||
|
]
|
||||||
|
};
|
||||||
|
return new Promise((c, e) => {
|
||||||
|
client.queryDocuments(collection, query).toArray((err, results) => {
|
||||||
|
if (err && err.code !== 409) {
|
||||||
|
return e(err);
|
||||||
|
}
|
||||||
|
c(!results || results.length === 0 ? createDefaultConfig(quality) : results[0]);
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
getConfig(process.argv[2])
|
||||||
|
.then(config => {
|
||||||
|
console.log(config.frozen);
|
||||||
|
process.exit(0);
|
||||||
|
})
|
||||||
|
.catch(err => {
|
||||||
|
console.error(err);
|
||||||
|
process.exit(1);
|
||||||
|
});
|
||||||
112
build/azure-pipelines/linux/product-build-linux.yml
Normal file
112
build/azure-pipelines/linux/product-build-linux.yml
Normal file
@@ -0,0 +1,112 @@
|
|||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: "8.12.0"
|
||||||
|
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.10.1"
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
export npm_config_arch="$(VSCODE_ARCH)"
|
||||||
|
if [[ "$(VSCODE_ARCH)" == "ia32" ]]; then
|
||||||
|
export PKG_CONFIG_PATH="/usr/lib/i386-linux-gnu/pkgconfig"
|
||||||
|
fi
|
||||||
|
|
||||||
|
echo "machine monacotools.visualstudio.com password $(VSO_PAT)" > ~/.netrc
|
||||||
|
CHILD_CONCURRENCY=1 yarn
|
||||||
|
npm run gulp -- hygiene
|
||||||
|
npm run monaco-compile-check
|
||||||
|
npm run strict-null-check
|
||||||
|
VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- mixin
|
||||||
|
node build/azure-pipelines/common/installDistro.js
|
||||||
|
node build/lib/builtInExtensions.js
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)" npm run gulp -- vscode-linux-$(VSCODE_ARCH)-min
|
||||||
|
name: build
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
npm run gulp -- "electron-$(VSCODE_ARCH)"
|
||||||
|
|
||||||
|
# xvfb seems to be crashing often, let's make sure it's always up
|
||||||
|
service xvfb start
|
||||||
|
|
||||||
|
DISPLAY=:10 ./scripts/test.sh --build --tfs "Unit Tests"
|
||||||
|
# yarn smoketest -- --build "$(agent.builddirectory)/VSCode-linux-$(VSCODE_ARCH)"
|
||||||
|
name: test
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
REPO="$(pwd)"
|
||||||
|
ROOT="$REPO/.."
|
||||||
|
ARCH="$(VSCODE_ARCH)"
|
||||||
|
|
||||||
|
# Publish tarball
|
||||||
|
PLATFORM_LINUX="linux-$(VSCODE_ARCH)"
|
||||||
|
[[ "$ARCH" == "ia32" ]] && DEB_ARCH="i386" || DEB_ARCH="amd64"
|
||||||
|
[[ "$ARCH" == "ia32" ]] && RPM_ARCH="i386" || RPM_ARCH="x86_64"
|
||||||
|
BUILDNAME="VSCode-$PLATFORM_LINUX"
|
||||||
|
BUILD="$ROOT/$BUILDNAME"
|
||||||
|
BUILD_VERSION="$(date +%s)"
|
||||||
|
[ -z "$VSCODE_QUALITY" ] && TARBALL_FILENAME="code-$BUILD_VERSION.tar.gz" || TARBALL_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.tar.gz"
|
||||||
|
TARBALL_PATH="$ROOT/$TARBALL_FILENAME"
|
||||||
|
PACKAGEJSON="$BUILD/resources/app/package.json"
|
||||||
|
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")
|
||||||
|
|
||||||
|
rm -rf $ROOT/code-*.tar.*
|
||||||
|
(cd $ROOT && tar -czf $TARBALL_PATH $BUILDNAME)
|
||||||
|
|
||||||
|
AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \
|
||||||
|
AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \
|
||||||
|
MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \
|
||||||
|
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_LINUX" archive-unsigned "$TARBALL_FILENAME" "$VERSION" true "$TARBALL_PATH"
|
||||||
|
|
||||||
|
# Publish hockeyapp symbols
|
||||||
|
node build/azure-pipelines/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" "$(VSCODE_HOCKEYAPP_ID_LINUX64)"
|
||||||
|
|
||||||
|
# Publish DEB
|
||||||
|
npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-deb"
|
||||||
|
PLATFORM_DEB="linux-deb-$ARCH"
|
||||||
|
[[ "$ARCH" == "ia32" ]] && DEB_ARCH="i386" || DEB_ARCH="amd64"
|
||||||
|
DEB_FILENAME="$(ls $REPO/.build/linux/deb/$DEB_ARCH/deb/)"
|
||||||
|
DEB_PATH="$REPO/.build/linux/deb/$DEB_ARCH/deb/$DEB_FILENAME"
|
||||||
|
|
||||||
|
AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \
|
||||||
|
AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \
|
||||||
|
MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \
|
||||||
|
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_DEB" package "$DEB_FILENAME" "$VERSION" true "$DEB_PATH"
|
||||||
|
|
||||||
|
# Publish RPM
|
||||||
|
npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-build-rpm"
|
||||||
|
PLATFORM_RPM="linux-rpm-$ARCH"
|
||||||
|
[[ "$ARCH" == "ia32" ]] && RPM_ARCH="i386" || RPM_ARCH="x86_64"
|
||||||
|
RPM_FILENAME="$(ls $REPO/.build/linux/rpm/$RPM_ARCH/ | grep .rpm)"
|
||||||
|
RPM_PATH="$REPO/.build/linux/rpm/$RPM_ARCH/$RPM_FILENAME"
|
||||||
|
|
||||||
|
AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \
|
||||||
|
AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \
|
||||||
|
MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \
|
||||||
|
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "$PLATFORM_RPM" package "$RPM_FILENAME" "$VERSION" true "$RPM_PATH"
|
||||||
|
|
||||||
|
# Publish Snap
|
||||||
|
npm run gulp -- "vscode-linux-$(VSCODE_ARCH)-prepare-snap"
|
||||||
|
|
||||||
|
# Pack snap tarball artifact, in order to preserve file perms
|
||||||
|
mkdir -p $REPO/.build/linux/snap-tarball
|
||||||
|
SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-$(VSCODE_ARCH).tar.gz"
|
||||||
|
rm -rf $SNAP_TARBALL_PATH
|
||||||
|
(cd .build/linux && tar -czf $SNAP_TARBALL_PATH snap)
|
||||||
|
|
||||||
|
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||||
|
displayName: 'Component Detection'
|
||||||
|
continueOnError: true
|
||||||
|
|
||||||
|
- task: PublishPipelineArtifact@0
|
||||||
|
displayName: 'Publish Pipeline Artifact'
|
||||||
|
inputs:
|
||||||
|
artifactName: snap-$(VSCODE_ARCH)
|
||||||
|
targetPath: .build/linux/snap-tarball
|
||||||
42
build/azure-pipelines/linux/snap-build-linux.yml
Normal file
42
build/azure-pipelines/linux/snap-build-linux.yml
Normal file
@@ -0,0 +1,42 @@
|
|||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: "8.12.0"
|
||||||
|
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.10.1"
|
||||||
|
|
||||||
|
- task: DownloadPipelineArtifact@0
|
||||||
|
displayName: 'Download Pipeline Artifact'
|
||||||
|
inputs:
|
||||||
|
artifactName: snap-$(VSCODE_ARCH)
|
||||||
|
targetPath: .build/linux/snap-tarball
|
||||||
|
|
||||||
|
- script: |
|
||||||
|
set -e
|
||||||
|
|
||||||
|
REPO="$(pwd)"
|
||||||
|
ARCH="$(VSCODE_ARCH)"
|
||||||
|
SNAP_ROOT="$REPO/.build/linux/snap/$ARCH"
|
||||||
|
|
||||||
|
# Install build dependencies
|
||||||
|
(cd build && yarn)
|
||||||
|
|
||||||
|
# Unpack snap tarball artifact, in order to preserve file perms
|
||||||
|
SNAP_TARBALL_PATH="$REPO/.build/linux/snap-tarball/snap-$ARCH.tar.gz"
|
||||||
|
(cd .build/linux && tar -xzf $SNAP_TARBALL_PATH)
|
||||||
|
|
||||||
|
# Create snap package
|
||||||
|
BUILD_VERSION="$(date +%s)"
|
||||||
|
SNAP_FILENAME="code-$VSCODE_QUALITY-$BUILD_VERSION.snap"
|
||||||
|
PACKAGEJSON="$(ls $SNAP_ROOT/code*/usr/share/code*/resources/app/package.json)"
|
||||||
|
VERSION=$(node -p "require(\"$PACKAGEJSON\").version")
|
||||||
|
SNAP_PATH="$SNAP_ROOT/$SNAP_FILENAME"
|
||||||
|
(cd $SNAP_ROOT/code-* && snapcraft snap --output "$SNAP_PATH")
|
||||||
|
|
||||||
|
# Publish snap package
|
||||||
|
AZURE_DOCUMENTDB_MASTERKEY="$(AZURE_DOCUMENTDB_MASTERKEY)" \
|
||||||
|
AZURE_STORAGE_ACCESS_KEY_2="$(AZURE_STORAGE_ACCESS_KEY_2)" \
|
||||||
|
MOONCAKE_STORAGE_ACCESS_KEY="$(MOONCAKE_STORAGE_ACCESS_KEY)" \
|
||||||
|
node build/azure-pipelines/common/publish.js "$VSCODE_QUALITY" "linux-snap-$ARCH" package "$SNAP_FILENAME" "$VERSION" true "$SNAP_PATH"
|
||||||
65
build/azure-pipelines/product-build.yml
Normal file
65
build/azure-pipelines/product-build.yml
Normal file
@@ -0,0 +1,65 @@
|
|||||||
|
resources:
|
||||||
|
containers:
|
||||||
|
- container: vscode-x64
|
||||||
|
image: joaomoreno/vscode-linux-build-agent:x64
|
||||||
|
- container: vscode-ia32
|
||||||
|
image: joaomoreno/vscode-linux-build-agent:ia32
|
||||||
|
- container: snapcraft
|
||||||
|
image: snapcore/snapcraft
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
- job: Windows
|
||||||
|
condition: eq(variables['VSCODE_BUILD_WIN32'], 'true')
|
||||||
|
pool:
|
||||||
|
vmImage: VS2017-Win2016
|
||||||
|
variables:
|
||||||
|
VSCODE_ARCH: x64
|
||||||
|
steps:
|
||||||
|
- template: win32/product-build-win32.yml
|
||||||
|
|
||||||
|
- job: Windows32
|
||||||
|
condition: eq(variables['VSCODE_BUILD_WIN32_32BIT'], 'true')
|
||||||
|
pool:
|
||||||
|
vmImage: VS2017-Win2016
|
||||||
|
variables:
|
||||||
|
VSCODE_ARCH: ia32
|
||||||
|
steps:
|
||||||
|
- template: win32/product-build-win32.yml
|
||||||
|
|
||||||
|
- job: Linux
|
||||||
|
condition: eq(variables['VSCODE_BUILD_LINUX'], 'true')
|
||||||
|
pool:
|
||||||
|
vmImage: 'Ubuntu-16.04'
|
||||||
|
variables:
|
||||||
|
VSCODE_ARCH: x64
|
||||||
|
container: vscode-x64
|
||||||
|
steps:
|
||||||
|
- template: linux/product-build-linux.yml
|
||||||
|
|
||||||
|
- job: LinuxSnap
|
||||||
|
condition: eq(variables['VSCODE_BUILD_LINUX'], 'true')
|
||||||
|
pool:
|
||||||
|
vmImage: 'Ubuntu-16.04'
|
||||||
|
variables:
|
||||||
|
VSCODE_ARCH: x64
|
||||||
|
container: snapcraft
|
||||||
|
dependsOn: Linux
|
||||||
|
steps:
|
||||||
|
- template: linux/snap-build-linux.yml
|
||||||
|
|
||||||
|
- job: Linux32
|
||||||
|
condition: eq(variables['VSCODE_BUILD_LINUX_32BIT'], 'true')
|
||||||
|
pool:
|
||||||
|
vmImage: 'Ubuntu-16.04'
|
||||||
|
variables:
|
||||||
|
VSCODE_ARCH: ia32
|
||||||
|
container: vscode-ia32
|
||||||
|
steps:
|
||||||
|
- template: linux/product-build-linux.yml
|
||||||
|
|
||||||
|
- job: macOS
|
||||||
|
condition: eq(variables['VSCODE_BUILD_MACOS'], 'true')
|
||||||
|
pool:
|
||||||
|
vmImage: macOS 10.13
|
||||||
|
steps:
|
||||||
|
- template: darwin/product-build-darwin.yml
|
||||||
6
build/azure-pipelines/win32/ESRPClient/NuGet.config
Normal file
6
build/azure-pipelines/win32/ESRPClient/NuGet.config
Normal file
@@ -0,0 +1,6 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<configuration>
|
||||||
|
<packageSources>
|
||||||
|
<add key="ESRP" value="https://microsoft.pkgs.visualstudio.com/_packaging/ESRP/nuget/v3/index.json" />
|
||||||
|
</packageSources>
|
||||||
|
</configuration>
|
||||||
4
build/azure-pipelines/win32/ESRPClient/packages.config
Normal file
4
build/azure-pipelines/win32/ESRPClient/packages.config
Normal file
@@ -0,0 +1,4 @@
|
|||||||
|
<?xml version="1.0" encoding="utf-8"?>
|
||||||
|
<packages>
|
||||||
|
<package id="EsrpClient" version="1.0.27" />
|
||||||
|
</packages>
|
||||||
44
build/azure-pipelines/win32/continuous-build-win32.yml
Normal file
44
build/azure-pipelines/win32/continuous-build-win32.yml
Normal file
@@ -0,0 +1,44 @@
|
|||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: "8.12.0"
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.10.1"
|
||||||
|
- task: UsePythonVersion@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '2.x'
|
||||||
|
addToPath: true
|
||||||
|
- powershell: |
|
||||||
|
yarn
|
||||||
|
displayName: Install Dependencies
|
||||||
|
- powershell: |
|
||||||
|
yarn gulp electron
|
||||||
|
displayName: Download Electron
|
||||||
|
- powershell: |
|
||||||
|
yarn gulp hygiene
|
||||||
|
displayName: Run Hygiene Checks
|
||||||
|
- powershell: |
|
||||||
|
yarn monaco-compile-check
|
||||||
|
displayName: Run Monaco Editor Checks
|
||||||
|
- script: |
|
||||||
|
yarn strict-null-check
|
||||||
|
displayName: Run Strict Null Checks
|
||||||
|
- powershell: |
|
||||||
|
yarn compile
|
||||||
|
displayName: Compile Sources
|
||||||
|
- powershell: |
|
||||||
|
yarn download-builtin-extensions
|
||||||
|
displayName: Download Built-in Extensions
|
||||||
|
- powershell: |
|
||||||
|
.\scripts\test.bat --tfs "Unit Tests"
|
||||||
|
displayName: Run Unit Tests
|
||||||
|
- powershell: |
|
||||||
|
.\scripts\test-integration.bat --tfs "Integration Tests"
|
||||||
|
displayName: Run Integration Tests
|
||||||
|
- task: PublishTestResults@2
|
||||||
|
displayName: Publish Tests Results
|
||||||
|
inputs:
|
||||||
|
testResultsFiles: '*-results.xml'
|
||||||
|
searchFolder: '$(Build.ArtifactStagingDirectory)/test-results'
|
||||||
|
condition: succeededOrFailed()
|
||||||
24
build/azure-pipelines/win32/exec.ps1
Normal file
24
build/azure-pipelines/win32/exec.ps1
Normal file
@@ -0,0 +1,24 @@
|
|||||||
|
# Taken from psake https://github.com/psake/psake
|
||||||
|
|
||||||
|
<#
|
||||||
|
.SYNOPSIS
|
||||||
|
This is a helper function that runs a scriptblock and checks the PS variable $lastexitcode
|
||||||
|
to see if an error occcured. If an error is detected then an exception is thrown.
|
||||||
|
This function allows you to run command-line programs without having to
|
||||||
|
explicitly check the $lastexitcode variable.
|
||||||
|
|
||||||
|
.EXAMPLE
|
||||||
|
exec { svn info $repository_trunk } "Error executing SVN. Please verify SVN command-line client is installed"
|
||||||
|
#>
|
||||||
|
function Exec
|
||||||
|
{
|
||||||
|
[CmdletBinding()]
|
||||||
|
param(
|
||||||
|
[Parameter(Position=0,Mandatory=1)][scriptblock]$cmd,
|
||||||
|
[Parameter(Position=1,Mandatory=0)][string]$errorMessage = ($msgs.error_bad_command -f $cmd)
|
||||||
|
)
|
||||||
|
& $cmd
|
||||||
|
if ($lastexitcode -ne 0) {
|
||||||
|
throw ("Exec: " + $errorMessage)
|
||||||
|
}
|
||||||
|
}
|
||||||
14
build/azure-pipelines/win32/import-esrp-auth-cert.ps1
Normal file
14
build/azure-pipelines/win32/import-esrp-auth-cert.ps1
Normal file
@@ -0,0 +1,14 @@
|
|||||||
|
Param(
|
||||||
|
[string]$AuthCertificateBase64,
|
||||||
|
[string]$AuthCertificateKey
|
||||||
|
)
|
||||||
|
|
||||||
|
# Import auth certificate
|
||||||
|
$AuthCertificateFileName = [System.IO.Path]::GetTempFileName()
|
||||||
|
$AuthCertificateBytes = [Convert]::FromBase64String($AuthCertificateBase64)
|
||||||
|
[IO.File]::WriteAllBytes($AuthCertificateFileName, $AuthCertificateBytes)
|
||||||
|
$AuthCertificate = Import-PfxCertificate -FilePath $AuthCertificateFileName -CertStoreLocation Cert:\LocalMachine\My -Password (ConvertTo-SecureString $AuthCertificateKey -AsPlainText -Force)
|
||||||
|
rm $AuthCertificateFileName
|
||||||
|
$ESRPAuthCertificateSubjectName = $AuthCertificate.Subject
|
||||||
|
|
||||||
|
Write-Output ("##vso[task.setvariable variable=ESRPAuthCertificateSubjectName;]$ESRPAuthCertificateSubjectName")
|
||||||
152
build/azure-pipelines/win32/product-build-win32.yml
Normal file
152
build/azure-pipelines/win32/product-build-win32.yml
Normal file
@@ -0,0 +1,152 @@
|
|||||||
|
steps:
|
||||||
|
- task: NodeTool@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: "8.12.0"
|
||||||
|
|
||||||
|
- task: geeklearningio.gl-vsts-tasks-yarn.yarn-installer-task.YarnInstaller@2
|
||||||
|
inputs:
|
||||||
|
versionSpec: "1.10.1"
|
||||||
|
|
||||||
|
- task: UsePythonVersion@0
|
||||||
|
inputs:
|
||||||
|
versionSpec: '2.x'
|
||||||
|
addToPath: true
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
"machine monacotools.visualstudio.com password $(VSO_PAT)" | Out-File "$env:USERPROFILE\_netrc" -Encoding ASCII
|
||||||
|
$env:npm_config_arch="$(VSCODE_ARCH)"
|
||||||
|
$env:CHILD_CONCURRENCY="1"
|
||||||
|
$env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)"
|
||||||
|
exec { yarn }
|
||||||
|
exec { npm run gulp -- hygiene }
|
||||||
|
exec { npm run monaco-compile-check }
|
||||||
|
exec { npm run strict-null-check }
|
||||||
|
exec { npm run gulp -- mixin }
|
||||||
|
exec { node build/azure-pipelines/common/installDistro.js }
|
||||||
|
exec { node build/lib/builtInExtensions.js }
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
$env:VSCODE_MIXIN_PASSWORD="$(VSCODE_MIXIN_PASSWORD)"
|
||||||
|
exec { npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-min" }
|
||||||
|
exec { npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-inno-updater" }
|
||||||
|
name: build
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
exec { npm run gulp -- "electron-$(VSCODE_ARCH)" }
|
||||||
|
exec { .\scripts\test.bat --build --tfs "Unit Tests" }
|
||||||
|
# yarn smoketest -- --build "$(agent.builddirectory)\VSCode-win32-$(VSCODE_ARCH)"
|
||||||
|
name: test
|
||||||
|
|
||||||
|
- task: SFP.build-tasks.custom-build-task-1.EsrpCodeSigning@1
|
||||||
|
inputs:
|
||||||
|
ConnectedServiceName: 'ESRP CodeSign'
|
||||||
|
FolderPath: '$(agent.builddirectory)/VSCode-win32-$(VSCODE_ARCH)'
|
||||||
|
Pattern: '*.dll,*.exe,*.node'
|
||||||
|
signConfigType: inlineSignParams
|
||||||
|
inlineOperation: |
|
||||||
|
[
|
||||||
|
{
|
||||||
|
"keyCode": "CP-230012",
|
||||||
|
"operationSetCode": "SigntoolSign",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"parameterName": "OpusName",
|
||||||
|
"parameterValue": "VS Code"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "OpusInfo",
|
||||||
|
"parameterValue": "https://code.visualstudio.com/"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "Append",
|
||||||
|
"parameterValue": "/as"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "FileDigest",
|
||||||
|
"parameterValue": "/fd \"SHA256\""
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "PageHash",
|
||||||
|
"parameterValue": "/NPH"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"parameterName": "TimeStamp",
|
||||||
|
"parameterValue": "/tr \"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer\" /td sha256"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"toolName": "sign",
|
||||||
|
"toolVersion": "1.0"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"keyCode": "CP-230012",
|
||||||
|
"operationSetCode": "SigntoolVerify",
|
||||||
|
"parameters": [
|
||||||
|
{
|
||||||
|
"parameterName": "VerifyAll",
|
||||||
|
"parameterValue": "/all"
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"toolName": "sign",
|
||||||
|
"toolVersion": "1.0"
|
||||||
|
}
|
||||||
|
]
|
||||||
|
SessionTimeout: 120
|
||||||
|
|
||||||
|
- task: NuGetCommand@2
|
||||||
|
displayName: Install ESRPClient.exe
|
||||||
|
inputs:
|
||||||
|
restoreSolution: 'build\azure-pipelines\win32\ESRPClient\packages.config'
|
||||||
|
feedsToUse: config
|
||||||
|
nugetConfigPath: 'build\azure-pipelines\win32\ESRPClient\NuGet.config'
|
||||||
|
externalFeedCredentials: 3fc0b7f7-da09-4ae7-a9c8-d69824b1819b
|
||||||
|
restoreDirectory: packages
|
||||||
|
|
||||||
|
- task: ESRPImportCertTask@1
|
||||||
|
displayName: Import ESRP Request Signing Certificate
|
||||||
|
inputs:
|
||||||
|
ESRP: 'ESRP CodeSign'
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
.\build\azure-pipelines\win32\import-esrp-auth-cert.ps1 -AuthCertificateBase64 $(ESRP_AUTH_CERTIFICATE) -AuthCertificateKey $(ESRP_AUTH_CERTIFICATE_KEY)
|
||||||
|
displayName: Import ESRP Auth Certificate
|
||||||
|
|
||||||
|
- powershell: |
|
||||||
|
. build/azure-pipelines/win32/exec.ps1
|
||||||
|
$ErrorActionPreference = "Stop"
|
||||||
|
exec { npm run gulp -- "vscode-win32-$(VSCODE_ARCH)-archive" "vscode-win32-$(VSCODE_ARCH)-system-setup" "vscode-win32-$(VSCODE_ARCH)-user-setup" --sign }
|
||||||
|
|
||||||
|
$Repo = "$(pwd)"
|
||||||
|
$Root = "$Repo\.."
|
||||||
|
$SystemExe = "$Repo\.build\win32-$(VSCODE_ARCH)\system-setup\VSCodeSetup.exe"
|
||||||
|
$UserExe = "$Repo\.build\win32-$(VSCODE_ARCH)\user-setup\VSCodeSetup.exe"
|
||||||
|
$Zip = "$Repo\.build\win32-$(VSCODE_ARCH)\archive\VSCode-win32-$(VSCODE_ARCH).zip"
|
||||||
|
$Build = "$Root\VSCode-win32-$(VSCODE_ARCH)"
|
||||||
|
|
||||||
|
# get version
|
||||||
|
$PackageJson = Get-Content -Raw -Path "$Build\resources\app\package.json" | ConvertFrom-Json
|
||||||
|
$Version = $PackageJson.version
|
||||||
|
$Quality = "$env:VSCODE_QUALITY"
|
||||||
|
$env:AZURE_STORAGE_ACCESS_KEY_2 = "$(AZURE_STORAGE_ACCESS_KEY_2)"
|
||||||
|
$env:MOONCAKE_STORAGE_ACCESS_KEY = "$(MOONCAKE_STORAGE_ACCESS_KEY)"
|
||||||
|
$env:AZURE_DOCUMENTDB_MASTERKEY = "$(AZURE_DOCUMENTDB_MASTERKEY)"
|
||||||
|
|
||||||
|
$assetPlatform = if ("$(VSCODE_ARCH)" -eq "ia32") { "win32" } else { "win32-x64" }
|
||||||
|
|
||||||
|
exec { node build/azure-pipelines/common/publish.js $Quality "$global:assetPlatform-archive" archive "VSCode-win32-$(VSCODE_ARCH)-$Version.zip" $Version true $Zip }
|
||||||
|
exec { node build/azure-pipelines/common/publish.js $Quality "$global:assetPlatform" setup "VSCodeSetup-$(VSCODE_ARCH)-$Version.exe" $Version true $SystemExe }
|
||||||
|
exec { node build/azure-pipelines/common/publish.js $Quality "$global:assetPlatform-user" setup "VSCodeUserSetup-$(VSCODE_ARCH)-$Version.exe" $Version true $UserExe }
|
||||||
|
|
||||||
|
# publish hockeyapp symbols
|
||||||
|
$hockeyAppId = if ("$(VSCODE_ARCH)" -eq "ia32") { "$(VSCODE_HOCKEYAPP_ID_WIN32)" } else { "$(VSCODE_HOCKEYAPP_ID_WIN64)" }
|
||||||
|
exec { node build/azure-pipelines/common/symbols.js "$(VSCODE_MIXIN_PASSWORD)" "$(VSCODE_HOCKEYAPP_TOKEN)" "$(VSCODE_ARCH)" $hockeyAppId }
|
||||||
|
|
||||||
|
- task: ms.vss-governance-buildtask.governance-build-task-component-detection.ComponentGovernanceComponentDetection@0
|
||||||
|
displayName: 'Component Detection'
|
||||||
|
continueOnError: true
|
||||||
70
build/azure-pipelines/win32/sign.ps1
Normal file
70
build/azure-pipelines/win32/sign.ps1
Normal file
@@ -0,0 +1,70 @@
|
|||||||
|
function Create-TmpJson($Obj) {
|
||||||
|
$FileName = [System.IO.Path]::GetTempFileName()
|
||||||
|
ConvertTo-Json -Depth 100 $Obj | Out-File -Encoding UTF8 $FileName
|
||||||
|
return $FileName
|
||||||
|
}
|
||||||
|
|
||||||
|
$Auth = Create-TmpJson @{
|
||||||
|
Version = "1.0.0"
|
||||||
|
AuthenticationType = "AAD_CERT"
|
||||||
|
ClientId = $env:ESRPClientId
|
||||||
|
AuthCert = @{
|
||||||
|
SubjectName = $env:ESRPAuthCertificateSubjectName
|
||||||
|
StoreLocation = "LocalMachine"
|
||||||
|
StoreName = "My"
|
||||||
|
}
|
||||||
|
RequestSigningCert = @{
|
||||||
|
SubjectName = $env:ESRPCertificateSubjectName
|
||||||
|
StoreLocation = "LocalMachine"
|
||||||
|
StoreName = "My"
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
$Policy = Create-TmpJson @{
|
||||||
|
Version = "1.0.0"
|
||||||
|
}
|
||||||
|
|
||||||
|
$Input = Create-TmpJson @{
|
||||||
|
Version = "1.0.0"
|
||||||
|
SignBatches = @(
|
||||||
|
@{
|
||||||
|
SourceLocationType = "UNC"
|
||||||
|
SignRequestFiles = @(
|
||||||
|
@{
|
||||||
|
SourceLocation = $args[0]
|
||||||
|
}
|
||||||
|
)
|
||||||
|
SigningInfo = @{
|
||||||
|
Operations = @(
|
||||||
|
@{
|
||||||
|
KeyCode = "CP-230012"
|
||||||
|
OperationCode = "SigntoolSign"
|
||||||
|
Parameters = @{
|
||||||
|
OpusName = "VS Code"
|
||||||
|
OpusInfo = "https://code.visualstudio.com/"
|
||||||
|
Append = "/as"
|
||||||
|
FileDigest = "/fd `"SHA256`""
|
||||||
|
PageHash = "/NPH"
|
||||||
|
TimeStamp = "/tr `"http://rfc3161.gtm.corp.microsoft.com/TSS/HttpTspServer`" /td sha256"
|
||||||
|
}
|
||||||
|
ToolName = "sign"
|
||||||
|
ToolVersion = "1.0"
|
||||||
|
},
|
||||||
|
@{
|
||||||
|
KeyCode = "CP-230012"
|
||||||
|
OperationCode = "SigntoolVerify"
|
||||||
|
Parameters = @{
|
||||||
|
VerifyAll = "/all"
|
||||||
|
}
|
||||||
|
ToolName = "sign"
|
||||||
|
ToolVersion = "1.0"
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
)
|
||||||
|
}
|
||||||
|
|
||||||
|
$Output = [System.IO.Path]::GetTempFileName()
|
||||||
|
$ScriptPath = Split-Path -Path $MyInvocation.MyCommand.Definition -Parent
|
||||||
|
& "$ScriptPath\ESRPClient\packages\EsrpClient.1.0.27\tools\ESRPClient.exe" Sign -a $Auth -p $Policy -i $Input -o $Output
|
||||||
@@ -1,12 +1,2 @@
|
|||||||
[
|
[
|
||||||
{
|
]
|
||||||
"name": "ms-vscode.node-debug",
|
|
||||||
"version": "1.21.8",
|
|
||||||
"repo": "https://github.com/Microsoft/vscode-node-debug"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"name": "ms-vscode.node-debug2",
|
|
||||||
"version": "1.21.2",
|
|
||||||
"repo": "https://github.com/Microsoft/vscode-node-debug2"
|
|
||||||
}
|
|
||||||
]
|
|
||||||
|
|||||||
@@ -43,7 +43,7 @@ function asYarnDependency(prefix, tree) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getYarnProductionDependencies(cwd) {
|
function getYarnProductionDependencies(cwd) {
|
||||||
const raw = cp.execSync('yarn list --json', { cwd, encoding: 'utf8', env: { ...process.env, NODE_ENV: 'production' }, stdio: [null, null, 'ignore'] });
|
const raw = cp.execSync('yarn list --json', { cwd, encoding: 'utf8', env: { ...process.env, NODE_ENV: 'production' }, stdio: [null, null, 'inherit'] });
|
||||||
const match = /^{"type":"tree".*$/m.exec(raw);
|
const match = /^{"type":"tree".*$/m.exec(raw);
|
||||||
|
|
||||||
if (!match || match.length !== 1) {
|
if (!match || match.length !== 1) {
|
||||||
|
|||||||
@@ -3,16 +3,21 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
var gulp = require('gulp');
|
const gulp = require('gulp');
|
||||||
var path = require('path');
|
const path = require('path');
|
||||||
var util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
var common = require('./lib/optimize');
|
const common = require('./lib/optimize');
|
||||||
var es = require('event-stream');
|
const es = require('event-stream');
|
||||||
var File = require('vinyl');
|
const File = require('vinyl');
|
||||||
|
const i18n = require('./lib/i18n');
|
||||||
|
const standalone = require('./lib/standalone');
|
||||||
|
const cp = require('child_process');
|
||||||
|
const compilation = require('./lib/compilation');
|
||||||
|
const monacoapi = require('./monaco/api');
|
||||||
|
const fs = require('fs');
|
||||||
|
|
||||||
var root = path.dirname(__dirname);
|
var root = path.dirname(__dirname);
|
||||||
var sha1 = util.getVersion(root);
|
var sha1 = util.getVersion(root);
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
|
||||||
var semver = require('./monaco/package.json').version;
|
var semver = require('./monaco/package.json').version;
|
||||||
var headerVersion = semver + '(' + sha1 + ')';
|
var headerVersion = semver + '(' + sha1 + ')';
|
||||||
|
|
||||||
@@ -23,7 +28,7 @@ var editorEntryPoints = [
|
|||||||
name: 'vs/editor/editor.main',
|
name: 'vs/editor/editor.main',
|
||||||
include: [],
|
include: [],
|
||||||
exclude: ['vs/css', 'vs/nls'],
|
exclude: ['vs/css', 'vs/nls'],
|
||||||
prepend: ['out-build/vs/css.js', 'out-build/vs/nls.js'],
|
prepend: ['out-editor-build/vs/css.js', 'out-editor-build/vs/nls.js'],
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
name: 'vs/base/common/worker/simpleWorker',
|
name: 'vs/base/common/worker/simpleWorker',
|
||||||
@@ -56,39 +61,149 @@ var BUNDLED_FILE_HEADER = [
|
|||||||
''
|
''
|
||||||
].join('\n');
|
].join('\n');
|
||||||
|
|
||||||
function editorLoaderConfig() {
|
const languages = i18n.defaultLanguages.concat([]); // i18n.defaultLanguages.concat(process.env.VSCODE_QUALITY !== 'stable' ? i18n.extraLanguages : []);
|
||||||
var result = common.loaderConfig();
|
|
||||||
|
|
||||||
// never ship octicons in editor
|
gulp.task('clean-editor-src', util.rimraf('out-editor-src'));
|
||||||
result.paths['vs/base/browser/ui/octiconLabel/octiconLabel'] = 'out-build/vs/base/browser/ui/octiconLabel/octiconLabel.mock';
|
gulp.task('extract-editor-src', ['clean-editor-src'], function () {
|
||||||
|
console.log(`If the build fails, consider tweaking shakeLevel below to a lower value.`);
|
||||||
|
const apiusages = monacoapi.execute().usageContent;
|
||||||
|
const extrausages = fs.readFileSync(path.join(root, 'build', 'monaco', 'monaco.usage.recipe')).toString();
|
||||||
|
standalone.extractEditor({
|
||||||
|
sourcesRoot: path.join(root, 'src'),
|
||||||
|
entryPoints: [
|
||||||
|
'vs/editor/editor.main',
|
||||||
|
'vs/editor/editor.worker',
|
||||||
|
'vs/base/worker/workerMain',
|
||||||
|
],
|
||||||
|
inlineEntryPoints: [
|
||||||
|
apiusages,
|
||||||
|
extrausages
|
||||||
|
],
|
||||||
|
typings: [
|
||||||
|
'typings/lib.ie11_safe_es6.d.ts',
|
||||||
|
'typings/thenable.d.ts',
|
||||||
|
'typings/es6-promise.d.ts',
|
||||||
|
'typings/require-monaco.d.ts',
|
||||||
|
'vs/monaco.d.ts'
|
||||||
|
],
|
||||||
|
libs: [
|
||||||
|
`lib.es5.d.ts`,
|
||||||
|
`lib.dom.d.ts`,
|
||||||
|
`lib.webworker.importscripts.d.ts`
|
||||||
|
],
|
||||||
|
redirects: {
|
||||||
|
'vs/base/browser/ui/octiconLabel/octiconLabel': 'vs/base/browser/ui/octiconLabel/octiconLabel.mock',
|
||||||
|
},
|
||||||
|
shakeLevel: 2, // 0-Files, 1-InnerFile, 2-ClassMembers
|
||||||
|
importIgnorePattern: /^vs\/css!/,
|
||||||
|
destRoot: path.join(root, 'out-editor-src')
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
// force css inlining to use base64 -- see https://github.com/Microsoft/monaco-editor/issues/148
|
// Full compile, including nls and inline sources in sourcemaps, for build
|
||||||
result['vs/css'] = {
|
gulp.task('clean-editor-build', util.rimraf('out-editor-build'));
|
||||||
inlineResources: 'base64',
|
gulp.task('compile-editor-build', ['clean-editor-build', 'extract-editor-src'], compilation.compileTask('out-editor-src', 'out-editor-build', true));
|
||||||
inlineResourcesLimit: 3000 // see https://github.com/Microsoft/monaco-editor/issues/336
|
|
||||||
};
|
|
||||||
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
|
|
||||||
gulp.task('clean-optimized-editor', util.rimraf('out-editor'));
|
gulp.task('clean-optimized-editor', util.rimraf('out-editor'));
|
||||||
gulp.task('optimize-editor', ['clean-optimized-editor', 'compile-client-build'], common.optimizeTask({
|
gulp.task('optimize-editor', ['clean-optimized-editor', 'compile-editor-build'], common.optimizeTask({
|
||||||
|
src: 'out-editor-build',
|
||||||
entryPoints: editorEntryPoints,
|
entryPoints: editorEntryPoints,
|
||||||
otherSources: editorOtherSources,
|
otherSources: editorOtherSources,
|
||||||
resources: editorResources,
|
resources: editorResources,
|
||||||
loaderConfig: editorLoaderConfig(),
|
loaderConfig: {
|
||||||
|
paths: {
|
||||||
|
'vs': 'out-editor-build/vs',
|
||||||
|
'vs/css': 'out-editor-build/vs/css.build',
|
||||||
|
'vs/nls': 'out-editor-build/vs/nls.build',
|
||||||
|
'vscode': 'empty:'
|
||||||
|
}
|
||||||
|
},
|
||||||
bundleLoader: false,
|
bundleLoader: false,
|
||||||
header: BUNDLED_FILE_HEADER,
|
header: BUNDLED_FILE_HEADER,
|
||||||
bundleInfo: true,
|
bundleInfo: true,
|
||||||
out: 'out-editor',
|
out: 'out-editor',
|
||||||
languages: undefined
|
languages: languages
|
||||||
}));
|
}));
|
||||||
|
|
||||||
gulp.task('clean-minified-editor', util.rimraf('out-editor-min'));
|
gulp.task('clean-minified-editor', util.rimraf('out-editor-min'));
|
||||||
gulp.task('minify-editor', ['clean-minified-editor', 'optimize-editor'], common.minifyTask('out-editor'));
|
gulp.task('minify-editor', ['clean-minified-editor', 'optimize-editor'], common.minifyTask('out-editor'));
|
||||||
|
|
||||||
|
gulp.task('clean-editor-esm', util.rimraf('out-editor-esm'));
|
||||||
|
gulp.task('extract-editor-esm', ['clean-editor-esm', 'clean-editor-distro', 'extract-editor-src'], function () {
|
||||||
|
standalone.createESMSourcesAndResources2({
|
||||||
|
srcFolder: './out-editor-src',
|
||||||
|
outFolder: './out-editor-esm',
|
||||||
|
outResourcesFolder: './out-monaco-editor-core/esm',
|
||||||
|
ignores: [
|
||||||
|
'inlineEntryPoint:0.ts',
|
||||||
|
'inlineEntryPoint:1.ts',
|
||||||
|
'vs/loader.js',
|
||||||
|
'vs/nls.ts',
|
||||||
|
'vs/nls.build.js',
|
||||||
|
'vs/nls.d.ts',
|
||||||
|
'vs/css.js',
|
||||||
|
'vs/css.build.js',
|
||||||
|
'vs/css.d.ts',
|
||||||
|
'vs/base/worker/workerMain.ts',
|
||||||
|
],
|
||||||
|
renames: {
|
||||||
|
'vs/nls.mock.ts': 'vs/nls.ts'
|
||||||
|
}
|
||||||
|
});
|
||||||
|
});
|
||||||
|
gulp.task('compile-editor-esm', ['extract-editor-esm', 'clean-editor-distro'], function () {
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
const result = cp.spawnSync(`..\\node_modules\\.bin\\tsc.cmd`, {
|
||||||
|
cwd: path.join(__dirname, '../out-editor-esm')
|
||||||
|
});
|
||||||
|
console.log(result.stdout.toString());
|
||||||
|
console.log(result.stderr.toString());
|
||||||
|
} else {
|
||||||
|
const result = cp.spawnSync(`node`, [`../node_modules/.bin/tsc`], {
|
||||||
|
cwd: path.join(__dirname, '../out-editor-esm')
|
||||||
|
});
|
||||||
|
console.log(result.stdout.toString());
|
||||||
|
console.log(result.stderr.toString());
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
function toExternalDTS(contents) {
|
||||||
|
let lines = contents.split('\n');
|
||||||
|
let killNextCloseCurlyBrace = false;
|
||||||
|
for (let i = 0; i < lines.length; i++) {
|
||||||
|
let line = lines[i];
|
||||||
|
|
||||||
|
if (killNextCloseCurlyBrace) {
|
||||||
|
if ('}' === line) {
|
||||||
|
lines[i] = '';
|
||||||
|
killNextCloseCurlyBrace = false;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.indexOf(' ') === 0) {
|
||||||
|
lines[i] = line.substr(4);
|
||||||
|
} else if (line.charAt(0) === '\t') {
|
||||||
|
lines[i] = line.substr(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if ('declare namespace monaco {' === line) {
|
||||||
|
lines[i] = '';
|
||||||
|
killNextCloseCurlyBrace = true;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (line.indexOf('declare namespace monaco.') === 0) {
|
||||||
|
lines[i] = line.replace('declare namespace monaco.', 'export namespace ');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lines.join('\n');
|
||||||
|
}
|
||||||
|
|
||||||
gulp.task('clean-editor-distro', util.rimraf('out-monaco-editor-core'));
|
gulp.task('clean-editor-distro', util.rimraf('out-monaco-editor-core'));
|
||||||
gulp.task('editor-distro', ['clean-editor-distro', 'minify-editor', 'optimize-editor'], function () {
|
gulp.task('editor-distro', ['clean-editor-distro', 'compile-editor-esm', 'minify-editor', 'optimize-editor'], function () {
|
||||||
return es.merge(
|
return es.merge(
|
||||||
// other assets
|
// other assets
|
||||||
es.merge(
|
es.merge(
|
||||||
@@ -97,6 +212,17 @@ gulp.task('editor-distro', ['clean-editor-distro', 'minify-editor', 'optimize-ed
|
|||||||
gulp.src('src/vs/monaco.d.ts')
|
gulp.src('src/vs/monaco.d.ts')
|
||||||
).pipe(gulp.dest('out-monaco-editor-core')),
|
).pipe(gulp.dest('out-monaco-editor-core')),
|
||||||
|
|
||||||
|
// place the .d.ts in the esm folder
|
||||||
|
gulp.src('src/vs/monaco.d.ts')
|
||||||
|
.pipe(es.through(function (data) {
|
||||||
|
this.emit('data', new File({
|
||||||
|
path: data.path.replace(/monaco\.d\.ts/, 'editor.api.d.ts'),
|
||||||
|
base: data.base,
|
||||||
|
contents: Buffer.from(toExternalDTS(data.contents.toString()))
|
||||||
|
}));
|
||||||
|
}))
|
||||||
|
.pipe(gulp.dest('out-monaco-editor-core/esm/vs/editor')),
|
||||||
|
|
||||||
// package.json
|
// package.json
|
||||||
gulp.src('build/monaco/package.json')
|
gulp.src('build/monaco/package.json')
|
||||||
.pipe(es.through(function (data) {
|
.pipe(es.through(function (data) {
|
||||||
@@ -157,7 +283,7 @@ gulp.task('editor-distro', ['clean-editor-distro', 'minify-editor', 'optimize-ed
|
|||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('analyze-editor-distro', function () {
|
gulp.task('analyze-editor-distro', function () {
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
// @ts-ignore
|
||||||
var bundleInfo = require('../out-editor/bundleInfo.json');
|
var bundleInfo = require('../out-editor/bundleInfo.json');
|
||||||
var graph = bundleInfo.graph;
|
var graph = bundleInfo.graph;
|
||||||
var bundles = bundleInfo.bundles;
|
var bundles = bundleInfo.bundles;
|
||||||
@@ -208,3 +334,60 @@ function filterStream(testFunc) {
|
|||||||
this.emit('data', data);
|
this.emit('data', data);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
//#region monaco type checking
|
||||||
|
|
||||||
|
function createTscCompileTask(watch) {
|
||||||
|
return () => {
|
||||||
|
const createReporter = require('./lib/reporter').createReporter;
|
||||||
|
|
||||||
|
return new Promise((resolve, reject) => {
|
||||||
|
const args = ['./node_modules/.bin/tsc', '-p', './src/tsconfig.monaco.json', '--noEmit'];
|
||||||
|
if (watch) {
|
||||||
|
args.push('-w');
|
||||||
|
}
|
||||||
|
const child = cp.spawn(`node`, args, {
|
||||||
|
cwd: path.join(__dirname, '..'),
|
||||||
|
// stdio: [null, 'pipe', 'inherit']
|
||||||
|
});
|
||||||
|
let errors = [];
|
||||||
|
let reporter = createReporter();
|
||||||
|
let report;
|
||||||
|
let magic = /[\u001b\u009b][[()#;?]*(?:[0-9]{1,4}(?:;[0-9]{0,4})*)?[0-9A-ORZcf-nqry=><]/g; // https://stackoverflow.com/questions/25245716/remove-all-ansi-colors-styles-from-strings
|
||||||
|
|
||||||
|
child.stdout.on('data', data => {
|
||||||
|
let str = String(data);
|
||||||
|
str = str.replace(magic, '').trim();
|
||||||
|
if (str.indexOf('Starting compilation') >= 0 || str.indexOf('File change detected') >= 0) {
|
||||||
|
errors.length = 0;
|
||||||
|
report = reporter.end(false);
|
||||||
|
|
||||||
|
} else if (str.indexOf('Compilation complete') >= 0) {
|
||||||
|
report.end();
|
||||||
|
|
||||||
|
} else if (str) {
|
||||||
|
let match = /(.*\(\d+,\d+\): )(.*: )(.*)/.exec(str);
|
||||||
|
if (match) {
|
||||||
|
// trying to massage the message so that it matches the gulp-tsb error messages
|
||||||
|
// e.g. src/vs/base/common/strings.ts(663,5): error TS2322: Type '1234' is not assignable to type 'string'.
|
||||||
|
let fullpath = path.join(root, match[1]);
|
||||||
|
let message = match[3];
|
||||||
|
// @ts-ignore
|
||||||
|
reporter(fullpath + message);
|
||||||
|
} else {
|
||||||
|
// @ts-ignore
|
||||||
|
reporter(str);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
child.on('exit', resolve);
|
||||||
|
child.on('error', reject);
|
||||||
|
});
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
gulp.task('monaco-typecheck-watch', createTscCompileTask(true));
|
||||||
|
gulp.task('monaco-typecheck', createTscCompileTask(false));
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|||||||
@@ -20,7 +20,8 @@ const sourcemaps = require('gulp-sourcemaps');
|
|||||||
const nlsDev = require('vscode-nls-dev');
|
const nlsDev = require('vscode-nls-dev');
|
||||||
const root = path.dirname(__dirname);
|
const root = path.dirname(__dirname);
|
||||||
const commit = util.getVersion(root);
|
const commit = util.getVersion(root);
|
||||||
const i18n = require('./lib/i18n');
|
const plumber = require('gulp-plumber');
|
||||||
|
const _ = require('underscore');
|
||||||
|
|
||||||
const extensionsPath = path.join(path.dirname(__dirname), 'extensions');
|
const extensionsPath = path.join(path.dirname(__dirname), 'extensions');
|
||||||
|
|
||||||
@@ -31,13 +32,12 @@ const compilations = glob.sync('**/tsconfig.json', {
|
|||||||
|
|
||||||
const getBaseUrl = out => `https://ticino.blob.core.windows.net/sourcemaps/${commit}/${out}`;
|
const getBaseUrl = out => `https://ticino.blob.core.windows.net/sourcemaps/${commit}/${out}`;
|
||||||
|
|
||||||
const languages = i18n.defaultLanguages.concat(process.env.VSCODE_QUALITY !== 'stable' ? i18n.extraLanguages : []);
|
|
||||||
|
|
||||||
const tasks = compilations.map(function (tsconfigFile) {
|
const tasks = compilations.map(function (tsconfigFile) {
|
||||||
const absolutePath = path.join(extensionsPath, tsconfigFile);
|
const absolutePath = path.join(extensionsPath, tsconfigFile);
|
||||||
const relativeDirname = path.dirname(tsconfigFile);
|
const relativeDirname = path.dirname(tsconfigFile);
|
||||||
|
|
||||||
const tsOptions = require(absolutePath).compilerOptions;
|
const tsconfig = require(absolutePath);
|
||||||
|
const tsOptions = _.assign({}, tsconfig.extends ? require(path.join(extensionsPath, relativeDirname, tsconfig.extends)).compilerOptions : {}, tsconfig.compilerOptions);
|
||||||
tsOptions.verbose = false;
|
tsOptions.verbose = false;
|
||||||
tsOptions.sourceMap = true;
|
tsOptions.sourceMap = true;
|
||||||
|
|
||||||
@@ -57,7 +57,6 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
const srcBase = path.join(root, 'src');
|
const srcBase = path.join(root, 'src');
|
||||||
const src = path.join(srcBase, '**');
|
const src = path.join(srcBase, '**');
|
||||||
const out = path.join(root, 'out');
|
const out = path.join(root, 'out');
|
||||||
const i18nPath = path.join(__dirname, '..', 'i18n');
|
|
||||||
const baseUrl = getBaseUrl(out);
|
const baseUrl = getBaseUrl(out);
|
||||||
|
|
||||||
let headerId, headerOut;
|
let headerId, headerOut;
|
||||||
@@ -82,6 +81,13 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
const input = es.through();
|
const input = es.through();
|
||||||
const tsFilter = filter(['**/*.ts', '!**/lib/lib*.d.ts', '!**/node_modules/**'], { restore: true });
|
const tsFilter = filter(['**/*.ts', '!**/lib/lib*.d.ts', '!**/node_modules/**'], { restore: true });
|
||||||
const output = input
|
const output = input
|
||||||
|
.pipe(plumber({
|
||||||
|
errorHandler: function (err) {
|
||||||
|
if (err && !err.__reporter__) {
|
||||||
|
reporter(err);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}))
|
||||||
.pipe(tsFilter)
|
.pipe(tsFilter)
|
||||||
.pipe(util.loadSourcemaps())
|
.pipe(util.loadSourcemaps())
|
||||||
.pipe(compilation())
|
.pipe(compilation())
|
||||||
@@ -94,9 +100,9 @@ const tasks = compilations.map(function (tsconfigFile) {
|
|||||||
sourceRoot: '../src'
|
sourceRoot: '../src'
|
||||||
}))
|
}))
|
||||||
.pipe(tsFilter.restore)
|
.pipe(tsFilter.restore)
|
||||||
.pipe(build ? nlsDev.createAdditionalLanguageFiles(languages, i18nPath, out) : es.through())
|
|
||||||
.pipe(build ? nlsDev.bundleMetaDataFiles(headerId, headerOut) : es.through())
|
.pipe(build ? nlsDev.bundleMetaDataFiles(headerId, headerOut) : es.through())
|
||||||
.pipe(build ? nlsDev.bundleLanguageFiles() : es.through())
|
// Filter out *.nls.json file. We needed them only to bundle meta data file.
|
||||||
|
.pipe(filter(['**', '!**/*.nls.json']))
|
||||||
.pipe(reporter.end(emitError));
|
.pipe(reporter.end(emitError));
|
||||||
|
|
||||||
return es.duplex(input, output);
|
return es.duplex(input, output);
|
||||||
@@ -163,4 +169,4 @@ gulp.task('watch-extensions', tasks.map(t => t.watch));
|
|||||||
|
|
||||||
gulp.task('clean-extensions-build', tasks.map(t => t.cleanBuild));
|
gulp.task('clean-extensions-build', tasks.map(t => t.cleanBuild));
|
||||||
gulp.task('compile-extensions-build', tasks.map(t => t.compileBuild));
|
gulp.task('compile-extensions-build', tasks.map(t => t.compileBuild));
|
||||||
gulp.task('watch-extensions-build', tasks.map(t => t.watchBuild));
|
gulp.task('watch-extensions-build', tasks.map(t => t.watchBuild));
|
||||||
|
|||||||
@@ -43,13 +43,16 @@ const indentationFilter = [
|
|||||||
// except specific files
|
// except specific files
|
||||||
'!ThirdPartyNotices.txt',
|
'!ThirdPartyNotices.txt',
|
||||||
'!LICENSE.txt',
|
'!LICENSE.txt',
|
||||||
|
'!**/LICENSE',
|
||||||
'!src/vs/nls.js',
|
'!src/vs/nls.js',
|
||||||
|
'!src/vs/nls.build.js',
|
||||||
'!src/vs/css.js',
|
'!src/vs/css.js',
|
||||||
|
'!src/vs/css.build.js',
|
||||||
'!src/vs/loader.js',
|
'!src/vs/loader.js',
|
||||||
'!src/vs/base/common/marked/raw.marked.js',
|
'!src/vs/base/common/marked/marked.js',
|
||||||
'!src/vs/base/common/winjs.base.raw.js',
|
'!src/vs/base/common/winjs.base.js',
|
||||||
'!src/vs/base/node/terminateProcess.sh',
|
'!src/vs/base/node/terminateProcess.sh',
|
||||||
'!src/vs/base/node/ps-win.ps1',
|
'!src/vs/base/node/cpuUsage.sh',
|
||||||
'!test/assert.js',
|
'!test/assert.js',
|
||||||
|
|
||||||
// except specific folders
|
// except specific folders
|
||||||
@@ -62,6 +65,7 @@ const indentationFilter = [
|
|||||||
// except multiple specific files
|
// except multiple specific files
|
||||||
'!**/package.json',
|
'!**/package.json',
|
||||||
'!**/yarn.lock',
|
'!**/yarn.lock',
|
||||||
|
'!**/yarn-error.log',
|
||||||
|
|
||||||
// except multiple specific folders
|
// except multiple specific folders
|
||||||
'!**/octicons/**',
|
'!**/octicons/**',
|
||||||
@@ -77,12 +81,15 @@ const indentationFilter = [
|
|||||||
'!src/vs/*/**/*.d.ts',
|
'!src/vs/*/**/*.d.ts',
|
||||||
'!src/typings/**/*.d.ts',
|
'!src/typings/**/*.d.ts',
|
||||||
'!extensions/**/*.d.ts',
|
'!extensions/**/*.d.ts',
|
||||||
'!**/*.{svg,exe,png,bmp,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,template,yaml,yml,d.ts.recipe}',
|
'!**/*.{svg,exe,png,bmp,scpt,bat,cmd,cur,ttf,woff,eot,md,ps1,template,yaml,yml,d.ts.recipe,ico,icns}',
|
||||||
'!build/{lib,tslintRules}/**/*.js',
|
'!build/{lib,tslintRules}/**/*.js',
|
||||||
'!build/**/*.sh',
|
'!build/**/*.sh',
|
||||||
'!build/tfs/**/*.js',
|
'!build/azure-pipelines/**/*.js',
|
||||||
|
'!build/azure-pipelines/**/*.config',
|
||||||
'!**/Dockerfile',
|
'!**/Dockerfile',
|
||||||
'!extensions/markdown/media/*.js'
|
'!**/*.Dockerfile',
|
||||||
|
'!**/*.dockerfile',
|
||||||
|
'!extensions/markdown-language-features/media/*.js'
|
||||||
];
|
];
|
||||||
|
|
||||||
const copyrightFilter = [
|
const copyrightFilter = [
|
||||||
@@ -94,6 +101,8 @@ const copyrightFilter = [
|
|||||||
'!**/*.md',
|
'!**/*.md',
|
||||||
'!**/*.bat',
|
'!**/*.bat',
|
||||||
'!**/*.cmd',
|
'!**/*.cmd',
|
||||||
|
'!**/*.ico',
|
||||||
|
'!**/*.icns',
|
||||||
'!**/*.xml',
|
'!**/*.xml',
|
||||||
'!**/*.sh',
|
'!**/*.sh',
|
||||||
'!**/*.txt',
|
'!**/*.txt',
|
||||||
@@ -103,9 +112,11 @@ const copyrightFilter = [
|
|||||||
'!**/*.code-workspace',
|
'!**/*.code-workspace',
|
||||||
'!build/**/*.init',
|
'!build/**/*.init',
|
||||||
'!resources/linux/snap/snapcraft.yaml',
|
'!resources/linux/snap/snapcraft.yaml',
|
||||||
|
'!resources/linux/snap/electron-launch',
|
||||||
'!resources/win32/bin/code.js',
|
'!resources/win32/bin/code.js',
|
||||||
'!extensions/markdown/media/tomorrow.css',
|
'!extensions/markdown-language-features/media/highlight.css',
|
||||||
'!extensions/html/server/src/modes/typescript/*'
|
'!extensions/html-language-features/server/src/modes/typescript/*',
|
||||||
|
'!extensions/*/server/bin/*'
|
||||||
];
|
];
|
||||||
|
|
||||||
const eslintFilter = [
|
const eslintFilter = [
|
||||||
@@ -116,8 +127,8 @@ const eslintFilter = [
|
|||||||
'!src/vs/nls.js',
|
'!src/vs/nls.js',
|
||||||
'!src/vs/css.build.js',
|
'!src/vs/css.build.js',
|
||||||
'!src/vs/nls.build.js',
|
'!src/vs/nls.build.js',
|
||||||
'!src/**/winjs.base.raw.js',
|
'!src/**/winjs.base.js',
|
||||||
'!src/**/raw.marked.js',
|
'!src/**/marked.js',
|
||||||
'!**/test/**'
|
'!**/test/**'
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -132,15 +143,16 @@ const tslintFilter = [
|
|||||||
'!extensions/vscode-api-tests/testWorkspace/**',
|
'!extensions/vscode-api-tests/testWorkspace/**',
|
||||||
'!extensions/vscode-api-tests/testWorkspace2/**',
|
'!extensions/vscode-api-tests/testWorkspace2/**',
|
||||||
'!extensions/**/*.test.ts',
|
'!extensions/**/*.test.ts',
|
||||||
'!extensions/html/server/lib/jquery.d.ts'
|
'!extensions/html-language-features/server/lib/jquery.d.ts'
|
||||||
];
|
];
|
||||||
|
|
||||||
const copyrightHeader = [
|
// {{SQL CARBON EDIT}}
|
||||||
|
const copyrightHeaderLines = [
|
||||||
'/*---------------------------------------------------------------------------------------------',
|
'/*---------------------------------------------------------------------------------------------',
|
||||||
' * Copyright (c) Microsoft Corporation. All rights reserved.',
|
' * Copyright (c) Microsoft Corporation. All rights reserved.',
|
||||||
' * Licensed under the Source EULA. See License.txt in the project root for license information.',
|
' * Licensed under the Source EULA. See License.txt in the project root for license information.',
|
||||||
' *--------------------------------------------------------------------------------------------*/'
|
' *--------------------------------------------------------------------------------------------*/'
|
||||||
].join('\n');
|
];
|
||||||
|
|
||||||
gulp.task('eslint', () => {
|
gulp.task('eslint', () => {
|
||||||
return vfs.src(all, { base: '.', follow: true, allowEmpty: true })
|
return vfs.src(all, { base: '.', follow: true, allowEmpty: true })
|
||||||
@@ -202,12 +214,17 @@ function hygiene(some) {
|
|||||||
tsfmt.processString(file.path, file.contents.toString('utf8'), {
|
tsfmt.processString(file.path, file.contents.toString('utf8'), {
|
||||||
verify: false,
|
verify: false,
|
||||||
tsfmt: true,
|
tsfmt: true,
|
||||||
// verbose: true
|
// verbose: true,
|
||||||
// keep checkJS happy
|
// keep checkJS happy
|
||||||
editorconfig: undefined,
|
editorconfig: undefined,
|
||||||
replace: undefined,
|
replace: undefined,
|
||||||
tsconfig: undefined,
|
tsconfig: undefined,
|
||||||
tslint: undefined
|
tsconfigFile: undefined,
|
||||||
|
tslint: undefined,
|
||||||
|
tslintFile: undefined,
|
||||||
|
tsfmtFile: undefined,
|
||||||
|
vscode: undefined,
|
||||||
|
vscodeFile: undefined
|
||||||
}).then(result => {
|
}).then(result => {
|
||||||
let original = result.src.replace(/\r\n/gm, '\n');
|
let original = result.src.replace(/\r\n/gm, '\n');
|
||||||
let formatted = result.dest.replace(/\r\n/gm, '\n');
|
let formatted = result.dest.replace(/\r\n/gm, '\n');
|
||||||
|
|||||||
@@ -13,12 +13,10 @@ const es = require('event-stream');
|
|||||||
const util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
const remote = require('gulp-remote-src');
|
const remote = require('gulp-remote-src');
|
||||||
const zip = require('gulp-vinyl-zip');
|
const zip = require('gulp-vinyl-zip');
|
||||||
const assign = require('object-assign');
|
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const jeditor = require('gulp-json-editor');
|
const jeditor = require('gulp-json-editor');
|
||||||
|
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
|
||||||
const pkg = require('../package.json');
|
const pkg = require('../package.json');
|
||||||
|
|
||||||
gulp.task('mixin', function () {
|
gulp.task('mixin', function () {
|
||||||
@@ -52,4 +50,4 @@ gulp.task('mixin', function () {
|
|||||||
return gulp.src('./product.json')
|
return gulp.src('./product.json')
|
||||||
.pipe(jeditor(newValues))
|
.pipe(jeditor(newValues))
|
||||||
.pipe(gulp.dest('.'));
|
.pipe(gulp.dest('.'));
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -17,19 +17,15 @@ const vfs = require('vinyl-fs');
|
|||||||
const rename = require('gulp-rename');
|
const rename = require('gulp-rename');
|
||||||
const replace = require('gulp-replace');
|
const replace = require('gulp-replace');
|
||||||
const filter = require('gulp-filter');
|
const filter = require('gulp-filter');
|
||||||
const buffer = require('gulp-buffer');
|
|
||||||
const json = require('gulp-json-editor');
|
const json = require('gulp-json-editor');
|
||||||
const _ = require('underscore');
|
const _ = require('underscore');
|
||||||
const util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
const ext = require('./lib/extensions');
|
const ext = require('./lib/extensions');
|
||||||
const buildfile = require('../src/buildfile');
|
const buildfile = require('../src/buildfile');
|
||||||
const common = require('./lib/optimize');
|
const common = require('./lib/optimize');
|
||||||
const nlsDev = require('vscode-nls-dev');
|
|
||||||
const root = path.dirname(__dirname);
|
const root = path.dirname(__dirname);
|
||||||
const commit = util.getVersion(root);
|
const commit = util.getVersion(root);
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
|
||||||
const packageJson = require('../package.json');
|
const packageJson = require('../package.json');
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
|
||||||
const product = require('../product.json');
|
const product = require('../product.json');
|
||||||
const crypto = require('crypto');
|
const crypto = require('crypto');
|
||||||
const i18n = require('./lib/i18n');
|
const i18n = require('./lib/i18n');
|
||||||
@@ -37,16 +33,17 @@ const i18n = require('./lib/i18n');
|
|||||||
const serviceDownloader = require('service-downloader').ServiceDownloadProvider;
|
const serviceDownloader = require('service-downloader').ServiceDownloadProvider;
|
||||||
const platformInfo = require('service-downloader/out/platform').PlatformInformation;
|
const platformInfo = require('service-downloader/out/platform').PlatformInformation;
|
||||||
const glob = require('glob');
|
const glob = require('glob');
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
const deps = require('./dependencies');
|
const deps = require('./dependencies');
|
||||||
const getElectronVersion = require('./lib/electron').getElectronVersion;
|
const getElectronVersion = require('./lib/electron').getElectronVersion;
|
||||||
const createAsar = require('./lib/asar').createAsar;
|
const createAsar = require('./lib/asar').createAsar;
|
||||||
|
const minimist = require('minimist');
|
||||||
|
|
||||||
const productionDependencies = deps.getProductionDependencies(path.dirname(__dirname));
|
const productionDependencies = deps.getProductionDependencies(path.dirname(__dirname));
|
||||||
// @ts-ignore
|
// @ts-ignore
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
var del = require('del');
|
var del = require('del');
|
||||||
const extensionsRoot = path.join(root, 'extensions');
|
|
||||||
const extensionsProductionDependencies = deps.getProductionDependencies(extensionsRoot);
|
|
||||||
const baseModules = Object.keys(process.binding('natives')).filter(n => !/^_|\//.test(n));
|
const baseModules = Object.keys(process.binding('natives')).filter(n => !/^_|\//.test(n));
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const nodeModules = [
|
const nodeModules = [
|
||||||
@@ -60,27 +57,7 @@ const nodeModules = [
|
|||||||
.concat(_.uniq(productionDependencies.map(d => d.name)))
|
.concat(_.uniq(productionDependencies.map(d => d.name)))
|
||||||
.concat(baseModules);
|
.concat(baseModules);
|
||||||
|
|
||||||
|
|
||||||
// Build
|
// Build
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
|
||||||
const builtInExtensions = require('./builtInExtensions.json');
|
|
||||||
|
|
||||||
const excludedExtensions = [
|
|
||||||
'vscode-api-tests',
|
|
||||||
'vscode-colorize-tests',
|
|
||||||
'ms-vscode.node-debug',
|
|
||||||
'ms-vscode.node-debug2',
|
|
||||||
];
|
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
const vsce = require('vsce');
|
|
||||||
const sqlBuiltInExtensions = [
|
|
||||||
// Add SQL built-in extensions here.
|
|
||||||
// the extension will be excluded from SQLOps package and will have separate vsix packages
|
|
||||||
'agent',
|
|
||||||
'profiler'
|
|
||||||
];
|
|
||||||
|
|
||||||
const vscodeEntryPoints = _.flatten([
|
const vscodeEntryPoints = _.flatten([
|
||||||
buildfile.entrypoint('vs/workbench/workbench.main'),
|
buildfile.entrypoint('vs/workbench/workbench.main'),
|
||||||
buildfile.base,
|
buildfile.base,
|
||||||
@@ -91,26 +68,29 @@ const vscodeEntryPoints = _.flatten([
|
|||||||
const vscodeResources = [
|
const vscodeResources = [
|
||||||
'out-build/main.js',
|
'out-build/main.js',
|
||||||
'out-build/cli.js',
|
'out-build/cli.js',
|
||||||
|
'out-build/driver.js',
|
||||||
'out-build/bootstrap.js',
|
'out-build/bootstrap.js',
|
||||||
|
'out-build/bootstrap-fork.js',
|
||||||
'out-build/bootstrap-amd.js',
|
'out-build/bootstrap-amd.js',
|
||||||
|
'out-build/bootstrap-window.js',
|
||||||
'out-build/paths.js',
|
'out-build/paths.js',
|
||||||
'out-build/vs/**/*.{svg,png,cur,html}',
|
'out-build/vs/**/*.{svg,png,cur,html}',
|
||||||
'out-build/vs/base/common/performance.js',
|
'out-build/vs/base/common/performance.js',
|
||||||
'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,ps-win.ps1}',
|
'out-build/vs/base/node/{stdForkStart.js,terminateProcess.sh,cpuUsage.sh}',
|
||||||
'out-build/vs/base/browser/ui/octiconLabel/octicons/**',
|
'out-build/vs/base/browser/ui/octiconLabel/octicons/**',
|
||||||
'out-build/vs/workbench/browser/media/*-theme.css',
|
'out-build/vs/workbench/browser/media/*-theme.css',
|
||||||
'out-build/vs/workbench/electron-browser/bootstrap/**',
|
|
||||||
'out-build/vs/workbench/parts/debug/**/*.json',
|
'out-build/vs/workbench/parts/debug/**/*.json',
|
||||||
'out-build/vs/workbench/parts/execution/**/*.scpt',
|
'out-build/vs/workbench/parts/execution/**/*.scpt',
|
||||||
'out-build/vs/workbench/parts/html/browser/webview-pre.js',
|
'out-build/vs/workbench/parts/webview/electron-browser/webview-pre.js',
|
||||||
'out-build/vs/**/markdown.css',
|
'out-build/vs/**/markdown.css',
|
||||||
'out-build/vs/workbench/parts/tasks/**/*.json',
|
'out-build/vs/workbench/parts/tasks/**/*.json',
|
||||||
'out-build/vs/workbench/parts/terminal/electron-browser/terminalProcess.js',
|
|
||||||
'out-build/vs/workbench/parts/welcome/walkThrough/**/*.md',
|
'out-build/vs/workbench/parts/welcome/walkThrough/**/*.md',
|
||||||
'out-build/vs/workbench/services/files/**/*.exe',
|
'out-build/vs/workbench/services/files/**/*.exe',
|
||||||
'out-build/vs/workbench/services/files/**/*.md',
|
'out-build/vs/workbench/services/files/**/*.md',
|
||||||
|
'out-build/vs/code/electron-browser/workbench/**',
|
||||||
'out-build/vs/code/electron-browser/sharedProcess/sharedProcess.js',
|
'out-build/vs/code/electron-browser/sharedProcess/sharedProcess.js',
|
||||||
'out-build/vs/code/electron-browser/issue/issueReporter.js',
|
'out-build/vs/code/electron-browser/issue/issueReporter.js',
|
||||||
|
'out-build/vs/code/electron-browser/processExplorer/processExplorer.js',
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
'out-build/sql/workbench/electron-browser/splashscreen/*',
|
'out-build/sql/workbench/electron-browser/splashscreen/*',
|
||||||
'out-build/sql/**/*.{svg,png,cur,html}',
|
'out-build/sql/**/*.{svg,png,cur,html}',
|
||||||
@@ -131,6 +111,7 @@ const vscodeResources = [
|
|||||||
'out-build/sql/parts/jobManagement/common/media/*.svg',
|
'out-build/sql/parts/jobManagement/common/media/*.svg',
|
||||||
'out-build/sql/media/objectTypes/*.svg',
|
'out-build/sql/media/objectTypes/*.svg',
|
||||||
'out-build/sql/media/icons/*.svg',
|
'out-build/sql/media/icons/*.svg',
|
||||||
|
'out-build/sql/parts/notebook/media/**/*.svg',
|
||||||
'!**/test/**'
|
'!**/test/**'
|
||||||
];
|
];
|
||||||
|
|
||||||
@@ -140,35 +121,45 @@ const BUNDLED_FILE_HEADER = [
|
|||||||
' *--------------------------------------------------------*/'
|
' *--------------------------------------------------------*/'
|
||||||
].join('\n');
|
].join('\n');
|
||||||
|
|
||||||
const languages = i18n.defaultLanguages.concat([]); // i18n.defaultLanguages.concat(process.env.VSCODE_QUALITY !== 'stable' ? i18n.extraLanguages : []);
|
|
||||||
|
|
||||||
gulp.task('clean-optimized-vscode', util.rimraf('out-vscode'));
|
gulp.task('clean-optimized-vscode', util.rimraf('out-vscode'));
|
||||||
gulp.task('optimize-vscode', ['clean-optimized-vscode', 'compile-build', 'compile-extensions-build'], common.optimizeTask({
|
gulp.task('optimize-vscode', ['clean-optimized-vscode', 'compile-build', 'compile-extensions-build'], common.optimizeTask({
|
||||||
|
src: 'out-build',
|
||||||
entryPoints: vscodeEntryPoints,
|
entryPoints: vscodeEntryPoints,
|
||||||
otherSources: [],
|
otherSources: [],
|
||||||
resources: vscodeResources,
|
resources: vscodeResources,
|
||||||
loaderConfig: common.loaderConfig(nodeModules),
|
loaderConfig: common.loaderConfig(nodeModules),
|
||||||
header: BUNDLED_FILE_HEADER,
|
header: BUNDLED_FILE_HEADER,
|
||||||
out: 'out-vscode',
|
out: 'out-vscode',
|
||||||
languages: languages,
|
|
||||||
bundleInfo: undefined
|
bundleInfo: undefined
|
||||||
}));
|
}));
|
||||||
|
|
||||||
|
|
||||||
gulp.task('optimize-index-js', ['optimize-vscode'], () => {
|
gulp.task('optimize-index-js', ['optimize-vscode'], () => {
|
||||||
const fullpath = path.join(process.cwd(), 'out-vscode/vs/workbench/electron-browser/bootstrap/index.js');
|
const fullpath = path.join(process.cwd(), 'out-vscode/vs/code/electron-browser/workbench/workbench.js');
|
||||||
const contents = fs.readFileSync(fullpath).toString();
|
const contents = fs.readFileSync(fullpath).toString();
|
||||||
const newContents = contents.replace('[/*BUILD->INSERT_NODE_MODULES*/]', JSON.stringify(nodeModules));
|
const newContents = contents.replace('[/*BUILD->INSERT_NODE_MODULES*/]', JSON.stringify(nodeModules));
|
||||||
fs.writeFileSync(fullpath, newContents);
|
fs.writeFileSync(fullpath, newContents);
|
||||||
});
|
});
|
||||||
|
|
||||||
const baseUrl = `https://ticino.blob.core.windows.net/sourcemaps/${commit}/core`;
|
const sourceMappingURLBase = `https://ticino.blob.core.windows.net/sourcemaps/${commit}`;
|
||||||
gulp.task('clean-minified-vscode', util.rimraf('out-vscode-min'));
|
gulp.task('clean-minified-vscode', util.rimraf('out-vscode-min'));
|
||||||
gulp.task('minify-vscode', ['clean-minified-vscode', 'optimize-index-js'], common.minifyTask('out-vscode', baseUrl));
|
gulp.task('minify-vscode', ['clean-minified-vscode', 'optimize-index-js'], common.minifyTask('out-vscode', `${sourceMappingURLBase}/core`));
|
||||||
|
|
||||||
// Package
|
// Package
|
||||||
|
|
||||||
|
// @ts-ignore JSON checking: darwinCredits is optional
|
||||||
const darwinCreditsTemplate = product.darwinCredits && _.template(fs.readFileSync(path.join(root, product.darwinCredits), 'utf8'));
|
const darwinCreditsTemplate = product.darwinCredits && _.template(fs.readFileSync(path.join(root, product.darwinCredits), 'utf8'));
|
||||||
|
|
||||||
|
function darwinBundleDocumentType(extensions, icon) {
|
||||||
|
return {
|
||||||
|
name: product.nameLong + ' document',
|
||||||
|
role: 'Editor',
|
||||||
|
ostypes: ["TEXT", "utxt", "TUTX", "****"],
|
||||||
|
extensions: extensions,
|
||||||
|
iconFile: icon
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
const config = {
|
const config = {
|
||||||
version: getElectronVersion(),
|
version: getElectronVersion(),
|
||||||
productAppName: product.nameLong,
|
productAppName: product.nameLong,
|
||||||
@@ -179,23 +170,22 @@ const config = {
|
|||||||
darwinApplicationCategoryType: 'public.app-category.developer-tools',
|
darwinApplicationCategoryType: 'public.app-category.developer-tools',
|
||||||
darwinHelpBookFolder: 'VS Code HelpBook',
|
darwinHelpBookFolder: 'VS Code HelpBook',
|
||||||
darwinHelpBookName: 'VS Code HelpBook',
|
darwinHelpBookName: 'VS Code HelpBook',
|
||||||
darwinBundleDocumentTypes: [{
|
darwinBundleDocumentTypes: [
|
||||||
name: product.nameLong + ' document',
|
// {{SQL CARBON EDIT}} - Remove most document types and replace with ours
|
||||||
role: 'Editor',
|
darwinBundleDocumentType(["csv", "json", "sqlplan", "sql", "xml"], 'resources/darwin/code_file.icns'),
|
||||||
ostypes: ["TEXT", "utxt", "TUTX", "****"],
|
],
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
extensions: ["csv", "json", "sqlplan", "sql", "xml"],
|
|
||||||
iconFile: 'resources/darwin/code_file.icns'
|
|
||||||
}],
|
|
||||||
darwinBundleURLTypes: [{
|
darwinBundleURLTypes: [{
|
||||||
role: 'Viewer',
|
role: 'Viewer',
|
||||||
name: product.nameLong,
|
name: product.nameLong,
|
||||||
urlSchemes: [product.urlProtocol]
|
urlSchemes: [product.urlProtocol]
|
||||||
}],
|
}],
|
||||||
|
darwinForceDarkModeSupport: true,
|
||||||
darwinCredits: darwinCreditsTemplate ? Buffer.from(darwinCreditsTemplate({ commit: commit, date: new Date().toISOString() })) : void 0,
|
darwinCredits: darwinCreditsTemplate ? Buffer.from(darwinCreditsTemplate({ commit: commit, date: new Date().toISOString() })) : void 0,
|
||||||
linuxExecutableName: product.applicationName,
|
linuxExecutableName: product.applicationName,
|
||||||
winIcon: 'resources/win32/code.ico',
|
winIcon: 'resources/win32/code.ico',
|
||||||
token: process.env['VSCODE_MIXIN_PASSWORD'] || process.env['GITHUB_TOKEN'] || void 0,
|
token: process.env['VSCODE_MIXIN_PASSWORD'] || process.env['GITHUB_TOKEN'] || void 0,
|
||||||
|
|
||||||
|
// @ts-ignore JSON checking: electronRepository is optional
|
||||||
repo: product.electronRepository || void 0
|
repo: product.electronRepository || void 0
|
||||||
};
|
};
|
||||||
|
|
||||||
@@ -220,6 +210,8 @@ gulp.task('clean-electron', util.rimraf('.build/electron'));
|
|||||||
gulp.task('electron', ['clean-electron'], getElectron(process.arch));
|
gulp.task('electron', ['clean-electron'], getElectron(process.arch));
|
||||||
gulp.task('electron-ia32', ['clean-electron'], getElectron('ia32'));
|
gulp.task('electron-ia32', ['clean-electron'], getElectron('ia32'));
|
||||||
gulp.task('electron-x64', ['clean-electron'], getElectron('x64'));
|
gulp.task('electron-x64', ['clean-electron'], getElectron('x64'));
|
||||||
|
gulp.task('electron-arm', ['clean-electron'], getElectron('arm'));
|
||||||
|
gulp.task('electron-arm64', ['clean-electron'], getElectron('arm64'));
|
||||||
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@@ -256,31 +248,11 @@ function computeChecksum(filename) {
|
|||||||
return hash;
|
return hash;
|
||||||
}
|
}
|
||||||
|
|
||||||
function packageBuiltInExtensions() {
|
|
||||||
const sqlBuiltInLocalExtensionDescriptions = glob.sync('extensions/*/package.json')
|
|
||||||
.map(manifestPath => {
|
|
||||||
const extensionPath = path.dirname(path.join(root, manifestPath));
|
|
||||||
const extensionName = path.basename(extensionPath);
|
|
||||||
return { name: extensionName, path: extensionPath };
|
|
||||||
})
|
|
||||||
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
|
||||||
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
|
||||||
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) >= 0);
|
|
||||||
sqlBuiltInLocalExtensionDescriptions.forEach(element => {
|
|
||||||
const packagePath = path.join(path.dirname(root), element.name + '.vsix');
|
|
||||||
console.info('Creating vsix for ' + element.path + ' result:' + packagePath);
|
|
||||||
vsce.createVSIX({
|
|
||||||
cwd: element.path,
|
|
||||||
packagePath: packagePath
|
|
||||||
});
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
function packageTask(platform, arch, opts) {
|
function packageTask(platform, arch, opts) {
|
||||||
opts = opts || {};
|
opts = opts || {};
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const destination = path.join(path.dirname(root), 'sqlops') + (platform ? '-' + platform : '') + (arch ? '-' + arch : '');
|
const destination = path.join(path.dirname(root), 'azuredatastudio') + (platform ? '-' + platform : '') + (arch ? '-' + arch : '');
|
||||||
platform = platform || process.platform;
|
platform = platform || process.platform;
|
||||||
|
|
||||||
return () => {
|
return () => {
|
||||||
@@ -289,69 +261,53 @@ function packageTask(platform, arch, opts) {
|
|||||||
const checksums = computeChecksums(out, [
|
const checksums = computeChecksums(out, [
|
||||||
'vs/workbench/workbench.main.js',
|
'vs/workbench/workbench.main.js',
|
||||||
'vs/workbench/workbench.main.css',
|
'vs/workbench/workbench.main.css',
|
||||||
'vs/workbench/electron-browser/bootstrap/index.html',
|
'vs/code/electron-browser/workbench/workbench.html',
|
||||||
'vs/workbench/electron-browser/bootstrap/index.js',
|
'vs/code/electron-browser/workbench/workbench.js'
|
||||||
'vs/workbench/electron-browser/bootstrap/preload.js'
|
|
||||||
]);
|
]);
|
||||||
|
|
||||||
const src = gulp.src(out + '/**', { base: '.' })
|
const src = gulp.src(out + '/**', { base: '.' })
|
||||||
.pipe(rename(function (path) { path.dirname = path.dirname.replace(new RegExp('^' + out), 'out'); }));
|
.pipe(rename(function (path) { path.dirname = path.dirname.replace(new RegExp('^' + out), 'out'); }))
|
||||||
|
|
||||||
const root = path.resolve(path.join(__dirname, '..'));
|
|
||||||
const localExtensionDescriptions = glob.sync('extensions/*/package.json')
|
|
||||||
.map(manifestPath => {
|
|
||||||
const extensionPath = path.dirname(path.join(root, manifestPath));
|
|
||||||
const extensionName = path.basename(extensionPath);
|
|
||||||
return { name: extensionName, path: extensionPath };
|
|
||||||
})
|
|
||||||
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
|
||||||
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) === -1);
|
|
||||||
packageBuiltInExtensions();
|
|
||||||
|
|
||||||
const localExtensions = es.merge(...localExtensionDescriptions.map(extension => {
|
|
||||||
const nlsFilter = filter('**/*.nls.json', { restore: true });
|
|
||||||
|
|
||||||
return ext.fromLocal(extension.path)
|
|
||||||
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`))
|
|
||||||
// // TODO@Dirk: this filter / buffer is here to make sure the nls.json files are buffered
|
|
||||||
.pipe(nlsFilter)
|
|
||||||
.pipe(buffer())
|
|
||||||
.pipe(nlsDev.createAdditionalLanguageFiles(languages, path.join(__dirname, '..', 'i18n')))
|
|
||||||
.pipe(nlsFilter.restore);
|
|
||||||
}));
|
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
const extensionDepsSrc = [
|
|
||||||
..._.flatten(extensionsProductionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])),
|
|
||||||
];
|
|
||||||
|
|
||||||
const localExtensionDependencies = gulp.src(extensionDepsSrc, { base: '.', dot: true })
|
|
||||||
.pipe(filter(['**', '!**/package-lock.json']))
|
|
||||||
.pipe(util.cleanNodeModule('account-provider-azure', ['node_modules/date-utils/doc/**', 'node_modules/adal_node/node_modules/**'], undefined))
|
|
||||||
.pipe(util.cleanNodeModule('typescript', ['**/**'], undefined));
|
|
||||||
|
|
||||||
|
|
||||||
const sources = es.merge(src, localExtensions, localExtensionDependencies)
|
|
||||||
.pipe(util.setExecutableBit(['**/*.sh']))
|
.pipe(util.setExecutableBit(['**/*.sh']))
|
||||||
.pipe(filter(['**', '!**/*.js.map']));
|
.pipe(filter(['**', '!**/*.js.map']));
|
||||||
|
|
||||||
|
const root = path.resolve(path.join(__dirname, '..'));
|
||||||
|
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
ext.packageBuiltInExtensions();
|
||||||
|
|
||||||
|
const sources = es.merge(src, ext.packageExtensionsStream({
|
||||||
|
sourceMappingURLBase: sourceMappingURLBase
|
||||||
|
}));
|
||||||
|
|
||||||
let version = packageJson.version;
|
let version = packageJson.version;
|
||||||
|
// @ts-ignore JSON checking: quality is optional
|
||||||
const quality = product.quality;
|
const quality = product.quality;
|
||||||
|
|
||||||
if (quality && quality !== 'stable') {
|
if (quality && quality !== 'stable') {
|
||||||
version += '-' + quality;
|
version += '-' + quality;
|
||||||
}
|
}
|
||||||
|
|
||||||
const name = product.nameShort;
|
// {{SQL CARBON EDIT}}
|
||||||
const packageJsonStream = gulp.src(['package.json'], { base: '.' })
|
const name = (platform === 'darwin') ? 'Azure Data Studio' : product.nameShort;
|
||||||
.pipe(json({ name, version }));
|
const packageJsonUpdates = { name, version };
|
||||||
|
|
||||||
|
// for linux url handling
|
||||||
|
if (platform === 'linux') {
|
||||||
|
packageJsonUpdates.desktopName = `${product.applicationName}-url-handler.desktop`;
|
||||||
|
}
|
||||||
|
|
||||||
|
const packageJsonStream = gulp.src(['package.json'], { base: '.' })
|
||||||
|
.pipe(json(packageJsonUpdates));
|
||||||
|
|
||||||
const settingsSearchBuildId = getBuildNumber();
|
|
||||||
const date = new Date().toISOString();
|
const date = new Date().toISOString();
|
||||||
|
const productJsonUpdate = { commit, date, checksums };
|
||||||
|
|
||||||
|
if (shouldSetupSettingsSearch()) {
|
||||||
|
productJsonUpdate.settingsSearchBuildId = getSettingsSearchBuildId(packageJson);
|
||||||
|
}
|
||||||
|
|
||||||
const productJsonStream = gulp.src(['product.json'], { base: '.' })
|
const productJsonStream = gulp.src(['product.json'], { base: '.' })
|
||||||
.pipe(json({ commit, date, checksums, settingsSearchBuildId }));
|
.pipe(json(productJsonUpdate));
|
||||||
|
|
||||||
const license = gulp.src(['LICENSES.chromium.html', 'LICENSE.txt', 'ThirdPartyNotices.txt', 'licenses/**'], { base: '.' });
|
const license = gulp.src(['LICENSES.chromium.html', 'LICENSE.txt', 'ThirdPartyNotices.txt', 'licenses/**'], { base: '.' });
|
||||||
|
|
||||||
@@ -359,27 +315,29 @@ function packageTask(platform, arch, opts) {
|
|||||||
|
|
||||||
// TODO the API should be copied to `out` during compile, not here
|
// TODO the API should be copied to `out` during compile, not here
|
||||||
const api = gulp.src('src/vs/vscode.d.ts').pipe(rename('out/vs/vscode.d.ts'));
|
const api = gulp.src('src/vs/vscode.d.ts').pipe(rename('out/vs/vscode.d.ts'));
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const dataApi = gulp.src('src/vs/data.d.ts').pipe(rename('out/sql/data.d.ts'));
|
const dataApi = gulp.src('src/vs/data.d.ts').pipe(rename('out/sql/data.d.ts'));
|
||||||
|
|
||||||
const depsSrc = [
|
const depsSrc = [
|
||||||
..._.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])),
|
..._.flatten(productionDependencies.map(d => path.relative(root, d.path)).map(d => [`${d}/**`, `!${d}/**/{test,tests}/**`])),
|
||||||
|
// @ts-ignore JSON checking: dependencies is optional
|
||||||
..._.flatten(Object.keys(product.dependencies || {}).map(d => [`node_modules/${d}/**`, `!node_modules/${d}/**/{test,tests}/**`]))
|
..._.flatten(Object.keys(product.dependencies || {}).map(d => [`node_modules/${d}/**`, `!node_modules/${d}/**/{test,tests}/**`]))
|
||||||
];
|
];
|
||||||
|
|
||||||
const deps = gulp.src(depsSrc, { base: '.', dot: true })
|
const deps = gulp.src(depsSrc, { base: '.', dot: true })
|
||||||
.pipe(filter(['**', '!**/package-lock.json']))
|
.pipe(filter(['**', '!**/package-lock.json']))
|
||||||
.pipe(util.cleanNodeModule('fsevents', ['binding.gyp', 'fsevents.cc', 'build/**', 'src/**', 'test/**'], ['**/*.node']))
|
.pipe(util.cleanNodeModule('fsevents', ['binding.gyp', 'fsevents.cc', 'build/**', 'src/**', 'test/**'], ['**/*.node']))
|
||||||
.pipe(util.cleanNodeModule('oniguruma', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/*.js']))
|
.pipe(util.cleanNodeModule('vscode-sqlite3', ['binding.gyp', 'benchmark/**', 'cloudformation/**', 'deps/**', 'test/**', 'build/**', 'src/**'], ['build/Release/*.node']))
|
||||||
|
.pipe(util.cleanNodeModule('oniguruma', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['build/Release/*.node', 'src/*.js']))
|
||||||
.pipe(util.cleanNodeModule('windows-mutex', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
|
.pipe(util.cleanNodeModule('windows-mutex', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
|
||||||
.pipe(util.cleanNodeModule('native-keymap', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node']))
|
.pipe(util.cleanNodeModule('native-keymap', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['build/Release/*.node']))
|
||||||
.pipe(util.cleanNodeModule('native-is-elevated', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node']))
|
.pipe(util.cleanNodeModule('native-is-elevated', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['build/Release/*.node']))
|
||||||
.pipe(util.cleanNodeModule('native-watchdog', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
|
.pipe(util.cleanNodeModule('native-watchdog', ['binding.gyp', 'build/**', 'src/**'], ['build/Release/*.node']))
|
||||||
.pipe(util.cleanNodeModule('spdlog', ['binding.gyp', 'build/**', 'deps/**', 'src/**', 'test/**'], ['**/*.node']))
|
.pipe(util.cleanNodeModule('spdlog', ['binding.gyp', 'build/**', 'deps/**', 'src/**', 'test/**'], ['build/Release/*.node']))
|
||||||
.pipe(util.cleanNodeModule('jschardet', ['dist/**']))
|
.pipe(util.cleanNodeModule('jschardet', ['dist/**']))
|
||||||
.pipe(util.cleanNodeModule('windows-foreground-love', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
|
.pipe(util.cleanNodeModule('windows-foreground-love', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
|
||||||
.pipe(util.cleanNodeModule('windows-process-tree', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
|
.pipe(util.cleanNodeModule('windows-process-tree', ['binding.gyp', 'build/**', 'src/**'], ['**/*.node']))
|
||||||
.pipe(util.cleanNodeModule('gc-signals', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['**/*.node', 'src/index.js']))
|
.pipe(util.cleanNodeModule('gc-signals', ['binding.gyp', 'build/**', 'src/**', 'deps/**'], ['build/Release/*.node', 'src/index.js']))
|
||||||
.pipe(util.cleanNodeModule('keytar', ['binding.gyp', 'build/**', 'src/**', 'script/**', 'node_modules/**'], ['**/*.node']))
|
.pipe(util.cleanNodeModule('keytar', ['binding.gyp', 'build/**', 'src/**', 'script/**', 'node_modules/**'], ['**/*.node']))
|
||||||
.pipe(util.cleanNodeModule('node-pty', ['binding.gyp', 'build/**', 'src/**', 'tools/**'], ['build/Release/*.exe', 'build/Release/*.dll', 'build/Release/*.node']))
|
.pipe(util.cleanNodeModule('node-pty', ['binding.gyp', 'build/**', 'src/**', 'tools/**'], ['build/Release/*.exe', 'build/Release/*.dll', 'build/Release/*.node']))
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
@@ -390,6 +348,8 @@ function packageTask(platform, arch, opts) {
|
|||||||
.pipe(util.cleanNodeModule('core-js', ['**/**'], undefined))
|
.pipe(util.cleanNodeModule('core-js', ['**/**'], undefined))
|
||||||
.pipe(util.cleanNodeModule('slickgrid', ['node_modules/**', 'examples/**'], undefined))
|
.pipe(util.cleanNodeModule('slickgrid', ['node_modules/**', 'examples/**'], undefined))
|
||||||
.pipe(util.cleanNodeModule('nsfw', ['binding.gyp', 'build/**', 'src/**', 'openpa/**', 'includes/**'], ['**/*.node', '**/*.a']))
|
.pipe(util.cleanNodeModule('nsfw', ['binding.gyp', 'build/**', 'src/**', 'openpa/**', 'includes/**'], ['**/*.node', '**/*.a']))
|
||||||
|
.pipe(util.cleanNodeModule('vscode-nsfw', ['binding.gyp', 'build/**', 'src/**', 'openpa/**', 'includes/**'], ['**/*.node', '**/*.a']))
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
.pipe(util.cleanNodeModule('vsda', ['binding.gyp', 'README.md', 'build/**', '*.bat', '*.sh', '*.cpp', '*.h'], ['build/Release/vsda.node']))
|
.pipe(util.cleanNodeModule('vsda', ['binding.gyp', 'README.md', 'build/**', '*.bat', '*.sh', '*.cpp', '*.h'], ['build/Release/vsda.node']))
|
||||||
.pipe(createAsar(path.join(process.cwd(), 'node_modules'), ['**/*.node', '**/vscode-ripgrep/bin/*', '**/node-pty/build/Release/*'], 'app/node_modules.asar'));
|
.pipe(createAsar(path.join(process.cwd(), 'node_modules'), ['**/*.node', '**/vscode-ripgrep/bin/*', '**/node-pty/build/Release/*'], 'app/node_modules.asar'));
|
||||||
|
|
||||||
@@ -400,7 +360,7 @@ function packageTask(platform, arch, opts) {
|
|||||||
'node_modules/slickgrid/**/*.*',
|
'node_modules/slickgrid/**/*.*',
|
||||||
'node_modules/underscore/**/*.*',
|
'node_modules/underscore/**/*.*',
|
||||||
'node_modules/zone.js/**/*.*',
|
'node_modules/zone.js/**/*.*',
|
||||||
'node_modules/chart.js/**/*.*'
|
'node_modules/chart.js/**/*.*',
|
||||||
], { base: '.', dot: true });
|
], { base: '.', dot: true });
|
||||||
|
|
||||||
let all = es.merge(
|
let all = es.merge(
|
||||||
@@ -409,7 +369,7 @@ function packageTask(platform, arch, opts) {
|
|||||||
license,
|
license,
|
||||||
watermark,
|
watermark,
|
||||||
api,
|
api,
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
copiedModules,
|
copiedModules,
|
||||||
dataApi,
|
dataApi,
|
||||||
sources,
|
sources,
|
||||||
@@ -417,7 +377,37 @@ function packageTask(platform, arch, opts) {
|
|||||||
);
|
);
|
||||||
|
|
||||||
if (platform === 'win32') {
|
if (platform === 'win32') {
|
||||||
all = es.merge(all, gulp.src(['resources/win32/code_file.ico', 'resources/win32/code_70x70.png', 'resources/win32/code_150x150.png'], { base: '.' }));
|
all = es.merge(all, gulp.src([
|
||||||
|
'resources/win32/bower.ico',
|
||||||
|
'resources/win32/c.ico',
|
||||||
|
'resources/win32/config.ico',
|
||||||
|
'resources/win32/cpp.ico',
|
||||||
|
'resources/win32/csharp.ico',
|
||||||
|
'resources/win32/css.ico',
|
||||||
|
'resources/win32/default.ico',
|
||||||
|
'resources/win32/go.ico',
|
||||||
|
'resources/win32/html.ico',
|
||||||
|
'resources/win32/jade.ico',
|
||||||
|
'resources/win32/java.ico',
|
||||||
|
'resources/win32/javascript.ico',
|
||||||
|
'resources/win32/json.ico',
|
||||||
|
'resources/win32/less.ico',
|
||||||
|
'resources/win32/markdown.ico',
|
||||||
|
'resources/win32/php.ico',
|
||||||
|
'resources/win32/powershell.ico',
|
||||||
|
'resources/win32/python.ico',
|
||||||
|
'resources/win32/react.ico',
|
||||||
|
'resources/win32/ruby.ico',
|
||||||
|
'resources/win32/sass.ico',
|
||||||
|
'resources/win32/shell.ico',
|
||||||
|
'resources/win32/sql.ico',
|
||||||
|
'resources/win32/typescript.ico',
|
||||||
|
'resources/win32/vue.ico',
|
||||||
|
'resources/win32/xml.ico',
|
||||||
|
'resources/win32/yaml.ico',
|
||||||
|
'resources/win32/code_70x70.png',
|
||||||
|
'resources/win32/code_150x150.png'
|
||||||
|
], { base: '.' }));
|
||||||
} else if (platform === 'linux') {
|
} else if (platform === 'linux') {
|
||||||
all = es.merge(all, gulp.src('resources/linux/code.png', { base: '.' }));
|
all = es.merge(all, gulp.src('resources/linux/code.png', { base: '.' }));
|
||||||
} else if (platform === 'darwin') {
|
} else if (platform === 'darwin') {
|
||||||
@@ -442,6 +432,8 @@ function packageTask(platform, arch, opts) {
|
|||||||
|
|
||||||
result = es.merge(result, gulp.src('resources/win32/bin/code.sh', { base: 'resources/win32' })
|
result = es.merge(result, gulp.src('resources/win32/bin/code.sh', { base: 'resources/win32' })
|
||||||
.pipe(replace('@@NAME@@', product.nameShort))
|
.pipe(replace('@@NAME@@', product.nameShort))
|
||||||
|
.pipe(replace('@@COMMIT@@', commit))
|
||||||
|
.pipe(replace('@@APPNAME@@', product.applicationName))
|
||||||
.pipe(rename(function (f) { f.basename = product.applicationName; f.extname = ''; })));
|
.pipe(rename(function (f) { f.basename = product.applicationName; f.extname = ''; })));
|
||||||
|
|
||||||
result = es.merge(result, gulp.src('resources/win32/VisualElementsManifest.xml', { base: 'resources/win32' })
|
result = es.merge(result, gulp.src('resources/win32/VisualElementsManifest.xml', { base: 'resources/win32' })
|
||||||
@@ -452,6 +444,15 @@ function packageTask(platform, arch, opts) {
|
|||||||
.pipe(rename('bin/' + product.applicationName)));
|
.pipe(rename('bin/' + product.applicationName)));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// submit all stats that have been collected
|
||||||
|
// during the build phase
|
||||||
|
if (opts.stats) {
|
||||||
|
result.on('end', () => {
|
||||||
|
const { submitAllStats } = require('./lib/stats');
|
||||||
|
submitAllStats(product, commit).then(() => console.log('Submitted bundle stats!'));
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
return result.pipe(vfs.dest(destination));
|
return result.pipe(vfs.dest(destination));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -459,26 +460,37 @@ function packageTask(platform, arch, opts) {
|
|||||||
const buildRoot = path.dirname(root);
|
const buildRoot = path.dirname(root);
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
gulp.task('clean-vscode-win32-ia32', util.rimraf(path.join(buildRoot, 'sqlops-win32-ia32')));
|
gulp.task('vscode-win32-x64-azurecore', ['optimize-vscode'], ext.packageExtensionTask('azurecore', 'win32', 'x64'));
|
||||||
gulp.task('clean-vscode-win32-x64', util.rimraf(path.join(buildRoot, 'sqlops-win32-x64')));
|
gulp.task('vscode-darwin-azurecore', ['optimize-vscode'], ext.packageExtensionTask('azurecore', 'darwin'));
|
||||||
gulp.task('clean-vscode-darwin', util.rimraf(path.join(buildRoot, 'sqlops-darwin')));
|
gulp.task('vscode-linux-x64-azurecore', ['optimize-vscode'], ext.packageExtensionTask('azurecore', 'linux', 'x64'));
|
||||||
gulp.task('clean-vscode-linux-ia32', util.rimraf(path.join(buildRoot, 'sqlops-linux-ia32')));
|
|
||||||
gulp.task('clean-vscode-linux-x64', util.rimraf(path.join(buildRoot, 'sqlops-linux-x64')));
|
gulp.task('vscode-win32-x64-mssql', ['vscode-linux-x64-azurecore', 'optimize-vscode'], ext.packageExtensionTask('mssql', 'win32', 'x64'));
|
||||||
gulp.task('clean-vscode-linux-arm', util.rimraf(path.join(buildRoot, 'sqlops-linux-arm')));
|
gulp.task('vscode-darwin-mssql', ['vscode-linux-x64-azurecore', 'optimize-vscode'], ext.packageExtensionTask('mssql', 'darwin'));
|
||||||
|
gulp.task('vscode-linux-x64-mssql', ['vscode-linux-x64-azurecore', 'optimize-vscode'], ext.packageExtensionTask('mssql', 'linux', 'x64'));
|
||||||
|
|
||||||
|
gulp.task('clean-vscode-win32-ia32', util.rimraf(path.join(buildRoot, 'azuredatastudio-win32-ia32')));
|
||||||
|
gulp.task('clean-vscode-win32-x64', util.rimraf(path.join(buildRoot, 'azuredatastudio-win32-x64')));
|
||||||
|
gulp.task('clean-vscode-darwin', util.rimraf(path.join(buildRoot, 'azuredatastudio-darwin')));
|
||||||
|
gulp.task('clean-vscode-linux-ia32', util.rimraf(path.join(buildRoot, 'azuredatastudio-linux-ia32')));
|
||||||
|
gulp.task('clean-vscode-linux-x64', util.rimraf(path.join(buildRoot, 'azuredatastudio-linux-x64')));
|
||||||
|
gulp.task('clean-vscode-linux-arm', util.rimraf(path.join(buildRoot, 'azuredatastudio-linux-arm')));
|
||||||
|
gulp.task('clean-vscode-linux-arm64', util.rimraf(path.join(buildRoot, 'azuredatastudio-linux-arm64')));
|
||||||
|
|
||||||
gulp.task('vscode-win32-ia32', ['optimize-vscode', 'clean-vscode-win32-ia32'], packageTask('win32', 'ia32'));
|
gulp.task('vscode-win32-ia32', ['optimize-vscode', 'clean-vscode-win32-ia32'], packageTask('win32', 'ia32'));
|
||||||
gulp.task('vscode-win32-x64', ['optimize-vscode', 'clean-vscode-win32-x64'], packageTask('win32', 'x64'));
|
gulp.task('vscode-win32-x64', ['vscode-win32-x64-azurecore', 'vscode-win32-x64-mssql', 'optimize-vscode', 'clean-vscode-win32-x64'], packageTask('win32', 'x64'));
|
||||||
gulp.task('vscode-darwin', ['optimize-vscode', 'clean-vscode-darwin'], packageTask('darwin'));
|
gulp.task('vscode-darwin', ['vscode-darwin-azurecore', 'vscode-darwin-mssql', 'optimize-vscode', 'clean-vscode-darwin'], packageTask('darwin', null, { stats: true }));
|
||||||
gulp.task('vscode-linux-ia32', ['optimize-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32'));
|
gulp.task('vscode-linux-ia32', ['optimize-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32'));
|
||||||
gulp.task('vscode-linux-x64', ['optimize-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64'));
|
gulp.task('vscode-linux-x64', ['vscode-linux-x64-azurecore', 'vscode-linux-x64-mssql', 'optimize-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64'));
|
||||||
gulp.task('vscode-linux-arm', ['optimize-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm'));
|
gulp.task('vscode-linux-arm', ['optimize-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm'));
|
||||||
|
gulp.task('vscode-linux-arm64', ['optimize-vscode', 'clean-vscode-linux-arm64'], packageTask('linux', 'arm64'));
|
||||||
|
|
||||||
gulp.task('vscode-win32-ia32-min', ['minify-vscode', 'clean-vscode-win32-ia32'], packageTask('win32', 'ia32', { minified: true }));
|
gulp.task('vscode-win32-ia32-min', ['minify-vscode', 'clean-vscode-win32-ia32'], packageTask('win32', 'ia32', { minified: true }));
|
||||||
gulp.task('vscode-win32-x64-min', ['minify-vscode', 'clean-vscode-win32-x64'], packageTask('win32', 'x64', { minified: true }));
|
gulp.task('vscode-win32-x64-min', ['minify-vscode', 'clean-vscode-win32-x64'], packageTask('win32', 'x64', { minified: true }));
|
||||||
gulp.task('vscode-darwin-min', ['minify-vscode', 'clean-vscode-darwin'], packageTask('darwin', null, { minified: true }));
|
gulp.task('vscode-darwin-min', ['minify-vscode', 'clean-vscode-darwin'], packageTask('darwin', null, { minified: true, stats: true }));
|
||||||
gulp.task('vscode-linux-ia32-min', ['minify-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32', { minified: true }));
|
gulp.task('vscode-linux-ia32-min', ['minify-vscode', 'clean-vscode-linux-ia32'], packageTask('linux', 'ia32', { minified: true }));
|
||||||
gulp.task('vscode-linux-x64-min', ['minify-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64', { minified: true }));
|
gulp.task('vscode-linux-x64-min', ['minify-vscode', 'clean-vscode-linux-x64'], packageTask('linux', 'x64', { minified: true }));
|
||||||
gulp.task('vscode-linux-arm-min', ['minify-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm', { minified: true }));
|
gulp.task('vscode-linux-arm-min', ['minify-vscode', 'clean-vscode-linux-arm'], packageTask('linux', 'arm', { minified: true }));
|
||||||
|
gulp.task('vscode-linux-arm64-min', ['minify-vscode', 'clean-vscode-linux-arm64'], packageTask('linux', 'arm64', { minified: true }));
|
||||||
|
|
||||||
// Transifex Localizations
|
// Transifex Localizations
|
||||||
|
|
||||||
@@ -514,7 +526,7 @@ gulp.task('vscode-translations-push', ['optimize-vscode'], function () {
|
|||||||
).pipe(i18n.pushXlfFiles(apiHostname, apiName, apiToken));
|
).pipe(i18n.pushXlfFiles(apiHostname, apiName, apiToken));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('vscode-translations-push-test', ['optimize-vscode'], function () {
|
gulp.task('vscode-translations-export', ['optimize-vscode'], function () {
|
||||||
const pathToMetadata = './out-vscode/nls.metadata.json';
|
const pathToMetadata = './out-vscode/nls.metadata.json';
|
||||||
const pathToExtensions = './extensions/*';
|
const pathToExtensions = './extensions/*';
|
||||||
const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}';
|
const pathToSetup = 'build/win32/**/{Default.isl,messages.en.isl}';
|
||||||
@@ -523,44 +535,44 @@ gulp.task('vscode-translations-push-test', ['optimize-vscode'], function () {
|
|||||||
gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()),
|
gulp.src(pathToMetadata).pipe(i18n.createXlfFilesForCoreBundle()),
|
||||||
gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()),
|
gulp.src(pathToSetup).pipe(i18n.createXlfFilesForIsl()),
|
||||||
gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions())
|
gulp.src(pathToExtensions).pipe(i18n.createXlfFilesForExtensions())
|
||||||
).pipe(i18n.findObsoleteResources(apiHostname, apiName, apiToken)
|
).pipe(vfs.dest('../vscode-translations-export'));
|
||||||
).pipe(vfs.dest('../vscode-transifex-input'));
|
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('vscode-translations-pull', function () {
|
gulp.task('vscode-translations-pull', function () {
|
||||||
[...i18n.defaultLanguages, ...i18n.extraLanguages].forEach(language => {
|
return es.merge([...i18n.defaultLanguages, ...i18n.extraLanguages].map(language => {
|
||||||
i18n.pullCoreAndExtensionsXlfFiles(apiHostname, apiName, apiToken, language).pipe(vfs.dest(`../vscode-localization/${language.id}/build`));
|
|
||||||
|
|
||||||
let includeDefault = !!innoSetupConfig[language.id].defaultInfo;
|
let includeDefault = !!innoSetupConfig[language.id].defaultInfo;
|
||||||
i18n.pullSetupXlfFiles(apiHostname, apiName, apiToken, language, includeDefault).pipe(vfs.dest(`../vscode-localization/${language.id}/setup`));
|
return i18n.pullSetupXlfFiles(apiHostname, apiName, apiToken, language, includeDefault).pipe(vfs.dest(`../vscode-translations-import/${language.id}/setup`));
|
||||||
});
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task('vscode-translations-import', function () {
|
gulp.task('vscode-translations-import', function () {
|
||||||
|
// {{SQL CARBON EDIT}} - Replace function body with our own
|
||||||
[...i18n.defaultLanguages, ...i18n.extraLanguages].forEach(language => {
|
[...i18n.defaultLanguages, ...i18n.extraLanguages].forEach(language => {
|
||||||
gulp.src(`../vscode-localization/${language.id}/build/*/*.xlf`)
|
gulp.src(`../vscode-localization/${language.id}/build/*/*.xlf`)
|
||||||
.pipe(i18n.prepareI18nFiles())
|
.pipe(i18n.prepareI18nFiles())
|
||||||
.pipe(vfs.dest(`./i18n/${language.folderName}`));
|
.pipe(vfs.dest(`./i18n/${language.folderName}`));
|
||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
|
||||||
// gulp.src(`../vscode-localization/${language.id}/setup/*/*.xlf`)
|
|
||||||
// .pipe(i18n.prepareIslFiles(language, innoSetupConfig[language.id]))
|
|
||||||
// .pipe(vfs.dest(`./build/win32/i18n`));
|
|
||||||
});
|
});
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
});
|
});
|
||||||
|
|
||||||
// Sourcemaps
|
// Sourcemaps
|
||||||
|
|
||||||
gulp.task('upload-vscode-sourcemaps', ['minify-vscode'], () => {
|
gulp.task('upload-vscode-sourcemaps', ['vscode-darwin-min', 'minify-vscode'], () => {
|
||||||
const vs = gulp.src('out-vscode-min/**/*.map', { base: 'out-vscode-min' })
|
const vs = gulp.src('out-vscode-min/**/*.map', { base: 'out-vscode-min' })
|
||||||
.pipe(es.mapSync(f => {
|
.pipe(es.mapSync(f => {
|
||||||
f.path = `${f.base}/core/${f.relative}`;
|
f.path = `${f.base}/core/${f.relative}`;
|
||||||
return f;
|
return f;
|
||||||
}));
|
}));
|
||||||
|
|
||||||
const extensions = gulp.src('extensions/**/out/**/*.map', { base: '.' });
|
const extensionsOut = gulp.src('extensions/**/out/**/*.map', { base: '.' });
|
||||||
|
const extensionsDist = gulp.src('extensions/**/dist/**/*.map', { base: '.' });
|
||||||
|
|
||||||
return es.merge(vs, extensions)
|
return es.merge(vs, extensionsOut, extensionsDist)
|
||||||
|
.pipe(es.through(function (data) {
|
||||||
|
// debug
|
||||||
|
console.log('Uploading Sourcemap', data.relative);
|
||||||
|
this.emit('data', data);
|
||||||
|
}))
|
||||||
.pipe(azure.upload({
|
.pipe(azure.upload({
|
||||||
account: process.env.AZURE_STORAGE_ACCOUNT,
|
account: process.env.AZURE_STORAGE_ACCOUNT,
|
||||||
key: process.env.AZURE_STORAGE_ACCESS_KEY,
|
key: process.env.AZURE_STORAGE_ACCESS_KEY,
|
||||||
@@ -571,22 +583,19 @@ gulp.task('upload-vscode-sourcemaps', ['minify-vscode'], () => {
|
|||||||
|
|
||||||
const allConfigDetailsPath = path.join(os.tmpdir(), 'configuration.json');
|
const allConfigDetailsPath = path.join(os.tmpdir(), 'configuration.json');
|
||||||
gulp.task('upload-vscode-configuration', ['generate-vscode-configuration'], () => {
|
gulp.task('upload-vscode-configuration', ['generate-vscode-configuration'], () => {
|
||||||
const branch = process.env.BUILD_SOURCEBRANCH;
|
if (!shouldSetupSettingsSearch()) {
|
||||||
|
const branch = process.env.BUILD_SOURCEBRANCH;
|
||||||
if (!/\/master$/.test(branch) && branch.indexOf('/release/') < 0) {
|
|
||||||
console.log(`Only runs on master and release branches, not ${branch}`);
|
console.log(`Only runs on master and release branches, not ${branch}`);
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!fs.existsSync(allConfigDetailsPath)) {
|
if (!fs.existsSync(allConfigDetailsPath)) {
|
||||||
console.error(`configuration file at ${allConfigDetailsPath} does not exist`);
|
throw new Error(`configuration file at ${allConfigDetailsPath} does not exist`);
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const settingsSearchBuildId = getBuildNumber();
|
const settingsSearchBuildId = getSettingsSearchBuildId(packageJson);
|
||||||
if (!settingsSearchBuildId) {
|
if (!settingsSearchBuildId) {
|
||||||
console.error('Failed to compute build number');
|
throw new Error('Failed to compute build number');
|
||||||
return;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
return gulp.src(allConfigDetailsPath)
|
return gulp.src(allConfigDetailsPath)
|
||||||
@@ -598,76 +607,29 @@ gulp.task('upload-vscode-configuration', ['generate-vscode-configuration'], () =
|
|||||||
}));
|
}));
|
||||||
});
|
});
|
||||||
|
|
||||||
function getBuildNumber() {
|
function shouldSetupSettingsSearch() {
|
||||||
const previous = getPreviousVersion(packageJson.version);
|
const branch = process.env.BUILD_SOURCEBRANCH;
|
||||||
if (!previous) {
|
return branch && (/\/master$/.test(branch) || branch.indexOf('/release/') >= 0);
|
||||||
return 0;
|
}
|
||||||
}
|
|
||||||
|
|
||||||
|
function getSettingsSearchBuildId(packageJson) {
|
||||||
try {
|
try {
|
||||||
const out = cp.execSync(`git rev-list ${previous}..HEAD --count`);
|
const branch = process.env.BUILD_SOURCEBRANCH;
|
||||||
|
const branchId = branch.indexOf('/release/') >= 0 ? 0 :
|
||||||
|
/\/master$/.test(branch) ? 1 :
|
||||||
|
2; // Some unexpected branch
|
||||||
|
|
||||||
|
const out = cp.execSync(`git rev-list HEAD --count`);
|
||||||
const count = parseInt(out.toString());
|
const count = parseInt(out.toString());
|
||||||
return versionStringToNumber(packageJson.version) * 1e4 + count;
|
|
||||||
|
// <version number><commit count><branchId (avoid unlikely conflicts)>
|
||||||
|
// 1.25.1, 1,234,567 commits, master = 1250112345671
|
||||||
|
return util.versionStringToNumber(packageJson.version) * 1e8 + count * 10 + branchId;
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
console.error('Could not determine build number: ' + e.toString());
|
throw new Error('Could not determine build number: ' + e.toString());
|
||||||
return 0;
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/**
|
|
||||||
* Given 1.17.2, return 1.17.1
|
|
||||||
* 1.18.0 => 1.17.2.
|
|
||||||
* 2.0.0 => 1.18.0 (or the highest 1.x)
|
|
||||||
*/
|
|
||||||
function getPreviousVersion(versionStr) {
|
|
||||||
function tagExists(tagName) {
|
|
||||||
try {
|
|
||||||
cp.execSync(`git rev-parse ${tagName}`, { stdio: 'ignore' });
|
|
||||||
return true;
|
|
||||||
} catch (e) {
|
|
||||||
return false;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function getLastTagFromBase(semverArr, componentToTest) {
|
|
||||||
const baseVersion = semverArr.join('.');
|
|
||||||
if (!tagExists(baseVersion)) {
|
|
||||||
console.error('Failed to find tag for base version, ' + baseVersion);
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
let goodTag;
|
|
||||||
do {
|
|
||||||
goodTag = semverArr.join('.');
|
|
||||||
semverArr[componentToTest]++;
|
|
||||||
} while (tagExists(semverArr.join('.')));
|
|
||||||
|
|
||||||
return goodTag;
|
|
||||||
}
|
|
||||||
|
|
||||||
const semverArr = versionStr.split('.');
|
|
||||||
if (semverArr[2] > 0) {
|
|
||||||
semverArr[2]--;
|
|
||||||
return semverArr.join('.');
|
|
||||||
} else if (semverArr[1] > 0) {
|
|
||||||
semverArr[1]--;
|
|
||||||
return getLastTagFromBase(semverArr, 2);
|
|
||||||
} else {
|
|
||||||
semverArr[0]--;
|
|
||||||
return getLastTagFromBase(semverArr, 1);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
function versionStringToNumber(versionStr) {
|
|
||||||
const semverRegex = /(\d+)\.(\d+)\.(\d+)/;
|
|
||||||
const match = versionStr.match(semverRegex);
|
|
||||||
if (!match) {
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
return parseInt(match[1], 10) * 1e4 + parseInt(match[2], 10) * 1e2 + parseInt(match[3], 10);
|
|
||||||
}
|
|
||||||
|
|
||||||
// This task is only run for the MacOS build
|
// This task is only run for the MacOS build
|
||||||
gulp.task('generate-vscode-configuration', () => {
|
gulp.task('generate-vscode-configuration', () => {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve, reject) => {
|
||||||
@@ -676,6 +638,10 @@ gulp.task('generate-vscode-configuration', () => {
|
|||||||
return reject(new Error('$AGENT_BUILDDIRECTORY not set'));
|
return reject(new Error('$AGENT_BUILDDIRECTORY not set'));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (process.env.VSCODE_QUALITY !== 'insider' && process.env.VSCODE_QUALITY !== 'stable') {
|
||||||
|
return resolve();
|
||||||
|
}
|
||||||
|
|
||||||
const userDataDir = path.join(os.tmpdir(), 'tmpuserdata');
|
const userDataDir = path.join(os.tmpdir(), 'tmpuserdata');
|
||||||
const extensionsDir = path.join(os.tmpdir(), 'tmpextdir');
|
const extensionsDir = path.join(os.tmpdir(), 'tmpextdir');
|
||||||
const appName = process.env.VSCODE_QUALITY === 'insider' ? 'Visual\\ Studio\\ Code\\ -\\ Insiders.app' : 'Visual\\ Studio\\ Code.app';
|
const appName = process.env.VSCODE_QUALITY === 'insider' ? 'Visual\\ Studio\\ Code\\ -\\ Insiders.app' : 'Visual\\ Studio\\ Code.app';
|
||||||
@@ -699,9 +665,6 @@ gulp.task('generate-vscode-configuration', () => {
|
|||||||
clearTimeout(timer);
|
clearTimeout(timer);
|
||||||
reject(err);
|
reject(err);
|
||||||
});
|
});
|
||||||
}).catch(e => {
|
|
||||||
// Don't fail the build
|
|
||||||
console.error(e.toString());
|
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -727,6 +690,5 @@ function installService() {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gulp.task('install-sqltoolsservice', () => {
|
gulp.task('install-sqltoolsservice', () => {
|
||||||
return installService();
|
return installService();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|||||||
@@ -12,55 +12,35 @@ const shell = require('gulp-shell');
|
|||||||
const es = require('event-stream');
|
const es = require('event-stream');
|
||||||
const vfs = require('vinyl-fs');
|
const vfs = require('vinyl-fs');
|
||||||
const util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
|
||||||
const packageJson = require('../package.json');
|
const packageJson = require('../package.json');
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
|
||||||
const product = require('../product.json');
|
const product = require('../product.json');
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
|
||||||
const rpmDependencies = require('../resources/linux/rpm/dependencies.json');
|
const rpmDependencies = require('../resources/linux/rpm/dependencies.json');
|
||||||
|
|
||||||
const linuxPackageRevision = Math.floor(new Date().getTime() / 1000);
|
const linuxPackageRevision = Math.floor(new Date().getTime() / 1000);
|
||||||
|
|
||||||
const flatpakManifest = {
|
|
||||||
appId: product.darwinBundleIdentifier, // We need a reverse-url style identifier.
|
|
||||||
sdk: 'org.freedesktop.Sdk',
|
|
||||||
runtime: 'org.freedesktop.Sdk',
|
|
||||||
runtimeVersion: '1.4',
|
|
||||||
base: 'io.atom.electron.BaseApp',
|
|
||||||
baseFlatpakref: 'https://s3-us-west-2.amazonaws.com/electron-flatpak.endlessm.com/electron-base-app-master.flatpakref',
|
|
||||||
command: product.applicationName,
|
|
||||||
symlinks: [
|
|
||||||
['/share/' + product.applicationName + '/bin/' + product.applicationName, '/bin/' + product.applicationName],
|
|
||||||
],
|
|
||||||
finishArgs: [
|
|
||||||
'--share=ipc', '--socket=x11', // Allow showing X11 windows.
|
|
||||||
'--share=network', // Network access (e.g. for installing extension).
|
|
||||||
'--filesystem=host', // Allow access to the whole file system.
|
|
||||||
'--device=dri', // Allow OpenGL rendering.
|
|
||||||
'--filesystem=/tmp', // Needed for Chromium's single instance check.
|
|
||||||
'--socket=pulseaudio', // Some extensions may want to play sounds...
|
|
||||||
'--talk-name=org.freedesktop.Notifications', // ...or pop up notifications.
|
|
||||||
],
|
|
||||||
};
|
|
||||||
|
|
||||||
|
|
||||||
function getDebPackageArch(arch) {
|
function getDebPackageArch(arch) {
|
||||||
return { x64: 'amd64', ia32: 'i386', arm: 'armhf' }[arch];
|
return { x64: 'amd64', ia32: 'i386', arm: 'armhf', arm64: "arm64" }[arch];
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareDebPackage(arch) {
|
function prepareDebPackage(arch) {
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const binaryDir = '../sqlops-linux-' + arch;
|
const binaryDir = '../azuredatastudio-linux-' + arch;
|
||||||
const debArch = getDebPackageArch(arch);
|
const debArch = getDebPackageArch(arch);
|
||||||
const destination = '.build/linux/deb/' + debArch + '/' + product.applicationName + '-' + debArch;
|
const destination = '.build/linux/deb/' + debArch + '/' + product.applicationName + '-' + debArch;
|
||||||
|
|
||||||
return function () {
|
return function () {
|
||||||
const desktop = gulp.src('resources/linux/code.desktop', { base: '.' })
|
const desktop = gulp.src('resources/linux/code.desktop', { base: '.' })
|
||||||
|
.pipe(rename('usr/share/applications/' + product.applicationName + '.desktop'));
|
||||||
|
|
||||||
|
const desktopUrlHandler = gulp.src('resources/linux/code-url-handler.desktop', { base: '.' })
|
||||||
|
.pipe(rename('usr/share/applications/' + product.applicationName + '-url-handler.desktop'));
|
||||||
|
|
||||||
|
const desktops = es.merge(desktop, desktopUrlHandler)
|
||||||
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
.pipe(replace('@@ICON@@', product.applicationName))
|
.pipe(replace('@@ICON@@', product.applicationName))
|
||||||
.pipe(rename('usr/share/applications/' + product.applicationName + '.desktop'));
|
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
||||||
|
|
||||||
const appdata = gulp.src('resources/linux/code.appdata.xml', { base: '.' })
|
const appdata = gulp.src('resources/linux/code.appdata.xml', { base: '.' })
|
||||||
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
@@ -99,11 +79,13 @@ function prepareDebPackage(arch) {
|
|||||||
const postinst = gulp.src('resources/linux/debian/postinst.template', { base: '.' })
|
const postinst = gulp.src('resources/linux/debian/postinst.template', { base: '.' })
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
.pipe(replace('@@ARCHITECTURE@@', debArch))
|
.pipe(replace('@@ARCHITECTURE@@', debArch))
|
||||||
|
// @ts-ignore JSON checking: quality is optional
|
||||||
.pipe(replace('@@QUALITY@@', product.quality || '@@QUALITY@@'))
|
.pipe(replace('@@QUALITY@@', product.quality || '@@QUALITY@@'))
|
||||||
|
// @ts-ignore JSON checking: updateUrl is optional
|
||||||
.pipe(replace('@@UPDATEURL@@', product.updateUrl || '@@UPDATEURL@@'))
|
.pipe(replace('@@UPDATEURL@@', product.updateUrl || '@@UPDATEURL@@'))
|
||||||
.pipe(rename('DEBIAN/postinst'));
|
.pipe(rename('DEBIAN/postinst'));
|
||||||
|
|
||||||
const all = es.merge(control, postinst, postrm, prerm, desktop, appdata, icon, code);
|
const all = es.merge(control, postinst, postrm, prerm, desktops, appdata, icon, code);
|
||||||
|
|
||||||
return all.pipe(vfs.dest(destination));
|
return all.pipe(vfs.dest(destination));
|
||||||
};
|
};
|
||||||
@@ -123,21 +105,27 @@ function getRpmBuildPath(rpmArch) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function getRpmPackageArch(arch) {
|
function getRpmPackageArch(arch) {
|
||||||
return { x64: 'x86_64', ia32: 'i386', arm: 'armhf' }[arch];
|
return { x64: 'x86_64', ia32: 'i386', arm: 'armhf', arm64: "arm64" }[arch];
|
||||||
}
|
}
|
||||||
|
|
||||||
function prepareRpmPackage(arch) {
|
function prepareRpmPackage(arch) {
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const binaryDir = '../sqlops-linux-' + arch;
|
const binaryDir = '../azuredatastudio-linux-' + arch;
|
||||||
const rpmArch = getRpmPackageArch(arch);
|
const rpmArch = getRpmPackageArch(arch);
|
||||||
|
|
||||||
return function () {
|
return function () {
|
||||||
const desktop = gulp.src('resources/linux/code.desktop', { base: '.' })
|
const desktop = gulp.src('resources/linux/code.desktop', { base: '.' })
|
||||||
|
.pipe(rename('BUILD/usr/share/applications/' + product.applicationName + '.desktop'));
|
||||||
|
|
||||||
|
const desktopUrlHandler = gulp.src('resources/linux/code-url-handler.desktop', { base: '.' })
|
||||||
|
.pipe(rename('BUILD/usr/share/applications/' + product.applicationName + '-url-handler.desktop'));
|
||||||
|
|
||||||
|
const desktops = es.merge(desktop, desktopUrlHandler)
|
||||||
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
.pipe(replace('@@NAME_SHORT@@', product.nameShort))
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
.pipe(replace('@@ICON@@', product.applicationName))
|
.pipe(replace('@@ICON@@', product.applicationName))
|
||||||
.pipe(rename('BUILD/usr/share/applications/' + product.applicationName + '.desktop'));
|
.pipe(replace('@@URLPROTOCOL@@', product.urlProtocol));
|
||||||
|
|
||||||
const appdata = gulp.src('resources/linux/code.appdata.xml', { base: '.' })
|
const appdata = gulp.src('resources/linux/code.appdata.xml', { base: '.' })
|
||||||
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
.pipe(replace('@@NAME_LONG@@', product.nameLong))
|
||||||
@@ -158,7 +146,9 @@ function prepareRpmPackage(arch) {
|
|||||||
.pipe(replace('@@RELEASE@@', linuxPackageRevision))
|
.pipe(replace('@@RELEASE@@', linuxPackageRevision))
|
||||||
.pipe(replace('@@ARCHITECTURE@@', rpmArch))
|
.pipe(replace('@@ARCHITECTURE@@', rpmArch))
|
||||||
.pipe(replace('@@LICENSE@@', product.licenseName))
|
.pipe(replace('@@LICENSE@@', product.licenseName))
|
||||||
|
// @ts-ignore JSON checking: quality is optional
|
||||||
.pipe(replace('@@QUALITY@@', product.quality || '@@QUALITY@@'))
|
.pipe(replace('@@QUALITY@@', product.quality || '@@QUALITY@@'))
|
||||||
|
// @ts-ignore JSON checking: updateUrl is optional
|
||||||
.pipe(replace('@@UPDATEURL@@', product.updateUrl || '@@UPDATEURL@@'))
|
.pipe(replace('@@UPDATEURL@@', product.updateUrl || '@@UPDATEURL@@'))
|
||||||
.pipe(replace('@@DEPENDENCIES@@', rpmDependencies[rpmArch].join(', ')))
|
.pipe(replace('@@DEPENDENCIES@@', rpmDependencies[rpmArch].join(', ')))
|
||||||
.pipe(rename('SPECS/' + product.applicationName + '.spec'));
|
.pipe(rename('SPECS/' + product.applicationName + '.spec'));
|
||||||
@@ -166,7 +156,7 @@ function prepareRpmPackage(arch) {
|
|||||||
const specIcon = gulp.src('resources/linux/rpm/code.xpm', { base: '.' })
|
const specIcon = gulp.src('resources/linux/rpm/code.xpm', { base: '.' })
|
||||||
.pipe(rename('SOURCES/' + product.applicationName + '.xpm'));
|
.pipe(rename('SOURCES/' + product.applicationName + '.xpm'));
|
||||||
|
|
||||||
const all = es.merge(code, desktop, appdata, icon, spec, specIcon);
|
const all = es.merge(code, desktops, appdata, icon, spec, specIcon);
|
||||||
|
|
||||||
return all.pipe(vfs.dest(getRpmBuildPath(rpmArch)));
|
return all.pipe(vfs.dest(getRpmBuildPath(rpmArch)));
|
||||||
};
|
};
|
||||||
@@ -184,6 +174,7 @@ function buildRpmPackage(arch) {
|
|||||||
'cp "' + rpmOut + '/$(ls ' + rpmOut + ')" ' + destination + '/'
|
'cp "' + rpmOut + '/$(ls ' + rpmOut + ')" ' + destination + '/'
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
function getSnapBuildPath(arch) {
|
function getSnapBuildPath(arch) {
|
||||||
return `.build/linux/snap/${arch}/${product.applicationName}-${arch}`;
|
return `.build/linux/snap/${arch}/${product.applicationName}-${arch}`;
|
||||||
}
|
}
|
||||||
@@ -204,17 +195,21 @@ function prepareSnapPackage(arch) {
|
|||||||
.pipe(rename(`usr/share/pixmaps/${product.applicationName}.png`));
|
.pipe(rename(`usr/share/pixmaps/${product.applicationName}.png`));
|
||||||
|
|
||||||
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
|
const code = gulp.src(binaryDir + '/**/*', { base: binaryDir })
|
||||||
.pipe(rename(function (p) { p.dirname = 'usr/share/' + product.applicationName + '/' + p.dirname; }));
|
.pipe(rename(function (p) { p.dirname = `usr/share/${product.applicationName}/${p.dirname}`; }));
|
||||||
|
|
||||||
const snapcraft = gulp.src('resources/linux/snap/snapcraft.yaml', { base: '.' })
|
const snapcraft = gulp.src('resources/linux/snap/snapcraft.yaml', { base: '.' })
|
||||||
.pipe(replace('@@NAME@@', product.applicationName))
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
.pipe(replace('@@VERSION@@', packageJson.version))
|
.pipe(replace('@@VERSION@@', `${packageJson.version}-${linuxPackageRevision}`))
|
||||||
.pipe(rename('snap/snapcraft.yaml'));
|
.pipe(rename('snap/snapcraft.yaml'));
|
||||||
|
|
||||||
|
const snapUpdate = gulp.src('resources/linux/snap/snapUpdate.sh', { base: '.' })
|
||||||
|
.pipe(replace('@@NAME@@', product.applicationName))
|
||||||
|
.pipe(rename(`usr/share/${product.applicationName}/snapUpdate.sh`));
|
||||||
|
|
||||||
const electronLaunch = gulp.src('resources/linux/snap/electron-launch', { base: '.' })
|
const electronLaunch = gulp.src('resources/linux/snap/electron-launch', { base: '.' })
|
||||||
.pipe(rename('electron-launch'));
|
.pipe(rename('electron-launch'));
|
||||||
|
|
||||||
const all = es.merge(desktop, icon, code, snapcraft, electronLaunch);
|
const all = es.merge(desktop, icon, code, snapcraft, electronLaunch, snapUpdate);
|
||||||
|
|
||||||
return all.pipe(vfs.dest(destination));
|
return all.pipe(vfs.dest(destination));
|
||||||
};
|
};
|
||||||
@@ -222,11 +217,7 @@ function prepareSnapPackage(arch) {
|
|||||||
|
|
||||||
function buildSnapPackage(arch) {
|
function buildSnapPackage(arch) {
|
||||||
const snapBuildPath = getSnapBuildPath(arch);
|
const snapBuildPath = getSnapBuildPath(arch);
|
||||||
const snapFilename = `${product.applicationName}-${packageJson.version}-${linuxPackageRevision}-${arch}.snap`;
|
return shell.task(`cd ${snapBuildPath} && snapcraft build`);
|
||||||
return shell.task([
|
|
||||||
`chmod +x ${snapBuildPath}/electron-launch`,
|
|
||||||
`cd ${snapBuildPath} && snapcraft snap --output ../${snapFilename}`
|
|
||||||
]);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function getFlatpakArch(arch) {
|
function getFlatpakArch(arch) {
|
||||||
@@ -235,7 +226,7 @@ function getFlatpakArch(arch) {
|
|||||||
|
|
||||||
function prepareFlatpak(arch) {
|
function prepareFlatpak(arch) {
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const binaryDir = '../sqlops-linux-' + arch;
|
const binaryDir = '../azuredatastudio-linux-' + arch;
|
||||||
const flatpakArch = getFlatpakArch(arch);
|
const flatpakArch = getFlatpakArch(arch);
|
||||||
const destination = '.build/linux/flatpak/' + flatpakArch;
|
const destination = '.build/linux/flatpak/' + flatpakArch;
|
||||||
|
|
||||||
@@ -306,40 +297,39 @@ function buildFlatpak(arch) {
|
|||||||
gulp.task('clean-vscode-linux-ia32-deb', util.rimraf('.build/linux/deb/i386'));
|
gulp.task('clean-vscode-linux-ia32-deb', util.rimraf('.build/linux/deb/i386'));
|
||||||
gulp.task('clean-vscode-linux-x64-deb', util.rimraf('.build/linux/deb/amd64'));
|
gulp.task('clean-vscode-linux-x64-deb', util.rimraf('.build/linux/deb/amd64'));
|
||||||
gulp.task('clean-vscode-linux-arm-deb', util.rimraf('.build/linux/deb/armhf'));
|
gulp.task('clean-vscode-linux-arm-deb', util.rimraf('.build/linux/deb/armhf'));
|
||||||
|
gulp.task('clean-vscode-linux-arm64-deb', util.rimraf('.build/linux/deb/arm64'));
|
||||||
gulp.task('clean-vscode-linux-ia32-rpm', util.rimraf('.build/linux/rpm/i386'));
|
gulp.task('clean-vscode-linux-ia32-rpm', util.rimraf('.build/linux/rpm/i386'));
|
||||||
gulp.task('clean-vscode-linux-x64-rpm', util.rimraf('.build/linux/rpm/x86_64'));
|
gulp.task('clean-vscode-linux-x64-rpm', util.rimraf('.build/linux/rpm/x86_64'));
|
||||||
gulp.task('clean-vscode-linux-arm-rpm', util.rimraf('.build/linux/rpm/armhf'));
|
gulp.task('clean-vscode-linux-arm-rpm', util.rimraf('.build/linux/rpm/armhf'));
|
||||||
|
gulp.task('clean-vscode-linux-arm64-rpm', util.rimraf('.build/linux/rpm/arm64'));
|
||||||
gulp.task('clean-vscode-linux-ia32-snap', util.rimraf('.build/linux/snap/x64'));
|
gulp.task('clean-vscode-linux-ia32-snap', util.rimraf('.build/linux/snap/x64'));
|
||||||
gulp.task('clean-vscode-linux-x64-snap', util.rimraf('.build/linux/snap/x64'));
|
gulp.task('clean-vscode-linux-x64-snap', util.rimraf('.build/linux/snap/x64'));
|
||||||
gulp.task('clean-vscode-linux-arm-snap', util.rimraf('.build/linux/snap/x64'));
|
gulp.task('clean-vscode-linux-arm-snap', util.rimraf('.build/linux/snap/x64'));
|
||||||
gulp.task('clean-vscode-linux-ia32-flatpak', util.rimraf('.build/linux/flatpak/i386'));
|
gulp.task('clean-vscode-linux-arm64-snap', util.rimraf('.build/linux/snap/x64'));
|
||||||
gulp.task('clean-vscode-linux-x64-flatpak', util.rimraf('.build/linux/flatpak/x86_64'));
|
|
||||||
gulp.task('clean-vscode-linux-arm-flatpak', util.rimraf('.build/linux/flatpak/arm'));
|
|
||||||
|
|
||||||
gulp.task('vscode-linux-ia32-prepare-deb', ['clean-vscode-linux-ia32-deb'], prepareDebPackage('ia32'));
|
gulp.task('vscode-linux-ia32-prepare-deb', ['clean-vscode-linux-ia32-deb'], prepareDebPackage('ia32'));
|
||||||
gulp.task('vscode-linux-x64-prepare-deb', ['clean-vscode-linux-x64-deb'], prepareDebPackage('x64'));
|
gulp.task('vscode-linux-x64-prepare-deb', ['clean-vscode-linux-x64-deb'], prepareDebPackage('x64'));
|
||||||
gulp.task('vscode-linux-arm-prepare-deb', ['clean-vscode-linux-arm-deb'], prepareDebPackage('arm'));
|
gulp.task('vscode-linux-arm-prepare-deb', ['clean-vscode-linux-arm-deb'], prepareDebPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-prepare-deb', ['clean-vscode-linux-arm64-deb'], prepareDebPackage('arm64'));
|
||||||
gulp.task('vscode-linux-ia32-build-deb', ['vscode-linux-ia32-prepare-deb'], buildDebPackage('ia32'));
|
gulp.task('vscode-linux-ia32-build-deb', ['vscode-linux-ia32-prepare-deb'], buildDebPackage('ia32'));
|
||||||
gulp.task('vscode-linux-x64-build-deb', ['vscode-linux-x64-prepare-deb'], buildDebPackage('x64'));
|
gulp.task('vscode-linux-x64-build-deb', ['vscode-linux-x64-prepare-deb'], buildDebPackage('x64'));
|
||||||
gulp.task('vscode-linux-arm-build-deb', ['vscode-linux-arm-prepare-deb'], buildDebPackage('arm'));
|
gulp.task('vscode-linux-arm-build-deb', ['vscode-linux-arm-prepare-deb'], buildDebPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-build-deb', ['vscode-linux-arm64-prepare-deb'], buildDebPackage('arm64'));
|
||||||
|
|
||||||
gulp.task('vscode-linux-ia32-prepare-rpm', ['clean-vscode-linux-ia32-rpm'], prepareRpmPackage('ia32'));
|
gulp.task('vscode-linux-ia32-prepare-rpm', ['clean-vscode-linux-ia32-rpm'], prepareRpmPackage('ia32'));
|
||||||
gulp.task('vscode-linux-x64-prepare-rpm', ['clean-vscode-linux-x64-rpm'], prepareRpmPackage('x64'));
|
gulp.task('vscode-linux-x64-prepare-rpm', ['clean-vscode-linux-x64-rpm'], prepareRpmPackage('x64'));
|
||||||
gulp.task('vscode-linux-arm-prepare-rpm', ['clean-vscode-linux-arm-rpm'], prepareRpmPackage('arm'));
|
gulp.task('vscode-linux-arm-prepare-rpm', ['clean-vscode-linux-arm-rpm'], prepareRpmPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-prepare-rpm', ['clean-vscode-linux-arm64-rpm'], prepareRpmPackage('arm64'));
|
||||||
gulp.task('vscode-linux-ia32-build-rpm', ['vscode-linux-ia32-prepare-rpm'], buildRpmPackage('ia32'));
|
gulp.task('vscode-linux-ia32-build-rpm', ['vscode-linux-ia32-prepare-rpm'], buildRpmPackage('ia32'));
|
||||||
gulp.task('vscode-linux-x64-build-rpm', ['vscode-linux-x64-prepare-rpm'], buildRpmPackage('x64'));
|
gulp.task('vscode-linux-x64-build-rpm', ['vscode-linux-x64-prepare-rpm'], buildRpmPackage('x64'));
|
||||||
gulp.task('vscode-linux-arm-build-rpm', ['vscode-linux-arm-prepare-rpm'], buildRpmPackage('arm'));
|
gulp.task('vscode-linux-arm-build-rpm', ['vscode-linux-arm-prepare-rpm'], buildRpmPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-build-rpm', ['vscode-linux-arm64-prepare-rpm'], buildRpmPackage('arm64'));
|
||||||
|
|
||||||
gulp.task('vscode-linux-ia32-prepare-snap', ['clean-vscode-linux-ia32-snap'], prepareSnapPackage('ia32'));
|
gulp.task('vscode-linux-ia32-prepare-snap', ['clean-vscode-linux-ia32-snap'], prepareSnapPackage('ia32'));
|
||||||
gulp.task('vscode-linux-x64-prepare-snap', ['clean-vscode-linux-x64-snap'], prepareSnapPackage('x64'));
|
gulp.task('vscode-linux-x64-prepare-snap', ['clean-vscode-linux-x64-snap'], prepareSnapPackage('x64'));
|
||||||
gulp.task('vscode-linux-arm-prepare-snap', ['clean-vscode-linux-arm-snap'], prepareSnapPackage('arm'));
|
gulp.task('vscode-linux-arm-prepare-snap', ['clean-vscode-linux-arm-snap'], prepareSnapPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-prepare-snap', ['clean-vscode-linux-arm64-snap'], prepareSnapPackage('arm64'));
|
||||||
gulp.task('vscode-linux-ia32-build-snap', ['vscode-linux-ia32-prepare-snap'], buildSnapPackage('ia32'));
|
gulp.task('vscode-linux-ia32-build-snap', ['vscode-linux-ia32-prepare-snap'], buildSnapPackage('ia32'));
|
||||||
gulp.task('vscode-linux-x64-build-snap', ['vscode-linux-x64-prepare-snap'], buildSnapPackage('x64'));
|
gulp.task('vscode-linux-x64-build-snap', ['vscode-linux-x64-prepare-snap'], buildSnapPackage('x64'));
|
||||||
gulp.task('vscode-linux-arm-build-snap', ['vscode-linux-arm-prepare-snap'], buildSnapPackage('arm'));
|
gulp.task('vscode-linux-arm-build-snap', ['vscode-linux-arm-prepare-snap'], buildSnapPackage('arm'));
|
||||||
|
gulp.task('vscode-linux-arm64-build-snap', ['vscode-linux-arm64-prepare-snap'], buildSnapPackage('arm64'));
|
||||||
gulp.task('vscode-linux-ia32-prepare-flatpak', ['clean-vscode-linux-ia32-flatpak'], prepareFlatpak('ia32'));
|
|
||||||
gulp.task('vscode-linux-x64-prepare-flatpak', ['clean-vscode-linux-x64-flatpak'], prepareFlatpak('x64'));
|
|
||||||
gulp.task('vscode-linux-arm-prepare-flatpak', ['clean-vscode-linux-arm-flatpak'], prepareFlatpak('arm'));
|
|
||||||
gulp.task('vscode-linux-ia32-flatpak', ['vscode-linux-ia32-prepare-flatpak'], buildFlatpak('ia32'));
|
|
||||||
gulp.task('vscode-linux-x64-flatpak', ['vscode-linux-x64-prepare-flatpak'], buildFlatpak('x64'));
|
|
||||||
gulp.task('vscode-linux-arm-flatpak', ['vscode-linux-arm-prepare-flatpak'], buildFlatpak('arm'));
|
|
||||||
|
|||||||
@@ -7,45 +7,75 @@
|
|||||||
|
|
||||||
const gulp = require('gulp');
|
const gulp = require('gulp');
|
||||||
const path = require('path');
|
const path = require('path');
|
||||||
|
const fs = require('fs');
|
||||||
const assert = require('assert');
|
const assert = require('assert');
|
||||||
const cp = require('child_process');
|
const cp = require('child_process');
|
||||||
const _7z = require('7zip')['7z'];
|
const _7z = require('7zip')['7z'];
|
||||||
const util = require('./lib/util');
|
const util = require('./lib/util');
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
|
||||||
const pkg = require('../package.json');
|
const pkg = require('../package.json');
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
|
||||||
const product = require('../product.json');
|
const product = require('../product.json');
|
||||||
const vfs = require('vinyl-fs');
|
const vfs = require('vinyl-fs');
|
||||||
|
const rcedit = require('rcedit');
|
||||||
|
const mkdirp = require('mkdirp');
|
||||||
|
|
||||||
const repoPath = path.dirname(__dirname);
|
const repoPath = path.dirname(__dirname);
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
const buildPath = arch => path.join(path.dirname(repoPath), `sqlops-win32-${arch}`);
|
const buildPath = arch => path.join(path.dirname(repoPath), `azuredatastudio-win32-${arch}`);
|
||||||
const zipDir = arch => path.join(repoPath, '.build', `win32-${arch}`, 'archive');
|
const zipDir = arch => path.join(repoPath, '.build', `win32-${arch}`, 'archive');
|
||||||
const zipPath = arch => path.join(zipDir(arch), `VSCode-win32-${arch}.zip`);
|
const zipPath = arch => path.join(zipDir(arch), `VSCode-win32-${arch}.zip`);
|
||||||
const setupDir = arch => path.join(repoPath, '.build', `win32-${arch}`, 'setup');
|
const setupDir = (arch, target) => path.join(repoPath, '.build', `win32-${arch}`, `${target}-setup`);
|
||||||
const issPath = path.join(__dirname, 'win32', 'code.iss');
|
const issPath = path.join(__dirname, 'win32', 'code.iss');
|
||||||
const innoSetupPath = path.join(path.dirname(path.dirname(require.resolve('innosetup-compiler'))), 'bin', 'ISCC.exe');
|
const innoSetupPath = path.join(path.dirname(path.dirname(require.resolve('innosetup-compiler'))), 'bin', 'ISCC.exe');
|
||||||
|
const signPS1 = path.join(repoPath, 'build', 'azure-pipelines', 'win32', 'sign.ps1');
|
||||||
|
|
||||||
function packageInnoSetup(iss, options, cb) {
|
function packageInnoSetup(iss, options, cb) {
|
||||||
options = options || {};
|
options = options || {};
|
||||||
|
|
||||||
const definitions = options.definitions || {};
|
const definitions = options.definitions || {};
|
||||||
|
|
||||||
|
if (process.argv.some(arg => arg === '--debug-inno')) {
|
||||||
|
definitions['Debug'] = 'true';
|
||||||
|
}
|
||||||
|
|
||||||
|
if (process.argv.some(arg => arg === '--sign')) {
|
||||||
|
definitions['Sign'] = 'true';
|
||||||
|
}
|
||||||
|
|
||||||
const keys = Object.keys(definitions);
|
const keys = Object.keys(definitions);
|
||||||
|
|
||||||
keys.forEach(key => assert(typeof definitions[key] === 'string', `Missing value for '${key}' in Inno Setup package step`));
|
keys.forEach(key => assert(typeof definitions[key] === 'string', `Missing value for '${key}' in Inno Setup package step`));
|
||||||
|
|
||||||
const defs = keys.map(key => `/d${key}=${definitions[key]}`);
|
const defs = keys.map(key => `/d${key}=${definitions[key]}`);
|
||||||
const args = [iss].concat(defs);
|
const args = [
|
||||||
|
iss,
|
||||||
|
...defs
|
||||||
|
//,
|
||||||
|
//`/sesrp=powershell.exe -ExecutionPolicy bypass ${signPS1} $f`
|
||||||
|
];
|
||||||
|
|
||||||
cp.spawn(innoSetupPath, args, { stdio: 'inherit' })
|
cp.spawn(innoSetupPath, args, { stdio: ['ignore', 'inherit', 'inherit'] })
|
||||||
.on('error', cb)
|
.on('error', cb)
|
||||||
.on('exit', () => cb(null));
|
.on('exit', () => cb(null));
|
||||||
}
|
}
|
||||||
|
|
||||||
function buildWin32Setup(arch) {
|
function buildWin32Setup(arch, target) {
|
||||||
|
if (target !== 'system' && target !== 'user') {
|
||||||
|
throw new Error('Invalid setup target');
|
||||||
|
}
|
||||||
|
|
||||||
return cb => {
|
return cb => {
|
||||||
const ia32AppId = product.win32AppId;
|
const ia32AppId = target === 'system' ? product.win32AppId : product.win32UserAppId;
|
||||||
const x64AppId = product.win32x64AppId;
|
const x64AppId = target === 'system' ? product.win32x64AppId : product.win32x64UserAppId;
|
||||||
|
|
||||||
|
const sourcePath = buildPath(arch);
|
||||||
|
const outputPath = setupDir(arch, target);
|
||||||
|
mkdirp.sync(outputPath);
|
||||||
|
|
||||||
|
const originalProductJsonPath = path.join(sourcePath, 'resources/app/product.json');
|
||||||
|
const productJsonPath = path.join(outputPath, 'product.json');
|
||||||
|
const productJson = JSON.parse(fs.readFileSync(originalProductJsonPath, 'utf8'));
|
||||||
|
productJson['target'] = target;
|
||||||
|
fs.writeFileSync(productJsonPath, JSON.stringify(productJson, undefined, '\t'));
|
||||||
|
|
||||||
const definitions = {
|
const definitions = {
|
||||||
NameLong: product.nameLong,
|
NameLong: product.nameLong,
|
||||||
@@ -53,35 +83,42 @@ function buildWin32Setup(arch) {
|
|||||||
DirName: product.win32DirName,
|
DirName: product.win32DirName,
|
||||||
Version: pkg.version,
|
Version: pkg.version,
|
||||||
RawVersion: pkg.version.replace(/-\w+$/, ''),
|
RawVersion: pkg.version.replace(/-\w+$/, ''),
|
||||||
NameVersion: product.win32NameVersion,
|
NameVersion: product.win32NameVersion + (target === 'user' ? ' (User)' : ''),
|
||||||
ExeBasename: product.nameShort,
|
ExeBasename: product.nameShort,
|
||||||
RegValueName: product.win32RegValueName,
|
RegValueName: product.win32RegValueName,
|
||||||
ShellNameShort: product.win32ShellNameShort,
|
ShellNameShort: product.win32ShellNameShort,
|
||||||
AppMutex: product.win32MutexName,
|
AppMutex: product.win32MutexName,
|
||||||
Arch: arch,
|
Arch: arch,
|
||||||
AppId: arch === 'ia32' ? ia32AppId : x64AppId,
|
AppId: arch === 'ia32' ? ia32AppId : x64AppId,
|
||||||
IncompatibleAppId: arch === 'ia32' ? x64AppId : ia32AppId,
|
IncompatibleTargetAppId: arch === 'ia32' ? product.win32AppId : product.win32x64AppId,
|
||||||
|
IncompatibleArchAppId: arch === 'ia32' ? x64AppId : ia32AppId,
|
||||||
AppUserId: product.win32AppUserModelId,
|
AppUserId: product.win32AppUserModelId,
|
||||||
ArchitecturesAllowed: arch === 'ia32' ? '' : 'x64',
|
ArchitecturesAllowed: arch === 'ia32' ? '' : 'x64',
|
||||||
ArchitecturesInstallIn64BitMode: arch === 'ia32' ? '' : 'x64',
|
ArchitecturesInstallIn64BitMode: arch === 'ia32' ? '' : 'x64',
|
||||||
SourceDir: buildPath(arch),
|
SourceDir: sourcePath,
|
||||||
RepoDir: repoPath,
|
RepoDir: repoPath,
|
||||||
OutputDir: setupDir(arch)
|
OutputDir: outputPath,
|
||||||
|
InstallTarget: target,
|
||||||
|
ProductJsonPath: productJsonPath
|
||||||
};
|
};
|
||||||
|
|
||||||
packageInnoSetup(issPath, { definitions }, cb);
|
packageInnoSetup(issPath, { definitions }, cb);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
gulp.task('clean-vscode-win32-ia32-setup', util.rimraf(setupDir('ia32')));
|
function defineWin32SetupTasks(arch, target) {
|
||||||
gulp.task('vscode-win32-ia32-setup', ['clean-vscode-win32-ia32-setup'], buildWin32Setup('ia32'));
|
gulp.task(`clean-vscode-win32-${arch}-${target}-setup`, util.rimraf(setupDir(arch, target)));
|
||||||
|
gulp.task(`vscode-win32-${arch}-${target}-setup`, [`clean-vscode-win32-${arch}-${target}-setup`], buildWin32Setup(arch, target));
|
||||||
|
}
|
||||||
|
|
||||||
gulp.task('clean-vscode-win32-x64-setup', util.rimraf(setupDir('x64')));
|
defineWin32SetupTasks('ia32', 'system');
|
||||||
gulp.task('vscode-win32-x64-setup', ['clean-vscode-win32-x64-setup'], buildWin32Setup('x64'));
|
defineWin32SetupTasks('x64', 'system');
|
||||||
|
defineWin32SetupTasks('ia32', 'user');
|
||||||
|
defineWin32SetupTasks('x64', 'user');
|
||||||
|
|
||||||
function archiveWin32Setup(arch) {
|
function archiveWin32Setup(arch) {
|
||||||
return cb => {
|
return cb => {
|
||||||
const args = ['a', '-tzip', zipPath(arch), '.', '-r'];
|
const args = ['a', '-tzip', zipPath(arch), '-x!CodeSignSummary*.md', '.', '-r'];
|
||||||
|
|
||||||
cp.spawn(_7z, args, { stdio: 'inherit', cwd: buildPath(arch) })
|
cp.spawn(_7z, args, { stdio: 'inherit', cwd: buildPath(arch) })
|
||||||
.on('error', cb)
|
.on('error', cb)
|
||||||
@@ -103,4 +140,14 @@ function copyInnoUpdater(arch) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
gulp.task('vscode-win32-ia32-copy-inno-updater', copyInnoUpdater('ia32'));
|
gulp.task('vscode-win32-ia32-copy-inno-updater', copyInnoUpdater('ia32'));
|
||||||
gulp.task('vscode-win32-x64-copy-inno-updater', copyInnoUpdater('x64'));
|
gulp.task('vscode-win32-x64-copy-inno-updater', copyInnoUpdater('x64'));
|
||||||
|
|
||||||
|
function patchInnoUpdater(arch) {
|
||||||
|
return cb => {
|
||||||
|
const icon = path.join(repoPath, 'resources', 'win32', 'code.ico');
|
||||||
|
rcedit(path.join(buildPath(arch), 'tools', 'inno_updater.exe'), { icon }, cb);
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
gulp.task('vscode-win32-ia32-inno-updater', ['vscode-win32-ia32-copy-inno-updater'], patchInnoUpdater('ia32'));
|
||||||
|
gulp.task('vscode-win32-x64-inno-updater', ['vscode-win32-x64-copy-inno-updater'], patchInnoUpdater('x64'));
|
||||||
15
build/jsconfig.json
Normal file
15
build/jsconfig.json
Normal file
@@ -0,0 +1,15 @@
|
|||||||
|
{
|
||||||
|
"compilerOptions": {
|
||||||
|
"module": "commonjs",
|
||||||
|
"target": "es2017",
|
||||||
|
"jsx": "preserve",
|
||||||
|
"checkJs": true
|
||||||
|
},
|
||||||
|
"include": [
|
||||||
|
"**/*.js"
|
||||||
|
],
|
||||||
|
"exclude": [
|
||||||
|
"node_modules",
|
||||||
|
"**/node_modules/*"
|
||||||
|
]
|
||||||
|
}
|
||||||
@@ -4,33 +4,33 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
'use strict';
|
'use strict';
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var path = require("path");
|
const path = require("path");
|
||||||
var es = require("event-stream");
|
const es = require("event-stream");
|
||||||
var pickle = require("chromium-pickle-js");
|
const pickle = require('chromium-pickle-js');
|
||||||
var Filesystem = require("asar/lib/filesystem");
|
const Filesystem = require('asar/lib/filesystem');
|
||||||
var VinylFile = require("vinyl");
|
const VinylFile = require("vinyl");
|
||||||
var minimatch = require("minimatch");
|
const minimatch = require("minimatch");
|
||||||
function createAsar(folderPath, unpackGlobs, destFilename) {
|
function createAsar(folderPath, unpackGlobs, destFilename) {
|
||||||
var shouldUnpackFile = function (file) {
|
const shouldUnpackFile = (file) => {
|
||||||
for (var i = 0; i < unpackGlobs.length; i++) {
|
for (let i = 0; i < unpackGlobs.length; i++) {
|
||||||
if (minimatch(file.relative, unpackGlobs[i])) {
|
if (minimatch(file.relative, unpackGlobs[i])) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
var filesystem = new Filesystem(folderPath);
|
const filesystem = new Filesystem(folderPath);
|
||||||
var out = [];
|
const out = [];
|
||||||
// Keep track of pending inserts
|
// Keep track of pending inserts
|
||||||
var pendingInserts = 0;
|
let pendingInserts = 0;
|
||||||
var onFileInserted = function () { pendingInserts--; };
|
let onFileInserted = () => { pendingInserts--; };
|
||||||
// Do not insert twice the same directory
|
// Do not insert twice the same directory
|
||||||
var seenDir = {};
|
const seenDir = {};
|
||||||
var insertDirectoryRecursive = function (dir) {
|
const insertDirectoryRecursive = (dir) => {
|
||||||
if (seenDir[dir]) {
|
if (seenDir[dir]) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var lastSlash = dir.lastIndexOf('/');
|
let lastSlash = dir.lastIndexOf('/');
|
||||||
if (lastSlash === -1) {
|
if (lastSlash === -1) {
|
||||||
lastSlash = dir.lastIndexOf('\\');
|
lastSlash = dir.lastIndexOf('\\');
|
||||||
}
|
}
|
||||||
@@ -40,8 +40,8 @@ function createAsar(folderPath, unpackGlobs, destFilename) {
|
|||||||
seenDir[dir] = true;
|
seenDir[dir] = true;
|
||||||
filesystem.insertDirectory(dir);
|
filesystem.insertDirectory(dir);
|
||||||
};
|
};
|
||||||
var insertDirectoryForFile = function (file) {
|
const insertDirectoryForFile = (file) => {
|
||||||
var lastSlash = file.lastIndexOf('/');
|
let lastSlash = file.lastIndexOf('/');
|
||||||
if (lastSlash === -1) {
|
if (lastSlash === -1) {
|
||||||
lastSlash = file.lastIndexOf('\\');
|
lastSlash = file.lastIndexOf('\\');
|
||||||
}
|
}
|
||||||
@@ -49,7 +49,7 @@ function createAsar(folderPath, unpackGlobs, destFilename) {
|
|||||||
insertDirectoryRecursive(file.substring(0, lastSlash));
|
insertDirectoryRecursive(file.substring(0, lastSlash));
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
var insertFile = function (relativePath, stat, shouldUnpack) {
|
const insertFile = (relativePath, stat, shouldUnpack) => {
|
||||||
insertDirectoryForFile(relativePath);
|
insertDirectoryForFile(relativePath);
|
||||||
pendingInserts++;
|
pendingInserts++;
|
||||||
filesystem.insertFile(relativePath, shouldUnpack, { stat: stat }, {}, onFileInserted);
|
filesystem.insertFile(relativePath, shouldUnpack, { stat: stat }, {}, onFileInserted);
|
||||||
@@ -59,13 +59,13 @@ function createAsar(folderPath, unpackGlobs, destFilename) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (!file.stat.isFile()) {
|
if (!file.stat.isFile()) {
|
||||||
throw new Error("unknown item in stream!");
|
throw new Error(`unknown item in stream!`);
|
||||||
}
|
}
|
||||||
var shouldUnpack = shouldUnpackFile(file);
|
const shouldUnpack = shouldUnpackFile(file);
|
||||||
insertFile(file.relative, { size: file.contents.length, mode: file.stat.mode }, shouldUnpack);
|
insertFile(file.relative, { size: file.contents.length, mode: file.stat.mode }, shouldUnpack);
|
||||||
if (shouldUnpack) {
|
if (shouldUnpack) {
|
||||||
// The file goes outside of xx.asar, in a folder xx.asar.unpacked
|
// The file goes outside of xx.asar, in a folder xx.asar.unpacked
|
||||||
var relative = path.relative(folderPath, file.path);
|
const relative = path.relative(folderPath, file.path);
|
||||||
this.queue(new VinylFile({
|
this.queue(new VinylFile({
|
||||||
cwd: folderPath,
|
cwd: folderPath,
|
||||||
base: folderPath,
|
base: folderPath,
|
||||||
@@ -79,34 +79,33 @@ function createAsar(folderPath, unpackGlobs, destFilename) {
|
|||||||
out.push(file.contents);
|
out.push(file.contents);
|
||||||
}
|
}
|
||||||
}, function () {
|
}, function () {
|
||||||
var _this = this;
|
let finish = () => {
|
||||||
var finish = function () {
|
|
||||||
{
|
{
|
||||||
var headerPickle = pickle.createEmpty();
|
const headerPickle = pickle.createEmpty();
|
||||||
headerPickle.writeString(JSON.stringify(filesystem.header));
|
headerPickle.writeString(JSON.stringify(filesystem.header));
|
||||||
var headerBuf = headerPickle.toBuffer();
|
const headerBuf = headerPickle.toBuffer();
|
||||||
var sizePickle = pickle.createEmpty();
|
const sizePickle = pickle.createEmpty();
|
||||||
sizePickle.writeUInt32(headerBuf.length);
|
sizePickle.writeUInt32(headerBuf.length);
|
||||||
var sizeBuf = sizePickle.toBuffer();
|
const sizeBuf = sizePickle.toBuffer();
|
||||||
out.unshift(headerBuf);
|
out.unshift(headerBuf);
|
||||||
out.unshift(sizeBuf);
|
out.unshift(sizeBuf);
|
||||||
}
|
}
|
||||||
var contents = Buffer.concat(out);
|
const contents = Buffer.concat(out);
|
||||||
out.length = 0;
|
out.length = 0;
|
||||||
_this.queue(new VinylFile({
|
this.queue(new VinylFile({
|
||||||
cwd: folderPath,
|
cwd: folderPath,
|
||||||
base: folderPath,
|
base: folderPath,
|
||||||
path: destFilename,
|
path: destFilename,
|
||||||
contents: contents
|
contents: contents
|
||||||
}));
|
}));
|
||||||
_this.queue(null);
|
this.queue(null);
|
||||||
};
|
};
|
||||||
// Call finish() only when all file inserts have finished...
|
// Call finish() only when all file inserts have finished...
|
||||||
if (pendingInserts === 0) {
|
if (pendingInserts === 0) {
|
||||||
finish();
|
finish();
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
onFileInserted = function () {
|
onFileInserted = () => {
|
||||||
pendingInserts--;
|
pendingInserts--;
|
||||||
if (pendingInserts === 0) {
|
if (pendingInserts === 0) {
|
||||||
finish();
|
finish();
|
||||||
|
|||||||
@@ -7,8 +7,8 @@
|
|||||||
|
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
import * as es from 'event-stream';
|
import * as es from 'event-stream';
|
||||||
import * as pickle from 'chromium-pickle-js';
|
const pickle = require('chromium-pickle-js');
|
||||||
import * as Filesystem from 'asar/lib/filesystem';
|
const Filesystem = require('asar/lib/filesystem');
|
||||||
import * as VinylFile from 'vinyl';
|
import * as VinylFile from 'vinyl';
|
||||||
import * as minimatch from 'minimatch';
|
import * as minimatch from 'minimatch';
|
||||||
|
|
||||||
|
|||||||
@@ -17,7 +17,6 @@ const ext = require('./extensions');
|
|||||||
const util = require('gulp-util');
|
const util = require('gulp-util');
|
||||||
|
|
||||||
const root = path.dirname(path.dirname(__dirname));
|
const root = path.dirname(path.dirname(__dirname));
|
||||||
// @ts-ignore Microsoft/TypeScript#21262 complains about a require of a JSON file
|
|
||||||
const builtInExtensions = require('../builtInExtensions.json');
|
const builtInExtensions = require('../builtInExtensions.json');
|
||||||
const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json');
|
const controlFilePath = path.join(os.homedir(), '.vscode-oss-dev', 'extensions', 'control.json');
|
||||||
|
|
||||||
@@ -50,7 +49,7 @@ function syncMarketplaceExtension(extension) {
|
|||||||
|
|
||||||
rimraf.sync(getExtensionPath(extension));
|
rimraf.sync(getExtensionPath(extension));
|
||||||
|
|
||||||
return ext.fromMarketplace(extension.name, extension.version)
|
return ext.fromMarketplace(extension.name, extension.version, extension.metadata)
|
||||||
.pipe(rename(p => p.dirname = `${extension.name}/${p.dirname}`))
|
.pipe(rename(p => p.dirname = `${extension.name}/${p.dirname}`))
|
||||||
.pipe(vfs.dest('.build/builtInExtensions'))
|
.pipe(vfs.dest('.build/builtInExtensions'))
|
||||||
.on('end', () => util.log(util.colors.blue('[marketplace]'), extension.name, util.colors.green('✔︎')));
|
.on('end', () => util.log(util.colors.blue('[marketplace]'), extension.name, util.colors.green('✔︎')));
|
||||||
|
|||||||
@@ -4,19 +4,19 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var fs = require("fs");
|
const fs = require("fs");
|
||||||
var path = require("path");
|
const path = require("path");
|
||||||
var vm = require("vm");
|
const vm = require("vm");
|
||||||
/**
|
/**
|
||||||
* Bundle `entryPoints` given config `config`.
|
* Bundle `entryPoints` given config `config`.
|
||||||
*/
|
*/
|
||||||
function bundle(entryPoints, config, callback) {
|
function bundle(entryPoints, config, callback) {
|
||||||
var entryPointsMap = {};
|
const entryPointsMap = {};
|
||||||
entryPoints.forEach(function (module) {
|
entryPoints.forEach((module) => {
|
||||||
entryPointsMap[module.name] = module;
|
entryPointsMap[module.name] = module;
|
||||||
});
|
});
|
||||||
var allMentionedModulesMap = {};
|
const allMentionedModulesMap = {};
|
||||||
entryPoints.forEach(function (module) {
|
entryPoints.forEach((module) => {
|
||||||
allMentionedModulesMap[module.name] = true;
|
allMentionedModulesMap[module.name] = true;
|
||||||
(module.include || []).forEach(function (includedModule) {
|
(module.include || []).forEach(function (includedModule) {
|
||||||
allMentionedModulesMap[includedModule] = true;
|
allMentionedModulesMap[includedModule] = true;
|
||||||
@@ -25,26 +25,30 @@ function bundle(entryPoints, config, callback) {
|
|||||||
allMentionedModulesMap[excludedModule] = true;
|
allMentionedModulesMap[excludedModule] = true;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
var code = require('fs').readFileSync(path.join(__dirname, '../../src/vs/loader.js'));
|
const code = require('fs').readFileSync(path.join(__dirname, '../../src/vs/loader.js'));
|
||||||
var r = vm.runInThisContext('(function(require, module, exports) { ' + code + '\n});');
|
const r = vm.runInThisContext('(function(require, module, exports) { ' + code + '\n});');
|
||||||
var loaderModule = { exports: {} };
|
const loaderModule = { exports: {} };
|
||||||
r.call({}, require, loaderModule, loaderModule.exports);
|
r.call({}, require, loaderModule, loaderModule.exports);
|
||||||
var loader = loaderModule.exports;
|
const loader = loaderModule.exports;
|
||||||
config.isBuild = true;
|
config.isBuild = true;
|
||||||
config.paths = config.paths || {};
|
config.paths = config.paths || {};
|
||||||
config.paths['vs/nls'] = 'out-build/vs/nls.build';
|
if (!config.paths['vs/nls']) {
|
||||||
config.paths['vs/css'] = 'out-build/vs/css.build';
|
config.paths['vs/nls'] = 'out-build/vs/nls.build';
|
||||||
|
}
|
||||||
|
if (!config.paths['vs/css']) {
|
||||||
|
config.paths['vs/css'] = 'out-build/vs/css.build';
|
||||||
|
}
|
||||||
loader.config(config);
|
loader.config(config);
|
||||||
loader(['require'], function (localRequire) {
|
loader(['require'], (localRequire) => {
|
||||||
var resolvePath = function (path) {
|
const resolvePath = (path) => {
|
||||||
var r = localRequire.toUrl(path);
|
const r = localRequire.toUrl(path);
|
||||||
if (!/\.js/.test(r)) {
|
if (!/\.js/.test(r)) {
|
||||||
return r + '.js';
|
return r + '.js';
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
};
|
};
|
||||||
for (var moduleId in entryPointsMap) {
|
for (const moduleId in entryPointsMap) {
|
||||||
var entryPoint = entryPointsMap[moduleId];
|
const entryPoint = entryPointsMap[moduleId];
|
||||||
if (entryPoint.append) {
|
if (entryPoint.append) {
|
||||||
entryPoint.append = entryPoint.append.map(resolvePath);
|
entryPoint.append = entryPoint.append.map(resolvePath);
|
||||||
}
|
}
|
||||||
@@ -53,59 +57,59 @@ function bundle(entryPoints, config, callback) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
loader(Object.keys(allMentionedModulesMap), function () {
|
loader(Object.keys(allMentionedModulesMap), () => {
|
||||||
var modules = loader.getBuildInfo();
|
const modules = loader.getBuildInfo();
|
||||||
var partialResult = emitEntryPoints(modules, entryPointsMap);
|
const partialResult = emitEntryPoints(modules, entryPointsMap);
|
||||||
var cssInlinedResources = loader('vs/css').getInlinedResources();
|
const cssInlinedResources = loader('vs/css').getInlinedResources();
|
||||||
callback(null, {
|
callback(null, {
|
||||||
files: partialResult.files,
|
files: partialResult.files,
|
||||||
cssInlinedResources: cssInlinedResources,
|
cssInlinedResources: cssInlinedResources,
|
||||||
bundleData: partialResult.bundleData
|
bundleData: partialResult.bundleData
|
||||||
});
|
});
|
||||||
}, function (err) { return callback(err, null); });
|
}, (err) => callback(err, null));
|
||||||
}
|
}
|
||||||
exports.bundle = bundle;
|
exports.bundle = bundle;
|
||||||
function emitEntryPoints(modules, entryPoints) {
|
function emitEntryPoints(modules, entryPoints) {
|
||||||
var modulesMap = {};
|
const modulesMap = {};
|
||||||
modules.forEach(function (m) {
|
modules.forEach((m) => {
|
||||||
modulesMap[m.id] = m;
|
modulesMap[m.id] = m;
|
||||||
});
|
});
|
||||||
var modulesGraph = {};
|
const modulesGraph = {};
|
||||||
modules.forEach(function (m) {
|
modules.forEach((m) => {
|
||||||
modulesGraph[m.id] = m.dependencies;
|
modulesGraph[m.id] = m.dependencies;
|
||||||
});
|
});
|
||||||
var sortedModules = topologicalSort(modulesGraph);
|
const sortedModules = topologicalSort(modulesGraph);
|
||||||
var result = [];
|
let result = [];
|
||||||
var usedPlugins = {};
|
const usedPlugins = {};
|
||||||
var bundleData = {
|
const bundleData = {
|
||||||
graph: modulesGraph,
|
graph: modulesGraph,
|
||||||
bundles: {}
|
bundles: {}
|
||||||
};
|
};
|
||||||
Object.keys(entryPoints).forEach(function (moduleToBundle) {
|
Object.keys(entryPoints).forEach((moduleToBundle) => {
|
||||||
var info = entryPoints[moduleToBundle];
|
const info = entryPoints[moduleToBundle];
|
||||||
var rootNodes = [moduleToBundle].concat(info.include || []);
|
const rootNodes = [moduleToBundle].concat(info.include || []);
|
||||||
var allDependencies = visit(rootNodes, modulesGraph);
|
const allDependencies = visit(rootNodes, modulesGraph);
|
||||||
var excludes = ['require', 'exports', 'module'].concat(info.exclude || []);
|
const excludes = ['require', 'exports', 'module'].concat(info.exclude || []);
|
||||||
excludes.forEach(function (excludeRoot) {
|
excludes.forEach((excludeRoot) => {
|
||||||
var allExcludes = visit([excludeRoot], modulesGraph);
|
const allExcludes = visit([excludeRoot], modulesGraph);
|
||||||
Object.keys(allExcludes).forEach(function (exclude) {
|
Object.keys(allExcludes).forEach((exclude) => {
|
||||||
delete allDependencies[exclude];
|
delete allDependencies[exclude];
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
var includedModules = sortedModules.filter(function (module) {
|
const includedModules = sortedModules.filter((module) => {
|
||||||
return allDependencies[module];
|
return allDependencies[module];
|
||||||
});
|
});
|
||||||
bundleData.bundles[moduleToBundle] = includedModules;
|
bundleData.bundles[moduleToBundle] = includedModules;
|
||||||
var res = emitEntryPoint(modulesMap, modulesGraph, moduleToBundle, includedModules, info.prepend, info.append, info.dest);
|
const res = emitEntryPoint(modulesMap, modulesGraph, moduleToBundle, includedModules, info.prepend || [], info.append || [], info.dest);
|
||||||
result = result.concat(res.files);
|
result = result.concat(res.files);
|
||||||
for (var pluginName in res.usedPlugins) {
|
for (const pluginName in res.usedPlugins) {
|
||||||
usedPlugins[pluginName] = usedPlugins[pluginName] || res.usedPlugins[pluginName];
|
usedPlugins[pluginName] = usedPlugins[pluginName] || res.usedPlugins[pluginName];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Object.keys(usedPlugins).forEach(function (pluginName) {
|
Object.keys(usedPlugins).forEach((pluginName) => {
|
||||||
var plugin = usedPlugins[pluginName];
|
const plugin = usedPlugins[pluginName];
|
||||||
if (typeof plugin.finishBuild === 'function') {
|
if (typeof plugin.finishBuild === 'function') {
|
||||||
var write = function (filename, contents) {
|
const write = (filename, contents) => {
|
||||||
result.push({
|
result.push({
|
||||||
dest: filename,
|
dest: filename,
|
||||||
sources: [{
|
sources: [{
|
||||||
@@ -124,16 +128,16 @@ function emitEntryPoints(modules, entryPoints) {
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
function extractStrings(destFiles) {
|
function extractStrings(destFiles) {
|
||||||
var parseDefineCall = function (moduleMatch, depsMatch) {
|
const parseDefineCall = (moduleMatch, depsMatch) => {
|
||||||
var module = moduleMatch.replace(/^"|"$/g, '');
|
const module = moduleMatch.replace(/^"|"$/g, '');
|
||||||
var deps = depsMatch.split(',');
|
let deps = depsMatch.split(',');
|
||||||
deps = deps.map(function (dep) {
|
deps = deps.map((dep) => {
|
||||||
dep = dep.trim();
|
dep = dep.trim();
|
||||||
dep = dep.replace(/^"|"$/g, '');
|
dep = dep.replace(/^"|"$/g, '');
|
||||||
dep = dep.replace(/^'|'$/g, '');
|
dep = dep.replace(/^'|'$/g, '');
|
||||||
var prefix = null;
|
let prefix = null;
|
||||||
var _path = null;
|
let _path = null;
|
||||||
var pieces = dep.split('!');
|
const pieces = dep.split('!');
|
||||||
if (pieces.length > 1) {
|
if (pieces.length > 1) {
|
||||||
prefix = pieces[0] + '!';
|
prefix = pieces[0] + '!';
|
||||||
_path = pieces[1];
|
_path = pieces[1];
|
||||||
@@ -143,7 +147,7 @@ function extractStrings(destFiles) {
|
|||||||
_path = pieces[0];
|
_path = pieces[0];
|
||||||
}
|
}
|
||||||
if (/^\.\//.test(_path) || /^\.\.\//.test(_path)) {
|
if (/^\.\//.test(_path) || /^\.\.\//.test(_path)) {
|
||||||
var res = path.join(path.dirname(module), _path).replace(/\\/g, '/');
|
const res = path.join(path.dirname(module), _path).replace(/\\/g, '/');
|
||||||
return prefix + res;
|
return prefix + res;
|
||||||
}
|
}
|
||||||
return prefix + _path;
|
return prefix + _path;
|
||||||
@@ -153,7 +157,7 @@ function extractStrings(destFiles) {
|
|||||||
deps: deps
|
deps: deps
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
destFiles.forEach(function (destFile, index) {
|
destFiles.forEach((destFile) => {
|
||||||
if (!/\.js$/.test(destFile.dest)) {
|
if (!/\.js$/.test(destFile.dest)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -161,44 +165,44 @@ function extractStrings(destFiles) {
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
// Do one pass to record the usage counts for each module id
|
// Do one pass to record the usage counts for each module id
|
||||||
var useCounts = {};
|
const useCounts = {};
|
||||||
destFile.sources.forEach(function (source) {
|
destFile.sources.forEach((source) => {
|
||||||
var matches = source.contents.match(/define\(("[^"]+"),\s*\[(((, )?("|')[^"']+("|'))+)\]/);
|
const matches = source.contents.match(/define\(("[^"]+"),\s*\[(((, )?("|')[^"']+("|'))+)\]/);
|
||||||
if (!matches) {
|
if (!matches) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var defineCall = parseDefineCall(matches[1], matches[2]);
|
const defineCall = parseDefineCall(matches[1], matches[2]);
|
||||||
useCounts[defineCall.module] = (useCounts[defineCall.module] || 0) + 1;
|
useCounts[defineCall.module] = (useCounts[defineCall.module] || 0) + 1;
|
||||||
defineCall.deps.forEach(function (dep) {
|
defineCall.deps.forEach((dep) => {
|
||||||
useCounts[dep] = (useCounts[dep] || 0) + 1;
|
useCounts[dep] = (useCounts[dep] || 0) + 1;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
var sortedByUseModules = Object.keys(useCounts);
|
const sortedByUseModules = Object.keys(useCounts);
|
||||||
sortedByUseModules.sort(function (a, b) {
|
sortedByUseModules.sort((a, b) => {
|
||||||
return useCounts[b] - useCounts[a];
|
return useCounts[b] - useCounts[a];
|
||||||
});
|
});
|
||||||
var replacementMap = {};
|
const replacementMap = {};
|
||||||
sortedByUseModules.forEach(function (module, index) {
|
sortedByUseModules.forEach((module, index) => {
|
||||||
replacementMap[module] = index;
|
replacementMap[module] = index;
|
||||||
});
|
});
|
||||||
destFile.sources.forEach(function (source) {
|
destFile.sources.forEach((source) => {
|
||||||
source.contents = source.contents.replace(/define\(("[^"]+"),\s*\[(((, )?("|')[^"']+("|'))+)\]/, function (_, moduleMatch, depsMatch) {
|
source.contents = source.contents.replace(/define\(("[^"]+"),\s*\[(((, )?("|')[^"']+("|'))+)\]/, (_, moduleMatch, depsMatch) => {
|
||||||
var defineCall = parseDefineCall(moduleMatch, depsMatch);
|
const defineCall = parseDefineCall(moduleMatch, depsMatch);
|
||||||
return "define(__m[" + replacementMap[defineCall.module] + "/*" + defineCall.module + "*/], __M([" + defineCall.deps.map(function (dep) { return replacementMap[dep] + '/*' + dep + '*/'; }).join(',') + "])";
|
return `define(__m[${replacementMap[defineCall.module]}/*${defineCall.module}*/], __M([${defineCall.deps.map(dep => replacementMap[dep] + '/*' + dep + '*/').join(',')}])`;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
destFile.sources.unshift({
|
destFile.sources.unshift({
|
||||||
path: null,
|
path: null,
|
||||||
contents: [
|
contents: [
|
||||||
'(function() {',
|
'(function() {',
|
||||||
"var __m = " + JSON.stringify(sortedByUseModules) + ";",
|
`var __m = ${JSON.stringify(sortedByUseModules)};`,
|
||||||
"var __M = function(deps) {",
|
`var __M = function(deps) {`,
|
||||||
" var result = [];",
|
` var result = [];`,
|
||||||
" for (var i = 0, len = deps.length; i < len; i++) {",
|
` for (var i = 0, len = deps.length; i < len; i++) {`,
|
||||||
" result[i] = __m[deps[i]];",
|
` result[i] = __m[deps[i]];`,
|
||||||
" }",
|
` }`,
|
||||||
" return result;",
|
` return result;`,
|
||||||
"};"
|
`};`
|
||||||
].join('\n')
|
].join('\n')
|
||||||
});
|
});
|
||||||
destFile.sources.push({
|
destFile.sources.push({
|
||||||
@@ -210,7 +214,7 @@ function extractStrings(destFiles) {
|
|||||||
}
|
}
|
||||||
function removeDuplicateTSBoilerplate(destFiles) {
|
function removeDuplicateTSBoilerplate(destFiles) {
|
||||||
// Taken from typescript compiler => emitFiles
|
// Taken from typescript compiler => emitFiles
|
||||||
var BOILERPLATE = [
|
const BOILERPLATE = [
|
||||||
{ start: /^var __extends/, end: /^}\)\(\);$/ },
|
{ start: /^var __extends/, end: /^}\)\(\);$/ },
|
||||||
{ start: /^var __assign/, end: /^};$/ },
|
{ start: /^var __assign/, end: /^};$/ },
|
||||||
{ start: /^var __decorate/, end: /^};$/ },
|
{ start: /^var __decorate/, end: /^};$/ },
|
||||||
@@ -219,14 +223,14 @@ function removeDuplicateTSBoilerplate(destFiles) {
|
|||||||
{ start: /^var __awaiter/, end: /^};$/ },
|
{ start: /^var __awaiter/, end: /^};$/ },
|
||||||
{ start: /^var __generator/, end: /^};$/ },
|
{ start: /^var __generator/, end: /^};$/ },
|
||||||
];
|
];
|
||||||
destFiles.forEach(function (destFile) {
|
destFiles.forEach((destFile) => {
|
||||||
var SEEN_BOILERPLATE = [];
|
const SEEN_BOILERPLATE = [];
|
||||||
destFile.sources.forEach(function (source) {
|
destFile.sources.forEach((source) => {
|
||||||
var lines = source.contents.split(/\r\n|\n|\r/);
|
const lines = source.contents.split(/\r\n|\n|\r/);
|
||||||
var newLines = [];
|
const newLines = [];
|
||||||
var IS_REMOVING_BOILERPLATE = false, END_BOILERPLATE;
|
let IS_REMOVING_BOILERPLATE = false, END_BOILERPLATE;
|
||||||
for (var i = 0; i < lines.length; i++) {
|
for (let i = 0; i < lines.length; i++) {
|
||||||
var line = lines[i];
|
const line = lines[i];
|
||||||
if (IS_REMOVING_BOILERPLATE) {
|
if (IS_REMOVING_BOILERPLATE) {
|
||||||
newLines.push('');
|
newLines.push('');
|
||||||
if (END_BOILERPLATE.test(line)) {
|
if (END_BOILERPLATE.test(line)) {
|
||||||
@@ -234,8 +238,8 @@ function removeDuplicateTSBoilerplate(destFiles) {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
for (var j = 0; j < BOILERPLATE.length; j++) {
|
for (let j = 0; j < BOILERPLATE.length; j++) {
|
||||||
var boilerplate = BOILERPLATE[j];
|
const boilerplate = BOILERPLATE[j];
|
||||||
if (boilerplate.start.test(line)) {
|
if (boilerplate.start.test(line)) {
|
||||||
if (SEEN_BOILERPLATE[j]) {
|
if (SEEN_BOILERPLATE[j]) {
|
||||||
IS_REMOVING_BOILERPLATE = true;
|
IS_REMOVING_BOILERPLATE = true;
|
||||||
@@ -263,45 +267,45 @@ function emitEntryPoint(modulesMap, deps, entryPoint, includedModules, prepend,
|
|||||||
if (!dest) {
|
if (!dest) {
|
||||||
dest = entryPoint + '.js';
|
dest = entryPoint + '.js';
|
||||||
}
|
}
|
||||||
var mainResult = {
|
const mainResult = {
|
||||||
sources: [],
|
sources: [],
|
||||||
dest: dest
|
dest: dest
|
||||||
}, results = [mainResult];
|
}, results = [mainResult];
|
||||||
var usedPlugins = {};
|
const usedPlugins = {};
|
||||||
var getLoaderPlugin = function (pluginName) {
|
const getLoaderPlugin = (pluginName) => {
|
||||||
if (!usedPlugins[pluginName]) {
|
if (!usedPlugins[pluginName]) {
|
||||||
usedPlugins[pluginName] = modulesMap[pluginName].exports;
|
usedPlugins[pluginName] = modulesMap[pluginName].exports;
|
||||||
}
|
}
|
||||||
return usedPlugins[pluginName];
|
return usedPlugins[pluginName];
|
||||||
};
|
};
|
||||||
includedModules.forEach(function (c) {
|
includedModules.forEach((c) => {
|
||||||
var bangIndex = c.indexOf('!');
|
const bangIndex = c.indexOf('!');
|
||||||
if (bangIndex >= 0) {
|
if (bangIndex >= 0) {
|
||||||
var pluginName = c.substr(0, bangIndex);
|
const pluginName = c.substr(0, bangIndex);
|
||||||
var plugin = getLoaderPlugin(pluginName);
|
const plugin = getLoaderPlugin(pluginName);
|
||||||
mainResult.sources.push(emitPlugin(entryPoint, plugin, pluginName, c.substr(bangIndex + 1)));
|
mainResult.sources.push(emitPlugin(entryPoint, plugin, pluginName, c.substr(bangIndex + 1)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var module = modulesMap[c];
|
const module = modulesMap[c];
|
||||||
if (module.path === 'empty:') {
|
if (module.path === 'empty:') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
var contents = readFileAndRemoveBOM(module.path);
|
const contents = readFileAndRemoveBOM(module.path);
|
||||||
if (module.shim) {
|
if (module.shim) {
|
||||||
mainResult.sources.push(emitShimmedModule(c, deps[c], module.shim, module.path, contents));
|
mainResult.sources.push(emitShimmedModule(c, deps[c], module.shim, module.path, contents));
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
mainResult.sources.push(emitNamedModule(c, deps[c], module.defineLocation, module.path, contents));
|
mainResult.sources.push(emitNamedModule(c, module.defineLocation, module.path, contents));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
Object.keys(usedPlugins).forEach(function (pluginName) {
|
Object.keys(usedPlugins).forEach((pluginName) => {
|
||||||
var plugin = usedPlugins[pluginName];
|
const plugin = usedPlugins[pluginName];
|
||||||
if (typeof plugin.writeFile === 'function') {
|
if (typeof plugin.writeFile === 'function') {
|
||||||
var req = (function () {
|
const req = (() => {
|
||||||
throw new Error('no-no!');
|
throw new Error('no-no!');
|
||||||
});
|
});
|
||||||
req.toUrl = function (something) { return something; };
|
req.toUrl = something => something;
|
||||||
var write = function (filename, contents) {
|
const write = (filename, contents) => {
|
||||||
results.push({
|
results.push({
|
||||||
dest: filename,
|
dest: filename,
|
||||||
sources: [{
|
sources: [{
|
||||||
@@ -313,15 +317,15 @@ function emitEntryPoint(modulesMap, deps, entryPoint, includedModules, prepend,
|
|||||||
plugin.writeFile(pluginName, entryPoint, req, write, {});
|
plugin.writeFile(pluginName, entryPoint, req, write, {});
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
var toIFile = function (path) {
|
const toIFile = (path) => {
|
||||||
var contents = readFileAndRemoveBOM(path);
|
const contents = readFileAndRemoveBOM(path);
|
||||||
return {
|
return {
|
||||||
path: path,
|
path: path,
|
||||||
contents: contents
|
contents: contents
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
var toPrepend = (prepend || []).map(toIFile);
|
const toPrepend = (prepend || []).map(toIFile);
|
||||||
var toAppend = (append || []).map(toIFile);
|
const toAppend = (append || []).map(toIFile);
|
||||||
mainResult.sources = toPrepend.concat(mainResult.sources).concat(toAppend);
|
mainResult.sources = toPrepend.concat(mainResult.sources).concat(toAppend);
|
||||||
return {
|
return {
|
||||||
files: results,
|
files: results,
|
||||||
@@ -329,8 +333,8 @@ function emitEntryPoint(modulesMap, deps, entryPoint, includedModules, prepend,
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
function readFileAndRemoveBOM(path) {
|
function readFileAndRemoveBOM(path) {
|
||||||
var BOM_CHAR_CODE = 65279;
|
const BOM_CHAR_CODE = 65279;
|
||||||
var contents = fs.readFileSync(path, 'utf8');
|
let contents = fs.readFileSync(path, 'utf8');
|
||||||
// Remove BOM
|
// Remove BOM
|
||||||
if (contents.charCodeAt(0) === BOM_CHAR_CODE) {
|
if (contents.charCodeAt(0) === BOM_CHAR_CODE) {
|
||||||
contents = contents.substring(1);
|
contents = contents.substring(1);
|
||||||
@@ -338,15 +342,15 @@ function readFileAndRemoveBOM(path) {
|
|||||||
return contents;
|
return contents;
|
||||||
}
|
}
|
||||||
function emitPlugin(entryPoint, plugin, pluginName, moduleName) {
|
function emitPlugin(entryPoint, plugin, pluginName, moduleName) {
|
||||||
var result = '';
|
let result = '';
|
||||||
if (typeof plugin.write === 'function') {
|
if (typeof plugin.write === 'function') {
|
||||||
var write = (function (what) {
|
const write = ((what) => {
|
||||||
result += what;
|
result += what;
|
||||||
});
|
});
|
||||||
write.getEntryPoint = function () {
|
write.getEntryPoint = () => {
|
||||||
return entryPoint;
|
return entryPoint;
|
||||||
};
|
};
|
||||||
write.asModule = function (moduleId, code) {
|
write.asModule = (moduleId, code) => {
|
||||||
code = code.replace(/^define\(/, 'define("' + moduleId + '",');
|
code = code.replace(/^define\(/, 'define("' + moduleId + '",');
|
||||||
result += code;
|
result += code;
|
||||||
};
|
};
|
||||||
@@ -357,20 +361,20 @@ function emitPlugin(entryPoint, plugin, pluginName, moduleName) {
|
|||||||
contents: result
|
contents: result
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
function emitNamedModule(moduleId, myDeps, defineCallPosition, path, contents) {
|
function emitNamedModule(moduleId, defineCallPosition, path, contents) {
|
||||||
// `defineCallPosition` is the position in code: |define()
|
// `defineCallPosition` is the position in code: |define()
|
||||||
var defineCallOffset = positionToOffset(contents, defineCallPosition.line, defineCallPosition.col);
|
const defineCallOffset = positionToOffset(contents, defineCallPosition.line, defineCallPosition.col);
|
||||||
// `parensOffset` is the position in code: define|()
|
// `parensOffset` is the position in code: define|()
|
||||||
var parensOffset = contents.indexOf('(', defineCallOffset);
|
const parensOffset = contents.indexOf('(', defineCallOffset);
|
||||||
var insertStr = '"' + moduleId + '", ';
|
const insertStr = '"' + moduleId + '", ';
|
||||||
return {
|
return {
|
||||||
path: path,
|
path: path,
|
||||||
contents: contents.substr(0, parensOffset + 1) + insertStr + contents.substr(parensOffset + 1)
|
contents: contents.substr(0, parensOffset + 1) + insertStr + contents.substr(parensOffset + 1)
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
function emitShimmedModule(moduleId, myDeps, factory, path, contents) {
|
function emitShimmedModule(moduleId, myDeps, factory, path, contents) {
|
||||||
var strDeps = (myDeps.length > 0 ? '"' + myDeps.join('", "') + '"' : '');
|
const strDeps = (myDeps.length > 0 ? '"' + myDeps.join('", "') + '"' : '');
|
||||||
var strDefine = 'define("' + moduleId + '", [' + strDeps + '], ' + factory + ');';
|
const strDefine = 'define("' + moduleId + '", [' + strDeps + '], ' + factory + ');';
|
||||||
return {
|
return {
|
||||||
path: path,
|
path: path,
|
||||||
contents: contents + '\n;\n' + strDefine
|
contents: contents + '\n;\n' + strDefine
|
||||||
@@ -383,7 +387,8 @@ function positionToOffset(str, desiredLine, desiredCol) {
|
|||||||
if (desiredLine === 1) {
|
if (desiredLine === 1) {
|
||||||
return desiredCol - 1;
|
return desiredCol - 1;
|
||||||
}
|
}
|
||||||
var line = 1, lastNewLineOffset = -1;
|
let line = 1;
|
||||||
|
let lastNewLineOffset = -1;
|
||||||
do {
|
do {
|
||||||
if (desiredLine === line) {
|
if (desiredLine === line) {
|
||||||
return lastNewLineOffset + 1 + desiredCol - 1;
|
return lastNewLineOffset + 1 + desiredCol - 1;
|
||||||
@@ -397,14 +402,15 @@ function positionToOffset(str, desiredLine, desiredCol) {
|
|||||||
* Return a set of reachable nodes in `graph` starting from `rootNodes`
|
* Return a set of reachable nodes in `graph` starting from `rootNodes`
|
||||||
*/
|
*/
|
||||||
function visit(rootNodes, graph) {
|
function visit(rootNodes, graph) {
|
||||||
var result = {}, queue = rootNodes;
|
const result = {};
|
||||||
rootNodes.forEach(function (node) {
|
const queue = rootNodes;
|
||||||
|
rootNodes.forEach((node) => {
|
||||||
result[node] = true;
|
result[node] = true;
|
||||||
});
|
});
|
||||||
while (queue.length > 0) {
|
while (queue.length > 0) {
|
||||||
var el = queue.shift();
|
const el = queue.shift();
|
||||||
var myEdges = graph[el] || [];
|
const myEdges = graph[el] || [];
|
||||||
myEdges.forEach(function (toNode) {
|
myEdges.forEach((toNode) => {
|
||||||
if (!result[toNode]) {
|
if (!result[toNode]) {
|
||||||
result[toNode] = true;
|
result[toNode] = true;
|
||||||
queue.push(toNode);
|
queue.push(toNode);
|
||||||
@@ -417,11 +423,11 @@ function visit(rootNodes, graph) {
|
|||||||
* Perform a topological sort on `graph`
|
* Perform a topological sort on `graph`
|
||||||
*/
|
*/
|
||||||
function topologicalSort(graph) {
|
function topologicalSort(graph) {
|
||||||
var allNodes = {}, outgoingEdgeCount = {}, inverseEdges = {};
|
const allNodes = {}, outgoingEdgeCount = {}, inverseEdges = {};
|
||||||
Object.keys(graph).forEach(function (fromNode) {
|
Object.keys(graph).forEach((fromNode) => {
|
||||||
allNodes[fromNode] = true;
|
allNodes[fromNode] = true;
|
||||||
outgoingEdgeCount[fromNode] = graph[fromNode].length;
|
outgoingEdgeCount[fromNode] = graph[fromNode].length;
|
||||||
graph[fromNode].forEach(function (toNode) {
|
graph[fromNode].forEach((toNode) => {
|
||||||
allNodes[toNode] = true;
|
allNodes[toNode] = true;
|
||||||
outgoingEdgeCount[toNode] = outgoingEdgeCount[toNode] || 0;
|
outgoingEdgeCount[toNode] = outgoingEdgeCount[toNode] || 0;
|
||||||
inverseEdges[toNode] = inverseEdges[toNode] || [];
|
inverseEdges[toNode] = inverseEdges[toNode] || [];
|
||||||
@@ -429,8 +435,8 @@ function topologicalSort(graph) {
|
|||||||
});
|
});
|
||||||
});
|
});
|
||||||
// https://en.wikipedia.org/wiki/Topological_sorting
|
// https://en.wikipedia.org/wiki/Topological_sorting
|
||||||
var S = [], L = [];
|
const S = [], L = [];
|
||||||
Object.keys(allNodes).forEach(function (node) {
|
Object.keys(allNodes).forEach((node) => {
|
||||||
if (outgoingEdgeCount[node] === 0) {
|
if (outgoingEdgeCount[node] === 0) {
|
||||||
delete outgoingEdgeCount[node];
|
delete outgoingEdgeCount[node];
|
||||||
S.push(node);
|
S.push(node);
|
||||||
@@ -439,10 +445,10 @@ function topologicalSort(graph) {
|
|||||||
while (S.length > 0) {
|
while (S.length > 0) {
|
||||||
// Ensure the exact same order all the time with the same inputs
|
// Ensure the exact same order all the time with the same inputs
|
||||||
S.sort();
|
S.sort();
|
||||||
var n = S.shift();
|
const n = S.shift();
|
||||||
L.push(n);
|
L.push(n);
|
||||||
var myInverseEdges = inverseEdges[n] || [];
|
const myInverseEdges = inverseEdges[n] || [];
|
||||||
myInverseEdges.forEach(function (m) {
|
myInverseEdges.forEach((m) => {
|
||||||
outgoingEdgeCount[m]--;
|
outgoingEdgeCount[m]--;
|
||||||
if (outgoingEdgeCount[m] === 0) {
|
if (outgoingEdgeCount[m] === 0) {
|
||||||
delete outgoingEdgeCount[m];
|
delete outgoingEdgeCount[m];
|
||||||
|
|||||||
@@ -3,9 +3,9 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import fs = require('fs');
|
import * as fs from 'fs';
|
||||||
import path = require('path');
|
import * as path from 'path';
|
||||||
import vm = require('vm');
|
import * as vm from 'vm';
|
||||||
|
|
||||||
interface IPosition {
|
interface IPosition {
|
||||||
line: number;
|
line: number;
|
||||||
@@ -46,7 +46,7 @@ export interface IEntryPoint {
|
|||||||
name: string;
|
name: string;
|
||||||
include?: string[];
|
include?: string[];
|
||||||
exclude?: string[];
|
exclude?: string[];
|
||||||
prepend: string[];
|
prepend?: string[];
|
||||||
append?: string[];
|
append?: string[];
|
||||||
dest?: string;
|
dest?: string;
|
||||||
}
|
}
|
||||||
@@ -64,7 +64,7 @@ interface INodeSet {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export interface IFile {
|
export interface IFile {
|
||||||
path: string;
|
path: string | null;
|
||||||
contents: string;
|
contents: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -97,13 +97,13 @@ export interface ILoaderConfig {
|
|||||||
/**
|
/**
|
||||||
* Bundle `entryPoints` given config `config`.
|
* Bundle `entryPoints` given config `config`.
|
||||||
*/
|
*/
|
||||||
export function bundle(entryPoints: IEntryPoint[], config: ILoaderConfig, callback: (err: any, result: IBundleResult) => void): void {
|
export function bundle(entryPoints: IEntryPoint[], config: ILoaderConfig, callback: (err: any, result: IBundleResult | null) => void): void {
|
||||||
let entryPointsMap: IEntryPointMap = {};
|
const entryPointsMap: IEntryPointMap = {};
|
||||||
entryPoints.forEach((module: IEntryPoint) => {
|
entryPoints.forEach((module: IEntryPoint) => {
|
||||||
entryPointsMap[module.name] = module;
|
entryPointsMap[module.name] = module;
|
||||||
});
|
});
|
||||||
|
|
||||||
let allMentionedModulesMap: { [modules: string]: boolean; } = {};
|
const allMentionedModulesMap: { [modules: string]: boolean; } = {};
|
||||||
entryPoints.forEach((module: IEntryPoint) => {
|
entryPoints.forEach((module: IEntryPoint) => {
|
||||||
allMentionedModulesMap[module.name] = true;
|
allMentionedModulesMap[module.name] = true;
|
||||||
(module.include || []).forEach(function (includedModule) {
|
(module.include || []).forEach(function (includedModule) {
|
||||||
@@ -115,28 +115,32 @@ export function bundle(entryPoints: IEntryPoint[], config: ILoaderConfig, callba
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
var code = require('fs').readFileSync(path.join(__dirname, '../../src/vs/loader.js'));
|
const code = require('fs').readFileSync(path.join(__dirname, '../../src/vs/loader.js'));
|
||||||
var r: Function = <any>vm.runInThisContext('(function(require, module, exports) { ' + code + '\n});');
|
const r: Function = <any>vm.runInThisContext('(function(require, module, exports) { ' + code + '\n});');
|
||||||
var loaderModule = { exports: {} };
|
const loaderModule = { exports: {} };
|
||||||
r.call({}, require, loaderModule, loaderModule.exports);
|
r.call({}, require, loaderModule, loaderModule.exports);
|
||||||
|
|
||||||
var loader: any = loaderModule.exports;
|
const loader: any = loaderModule.exports;
|
||||||
config.isBuild = true;
|
config.isBuild = true;
|
||||||
config.paths = config.paths || {};
|
config.paths = config.paths || {};
|
||||||
config.paths['vs/nls'] = 'out-build/vs/nls.build';
|
if (!config.paths['vs/nls']) {
|
||||||
config.paths['vs/css'] = 'out-build/vs/css.build';
|
config.paths['vs/nls'] = 'out-build/vs/nls.build';
|
||||||
|
}
|
||||||
|
if (!config.paths['vs/css']) {
|
||||||
|
config.paths['vs/css'] = 'out-build/vs/css.build';
|
||||||
|
}
|
||||||
loader.config(config);
|
loader.config(config);
|
||||||
|
|
||||||
loader(['require'], (localRequire) => {
|
loader(['require'], (localRequire: any) => {
|
||||||
let resolvePath = (path: string) => {
|
const resolvePath = (path: string) => {
|
||||||
let r = localRequire.toUrl(path);
|
const r = localRequire.toUrl(path);
|
||||||
if (!/\.js/.test(r)) {
|
if (!/\.js/.test(r)) {
|
||||||
return r + '.js';
|
return r + '.js';
|
||||||
}
|
}
|
||||||
return r;
|
return r;
|
||||||
};
|
};
|
||||||
for (let moduleId in entryPointsMap) {
|
for (const moduleId in entryPointsMap) {
|
||||||
let entryPoint = entryPointsMap[moduleId];
|
const entryPoint = entryPointsMap[moduleId];
|
||||||
if (entryPoint.append) {
|
if (entryPoint.append) {
|
||||||
entryPoint.append = entryPoint.append.map(resolvePath);
|
entryPoint.append = entryPoint.append.map(resolvePath);
|
||||||
}
|
}
|
||||||
@@ -147,76 +151,76 @@ export function bundle(entryPoints: IEntryPoint[], config: ILoaderConfig, callba
|
|||||||
});
|
});
|
||||||
|
|
||||||
loader(Object.keys(allMentionedModulesMap), () => {
|
loader(Object.keys(allMentionedModulesMap), () => {
|
||||||
let modules = <IBuildModuleInfo[]>loader.getBuildInfo();
|
const modules = <IBuildModuleInfo[]>loader.getBuildInfo();
|
||||||
let partialResult = emitEntryPoints(modules, entryPointsMap);
|
const partialResult = emitEntryPoints(modules, entryPointsMap);
|
||||||
let cssInlinedResources = loader('vs/css').getInlinedResources();
|
const cssInlinedResources = loader('vs/css').getInlinedResources();
|
||||||
callback(null, {
|
callback(null, {
|
||||||
files: partialResult.files,
|
files: partialResult.files,
|
||||||
cssInlinedResources: cssInlinedResources,
|
cssInlinedResources: cssInlinedResources,
|
||||||
bundleData: partialResult.bundleData
|
bundleData: partialResult.bundleData
|
||||||
});
|
});
|
||||||
}, (err) => callback(err, null));
|
}, (err: any) => callback(err, null));
|
||||||
}
|
}
|
||||||
|
|
||||||
function emitEntryPoints(modules: IBuildModuleInfo[], entryPoints: IEntryPointMap): IPartialBundleResult {
|
function emitEntryPoints(modules: IBuildModuleInfo[], entryPoints: IEntryPointMap): IPartialBundleResult {
|
||||||
let modulesMap: IBuildModuleInfoMap = {};
|
const modulesMap: IBuildModuleInfoMap = {};
|
||||||
modules.forEach((m: IBuildModuleInfo) => {
|
modules.forEach((m: IBuildModuleInfo) => {
|
||||||
modulesMap[m.id] = m;
|
modulesMap[m.id] = m;
|
||||||
});
|
});
|
||||||
|
|
||||||
let modulesGraph: IGraph = {};
|
const modulesGraph: IGraph = {};
|
||||||
modules.forEach((m: IBuildModuleInfo) => {
|
modules.forEach((m: IBuildModuleInfo) => {
|
||||||
modulesGraph[m.id] = m.dependencies;
|
modulesGraph[m.id] = m.dependencies;
|
||||||
});
|
});
|
||||||
|
|
||||||
let sortedModules = topologicalSort(modulesGraph);
|
const sortedModules = topologicalSort(modulesGraph);
|
||||||
|
|
||||||
let result: IConcatFile[] = [];
|
let result: IConcatFile[] = [];
|
||||||
let usedPlugins: IPluginMap = {};
|
const usedPlugins: IPluginMap = {};
|
||||||
let bundleData: IBundleData = {
|
const bundleData: IBundleData = {
|
||||||
graph: modulesGraph,
|
graph: modulesGraph,
|
||||||
bundles: {}
|
bundles: {}
|
||||||
};
|
};
|
||||||
|
|
||||||
Object.keys(entryPoints).forEach((moduleToBundle: string) => {
|
Object.keys(entryPoints).forEach((moduleToBundle: string) => {
|
||||||
let info = entryPoints[moduleToBundle];
|
const info = entryPoints[moduleToBundle];
|
||||||
let rootNodes = [moduleToBundle].concat(info.include || []);
|
const rootNodes = [moduleToBundle].concat(info.include || []);
|
||||||
let allDependencies = visit(rootNodes, modulesGraph);
|
const allDependencies = visit(rootNodes, modulesGraph);
|
||||||
let excludes: string[] = ['require', 'exports', 'module'].concat(info.exclude || []);
|
const excludes: string[] = ['require', 'exports', 'module'].concat(info.exclude || []);
|
||||||
|
|
||||||
excludes.forEach((excludeRoot: string) => {
|
excludes.forEach((excludeRoot: string) => {
|
||||||
let allExcludes = visit([excludeRoot], modulesGraph);
|
const allExcludes = visit([excludeRoot], modulesGraph);
|
||||||
Object.keys(allExcludes).forEach((exclude: string) => {
|
Object.keys(allExcludes).forEach((exclude: string) => {
|
||||||
delete allDependencies[exclude];
|
delete allDependencies[exclude];
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
let includedModules = sortedModules.filter((module: string) => {
|
const includedModules = sortedModules.filter((module: string) => {
|
||||||
return allDependencies[module];
|
return allDependencies[module];
|
||||||
});
|
});
|
||||||
|
|
||||||
bundleData.bundles[moduleToBundle] = includedModules;
|
bundleData.bundles[moduleToBundle] = includedModules;
|
||||||
|
|
||||||
let res = emitEntryPoint(
|
const res = emitEntryPoint(
|
||||||
modulesMap,
|
modulesMap,
|
||||||
modulesGraph,
|
modulesGraph,
|
||||||
moduleToBundle,
|
moduleToBundle,
|
||||||
includedModules,
|
includedModules,
|
||||||
info.prepend,
|
info.prepend || [],
|
||||||
info.append,
|
info.append || [],
|
||||||
info.dest
|
info.dest
|
||||||
);
|
);
|
||||||
|
|
||||||
result = result.concat(res.files);
|
result = result.concat(res.files);
|
||||||
for (let pluginName in res.usedPlugins) {
|
for (const pluginName in res.usedPlugins) {
|
||||||
usedPlugins[pluginName] = usedPlugins[pluginName] || res.usedPlugins[pluginName];
|
usedPlugins[pluginName] = usedPlugins[pluginName] || res.usedPlugins[pluginName];
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Object.keys(usedPlugins).forEach((pluginName: string) => {
|
Object.keys(usedPlugins).forEach((pluginName: string) => {
|
||||||
let plugin = usedPlugins[pluginName];
|
const plugin = usedPlugins[pluginName];
|
||||||
if (typeof plugin.finishBuild === 'function') {
|
if (typeof plugin.finishBuild === 'function') {
|
||||||
let write = (filename: string, contents: string) => {
|
const write = (filename: string, contents: string) => {
|
||||||
result.push({
|
result.push({
|
||||||
dest: filename,
|
dest: filename,
|
||||||
sources: [{
|
sources: [{
|
||||||
@@ -237,16 +241,16 @@ function emitEntryPoints(modules: IBuildModuleInfo[], entryPoints: IEntryPointMa
|
|||||||
}
|
}
|
||||||
|
|
||||||
function extractStrings(destFiles: IConcatFile[]): IConcatFile[] {
|
function extractStrings(destFiles: IConcatFile[]): IConcatFile[] {
|
||||||
let parseDefineCall = (moduleMatch: string, depsMatch: string) => {
|
const parseDefineCall = (moduleMatch: string, depsMatch: string) => {
|
||||||
let module = moduleMatch.replace(/^"|"$/g, '');
|
const module = moduleMatch.replace(/^"|"$/g, '');
|
||||||
let deps = depsMatch.split(',');
|
let deps = depsMatch.split(',');
|
||||||
deps = deps.map((dep) => {
|
deps = deps.map((dep) => {
|
||||||
dep = dep.trim();
|
dep = dep.trim();
|
||||||
dep = dep.replace(/^"|"$/g, '');
|
dep = dep.replace(/^"|"$/g, '');
|
||||||
dep = dep.replace(/^'|'$/g, '');
|
dep = dep.replace(/^'|'$/g, '');
|
||||||
let prefix: string = null;
|
let prefix: string | null = null;
|
||||||
let _path: string = null;
|
let _path: string | null = null;
|
||||||
let pieces = dep.split('!');
|
const pieces = dep.split('!');
|
||||||
if (pieces.length > 1) {
|
if (pieces.length > 1) {
|
||||||
prefix = pieces[0] + '!';
|
prefix = pieces[0] + '!';
|
||||||
_path = pieces[1];
|
_path = pieces[1];
|
||||||
@@ -256,7 +260,7 @@ function extractStrings(destFiles: IConcatFile[]): IConcatFile[] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (/^\.\//.test(_path) || /^\.\.\//.test(_path)) {
|
if (/^\.\//.test(_path) || /^\.\.\//.test(_path)) {
|
||||||
let res = path.join(path.dirname(module), _path).replace(/\\/g, '/');
|
const res = path.join(path.dirname(module), _path).replace(/\\/g, '/');
|
||||||
return prefix + res;
|
return prefix + res;
|
||||||
}
|
}
|
||||||
return prefix + _path;
|
return prefix + _path;
|
||||||
@@ -267,7 +271,7 @@ function extractStrings(destFiles: IConcatFile[]): IConcatFile[] {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
destFiles.forEach((destFile, index) => {
|
destFiles.forEach((destFile) => {
|
||||||
if (!/\.js$/.test(destFile.dest)) {
|
if (!/\.js$/.test(destFile.dest)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
@@ -276,33 +280,33 @@ function extractStrings(destFiles: IConcatFile[]): IConcatFile[] {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// Do one pass to record the usage counts for each module id
|
// Do one pass to record the usage counts for each module id
|
||||||
let useCounts: { [moduleId: string]: number; } = {};
|
const useCounts: { [moduleId: string]: number; } = {};
|
||||||
destFile.sources.forEach((source) => {
|
destFile.sources.forEach((source) => {
|
||||||
let matches = source.contents.match(/define\(("[^"]+"),\s*\[(((, )?("|')[^"']+("|'))+)\]/);
|
const matches = source.contents.match(/define\(("[^"]+"),\s*\[(((, )?("|')[^"']+("|'))+)\]/);
|
||||||
if (!matches) {
|
if (!matches) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let defineCall = parseDefineCall(matches[1], matches[2]);
|
const defineCall = parseDefineCall(matches[1], matches[2]);
|
||||||
useCounts[defineCall.module] = (useCounts[defineCall.module] || 0) + 1;
|
useCounts[defineCall.module] = (useCounts[defineCall.module] || 0) + 1;
|
||||||
defineCall.deps.forEach((dep) => {
|
defineCall.deps.forEach((dep) => {
|
||||||
useCounts[dep] = (useCounts[dep] || 0) + 1;
|
useCounts[dep] = (useCounts[dep] || 0) + 1;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
|
|
||||||
let sortedByUseModules = Object.keys(useCounts);
|
const sortedByUseModules = Object.keys(useCounts);
|
||||||
sortedByUseModules.sort((a, b) => {
|
sortedByUseModules.sort((a, b) => {
|
||||||
return useCounts[b] - useCounts[a];
|
return useCounts[b] - useCounts[a];
|
||||||
});
|
});
|
||||||
|
|
||||||
let replacementMap: { [moduleId: string]: number; } = {};
|
const replacementMap: { [moduleId: string]: number; } = {};
|
||||||
sortedByUseModules.forEach((module, index) => {
|
sortedByUseModules.forEach((module, index) => {
|
||||||
replacementMap[module] = index;
|
replacementMap[module] = index;
|
||||||
});
|
});
|
||||||
|
|
||||||
destFile.sources.forEach((source) => {
|
destFile.sources.forEach((source) => {
|
||||||
source.contents = source.contents.replace(/define\(("[^"]+"),\s*\[(((, )?("|')[^"']+("|'))+)\]/, (_, moduleMatch, depsMatch) => {
|
source.contents = source.contents.replace(/define\(("[^"]+"),\s*\[(((, )?("|')[^"']+("|'))+)\]/, (_, moduleMatch, depsMatch) => {
|
||||||
let defineCall = parseDefineCall(moduleMatch, depsMatch);
|
const defineCall = parseDefineCall(moduleMatch, depsMatch);
|
||||||
return `define(__m[${replacementMap[defineCall.module]}/*${defineCall.module}*/], __M([${defineCall.deps.map(dep => replacementMap[dep] + '/*' + dep + '*/').join(',')}])`;
|
return `define(__m[${replacementMap[defineCall.module]}/*${defineCall.module}*/], __M([${defineCall.deps.map(dep => replacementMap[dep] + '/*' + dep + '*/').join(',')}])`;
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
@@ -332,7 +336,7 @@ function extractStrings(destFiles: IConcatFile[]): IConcatFile[] {
|
|||||||
|
|
||||||
function removeDuplicateTSBoilerplate(destFiles: IConcatFile[]): IConcatFile[] {
|
function removeDuplicateTSBoilerplate(destFiles: IConcatFile[]): IConcatFile[] {
|
||||||
// Taken from typescript compiler => emitFiles
|
// Taken from typescript compiler => emitFiles
|
||||||
let BOILERPLATE = [
|
const BOILERPLATE = [
|
||||||
{ start: /^var __extends/, end: /^}\)\(\);$/ },
|
{ start: /^var __extends/, end: /^}\)\(\);$/ },
|
||||||
{ start: /^var __assign/, end: /^};$/ },
|
{ start: /^var __assign/, end: /^};$/ },
|
||||||
{ start: /^var __decorate/, end: /^};$/ },
|
{ start: /^var __decorate/, end: /^};$/ },
|
||||||
@@ -343,22 +347,22 @@ function removeDuplicateTSBoilerplate(destFiles: IConcatFile[]): IConcatFile[] {
|
|||||||
];
|
];
|
||||||
|
|
||||||
destFiles.forEach((destFile) => {
|
destFiles.forEach((destFile) => {
|
||||||
let SEEN_BOILERPLATE = [];
|
const SEEN_BOILERPLATE: boolean[] = [];
|
||||||
destFile.sources.forEach((source) => {
|
destFile.sources.forEach((source) => {
|
||||||
let lines = source.contents.split(/\r\n|\n|\r/);
|
const lines = source.contents.split(/\r\n|\n|\r/);
|
||||||
let newLines: string[] = [];
|
const newLines: string[] = [];
|
||||||
let IS_REMOVING_BOILERPLATE = false, END_BOILERPLATE: RegExp;
|
let IS_REMOVING_BOILERPLATE = false, END_BOILERPLATE: RegExp;
|
||||||
|
|
||||||
for (let i = 0; i < lines.length; i++) {
|
for (let i = 0; i < lines.length; i++) {
|
||||||
let line = lines[i];
|
const line = lines[i];
|
||||||
if (IS_REMOVING_BOILERPLATE) {
|
if (IS_REMOVING_BOILERPLATE) {
|
||||||
newLines.push('');
|
newLines.push('');
|
||||||
if (END_BOILERPLATE.test(line)) {
|
if (END_BOILERPLATE!.test(line)) {
|
||||||
IS_REMOVING_BOILERPLATE = false;
|
IS_REMOVING_BOILERPLATE = false;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
for (let j = 0; j < BOILERPLATE.length; j++) {
|
for (let j = 0; j < BOILERPLATE.length; j++) {
|
||||||
let boilerplate = BOILERPLATE[j];
|
const boilerplate = BOILERPLATE[j];
|
||||||
if (boilerplate.start.test(line)) {
|
if (boilerplate.start.test(line)) {
|
||||||
if (SEEN_BOILERPLATE[j]) {
|
if (SEEN_BOILERPLATE[j]) {
|
||||||
IS_REMOVING_BOILERPLATE = true;
|
IS_REMOVING_BOILERPLATE = true;
|
||||||
@@ -398,19 +402,19 @@ function emitEntryPoint(
|
|||||||
includedModules: string[],
|
includedModules: string[],
|
||||||
prepend: string[],
|
prepend: string[],
|
||||||
append: string[],
|
append: string[],
|
||||||
dest: string
|
dest: string | undefined
|
||||||
): IEmitEntryPointResult {
|
): IEmitEntryPointResult {
|
||||||
if (!dest) {
|
if (!dest) {
|
||||||
dest = entryPoint + '.js';
|
dest = entryPoint + '.js';
|
||||||
}
|
}
|
||||||
let mainResult: IConcatFile = {
|
const mainResult: IConcatFile = {
|
||||||
sources: [],
|
sources: [],
|
||||||
dest: dest
|
dest: dest
|
||||||
},
|
},
|
||||||
results: IConcatFile[] = [mainResult];
|
results: IConcatFile[] = [mainResult];
|
||||||
|
|
||||||
let usedPlugins: IPluginMap = {};
|
const usedPlugins: IPluginMap = {};
|
||||||
let getLoaderPlugin = (pluginName: string): ILoaderPlugin => {
|
const getLoaderPlugin = (pluginName: string): ILoaderPlugin => {
|
||||||
if (!usedPlugins[pluginName]) {
|
if (!usedPlugins[pluginName]) {
|
||||||
usedPlugins[pluginName] = modulesMap[pluginName].exports;
|
usedPlugins[pluginName] = modulesMap[pluginName].exports;
|
||||||
}
|
}
|
||||||
@@ -418,39 +422,39 @@ function emitEntryPoint(
|
|||||||
};
|
};
|
||||||
|
|
||||||
includedModules.forEach((c: string) => {
|
includedModules.forEach((c: string) => {
|
||||||
let bangIndex = c.indexOf('!');
|
const bangIndex = c.indexOf('!');
|
||||||
|
|
||||||
if (bangIndex >= 0) {
|
if (bangIndex >= 0) {
|
||||||
let pluginName = c.substr(0, bangIndex);
|
const pluginName = c.substr(0, bangIndex);
|
||||||
let plugin = getLoaderPlugin(pluginName);
|
const plugin = getLoaderPlugin(pluginName);
|
||||||
mainResult.sources.push(emitPlugin(entryPoint, plugin, pluginName, c.substr(bangIndex + 1)));
|
mainResult.sources.push(emitPlugin(entryPoint, plugin, pluginName, c.substr(bangIndex + 1)));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let module = modulesMap[c];
|
const module = modulesMap[c];
|
||||||
|
|
||||||
if (module.path === 'empty:') {
|
if (module.path === 'empty:') {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
let contents = readFileAndRemoveBOM(module.path);
|
const contents = readFileAndRemoveBOM(module.path);
|
||||||
|
|
||||||
if (module.shim) {
|
if (module.shim) {
|
||||||
mainResult.sources.push(emitShimmedModule(c, deps[c], module.shim, module.path, contents));
|
mainResult.sources.push(emitShimmedModule(c, deps[c], module.shim, module.path, contents));
|
||||||
} else {
|
} else {
|
||||||
mainResult.sources.push(emitNamedModule(c, deps[c], module.defineLocation, module.path, contents));
|
mainResult.sources.push(emitNamedModule(c, module.defineLocation, module.path, contents));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
Object.keys(usedPlugins).forEach((pluginName: string) => {
|
Object.keys(usedPlugins).forEach((pluginName: string) => {
|
||||||
let plugin = usedPlugins[pluginName];
|
const plugin = usedPlugins[pluginName];
|
||||||
if (typeof plugin.writeFile === 'function') {
|
if (typeof plugin.writeFile === 'function') {
|
||||||
let req: ILoaderPluginReqFunc = <any>(() => {
|
const req: ILoaderPluginReqFunc = <any>(() => {
|
||||||
throw new Error('no-no!');
|
throw new Error('no-no!');
|
||||||
});
|
});
|
||||||
req.toUrl = something => something;
|
req.toUrl = something => something;
|
||||||
|
|
||||||
let write = (filename: string, contents: string) => {
|
const write = (filename: string, contents: string) => {
|
||||||
results.push({
|
results.push({
|
||||||
dest: filename,
|
dest: filename,
|
||||||
sources: [{
|
sources: [{
|
||||||
@@ -463,16 +467,16 @@ function emitEntryPoint(
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
let toIFile = (path): IFile => {
|
const toIFile = (path: string): IFile => {
|
||||||
let contents = readFileAndRemoveBOM(path);
|
const contents = readFileAndRemoveBOM(path);
|
||||||
return {
|
return {
|
||||||
path: path,
|
path: path,
|
||||||
contents: contents
|
contents: contents
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
let toPrepend = (prepend || []).map(toIFile);
|
const toPrepend = (prepend || []).map(toIFile);
|
||||||
let toAppend = (append || []).map(toIFile);
|
const toAppend = (append || []).map(toIFile);
|
||||||
|
|
||||||
mainResult.sources = toPrepend.concat(mainResult.sources).concat(toAppend);
|
mainResult.sources = toPrepend.concat(mainResult.sources).concat(toAppend);
|
||||||
|
|
||||||
@@ -483,8 +487,8 @@ function emitEntryPoint(
|
|||||||
}
|
}
|
||||||
|
|
||||||
function readFileAndRemoveBOM(path: string): string {
|
function readFileAndRemoveBOM(path: string): string {
|
||||||
var BOM_CHAR_CODE = 65279;
|
const BOM_CHAR_CODE = 65279;
|
||||||
var contents = fs.readFileSync(path, 'utf8');
|
let contents = fs.readFileSync(path, 'utf8');
|
||||||
// Remove BOM
|
// Remove BOM
|
||||||
if (contents.charCodeAt(0) === BOM_CHAR_CODE) {
|
if (contents.charCodeAt(0) === BOM_CHAR_CODE) {
|
||||||
contents = contents.substring(1);
|
contents = contents.substring(1);
|
||||||
@@ -495,7 +499,7 @@ function readFileAndRemoveBOM(path: string): string {
|
|||||||
function emitPlugin(entryPoint: string, plugin: ILoaderPlugin, pluginName: string, moduleName: string): IFile {
|
function emitPlugin(entryPoint: string, plugin: ILoaderPlugin, pluginName: string, moduleName: string): IFile {
|
||||||
let result = '';
|
let result = '';
|
||||||
if (typeof plugin.write === 'function') {
|
if (typeof plugin.write === 'function') {
|
||||||
let write: ILoaderPluginWriteFunc = <any>((what) => {
|
const write: ILoaderPluginWriteFunc = <any>((what: string) => {
|
||||||
result += what;
|
result += what;
|
||||||
});
|
});
|
||||||
write.getEntryPoint = () => {
|
write.getEntryPoint = () => {
|
||||||
@@ -513,15 +517,15 @@ function emitPlugin(entryPoint: string, plugin: ILoaderPlugin, pluginName: strin
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function emitNamedModule(moduleId: string, myDeps: string[], defineCallPosition: IPosition, path: string, contents: string): IFile {
|
function emitNamedModule(moduleId: string, defineCallPosition: IPosition, path: string, contents: string): IFile {
|
||||||
|
|
||||||
// `defineCallPosition` is the position in code: |define()
|
// `defineCallPosition` is the position in code: |define()
|
||||||
let defineCallOffset = positionToOffset(contents, defineCallPosition.line, defineCallPosition.col);
|
const defineCallOffset = positionToOffset(contents, defineCallPosition.line, defineCallPosition.col);
|
||||||
|
|
||||||
// `parensOffset` is the position in code: define|()
|
// `parensOffset` is the position in code: define|()
|
||||||
let parensOffset = contents.indexOf('(', defineCallOffset);
|
const parensOffset = contents.indexOf('(', defineCallOffset);
|
||||||
|
|
||||||
let insertStr = '"' + moduleId + '", ';
|
const insertStr = '"' + moduleId + '", ';
|
||||||
|
|
||||||
return {
|
return {
|
||||||
path: path,
|
path: path,
|
||||||
@@ -530,8 +534,8 @@ function emitNamedModule(moduleId: string, myDeps: string[], defineCallPosition:
|
|||||||
}
|
}
|
||||||
|
|
||||||
function emitShimmedModule(moduleId: string, myDeps: string[], factory: string, path: string, contents: string): IFile {
|
function emitShimmedModule(moduleId: string, myDeps: string[], factory: string, path: string, contents: string): IFile {
|
||||||
let strDeps = (myDeps.length > 0 ? '"' + myDeps.join('", "') + '"' : '');
|
const strDeps = (myDeps.length > 0 ? '"' + myDeps.join('", "') + '"' : '');
|
||||||
let strDefine = 'define("' + moduleId + '", [' + strDeps + '], ' + factory + ');';
|
const strDefine = 'define("' + moduleId + '", [' + strDeps + '], ' + factory + ');';
|
||||||
return {
|
return {
|
||||||
path: path,
|
path: path,
|
||||||
contents: contents + '\n;\n' + strDefine
|
contents: contents + '\n;\n' + strDefine
|
||||||
@@ -546,8 +550,8 @@ function positionToOffset(str: string, desiredLine: number, desiredCol: number):
|
|||||||
return desiredCol - 1;
|
return desiredCol - 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
let line = 1,
|
let line = 1;
|
||||||
lastNewLineOffset = -1;
|
let lastNewLineOffset = -1;
|
||||||
|
|
||||||
do {
|
do {
|
||||||
if (desiredLine === line) {
|
if (desiredLine === line) {
|
||||||
@@ -565,16 +569,16 @@ function positionToOffset(str: string, desiredLine: number, desiredCol: number):
|
|||||||
* Return a set of reachable nodes in `graph` starting from `rootNodes`
|
* Return a set of reachable nodes in `graph` starting from `rootNodes`
|
||||||
*/
|
*/
|
||||||
function visit(rootNodes: string[], graph: IGraph): INodeSet {
|
function visit(rootNodes: string[], graph: IGraph): INodeSet {
|
||||||
let result: INodeSet = {},
|
const result: INodeSet = {};
|
||||||
queue = rootNodes;
|
const queue = rootNodes;
|
||||||
|
|
||||||
rootNodes.forEach((node) => {
|
rootNodes.forEach((node) => {
|
||||||
result[node] = true;
|
result[node] = true;
|
||||||
});
|
});
|
||||||
|
|
||||||
while (queue.length > 0) {
|
while (queue.length > 0) {
|
||||||
let el = queue.shift();
|
const el = queue.shift();
|
||||||
let myEdges = graph[el] || [];
|
const myEdges = graph[el!] || [];
|
||||||
myEdges.forEach((toNode) => {
|
myEdges.forEach((toNode) => {
|
||||||
if (!result[toNode]) {
|
if (!result[toNode]) {
|
||||||
result[toNode] = true;
|
result[toNode] = true;
|
||||||
@@ -591,7 +595,7 @@ function visit(rootNodes: string[], graph: IGraph): INodeSet {
|
|||||||
*/
|
*/
|
||||||
function topologicalSort(graph: IGraph): string[] {
|
function topologicalSort(graph: IGraph): string[] {
|
||||||
|
|
||||||
let allNodes: INodeSet = {},
|
const allNodes: INodeSet = {},
|
||||||
outgoingEdgeCount: { [node: string]: number; } = {},
|
outgoingEdgeCount: { [node: string]: number; } = {},
|
||||||
inverseEdges: IGraph = {};
|
inverseEdges: IGraph = {};
|
||||||
|
|
||||||
@@ -609,7 +613,7 @@ function topologicalSort(graph: IGraph): string[] {
|
|||||||
});
|
});
|
||||||
|
|
||||||
// https://en.wikipedia.org/wiki/Topological_sorting
|
// https://en.wikipedia.org/wiki/Topological_sorting
|
||||||
let S: string[] = [],
|
const S: string[] = [],
|
||||||
L: string[] = [];
|
L: string[] = [];
|
||||||
|
|
||||||
Object.keys(allNodes).forEach((node: string) => {
|
Object.keys(allNodes).forEach((node: string) => {
|
||||||
@@ -623,10 +627,10 @@ function topologicalSort(graph: IGraph): string[] {
|
|||||||
// Ensure the exact same order all the time with the same inputs
|
// Ensure the exact same order all the time with the same inputs
|
||||||
S.sort();
|
S.sort();
|
||||||
|
|
||||||
let n: string = S.shift();
|
const n: string = S.shift()!;
|
||||||
L.push(n);
|
L.push(n);
|
||||||
|
|
||||||
let myInverseEdges = inverseEdges[n] || [];
|
const myInverseEdges = inverseEdges[n] || [];
|
||||||
myInverseEdges.forEach((m: string) => {
|
myInverseEdges.forEach((m: string) => {
|
||||||
outgoingEdgeCount[m]--;
|
outgoingEdgeCount[m]--;
|
||||||
if (outgoingEdgeCount[m] === 0) {
|
if (outgoingEdgeCount[m] === 0) {
|
||||||
|
|||||||
@@ -4,40 +4,53 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
'use strict';
|
'use strict';
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var gulp = require("gulp");
|
const es = require("event-stream");
|
||||||
var tsb = require("gulp-tsb");
|
const fs = require("fs");
|
||||||
var es = require("event-stream");
|
const gulp = require("gulp");
|
||||||
var watch = require('./watch');
|
const bom = require("gulp-bom");
|
||||||
var nls = require("./nls");
|
const sourcemaps = require("gulp-sourcemaps");
|
||||||
var util = require("./util");
|
const tsb = require("gulp-tsb");
|
||||||
var reporter_1 = require("./reporter");
|
const path = require("path");
|
||||||
var path = require("path");
|
const _ = require("underscore");
|
||||||
var bom = require("gulp-bom");
|
const monacodts = require("../monaco/api");
|
||||||
var sourcemaps = require("gulp-sourcemaps");
|
const nls = require("./nls");
|
||||||
var _ = require("underscore");
|
const reporter_1 = require("./reporter");
|
||||||
var monacodts = require("../monaco/api");
|
const util = require("./util");
|
||||||
var fs = require("fs");
|
const util2 = require("gulp-util");
|
||||||
var reporter = reporter_1.createReporter();
|
const watch = require('./watch');
|
||||||
var rootDir = path.join(__dirname, '../../src');
|
const reporter = reporter_1.createReporter();
|
||||||
var options = require('../../src/tsconfig.json').compilerOptions;
|
function getTypeScriptCompilerOptions(src) {
|
||||||
options.verbose = false;
|
const rootDir = path.join(__dirname, `../../${src}`);
|
||||||
options.sourceMap = true;
|
const tsconfig = require(`../../${src}/tsconfig.json`);
|
||||||
if (process.env['VSCODE_NO_SOURCEMAP']) {
|
let options;
|
||||||
options.sourceMap = false;
|
if (tsconfig.extends) {
|
||||||
|
options = Object.assign({}, require(path.join(rootDir, tsconfig.extends)).compilerOptions, tsconfig.compilerOptions);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
options = tsconfig.compilerOptions;
|
||||||
|
}
|
||||||
|
options.verbose = false;
|
||||||
|
options.sourceMap = true;
|
||||||
|
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
||||||
|
options.sourceMap = false;
|
||||||
|
}
|
||||||
|
options.rootDir = rootDir;
|
||||||
|
options.baseUrl = rootDir;
|
||||||
|
options.sourceRoot = util.toFileUri(rootDir);
|
||||||
|
options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 'CRLF' : 'LF';
|
||||||
|
return options;
|
||||||
}
|
}
|
||||||
options.rootDir = rootDir;
|
function createCompile(src, build, emitError) {
|
||||||
options.sourceRoot = util.toFileUri(rootDir);
|
const opts = _.clone(getTypeScriptCompilerOptions(src));
|
||||||
function createCompile(build, emitError) {
|
|
||||||
var opts = _.clone(options);
|
|
||||||
opts.inlineSources = !!build;
|
opts.inlineSources = !!build;
|
||||||
opts.noFilesystemLookup = true;
|
opts.noFilesystemLookup = true;
|
||||||
var ts = tsb.create(opts, null, null, function (err) { return reporter(err.toString()); });
|
const ts = tsb.create(opts, true, undefined, err => reporter(err.toString()));
|
||||||
return function (token) {
|
return function (token) {
|
||||||
var utf8Filter = util.filter(function (data) { return /(\/|\\)test(\/|\\).*utf8/.test(data.path); });
|
const utf8Filter = util.filter(data => /(\/|\\)test(\/|\\).*utf8/.test(data.path));
|
||||||
var tsFilter = util.filter(function (data) { return /\.ts$/.test(data.path); });
|
const tsFilter = util.filter(data => /\.ts$/.test(data.path));
|
||||||
var noDeclarationsFilter = util.filter(function (data) { return !(/\.d\.ts$/.test(data.path)); });
|
const noDeclarationsFilter = util.filter(data => !(/\.d\.ts$/.test(data.path)));
|
||||||
var input = es.through();
|
const input = es.through();
|
||||||
var output = input
|
const output = input
|
||||||
.pipe(utf8Filter)
|
.pipe(utf8Filter)
|
||||||
.pipe(bom())
|
.pipe(bom())
|
||||||
.pipe(utf8Filter.restore)
|
.pipe(utf8Filter.restore)
|
||||||
@@ -50,93 +63,125 @@ function createCompile(build, emitError) {
|
|||||||
.pipe(sourcemaps.write('.', {
|
.pipe(sourcemaps.write('.', {
|
||||||
addComment: false,
|
addComment: false,
|
||||||
includeContent: !!build,
|
includeContent: !!build,
|
||||||
sourceRoot: options.sourceRoot
|
sourceRoot: opts.sourceRoot
|
||||||
}))
|
}))
|
||||||
.pipe(tsFilter.restore)
|
.pipe(tsFilter.restore)
|
||||||
.pipe(reporter.end(emitError));
|
.pipe(reporter.end(!!emitError));
|
||||||
return es.duplex(input, output);
|
return es.duplex(input, output);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
function compileTask(out, build) {
|
const typesDts = [
|
||||||
|
'node_modules/typescript/lib/*.d.ts',
|
||||||
|
'node_modules/@types/**/*.d.ts',
|
||||||
|
'!node_modules/@types/webpack/**/*',
|
||||||
|
'!node_modules/@types/uglify-js/**/*',
|
||||||
|
];
|
||||||
|
function compileTask(src, out, build) {
|
||||||
return function () {
|
return function () {
|
||||||
var compile = createCompile(build, true);
|
const compile = createCompile(src, build, true);
|
||||||
var src = es.merge(gulp.src('src/**', { base: 'src' }), gulp.src('node_modules/typescript/lib/lib.d.ts'));
|
const srcPipe = es.merge(gulp.src(`${src}/**`, { base: `${src}` }), gulp.src(typesDts));
|
||||||
// Do not write .d.ts files to disk, as they are not needed there.
|
let generator = new MonacoGenerator(false);
|
||||||
var dtsFilter = util.filter(function (data) { return !/\.d\.ts$/.test(data.path); });
|
if (src === 'src') {
|
||||||
return src
|
generator.execute();
|
||||||
|
}
|
||||||
|
return srcPipe
|
||||||
|
.pipe(generator.stream)
|
||||||
.pipe(compile())
|
.pipe(compile())
|
||||||
.pipe(dtsFilter)
|
.pipe(gulp.dest(out));
|
||||||
.pipe(gulp.dest(out))
|
|
||||||
.pipe(dtsFilter.restore)
|
|
||||||
.pipe(monacodtsTask(out, false));
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
exports.compileTask = compileTask;
|
exports.compileTask = compileTask;
|
||||||
function watchTask(out, build) {
|
function watchTask(out, build) {
|
||||||
return function () {
|
return function () {
|
||||||
var compile = createCompile(build);
|
const compile = createCompile('src', build);
|
||||||
var src = es.merge(gulp.src('src/**', { base: 'src' }), gulp.src('node_modules/typescript/lib/lib.d.ts'));
|
const src = es.merge(gulp.src('src/**', { base: 'src' }), gulp.src(typesDts));
|
||||||
var watchSrc = watch('src/**', { base: 'src' });
|
const watchSrc = watch('src/**', { base: 'src' });
|
||||||
// Do not write .d.ts files to disk, as they are not needed there.
|
let generator = new MonacoGenerator(true);
|
||||||
var dtsFilter = util.filter(function (data) { return !/\.d\.ts$/.test(data.path); });
|
generator.execute();
|
||||||
return watchSrc
|
return watchSrc
|
||||||
|
.pipe(generator.stream)
|
||||||
.pipe(util.incremental(compile, src, true))
|
.pipe(util.incremental(compile, src, true))
|
||||||
.pipe(dtsFilter)
|
.pipe(gulp.dest(out));
|
||||||
.pipe(gulp.dest(out))
|
|
||||||
.pipe(dtsFilter.restore)
|
|
||||||
.pipe(monacodtsTask(out, true));
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
exports.watchTask = watchTask;
|
exports.watchTask = watchTask;
|
||||||
function monacodtsTask(out, isWatch) {
|
const REPO_SRC_FOLDER = path.join(__dirname, '../../src');
|
||||||
var basePath = path.resolve(process.cwd(), out);
|
class MonacoGenerator {
|
||||||
var neededFiles = {};
|
constructor(isWatch) {
|
||||||
monacodts.getFilesToWatch(out).forEach(function (filePath) {
|
this._executeSoonTimer = null;
|
||||||
filePath = path.normalize(filePath);
|
this._isWatch = isWatch;
|
||||||
neededFiles[filePath] = true;
|
this.stream = es.through();
|
||||||
});
|
this._watchers = [];
|
||||||
var inputFiles = {};
|
this._watchedFiles = {};
|
||||||
for (var filePath in neededFiles) {
|
let onWillReadFile = (moduleId, filePath) => {
|
||||||
if (/\bsrc(\/|\\)vs\b/.test(filePath)) {
|
if (!this._isWatch) {
|
||||||
// This file is needed from source => simply read it now
|
return;
|
||||||
inputFiles[filePath] = fs.readFileSync(filePath).toString();
|
}
|
||||||
|
if (this._watchedFiles[filePath]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._watchedFiles[filePath] = true;
|
||||||
|
const watcher = fs.watch(filePath);
|
||||||
|
watcher.addListener('change', () => {
|
||||||
|
this._declarationResolver.invalidateCache(moduleId);
|
||||||
|
this._executeSoon();
|
||||||
|
});
|
||||||
|
this._watchers.push(watcher);
|
||||||
|
};
|
||||||
|
this._fsProvider = new class extends monacodts.FSProvider {
|
||||||
|
readFileSync(moduleId, filePath) {
|
||||||
|
onWillReadFile(moduleId, filePath);
|
||||||
|
return super.readFileSync(moduleId, filePath);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this._declarationResolver = new monacodts.DeclarationResolver(this._fsProvider);
|
||||||
|
if (this._isWatch) {
|
||||||
|
const recipeWatcher = fs.watch(monacodts.RECIPE_PATH);
|
||||||
|
recipeWatcher.addListener('change', () => {
|
||||||
|
this._executeSoon();
|
||||||
|
});
|
||||||
|
this._watchers.push(recipeWatcher);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
var setInputFile = function (filePath, contents) {
|
_executeSoon() {
|
||||||
if (inputFiles[filePath] === contents) {
|
if (this._executeSoonTimer !== null) {
|
||||||
// no change
|
clearTimeout(this._executeSoonTimer);
|
||||||
|
this._executeSoonTimer = null;
|
||||||
|
}
|
||||||
|
this._executeSoonTimer = setTimeout(() => {
|
||||||
|
this._executeSoonTimer = null;
|
||||||
|
this.execute();
|
||||||
|
}, 20);
|
||||||
|
}
|
||||||
|
dispose() {
|
||||||
|
this._watchers.forEach(watcher => watcher.close());
|
||||||
|
}
|
||||||
|
_run() {
|
||||||
|
let r = monacodts.run3(this._declarationResolver);
|
||||||
|
if (!r && !this._isWatch) {
|
||||||
|
// The build must always be able to generate the monaco.d.ts
|
||||||
|
throw new Error(`monaco.d.ts generation error - Cannot continue`);
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
_log(message, ...rest) {
|
||||||
|
util2.log(util2.colors.cyan('[monaco.d.ts]'), message, ...rest);
|
||||||
|
}
|
||||||
|
execute() {
|
||||||
|
const startTime = Date.now();
|
||||||
|
const result = this._run();
|
||||||
|
if (!result) {
|
||||||
|
// nothing really changed
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
inputFiles[filePath] = contents;
|
if (result.isTheSame) {
|
||||||
var neededInputFilesCount = Object.keys(neededFiles).length;
|
return;
|
||||||
var availableInputFilesCount = Object.keys(inputFiles).length;
|
|
||||||
if (neededInputFilesCount === availableInputFilesCount) {
|
|
||||||
run();
|
|
||||||
}
|
}
|
||||||
};
|
fs.writeFileSync(result.filePath, result.content);
|
||||||
var run = function () {
|
fs.writeFileSync(path.join(REPO_SRC_FOLDER, 'vs/editor/common/standalone/standaloneEnums.ts'), result.enums);
|
||||||
var result = monacodts.run(out, inputFiles);
|
this._log(`monaco.d.ts is changed - total time took ${Date.now() - startTime} ms`);
|
||||||
if (!result.isTheSame) {
|
if (!this._isWatch) {
|
||||||
if (isWatch) {
|
this.stream.emit('error', 'monaco.d.ts is no longer up to date. Please run gulp watch and commit the new file.');
|
||||||
fs.writeFileSync(result.filePath, result.content);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
resultStream.emit('error', 'monaco.d.ts is no longer up to date. Please run gulp watch and commit the new file.');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
var resultStream;
|
|
||||||
if (isWatch) {
|
|
||||||
watch('build/monaco/*').pipe(es.through(function () {
|
|
||||||
run();
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
resultStream = es.through(function (data) {
|
|
||||||
var filePath = path.normalize(path.resolve(basePath, data.relative));
|
|
||||||
if (neededFiles[filePath]) {
|
|
||||||
setInputFile(filePath, data.contents.toString());
|
|
||||||
}
|
|
||||||
this.emit('data', data);
|
|
||||||
});
|
|
||||||
return resultStream;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -5,38 +5,50 @@
|
|||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import * as gulp from 'gulp';
|
|
||||||
import * as tsb from 'gulp-tsb';
|
|
||||||
import * as es from 'event-stream';
|
import * as es from 'event-stream';
|
||||||
const watch = require('./watch');
|
import * as fs from 'fs';
|
||||||
import * as nls from './nls';
|
import * as gulp from 'gulp';
|
||||||
import * as util from './util';
|
|
||||||
import { createReporter } from './reporter';
|
|
||||||
import * as path from 'path';
|
|
||||||
import * as bom from 'gulp-bom';
|
import * as bom from 'gulp-bom';
|
||||||
import * as sourcemaps from 'gulp-sourcemaps';
|
import * as sourcemaps from 'gulp-sourcemaps';
|
||||||
|
import * as tsb from 'gulp-tsb';
|
||||||
|
import * as path from 'path';
|
||||||
import * as _ from 'underscore';
|
import * as _ from 'underscore';
|
||||||
import * as monacodts from '../monaco/api';
|
import * as monacodts from '../monaco/api';
|
||||||
import * as fs from 'fs';
|
import * as nls from './nls';
|
||||||
|
import { createReporter } from './reporter';
|
||||||
|
import * as util from './util';
|
||||||
|
import * as util2 from 'gulp-util';
|
||||||
|
const watch = require('./watch');
|
||||||
|
|
||||||
const reporter = createReporter();
|
const reporter = createReporter();
|
||||||
|
|
||||||
const rootDir = path.join(__dirname, '../../src');
|
function getTypeScriptCompilerOptions(src: string) {
|
||||||
const options = require('../../src/tsconfig.json').compilerOptions;
|
const rootDir = path.join(__dirname, `../../${src}`);
|
||||||
options.verbose = false;
|
const tsconfig = require(`../../${src}/tsconfig.json`);
|
||||||
options.sourceMap = true;
|
let options: { [key: string]: any };
|
||||||
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
if (tsconfig.extends) {
|
||||||
options.sourceMap = false;
|
options = Object.assign({}, require(path.join(rootDir, tsconfig.extends)).compilerOptions, tsconfig.compilerOptions);
|
||||||
|
} else {
|
||||||
|
options = tsconfig.compilerOptions;
|
||||||
|
}
|
||||||
|
options.verbose = false;
|
||||||
|
options.sourceMap = true;
|
||||||
|
if (process.env['VSCODE_NO_SOURCEMAP']) { // To be used by developers in a hurry
|
||||||
|
options.sourceMap = false;
|
||||||
|
}
|
||||||
|
options.rootDir = rootDir;
|
||||||
|
options.baseUrl = rootDir;
|
||||||
|
options.sourceRoot = util.toFileUri(rootDir);
|
||||||
|
options.newLine = /\r\n/.test(fs.readFileSync(__filename, 'utf8')) ? 'CRLF' : 'LF';
|
||||||
|
return options;
|
||||||
}
|
}
|
||||||
options.rootDir = rootDir;
|
|
||||||
options.sourceRoot = util.toFileUri(rootDir);
|
|
||||||
|
|
||||||
function createCompile(build: boolean, emitError?: boolean): (token?: util.ICancellationToken) => NodeJS.ReadWriteStream {
|
function createCompile(src: string, build: boolean, emitError?: boolean): (token?: util.ICancellationToken) => NodeJS.ReadWriteStream {
|
||||||
const opts = _.clone(options);
|
const opts = _.clone(getTypeScriptCompilerOptions(src));
|
||||||
opts.inlineSources = !!build;
|
opts.inlineSources = !!build;
|
||||||
opts.noFilesystemLookup = true;
|
opts.noFilesystemLookup = true;
|
||||||
|
|
||||||
const ts = tsb.create(opts, null, null, err => reporter(err.toString()));
|
const ts = tsb.create(opts, true, undefined, err => reporter(err.toString()));
|
||||||
|
|
||||||
return function (token?: util.ICancellationToken) {
|
return function (token?: util.ICancellationToken) {
|
||||||
|
|
||||||
@@ -58,117 +70,159 @@ function createCompile(build: boolean, emitError?: boolean): (token?: util.ICanc
|
|||||||
.pipe(sourcemaps.write('.', {
|
.pipe(sourcemaps.write('.', {
|
||||||
addComment: false,
|
addComment: false,
|
||||||
includeContent: !!build,
|
includeContent: !!build,
|
||||||
sourceRoot: options.sourceRoot
|
sourceRoot: opts.sourceRoot
|
||||||
}))
|
}))
|
||||||
.pipe(tsFilter.restore)
|
.pipe(tsFilter.restore)
|
||||||
.pipe(reporter.end(emitError));
|
.pipe(reporter.end(!!emitError));
|
||||||
|
|
||||||
return es.duplex(input, output);
|
return es.duplex(input, output);
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function compileTask(out: string, build: boolean): () => NodeJS.ReadWriteStream {
|
const typesDts = [
|
||||||
|
'node_modules/typescript/lib/*.d.ts',
|
||||||
|
'node_modules/@types/**/*.d.ts',
|
||||||
|
'!node_modules/@types/webpack/**/*',
|
||||||
|
'!node_modules/@types/uglify-js/**/*',
|
||||||
|
];
|
||||||
|
|
||||||
|
export function compileTask(src: string, out: string, build: boolean): () => NodeJS.ReadWriteStream {
|
||||||
|
|
||||||
return function () {
|
return function () {
|
||||||
const compile = createCompile(build, true);
|
const compile = createCompile(src, build, true);
|
||||||
|
|
||||||
const src = es.merge(
|
const srcPipe = es.merge(
|
||||||
gulp.src('src/**', { base: 'src' }),
|
gulp.src(`${src}/**`, { base: `${src}` }),
|
||||||
gulp.src('node_modules/typescript/lib/lib.d.ts'),
|
gulp.src(typesDts),
|
||||||
);
|
);
|
||||||
|
|
||||||
// Do not write .d.ts files to disk, as they are not needed there.
|
let generator = new MonacoGenerator(false);
|
||||||
const dtsFilter = util.filter(data => !/\.d\.ts$/.test(data.path));
|
if (src === 'src') {
|
||||||
|
generator.execute();
|
||||||
|
}
|
||||||
|
|
||||||
return src
|
return srcPipe
|
||||||
|
.pipe(generator.stream)
|
||||||
.pipe(compile())
|
.pipe(compile())
|
||||||
.pipe(dtsFilter)
|
.pipe(gulp.dest(out));
|
||||||
.pipe(gulp.dest(out))
|
|
||||||
.pipe(dtsFilter.restore)
|
|
||||||
.pipe(monacodtsTask(out, false));
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
export function watchTask(out: string, build: boolean): () => NodeJS.ReadWriteStream {
|
export function watchTask(out: string, build: boolean): () => NodeJS.ReadWriteStream {
|
||||||
|
|
||||||
return function () {
|
return function () {
|
||||||
const compile = createCompile(build);
|
const compile = createCompile('src', build);
|
||||||
|
|
||||||
const src = es.merge(
|
const src = es.merge(
|
||||||
gulp.src('src/**', { base: 'src' }),
|
gulp.src('src/**', { base: 'src' }),
|
||||||
gulp.src('node_modules/typescript/lib/lib.d.ts'),
|
gulp.src(typesDts),
|
||||||
);
|
);
|
||||||
const watchSrc = watch('src/**', { base: 'src' });
|
const watchSrc = watch('src/**', { base: 'src' });
|
||||||
|
|
||||||
// Do not write .d.ts files to disk, as they are not needed there.
|
let generator = new MonacoGenerator(true);
|
||||||
const dtsFilter = util.filter(data => !/\.d\.ts$/.test(data.path));
|
generator.execute();
|
||||||
|
|
||||||
return watchSrc
|
return watchSrc
|
||||||
|
.pipe(generator.stream)
|
||||||
.pipe(util.incremental(compile, src, true))
|
.pipe(util.incremental(compile, src, true))
|
||||||
.pipe(dtsFilter)
|
.pipe(gulp.dest(out));
|
||||||
.pipe(gulp.dest(out))
|
|
||||||
.pipe(dtsFilter.restore)
|
|
||||||
.pipe(monacodtsTask(out, true));
|
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
function monacodtsTask(out: string, isWatch: boolean): NodeJS.ReadWriteStream {
|
const REPO_SRC_FOLDER = path.join(__dirname, '../../src');
|
||||||
|
|
||||||
const basePath = path.resolve(process.cwd(), out);
|
class MonacoGenerator {
|
||||||
|
private readonly _isWatch: boolean;
|
||||||
|
public readonly stream: NodeJS.ReadWriteStream;
|
||||||
|
|
||||||
const neededFiles: { [file: string]: boolean; } = {};
|
private readonly _watchers: fs.FSWatcher[];
|
||||||
monacodts.getFilesToWatch(out).forEach(function (filePath) {
|
private readonly _watchedFiles: { [filePath: string]: boolean; };
|
||||||
filePath = path.normalize(filePath);
|
private readonly _fsProvider: monacodts.FSProvider;
|
||||||
neededFiles[filePath] = true;
|
private readonly _declarationResolver: monacodts.DeclarationResolver;
|
||||||
});
|
|
||||||
|
|
||||||
const inputFiles: { [file: string]: string; } = {};
|
constructor(isWatch: boolean) {
|
||||||
for (let filePath in neededFiles) {
|
this._isWatch = isWatch;
|
||||||
if (/\bsrc(\/|\\)vs\b/.test(filePath)) {
|
this.stream = es.through();
|
||||||
// This file is needed from source => simply read it now
|
this._watchers = [];
|
||||||
inputFiles[filePath] = fs.readFileSync(filePath).toString();
|
this._watchedFiles = {};
|
||||||
|
let onWillReadFile = (moduleId: string, filePath: string) => {
|
||||||
|
if (!this._isWatch) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (this._watchedFiles[filePath]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
this._watchedFiles[filePath] = true;
|
||||||
|
|
||||||
|
const watcher = fs.watch(filePath);
|
||||||
|
watcher.addListener('change', () => {
|
||||||
|
this._declarationResolver.invalidateCache(moduleId);
|
||||||
|
this._executeSoon();
|
||||||
|
});
|
||||||
|
this._watchers.push(watcher);
|
||||||
|
};
|
||||||
|
this._fsProvider = new class extends monacodts.FSProvider {
|
||||||
|
public readFileSync(moduleId: string, filePath: string): Buffer {
|
||||||
|
onWillReadFile(moduleId, filePath);
|
||||||
|
return super.readFileSync(moduleId, filePath);
|
||||||
|
}
|
||||||
|
};
|
||||||
|
this._declarationResolver = new monacodts.DeclarationResolver(this._fsProvider);
|
||||||
|
|
||||||
|
if (this._isWatch) {
|
||||||
|
const recipeWatcher = fs.watch(monacodts.RECIPE_PATH);
|
||||||
|
recipeWatcher.addListener('change', () => {
|
||||||
|
this._executeSoon();
|
||||||
|
});
|
||||||
|
this._watchers.push(recipeWatcher);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const setInputFile = (filePath: string, contents: string) => {
|
private _executeSoonTimer: NodeJS.Timer | null = null;
|
||||||
if (inputFiles[filePath] === contents) {
|
private _executeSoon(): void {
|
||||||
// no change
|
if (this._executeSoonTimer !== null) {
|
||||||
|
clearTimeout(this._executeSoonTimer);
|
||||||
|
this._executeSoonTimer = null;
|
||||||
|
}
|
||||||
|
this._executeSoonTimer = setTimeout(() => {
|
||||||
|
this._executeSoonTimer = null;
|
||||||
|
this.execute();
|
||||||
|
}, 20);
|
||||||
|
}
|
||||||
|
|
||||||
|
public dispose(): void {
|
||||||
|
this._watchers.forEach(watcher => watcher.close());
|
||||||
|
}
|
||||||
|
|
||||||
|
private _run(): monacodts.IMonacoDeclarationResult | null {
|
||||||
|
let r = monacodts.run3(this._declarationResolver);
|
||||||
|
if (!r && !this._isWatch) {
|
||||||
|
// The build must always be able to generate the monaco.d.ts
|
||||||
|
throw new Error(`monaco.d.ts generation error - Cannot continue`);
|
||||||
|
}
|
||||||
|
return r;
|
||||||
|
}
|
||||||
|
|
||||||
|
private _log(message: any, ...rest: any[]): void {
|
||||||
|
util2.log(util2.colors.cyan('[monaco.d.ts]'), message, ...rest);
|
||||||
|
}
|
||||||
|
|
||||||
|
public execute(): void {
|
||||||
|
const startTime = Date.now();
|
||||||
|
const result = this._run();
|
||||||
|
if (!result) {
|
||||||
|
// nothing really changed
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
inputFiles[filePath] = contents;
|
if (result.isTheSame) {
|
||||||
const neededInputFilesCount = Object.keys(neededFiles).length;
|
return;
|
||||||
const availableInputFilesCount = Object.keys(inputFiles).length;
|
|
||||||
if (neededInputFilesCount === availableInputFilesCount) {
|
|
||||||
run();
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
const run = () => {
|
fs.writeFileSync(result.filePath, result.content);
|
||||||
const result = monacodts.run(out, inputFiles);
|
fs.writeFileSync(path.join(REPO_SRC_FOLDER, 'vs/editor/common/standalone/standaloneEnums.ts'), result.enums);
|
||||||
if (!result.isTheSame) {
|
this._log(`monaco.d.ts is changed - total time took ${Date.now() - startTime} ms`);
|
||||||
if (isWatch) {
|
if (!this._isWatch) {
|
||||||
fs.writeFileSync(result.filePath, result.content);
|
this.stream.emit('error', 'monaco.d.ts is no longer up to date. Please run gulp watch and commit the new file.');
|
||||||
} else {
|
|
||||||
resultStream.emit('error', 'monaco.d.ts is no longer up to date. Please run gulp watch and commit the new file.');
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
};
|
|
||||||
|
|
||||||
let resultStream: NodeJS.ReadWriteStream;
|
|
||||||
|
|
||||||
if (isWatch) {
|
|
||||||
watch('build/monaco/*').pipe(es.through(function () {
|
|
||||||
run();
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resultStream = es.through(function (data) {
|
|
||||||
const filePath = path.normalize(path.resolve(basePath, data.relative));
|
|
||||||
if (neededFiles[filePath]) {
|
|
||||||
setInputFile(filePath, data.contents.toString());
|
|
||||||
}
|
|
||||||
this.emit('data', data);
|
|
||||||
});
|
|
||||||
|
|
||||||
return resultStream;
|
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -11,6 +11,7 @@ const root = path.dirname(path.dirname(__dirname));
|
|||||||
|
|
||||||
function getElectronVersion() {
|
function getElectronVersion() {
|
||||||
const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8');
|
const yarnrc = fs.readFileSync(path.join(root, '.yarnrc'), 'utf8');
|
||||||
|
// @ts-ignore
|
||||||
const target = /^target "(.*)"$/m.exec(yarnrc)[1];
|
const target = /^target "(.*)"$/m.exec(yarnrc)[1];
|
||||||
|
|
||||||
return target;
|
return target;
|
||||||
@@ -19,6 +20,7 @@ function getElectronVersion() {
|
|||||||
module.exports.getElectronVersion = getElectronVersion;
|
module.exports.getElectronVersion = getElectronVersion;
|
||||||
|
|
||||||
// returns 0 if the right version of electron is in .build/electron
|
// returns 0 if the right version of electron is in .build/electron
|
||||||
|
// @ts-ignore
|
||||||
if (require.main === module) {
|
if (require.main === module) {
|
||||||
const version = getElectronVersion();
|
const version = getElectronVersion();
|
||||||
const versionFile = path.join(root, '.build', 'electron', 'version');
|
const versionFile = path.join(root, '.build', 'electron', 'version');
|
||||||
|
|||||||
@@ -4,115 +4,317 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var es = require("event-stream");
|
const es = require("event-stream");
|
||||||
var assign = require("object-assign");
|
const fs = require("fs");
|
||||||
var remote = require("gulp-remote-src");
|
const glob = require("glob");
|
||||||
var flatmap = require('gulp-flatmap');
|
const gulp = require("gulp");
|
||||||
var vzip = require('gulp-vinyl-zip');
|
const path = require("path");
|
||||||
var filter = require('gulp-filter');
|
const File = require("vinyl");
|
||||||
var rename = require('gulp-rename');
|
const vsce = require("vsce");
|
||||||
var util = require('gulp-util');
|
const stats_1 = require("./stats");
|
||||||
var buffer = require('gulp-buffer');
|
const util2 = require("./util");
|
||||||
var json = require('gulp-json-editor');
|
const remote = require("gulp-remote-src");
|
||||||
var fs = require("fs");
|
const vzip = require('gulp-vinyl-zip');
|
||||||
var path = require("path");
|
const filter = require("gulp-filter");
|
||||||
var vsce = require("vsce");
|
const rename = require("gulp-rename");
|
||||||
var File = require("vinyl");
|
const util = require('gulp-util');
|
||||||
function fromLocal(extensionPath) {
|
const buffer = require('gulp-buffer');
|
||||||
var result = es.through();
|
const json = require("gulp-json-editor");
|
||||||
vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn })
|
const webpack = require('webpack');
|
||||||
.then(function (fileNames) {
|
const webpackGulp = require('webpack-stream');
|
||||||
var files = fileNames
|
const root = path.resolve(path.join(__dirname, '..', '..'));
|
||||||
.map(function (fileName) { return path.join(extensionPath, fileName); })
|
// {{SQL CARBON EDIT}}
|
||||||
.map(function (filePath) { return new File({
|
const _ = require("underscore");
|
||||||
|
const vfs = require("vinyl-fs");
|
||||||
|
const deps = require('../dependencies');
|
||||||
|
const extensionsRoot = path.join(root, 'extensions');
|
||||||
|
const extensionsProductionDependencies = deps.getProductionDependencies(extensionsRoot);
|
||||||
|
function packageBuiltInExtensions() {
|
||||||
|
const sqlBuiltInLocalExtensionDescriptions = glob.sync('extensions/*/package.json')
|
||||||
|
.map(manifestPath => {
|
||||||
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
|
const extensionName = path.basename(extensionPath);
|
||||||
|
return { name: extensionName, path: extensionPath };
|
||||||
|
})
|
||||||
|
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
||||||
|
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
||||||
|
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) >= 0);
|
||||||
|
sqlBuiltInLocalExtensionDescriptions.forEach(element => {
|
||||||
|
const packagePath = path.join(path.dirname(root), element.name + '.vsix');
|
||||||
|
console.info('Creating vsix for ' + element.path + ' result:' + packagePath);
|
||||||
|
vsce.createVSIX({
|
||||||
|
cwd: element.path,
|
||||||
|
packagePath: packagePath,
|
||||||
|
useYarn: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.packageBuiltInExtensions = packageBuiltInExtensions;
|
||||||
|
function packageExtensionTask(extensionName, platform, arch) {
|
||||||
|
var destination = path.join(path.dirname(root), 'azuredatastudio') + (platform ? '-' + platform : '') + (arch ? '-' + arch : '');
|
||||||
|
if (platform === 'darwin') {
|
||||||
|
destination = path.join(destination, 'Azure Data Studio.app', 'Contents', 'Resources', 'app', 'extensions', extensionName);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
destination = path.join(destination, 'resources', 'app', 'extensions', extensionName);
|
||||||
|
}
|
||||||
|
platform = platform || process.platform;
|
||||||
|
return () => {
|
||||||
|
const root = path.resolve(path.join(__dirname, '../..'));
|
||||||
|
const localExtensionDescriptions = glob.sync('extensions/*/package.json')
|
||||||
|
.map(manifestPath => {
|
||||||
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
|
const extensionName = path.basename(extensionPath);
|
||||||
|
return { name: extensionName, path: extensionPath };
|
||||||
|
})
|
||||||
|
.filter(({ name }) => extensionName === name);
|
||||||
|
const localExtensions = es.merge(...localExtensionDescriptions.map(extension => {
|
||||||
|
return fromLocal(extension.path);
|
||||||
|
}));
|
||||||
|
let result = localExtensions
|
||||||
|
.pipe(util2.skipDirectories())
|
||||||
|
.pipe(util2.fixWin32DirectoryPermissions())
|
||||||
|
.pipe(filter(['**', '!LICENSE', '!LICENSES.chromium.html', '!version']));
|
||||||
|
return result.pipe(vfs.dest(destination));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
exports.packageExtensionTask = packageExtensionTask;
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
|
function fromLocal(extensionPath, sourceMappingURLBase) {
|
||||||
|
const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js');
|
||||||
|
if (fs.existsSync(webpackFilename)) {
|
||||||
|
return fromLocalWebpack(extensionPath, sourceMappingURLBase);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return fromLocalNormal(extensionPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function fromLocalWebpack(extensionPath, sourceMappingURLBase) {
|
||||||
|
const result = es.through();
|
||||||
|
const packagedDependencies = [];
|
||||||
|
const packageJsonConfig = require(path.join(extensionPath, 'package.json'));
|
||||||
|
if (packageJsonConfig.dependencies) {
|
||||||
|
const webpackRootConfig = require(path.join(extensionPath, 'extension.webpack.config.js'));
|
||||||
|
for (const key in webpackRootConfig.externals) {
|
||||||
|
if (key in packageJsonConfig.dependencies) {
|
||||||
|
packagedDependencies.push(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn, packagedDependencies }).then(fileNames => {
|
||||||
|
const files = fileNames
|
||||||
|
.map(fileName => path.join(extensionPath, fileName))
|
||||||
|
.map(filePath => new File({
|
||||||
path: filePath,
|
path: filePath,
|
||||||
stat: fs.statSync(filePath),
|
stat: fs.statSync(filePath),
|
||||||
base: extensionPath,
|
base: extensionPath,
|
||||||
contents: fs.createReadStream(filePath)
|
contents: fs.createReadStream(filePath)
|
||||||
}); });
|
}));
|
||||||
|
const filesStream = es.readArray(files);
|
||||||
|
// check for a webpack configuration files, then invoke webpack
|
||||||
|
// and merge its output with the files stream. also rewrite the package.json
|
||||||
|
// file to a new entry point
|
||||||
|
const webpackConfigLocations = glob.sync(path.join(extensionPath, '/**/extension.webpack.config.js'), { ignore: ['**/node_modules'] });
|
||||||
|
const packageJsonFilter = filter(f => {
|
||||||
|
if (path.basename(f.path) === 'package.json') {
|
||||||
|
// only modify package.json's next to the webpack file.
|
||||||
|
// to be safe, use existsSync instead of path comparison.
|
||||||
|
return fs.existsSync(path.join(path.dirname(f.path), 'extension.webpack.config.js'));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}, { restore: true });
|
||||||
|
const patchFilesStream = filesStream
|
||||||
|
.pipe(packageJsonFilter)
|
||||||
|
.pipe(buffer())
|
||||||
|
.pipe(json((data) => {
|
||||||
|
if (data.main) {
|
||||||
|
// hardcoded entry point directory!
|
||||||
|
data.main = data.main.replace('/out/', /dist/);
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}))
|
||||||
|
.pipe(packageJsonFilter.restore);
|
||||||
|
const webpackStreams = webpackConfigLocations.map(webpackConfigPath => () => {
|
||||||
|
const webpackDone = (err, stats) => {
|
||||||
|
util.log(`Bundled extension: ${util.colors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`);
|
||||||
|
if (err) {
|
||||||
|
result.emit('error', err);
|
||||||
|
}
|
||||||
|
const { compilation } = stats;
|
||||||
|
if (compilation.errors.length > 0) {
|
||||||
|
result.emit('error', compilation.errors.join('\n'));
|
||||||
|
}
|
||||||
|
if (compilation.warnings.length > 0) {
|
||||||
|
result.emit('error', compilation.warnings.join('\n'));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
const webpackConfig = Object.assign({}, require(webpackConfigPath), { mode: 'production' });
|
||||||
|
const relativeOutputPath = path.relative(extensionPath, webpackConfig.output.path);
|
||||||
|
return webpackGulp(webpackConfig, webpack, webpackDone)
|
||||||
|
.pipe(es.through(function (data) {
|
||||||
|
data.stat = data.stat || {};
|
||||||
|
data.base = extensionPath;
|
||||||
|
this.emit('data', data);
|
||||||
|
}))
|
||||||
|
.pipe(es.through(function (data) {
|
||||||
|
// source map handling:
|
||||||
|
// * rewrite sourceMappingURL
|
||||||
|
// * save to disk so that upload-task picks this up
|
||||||
|
if (sourceMappingURLBase) {
|
||||||
|
const contents = data.contents.toString('utf8');
|
||||||
|
data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) {
|
||||||
|
return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`;
|
||||||
|
}), 'utf8');
|
||||||
|
if (/\.js\.map$/.test(data.path)) {
|
||||||
|
if (!fs.existsSync(path.dirname(data.path))) {
|
||||||
|
fs.mkdirSync(path.dirname(data.path));
|
||||||
|
}
|
||||||
|
fs.writeFileSync(data.path, data.contents);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.emit('data', data);
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
es.merge(sequence(webpackStreams), patchFilesStream)
|
||||||
|
// .pipe(es.through(function (data) {
|
||||||
|
// // debug
|
||||||
|
// console.log('out', data.path, data.contents.length);
|
||||||
|
// this.emit('data', data);
|
||||||
|
// }))
|
||||||
|
.pipe(result);
|
||||||
|
}).catch(err => {
|
||||||
|
console.error(extensionPath);
|
||||||
|
console.error(packagedDependencies);
|
||||||
|
result.emit('error', err);
|
||||||
|
});
|
||||||
|
return result.pipe(stats_1.createStatsStream(path.basename(extensionPath)));
|
||||||
|
}
|
||||||
|
function fromLocalNormal(extensionPath) {
|
||||||
|
const result = es.through();
|
||||||
|
vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn })
|
||||||
|
.then(fileNames => {
|
||||||
|
const files = fileNames
|
||||||
|
.map(fileName => path.join(extensionPath, fileName))
|
||||||
|
.map(filePath => new File({
|
||||||
|
path: filePath,
|
||||||
|
stat: fs.statSync(filePath),
|
||||||
|
base: extensionPath,
|
||||||
|
contents: fs.createReadStream(filePath)
|
||||||
|
}));
|
||||||
es.readArray(files).pipe(result);
|
es.readArray(files).pipe(result);
|
||||||
})
|
})
|
||||||
.catch(function (err) { return result.emit('error', err); });
|
.catch(err => result.emit('error', err));
|
||||||
return result;
|
return result.pipe(stats_1.createStatsStream(path.basename(extensionPath)));
|
||||||
}
|
}
|
||||||
exports.fromLocal = fromLocal;
|
const baseHeaders = {
|
||||||
function error(err) {
|
|
||||||
var result = es.through();
|
|
||||||
setTimeout(function () { return result.emit('error', err); });
|
|
||||||
return result;
|
|
||||||
}
|
|
||||||
var baseHeaders = {
|
|
||||||
'X-Market-Client-Id': 'VSCode Build',
|
'X-Market-Client-Id': 'VSCode Build',
|
||||||
'User-Agent': 'VSCode Build',
|
'User-Agent': 'VSCode Build',
|
||||||
|
'X-Market-User-Id': '291C1CD0-051A-4123-9B4B-30D60EF52EE2',
|
||||||
};
|
};
|
||||||
function fromMarketplace(extensionName, version) {
|
function fromMarketplace(extensionName, version, metadata) {
|
||||||
var filterType = 7;
|
const [publisher, name] = extensionName.split('.');
|
||||||
var value = extensionName;
|
const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${publisher}/vsextensions/${name}/${version}/vspackage`;
|
||||||
var criterium = { filterType: filterType, value: value };
|
util.log('Downloading extension:', util.colors.yellow(`${extensionName}@${version}`), '...');
|
||||||
var criteria = [criterium];
|
const options = {
|
||||||
var pageNumber = 1;
|
base: url,
|
||||||
var pageSize = 1;
|
|
||||||
var sortBy = 0;
|
|
||||||
var sortOrder = 0;
|
|
||||||
var flags = 0x1 | 0x2 | 0x80;
|
|
||||||
var assetTypes = ['Microsoft.VisualStudio.Services.VSIXPackage'];
|
|
||||||
var filters = [{ criteria: criteria, pageNumber: pageNumber, pageSize: pageSize, sortBy: sortBy, sortOrder: sortOrder }];
|
|
||||||
var body = JSON.stringify({ filters: filters, assetTypes: assetTypes, flags: flags });
|
|
||||||
var headers = assign({}, baseHeaders, {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Accept': 'application/json;api-version=3.0-preview.1',
|
|
||||||
'Content-Length': body.length
|
|
||||||
});
|
|
||||||
var options = {
|
|
||||||
base: 'https://marketplace.visualstudio.com/_apis/public/gallery',
|
|
||||||
requestOptions: {
|
requestOptions: {
|
||||||
method: 'POST',
|
|
||||||
gzip: true,
|
gzip: true,
|
||||||
headers: headers,
|
headers: baseHeaders
|
||||||
body: body
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
return remote('/extensionquery', options)
|
const packageJsonFilter = filter('package.json', { restore: true });
|
||||||
.pipe(flatmap(function (stream, f) {
|
return remote('', options)
|
||||||
var rawResult = f.contents.toString('utf8');
|
.pipe(vzip.src())
|
||||||
var result = JSON.parse(rawResult);
|
.pipe(filter('extension/**'))
|
||||||
var extension = result.results[0].extensions[0];
|
.pipe(rename(p => p.dirname = p.dirname.replace(/^extension\/?/, '')))
|
||||||
if (!extension) {
|
.pipe(packageJsonFilter)
|
||||||
return error("No such extension: " + extension);
|
.pipe(buffer())
|
||||||
}
|
.pipe(json({ __metadata: metadata }))
|
||||||
var metadata = {
|
.pipe(packageJsonFilter.restore);
|
||||||
id: extension.extensionId,
|
|
||||||
publisherId: extension.publisher,
|
|
||||||
publisherDisplayName: extension.publisher.displayName
|
|
||||||
};
|
|
||||||
var extensionVersion = extension.versions.filter(function (v) { return v.version === version; })[0];
|
|
||||||
if (!extensionVersion) {
|
|
||||||
return error("No such extension version: " + extensionName + " @ " + version);
|
|
||||||
}
|
|
||||||
var asset = extensionVersion.files.filter(function (f) { return f.assetType === 'Microsoft.VisualStudio.Services.VSIXPackage'; })[0];
|
|
||||||
if (!asset) {
|
|
||||||
return error("No VSIX found for extension version: " + extensionName + " @ " + version);
|
|
||||||
}
|
|
||||||
util.log('Downloading extension:', util.colors.yellow(extensionName + "@" + version), '...');
|
|
||||||
var options = {
|
|
||||||
base: asset.source,
|
|
||||||
requestOptions: {
|
|
||||||
gzip: true,
|
|
||||||
headers: baseHeaders
|
|
||||||
}
|
|
||||||
};
|
|
||||||
return remote('', options)
|
|
||||||
.pipe(flatmap(function (stream) {
|
|
||||||
var packageJsonFilter = filter('package.json', { restore: true });
|
|
||||||
return stream
|
|
||||||
.pipe(vzip.src())
|
|
||||||
.pipe(filter('extension/**'))
|
|
||||||
.pipe(rename(function (p) { return p.dirname = p.dirname.replace(/^extension\/?/, ''); }))
|
|
||||||
.pipe(packageJsonFilter)
|
|
||||||
.pipe(buffer())
|
|
||||||
.pipe(json({ __metadata: metadata }))
|
|
||||||
.pipe(packageJsonFilter.restore);
|
|
||||||
}));
|
|
||||||
}));
|
|
||||||
}
|
}
|
||||||
exports.fromMarketplace = fromMarketplace;
|
exports.fromMarketplace = fromMarketplace;
|
||||||
|
const excludedExtensions = [
|
||||||
|
'vscode-api-tests',
|
||||||
|
'vscode-colorize-tests',
|
||||||
|
'ms-vscode.node-debug',
|
||||||
|
'ms-vscode.node-debug2',
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
'integration-tests'
|
||||||
|
];
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
const sqlBuiltInExtensions = [
|
||||||
|
// Add SQL built-in extensions here.
|
||||||
|
// the extension will be excluded from SQLOps package and will have separate vsix packages
|
||||||
|
'agent',
|
||||||
|
'import',
|
||||||
|
'profiler',
|
||||||
|
'admin-pack',
|
||||||
|
'big-data-cluster',
|
||||||
|
'dacpac'
|
||||||
|
];
|
||||||
|
var azureExtensions = ['azurecore', 'mssql'];
|
||||||
|
const builtInExtensions = require('../builtInExtensions.json');
|
||||||
|
/**
|
||||||
|
* We're doing way too much stuff at once, with webpack et al. So much stuff
|
||||||
|
* that while downloading extensions from the marketplace, node js doesn't get enough
|
||||||
|
* stack frames to complete the download in under 2 minutes, at which point the
|
||||||
|
* marketplace server cuts off the http request. So, we sequentialize the extensino tasks.
|
||||||
|
*/
|
||||||
|
function sequence(streamProviders) {
|
||||||
|
const result = es.through();
|
||||||
|
function pop() {
|
||||||
|
if (streamProviders.length === 0) {
|
||||||
|
result.emit('end');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const fn = streamProviders.shift();
|
||||||
|
fn()
|
||||||
|
.on('end', function () { setTimeout(pop, 0); })
|
||||||
|
.pipe(result, { end: false });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
pop();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
function packageExtensionsStream(optsIn) {
|
||||||
|
const opts = optsIn || {};
|
||||||
|
const localExtensionDescriptions = glob.sync('extensions/*/package.json')
|
||||||
|
.map(manifestPath => {
|
||||||
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
|
const extensionName = path.basename(extensionPath);
|
||||||
|
return { name: extensionName, path: extensionPath };
|
||||||
|
})
|
||||||
|
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
||||||
|
.filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true)
|
||||||
|
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) === -1)
|
||||||
|
.filter(({ name }) => azureExtensions.indexOf(name) === -1);
|
||||||
|
const localExtensions = () => sequence([...localExtensionDescriptions.map(extension => () => {
|
||||||
|
return fromLocal(extension.path, opts.sourceMappingURLBase)
|
||||||
|
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
|
})]);
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
const extensionDepsSrc = [
|
||||||
|
..._.flatten(extensionsProductionDependencies.map((d) => path.relative(root, d.path)).map((d) => [`${d}/**`, `!${d}/**/{test,tests}/**`])),
|
||||||
|
];
|
||||||
|
const localExtensionDependencies = () => gulp.src(extensionDepsSrc, { base: '.', dot: true })
|
||||||
|
.pipe(filter(['**', '!**/package-lock.json']))
|
||||||
|
.pipe(util2.cleanNodeModule('account-provider-azure', ['node_modules/date-utils/doc/**', 'node_modules/adal_node/node_modules/**'], undefined))
|
||||||
|
.pipe(util2.cleanNodeModule('typescript', ['**/**'], undefined));
|
||||||
|
// Original code commented out here
|
||||||
|
// const localExtensionDependencies = () => gulp.src('extensions/node_modules/**', { base: '.' });
|
||||||
|
// const marketplaceExtensions = () => es.merge(
|
||||||
|
// ...builtInExtensions
|
||||||
|
// .filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true)
|
||||||
|
// .map(extension => {
|
||||||
|
// return fromMarketplace(extension.name, extension.version, extension.metadata)
|
||||||
|
// .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
|
// })
|
||||||
|
// );
|
||||||
|
return sequence([localExtensions, localExtensionDependencies,])
|
||||||
|
.pipe(util2.setExecutableBit(['**/*.sh']))
|
||||||
|
.pipe(filter(['**', '!**/*.js.map']));
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
|
}
|
||||||
|
exports.packageExtensionsStream = packageExtensionsStream;
|
||||||
|
|||||||
@@ -4,22 +4,221 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
import * as es from 'event-stream';
|
import * as es from 'event-stream';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as glob from 'glob';
|
||||||
|
import * as gulp from 'gulp';
|
||||||
|
import * as path from 'path';
|
||||||
import { Stream } from 'stream';
|
import { Stream } from 'stream';
|
||||||
import assign = require('object-assign');
|
import * as File from 'vinyl';
|
||||||
|
import * as vsce from 'vsce';
|
||||||
|
import { createStatsStream } from './stats';
|
||||||
|
import * as util2 from './util';
|
||||||
import remote = require('gulp-remote-src');
|
import remote = require('gulp-remote-src');
|
||||||
const flatmap = require('gulp-flatmap');
|
|
||||||
const vzip = require('gulp-vinyl-zip');
|
const vzip = require('gulp-vinyl-zip');
|
||||||
const filter = require('gulp-filter');
|
import filter = require('gulp-filter');
|
||||||
const rename = require('gulp-rename');
|
import rename = require('gulp-rename');
|
||||||
const util = require('gulp-util');
|
const util = require('gulp-util');
|
||||||
const buffer = require('gulp-buffer');
|
const buffer = require('gulp-buffer');
|
||||||
const json = require('gulp-json-editor');
|
import json = require('gulp-json-editor');
|
||||||
import * as fs from 'fs';
|
const webpack = require('webpack');
|
||||||
import * as path from 'path';
|
const webpackGulp = require('webpack-stream');
|
||||||
import * as vsce from 'vsce';
|
|
||||||
import * as File from 'vinyl';
|
|
||||||
|
|
||||||
export function fromLocal(extensionPath: string): Stream {
|
const root = path.resolve(path.join(__dirname, '..', '..'));
|
||||||
|
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
import * as _ from 'underscore';
|
||||||
|
import * as vfs from 'vinyl-fs';
|
||||||
|
const deps = require('../dependencies');
|
||||||
|
const extensionsRoot = path.join(root, 'extensions');
|
||||||
|
const extensionsProductionDependencies = deps.getProductionDependencies(extensionsRoot);
|
||||||
|
|
||||||
|
export function packageBuiltInExtensions() {
|
||||||
|
const sqlBuiltInLocalExtensionDescriptions = glob.sync('extensions/*/package.json')
|
||||||
|
.map(manifestPath => {
|
||||||
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
|
const extensionName = path.basename(extensionPath);
|
||||||
|
return { name: extensionName, path: extensionPath };
|
||||||
|
})
|
||||||
|
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
||||||
|
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
||||||
|
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) >= 0);
|
||||||
|
sqlBuiltInLocalExtensionDescriptions.forEach(element => {
|
||||||
|
const packagePath = path.join(path.dirname(root), element.name + '.vsix');
|
||||||
|
console.info('Creating vsix for ' + element.path + ' result:' + packagePath);
|
||||||
|
vsce.createVSIX({
|
||||||
|
cwd: element.path,
|
||||||
|
packagePath: packagePath,
|
||||||
|
useYarn: true
|
||||||
|
});
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function packageExtensionTask(extensionName: string, platform: string, arch: string) {
|
||||||
|
var destination = path.join(path.dirname(root), 'azuredatastudio') + (platform ? '-' + platform : '') + (arch ? '-' + arch : '');
|
||||||
|
if (platform === 'darwin') {
|
||||||
|
destination = path.join(destination, 'Azure Data Studio.app', 'Contents', 'Resources', 'app', 'extensions', extensionName);
|
||||||
|
} else {
|
||||||
|
destination = path.join(destination, 'resources', 'app', 'extensions', extensionName);
|
||||||
|
}
|
||||||
|
|
||||||
|
platform = platform || process.platform;
|
||||||
|
|
||||||
|
return () => {
|
||||||
|
const root = path.resolve(path.join(__dirname, '../..'));
|
||||||
|
const localExtensionDescriptions = glob.sync('extensions/*/package.json')
|
||||||
|
.map(manifestPath => {
|
||||||
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
|
const extensionName = path.basename(extensionPath);
|
||||||
|
return { name: extensionName, path: extensionPath };
|
||||||
|
})
|
||||||
|
.filter(({ name }) => extensionName === name);
|
||||||
|
|
||||||
|
const localExtensions = es.merge(...localExtensionDescriptions.map(extension => {
|
||||||
|
return fromLocal(extension.path);
|
||||||
|
}));
|
||||||
|
|
||||||
|
let result = localExtensions
|
||||||
|
.pipe(util2.skipDirectories())
|
||||||
|
.pipe(util2.fixWin32DirectoryPermissions())
|
||||||
|
.pipe(filter(['**', '!LICENSE', '!LICENSES.chromium.html', '!version']));
|
||||||
|
|
||||||
|
return result.pipe(vfs.dest(destination));
|
||||||
|
};
|
||||||
|
}
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
|
|
||||||
|
function fromLocal(extensionPath: string, sourceMappingURLBase?: string): Stream {
|
||||||
|
const webpackFilename = path.join(extensionPath, 'extension.webpack.config.js');
|
||||||
|
if (fs.existsSync(webpackFilename)) {
|
||||||
|
return fromLocalWebpack(extensionPath, sourceMappingURLBase);
|
||||||
|
} else {
|
||||||
|
return fromLocalNormal(extensionPath);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function fromLocalWebpack(extensionPath: string, sourceMappingURLBase: string | undefined): Stream {
|
||||||
|
const result = es.through();
|
||||||
|
|
||||||
|
const packagedDependencies: string[] = [];
|
||||||
|
const packageJsonConfig = require(path.join(extensionPath, 'package.json'));
|
||||||
|
if (packageJsonConfig.dependencies) {
|
||||||
|
const webpackRootConfig = require(path.join(extensionPath, 'extension.webpack.config.js'));
|
||||||
|
for (const key in webpackRootConfig.externals) {
|
||||||
|
if (key in packageJsonConfig.dependencies) {
|
||||||
|
packagedDependencies.push(key);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn, packagedDependencies }).then(fileNames => {
|
||||||
|
const files = fileNames
|
||||||
|
.map(fileName => path.join(extensionPath, fileName))
|
||||||
|
.map(filePath => new File({
|
||||||
|
path: filePath,
|
||||||
|
stat: fs.statSync(filePath),
|
||||||
|
base: extensionPath,
|
||||||
|
contents: fs.createReadStream(filePath) as any
|
||||||
|
}));
|
||||||
|
|
||||||
|
const filesStream = es.readArray(files);
|
||||||
|
|
||||||
|
// check for a webpack configuration files, then invoke webpack
|
||||||
|
// and merge its output with the files stream. also rewrite the package.json
|
||||||
|
// file to a new entry point
|
||||||
|
const webpackConfigLocations = (<string[]>glob.sync(
|
||||||
|
path.join(extensionPath, '/**/extension.webpack.config.js'),
|
||||||
|
{ ignore: ['**/node_modules'] }
|
||||||
|
));
|
||||||
|
|
||||||
|
const packageJsonFilter = filter(f => {
|
||||||
|
if (path.basename(f.path) === 'package.json') {
|
||||||
|
// only modify package.json's next to the webpack file.
|
||||||
|
// to be safe, use existsSync instead of path comparison.
|
||||||
|
return fs.existsSync(path.join(path.dirname(f.path), 'extension.webpack.config.js'));
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}, { restore: true });
|
||||||
|
|
||||||
|
const patchFilesStream = filesStream
|
||||||
|
.pipe(packageJsonFilter)
|
||||||
|
.pipe(buffer())
|
||||||
|
.pipe(json((data: any) => {
|
||||||
|
if (data.main) {
|
||||||
|
// hardcoded entry point directory!
|
||||||
|
data.main = data.main.replace('/out/', /dist/);
|
||||||
|
}
|
||||||
|
return data;
|
||||||
|
}))
|
||||||
|
.pipe(packageJsonFilter.restore);
|
||||||
|
|
||||||
|
|
||||||
|
const webpackStreams = webpackConfigLocations.map(webpackConfigPath => () => {
|
||||||
|
|
||||||
|
const webpackDone = (err: any, stats: any) => {
|
||||||
|
util.log(`Bundled extension: ${util.colors.yellow(path.join(path.basename(extensionPath), path.relative(extensionPath, webpackConfigPath)))}...`);
|
||||||
|
if (err) {
|
||||||
|
result.emit('error', err);
|
||||||
|
}
|
||||||
|
const { compilation } = stats;
|
||||||
|
if (compilation.errors.length > 0) {
|
||||||
|
result.emit('error', compilation.errors.join('\n'));
|
||||||
|
}
|
||||||
|
if (compilation.warnings.length > 0) {
|
||||||
|
result.emit('error', compilation.warnings.join('\n'));
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
const webpackConfig = {
|
||||||
|
...require(webpackConfigPath),
|
||||||
|
...{ mode: 'production' }
|
||||||
|
};
|
||||||
|
const relativeOutputPath = path.relative(extensionPath, webpackConfig.output.path);
|
||||||
|
|
||||||
|
return webpackGulp(webpackConfig, webpack, webpackDone)
|
||||||
|
.pipe(es.through(function (data) {
|
||||||
|
data.stat = data.stat || {};
|
||||||
|
data.base = extensionPath;
|
||||||
|
this.emit('data', data);
|
||||||
|
}))
|
||||||
|
.pipe(es.through(function (data: File) {
|
||||||
|
// source map handling:
|
||||||
|
// * rewrite sourceMappingURL
|
||||||
|
// * save to disk so that upload-task picks this up
|
||||||
|
if (sourceMappingURLBase) {
|
||||||
|
const contents = (<Buffer>data.contents).toString('utf8');
|
||||||
|
data.contents = Buffer.from(contents.replace(/\n\/\/# sourceMappingURL=(.*)$/gm, function (_m, g1) {
|
||||||
|
return `\n//# sourceMappingURL=${sourceMappingURLBase}/extensions/${path.basename(extensionPath)}/${relativeOutputPath}/${g1}`;
|
||||||
|
}), 'utf8');
|
||||||
|
|
||||||
|
if (/\.js\.map$/.test(data.path)) {
|
||||||
|
if (!fs.existsSync(path.dirname(data.path))) {
|
||||||
|
fs.mkdirSync(path.dirname(data.path));
|
||||||
|
}
|
||||||
|
fs.writeFileSync(data.path, data.contents);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.emit('data', data);
|
||||||
|
}));
|
||||||
|
});
|
||||||
|
|
||||||
|
es.merge(sequence(webpackStreams), patchFilesStream)
|
||||||
|
// .pipe(es.through(function (data) {
|
||||||
|
// // debug
|
||||||
|
// console.log('out', data.path, data.contents.length);
|
||||||
|
// this.emit('data', data);
|
||||||
|
// }))
|
||||||
|
.pipe(result);
|
||||||
|
|
||||||
|
}).catch(err => {
|
||||||
|
console.error(extensionPath);
|
||||||
|
console.error(packagedDependencies);
|
||||||
|
result.emit('error', err);
|
||||||
|
});
|
||||||
|
|
||||||
|
return result.pipe(createStatsStream(path.basename(extensionPath)));
|
||||||
|
}
|
||||||
|
|
||||||
|
function fromLocalNormal(extensionPath: string): Stream {
|
||||||
const result = es.through();
|
const result = es.through();
|
||||||
|
|
||||||
vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn })
|
vsce.listFiles({ cwd: extensionPath, packageManager: vsce.PackageManager.Yarn })
|
||||||
@@ -37,96 +236,150 @@ export function fromLocal(extensionPath: string): Stream {
|
|||||||
})
|
})
|
||||||
.catch(err => result.emit('error', err));
|
.catch(err => result.emit('error', err));
|
||||||
|
|
||||||
return result;
|
return result.pipe(createStatsStream(path.basename(extensionPath)));
|
||||||
}
|
|
||||||
|
|
||||||
function error(err: any): Stream {
|
|
||||||
const result = es.through();
|
|
||||||
setTimeout(() => result.emit('error', err));
|
|
||||||
return result;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
const baseHeaders = {
|
const baseHeaders = {
|
||||||
'X-Market-Client-Id': 'VSCode Build',
|
'X-Market-Client-Id': 'VSCode Build',
|
||||||
'User-Agent': 'VSCode Build',
|
'User-Agent': 'VSCode Build',
|
||||||
|
'X-Market-User-Id': '291C1CD0-051A-4123-9B4B-30D60EF52EE2',
|
||||||
};
|
};
|
||||||
|
|
||||||
export function fromMarketplace(extensionName: string, version: string): Stream {
|
export function fromMarketplace(extensionName: string, version: string, metadata: any): Stream {
|
||||||
const filterType = 7;
|
const [publisher, name] = extensionName.split('.');
|
||||||
const value = extensionName;
|
const url = `https://marketplace.visualstudio.com/_apis/public/gallery/publishers/${publisher}/vsextensions/${name}/${version}/vspackage`;
|
||||||
const criterium = { filterType, value };
|
|
||||||
const criteria = [criterium];
|
util.log('Downloading extension:', util.colors.yellow(`${extensionName}@${version}`), '...');
|
||||||
const pageNumber = 1;
|
|
||||||
const pageSize = 1;
|
|
||||||
const sortBy = 0;
|
|
||||||
const sortOrder = 0;
|
|
||||||
const flags = 0x1 | 0x2 | 0x80;
|
|
||||||
const assetTypes = ['Microsoft.VisualStudio.Services.VSIXPackage'];
|
|
||||||
const filters = [{ criteria, pageNumber, pageSize, sortBy, sortOrder }];
|
|
||||||
const body = JSON.stringify({ filters, assetTypes, flags });
|
|
||||||
const headers: any = assign({}, baseHeaders, {
|
|
||||||
'Content-Type': 'application/json',
|
|
||||||
'Accept': 'application/json;api-version=3.0-preview.1',
|
|
||||||
'Content-Length': body.length
|
|
||||||
});
|
|
||||||
|
|
||||||
const options = {
|
const options = {
|
||||||
base: 'https://marketplace.visualstudio.com/_apis/public/gallery',
|
base: url,
|
||||||
requestOptions: {
|
requestOptions: {
|
||||||
method: 'POST',
|
|
||||||
gzip: true,
|
gzip: true,
|
||||||
headers,
|
headers: baseHeaders
|
||||||
body: body
|
|
||||||
}
|
}
|
||||||
};
|
};
|
||||||
|
|
||||||
return remote('/extensionquery', options)
|
const packageJsonFilter = filter('package.json', { restore: true });
|
||||||
.pipe(flatmap((stream, f) => {
|
|
||||||
const rawResult = f.contents.toString('utf8');
|
|
||||||
const result = JSON.parse(rawResult);
|
|
||||||
const extension = result.results[0].extensions[0];
|
|
||||||
if (!extension) {
|
|
||||||
return error(`No such extension: ${extension}`);
|
|
||||||
}
|
|
||||||
|
|
||||||
const metadata = {
|
return remote('', options)
|
||||||
id: extension.extensionId,
|
.pipe(vzip.src())
|
||||||
publisherId: extension.publisher,
|
.pipe(filter('extension/**'))
|
||||||
publisherDisplayName: extension.publisher.displayName
|
.pipe(rename(p => p.dirname = p.dirname!.replace(/^extension\/?/, '')))
|
||||||
};
|
.pipe(packageJsonFilter)
|
||||||
|
.pipe(buffer())
|
||||||
const extensionVersion = extension.versions.filter(v => v.version === version)[0];
|
.pipe(json({ __metadata: metadata }))
|
||||||
if (!extensionVersion) {
|
.pipe(packageJsonFilter.restore);
|
||||||
return error(`No such extension version: ${extensionName} @ ${version}`);
|
}
|
||||||
}
|
|
||||||
|
interface IPackageExtensionsOptions {
|
||||||
const asset = extensionVersion.files.filter(f => f.assetType === 'Microsoft.VisualStudio.Services.VSIXPackage')[0];
|
/**
|
||||||
if (!asset) {
|
* Set to undefined to package all of them.
|
||||||
return error(`No VSIX found for extension version: ${extensionName} @ ${version}`);
|
*/
|
||||||
}
|
desiredExtensions?: string[];
|
||||||
|
sourceMappingURLBase?: string;
|
||||||
util.log('Downloading extension:', util.colors.yellow(`${extensionName}@${version}`), '...');
|
}
|
||||||
|
|
||||||
const options = {
|
const excludedExtensions = [
|
||||||
base: asset.source,
|
'vscode-api-tests',
|
||||||
requestOptions: {
|
'vscode-colorize-tests',
|
||||||
gzip: true,
|
'ms-vscode.node-debug',
|
||||||
headers: baseHeaders
|
'ms-vscode.node-debug2',
|
||||||
}
|
// {{SQL CARBON EDIT}}
|
||||||
};
|
'integration-tests'
|
||||||
|
];
|
||||||
return remote('', options)
|
|
||||||
.pipe(flatmap(stream => {
|
// {{SQL CARBON EDIT}}
|
||||||
const packageJsonFilter = filter('package.json', { restore: true });
|
const sqlBuiltInExtensions = [
|
||||||
|
// Add SQL built-in extensions here.
|
||||||
return stream
|
// the extension will be excluded from SQLOps package and will have separate vsix packages
|
||||||
.pipe(vzip.src())
|
'agent',
|
||||||
.pipe(filter('extension/**'))
|
'import',
|
||||||
.pipe(rename(p => p.dirname = p.dirname.replace(/^extension\/?/, '')))
|
'profiler',
|
||||||
.pipe(packageJsonFilter)
|
'admin-pack',
|
||||||
.pipe(buffer())
|
'big-data-cluster',
|
||||||
.pipe(json({ __metadata: metadata }))
|
'dacpac'
|
||||||
.pipe(packageJsonFilter.restore);
|
];
|
||||||
}));
|
var azureExtensions = ['azurecore', 'mssql'];
|
||||||
}));
|
// {{SQL CARBON EDIT}} - End
|
||||||
|
|
||||||
|
interface IBuiltInExtension {
|
||||||
|
name: string;
|
||||||
|
version: string;
|
||||||
|
repo: string;
|
||||||
|
metadata: any;
|
||||||
|
}
|
||||||
|
|
||||||
|
const builtInExtensions: IBuiltInExtension[] = require('../builtInExtensions.json');
|
||||||
|
|
||||||
|
/**
|
||||||
|
* We're doing way too much stuff at once, with webpack et al. So much stuff
|
||||||
|
* that while downloading extensions from the marketplace, node js doesn't get enough
|
||||||
|
* stack frames to complete the download in under 2 minutes, at which point the
|
||||||
|
* marketplace server cuts off the http request. So, we sequentialize the extensino tasks.
|
||||||
|
*/
|
||||||
|
function sequence(streamProviders: { (): Stream }[]): Stream {
|
||||||
|
const result = es.through();
|
||||||
|
|
||||||
|
function pop() {
|
||||||
|
if (streamProviders.length === 0) {
|
||||||
|
result.emit('end');
|
||||||
|
} else {
|
||||||
|
const fn = streamProviders.shift()!;
|
||||||
|
fn()
|
||||||
|
.on('end', function () { setTimeout(pop, 0); })
|
||||||
|
.pipe(result, { end: false });
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
pop();
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
export function packageExtensionsStream(optsIn?: IPackageExtensionsOptions): NodeJS.ReadWriteStream {
|
||||||
|
const opts = optsIn || {};
|
||||||
|
|
||||||
|
const localExtensionDescriptions = (<string[]>glob.sync('extensions/*/package.json'))
|
||||||
|
.map(manifestPath => {
|
||||||
|
const extensionPath = path.dirname(path.join(root, manifestPath));
|
||||||
|
const extensionName = path.basename(extensionPath);
|
||||||
|
return { name: extensionName, path: extensionPath };
|
||||||
|
})
|
||||||
|
.filter(({ name }) => excludedExtensions.indexOf(name) === -1)
|
||||||
|
.filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true)
|
||||||
|
.filter(({ name }) => builtInExtensions.every(b => b.name !== name))
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
.filter(({ name }) => sqlBuiltInExtensions.indexOf(name) === -1)
|
||||||
|
.filter(({ name }) => azureExtensions.indexOf(name) === -1);
|
||||||
|
|
||||||
|
const localExtensions = () => sequence([...localExtensionDescriptions.map(extension => () => {
|
||||||
|
return fromLocal(extension.path, opts.sourceMappingURLBase)
|
||||||
|
.pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
|
})]);
|
||||||
|
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
const extensionDepsSrc = [
|
||||||
|
..._.flatten(extensionsProductionDependencies.map((d: any) => path.relative(root, d.path)).map((d: any) => [`${d}/**`, `!${d}/**/{test,tests}/**`])),
|
||||||
|
];
|
||||||
|
|
||||||
|
const localExtensionDependencies = () => gulp.src(extensionDepsSrc, { base: '.', dot: true })
|
||||||
|
.pipe(filter(['**', '!**/package-lock.json']))
|
||||||
|
.pipe(util2.cleanNodeModule('account-provider-azure', ['node_modules/date-utils/doc/**', 'node_modules/adal_node/node_modules/**'], undefined))
|
||||||
|
.pipe(util2.cleanNodeModule('typescript', ['**/**'], undefined));
|
||||||
|
|
||||||
|
// Original code commented out here
|
||||||
|
// const localExtensionDependencies = () => gulp.src('extensions/node_modules/**', { base: '.' });
|
||||||
|
|
||||||
|
// const marketplaceExtensions = () => es.merge(
|
||||||
|
// ...builtInExtensions
|
||||||
|
// .filter(({ name }) => opts.desiredExtensions ? opts.desiredExtensions.indexOf(name) >= 0 : true)
|
||||||
|
// .map(extension => {
|
||||||
|
// return fromMarketplace(extension.name, extension.version, extension.metadata)
|
||||||
|
// .pipe(rename(p => p.dirname = `extensions/${extension.name}/${p.dirname}`));
|
||||||
|
// })
|
||||||
|
// );
|
||||||
|
|
||||||
|
return sequence([localExtensions, localExtensionDependencies, /*marketplaceExtensions*/])
|
||||||
|
.pipe(util2.setExecutableBit(['**/*.sh']))
|
||||||
|
.pipe(filter(['**', '!**/*.js.map']));
|
||||||
|
// {{SQL CARBON EDIT}} - End
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -4,15 +4,15 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
'use strict';
|
'use strict';
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var path = require("path");
|
const path = require("path");
|
||||||
var fs = require("fs");
|
const fs = require("fs");
|
||||||
/**
|
/**
|
||||||
* Returns the sha1 commit version of a repository or undefined in case of failure.
|
* Returns the sha1 commit version of a repository or undefined in case of failure.
|
||||||
*/
|
*/
|
||||||
function getVersion(repo) {
|
function getVersion(repo) {
|
||||||
var git = path.join(repo, '.git');
|
const git = path.join(repo, '.git');
|
||||||
var headPath = path.join(git, 'HEAD');
|
const headPath = path.join(git, 'HEAD');
|
||||||
var head;
|
let head;
|
||||||
try {
|
try {
|
||||||
head = fs.readFileSync(headPath, 'utf8').trim();
|
head = fs.readFileSync(headPath, 'utf8').trim();
|
||||||
}
|
}
|
||||||
@@ -22,29 +22,29 @@ function getVersion(repo) {
|
|||||||
if (/^[0-9a-f]{40}$/i.test(head)) {
|
if (/^[0-9a-f]{40}$/i.test(head)) {
|
||||||
return head;
|
return head;
|
||||||
}
|
}
|
||||||
var refMatch = /^ref: (.*)$/.exec(head);
|
const refMatch = /^ref: (.*)$/.exec(head);
|
||||||
if (!refMatch) {
|
if (!refMatch) {
|
||||||
return void 0;
|
return void 0;
|
||||||
}
|
}
|
||||||
var ref = refMatch[1];
|
const ref = refMatch[1];
|
||||||
var refPath = path.join(git, ref);
|
const refPath = path.join(git, ref);
|
||||||
try {
|
try {
|
||||||
return fs.readFileSync(refPath, 'utf8').trim();
|
return fs.readFileSync(refPath, 'utf8').trim();
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
// noop
|
// noop
|
||||||
}
|
}
|
||||||
var packedRefsPath = path.join(git, 'packed-refs');
|
const packedRefsPath = path.join(git, 'packed-refs');
|
||||||
var refsRaw;
|
let refsRaw;
|
||||||
try {
|
try {
|
||||||
refsRaw = fs.readFileSync(packedRefsPath, 'utf8').trim();
|
refsRaw = fs.readFileSync(packedRefsPath, 'utf8').trim();
|
||||||
}
|
}
|
||||||
catch (e) {
|
catch (e) {
|
||||||
return void 0;
|
return void 0;
|
||||||
}
|
}
|
||||||
var refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm;
|
const refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm;
|
||||||
var refsMatch;
|
let refsMatch;
|
||||||
var refs = {};
|
let refs = {};
|
||||||
while (refsMatch = refsRegex.exec(refsRaw)) {
|
while (refsMatch = refsRegex.exec(refsRaw)) {
|
||||||
refs[refsMatch[2]] = refsMatch[1];
|
refs[refsMatch[2]] = refsMatch[1];
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -10,7 +10,7 @@ import * as fs from 'fs';
|
|||||||
/**
|
/**
|
||||||
* Returns the sha1 commit version of a repository or undefined in case of failure.
|
* Returns the sha1 commit version of a repository or undefined in case of failure.
|
||||||
*/
|
*/
|
||||||
export function getVersion(repo: string): string {
|
export function getVersion(repo: string): string | undefined {
|
||||||
const git = path.join(repo, '.git');
|
const git = path.join(repo, '.git');
|
||||||
const headPath = path.join(git, 'HEAD');
|
const headPath = path.join(git, 'HEAD');
|
||||||
let head: string;
|
let head: string;
|
||||||
@@ -50,7 +50,7 @@ export function getVersion(repo: string): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
const refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm;
|
const refsRegex = /^([0-9a-f]{40})\s+(.+)$/gm;
|
||||||
let refsMatch: RegExpExecArray;
|
let refsMatch: RegExpExecArray | null;
|
||||||
let refs: { [ref: string]: string } = {};
|
let refs: { [ref: string]: string } = {};
|
||||||
|
|
||||||
while (refsMatch = refsRegex.exec(refsRaw)) {
|
while (refsMatch = refsRegex.exec(refsRaw)) {
|
||||||
|
|||||||
File diff suppressed because it is too large
Load Diff
@@ -34,6 +34,10 @@
|
|||||||
"name": "vs/workbench/parts/codeEditor",
|
"name": "vs/workbench/parts/codeEditor",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/parts/comments",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/parts/debug",
|
"name": "vs/workbench/parts/debug",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -106,6 +110,10 @@
|
|||||||
"name": "vs/workbench/parts/snippets",
|
"name": "vs/workbench/parts/snippets",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/parts/stats",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/parts/surveys",
|
"name": "vs/workbench/parts/surveys",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -130,22 +138,46 @@
|
|||||||
"name": "vs/workbench/parts/update",
|
"name": "vs/workbench/parts/update",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/parts/url",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/parts/watermark",
|
"name": "vs/workbench/parts/watermark",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/parts/webview",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/parts/welcome",
|
"name": "vs/workbench/parts/welcome",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/parts/outline",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/actions",
|
"name": "vs/workbench/services/actions",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/services/bulkEdit",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/services/commands",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/configuration",
|
"name": "vs/workbench/services/configuration",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/services/configurationResolver",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/crashReporter",
|
"name": "vs/workbench/services/crashReporter",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -182,6 +214,10 @@
|
|||||||
"name": "vs/workbench/services/progress",
|
"name": "vs/workbench/services/progress",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/services/remote",
|
||||||
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
{
|
{
|
||||||
"name": "vs/workbench/services/textfile",
|
"name": "vs/workbench/services/textfile",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
@@ -201,6 +237,10 @@
|
|||||||
{
|
{
|
||||||
"name": "vs/workbench/services/decorations",
|
"name": "vs/workbench/services/decorations",
|
||||||
"project": "vscode-workbench"
|
"project": "vscode-workbench"
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"name": "vs/workbench/services/preferences",
|
||||||
|
"project": "vscode-preferences"
|
||||||
}
|
}
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -7,15 +7,15 @@ import * as path from 'path';
|
|||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
|
|
||||||
import { through, readable, ThroughStream } from 'event-stream';
|
import { through, readable, ThroughStream } from 'event-stream';
|
||||||
import File = require('vinyl');
|
import * as File from 'vinyl';
|
||||||
import * as Is from 'is';
|
import * as Is from 'is';
|
||||||
import * as xml2js from 'xml2js';
|
import * as xml2js from 'xml2js';
|
||||||
import * as glob from 'glob';
|
import * as glob from 'glob';
|
||||||
import * as https from 'https';
|
import * as https from 'https';
|
||||||
import * as gulp from 'gulp';
|
import * as gulp from 'gulp';
|
||||||
|
|
||||||
var util = require('gulp-util');
|
import * as util from 'gulp-util';
|
||||||
var iconv = require('iconv-lite');
|
import * as iconv from 'iconv-lite';
|
||||||
|
|
||||||
const NUMBER_OF_CONCURRENT_DOWNLOADS = 4;
|
const NUMBER_OF_CONCURRENT_DOWNLOADS = 4;
|
||||||
|
|
||||||
@@ -57,7 +57,7 @@ export const extraLanguages: Language[] = [
|
|||||||
];
|
];
|
||||||
|
|
||||||
// non built-in extensions also that are transifex and need to be part of the language packs
|
// non built-in extensions also that are transifex and need to be part of the language packs
|
||||||
const externalExtensionsWithTranslations = {
|
export const externalExtensionsWithTranslations = {
|
||||||
'vscode-chrome-debug': 'msjsdiag.debugger-for-chrome',
|
'vscode-chrome-debug': 'msjsdiag.debugger-for-chrome',
|
||||||
'vscode-node-debug': 'ms-vscode.node-debug',
|
'vscode-node-debug': 'ms-vscode.node-debug',
|
||||||
'vscode-node-debug2': 'ms-vscode.node-debug2'
|
'vscode-node-debug2': 'ms-vscode.node-debug2'
|
||||||
@@ -71,7 +71,7 @@ interface Map<V> {
|
|||||||
interface Item {
|
interface Item {
|
||||||
id: string;
|
id: string;
|
||||||
message: string;
|
message: string;
|
||||||
comment: string;
|
comment?: string;
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface Resource {
|
export interface Resource {
|
||||||
@@ -137,27 +137,6 @@ module PackageJsonFormat {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
interface ModuleJsonFormat {
|
|
||||||
messages: string[];
|
|
||||||
keys: (string | LocalizeInfo)[];
|
|
||||||
}
|
|
||||||
|
|
||||||
module ModuleJsonFormat {
|
|
||||||
export function is(value: any): value is ModuleJsonFormat {
|
|
||||||
let candidate = value as ModuleJsonFormat;
|
|
||||||
return Is.defined(candidate)
|
|
||||||
&& Is.array(candidate.messages) && candidate.messages.every(message => Is.string(message))
|
|
||||||
&& Is.array(candidate.keys) && candidate.keys.every(key => Is.string(key) || LocalizeInfo.is(key));
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
interface BundledExtensionHeaderFormat {
|
|
||||||
id: string;
|
|
||||||
type: string;
|
|
||||||
hash: string;
|
|
||||||
outDir: string;
|
|
||||||
}
|
|
||||||
|
|
||||||
interface BundledExtensionFormat {
|
interface BundledExtensionFormat {
|
||||||
[key: string]: {
|
[key: string]: {
|
||||||
messages: string[];
|
messages: string[];
|
||||||
@@ -168,7 +147,7 @@ interface BundledExtensionFormat {
|
|||||||
export class Line {
|
export class Line {
|
||||||
private buffer: string[] = [];
|
private buffer: string[] = [];
|
||||||
|
|
||||||
constructor(private indent: number = 0) {
|
constructor(indent: number = 0) {
|
||||||
if (indent > 0) {
|
if (indent > 0) {
|
||||||
this.buffer.push(new Array(indent + 1).join(' '));
|
this.buffer.push(new Array(indent + 1).join(' '));
|
||||||
}
|
}
|
||||||
@@ -235,8 +214,8 @@ export class XLF {
|
|||||||
let existingKeys = new Set<string>();
|
let existingKeys = new Set<string>();
|
||||||
for (let i = 0; i < keys.length; i++) {
|
for (let i = 0; i < keys.length; i++) {
|
||||||
let key = keys[i];
|
let key = keys[i];
|
||||||
let realKey: string;
|
let realKey: string | undefined;
|
||||||
let comment: string;
|
let comment: string | undefined;
|
||||||
if (Is.string(key)) {
|
if (Is.string(key)) {
|
||||||
realKey = key;
|
realKey = key;
|
||||||
comment = undefined;
|
comment = undefined;
|
||||||
@@ -286,17 +265,17 @@ export class XLF {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static parsePseudo = function (xlfString: string): Promise<ParsedXLF[]> {
|
static parsePseudo = function (xlfString: string): Promise<ParsedXLF[]> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((resolve) => {
|
||||||
let parser = new xml2js.Parser();
|
let parser = new xml2js.Parser();
|
||||||
let files: { messages: Map<string>, originalFilePath: string, language: string }[] = [];
|
let files: { messages: Map<string>, originalFilePath: string, language: string }[] = [];
|
||||||
parser.parseString(xlfString, function (err, result) {
|
parser.parseString(xlfString, function (_err: any, result: any) {
|
||||||
const fileNodes: any[] = result['xliff']['file'];
|
const fileNodes: any[] = result['xliff']['file'];
|
||||||
fileNodes.forEach(file => {
|
fileNodes.forEach(file => {
|
||||||
const originalFilePath = file.$.original;
|
const originalFilePath = file.$.original;
|
||||||
const messages: Map<string> = {};
|
const messages: Map<string> = {};
|
||||||
const transUnits = file.body[0]['trans-unit'];
|
const transUnits = file.body[0]['trans-unit'];
|
||||||
if (transUnits) {
|
if (transUnits) {
|
||||||
transUnits.forEach(unit => {
|
transUnits.forEach((unit: any) => {
|
||||||
const key = unit.$.id;
|
const key = unit.$.id;
|
||||||
const val = pseudify(unit.source[0]['_'].toString());
|
const val = pseudify(unit.source[0]['_'].toString());
|
||||||
if (key && val) {
|
if (key && val) {
|
||||||
@@ -317,7 +296,7 @@ export class XLF {
|
|||||||
|
|
||||||
let files: { messages: Map<string>, originalFilePath: string, language: string }[] = [];
|
let files: { messages: Map<string>, originalFilePath: string, language: string }[] = [];
|
||||||
|
|
||||||
parser.parseString(xlfString, function (err, result) {
|
parser.parseString(xlfString, function (err: any, result: any) {
|
||||||
if (err) {
|
if (err) {
|
||||||
reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`));
|
reject(new Error(`XLF parsing error: Failed to parse XLIFF string. ${err}`));
|
||||||
}
|
}
|
||||||
@@ -340,17 +319,20 @@ export class XLF {
|
|||||||
|
|
||||||
const transUnits = file.body[0]['trans-unit'];
|
const transUnits = file.body[0]['trans-unit'];
|
||||||
if (transUnits) {
|
if (transUnits) {
|
||||||
transUnits.forEach(unit => {
|
transUnits.forEach((unit: any) => {
|
||||||
const key = unit.$.id;
|
const key = unit.$.id;
|
||||||
if (!unit.target) {
|
if (!unit.target) {
|
||||||
return; // No translation available
|
return; // No translation available
|
||||||
}
|
}
|
||||||
|
|
||||||
const val = unit.target.toString();
|
let val = unit.target[0];
|
||||||
|
if (typeof val !== 'string') {
|
||||||
|
val = val._;
|
||||||
|
}
|
||||||
if (key && val) {
|
if (key && val) {
|
||||||
messages[key] = decodeEntities(val);
|
messages[key] = decodeEntities(val);
|
||||||
} else {
|
} else {
|
||||||
reject(new Error(`XLF parsing error: XLIFF file does not contain full localization data. ID or target translation for one of the trans-unit nodes is not present.`));
|
reject(new Error(`XLF parsing error: XLIFF file ${originalFilePath} does not contain full localization data. ID or target translation for one of the trans-unit nodes is not present.`));
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
files.push({ messages: messages, originalFilePath: originalFilePath, language: language.toLowerCase() });
|
files.push({ messages: messages, originalFilePath: originalFilePath, language: language.toLowerCase() });
|
||||||
@@ -369,7 +351,7 @@ export interface ITask<T> {
|
|||||||
|
|
||||||
interface ILimitedTaskFactory<T> {
|
interface ILimitedTaskFactory<T> {
|
||||||
factory: ITask<Promise<T>>;
|
factory: ITask<Promise<T>>;
|
||||||
c: (value?: T | Thenable<T>) => void;
|
c: (value?: T | Promise<T>) => void;
|
||||||
e: (error?: any) => void;
|
e: (error?: any) => void;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -391,7 +373,7 @@ export class Limiter<T> {
|
|||||||
|
|
||||||
private consume(): void {
|
private consume(): void {
|
||||||
while (this.outstandingPromises.length && this.runningPromises < this.maxDegreeOfParalellism) {
|
while (this.outstandingPromises.length && this.runningPromises < this.maxDegreeOfParalellism) {
|
||||||
const iLimitedTask = this.outstandingPromises.shift();
|
const iLimitedTask = this.outstandingPromises.shift()!;
|
||||||
this.runningPromises++;
|
this.runningPromises++;
|
||||||
|
|
||||||
const promise = iLimitedTask.factory();
|
const promise = iLimitedTask.factory();
|
||||||
@@ -419,8 +401,8 @@ function stripComments(content: string): string {
|
|||||||
* Third matches block comments
|
* Third matches block comments
|
||||||
* Fourth matches line comments
|
* Fourth matches line comments
|
||||||
*/
|
*/
|
||||||
var regexp: RegExp = /("(?:[^\\\"]*(?:\\.)?)*")|('(?:[^\\\']*(?:\\.)?)*')|(\/\*(?:\r?\n|.)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g;
|
const regexp = /("(?:[^\\\"]*(?:\\.)?)*")|('(?:[^\\\']*(?:\\.)?)*')|(\/\*(?:\r?\n|.)*?\*\/)|(\/{2,}.*?(?:(?:\r?\n)|$))/g;
|
||||||
let result = content.replace(regexp, (match, m1, m2, m3, m4) => {
|
let result = content.replace(regexp, (match, _m1, _m2, m3, m4) => {
|
||||||
// Only one of m1, m2, m3, m4 matches
|
// Only one of m1, m2, m3, m4 matches
|
||||||
if (m3) {
|
if (m3) {
|
||||||
// A block comment. Replace with nothing
|
// A block comment. Replace with nothing
|
||||||
@@ -442,9 +424,9 @@ function stripComments(content: string): string {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function escapeCharacters(value: string): string {
|
function escapeCharacters(value: string): string {
|
||||||
var result: string[] = [];
|
const result: string[] = [];
|
||||||
for (var i = 0; i < value.length; i++) {
|
for (let i = 0; i < value.length; i++) {
|
||||||
var ch = value.charAt(i);
|
const ch = value.charAt(i);
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case '\'':
|
case '\'':
|
||||||
result.push('\\\'');
|
result.push('\\\'');
|
||||||
@@ -484,7 +466,6 @@ function processCoreBundleFormat(fileHeader: string, languages: Language[], json
|
|||||||
|
|
||||||
let statistics: Map<number> = Object.create(null);
|
let statistics: Map<number> = Object.create(null);
|
||||||
|
|
||||||
let total: number = 0;
|
|
||||||
let defaultMessages: Map<Map<string>> = Object.create(null);
|
let defaultMessages: Map<Map<string>> = Object.create(null);
|
||||||
let modules = Object.keys(keysSection);
|
let modules = Object.keys(keysSection);
|
||||||
modules.forEach((module) => {
|
modules.forEach((module) => {
|
||||||
@@ -497,7 +478,6 @@ function processCoreBundleFormat(fileHeader: string, languages: Language[], json
|
|||||||
let messageMap: Map<string> = Object.create(null);
|
let messageMap: Map<string> = Object.create(null);
|
||||||
defaultMessages[module] = messageMap;
|
defaultMessages[module] = messageMap;
|
||||||
keys.map((key, i) => {
|
keys.map((key, i) => {
|
||||||
total++;
|
|
||||||
if (typeof key === 'string') {
|
if (typeof key === 'string') {
|
||||||
messageMap[key] = messages[i];
|
messageMap[key] = messages[i];
|
||||||
} else {
|
} else {
|
||||||
@@ -520,7 +500,7 @@ function processCoreBundleFormat(fileHeader: string, languages: Language[], json
|
|||||||
modules.forEach((module) => {
|
modules.forEach((module) => {
|
||||||
let order = keysSection[module];
|
let order = keysSection[module];
|
||||||
let i18nFile = path.join(cwd, module) + '.i18n.json';
|
let i18nFile = path.join(cwd, module) + '.i18n.json';
|
||||||
let messages: Map<string> = null;
|
let messages: Map<string> | null = null;
|
||||||
if (fs.existsSync(i18nFile)) {
|
if (fs.existsSync(i18nFile)) {
|
||||||
let content = stripComments(fs.readFileSync(i18nFile, 'utf8'));
|
let content = stripComments(fs.readFileSync(i18nFile, 'utf8'));
|
||||||
messages = JSON.parse(content);
|
messages = JSON.parse(content);
|
||||||
@@ -533,13 +513,13 @@ function processCoreBundleFormat(fileHeader: string, languages: Language[], json
|
|||||||
}
|
}
|
||||||
let localizedMessages: string[] = [];
|
let localizedMessages: string[] = [];
|
||||||
order.forEach((keyInfo) => {
|
order.forEach((keyInfo) => {
|
||||||
let key: string = null;
|
let key: string | null = null;
|
||||||
if (typeof keyInfo === 'string') {
|
if (typeof keyInfo === 'string') {
|
||||||
key = keyInfo;
|
key = keyInfo;
|
||||||
} else {
|
} else {
|
||||||
key = keyInfo.key;
|
key = keyInfo.key;
|
||||||
}
|
}
|
||||||
let message: string = messages[key];
|
let message: string = messages![key];
|
||||||
if (!message) {
|
if (!message) {
|
||||||
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
||||||
log(`No localized message found for key ${key} in module ${module}. Using default message.`);
|
log(`No localized message found for key ${key} in module ${module}. Using default message.`);
|
||||||
@@ -824,8 +804,8 @@ export function createXlfFilesForIsl(): ThroughStream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function pushXlfFiles(apiHostname: string, username: string, password: string): ThroughStream {
|
export function pushXlfFiles(apiHostname: string, username: string, password: string): ThroughStream {
|
||||||
let tryGetPromises = [];
|
let tryGetPromises: Array<Promise<boolean>> = [];
|
||||||
let updateCreatePromises = [];
|
let updateCreatePromises: Array<Promise<boolean>> = [];
|
||||||
|
|
||||||
return through(function (this: ThroughStream, file: File) {
|
return through(function (this: ThroughStream, file: File) {
|
||||||
const project = path.dirname(file.relative);
|
const project = path.dirname(file.relative);
|
||||||
@@ -890,7 +870,7 @@ function getAllResources(project: string, apiHostname: string, username: string,
|
|||||||
|
|
||||||
export function findObsoleteResources(apiHostname: string, username: string, password: string): ThroughStream {
|
export function findObsoleteResources(apiHostname: string, username: string, password: string): ThroughStream {
|
||||||
let resourcesByProject: Map<string[]> = Object.create(null);
|
let resourcesByProject: Map<string[]> = Object.create(null);
|
||||||
resourcesByProject[extensionsProject] = [].concat(externalExtensionsWithTranslations); // clone
|
resourcesByProject[extensionsProject] = ([] as any[]).concat(externalExtensionsWithTranslations); // clone
|
||||||
|
|
||||||
return through(function (this: ThroughStream, file: File) {
|
return through(function (this: ThroughStream, file: File) {
|
||||||
const project = path.dirname(file.relative);
|
const project = path.dirname(file.relative);
|
||||||
@@ -907,7 +887,7 @@ export function findObsoleteResources(apiHostname: string, username: string, pas
|
|||||||
|
|
||||||
const json = JSON.parse(fs.readFileSync('./build/lib/i18n.resources.json', 'utf8'));
|
const json = JSON.parse(fs.readFileSync('./build/lib/i18n.resources.json', 'utf8'));
|
||||||
let i18Resources = [...json.editor, ...json.workbench].map((r: Resource) => r.project + '/' + r.name.replace(/\//g, '_'));
|
let i18Resources = [...json.editor, ...json.workbench].map((r: Resource) => r.project + '/' + r.name.replace(/\//g, '_'));
|
||||||
let extractedResources = [];
|
let extractedResources: string[] = [];
|
||||||
for (let project of [workbenchProject, editorProject]) {
|
for (let project of [workbenchProject, editorProject]) {
|
||||||
for (let resource of resourcesByProject[project]) {
|
for (let resource of resourcesByProject[project]) {
|
||||||
if (resource !== 'setup_messages') {
|
if (resource !== 'setup_messages') {
|
||||||
@@ -920,7 +900,7 @@ export function findObsoleteResources(apiHostname: string, username: string, pas
|
|||||||
console.log(`[i18n] Missing resources in file 'build/lib/i18n.resources.json': JSON.stringify(${extractedResources.filter(p => i18Resources.indexOf(p) === -1)})`);
|
console.log(`[i18n] Missing resources in file 'build/lib/i18n.resources.json': JSON.stringify(${extractedResources.filter(p => i18Resources.indexOf(p) === -1)})`);
|
||||||
}
|
}
|
||||||
|
|
||||||
let promises = [];
|
let promises: Array<Promise<void>> = [];
|
||||||
for (let project in resourcesByProject) {
|
for (let project in resourcesByProject) {
|
||||||
promises.push(
|
promises.push(
|
||||||
getAllResources(project, apiHostname, username, password).then(resources => {
|
getAllResources(project, apiHostname, username, password).then(resources => {
|
||||||
@@ -965,7 +945,7 @@ function tryGetResource(project: string, slug: string, apiHostname: string, cred
|
|||||||
}
|
}
|
||||||
|
|
||||||
function createResource(project: string, slug: string, xlfFile: File, apiHostname: string, credentials: any): Promise<any> {
|
function createResource(project: string, slug: string, xlfFile: File, apiHostname: string, credentials: any): Promise<any> {
|
||||||
return new Promise((resolve, reject) => {
|
return new Promise((_resolve, reject) => {
|
||||||
const data = JSON.stringify({
|
const data = JSON.stringify({
|
||||||
'content': xlfFile.contents.toString(),
|
'content': xlfFile.contents.toString(),
|
||||||
'name': slug,
|
'name': slug,
|
||||||
@@ -1056,8 +1036,8 @@ export function pullCoreAndExtensionsXlfFiles(apiHostname: string, username: str
|
|||||||
|
|
||||||
// extensions
|
// extensions
|
||||||
let extensionsToLocalize = Object.create(null);
|
let extensionsToLocalize = Object.create(null);
|
||||||
glob.sync('./extensions/**/*.nls.json', ).forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
glob.sync('./extensions/**/*.nls.json').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
||||||
glob.sync('./extensions/*/node_modules/vscode-nls', ).forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
glob.sync('./extensions/*/node_modules/vscode-nls').forEach(extension => extensionsToLocalize[extension.split('/')[2]] = true);
|
||||||
|
|
||||||
Object.keys(extensionsToLocalize).forEach(extension => {
|
Object.keys(extensionsToLocalize).forEach(extension => {
|
||||||
_coreAndExtensionResources.push({ name: extension, project: extensionsProject });
|
_coreAndExtensionResources.push({ name: extension, project: extensionsProject });
|
||||||
@@ -1085,7 +1065,7 @@ function pullXlfFiles(apiHostname: string, username: string, password: string, l
|
|||||||
let expectedTranslationsCount = resources.length;
|
let expectedTranslationsCount = resources.length;
|
||||||
let translationsRetrieved = 0, called = false;
|
let translationsRetrieved = 0, called = false;
|
||||||
|
|
||||||
return readable(function (count, callback) {
|
return readable(function (_count: any, callback: any) {
|
||||||
// Mark end of stream when all resources were retrieved
|
// Mark end of stream when all resources were retrieved
|
||||||
if (translationsRetrieved === expectedTranslationsCount) {
|
if (translationsRetrieved === expectedTranslationsCount) {
|
||||||
return this.emit('end');
|
return this.emit('end');
|
||||||
@@ -1095,7 +1075,7 @@ function pullXlfFiles(apiHostname: string, username: string, password: string, l
|
|||||||
called = true;
|
called = true;
|
||||||
const stream = this;
|
const stream = this;
|
||||||
resources.map(function (resource) {
|
resources.map(function (resource) {
|
||||||
retrieveResource(language, resource, apiHostname, credentials).then((file: File) => {
|
retrieveResource(language, resource, apiHostname, credentials).then((file: File | null) => {
|
||||||
if (file) {
|
if (file) {
|
||||||
stream.emit('data', file);
|
stream.emit('data', file);
|
||||||
}
|
}
|
||||||
@@ -1107,10 +1087,10 @@ function pullXlfFiles(apiHostname: string, username: string, password: string, l
|
|||||||
callback();
|
callback();
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
const limiter = new Limiter<File>(NUMBER_OF_CONCURRENT_DOWNLOADS);
|
const limiter = new Limiter<File | null>(NUMBER_OF_CONCURRENT_DOWNLOADS);
|
||||||
|
|
||||||
function retrieveResource(language: Language, resource: Resource, apiHostname, credentials): Promise<File> {
|
function retrieveResource(language: Language, resource: Resource, apiHostname: string, credentials: string): Promise<File | null> {
|
||||||
return limiter.queue(() => new Promise<File>((resolve, reject) => {
|
return limiter.queue(() => new Promise<File | null>((resolve, reject) => {
|
||||||
const slug = resource.name.replace(/\//g, '_');
|
const slug = resource.name.replace(/\//g, '_');
|
||||||
const project = resource.project;
|
const project = resource.project;
|
||||||
let transifexLanguageId = language.id === 'ps' ? 'en' : language.transifexId || language.id;
|
let transifexLanguageId = language.id === 'ps' ? 'en' : language.transifexId || language.id;
|
||||||
@@ -1179,7 +1159,10 @@ function createI18nFile(originalFilePath: string, messages: any): File {
|
|||||||
result[key] = messages[key];
|
result[key] = messages[key];
|
||||||
}
|
}
|
||||||
|
|
||||||
let content = JSON.stringify(result, null, '\t').replace(/\r\n/g, '\n');
|
let content = JSON.stringify(result, null, '\t');
|
||||||
|
if (process.platform === 'win32') {
|
||||||
|
content = content.replace(/\n/g, '\r\n');
|
||||||
|
}
|
||||||
return new File({
|
return new File({
|
||||||
path: path.join(originalFilePath + '.i18n.json'),
|
path: path.join(originalFilePath + '.i18n.json'),
|
||||||
contents: Buffer.from(content, 'utf8')
|
contents: Buffer.from(content, 'utf8')
|
||||||
@@ -1209,10 +1192,10 @@ export function prepareI18nPackFiles(externalExtensions: Map<string>, resultingT
|
|||||||
let parsePromises: Promise<ParsedXLF[]>[] = [];
|
let parsePromises: Promise<ParsedXLF[]>[] = [];
|
||||||
let mainPack: I18nPack = { version: i18nPackVersion, contents: {} };
|
let mainPack: I18nPack = { version: i18nPackVersion, contents: {} };
|
||||||
let extensionsPacks: Map<I18nPack> = {};
|
let extensionsPacks: Map<I18nPack> = {};
|
||||||
|
let errors: any[] = [];
|
||||||
return through(function (this: ThroughStream, xlf: File) {
|
return through(function (this: ThroughStream, xlf: File) {
|
||||||
let stream = this;
|
let project = path.dirname(xlf.relative);
|
||||||
let project = path.dirname(xlf.path);
|
let resource = path.basename(xlf.relative, '.xlf');
|
||||||
let resource = path.basename(xlf.path, '.xlf');
|
|
||||||
let contents = xlf.contents.toString();
|
let contents = xlf.contents.toString();
|
||||||
let parsePromise = pseudo ? XLF.parsePseudo(contents) : XLF.parse(contents);
|
let parsePromise = pseudo ? XLF.parsePseudo(contents) : XLF.parse(contents);
|
||||||
parsePromises.push(parsePromise);
|
parsePromises.push(parsePromise);
|
||||||
@@ -1239,10 +1222,15 @@ export function prepareI18nPackFiles(externalExtensions: Map<string>, resultingT
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
).catch(reason => {
|
||||||
|
errors.push(reason);
|
||||||
|
});
|
||||||
}, function () {
|
}, function () {
|
||||||
Promise.all(parsePromises)
|
Promise.all(parsePromises)
|
||||||
.then(() => {
|
.then(() => {
|
||||||
|
if (errors.length > 0) {
|
||||||
|
throw errors;
|
||||||
|
}
|
||||||
const translatedMainFile = createI18nFile('./main', mainPack);
|
const translatedMainFile = createI18nFile('./main', mainPack);
|
||||||
resultingTranslationPaths.push({ id: 'vscode', resourceName: 'main.i18n.json' });
|
resultingTranslationPaths.push({ id: 'vscode', resourceName: 'main.i18n.json' });
|
||||||
|
|
||||||
@@ -1261,7 +1249,9 @@ export function prepareI18nPackFiles(externalExtensions: Map<string>, resultingT
|
|||||||
}
|
}
|
||||||
this.queue(null);
|
this.queue(null);
|
||||||
})
|
})
|
||||||
.catch(reason => { throw new Error(reason); });
|
.catch((reason) => {
|
||||||
|
this.emit('error', reason);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1282,11 +1272,15 @@ export function prepareIslFiles(language: Language, innoSetupConfig: InnoSetup):
|
|||||||
stream.queue(translatedFile);
|
stream.queue(translatedFile);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
);
|
).catch(reason => {
|
||||||
|
this.emit('error', reason);
|
||||||
|
});
|
||||||
}, function () {
|
}, function () {
|
||||||
Promise.all(parsePromises)
|
Promise.all(parsePromises)
|
||||||
.then(() => { this.queue(null); })
|
.then(() => { this.queue(null); })
|
||||||
.catch(reason => { throw new Error(reason); });
|
.catch(reason => {
|
||||||
|
this.emit('error', reason);
|
||||||
|
});
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -1303,7 +1297,7 @@ function createIslFile(originalFilePath: string, messages: Map<string>, language
|
|||||||
let firstChar = line.charAt(0);
|
let firstChar = line.charAt(0);
|
||||||
if (firstChar === '[' || firstChar === ';') {
|
if (firstChar === '[' || firstChar === ';') {
|
||||||
if (line === '; *** Inno Setup version 5.5.3+ English messages ***') {
|
if (line === '; *** Inno Setup version 5.5.3+ English messages ***') {
|
||||||
content.push(`; *** Inno Setup version 5.5.3+ ${innoSetup.defaultInfo.name} messages ***`);
|
content.push(`; *** Inno Setup version 5.5.3+ ${innoSetup.defaultInfo!.name} messages ***`);
|
||||||
} else {
|
} else {
|
||||||
content.push(line);
|
content.push(line);
|
||||||
}
|
}
|
||||||
@@ -1313,9 +1307,9 @@ function createIslFile(originalFilePath: string, messages: Map<string>, language
|
|||||||
let translated = line;
|
let translated = line;
|
||||||
if (key) {
|
if (key) {
|
||||||
if (key === 'LanguageName') {
|
if (key === 'LanguageName') {
|
||||||
translated = `${key}=${innoSetup.defaultInfo.name}`;
|
translated = `${key}=${innoSetup.defaultInfo!.name}`;
|
||||||
} else if (key === 'LanguageID') {
|
} else if (key === 'LanguageID') {
|
||||||
translated = `${key}=${innoSetup.defaultInfo.id}`;
|
translated = `${key}=${innoSetup.defaultInfo!.id}`;
|
||||||
} else if (key === 'LanguageCodePage') {
|
} else if (key === 'LanguageCodePage') {
|
||||||
translated = `${key}=${innoSetup.codePage.substr(2)}`;
|
translated = `${key}=${innoSetup.codePage.substr(2)}`;
|
||||||
} else {
|
} else {
|
||||||
@@ -1336,14 +1330,14 @@ function createIslFile(originalFilePath: string, messages: Map<string>, language
|
|||||||
|
|
||||||
return new File({
|
return new File({
|
||||||
path: filePath,
|
path: filePath,
|
||||||
contents: iconv.encode(Buffer.from(content.join('\r\n'), 'utf8'), innoSetup.codePage)
|
contents: iconv.encode(Buffer.from(content.join('\r\n'), 'utf8').toString(), innoSetup.codePage)
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function encodeEntities(value: string): string {
|
function encodeEntities(value: string): string {
|
||||||
var result: string[] = [];
|
let result: string[] = [];
|
||||||
for (var i = 0; i < value.length; i++) {
|
for (let i = 0; i < value.length; i++) {
|
||||||
var ch = value[i];
|
let ch = value[i];
|
||||||
switch (ch) {
|
switch (ch) {
|
||||||
case '<':
|
case '<':
|
||||||
result.push('<');
|
result.push('<');
|
||||||
|
|||||||
307
build/lib/nls.js
307
build/lib/nls.js
@@ -3,13 +3,12 @@
|
|||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
var ts = require("typescript");
|
const ts = require("typescript");
|
||||||
var lazy = require("lazy.js");
|
const lazy = require("lazy.js");
|
||||||
var event_stream_1 = require("event-stream");
|
const event_stream_1 = require("event-stream");
|
||||||
var File = require("vinyl");
|
const File = require("vinyl");
|
||||||
var sm = require("source-map");
|
const sm = require("source-map");
|
||||||
var assign = require("object-assign");
|
const path = require("path");
|
||||||
var path = require("path");
|
|
||||||
var CollectStepResult;
|
var CollectStepResult;
|
||||||
(function (CollectStepResult) {
|
(function (CollectStepResult) {
|
||||||
CollectStepResult[CollectStepResult["Yes"] = 0] = "Yes";
|
CollectStepResult[CollectStepResult["Yes"] = 0] = "Yes";
|
||||||
@@ -18,9 +17,9 @@ var CollectStepResult;
|
|||||||
CollectStepResult[CollectStepResult["NoAndRecurse"] = 3] = "NoAndRecurse";
|
CollectStepResult[CollectStepResult["NoAndRecurse"] = 3] = "NoAndRecurse";
|
||||||
})(CollectStepResult || (CollectStepResult = {}));
|
})(CollectStepResult || (CollectStepResult = {}));
|
||||||
function collect(node, fn) {
|
function collect(node, fn) {
|
||||||
var result = [];
|
const result = [];
|
||||||
function loop(node) {
|
function loop(node) {
|
||||||
var stepResult = fn(node);
|
const stepResult = fn(node);
|
||||||
if (stepResult === CollectStepResult.Yes || stepResult === CollectStepResult.YesAndRecurse) {
|
if (stepResult === CollectStepResult.Yes || stepResult === CollectStepResult.YesAndRecurse) {
|
||||||
result.push(node);
|
result.push(node);
|
||||||
}
|
}
|
||||||
@@ -32,43 +31,45 @@ function collect(node, fn) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
function clone(object) {
|
function clone(object) {
|
||||||
var result = {};
|
const result = {};
|
||||||
for (var id in object) {
|
for (const id in object) {
|
||||||
result[id] = object[id];
|
result[id] = object[id];
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
function template(lines) {
|
function template(lines) {
|
||||||
var indent = '', wrap = '';
|
let indent = '', wrap = '';
|
||||||
if (lines.length > 1) {
|
if (lines.length > 1) {
|
||||||
indent = '\t';
|
indent = '\t';
|
||||||
wrap = '\n';
|
wrap = '\n';
|
||||||
}
|
}
|
||||||
return "/*---------------------------------------------------------\n * Copyright (C) Microsoft Corporation. All rights reserved.\n *--------------------------------------------------------*/\ndefine([], [" + (wrap + lines.map(function (l) { return indent + l; }).join(',\n') + wrap) + "]);";
|
return `/*---------------------------------------------------------
|
||||||
|
* Copyright (C) Microsoft Corporation. All rights reserved.
|
||||||
|
*--------------------------------------------------------*/
|
||||||
|
define([], [${wrap + lines.map(l => indent + l).join(',\n') + wrap}]);`;
|
||||||
}
|
}
|
||||||
/**
|
/**
|
||||||
* Returns a stream containing the patched JavaScript and source maps.
|
* Returns a stream containing the patched JavaScript and source maps.
|
||||||
*/
|
*/
|
||||||
function nls() {
|
function nls() {
|
||||||
var input = event_stream_1.through();
|
const input = event_stream_1.through();
|
||||||
var output = input.pipe(event_stream_1.through(function (f) {
|
const output = input.pipe(event_stream_1.through(function (f) {
|
||||||
var _this = this;
|
|
||||||
if (!f.sourceMap) {
|
if (!f.sourceMap) {
|
||||||
return this.emit('error', new Error("File " + f.relative + " does not have sourcemaps."));
|
return this.emit('error', new Error(`File ${f.relative} does not have sourcemaps.`));
|
||||||
}
|
}
|
||||||
var source = f.sourceMap.sources[0];
|
let source = f.sourceMap.sources[0];
|
||||||
if (!source) {
|
if (!source) {
|
||||||
return this.emit('error', new Error("File " + f.relative + " does not have a source in the source map."));
|
return this.emit('error', new Error(`File ${f.relative} does not have a source in the source map.`));
|
||||||
}
|
}
|
||||||
var root = f.sourceMap.sourceRoot;
|
const root = f.sourceMap.sourceRoot;
|
||||||
if (root) {
|
if (root) {
|
||||||
source = path.join(root, source);
|
source = path.join(root, source);
|
||||||
}
|
}
|
||||||
var typescript = f.sourceMap.sourcesContent[0];
|
const typescript = f.sourceMap.sourcesContent[0];
|
||||||
if (!typescript) {
|
if (!typescript) {
|
||||||
return this.emit('error', new Error("File " + f.relative + " does not have the original content in the source map."));
|
return this.emit('error', new Error(`File ${f.relative} does not have the original content in the source map.`));
|
||||||
}
|
}
|
||||||
nls.patchFiles(f, typescript).forEach(function (f) { return _this.emit('data', f); });
|
nls.patchFiles(f, typescript).forEach(f => this.emit('data', f));
|
||||||
}));
|
}));
|
||||||
return event_stream_1.duplex(input, output);
|
return event_stream_1.duplex(input, output);
|
||||||
}
|
}
|
||||||
@@ -76,8 +77,7 @@ function isImportNode(node) {
|
|||||||
return node.kind === ts.SyntaxKind.ImportDeclaration || node.kind === ts.SyntaxKind.ImportEqualsDeclaration;
|
return node.kind === ts.SyntaxKind.ImportDeclaration || node.kind === ts.SyntaxKind.ImportEqualsDeclaration;
|
||||||
}
|
}
|
||||||
(function (nls_1) {
|
(function (nls_1) {
|
||||||
function fileFrom(file, contents, path) {
|
function fileFrom(file, contents, path = file.path) {
|
||||||
if (path === void 0) { path = file.path; }
|
|
||||||
return new File({
|
return new File({
|
||||||
contents: Buffer.from(contents),
|
contents: Buffer.from(contents),
|
||||||
base: file.base,
|
base: file.base,
|
||||||
@@ -87,29 +87,27 @@ function isImportNode(node) {
|
|||||||
}
|
}
|
||||||
nls_1.fileFrom = fileFrom;
|
nls_1.fileFrom = fileFrom;
|
||||||
function mappedPositionFrom(source, lc) {
|
function mappedPositionFrom(source, lc) {
|
||||||
return { source: source, line: lc.line + 1, column: lc.character };
|
return { source, line: lc.line + 1, column: lc.character };
|
||||||
}
|
}
|
||||||
nls_1.mappedPositionFrom = mappedPositionFrom;
|
nls_1.mappedPositionFrom = mappedPositionFrom;
|
||||||
function lcFrom(position) {
|
function lcFrom(position) {
|
||||||
return { line: position.line - 1, character: position.column };
|
return { line: position.line - 1, character: position.column };
|
||||||
}
|
}
|
||||||
nls_1.lcFrom = lcFrom;
|
nls_1.lcFrom = lcFrom;
|
||||||
var SingleFileServiceHost = /** @class */ (function () {
|
class SingleFileServiceHost {
|
||||||
function SingleFileServiceHost(options, filename, contents) {
|
constructor(options, filename, contents) {
|
||||||
var _this = this;
|
|
||||||
this.options = options;
|
this.options = options;
|
||||||
this.filename = filename;
|
this.filename = filename;
|
||||||
this.getCompilationSettings = function () { return _this.options; };
|
this.getCompilationSettings = () => this.options;
|
||||||
this.getScriptFileNames = function () { return [_this.filename]; };
|
this.getScriptFileNames = () => [this.filename];
|
||||||
this.getScriptVersion = function () { return '1'; };
|
this.getScriptVersion = () => '1';
|
||||||
this.getScriptSnapshot = function (name) { return name === _this.filename ? _this.file : _this.lib; };
|
this.getScriptSnapshot = (name) => name === this.filename ? this.file : this.lib;
|
||||||
this.getCurrentDirectory = function () { return ''; };
|
this.getCurrentDirectory = () => '';
|
||||||
this.getDefaultLibFileName = function () { return 'lib.d.ts'; };
|
this.getDefaultLibFileName = () => 'lib.d.ts';
|
||||||
this.file = ts.ScriptSnapshot.fromString(contents);
|
this.file = ts.ScriptSnapshot.fromString(contents);
|
||||||
this.lib = ts.ScriptSnapshot.fromString('');
|
this.lib = ts.ScriptSnapshot.fromString('');
|
||||||
}
|
}
|
||||||
return SingleFileServiceHost;
|
}
|
||||||
}());
|
|
||||||
nls_1.SingleFileServiceHost = SingleFileServiceHost;
|
nls_1.SingleFileServiceHost = SingleFileServiceHost;
|
||||||
function isCallExpressionWithinTextSpanCollectStep(textSpan, node) {
|
function isCallExpressionWithinTextSpanCollectStep(textSpan, node) {
|
||||||
if (!ts.textSpanContainsTextSpan({ start: node.pos, length: node.end - node.pos }, textSpan)) {
|
if (!ts.textSpanContainsTextSpan({ start: node.pos, length: node.end - node.pos }, textSpan)) {
|
||||||
@@ -117,94 +115,96 @@ function isImportNode(node) {
|
|||||||
}
|
}
|
||||||
return node.kind === ts.SyntaxKind.CallExpression ? CollectStepResult.YesAndRecurse : CollectStepResult.NoAndRecurse;
|
return node.kind === ts.SyntaxKind.CallExpression ? CollectStepResult.YesAndRecurse : CollectStepResult.NoAndRecurse;
|
||||||
}
|
}
|
||||||
function analyze(contents, options) {
|
function analyze(contents, options = {}) {
|
||||||
if (options === void 0) { options = {}; }
|
const filename = 'file.ts';
|
||||||
var filename = 'file.ts';
|
const serviceHost = new SingleFileServiceHost(Object.assign(clone(options), { noResolve: true }), filename, contents);
|
||||||
var serviceHost = new SingleFileServiceHost(assign(clone(options), { noResolve: true }), filename, contents);
|
const service = ts.createLanguageService(serviceHost);
|
||||||
var service = ts.createLanguageService(serviceHost);
|
const sourceFile = ts.createSourceFile(filename, contents, ts.ScriptTarget.ES5, true);
|
||||||
var sourceFile = ts.createSourceFile(filename, contents, ts.ScriptTarget.ES5, true);
|
|
||||||
// all imports
|
// all imports
|
||||||
var imports = lazy(collect(sourceFile, function (n) { return isImportNode(n) ? CollectStepResult.YesAndRecurse : CollectStepResult.NoAndRecurse; }));
|
const imports = lazy(collect(sourceFile, n => isImportNode(n) ? CollectStepResult.YesAndRecurse : CollectStepResult.NoAndRecurse));
|
||||||
// import nls = require('vs/nls');
|
// import nls = require('vs/nls');
|
||||||
var importEqualsDeclarations = imports
|
const importEqualsDeclarations = imports
|
||||||
.filter(function (n) { return n.kind === ts.SyntaxKind.ImportEqualsDeclaration; })
|
.filter(n => n.kind === ts.SyntaxKind.ImportEqualsDeclaration)
|
||||||
.map(function (n) { return n; })
|
.map(n => n)
|
||||||
.filter(function (d) { return d.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference; })
|
.filter(d => d.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference)
|
||||||
.filter(function (d) { return d.moduleReference.expression.getText() === '\'vs/nls\''; });
|
.filter(d => d.moduleReference.expression.getText() === '\'vs/nls\'');
|
||||||
// import ... from 'vs/nls';
|
// import ... from 'vs/nls';
|
||||||
var importDeclarations = imports
|
const importDeclarations = imports
|
||||||
.filter(function (n) { return n.kind === ts.SyntaxKind.ImportDeclaration; })
|
.filter(n => n.kind === ts.SyntaxKind.ImportDeclaration)
|
||||||
.map(function (n) { return n; })
|
.map(n => n)
|
||||||
.filter(function (d) { return d.moduleSpecifier.kind === ts.SyntaxKind.StringLiteral; })
|
.filter(d => d.moduleSpecifier.kind === ts.SyntaxKind.StringLiteral)
|
||||||
.filter(function (d) { return d.moduleSpecifier.getText() === '\'vs/nls\''; })
|
.filter(d => d.moduleSpecifier.getText() === '\'vs/nls\'')
|
||||||
.filter(function (d) { return !!d.importClause && !!d.importClause.namedBindings; });
|
.filter(d => !!d.importClause && !!d.importClause.namedBindings);
|
||||||
var nlsExpressions = importEqualsDeclarations
|
const nlsExpressions = importEqualsDeclarations
|
||||||
.map(function (d) { return d.moduleReference.expression; })
|
.map(d => d.moduleReference.expression)
|
||||||
.concat(importDeclarations.map(function (d) { return d.moduleSpecifier; }))
|
.concat(importDeclarations.map(d => d.moduleSpecifier))
|
||||||
.map(function (d) { return ({
|
.map(d => ({
|
||||||
start: ts.getLineAndCharacterOfPosition(sourceFile, d.getStart()),
|
start: ts.getLineAndCharacterOfPosition(sourceFile, d.getStart()),
|
||||||
end: ts.getLineAndCharacterOfPosition(sourceFile, d.getEnd())
|
end: ts.getLineAndCharacterOfPosition(sourceFile, d.getEnd())
|
||||||
}); });
|
}));
|
||||||
// `nls.localize(...)` calls
|
// `nls.localize(...)` calls
|
||||||
var nlsLocalizeCallExpressions = importDeclarations
|
const nlsLocalizeCallExpressions = importDeclarations
|
||||||
.filter(function (d) { return d.importClause.namedBindings.kind === ts.SyntaxKind.NamespaceImport; })
|
.filter(d => !!(d.importClause && d.importClause.namedBindings && d.importClause.namedBindings.kind === ts.SyntaxKind.NamespaceImport))
|
||||||
.map(function (d) { return d.importClause.namedBindings.name; })
|
.map(d => d.importClause.namedBindings.name)
|
||||||
.concat(importEqualsDeclarations.map(function (d) { return d.name; }))
|
.concat(importEqualsDeclarations.map(d => d.name))
|
||||||
.map(function (n) { return service.getReferencesAtPosition(filename, n.pos + 1); })
|
// find read-only references to `nls`
|
||||||
|
.map(n => service.getReferencesAtPosition(filename, n.pos + 1))
|
||||||
.flatten()
|
.flatten()
|
||||||
.filter(function (r) { return !r.isWriteAccess; })
|
.filter(r => !r.isWriteAccess)
|
||||||
.map(function (r) { return collect(sourceFile, function (n) { return isCallExpressionWithinTextSpanCollectStep(r.textSpan, n); }); })
|
// find the deepest call expressions AST nodes that contain those references
|
||||||
.map(function (a) { return lazy(a).last(); })
|
.map(r => collect(sourceFile, n => isCallExpressionWithinTextSpanCollectStep(r.textSpan, n)))
|
||||||
.filter(function (n) { return !!n; })
|
.map(a => lazy(a).last())
|
||||||
.map(function (n) { return n; })
|
.filter(n => !!n)
|
||||||
.filter(function (n) { return n.expression.kind === ts.SyntaxKind.PropertyAccessExpression && n.expression.name.getText() === 'localize'; });
|
.map(n => n)
|
||||||
|
// only `localize` calls
|
||||||
|
.filter(n => n.expression.kind === ts.SyntaxKind.PropertyAccessExpression && n.expression.name.getText() === 'localize');
|
||||||
// `localize` named imports
|
// `localize` named imports
|
||||||
var allLocalizeImportDeclarations = importDeclarations
|
const allLocalizeImportDeclarations = importDeclarations
|
||||||
.filter(function (d) { return d.importClause.namedBindings.kind === ts.SyntaxKind.NamedImports; })
|
.filter(d => !!(d.importClause && d.importClause.namedBindings && d.importClause.namedBindings.kind === ts.SyntaxKind.NamedImports))
|
||||||
.map(function (d) { return [].concat(d.importClause.namedBindings.elements); })
|
.map(d => [].concat(d.importClause.namedBindings.elements))
|
||||||
.flatten();
|
.flatten();
|
||||||
// `localize` read-only references
|
// `localize` read-only references
|
||||||
var localizeReferences = allLocalizeImportDeclarations
|
const localizeReferences = allLocalizeImportDeclarations
|
||||||
.filter(function (d) { return d.name.getText() === 'localize'; })
|
.filter(d => d.name.getText() === 'localize')
|
||||||
.map(function (n) { return service.getReferencesAtPosition(filename, n.pos + 1); })
|
.map(n => service.getReferencesAtPosition(filename, n.pos + 1))
|
||||||
.flatten()
|
.flatten()
|
||||||
.filter(function (r) { return !r.isWriteAccess; });
|
.filter(r => !r.isWriteAccess);
|
||||||
// custom named `localize` read-only references
|
// custom named `localize` read-only references
|
||||||
var namedLocalizeReferences = allLocalizeImportDeclarations
|
const namedLocalizeReferences = allLocalizeImportDeclarations
|
||||||
.filter(function (d) { return d.propertyName && d.propertyName.getText() === 'localize'; })
|
.filter(d => d.propertyName && d.propertyName.getText() === 'localize')
|
||||||
.map(function (n) { return service.getReferencesAtPosition(filename, n.name.pos + 1); })
|
.map(n => service.getReferencesAtPosition(filename, n.name.pos + 1))
|
||||||
.flatten()
|
.flatten()
|
||||||
.filter(function (r) { return !r.isWriteAccess; });
|
.filter(r => !r.isWriteAccess);
|
||||||
// find the deepest call expressions AST nodes that contain those references
|
// find the deepest call expressions AST nodes that contain those references
|
||||||
var localizeCallExpressions = localizeReferences
|
const localizeCallExpressions = localizeReferences
|
||||||
.concat(namedLocalizeReferences)
|
.concat(namedLocalizeReferences)
|
||||||
.map(function (r) { return collect(sourceFile, function (n) { return isCallExpressionWithinTextSpanCollectStep(r.textSpan, n); }); })
|
.map(r => collect(sourceFile, n => isCallExpressionWithinTextSpanCollectStep(r.textSpan, n)))
|
||||||
.map(function (a) { return lazy(a).last(); })
|
.map(a => lazy(a).last())
|
||||||
.filter(function (n) { return !!n; })
|
.filter(n => !!n)
|
||||||
.map(function (n) { return n; });
|
.map(n => n);
|
||||||
// collect everything
|
// collect everything
|
||||||
var localizeCalls = nlsLocalizeCallExpressions
|
const localizeCalls = nlsLocalizeCallExpressions
|
||||||
.concat(localizeCallExpressions)
|
.concat(localizeCallExpressions)
|
||||||
.map(function (e) { return e.arguments; })
|
.map(e => e.arguments)
|
||||||
.filter(function (a) { return a.length > 1; })
|
.filter(a => a.length > 1)
|
||||||
.sort(function (a, b) { return a[0].getStart() - b[0].getStart(); })
|
.sort((a, b) => a[0].getStart() - b[0].getStart())
|
||||||
.map(function (a) { return ({
|
.map(a => ({
|
||||||
keySpan: { start: ts.getLineAndCharacterOfPosition(sourceFile, a[0].getStart()), end: ts.getLineAndCharacterOfPosition(sourceFile, a[0].getEnd()) },
|
keySpan: { start: ts.getLineAndCharacterOfPosition(sourceFile, a[0].getStart()), end: ts.getLineAndCharacterOfPosition(sourceFile, a[0].getEnd()) },
|
||||||
key: a[0].getText(),
|
key: a[0].getText(),
|
||||||
valueSpan: { start: ts.getLineAndCharacterOfPosition(sourceFile, a[1].getStart()), end: ts.getLineAndCharacterOfPosition(sourceFile, a[1].getEnd()) },
|
valueSpan: { start: ts.getLineAndCharacterOfPosition(sourceFile, a[1].getStart()), end: ts.getLineAndCharacterOfPosition(sourceFile, a[1].getEnd()) },
|
||||||
value: a[1].getText()
|
value: a[1].getText()
|
||||||
}); });
|
}));
|
||||||
return {
|
return {
|
||||||
localizeCalls: localizeCalls.toArray(),
|
localizeCalls: localizeCalls.toArray(),
|
||||||
nlsExpressions: nlsExpressions.toArray()
|
nlsExpressions: nlsExpressions.toArray()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
nls_1.analyze = analyze;
|
nls_1.analyze = analyze;
|
||||||
var TextModel = /** @class */ (function () {
|
class TextModel {
|
||||||
function TextModel(contents) {
|
constructor(contents) {
|
||||||
var regex = /\r\n|\r|\n/g;
|
const regex = /\r\n|\r|\n/g;
|
||||||
var index = 0;
|
let index = 0;
|
||||||
var match;
|
let match;
|
||||||
this.lines = [];
|
this.lines = [];
|
||||||
this.lineEndings = [];
|
this.lineEndings = [];
|
||||||
while (match = regex.exec(contents)) {
|
while (match = regex.exec(contents)) {
|
||||||
@@ -217,85 +217,80 @@ function isImportNode(node) {
|
|||||||
this.lineEndings.push('');
|
this.lineEndings.push('');
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
TextModel.prototype.get = function (index) {
|
get(index) {
|
||||||
return this.lines[index];
|
return this.lines[index];
|
||||||
};
|
}
|
||||||
TextModel.prototype.set = function (index, line) {
|
set(index, line) {
|
||||||
this.lines[index] = line;
|
this.lines[index] = line;
|
||||||
};
|
}
|
||||||
Object.defineProperty(TextModel.prototype, "lineCount", {
|
get lineCount() {
|
||||||
get: function () {
|
return this.lines.length;
|
||||||
return this.lines.length;
|
}
|
||||||
},
|
|
||||||
enumerable: true,
|
|
||||||
configurable: true
|
|
||||||
});
|
|
||||||
/**
|
/**
|
||||||
* Applies patch(es) to the model.
|
* Applies patch(es) to the model.
|
||||||
* Multiple patches must be ordered.
|
* Multiple patches must be ordered.
|
||||||
* Does not support patches spanning multiple lines.
|
* Does not support patches spanning multiple lines.
|
||||||
*/
|
*/
|
||||||
TextModel.prototype.apply = function (patch) {
|
apply(patch) {
|
||||||
var startLineNumber = patch.span.start.line;
|
const startLineNumber = patch.span.start.line;
|
||||||
var endLineNumber = patch.span.end.line;
|
const endLineNumber = patch.span.end.line;
|
||||||
var startLine = this.lines[startLineNumber] || '';
|
const startLine = this.lines[startLineNumber] || '';
|
||||||
var endLine = this.lines[endLineNumber] || '';
|
const endLine = this.lines[endLineNumber] || '';
|
||||||
this.lines[startLineNumber] = [
|
this.lines[startLineNumber] = [
|
||||||
startLine.substring(0, patch.span.start.character),
|
startLine.substring(0, patch.span.start.character),
|
||||||
patch.content,
|
patch.content,
|
||||||
endLine.substring(patch.span.end.character)
|
endLine.substring(patch.span.end.character)
|
||||||
].join('');
|
].join('');
|
||||||
for (var i = startLineNumber + 1; i <= endLineNumber; i++) {
|
for (let i = startLineNumber + 1; i <= endLineNumber; i++) {
|
||||||
this.lines[i] = '';
|
this.lines[i] = '';
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
TextModel.prototype.toString = function () {
|
toString() {
|
||||||
return lazy(this.lines).zip(this.lineEndings)
|
return lazy(this.lines).zip(this.lineEndings)
|
||||||
.flatten().toArray().join('');
|
.flatten().toArray().join('');
|
||||||
};
|
}
|
||||||
return TextModel;
|
}
|
||||||
}());
|
|
||||||
nls_1.TextModel = TextModel;
|
nls_1.TextModel = TextModel;
|
||||||
function patchJavascript(patches, contents, moduleId) {
|
function patchJavascript(patches, contents, moduleId) {
|
||||||
var model = new nls.TextModel(contents);
|
const model = new nls.TextModel(contents);
|
||||||
// patch the localize calls
|
// patch the localize calls
|
||||||
lazy(patches).reverse().each(function (p) { return model.apply(p); });
|
lazy(patches).reverse().each(p => model.apply(p));
|
||||||
// patch the 'vs/nls' imports
|
// patch the 'vs/nls' imports
|
||||||
var firstLine = model.get(0);
|
const firstLine = model.get(0);
|
||||||
var patchedFirstLine = firstLine.replace(/(['"])vs\/nls\1/g, "$1vs/nls!" + moduleId + "$1");
|
const patchedFirstLine = firstLine.replace(/(['"])vs\/nls\1/g, `$1vs/nls!${moduleId}$1`);
|
||||||
model.set(0, patchedFirstLine);
|
model.set(0, patchedFirstLine);
|
||||||
return model.toString();
|
return model.toString();
|
||||||
}
|
}
|
||||||
nls_1.patchJavascript = patchJavascript;
|
nls_1.patchJavascript = patchJavascript;
|
||||||
function patchSourcemap(patches, rsm, smc) {
|
function patchSourcemap(patches, rsm, smc) {
|
||||||
var smg = new sm.SourceMapGenerator({
|
const smg = new sm.SourceMapGenerator({
|
||||||
file: rsm.file,
|
file: rsm.file,
|
||||||
sourceRoot: rsm.sourceRoot
|
sourceRoot: rsm.sourceRoot
|
||||||
});
|
});
|
||||||
patches = patches.reverse();
|
patches = patches.reverse();
|
||||||
var currentLine = -1;
|
let currentLine = -1;
|
||||||
var currentLineDiff = 0;
|
let currentLineDiff = 0;
|
||||||
var source = null;
|
let source = null;
|
||||||
smc.eachMapping(function (m) {
|
smc.eachMapping(m => {
|
||||||
var patch = patches[patches.length - 1];
|
const patch = patches[patches.length - 1];
|
||||||
var original = { line: m.originalLine, column: m.originalColumn };
|
const original = { line: m.originalLine, column: m.originalColumn };
|
||||||
var generated = { line: m.generatedLine, column: m.generatedColumn };
|
const generated = { line: m.generatedLine, column: m.generatedColumn };
|
||||||
if (currentLine !== generated.line) {
|
if (currentLine !== generated.line) {
|
||||||
currentLineDiff = 0;
|
currentLineDiff = 0;
|
||||||
}
|
}
|
||||||
currentLine = generated.line;
|
currentLine = generated.line;
|
||||||
generated.column += currentLineDiff;
|
generated.column += currentLineDiff;
|
||||||
if (patch && m.generatedLine - 1 === patch.span.end.line && m.generatedColumn === patch.span.end.character) {
|
if (patch && m.generatedLine - 1 === patch.span.end.line && m.generatedColumn === patch.span.end.character) {
|
||||||
var originalLength = patch.span.end.character - patch.span.start.character;
|
const originalLength = patch.span.end.character - patch.span.start.character;
|
||||||
var modifiedLength = patch.content.length;
|
const modifiedLength = patch.content.length;
|
||||||
var lengthDiff = modifiedLength - originalLength;
|
const lengthDiff = modifiedLength - originalLength;
|
||||||
currentLineDiff += lengthDiff;
|
currentLineDiff += lengthDiff;
|
||||||
generated.column += lengthDiff;
|
generated.column += lengthDiff;
|
||||||
patches.pop();
|
patches.pop();
|
||||||
}
|
}
|
||||||
source = rsm.sourceRoot ? path.relative(rsm.sourceRoot, m.source) : m.source;
|
source = rsm.sourceRoot ? path.relative(rsm.sourceRoot, m.source) : m.source;
|
||||||
source = source.replace(/\\/g, '/');
|
source = source.replace(/\\/g, '/');
|
||||||
smg.addMapping({ source: source, name: m.name, original: original, generated: generated });
|
smg.addMapping({ source, name: m.name, original, generated });
|
||||||
}, null, sm.SourceMapConsumer.GENERATED_ORDER);
|
}, null, sm.SourceMapConsumer.GENERATED_ORDER);
|
||||||
if (source) {
|
if (source) {
|
||||||
smg.setSourceContent(source, smc.sourceContentFor(source));
|
smg.setSourceContent(source, smc.sourceContentFor(source));
|
||||||
@@ -304,47 +299,47 @@ function isImportNode(node) {
|
|||||||
}
|
}
|
||||||
nls_1.patchSourcemap = patchSourcemap;
|
nls_1.patchSourcemap = patchSourcemap;
|
||||||
function patch(moduleId, typescript, javascript, sourcemap) {
|
function patch(moduleId, typescript, javascript, sourcemap) {
|
||||||
var _a = analyze(typescript), localizeCalls = _a.localizeCalls, nlsExpressions = _a.nlsExpressions;
|
const { localizeCalls, nlsExpressions } = analyze(typescript);
|
||||||
if (localizeCalls.length === 0) {
|
if (localizeCalls.length === 0) {
|
||||||
return { javascript: javascript, sourcemap: sourcemap };
|
return { javascript, sourcemap };
|
||||||
}
|
}
|
||||||
var nlsKeys = template(localizeCalls.map(function (lc) { return lc.key; }));
|
const nlsKeys = template(localizeCalls.map(lc => lc.key));
|
||||||
var nls = template(localizeCalls.map(function (lc) { return lc.value; }));
|
const nls = template(localizeCalls.map(lc => lc.value));
|
||||||
var smc = new sm.SourceMapConsumer(sourcemap);
|
const smc = new sm.SourceMapConsumer(sourcemap);
|
||||||
var positionFrom = mappedPositionFrom.bind(null, sourcemap.sources[0]);
|
const positionFrom = mappedPositionFrom.bind(null, sourcemap.sources[0]);
|
||||||
var i = 0;
|
let i = 0;
|
||||||
// build patches
|
// build patches
|
||||||
var patches = lazy(localizeCalls)
|
const patches = lazy(localizeCalls)
|
||||||
.map(function (lc) { return ([
|
.map(lc => ([
|
||||||
{ range: lc.keySpan, content: '' + (i++) },
|
{ range: lc.keySpan, content: '' + (i++) },
|
||||||
{ range: lc.valueSpan, content: 'null' }
|
{ range: lc.valueSpan, content: 'null' }
|
||||||
]); })
|
]))
|
||||||
.flatten()
|
.flatten()
|
||||||
.map(function (c) {
|
.map(c => {
|
||||||
var start = lcFrom(smc.generatedPositionFor(positionFrom(c.range.start)));
|
const start = lcFrom(smc.generatedPositionFor(positionFrom(c.range.start)));
|
||||||
var end = lcFrom(smc.generatedPositionFor(positionFrom(c.range.end)));
|
const end = lcFrom(smc.generatedPositionFor(positionFrom(c.range.end)));
|
||||||
return { span: { start: start, end: end }, content: c.content };
|
return { span: { start, end }, content: c.content };
|
||||||
})
|
})
|
||||||
.toArray();
|
.toArray();
|
||||||
javascript = patchJavascript(patches, javascript, moduleId);
|
javascript = patchJavascript(patches, javascript, moduleId);
|
||||||
// since imports are not within the sourcemap information,
|
// since imports are not within the sourcemap information,
|
||||||
// we must do this MacGyver style
|
// we must do this MacGyver style
|
||||||
if (nlsExpressions.length) {
|
if (nlsExpressions.length) {
|
||||||
javascript = javascript.replace(/^define\(.*$/m, function (line) {
|
javascript = javascript.replace(/^define\(.*$/m, line => {
|
||||||
return line.replace(/(['"])vs\/nls\1/g, "$1vs/nls!" + moduleId + "$1");
|
return line.replace(/(['"])vs\/nls\1/g, `$1vs/nls!${moduleId}$1`);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
sourcemap = patchSourcemap(patches, sourcemap, smc);
|
sourcemap = patchSourcemap(patches, sourcemap, smc);
|
||||||
return { javascript: javascript, sourcemap: sourcemap, nlsKeys: nlsKeys, nls: nls };
|
return { javascript, sourcemap, nlsKeys, nls };
|
||||||
}
|
}
|
||||||
nls_1.patch = patch;
|
nls_1.patch = patch;
|
||||||
function patchFiles(javascriptFile, typescript) {
|
function patchFiles(javascriptFile, typescript) {
|
||||||
// hack?
|
// hack?
|
||||||
var moduleId = javascriptFile.relative
|
const moduleId = javascriptFile.relative
|
||||||
.replace(/\.js$/, '')
|
.replace(/\.js$/, '')
|
||||||
.replace(/\\/g, '/');
|
.replace(/\\/g, '/');
|
||||||
var _a = patch(moduleId, typescript, javascriptFile.contents.toString(), javascriptFile.sourceMap), javascript = _a.javascript, sourcemap = _a.sourcemap, nlsKeys = _a.nlsKeys, nls = _a.nls;
|
const { javascript, sourcemap, nlsKeys, nls } = patch(moduleId, typescript, javascriptFile.contents.toString(), javascriptFile.sourceMap);
|
||||||
var result = [fileFrom(javascriptFile, javascript)];
|
const result = [fileFrom(javascriptFile, javascript)];
|
||||||
result[0].sourceMap = sourcemap;
|
result[0].sourceMap = sourcemap;
|
||||||
if (nlsKeys) {
|
if (nlsKeys) {
|
||||||
result.push(fileFrom(javascriptFile, nlsKeys, javascriptFile.path.replace(/\.js$/, '.nls.keys.js')));
|
result.push(fileFrom(javascriptFile, nlsKeys, javascriptFile.path.replace(/\.js$/, '.nls.keys.js')));
|
||||||
|
|||||||
@@ -6,10 +6,9 @@
|
|||||||
import * as ts from 'typescript';
|
import * as ts from 'typescript';
|
||||||
import * as lazy from 'lazy.js';
|
import * as lazy from 'lazy.js';
|
||||||
import { duplex, through } from 'event-stream';
|
import { duplex, through } from 'event-stream';
|
||||||
import File = require('vinyl');
|
import * as File from 'vinyl';
|
||||||
import * as sm from 'source-map';
|
import * as sm from 'source-map';
|
||||||
import assign = require('object-assign');
|
import * as path from 'path';
|
||||||
import path = require('path');
|
|
||||||
|
|
||||||
declare class FileSourceMap extends File {
|
declare class FileSourceMap extends File {
|
||||||
public sourceMap: sm.RawSourceMap;
|
public sourceMap: sm.RawSourceMap;
|
||||||
@@ -26,7 +25,7 @@ function collect(node: ts.Node, fn: (node: ts.Node) => CollectStepResult): ts.No
|
|||||||
const result: ts.Node[] = [];
|
const result: ts.Node[] = [];
|
||||||
|
|
||||||
function loop(node: ts.Node) {
|
function loop(node: ts.Node) {
|
||||||
var stepResult = fn(node);
|
const stepResult = fn(node);
|
||||||
|
|
||||||
if (stepResult === CollectStepResult.Yes || stepResult === CollectStepResult.YesAndRecurse) {
|
if (stepResult === CollectStepResult.Yes || stepResult === CollectStepResult.YesAndRecurse) {
|
||||||
result.push(node);
|
result.push(node);
|
||||||
@@ -42,8 +41,8 @@ function collect(node: ts.Node, fn: (node: ts.Node) => CollectStepResult): ts.No
|
|||||||
}
|
}
|
||||||
|
|
||||||
function clone<T>(object: T): T {
|
function clone<T>(object: T): T {
|
||||||
var result = <T>{};
|
const result = <T>{};
|
||||||
for (var id in object) {
|
for (const id in object) {
|
||||||
result[id] = object[id];
|
result[id] = object[id];
|
||||||
}
|
}
|
||||||
return result;
|
return result;
|
||||||
@@ -67,8 +66,8 @@ define([], [${ wrap + lines.map(l => indent + l).join(',\n') + wrap}]);`;
|
|||||||
* Returns a stream containing the patched JavaScript and source maps.
|
* Returns a stream containing the patched JavaScript and source maps.
|
||||||
*/
|
*/
|
||||||
function nls(): NodeJS.ReadWriteStream {
|
function nls(): NodeJS.ReadWriteStream {
|
||||||
var input = through();
|
const input = through();
|
||||||
var output = input.pipe(through(function (f: FileSourceMap) {
|
const output = input.pipe(through(function (f: FileSourceMap) {
|
||||||
if (!f.sourceMap) {
|
if (!f.sourceMap) {
|
||||||
return this.emit('error', new Error(`File ${f.relative} does not have sourcemaps.`));
|
return this.emit('error', new Error(`File ${f.relative} does not have sourcemaps.`));
|
||||||
}
|
}
|
||||||
@@ -83,7 +82,7 @@ function nls(): NodeJS.ReadWriteStream {
|
|||||||
source = path.join(root, source);
|
source = path.join(root, source);
|
||||||
}
|
}
|
||||||
|
|
||||||
const typescript = f.sourceMap.sourcesContent[0];
|
const typescript = f.sourceMap.sourcesContent![0];
|
||||||
if (!typescript) {
|
if (!typescript) {
|
||||||
return this.emit('error', new Error(`File ${f.relative} does not have the original content in the source map.`));
|
return this.emit('error', new Error(`File ${f.relative} does not have the original content in the source map.`));
|
||||||
}
|
}
|
||||||
@@ -174,7 +173,7 @@ module nls {
|
|||||||
|
|
||||||
export function analyze(contents: string, options: ts.CompilerOptions = {}): ILocalizeAnalysisResult {
|
export function analyze(contents: string, options: ts.CompilerOptions = {}): ILocalizeAnalysisResult {
|
||||||
const filename = 'file.ts';
|
const filename = 'file.ts';
|
||||||
const serviceHost = new SingleFileServiceHost(assign(clone(options), { noResolve: true }), filename, contents);
|
const serviceHost = new SingleFileServiceHost(Object.assign(clone(options), { noResolve: true }), filename, contents);
|
||||||
const service = ts.createLanguageService(serviceHost);
|
const service = ts.createLanguageService(serviceHost);
|
||||||
const sourceFile = ts.createSourceFile(filename, contents, ts.ScriptTarget.ES5, true);
|
const sourceFile = ts.createSourceFile(filename, contents, ts.ScriptTarget.ES5, true);
|
||||||
|
|
||||||
@@ -206,8 +205,8 @@ module nls {
|
|||||||
|
|
||||||
// `nls.localize(...)` calls
|
// `nls.localize(...)` calls
|
||||||
const nlsLocalizeCallExpressions = importDeclarations
|
const nlsLocalizeCallExpressions = importDeclarations
|
||||||
.filter(d => d.importClause.namedBindings.kind === ts.SyntaxKind.NamespaceImport)
|
.filter(d => !!(d.importClause && d.importClause.namedBindings && d.importClause.namedBindings.kind === ts.SyntaxKind.NamespaceImport))
|
||||||
.map(d => (<ts.NamespaceImport>d.importClause.namedBindings).name)
|
.map(d => (<ts.NamespaceImport>d.importClause!.namedBindings).name)
|
||||||
.concat(importEqualsDeclarations.map(d => d.name))
|
.concat(importEqualsDeclarations.map(d => d.name))
|
||||||
|
|
||||||
// find read-only references to `nls`
|
// find read-only references to `nls`
|
||||||
@@ -226,8 +225,8 @@ module nls {
|
|||||||
|
|
||||||
// `localize` named imports
|
// `localize` named imports
|
||||||
const allLocalizeImportDeclarations = importDeclarations
|
const allLocalizeImportDeclarations = importDeclarations
|
||||||
.filter(d => d.importClause.namedBindings.kind === ts.SyntaxKind.NamedImports)
|
.filter(d => !!(d.importClause && d.importClause.namedBindings && d.importClause.namedBindings.kind === ts.SyntaxKind.NamedImports))
|
||||||
.map(d => [].concat((<ts.NamedImports>d.importClause.namedBindings).elements))
|
.map(d => ([] as any[]).concat((<ts.NamedImports>d.importClause!.namedBindings!).elements))
|
||||||
.flatten();
|
.flatten();
|
||||||
|
|
||||||
// `localize` read-only references
|
// `localize` read-only references
|
||||||
@@ -279,7 +278,7 @@ module nls {
|
|||||||
constructor(contents: string) {
|
constructor(contents: string) {
|
||||||
const regex = /\r\n|\r|\n/g;
|
const regex = /\r\n|\r|\n/g;
|
||||||
let index = 0;
|
let index = 0;
|
||||||
let match: RegExpExecArray;
|
let match: RegExpExecArray | null;
|
||||||
|
|
||||||
this.lines = [];
|
this.lines = [];
|
||||||
this.lineEndings = [];
|
this.lineEndings = [];
|
||||||
@@ -360,7 +359,7 @@ module nls {
|
|||||||
patches = patches.reverse();
|
patches = patches.reverse();
|
||||||
let currentLine = -1;
|
let currentLine = -1;
|
||||||
let currentLineDiff = 0;
|
let currentLineDiff = 0;
|
||||||
let source = null;
|
let source: string | null = null;
|
||||||
|
|
||||||
smc.eachMapping(m => {
|
smc.eachMapping(m => {
|
||||||
const patch = patches[patches.length - 1];
|
const patch = patches[patches.length - 1];
|
||||||
|
|||||||
@@ -4,30 +4,31 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
'use strict';
|
'use strict';
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var path = require("path");
|
const es = require("event-stream");
|
||||||
var gulp = require("gulp");
|
const gulp = require("gulp");
|
||||||
var sourcemaps = require("gulp-sourcemaps");
|
const concat = require("gulp-concat");
|
||||||
var filter = require("gulp-filter");
|
const minifyCSS = require("gulp-cssnano");
|
||||||
var minifyCSS = require("gulp-cssnano");
|
const filter = require("gulp-filter");
|
||||||
var uglify = require("gulp-uglify");
|
const flatmap = require("gulp-flatmap");
|
||||||
var composer = require("gulp-uglify/composer");
|
const sourcemaps = require("gulp-sourcemaps");
|
||||||
var uglifyes = require("uglify-es");
|
const uglify = require("gulp-uglify");
|
||||||
var es = require("event-stream");
|
const composer = require("gulp-uglify/composer");
|
||||||
var concat = require("gulp-concat");
|
const gulpUtil = require("gulp-util");
|
||||||
var VinylFile = require("vinyl");
|
const path = require("path");
|
||||||
var bundle = require("./bundle");
|
const pump = require("pump");
|
||||||
var util = require("./util");
|
const uglifyes = require("uglify-es");
|
||||||
var i18n = require("./i18n");
|
const VinylFile = require("vinyl");
|
||||||
var gulpUtil = require("gulp-util");
|
const bundle = require("./bundle");
|
||||||
var flatmap = require("gulp-flatmap");
|
const i18n_1 = require("./i18n");
|
||||||
var pump = require("pump");
|
const stats_1 = require("./stats");
|
||||||
var REPO_ROOT_PATH = path.join(__dirname, '../..');
|
const util = require("./util");
|
||||||
|
const REPO_ROOT_PATH = path.join(__dirname, '../..');
|
||||||
function log(prefix, message) {
|
function log(prefix, message) {
|
||||||
gulpUtil.log(gulpUtil.colors.cyan('[' + prefix + ']'), message);
|
gulpUtil.log(gulpUtil.colors.cyan('[' + prefix + ']'), message);
|
||||||
}
|
}
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
function loaderConfig(emptyPaths) {
|
function loaderConfig(emptyPaths) {
|
||||||
var result = {
|
const result = {
|
||||||
paths: {
|
paths: {
|
||||||
'vs': 'out-build/vs',
|
'vs': 'out-build/vs',
|
||||||
'sql': 'out-build/sql',
|
'sql': 'out-build/sql',
|
||||||
@@ -39,26 +40,26 @@ function loaderConfig(emptyPaths) {
|
|||||||
return result;
|
return result;
|
||||||
}
|
}
|
||||||
exports.loaderConfig = loaderConfig;
|
exports.loaderConfig = loaderConfig;
|
||||||
var IS_OUR_COPYRIGHT_REGEXP = /Copyright \(C\) Microsoft Corporation/i;
|
const IS_OUR_COPYRIGHT_REGEXP = /Copyright \(C\) Microsoft Corporation/i;
|
||||||
function loader(bundledFileHeader, bundleLoader) {
|
function loader(src, bundledFileHeader, bundleLoader) {
|
||||||
var sources = [
|
let sources = [
|
||||||
'out-build/vs/loader.js'
|
`${src}/vs/loader.js`
|
||||||
];
|
];
|
||||||
if (bundleLoader) {
|
if (bundleLoader) {
|
||||||
sources = sources.concat([
|
sources = sources.concat([
|
||||||
'out-build/vs/css.js',
|
`${src}/vs/css.js`,
|
||||||
'out-build/vs/nls.js'
|
`${src}/vs/nls.js`
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
var isFirst = true;
|
let isFirst = true;
|
||||||
return (gulp
|
return (gulp
|
||||||
.src(sources, { base: 'out-build' })
|
.src(sources, { base: `${src}` })
|
||||||
.pipe(es.through(function (data) {
|
.pipe(es.through(function (data) {
|
||||||
if (isFirst) {
|
if (isFirst) {
|
||||||
isFirst = false;
|
isFirst = false;
|
||||||
this.emit('data', new VinylFile({
|
this.emit('data', new VinylFile({
|
||||||
path: 'fake',
|
path: 'fake',
|
||||||
base: '',
|
base: undefined,
|
||||||
contents: Buffer.from(bundledFileHeader)
|
contents: Buffer.from(bundledFileHeader)
|
||||||
}));
|
}));
|
||||||
this.emit('data', data);
|
this.emit('data', data);
|
||||||
@@ -74,13 +75,13 @@ function loader(bundledFileHeader, bundleLoader) {
|
|||||||
return f;
|
return f;
|
||||||
})));
|
})));
|
||||||
}
|
}
|
||||||
function toConcatStream(bundledFileHeader, sources, dest) {
|
function toConcatStream(src, bundledFileHeader, sources, dest) {
|
||||||
var useSourcemaps = /\.js$/.test(dest) && !/\.nls\.js$/.test(dest);
|
const useSourcemaps = /\.js$/.test(dest) && !/\.nls\.js$/.test(dest);
|
||||||
// If a bundle ends up including in any of the sources our copyright, then
|
// If a bundle ends up including in any of the sources our copyright, then
|
||||||
// insert a fake source at the beginning of each bundle with our copyright
|
// insert a fake source at the beginning of each bundle with our copyright
|
||||||
var containsOurCopyright = false;
|
let containsOurCopyright = false;
|
||||||
for (var i = 0, len = sources.length; i < len; i++) {
|
for (let i = 0, len = sources.length; i < len; i++) {
|
||||||
var fileContents = sources[i].contents;
|
const fileContents = sources[i].contents;
|
||||||
if (IS_OUR_COPYRIGHT_REGEXP.test(fileContents)) {
|
if (IS_OUR_COPYRIGHT_REGEXP.test(fileContents)) {
|
||||||
containsOurCopyright = true;
|
containsOurCopyright = true;
|
||||||
break;
|
break;
|
||||||
@@ -92,9 +93,9 @@ function toConcatStream(bundledFileHeader, sources, dest) {
|
|||||||
contents: bundledFileHeader
|
contents: bundledFileHeader
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
var treatedSources = sources.map(function (source) {
|
const treatedSources = sources.map(function (source) {
|
||||||
var root = source.path ? REPO_ROOT_PATH.replace(/\\/g, '/') : '';
|
const root = source.path ? REPO_ROOT_PATH.replace(/\\/g, '/') : '';
|
||||||
var base = source.path ? root + '/out-build' : '';
|
const base = source.path ? root + `/${src}` : undefined;
|
||||||
return new VinylFile({
|
return new VinylFile({
|
||||||
path: source.path ? root + '/' + source.path.replace(/\\/g, '/') : 'fake',
|
path: source.path ? root + '/' + source.path.replace(/\\/g, '/') : 'fake',
|
||||||
base: base,
|
base: base,
|
||||||
@@ -103,40 +104,42 @@ function toConcatStream(bundledFileHeader, sources, dest) {
|
|||||||
});
|
});
|
||||||
return es.readArray(treatedSources)
|
return es.readArray(treatedSources)
|
||||||
.pipe(useSourcemaps ? util.loadSourcemaps() : es.through())
|
.pipe(useSourcemaps ? util.loadSourcemaps() : es.through())
|
||||||
.pipe(concat(dest));
|
.pipe(concat(dest))
|
||||||
|
.pipe(stats_1.createStatsStream(dest));
|
||||||
}
|
}
|
||||||
function toBundleStream(bundledFileHeader, bundles) {
|
function toBundleStream(src, bundledFileHeader, bundles) {
|
||||||
return es.merge(bundles.map(function (bundle) {
|
return es.merge(bundles.map(function (bundle) {
|
||||||
return toConcatStream(bundledFileHeader, bundle.sources, bundle.dest);
|
return toConcatStream(src, bundledFileHeader, bundle.sources, bundle.dest);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
function optimizeTask(opts) {
|
function optimizeTask(opts) {
|
||||||
var entryPoints = opts.entryPoints;
|
const src = opts.src;
|
||||||
var otherSources = opts.otherSources;
|
const entryPoints = opts.entryPoints;
|
||||||
var resources = opts.resources;
|
const otherSources = opts.otherSources;
|
||||||
var loaderConfig = opts.loaderConfig;
|
const resources = opts.resources;
|
||||||
var bundledFileHeader = opts.header;
|
const loaderConfig = opts.loaderConfig;
|
||||||
var bundleLoader = (typeof opts.bundleLoader === 'undefined' ? true : opts.bundleLoader);
|
const bundledFileHeader = opts.header;
|
||||||
var out = opts.out;
|
const bundleLoader = (typeof opts.bundleLoader === 'undefined' ? true : opts.bundleLoader);
|
||||||
|
const out = opts.out;
|
||||||
return function () {
|
return function () {
|
||||||
var bundlesStream = es.through(); // this stream will contain the bundled files
|
const bundlesStream = es.through(); // this stream will contain the bundled files
|
||||||
var resourcesStream = es.through(); // this stream will contain the resources
|
const resourcesStream = es.through(); // this stream will contain the resources
|
||||||
var bundleInfoStream = es.through(); // this stream will contain bundleInfo.json
|
const bundleInfoStream = es.through(); // this stream will contain bundleInfo.json
|
||||||
bundle.bundle(entryPoints, loaderConfig, function (err, result) {
|
bundle.bundle(entryPoints, loaderConfig, function (err, result) {
|
||||||
if (err) {
|
if (err || !result) {
|
||||||
return bundlesStream.emit('error', JSON.stringify(err));
|
return bundlesStream.emit('error', JSON.stringify(err));
|
||||||
}
|
}
|
||||||
toBundleStream(bundledFileHeader, result.files).pipe(bundlesStream);
|
toBundleStream(src, bundledFileHeader, result.files).pipe(bundlesStream);
|
||||||
// Remove css inlined resources
|
// Remove css inlined resources
|
||||||
var filteredResources = resources.slice();
|
const filteredResources = resources.slice();
|
||||||
result.cssInlinedResources.forEach(function (resource) {
|
result.cssInlinedResources.forEach(function (resource) {
|
||||||
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
if (process.env['VSCODE_BUILD_VERBOSE']) {
|
||||||
log('optimizer', 'excluding inlined: ' + resource);
|
log('optimizer', 'excluding inlined: ' + resource);
|
||||||
}
|
}
|
||||||
filteredResources.push('!' + resource);
|
filteredResources.push('!' + resource);
|
||||||
});
|
});
|
||||||
gulp.src(filteredResources, { base: 'out-build' }).pipe(resourcesStream);
|
gulp.src(filteredResources, { base: `${src}` }).pipe(resourcesStream);
|
||||||
var bundleInfoArray = [];
|
const bundleInfoArray = [];
|
||||||
if (opts.bundleInfo) {
|
if (opts.bundleInfo) {
|
||||||
bundleInfoArray.push(new VinylFile({
|
bundleInfoArray.push(new VinylFile({
|
||||||
path: 'bundleInfo.json',
|
path: 'bundleInfo.json',
|
||||||
@@ -146,11 +149,11 @@ function optimizeTask(opts) {
|
|||||||
}
|
}
|
||||||
es.readArray(bundleInfoArray).pipe(bundleInfoStream);
|
es.readArray(bundleInfoArray).pipe(bundleInfoStream);
|
||||||
});
|
});
|
||||||
var otherSourcesStream = es.through();
|
const otherSourcesStream = es.through();
|
||||||
var otherSourcesStreamArr = [];
|
const otherSourcesStreamArr = [];
|
||||||
gulp.src(otherSources, { base: 'out-build' })
|
gulp.src(otherSources, { base: `${src}` })
|
||||||
.pipe(es.through(function (data) {
|
.pipe(es.through(function (data) {
|
||||||
otherSourcesStreamArr.push(toConcatStream(bundledFileHeader, [data], data.relative));
|
otherSourcesStreamArr.push(toConcatStream(src, bundledFileHeader, [data], data.relative));
|
||||||
}, function () {
|
}, function () {
|
||||||
if (!otherSourcesStreamArr.length) {
|
if (!otherSourcesStreamArr.length) {
|
||||||
setTimeout(function () { otherSourcesStream.emit('end'); }, 0);
|
setTimeout(function () { otherSourcesStream.emit('end'); }, 0);
|
||||||
@@ -159,17 +162,17 @@ function optimizeTask(opts) {
|
|||||||
es.merge(otherSourcesStreamArr).pipe(otherSourcesStream);
|
es.merge(otherSourcesStreamArr).pipe(otherSourcesStream);
|
||||||
}
|
}
|
||||||
}));
|
}));
|
||||||
var result = es.merge(loader(bundledFileHeader, bundleLoader), bundlesStream, otherSourcesStream, resourcesStream, bundleInfoStream);
|
const result = es.merge(loader(src, bundledFileHeader, bundleLoader), bundlesStream, otherSourcesStream, resourcesStream, bundleInfoStream);
|
||||||
return result
|
return result
|
||||||
.pipe(sourcemaps.write('./', {
|
.pipe(sourcemaps.write('./', {
|
||||||
sourceRoot: null,
|
sourceRoot: undefined,
|
||||||
addComment: true,
|
addComment: true,
|
||||||
includeContent: true
|
includeContent: true
|
||||||
}))
|
}))
|
||||||
.pipe(i18n.processNlsFiles({
|
.pipe(opts.languages && opts.languages.length ? i18n_1.processNlsFiles({
|
||||||
fileHeader: bundledFileHeader,
|
fileHeader: bundledFileHeader,
|
||||||
languages: opts.languages
|
languages: opts.languages
|
||||||
}))
|
}) : es.through())
|
||||||
.pipe(gulp.dest(out));
|
.pipe(gulp.dest(out));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -179,14 +182,14 @@ exports.optimizeTask = optimizeTask;
|
|||||||
* to have a file "context" to include our copyright only once per file.
|
* to have a file "context" to include our copyright only once per file.
|
||||||
*/
|
*/
|
||||||
function uglifyWithCopyrights() {
|
function uglifyWithCopyrights() {
|
||||||
var preserveComments = function (f) {
|
const preserveComments = (f) => {
|
||||||
return function (node, comment) {
|
return (_node, comment) => {
|
||||||
var text = comment.value;
|
const text = comment.value;
|
||||||
var type = comment.type;
|
const type = comment.type;
|
||||||
if (/@minifier_do_not_preserve/.test(text)) {
|
if (/@minifier_do_not_preserve/.test(text)) {
|
||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
var isOurCopyright = IS_OUR_COPYRIGHT_REGEXP.test(text);
|
const isOurCopyright = IS_OUR_COPYRIGHT_REGEXP.test(text);
|
||||||
if (isOurCopyright) {
|
if (isOurCopyright) {
|
||||||
if (f.__hasOurCopyright) {
|
if (f.__hasOurCopyright) {
|
||||||
return false;
|
return false;
|
||||||
@@ -204,10 +207,10 @@ function uglifyWithCopyrights() {
|
|||||||
return false;
|
return false;
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
var minify = composer(uglifyes);
|
const minify = composer(uglifyes);
|
||||||
var input = es.through();
|
const input = es.through();
|
||||||
var output = input
|
const output = input
|
||||||
.pipe(flatmap(function (stream, f) {
|
.pipe(flatmap((stream, f) => {
|
||||||
return stream.pipe(minify({
|
return stream.pipe(minify({
|
||||||
output: {
|
output: {
|
||||||
comments: preserveComments(f),
|
comments: preserveComments(f),
|
||||||
@@ -218,18 +221,18 @@ function uglifyWithCopyrights() {
|
|||||||
return es.duplex(input, output);
|
return es.duplex(input, output);
|
||||||
}
|
}
|
||||||
function minifyTask(src, sourceMapBaseUrl) {
|
function minifyTask(src, sourceMapBaseUrl) {
|
||||||
var sourceMappingURL = sourceMapBaseUrl && (function (f) { return sourceMapBaseUrl + "/" + f.relative + ".map"; });
|
const sourceMappingURL = sourceMapBaseUrl ? ((f) => `${sourceMapBaseUrl}/${f.relative}.map`) : undefined;
|
||||||
return function (cb) {
|
return cb => {
|
||||||
var jsFilter = filter('**/*.js', { restore: true });
|
const jsFilter = filter('**/*.js', { restore: true });
|
||||||
var cssFilter = filter('**/*.css', { restore: true });
|
const cssFilter = filter('**/*.css', { restore: true });
|
||||||
pump(gulp.src([src + '/**', '!' + src + '/**/*.map']), jsFilter, sourcemaps.init({ loadMaps: true }), uglifyWithCopyrights(), jsFilter.restore, cssFilter, minifyCSS({ reduceIdents: false }), cssFilter.restore, sourcemaps.write('./', {
|
pump(gulp.src([src + '/**', '!' + src + '/**/*.map']), jsFilter, sourcemaps.init({ loadMaps: true }), uglifyWithCopyrights(), jsFilter.restore, cssFilter, minifyCSS({ reduceIdents: false }), cssFilter.restore, sourcemaps.write('./', {
|
||||||
sourceMappingURL: sourceMappingURL,
|
sourceMappingURL,
|
||||||
sourceRoot: null,
|
sourceRoot: undefined,
|
||||||
includeContent: true,
|
includeContent: true,
|
||||||
addComment: true
|
addComment: true
|
||||||
}), gulp.dest(src + '-min'), function (err) {
|
}), gulp.dest(src + '-min'), (err) => {
|
||||||
if (err instanceof uglify.GulpUglifyError) {
|
if (err instanceof uglify.GulpUglifyError) {
|
||||||
console.error("Uglify error in '" + (err.cause && err.cause.filename) + "'");
|
console.error(`Uglify error in '${err.cause && err.cause.filename}'`);
|
||||||
}
|
}
|
||||||
cb(err);
|
cb(err);
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -5,24 +5,25 @@
|
|||||||
|
|
||||||
'use strict';
|
'use strict';
|
||||||
|
|
||||||
import * as path from 'path';
|
import * as es from 'event-stream';
|
||||||
import * as gulp from 'gulp';
|
import * as gulp from 'gulp';
|
||||||
import * as sourcemaps from 'gulp-sourcemaps';
|
import * as concat from 'gulp-concat';
|
||||||
import * as filter from 'gulp-filter';
|
|
||||||
import * as minifyCSS from 'gulp-cssnano';
|
import * as minifyCSS from 'gulp-cssnano';
|
||||||
|
import * as filter from 'gulp-filter';
|
||||||
|
import * as flatmap from 'gulp-flatmap';
|
||||||
|
import * as sourcemaps from 'gulp-sourcemaps';
|
||||||
import * as uglify from 'gulp-uglify';
|
import * as uglify from 'gulp-uglify';
|
||||||
import * as composer from 'gulp-uglify/composer';
|
import * as composer from 'gulp-uglify/composer';
|
||||||
import * as uglifyes from 'uglify-es';
|
|
||||||
import * as es from 'event-stream';
|
|
||||||
import * as concat from 'gulp-concat';
|
|
||||||
import * as VinylFile from 'vinyl';
|
|
||||||
import * as bundle from './bundle';
|
|
||||||
import * as util from './util';
|
|
||||||
import * as i18n from './i18n';
|
|
||||||
import * as gulpUtil from 'gulp-util';
|
import * as gulpUtil from 'gulp-util';
|
||||||
import * as flatmap from 'gulp-flatmap';
|
import * as path from 'path';
|
||||||
import * as pump from 'pump';
|
import * as pump from 'pump';
|
||||||
import * as sm from 'source-map';
|
import * as sm from 'source-map';
|
||||||
|
import * as uglifyes from 'uglify-es';
|
||||||
|
import * as VinylFile from 'vinyl';
|
||||||
|
import * as bundle from './bundle';
|
||||||
|
import { Language, processNlsFiles } from './i18n';
|
||||||
|
import { createStatsStream } from './stats';
|
||||||
|
import * as util from './util';
|
||||||
|
|
||||||
const REPO_ROOT_PATH = path.join(__dirname, '../..');
|
const REPO_ROOT_PATH = path.join(__dirname, '../..');
|
||||||
|
|
||||||
@@ -32,7 +33,7 @@ function log(prefix: string, message: string): void {
|
|||||||
|
|
||||||
// {{SQL CARBON EDIT}}
|
// {{SQL CARBON EDIT}}
|
||||||
export function loaderConfig(emptyPaths?: string[]) {
|
export function loaderConfig(emptyPaths?: string[]) {
|
||||||
const result = {
|
const result: any = {
|
||||||
paths: {
|
paths: {
|
||||||
'vs': 'out-build/vs',
|
'vs': 'out-build/vs',
|
||||||
'sql': 'out-build/sql',
|
'sql': 'out-build/sql',
|
||||||
@@ -52,27 +53,27 @@ declare class FileSourceMap extends VinylFile {
|
|||||||
public sourceMap: sm.RawSourceMap;
|
public sourceMap: sm.RawSourceMap;
|
||||||
}
|
}
|
||||||
|
|
||||||
function loader(bundledFileHeader: string, bundleLoader: boolean): NodeJS.ReadWriteStream {
|
function loader(src: string, bundledFileHeader: string, bundleLoader: boolean): NodeJS.ReadWriteStream {
|
||||||
let sources = [
|
let sources = [
|
||||||
'out-build/vs/loader.js'
|
`${src}/vs/loader.js`
|
||||||
];
|
];
|
||||||
if (bundleLoader) {
|
if (bundleLoader) {
|
||||||
sources = sources.concat([
|
sources = sources.concat([
|
||||||
'out-build/vs/css.js',
|
`${src}/vs/css.js`,
|
||||||
'out-build/vs/nls.js'
|
`${src}/vs/nls.js`
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
let isFirst = true;
|
let isFirst = true;
|
||||||
return (
|
return (
|
||||||
gulp
|
gulp
|
||||||
.src(sources, { base: 'out-build' })
|
.src(sources, { base: `${src}` })
|
||||||
.pipe(es.through(function (data) {
|
.pipe(es.through(function (data) {
|
||||||
if (isFirst) {
|
if (isFirst) {
|
||||||
isFirst = false;
|
isFirst = false;
|
||||||
this.emit('data', new VinylFile({
|
this.emit('data', new VinylFile({
|
||||||
path: 'fake',
|
path: 'fake',
|
||||||
base: '',
|
base: undefined,
|
||||||
contents: Buffer.from(bundledFileHeader)
|
contents: Buffer.from(bundledFileHeader)
|
||||||
}));
|
}));
|
||||||
this.emit('data', data);
|
this.emit('data', data);
|
||||||
@@ -89,7 +90,7 @@ function loader(bundledFileHeader: string, bundleLoader: boolean): NodeJS.ReadWr
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
function toConcatStream(bundledFileHeader: string, sources: bundle.IFile[], dest: string): NodeJS.ReadWriteStream {
|
function toConcatStream(src: string, bundledFileHeader: string, sources: bundle.IFile[], dest: string): NodeJS.ReadWriteStream {
|
||||||
const useSourcemaps = /\.js$/.test(dest) && !/\.nls\.js$/.test(dest);
|
const useSourcemaps = /\.js$/.test(dest) && !/\.nls\.js$/.test(dest);
|
||||||
|
|
||||||
// If a bundle ends up including in any of the sources our copyright, then
|
// If a bundle ends up including in any of the sources our copyright, then
|
||||||
@@ -112,7 +113,7 @@ function toConcatStream(bundledFileHeader: string, sources: bundle.IFile[], dest
|
|||||||
|
|
||||||
const treatedSources = sources.map(function (source) {
|
const treatedSources = sources.map(function (source) {
|
||||||
const root = source.path ? REPO_ROOT_PATH.replace(/\\/g, '/') : '';
|
const root = source.path ? REPO_ROOT_PATH.replace(/\\/g, '/') : '';
|
||||||
const base = source.path ? root + '/out-build' : '';
|
const base = source.path ? root + `/${src}` : undefined;
|
||||||
|
|
||||||
return new VinylFile({
|
return new VinylFile({
|
||||||
path: source.path ? root + '/' + source.path.replace(/\\/g, '/') : 'fake',
|
path: source.path ? root + '/' + source.path.replace(/\\/g, '/') : 'fake',
|
||||||
@@ -123,16 +124,21 @@ function toConcatStream(bundledFileHeader: string, sources: bundle.IFile[], dest
|
|||||||
|
|
||||||
return es.readArray(treatedSources)
|
return es.readArray(treatedSources)
|
||||||
.pipe(useSourcemaps ? util.loadSourcemaps() : es.through())
|
.pipe(useSourcemaps ? util.loadSourcemaps() : es.through())
|
||||||
.pipe(concat(dest));
|
.pipe(concat(dest))
|
||||||
|
.pipe(createStatsStream(dest));
|
||||||
}
|
}
|
||||||
|
|
||||||
function toBundleStream(bundledFileHeader: string, bundles: bundle.IConcatFile[]): NodeJS.ReadWriteStream {
|
function toBundleStream(src: string, bundledFileHeader: string, bundles: bundle.IConcatFile[]): NodeJS.ReadWriteStream {
|
||||||
return es.merge(bundles.map(function (bundle) {
|
return es.merge(bundles.map(function (bundle) {
|
||||||
return toConcatStream(bundledFileHeader, bundle.sources, bundle.dest);
|
return toConcatStream(src, bundledFileHeader, bundle.sources, bundle.dest);
|
||||||
}));
|
}));
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IOptimizeTaskOpts {
|
export interface IOptimizeTaskOpts {
|
||||||
|
/**
|
||||||
|
* The folder to read files from.
|
||||||
|
*/
|
||||||
|
src: string;
|
||||||
/**
|
/**
|
||||||
* (for AMD files, will get bundled and get Copyright treatment)
|
* (for AMD files, will get bundled and get Copyright treatment)
|
||||||
*/
|
*/
|
||||||
@@ -163,11 +169,13 @@ export interface IOptimizeTaskOpts {
|
|||||||
*/
|
*/
|
||||||
out: string;
|
out: string;
|
||||||
/**
|
/**
|
||||||
* (languages to process)
|
* (out folder name)
|
||||||
*/
|
*/
|
||||||
languages: i18n.Language[];
|
languages?: Language[];
|
||||||
}
|
}
|
||||||
|
|
||||||
export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStream {
|
export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStream {
|
||||||
|
const src = opts.src;
|
||||||
const entryPoints = opts.entryPoints;
|
const entryPoints = opts.entryPoints;
|
||||||
const otherSources = opts.otherSources;
|
const otherSources = opts.otherSources;
|
||||||
const resources = opts.resources;
|
const resources = opts.resources;
|
||||||
@@ -182,9 +190,9 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr
|
|||||||
const bundleInfoStream = es.through(); // this stream will contain bundleInfo.json
|
const bundleInfoStream = es.through(); // this stream will contain bundleInfo.json
|
||||||
|
|
||||||
bundle.bundle(entryPoints, loaderConfig, function (err, result) {
|
bundle.bundle(entryPoints, loaderConfig, function (err, result) {
|
||||||
if (err) { return bundlesStream.emit('error', JSON.stringify(err)); }
|
if (err || !result) { return bundlesStream.emit('error', JSON.stringify(err)); }
|
||||||
|
|
||||||
toBundleStream(bundledFileHeader, result.files).pipe(bundlesStream);
|
toBundleStream(src, bundledFileHeader, result.files).pipe(bundlesStream);
|
||||||
|
|
||||||
// Remove css inlined resources
|
// Remove css inlined resources
|
||||||
const filteredResources = resources.slice();
|
const filteredResources = resources.slice();
|
||||||
@@ -194,7 +202,7 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr
|
|||||||
}
|
}
|
||||||
filteredResources.push('!' + resource);
|
filteredResources.push('!' + resource);
|
||||||
});
|
});
|
||||||
gulp.src(filteredResources, { base: 'out-build' }).pipe(resourcesStream);
|
gulp.src(filteredResources, { base: `${src}` }).pipe(resourcesStream);
|
||||||
|
|
||||||
const bundleInfoArray: VinylFile[] = [];
|
const bundleInfoArray: VinylFile[] = [];
|
||||||
if (opts.bundleInfo) {
|
if (opts.bundleInfo) {
|
||||||
@@ -210,9 +218,9 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr
|
|||||||
const otherSourcesStream = es.through();
|
const otherSourcesStream = es.through();
|
||||||
const otherSourcesStreamArr: NodeJS.ReadWriteStream[] = [];
|
const otherSourcesStreamArr: NodeJS.ReadWriteStream[] = [];
|
||||||
|
|
||||||
gulp.src(otherSources, { base: 'out-build' })
|
gulp.src(otherSources, { base: `${src}` })
|
||||||
.pipe(es.through(function (data) {
|
.pipe(es.through(function (data) {
|
||||||
otherSourcesStreamArr.push(toConcatStream(bundledFileHeader, [data], data.relative));
|
otherSourcesStreamArr.push(toConcatStream(src, bundledFileHeader, [data], data.relative));
|
||||||
}, function () {
|
}, function () {
|
||||||
if (!otherSourcesStreamArr.length) {
|
if (!otherSourcesStreamArr.length) {
|
||||||
setTimeout(function () { otherSourcesStream.emit('end'); }, 0);
|
setTimeout(function () { otherSourcesStream.emit('end'); }, 0);
|
||||||
@@ -222,7 +230,7 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr
|
|||||||
}));
|
}));
|
||||||
|
|
||||||
const result = es.merge(
|
const result = es.merge(
|
||||||
loader(bundledFileHeader, bundleLoader),
|
loader(src, bundledFileHeader, bundleLoader),
|
||||||
bundlesStream,
|
bundlesStream,
|
||||||
otherSourcesStream,
|
otherSourcesStream,
|
||||||
resourcesStream,
|
resourcesStream,
|
||||||
@@ -231,14 +239,14 @@ export function optimizeTask(opts: IOptimizeTaskOpts): () => NodeJS.ReadWriteStr
|
|||||||
|
|
||||||
return result
|
return result
|
||||||
.pipe(sourcemaps.write('./', {
|
.pipe(sourcemaps.write('./', {
|
||||||
sourceRoot: null,
|
sourceRoot: undefined,
|
||||||
addComment: true,
|
addComment: true,
|
||||||
includeContent: true
|
includeContent: true
|
||||||
}))
|
}))
|
||||||
.pipe(i18n.processNlsFiles({
|
.pipe(opts.languages && opts.languages.length ? processNlsFiles({
|
||||||
fileHeader: bundledFileHeader,
|
fileHeader: bundledFileHeader,
|
||||||
languages: opts.languages
|
languages: opts.languages
|
||||||
}))
|
}) : es.through())
|
||||||
.pipe(gulp.dest(out));
|
.pipe(gulp.dest(out));
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
@@ -252,7 +260,7 @@ declare class FileWithCopyright extends VinylFile {
|
|||||||
*/
|
*/
|
||||||
function uglifyWithCopyrights(): NodeJS.ReadWriteStream {
|
function uglifyWithCopyrights(): NodeJS.ReadWriteStream {
|
||||||
const preserveComments = (f: FileWithCopyright) => {
|
const preserveComments = (f: FileWithCopyright) => {
|
||||||
return (node, comment: { value: string; type: string; }) => {
|
return (_node: any, comment: { value: string; type: string; }) => {
|
||||||
const text = comment.value;
|
const text = comment.value;
|
||||||
const type = comment.type;
|
const type = comment.type;
|
||||||
|
|
||||||
@@ -280,7 +288,7 @@ function uglifyWithCopyrights(): NodeJS.ReadWriteStream {
|
|||||||
};
|
};
|
||||||
};
|
};
|
||||||
|
|
||||||
const minify = composer(uglifyes);
|
const minify = (composer as any)(uglifyes);
|
||||||
const input = es.through();
|
const input = es.through();
|
||||||
const output = input
|
const output = input
|
||||||
.pipe(flatmap((stream, f) => {
|
.pipe(flatmap((stream, f) => {
|
||||||
@@ -296,7 +304,7 @@ function uglifyWithCopyrights(): NodeJS.ReadWriteStream {
|
|||||||
}
|
}
|
||||||
|
|
||||||
export function minifyTask(src: string, sourceMapBaseUrl?: string): (cb: any) => void {
|
export function minifyTask(src: string, sourceMapBaseUrl?: string): (cb: any) => void {
|
||||||
const sourceMappingURL = sourceMapBaseUrl && (f => `${sourceMapBaseUrl}/${f.relative}.map`);
|
const sourceMappingURL = sourceMapBaseUrl ? ((f: any) => `${sourceMapBaseUrl}/${f.relative}.map`) : undefined;
|
||||||
|
|
||||||
return cb => {
|
return cb => {
|
||||||
const jsFilter = filter('**/*.js', { restore: true });
|
const jsFilter = filter('**/*.js', { restore: true });
|
||||||
@@ -313,13 +321,13 @@ export function minifyTask(src: string, sourceMapBaseUrl?: string): (cb: any) =>
|
|||||||
cssFilter.restore,
|
cssFilter.restore,
|
||||||
sourcemaps.write('./', {
|
sourcemaps.write('./', {
|
||||||
sourceMappingURL,
|
sourceMappingURL,
|
||||||
sourceRoot: null,
|
sourceRoot: undefined,
|
||||||
includeContent: true,
|
includeContent: true,
|
||||||
addComment: true
|
addComment: true
|
||||||
}),
|
} as any),
|
||||||
gulp.dest(src + '-min')
|
gulp.dest(src + '-min')
|
||||||
, (err: any) => {
|
, (err: any) => {
|
||||||
if (err instanceof uglify.GulpUglifyError) {
|
if (err instanceof (uglify as any).GulpUglifyError) {
|
||||||
console.error(`Uglify error in '${err.cause && err.cause.filename}'`);
|
console.error(`Uglify error in '${err.cause && err.cause.filename}'`);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -4,20 +4,20 @@
|
|||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
'use strict';
|
'use strict';
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var es = require("event-stream");
|
const es = require("event-stream");
|
||||||
var _ = require("underscore");
|
const _ = require("underscore");
|
||||||
var util = require("gulp-util");
|
const util = require("gulp-util");
|
||||||
var fs = require("fs");
|
const fs = require("fs");
|
||||||
var path = require("path");
|
const path = require("path");
|
||||||
var allErrors = [];
|
const allErrors = [];
|
||||||
var startTime = null;
|
let startTime = null;
|
||||||
var count = 0;
|
let count = 0;
|
||||||
function onStart() {
|
function onStart() {
|
||||||
if (count++ > 0) {
|
if (count++ > 0) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
startTime = new Date().getTime();
|
startTime = new Date().getTime();
|
||||||
util.log("Starting " + util.colors.green('compilation') + "...");
|
util.log(`Starting ${util.colors.green('compilation')}...`);
|
||||||
}
|
}
|
||||||
function onEnd() {
|
function onEnd() {
|
||||||
if (--count > 0) {
|
if (--count > 0) {
|
||||||
@@ -25,7 +25,7 @@ function onEnd() {
|
|||||||
}
|
}
|
||||||
log();
|
log();
|
||||||
}
|
}
|
||||||
var buildLogPath = path.join(path.dirname(path.dirname(__dirname)), '.build', 'log');
|
const buildLogPath = path.join(path.dirname(path.dirname(__dirname)), '.build', 'log');
|
||||||
try {
|
try {
|
||||||
fs.mkdirSync(path.dirname(buildLogPath));
|
fs.mkdirSync(path.dirname(buildLogPath));
|
||||||
}
|
}
|
||||||
@@ -33,51 +33,52 @@ catch (err) {
|
|||||||
// ignore
|
// ignore
|
||||||
}
|
}
|
||||||
function log() {
|
function log() {
|
||||||
var errors = _.flatten(allErrors);
|
const errors = _.flatten(allErrors);
|
||||||
errors.map(function (err) { return util.log(util.colors.red('Error') + ": " + err); });
|
const seen = new Set();
|
||||||
var regex = /^([^(]+)\((\d+),(\d+)\): (.*)$/;
|
errors.map(err => {
|
||||||
var messages = errors
|
if (!seen.has(err)) {
|
||||||
.map(function (err) { return regex.exec(err); })
|
seen.add(err);
|
||||||
.filter(function (match) { return !!match; })
|
util.log(`${util.colors.red('Error')}: ${err}`);
|
||||||
.map(function (_a) {
|
}
|
||||||
var path = _a[1], line = _a[2], column = _a[3], message = _a[4];
|
|
||||||
return ({ path: path, line: parseInt(line), column: parseInt(column), message: message });
|
|
||||||
});
|
});
|
||||||
|
const regex = /^([^(]+)\((\d+),(\d+)\): (.*)$/;
|
||||||
|
const messages = errors
|
||||||
|
.map(err => regex.exec(err))
|
||||||
|
.filter(match => !!match)
|
||||||
|
.map(x => x)
|
||||||
|
.map(([, path, line, column, message]) => ({ path, line: parseInt(line), column: parseInt(column), message }));
|
||||||
try {
|
try {
|
||||||
fs.writeFileSync(buildLogPath, JSON.stringify(messages));
|
fs.writeFileSync(buildLogPath, JSON.stringify(messages));
|
||||||
}
|
}
|
||||||
catch (err) {
|
catch (err) {
|
||||||
//noop
|
//noop
|
||||||
}
|
}
|
||||||
util.log("Finished " + util.colors.green('compilation') + " with " + errors.length + " errors after " + util.colors.magenta((new Date().getTime() - startTime) + ' ms'));
|
util.log(`Finished ${util.colors.green('compilation')} with ${errors.length} errors after ${util.colors.magenta((new Date().getTime() - startTime) + ' ms')}`);
|
||||||
}
|
}
|
||||||
function createReporter() {
|
function createReporter() {
|
||||||
var errors = [];
|
const errors = [];
|
||||||
allErrors.push(errors);
|
allErrors.push(errors);
|
||||||
var ReportFunc = /** @class */ (function () {
|
const result = (err) => errors.push(err);
|
||||||
function ReportFunc(err) {
|
result.hasErrors = () => errors.length > 0;
|
||||||
errors.push(err);
|
result.end = (emitError) => {
|
||||||
}
|
errors.length = 0;
|
||||||
ReportFunc.hasErrors = function () {
|
onStart();
|
||||||
return errors.length > 0;
|
return es.through(undefined, function () {
|
||||||
};
|
onEnd();
|
||||||
ReportFunc.end = function (emitError) {
|
if (emitError && errors.length > 0) {
|
||||||
errors.length = 0;
|
if (!errors.__logged__) {
|
||||||
onStart();
|
|
||||||
return es.through(null, function () {
|
|
||||||
onEnd();
|
|
||||||
if (emitError && errors.length > 0) {
|
|
||||||
log();
|
log();
|
||||||
this.emit('error');
|
|
||||||
}
|
}
|
||||||
else {
|
errors.__logged__ = true;
|
||||||
this.emit('end');
|
const err = new Error(`Found ${errors.length} errors`);
|
||||||
}
|
err.__reporter__ = true;
|
||||||
});
|
this.emit('error', err);
|
||||||
};
|
}
|
||||||
return ReportFunc;
|
else {
|
||||||
}());
|
this.emit('end');
|
||||||
return ReportFunc;
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
return result;
|
||||||
}
|
}
|
||||||
exports.createReporter = createReporter;
|
exports.createReporter = createReporter;
|
||||||
;
|
|
||||||
|
|||||||
@@ -11,8 +11,8 @@ import * as util from 'gulp-util';
|
|||||||
import * as fs from 'fs';
|
import * as fs from 'fs';
|
||||||
import * as path from 'path';
|
import * as path from 'path';
|
||||||
|
|
||||||
const allErrors: Error[][] = [];
|
const allErrors: string[][] = [];
|
||||||
let startTime: number = null;
|
let startTime: number | null = null;
|
||||||
let count = 0;
|
let count = 0;
|
||||||
|
|
||||||
function onStart(): void {
|
function onStart(): void {
|
||||||
@@ -42,12 +42,20 @@ try {
|
|||||||
|
|
||||||
function log(): void {
|
function log(): void {
|
||||||
const errors = _.flatten(allErrors);
|
const errors = _.flatten(allErrors);
|
||||||
errors.map(err => util.log(`${util.colors.red('Error')}: ${err}`));
|
const seen = new Set<string>();
|
||||||
|
|
||||||
|
errors.map(err => {
|
||||||
|
if (!seen.has(err)) {
|
||||||
|
seen.add(err);
|
||||||
|
util.log(`${util.colors.red('Error')}: ${err}`);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
const regex = /^([^(]+)\((\d+),(\d+)\): (.*)$/;
|
const regex = /^([^(]+)\((\d+),(\d+)\): (.*)$/;
|
||||||
const messages = errors
|
const messages = errors
|
||||||
.map(err => regex.exec(err))
|
.map(err => regex.exec(err))
|
||||||
.filter(match => !!match)
|
.filter(match => !!match)
|
||||||
|
.map(x => x as string[])
|
||||||
.map(([, path, line, column, message]) => ({ path, line: parseInt(line), column: parseInt(column), message }));
|
.map(([, path, line, column, message]) => ({ path, line: parseInt(line), column: parseInt(column), message }));
|
||||||
|
|
||||||
try {
|
try {
|
||||||
@@ -57,44 +65,45 @@ function log(): void {
|
|||||||
//noop
|
//noop
|
||||||
}
|
}
|
||||||
|
|
||||||
util.log(`Finished ${util.colors.green('compilation')} with ${errors.length} errors after ${util.colors.magenta((new Date().getTime() - startTime) + ' ms')}`);
|
util.log(`Finished ${util.colors.green('compilation')} with ${errors.length} errors after ${util.colors.magenta((new Date().getTime() - startTime!) + ' ms')}`);
|
||||||
}
|
}
|
||||||
|
|
||||||
export interface IReporter {
|
export interface IReporter {
|
||||||
(err: Error): void;
|
(err: string): void;
|
||||||
hasErrors(): boolean;
|
hasErrors(): boolean;
|
||||||
end(emitError: boolean): NodeJS.ReadWriteStream;
|
end(emitError: boolean): NodeJS.ReadWriteStream;
|
||||||
}
|
}
|
||||||
|
|
||||||
export function createReporter(): IReporter {
|
export function createReporter(): IReporter {
|
||||||
const errors: Error[] = [];
|
const errors: string[] = [];
|
||||||
allErrors.push(errors);
|
allErrors.push(errors);
|
||||||
|
|
||||||
class ReportFunc {
|
const result = (err: string) => errors.push(err);
|
||||||
constructor(err: Error) {
|
|
||||||
errors.push(err);
|
|
||||||
}
|
|
||||||
|
|
||||||
static hasErrors(): boolean {
|
result.hasErrors = () => errors.length > 0;
|
||||||
return errors.length > 0;
|
|
||||||
}
|
|
||||||
|
|
||||||
static end(emitError: boolean): NodeJS.ReadWriteStream {
|
result.end = (emitError: boolean): NodeJS.ReadWriteStream => {
|
||||||
errors.length = 0;
|
errors.length = 0;
|
||||||
onStart();
|
onStart();
|
||||||
|
|
||||||
return es.through(null, function () {
|
return es.through(undefined, function () {
|
||||||
onEnd();
|
onEnd();
|
||||||
|
|
||||||
if (emitError && errors.length > 0) {
|
if (emitError && errors.length > 0) {
|
||||||
|
if (!(errors as any).__logged__) {
|
||||||
log();
|
log();
|
||||||
this.emit('error');
|
|
||||||
} else {
|
|
||||||
this.emit('end');
|
|
||||||
}
|
}
|
||||||
});
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return <IReporter><any>ReportFunc;
|
(errors as any).__logged__ = true;
|
||||||
};
|
|
||||||
|
const err = new Error(`Found ${errors.length} errors`);
|
||||||
|
(err as any).__reporter__ = true;
|
||||||
|
this.emit('error', err);
|
||||||
|
} else {
|
||||||
|
this.emit('end');
|
||||||
|
}
|
||||||
|
});
|
||||||
|
};
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|||||||
@@ -5,35 +5,51 @@
|
|||||||
'use strict';
|
'use strict';
|
||||||
var snaps;
|
var snaps;
|
||||||
(function (snaps) {
|
(function (snaps) {
|
||||||
var fs = require('fs');
|
const fs = require('fs');
|
||||||
var path = require('path');
|
const path = require('path');
|
||||||
var os = require('os');
|
const os = require('os');
|
||||||
var cp = require('child_process');
|
const cp = require('child_process');
|
||||||
var mksnapshot = path.join(__dirname, "../../node_modules/.bin/" + (process.platform === 'win32' ? 'mksnapshot.cmd' : 'mksnapshot'));
|
const mksnapshot = path.join(__dirname, `../../node_modules/.bin/${process.platform === 'win32' ? 'mksnapshot.cmd' : 'mksnapshot'}`);
|
||||||
var product = require('../../product.json');
|
const product = require('../../product.json');
|
||||||
var arch = (process.argv.join('').match(/--arch=(.*)/) || [])[1];
|
const arch = (process.argv.join('').match(/--arch=(.*)/) || [])[1];
|
||||||
//
|
//
|
||||||
var loaderFilepath;
|
let loaderFilepath;
|
||||||
var startupBlobFilepath;
|
let startupBlobFilepath;
|
||||||
switch (process.platform) {
|
switch (process.platform) {
|
||||||
case 'darwin':
|
case 'darwin':
|
||||||
loaderFilepath = "VSCode-darwin/" + product.nameLong + ".app/Contents/Resources/app/out/vs/loader.js";
|
loaderFilepath = `VSCode-darwin/${product.nameLong}.app/Contents/Resources/app/out/vs/loader.js`;
|
||||||
startupBlobFilepath = "VSCode-darwin/" + product.nameLong + ".app/Contents/Frameworks/Electron Framework.framework/Resources/snapshot_blob.bin";
|
startupBlobFilepath = `VSCode-darwin/${product.nameLong}.app/Contents/Frameworks/Electron Framework.framework/Resources/snapshot_blob.bin`;
|
||||||
break;
|
break;
|
||||||
case 'win32':
|
case 'win32':
|
||||||
case 'linux':
|
case 'linux':
|
||||||
loaderFilepath = "VSCode-" + process.platform + "-" + arch + "/resources/app/out/vs/loader.js";
|
loaderFilepath = `VSCode-${process.platform}-${arch}/resources/app/out/vs/loader.js`;
|
||||||
startupBlobFilepath = "VSCode-" + process.platform + "-" + arch + "/snapshot_blob.bin";
|
startupBlobFilepath = `VSCode-${process.platform}-${arch}/snapshot_blob.bin`;
|
||||||
|
break;
|
||||||
|
default:
|
||||||
|
throw new Error('Unknown platform');
|
||||||
}
|
}
|
||||||
loaderFilepath = path.join(__dirname, '../../../', loaderFilepath);
|
loaderFilepath = path.join(__dirname, '../../../', loaderFilepath);
|
||||||
startupBlobFilepath = path.join(__dirname, '../../../', startupBlobFilepath);
|
startupBlobFilepath = path.join(__dirname, '../../../', startupBlobFilepath);
|
||||||
snapshotLoader(loaderFilepath, startupBlobFilepath);
|
snapshotLoader(loaderFilepath, startupBlobFilepath);
|
||||||
function snapshotLoader(loaderFilepath, startupBlobFilepath) {
|
function snapshotLoader(loaderFilepath, startupBlobFilepath) {
|
||||||
var inputFile = fs.readFileSync(loaderFilepath);
|
const inputFile = fs.readFileSync(loaderFilepath);
|
||||||
var wrappedInputFile = "\n\t\tvar Monaco_Loader_Init;\n\t\t(function() {\n\t\t\tvar doNotInitLoader = true;\n\t\t\t" + inputFile.toString() + ";\n\t\t\tMonaco_Loader_Init = function() {\n\t\t\t\tAMDLoader.init();\n\t\t\t\tCSSLoaderPlugin.init();\n\t\t\t\tNLSLoaderPlugin.init();\n\n\t\t\t\treturn { define, require };\n\t\t\t}\n\t\t})();\n\t\t";
|
const wrappedInputFile = `
|
||||||
var wrappedInputFilepath = path.join(os.tmpdir(), 'wrapped-loader.js');
|
var Monaco_Loader_Init;
|
||||||
|
(function() {
|
||||||
|
var doNotInitLoader = true;
|
||||||
|
${inputFile.toString()};
|
||||||
|
Monaco_Loader_Init = function() {
|
||||||
|
AMDLoader.init();
|
||||||
|
CSSLoaderPlugin.init();
|
||||||
|
NLSLoaderPlugin.init();
|
||||||
|
|
||||||
|
return { define, require };
|
||||||
|
}
|
||||||
|
})();
|
||||||
|
`;
|
||||||
|
const wrappedInputFilepath = path.join(os.tmpdir(), 'wrapped-loader.js');
|
||||||
console.log(wrappedInputFilepath);
|
console.log(wrappedInputFilepath);
|
||||||
fs.writeFileSync(wrappedInputFilepath, wrappedInputFile);
|
fs.writeFileSync(wrappedInputFilepath, wrappedInputFile);
|
||||||
cp.execFileSync(mksnapshot, [wrappedInputFilepath, "--startup_blob", startupBlobFilepath]);
|
cp.execFileSync(mksnapshot, [wrappedInputFilepath, `--startup_blob`, startupBlobFilepath]);
|
||||||
}
|
}
|
||||||
})(snaps || (snaps = {}));
|
})(snaps || (snaps = {}));
|
||||||
|
|||||||
@@ -30,6 +30,10 @@ namespace snaps {
|
|||||||
case 'linux':
|
case 'linux':
|
||||||
loaderFilepath = `VSCode-${process.platform}-${arch}/resources/app/out/vs/loader.js`;
|
loaderFilepath = `VSCode-${process.platform}-${arch}/resources/app/out/vs/loader.js`;
|
||||||
startupBlobFilepath = `VSCode-${process.platform}-${arch}/snapshot_blob.bin`;
|
startupBlobFilepath = `VSCode-${process.platform}-${arch}/snapshot_blob.bin`;
|
||||||
|
break;
|
||||||
|
|
||||||
|
default:
|
||||||
|
throw new Error('Unknown platform');
|
||||||
}
|
}
|
||||||
|
|
||||||
loaderFilepath = path.join(__dirname, '../../../', loaderFilepath);
|
loaderFilepath = path.join(__dirname, '../../../', loaderFilepath);
|
||||||
|
|||||||
310
build/lib/standalone.js
Normal file
310
build/lib/standalone.js
Normal file
@@ -0,0 +1,310 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const ts = require("typescript");
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const tss = require("./treeshaking");
|
||||||
|
const REPO_ROOT = path.join(__dirname, '../../');
|
||||||
|
const SRC_DIR = path.join(REPO_ROOT, 'src');
|
||||||
|
let dirCache = {};
|
||||||
|
function writeFile(filePath, contents) {
|
||||||
|
function ensureDirs(dirPath) {
|
||||||
|
if (dirCache[dirPath]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dirCache[dirPath] = true;
|
||||||
|
ensureDirs(path.dirname(dirPath));
|
||||||
|
if (fs.existsSync(dirPath)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fs.mkdirSync(dirPath);
|
||||||
|
}
|
||||||
|
ensureDirs(path.dirname(filePath));
|
||||||
|
fs.writeFileSync(filePath, contents);
|
||||||
|
}
|
||||||
|
function extractEditor(options) {
|
||||||
|
const tsConfig = JSON.parse(fs.readFileSync(path.join(options.sourcesRoot, 'tsconfig.json')).toString());
|
||||||
|
let compilerOptions;
|
||||||
|
if (tsConfig.extends) {
|
||||||
|
compilerOptions = Object.assign({}, require(path.join(options.sourcesRoot, tsConfig.extends)).compilerOptions, tsConfig.compilerOptions);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
compilerOptions = tsConfig.compilerOptions;
|
||||||
|
}
|
||||||
|
tsConfig.compilerOptions = compilerOptions;
|
||||||
|
compilerOptions.noUnusedLocals = false;
|
||||||
|
compilerOptions.preserveConstEnums = false;
|
||||||
|
compilerOptions.declaration = false;
|
||||||
|
compilerOptions.moduleResolution = ts.ModuleResolutionKind.Classic;
|
||||||
|
delete compilerOptions.types;
|
||||||
|
delete tsConfig.extends;
|
||||||
|
tsConfig.exclude = [];
|
||||||
|
options.compilerOptions = compilerOptions;
|
||||||
|
let result = tss.shake(options);
|
||||||
|
for (let fileName in result) {
|
||||||
|
if (result.hasOwnProperty(fileName)) {
|
||||||
|
writeFile(path.join(options.destRoot, fileName), result[fileName]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let copied = {};
|
||||||
|
const copyFile = (fileName) => {
|
||||||
|
if (copied[fileName]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
copied[fileName] = true;
|
||||||
|
const srcPath = path.join(options.sourcesRoot, fileName);
|
||||||
|
const dstPath = path.join(options.destRoot, fileName);
|
||||||
|
writeFile(dstPath, fs.readFileSync(srcPath));
|
||||||
|
};
|
||||||
|
const writeOutputFile = (fileName, contents) => {
|
||||||
|
writeFile(path.join(options.destRoot, fileName), contents);
|
||||||
|
};
|
||||||
|
for (let fileName in result) {
|
||||||
|
if (result.hasOwnProperty(fileName)) {
|
||||||
|
const fileContents = result[fileName];
|
||||||
|
const info = ts.preProcessFile(fileContents);
|
||||||
|
for (let i = info.importedFiles.length - 1; i >= 0; i--) {
|
||||||
|
const importedFileName = info.importedFiles[i].fileName;
|
||||||
|
let importedFilePath;
|
||||||
|
if (/^vs\/css!/.test(importedFileName)) {
|
||||||
|
importedFilePath = importedFileName.substr('vs/css!'.length) + '.css';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
importedFilePath = importedFileName;
|
||||||
|
}
|
||||||
|
if (/(^\.\/)|(^\.\.\/)/.test(importedFilePath)) {
|
||||||
|
importedFilePath = path.join(path.dirname(fileName), importedFilePath);
|
||||||
|
}
|
||||||
|
if (/\.css$/.test(importedFilePath)) {
|
||||||
|
transportCSS(importedFilePath, copyFile, writeOutputFile);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (fs.existsSync(path.join(options.sourcesRoot, importedFilePath + '.js'))) {
|
||||||
|
copyFile(importedFilePath + '.js');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
delete tsConfig.compilerOptions.moduleResolution;
|
||||||
|
writeOutputFile('tsconfig.json', JSON.stringify(tsConfig, null, '\t'));
|
||||||
|
[
|
||||||
|
'vs/css.build.js',
|
||||||
|
'vs/css.d.ts',
|
||||||
|
'vs/css.js',
|
||||||
|
'vs/loader.js',
|
||||||
|
'vs/nls.build.js',
|
||||||
|
'vs/nls.d.ts',
|
||||||
|
'vs/nls.js',
|
||||||
|
'vs/nls.mock.ts',
|
||||||
|
].forEach(copyFile);
|
||||||
|
}
|
||||||
|
exports.extractEditor = extractEditor;
|
||||||
|
function createESMSourcesAndResources2(options) {
|
||||||
|
const SRC_FOLDER = path.join(REPO_ROOT, options.srcFolder);
|
||||||
|
const OUT_FOLDER = path.join(REPO_ROOT, options.outFolder);
|
||||||
|
const OUT_RESOURCES_FOLDER = path.join(REPO_ROOT, options.outResourcesFolder);
|
||||||
|
const getDestAbsoluteFilePath = (file) => {
|
||||||
|
let dest = options.renames[file.replace(/\\/g, '/')] || file;
|
||||||
|
if (dest === 'tsconfig.json') {
|
||||||
|
return path.join(OUT_FOLDER, `tsconfig.json`);
|
||||||
|
}
|
||||||
|
if (/\.ts$/.test(dest)) {
|
||||||
|
return path.join(OUT_FOLDER, dest);
|
||||||
|
}
|
||||||
|
return path.join(OUT_RESOURCES_FOLDER, dest);
|
||||||
|
};
|
||||||
|
const allFiles = walkDirRecursive(SRC_FOLDER);
|
||||||
|
for (let i = 0; i < allFiles.length; i++) {
|
||||||
|
const file = allFiles[i];
|
||||||
|
if (options.ignores.indexOf(file.replace(/\\/g, '/')) >= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (file === 'tsconfig.json') {
|
||||||
|
const tsConfig = JSON.parse(fs.readFileSync(path.join(SRC_FOLDER, file)).toString());
|
||||||
|
tsConfig.compilerOptions.module = 'es6';
|
||||||
|
tsConfig.compilerOptions.outDir = path.join(path.relative(OUT_FOLDER, OUT_RESOURCES_FOLDER), 'vs').replace(/\\/g, '/');
|
||||||
|
write(getDestAbsoluteFilePath(file), JSON.stringify(tsConfig, null, '\t'));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/\.d\.ts$/.test(file) || /\.css$/.test(file) || /\.js$/.test(file)) {
|
||||||
|
// Transport the files directly
|
||||||
|
write(getDestAbsoluteFilePath(file), fs.readFileSync(path.join(SRC_FOLDER, file)));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/\.ts$/.test(file)) {
|
||||||
|
// Transform the .ts file
|
||||||
|
let fileContents = fs.readFileSync(path.join(SRC_FOLDER, file)).toString();
|
||||||
|
const info = ts.preProcessFile(fileContents);
|
||||||
|
for (let i = info.importedFiles.length - 1; i >= 0; i--) {
|
||||||
|
const importedFilename = info.importedFiles[i].fileName;
|
||||||
|
const pos = info.importedFiles[i].pos;
|
||||||
|
const end = info.importedFiles[i].end;
|
||||||
|
let importedFilepath;
|
||||||
|
if (/^vs\/css!/.test(importedFilename)) {
|
||||||
|
importedFilepath = importedFilename.substr('vs/css!'.length) + '.css';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
importedFilepath = importedFilename;
|
||||||
|
}
|
||||||
|
if (/(^\.\/)|(^\.\.\/)/.test(importedFilepath)) {
|
||||||
|
importedFilepath = path.join(path.dirname(file), importedFilepath);
|
||||||
|
}
|
||||||
|
let relativePath;
|
||||||
|
if (importedFilepath === path.dirname(file).replace(/\\/g, '/')) {
|
||||||
|
relativePath = '../' + path.basename(path.dirname(file));
|
||||||
|
}
|
||||||
|
else if (importedFilepath === path.dirname(path.dirname(file)).replace(/\\/g, '/')) {
|
||||||
|
relativePath = '../../' + path.basename(path.dirname(path.dirname(file)));
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
relativePath = path.relative(path.dirname(file), importedFilepath);
|
||||||
|
}
|
||||||
|
relativePath = relativePath.replace(/\\/g, '/');
|
||||||
|
if (!/(^\.\/)|(^\.\.\/)/.test(relativePath)) {
|
||||||
|
relativePath = './' + relativePath;
|
||||||
|
}
|
||||||
|
fileContents = (fileContents.substring(0, pos + 1)
|
||||||
|
+ relativePath
|
||||||
|
+ fileContents.substring(end + 1));
|
||||||
|
}
|
||||||
|
fileContents = fileContents.replace(/import ([a-zA-z0-9]+) = require\(('[^']+')\);/g, function (_, m1, m2) {
|
||||||
|
return `import * as ${m1} from ${m2};`;
|
||||||
|
});
|
||||||
|
write(getDestAbsoluteFilePath(file), fileContents);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
console.log(`UNKNOWN FILE: ${file}`);
|
||||||
|
}
|
||||||
|
function walkDirRecursive(dir) {
|
||||||
|
if (dir.charAt(dir.length - 1) !== '/' || dir.charAt(dir.length - 1) !== '\\') {
|
||||||
|
dir += '/';
|
||||||
|
}
|
||||||
|
let result = [];
|
||||||
|
_walkDirRecursive(dir, result, dir.length);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
function _walkDirRecursive(dir, result, trimPos) {
|
||||||
|
const files = fs.readdirSync(dir);
|
||||||
|
for (let i = 0; i < files.length; i++) {
|
||||||
|
const file = path.join(dir, files[i]);
|
||||||
|
if (fs.statSync(file).isDirectory()) {
|
||||||
|
_walkDirRecursive(file, result, trimPos);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result.push(file.substr(trimPos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function write(absoluteFilePath, contents) {
|
||||||
|
if (/(\.ts$)|(\.js$)/.test(absoluteFilePath)) {
|
||||||
|
contents = toggleComments(contents.toString());
|
||||||
|
}
|
||||||
|
writeFile(absoluteFilePath, contents);
|
||||||
|
function toggleComments(fileContents) {
|
||||||
|
let lines = fileContents.split(/\r\n|\r|\n/);
|
||||||
|
let mode = 0;
|
||||||
|
for (let i = 0; i < lines.length; i++) {
|
||||||
|
const line = lines[i];
|
||||||
|
if (mode === 0) {
|
||||||
|
if (/\/\/ ESM-comment-begin/.test(line)) {
|
||||||
|
mode = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/\/\/ ESM-uncomment-begin/.test(line)) {
|
||||||
|
mode = 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (mode === 1) {
|
||||||
|
if (/\/\/ ESM-comment-end/.test(line)) {
|
||||||
|
mode = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lines[i] = '// ' + line;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (mode === 2) {
|
||||||
|
if (/\/\/ ESM-uncomment-end/.test(line)) {
|
||||||
|
mode = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lines[i] = line.replace(/^(\s*)\/\/ ?/, function (_, indent) {
|
||||||
|
return indent;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return lines.join('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.createESMSourcesAndResources2 = createESMSourcesAndResources2;
|
||||||
|
function transportCSS(module, enqueue, write) {
|
||||||
|
if (!/\.css/.test(module)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
const filename = path.join(SRC_DIR, module);
|
||||||
|
const fileContents = fs.readFileSync(filename).toString();
|
||||||
|
const inlineResources = 'base64'; // see https://github.com/Microsoft/monaco-editor/issues/148
|
||||||
|
const inlineResourcesLimit = 300000; //3000; // see https://github.com/Microsoft/monaco-editor/issues/336
|
||||||
|
const newContents = _rewriteOrInlineUrls(fileContents, inlineResources === 'base64', inlineResourcesLimit);
|
||||||
|
write(module, newContents);
|
||||||
|
return true;
|
||||||
|
function _rewriteOrInlineUrls(contents, forceBase64, inlineByteLimit) {
|
||||||
|
return _replaceURL(contents, (url) => {
|
||||||
|
let imagePath = path.join(path.dirname(module), url);
|
||||||
|
let fileContents = fs.readFileSync(path.join(SRC_DIR, imagePath));
|
||||||
|
if (fileContents.length < inlineByteLimit) {
|
||||||
|
const MIME = /\.svg$/.test(url) ? 'image/svg+xml' : 'image/png';
|
||||||
|
let DATA = ';base64,' + fileContents.toString('base64');
|
||||||
|
if (!forceBase64 && /\.svg$/.test(url)) {
|
||||||
|
// .svg => url encode as explained at https://codepen.io/tigt/post/optimizing-svgs-in-data-uris
|
||||||
|
let newText = fileContents.toString()
|
||||||
|
.replace(/"/g, '\'')
|
||||||
|
.replace(/</g, '%3C')
|
||||||
|
.replace(/>/g, '%3E')
|
||||||
|
.replace(/&/g, '%26')
|
||||||
|
.replace(/#/g, '%23')
|
||||||
|
.replace(/\s+/g, ' ');
|
||||||
|
let encodedData = ',' + newText;
|
||||||
|
if (encodedData.length < DATA.length) {
|
||||||
|
DATA = encodedData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '"data:' + MIME + DATA + '"';
|
||||||
|
}
|
||||||
|
enqueue(imagePath);
|
||||||
|
return url;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function _replaceURL(contents, replacer) {
|
||||||
|
// Use ")" as the terminator as quotes are oftentimes not used at all
|
||||||
|
return contents.replace(/url\(\s*([^\)]+)\s*\)?/g, (_, ...matches) => {
|
||||||
|
let url = matches[0];
|
||||||
|
// Eliminate starting quotes (the initial whitespace is not captured)
|
||||||
|
if (url.charAt(0) === '"' || url.charAt(0) === '\'') {
|
||||||
|
url = url.substring(1);
|
||||||
|
}
|
||||||
|
// The ending whitespace is captured
|
||||||
|
while (url.length > 0 && (url.charAt(url.length - 1) === ' ' || url.charAt(url.length - 1) === '\t')) {
|
||||||
|
url = url.substring(0, url.length - 1);
|
||||||
|
}
|
||||||
|
// Eliminate ending quotes
|
||||||
|
if (url.charAt(url.length - 1) === '"' || url.charAt(url.length - 1) === '\'') {
|
||||||
|
url = url.substring(0, url.length - 1);
|
||||||
|
}
|
||||||
|
if (!_startsWith(url, 'data:') && !_startsWith(url, 'http://') && !_startsWith(url, 'https://')) {
|
||||||
|
url = replacer(url);
|
||||||
|
}
|
||||||
|
return 'url(' + url + ')';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function _startsWith(haystack, needle) {
|
||||||
|
return haystack.length >= needle.length && haystack.substr(0, needle.length) === needle;
|
||||||
|
}
|
||||||
|
}
|
||||||
359
build/lib/standalone.ts
Normal file
359
build/lib/standalone.ts
Normal file
@@ -0,0 +1,359 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as ts from 'typescript';
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as tss from './treeshaking';
|
||||||
|
|
||||||
|
const REPO_ROOT = path.join(__dirname, '../../');
|
||||||
|
const SRC_DIR = path.join(REPO_ROOT, 'src');
|
||||||
|
|
||||||
|
let dirCache: { [dir: string]: boolean; } = {};
|
||||||
|
|
||||||
|
function writeFile(filePath: string, contents: Buffer | string): void {
|
||||||
|
function ensureDirs(dirPath: string): void {
|
||||||
|
if (dirCache[dirPath]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
dirCache[dirPath] = true;
|
||||||
|
|
||||||
|
ensureDirs(path.dirname(dirPath));
|
||||||
|
if (fs.existsSync(dirPath)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
fs.mkdirSync(dirPath);
|
||||||
|
}
|
||||||
|
ensureDirs(path.dirname(filePath));
|
||||||
|
fs.writeFileSync(filePath, contents);
|
||||||
|
}
|
||||||
|
|
||||||
|
export function extractEditor(options: tss.ITreeShakingOptions & { destRoot: string }): void {
|
||||||
|
const tsConfig = JSON.parse(fs.readFileSync(path.join(options.sourcesRoot, 'tsconfig.json')).toString());
|
||||||
|
let compilerOptions: { [key: string]: any };
|
||||||
|
if (tsConfig.extends) {
|
||||||
|
compilerOptions = Object.assign({}, require(path.join(options.sourcesRoot, tsConfig.extends)).compilerOptions, tsConfig.compilerOptions);
|
||||||
|
} else {
|
||||||
|
compilerOptions = tsConfig.compilerOptions;
|
||||||
|
}
|
||||||
|
tsConfig.compilerOptions = compilerOptions;
|
||||||
|
|
||||||
|
compilerOptions.noUnusedLocals = false;
|
||||||
|
compilerOptions.preserveConstEnums = false;
|
||||||
|
compilerOptions.declaration = false;
|
||||||
|
compilerOptions.moduleResolution = ts.ModuleResolutionKind.Classic;
|
||||||
|
|
||||||
|
delete compilerOptions.types;
|
||||||
|
delete tsConfig.extends;
|
||||||
|
tsConfig.exclude = [];
|
||||||
|
|
||||||
|
options.compilerOptions = compilerOptions;
|
||||||
|
|
||||||
|
let result = tss.shake(options);
|
||||||
|
for (let fileName in result) {
|
||||||
|
if (result.hasOwnProperty(fileName)) {
|
||||||
|
writeFile(path.join(options.destRoot, fileName), result[fileName]);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
let copied: { [fileName: string]: boolean; } = {};
|
||||||
|
const copyFile = (fileName: string) => {
|
||||||
|
if (copied[fileName]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
copied[fileName] = true;
|
||||||
|
const srcPath = path.join(options.sourcesRoot, fileName);
|
||||||
|
const dstPath = path.join(options.destRoot, fileName);
|
||||||
|
writeFile(dstPath, fs.readFileSync(srcPath));
|
||||||
|
};
|
||||||
|
const writeOutputFile = (fileName: string, contents: string | Buffer) => {
|
||||||
|
writeFile(path.join(options.destRoot, fileName), contents);
|
||||||
|
};
|
||||||
|
for (let fileName in result) {
|
||||||
|
if (result.hasOwnProperty(fileName)) {
|
||||||
|
const fileContents = result[fileName];
|
||||||
|
const info = ts.preProcessFile(fileContents);
|
||||||
|
|
||||||
|
for (let i = info.importedFiles.length - 1; i >= 0; i--) {
|
||||||
|
const importedFileName = info.importedFiles[i].fileName;
|
||||||
|
|
||||||
|
let importedFilePath: string;
|
||||||
|
if (/^vs\/css!/.test(importedFileName)) {
|
||||||
|
importedFilePath = importedFileName.substr('vs/css!'.length) + '.css';
|
||||||
|
} else {
|
||||||
|
importedFilePath = importedFileName;
|
||||||
|
}
|
||||||
|
if (/(^\.\/)|(^\.\.\/)/.test(importedFilePath)) {
|
||||||
|
importedFilePath = path.join(path.dirname(fileName), importedFilePath);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/\.css$/.test(importedFilePath)) {
|
||||||
|
transportCSS(importedFilePath, copyFile, writeOutputFile);
|
||||||
|
} else {
|
||||||
|
if (fs.existsSync(path.join(options.sourcesRoot, importedFilePath + '.js'))) {
|
||||||
|
copyFile(importedFilePath + '.js');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
delete tsConfig.compilerOptions.moduleResolution;
|
||||||
|
writeOutputFile('tsconfig.json', JSON.stringify(tsConfig, null, '\t'));
|
||||||
|
|
||||||
|
[
|
||||||
|
'vs/css.build.js',
|
||||||
|
'vs/css.d.ts',
|
||||||
|
'vs/css.js',
|
||||||
|
'vs/loader.js',
|
||||||
|
'vs/nls.build.js',
|
||||||
|
'vs/nls.d.ts',
|
||||||
|
'vs/nls.js',
|
||||||
|
'vs/nls.mock.ts',
|
||||||
|
].forEach(copyFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface IOptions2 {
|
||||||
|
srcFolder: string;
|
||||||
|
outFolder: string;
|
||||||
|
outResourcesFolder: string;
|
||||||
|
ignores: string[];
|
||||||
|
renames: { [filename: string]: string; };
|
||||||
|
}
|
||||||
|
|
||||||
|
export function createESMSourcesAndResources2(options: IOptions2): void {
|
||||||
|
const SRC_FOLDER = path.join(REPO_ROOT, options.srcFolder);
|
||||||
|
const OUT_FOLDER = path.join(REPO_ROOT, options.outFolder);
|
||||||
|
const OUT_RESOURCES_FOLDER = path.join(REPO_ROOT, options.outResourcesFolder);
|
||||||
|
|
||||||
|
const getDestAbsoluteFilePath = (file: string): string => {
|
||||||
|
let dest = options.renames[file.replace(/\\/g, '/')] || file;
|
||||||
|
if (dest === 'tsconfig.json') {
|
||||||
|
return path.join(OUT_FOLDER, `tsconfig.json`);
|
||||||
|
}
|
||||||
|
if (/\.ts$/.test(dest)) {
|
||||||
|
return path.join(OUT_FOLDER, dest);
|
||||||
|
}
|
||||||
|
return path.join(OUT_RESOURCES_FOLDER, dest);
|
||||||
|
};
|
||||||
|
|
||||||
|
const allFiles = walkDirRecursive(SRC_FOLDER);
|
||||||
|
for (let i = 0; i < allFiles.length; i++) {
|
||||||
|
const file = allFiles[i];
|
||||||
|
|
||||||
|
if (options.ignores.indexOf(file.replace(/\\/g, '/')) >= 0) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (file === 'tsconfig.json') {
|
||||||
|
const tsConfig = JSON.parse(fs.readFileSync(path.join(SRC_FOLDER, file)).toString());
|
||||||
|
tsConfig.compilerOptions.module = 'es6';
|
||||||
|
tsConfig.compilerOptions.outDir = path.join(path.relative(OUT_FOLDER, OUT_RESOURCES_FOLDER), 'vs').replace(/\\/g, '/');
|
||||||
|
write(getDestAbsoluteFilePath(file), JSON.stringify(tsConfig, null, '\t'));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/\.d\.ts$/.test(file) || /\.css$/.test(file) || /\.js$/.test(file)) {
|
||||||
|
// Transport the files directly
|
||||||
|
write(getDestAbsoluteFilePath(file), fs.readFileSync(path.join(SRC_FOLDER, file)));
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (/\.ts$/.test(file)) {
|
||||||
|
// Transform the .ts file
|
||||||
|
let fileContents = fs.readFileSync(path.join(SRC_FOLDER, file)).toString();
|
||||||
|
|
||||||
|
const info = ts.preProcessFile(fileContents);
|
||||||
|
|
||||||
|
for (let i = info.importedFiles.length - 1; i >= 0; i--) {
|
||||||
|
const importedFilename = info.importedFiles[i].fileName;
|
||||||
|
const pos = info.importedFiles[i].pos;
|
||||||
|
const end = info.importedFiles[i].end;
|
||||||
|
|
||||||
|
let importedFilepath: string;
|
||||||
|
if (/^vs\/css!/.test(importedFilename)) {
|
||||||
|
importedFilepath = importedFilename.substr('vs/css!'.length) + '.css';
|
||||||
|
} else {
|
||||||
|
importedFilepath = importedFilename;
|
||||||
|
}
|
||||||
|
if (/(^\.\/)|(^\.\.\/)/.test(importedFilepath)) {
|
||||||
|
importedFilepath = path.join(path.dirname(file), importedFilepath);
|
||||||
|
}
|
||||||
|
|
||||||
|
let relativePath: string;
|
||||||
|
if (importedFilepath === path.dirname(file).replace(/\\/g, '/')) {
|
||||||
|
relativePath = '../' + path.basename(path.dirname(file));
|
||||||
|
} else if (importedFilepath === path.dirname(path.dirname(file)).replace(/\\/g, '/')) {
|
||||||
|
relativePath = '../../' + path.basename(path.dirname(path.dirname(file)));
|
||||||
|
} else {
|
||||||
|
relativePath = path.relative(path.dirname(file), importedFilepath);
|
||||||
|
}
|
||||||
|
relativePath = relativePath.replace(/\\/g, '/');
|
||||||
|
if (!/(^\.\/)|(^\.\.\/)/.test(relativePath)) {
|
||||||
|
relativePath = './' + relativePath;
|
||||||
|
}
|
||||||
|
fileContents = (
|
||||||
|
fileContents.substring(0, pos + 1)
|
||||||
|
+ relativePath
|
||||||
|
+ fileContents.substring(end + 1)
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
|
fileContents = fileContents.replace(/import ([a-zA-z0-9]+) = require\(('[^']+')\);/g, function (_, m1, m2) {
|
||||||
|
return `import * as ${m1} from ${m2};`;
|
||||||
|
});
|
||||||
|
|
||||||
|
write(getDestAbsoluteFilePath(file), fileContents);
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
console.log(`UNKNOWN FILE: ${file}`);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
function walkDirRecursive(dir: string): string[] {
|
||||||
|
if (dir.charAt(dir.length - 1) !== '/' || dir.charAt(dir.length - 1) !== '\\') {
|
||||||
|
dir += '/';
|
||||||
|
}
|
||||||
|
let result: string[] = [];
|
||||||
|
_walkDirRecursive(dir, result, dir.length);
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
function _walkDirRecursive(dir: string, result: string[], trimPos: number): void {
|
||||||
|
const files = fs.readdirSync(dir);
|
||||||
|
for (let i = 0; i < files.length; i++) {
|
||||||
|
const file = path.join(dir, files[i]);
|
||||||
|
if (fs.statSync(file).isDirectory()) {
|
||||||
|
_walkDirRecursive(file, result, trimPos);
|
||||||
|
} else {
|
||||||
|
result.push(file.substr(trimPos));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function write(absoluteFilePath: string, contents: string | Buffer): void {
|
||||||
|
if (/(\.ts$)|(\.js$)/.test(absoluteFilePath)) {
|
||||||
|
contents = toggleComments(contents.toString());
|
||||||
|
}
|
||||||
|
writeFile(absoluteFilePath, contents);
|
||||||
|
|
||||||
|
function toggleComments(fileContents: string): string {
|
||||||
|
let lines = fileContents.split(/\r\n|\r|\n/);
|
||||||
|
let mode = 0;
|
||||||
|
for (let i = 0; i < lines.length; i++) {
|
||||||
|
const line = lines[i];
|
||||||
|
|
||||||
|
if (mode === 0) {
|
||||||
|
if (/\/\/ ESM-comment-begin/.test(line)) {
|
||||||
|
mode = 1;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/\/\/ ESM-uncomment-begin/.test(line)) {
|
||||||
|
mode = 2;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode === 1) {
|
||||||
|
if (/\/\/ ESM-comment-end/.test(line)) {
|
||||||
|
mode = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lines[i] = '// ' + line;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (mode === 2) {
|
||||||
|
if (/\/\/ ESM-uncomment-end/.test(line)) {
|
||||||
|
mode = 0;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
lines[i] = line.replace(/^(\s*)\/\/ ?/, function (_, indent) {
|
||||||
|
return indent;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return lines.join('\n');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function transportCSS(module: string, enqueue: (module: string) => void, write: (path: string, contents: string | Buffer) => void): boolean {
|
||||||
|
|
||||||
|
if (!/\.css/.test(module)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
const filename = path.join(SRC_DIR, module);
|
||||||
|
const fileContents = fs.readFileSync(filename).toString();
|
||||||
|
const inlineResources = 'base64'; // see https://github.com/Microsoft/monaco-editor/issues/148
|
||||||
|
const inlineResourcesLimit = 300000;//3000; // see https://github.com/Microsoft/monaco-editor/issues/336
|
||||||
|
|
||||||
|
const newContents = _rewriteOrInlineUrls(fileContents, inlineResources === 'base64', inlineResourcesLimit);
|
||||||
|
write(module, newContents);
|
||||||
|
return true;
|
||||||
|
|
||||||
|
function _rewriteOrInlineUrls(contents: string, forceBase64: boolean, inlineByteLimit: number): string {
|
||||||
|
return _replaceURL(contents, (url) => {
|
||||||
|
let imagePath = path.join(path.dirname(module), url);
|
||||||
|
let fileContents = fs.readFileSync(path.join(SRC_DIR, imagePath));
|
||||||
|
|
||||||
|
if (fileContents.length < inlineByteLimit) {
|
||||||
|
const MIME = /\.svg$/.test(url) ? 'image/svg+xml' : 'image/png';
|
||||||
|
let DATA = ';base64,' + fileContents.toString('base64');
|
||||||
|
|
||||||
|
if (!forceBase64 && /\.svg$/.test(url)) {
|
||||||
|
// .svg => url encode as explained at https://codepen.io/tigt/post/optimizing-svgs-in-data-uris
|
||||||
|
let newText = fileContents.toString()
|
||||||
|
.replace(/"/g, '\'')
|
||||||
|
.replace(/</g, '%3C')
|
||||||
|
.replace(/>/g, '%3E')
|
||||||
|
.replace(/&/g, '%26')
|
||||||
|
.replace(/#/g, '%23')
|
||||||
|
.replace(/\s+/g, ' ');
|
||||||
|
let encodedData = ',' + newText;
|
||||||
|
if (encodedData.length < DATA.length) {
|
||||||
|
DATA = encodedData;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return '"data:' + MIME + DATA + '"';
|
||||||
|
}
|
||||||
|
|
||||||
|
enqueue(imagePath);
|
||||||
|
return url;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function _replaceURL(contents: string, replacer: (url: string) => string): string {
|
||||||
|
// Use ")" as the terminator as quotes are oftentimes not used at all
|
||||||
|
return contents.replace(/url\(\s*([^\)]+)\s*\)?/g, (_: string, ...matches: string[]) => {
|
||||||
|
let url = matches[0];
|
||||||
|
// Eliminate starting quotes (the initial whitespace is not captured)
|
||||||
|
if (url.charAt(0) === '"' || url.charAt(0) === '\'') {
|
||||||
|
url = url.substring(1);
|
||||||
|
}
|
||||||
|
// The ending whitespace is captured
|
||||||
|
while (url.length > 0 && (url.charAt(url.length - 1) === ' ' || url.charAt(url.length - 1) === '\t')) {
|
||||||
|
url = url.substring(0, url.length - 1);
|
||||||
|
}
|
||||||
|
// Eliminate ending quotes
|
||||||
|
if (url.charAt(url.length - 1) === '"' || url.charAt(url.length - 1) === '\'') {
|
||||||
|
url = url.substring(0, url.length - 1);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!_startsWith(url, 'data:') && !_startsWith(url, 'http://') && !_startsWith(url, 'https://')) {
|
||||||
|
url = replacer(url);
|
||||||
|
}
|
||||||
|
|
||||||
|
return 'url(' + url + ')';
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function _startsWith(haystack: string, needle: string): boolean {
|
||||||
|
return haystack.length >= needle.length && haystack.substr(0, needle.length) === needle;
|
||||||
|
}
|
||||||
|
}
|
||||||
135
build/lib/stats.js
Normal file
135
build/lib/stats.js
Normal file
@@ -0,0 +1,135 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
'use strict';
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const es = require("event-stream");
|
||||||
|
const util = require("gulp-util");
|
||||||
|
const appInsights = require("applicationinsights");
|
||||||
|
class Entry {
|
||||||
|
constructor(name, totalCount, totalSize) {
|
||||||
|
this.name = name;
|
||||||
|
this.totalCount = totalCount;
|
||||||
|
this.totalSize = totalSize;
|
||||||
|
}
|
||||||
|
toString(pretty) {
|
||||||
|
if (!pretty) {
|
||||||
|
if (this.totalCount === 1) {
|
||||||
|
return `${this.name}: ${this.totalSize} bytes`;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return `${this.name}: ${this.totalCount} files with ${this.totalSize} bytes`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (this.totalCount === 1) {
|
||||||
|
return `Stats for '${util.colors.grey(this.name)}': ${Math.round(this.totalSize / 1204)}KB`;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const count = this.totalCount < 100
|
||||||
|
? util.colors.green(this.totalCount.toString())
|
||||||
|
: util.colors.red(this.totalCount.toString());
|
||||||
|
return `Stats for '${util.colors.grey(this.name)}': ${count} files, ${Math.round(this.totalSize / 1204)}KB`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const _entries = new Map();
|
||||||
|
function createStatsStream(group, log) {
|
||||||
|
const entry = new Entry(group, 0, 0);
|
||||||
|
_entries.set(entry.name, entry);
|
||||||
|
return es.through(function (data) {
|
||||||
|
const file = data;
|
||||||
|
if (typeof file.path === 'string') {
|
||||||
|
entry.totalCount += 1;
|
||||||
|
if (Buffer.isBuffer(file.contents)) {
|
||||||
|
entry.totalSize += file.contents.length;
|
||||||
|
}
|
||||||
|
else if (file.stat && typeof file.stat.size === 'number') {
|
||||||
|
entry.totalSize += file.stat.size;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// funky file...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.emit('data', data);
|
||||||
|
}, function () {
|
||||||
|
if (log) {
|
||||||
|
if (entry.totalCount === 1) {
|
||||||
|
util.log(`Stats for '${util.colors.grey(entry.name)}': ${Math.round(entry.totalSize / 1204)}KB`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const count = entry.totalCount < 100
|
||||||
|
? util.colors.green(entry.totalCount.toString())
|
||||||
|
: util.colors.red(entry.totalCount.toString());
|
||||||
|
util.log(`Stats for '${util.colors.grey(entry.name)}': ${count} files, ${Math.round(entry.totalSize / 1204)}KB`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.emit('end');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.createStatsStream = createStatsStream;
|
||||||
|
function submitAllStats(productJson, commit) {
|
||||||
|
const sorted = [];
|
||||||
|
// move entries for single files to the front
|
||||||
|
_entries.forEach(value => {
|
||||||
|
if (value.totalCount === 1) {
|
||||||
|
sorted.unshift(value);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
sorted.push(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
// print to console
|
||||||
|
for (const entry of sorted) {
|
||||||
|
console.log(entry.toString(true));
|
||||||
|
}
|
||||||
|
// send data as telementry event when the
|
||||||
|
// product is configured to send telemetry
|
||||||
|
if (!productJson || !productJson.aiConfig || typeof productJson.aiConfig.asimovKey !== 'string') {
|
||||||
|
return Promise.resolve(false);
|
||||||
|
}
|
||||||
|
return new Promise(resolve => {
|
||||||
|
try {
|
||||||
|
const sizes = {};
|
||||||
|
const counts = {};
|
||||||
|
for (const entry of sorted) {
|
||||||
|
sizes[entry.name] = entry.totalSize;
|
||||||
|
counts[entry.name] = entry.totalCount;
|
||||||
|
}
|
||||||
|
appInsights.setup(productJson.aiConfig.asimovKey)
|
||||||
|
.setAutoCollectConsole(false)
|
||||||
|
.setAutoCollectExceptions(false)
|
||||||
|
.setAutoCollectPerformance(false)
|
||||||
|
.setAutoCollectRequests(false)
|
||||||
|
.setAutoCollectDependencies(false)
|
||||||
|
.setAutoDependencyCorrelation(false)
|
||||||
|
.start();
|
||||||
|
appInsights.defaultClient.config.endpointUrl = 'https://vortex.data.microsoft.com/collect/v1';
|
||||||
|
/* __GDPR__
|
||||||
|
"monacoworkbench/packagemetrics" : {
|
||||||
|
"commit" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" },
|
||||||
|
"size" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" },
|
||||||
|
"count" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
appInsights.defaultClient.trackEvent({
|
||||||
|
name: 'monacoworkbench/packagemetrics',
|
||||||
|
properties: { commit, size: JSON.stringify(sizes), count: JSON.stringify(counts) }
|
||||||
|
});
|
||||||
|
appInsights.defaultClient.flush({
|
||||||
|
callback: () => {
|
||||||
|
appInsights.dispose();
|
||||||
|
resolve(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
catch (err) {
|
||||||
|
console.error('ERROR sending build stats as telemetry event!');
|
||||||
|
console.error(err);
|
||||||
|
resolve(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
exports.submitAllStats = submitAllStats;
|
||||||
147
build/lib/stats.ts
Normal file
147
build/lib/stats.ts
Normal file
@@ -0,0 +1,147 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as es from 'event-stream';
|
||||||
|
import * as util from 'gulp-util';
|
||||||
|
import * as File from 'vinyl';
|
||||||
|
import * as appInsights from 'applicationinsights';
|
||||||
|
|
||||||
|
class Entry {
|
||||||
|
constructor(readonly name: string, public totalCount: number, public totalSize: number) { }
|
||||||
|
|
||||||
|
toString(pretty?: boolean): string {
|
||||||
|
if (!pretty) {
|
||||||
|
if (this.totalCount === 1) {
|
||||||
|
return `${this.name}: ${this.totalSize} bytes`;
|
||||||
|
} else {
|
||||||
|
return `${this.name}: ${this.totalCount} files with ${this.totalSize} bytes`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (this.totalCount === 1) {
|
||||||
|
return `Stats for '${util.colors.grey(this.name)}': ${Math.round(this.totalSize / 1204)}KB`;
|
||||||
|
|
||||||
|
} else {
|
||||||
|
const count = this.totalCount < 100
|
||||||
|
? util.colors.green(this.totalCount.toString())
|
||||||
|
: util.colors.red(this.totalCount.toString());
|
||||||
|
|
||||||
|
return `Stats for '${util.colors.grey(this.name)}': ${count} files, ${Math.round(this.totalSize / 1204)}KB`;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const _entries = new Map<string, Entry>();
|
||||||
|
|
||||||
|
export function createStatsStream(group: string, log?: boolean): es.ThroughStream {
|
||||||
|
|
||||||
|
const entry = new Entry(group, 0, 0);
|
||||||
|
_entries.set(entry.name, entry);
|
||||||
|
|
||||||
|
return es.through(function (data) {
|
||||||
|
const file = data as File;
|
||||||
|
if (typeof file.path === 'string') {
|
||||||
|
entry.totalCount += 1;
|
||||||
|
if (Buffer.isBuffer(file.contents)) {
|
||||||
|
entry.totalSize += file.contents.length;
|
||||||
|
} else if (file.stat && typeof file.stat.size === 'number') {
|
||||||
|
entry.totalSize += file.stat.size;
|
||||||
|
} else {
|
||||||
|
// funky file...
|
||||||
|
}
|
||||||
|
}
|
||||||
|
this.emit('data', data);
|
||||||
|
}, function () {
|
||||||
|
if (log) {
|
||||||
|
if (entry.totalCount === 1) {
|
||||||
|
util.log(`Stats for '${util.colors.grey(entry.name)}': ${Math.round(entry.totalSize / 1204)}KB`);
|
||||||
|
|
||||||
|
} else {
|
||||||
|
const count = entry.totalCount < 100
|
||||||
|
? util.colors.green(entry.totalCount.toString())
|
||||||
|
: util.colors.red(entry.totalCount.toString());
|
||||||
|
|
||||||
|
util.log(`Stats for '${util.colors.grey(entry.name)}': ${count} files, ${Math.round(entry.totalSize / 1204)}KB`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
this.emit('end');
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function submitAllStats(productJson: any, commit: string): Promise<boolean> {
|
||||||
|
|
||||||
|
const sorted: Entry[] = [];
|
||||||
|
// move entries for single files to the front
|
||||||
|
_entries.forEach(value => {
|
||||||
|
if (value.totalCount === 1) {
|
||||||
|
sorted.unshift(value);
|
||||||
|
} else {
|
||||||
|
sorted.push(value);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
// print to console
|
||||||
|
for (const entry of sorted) {
|
||||||
|
console.log(entry.toString(true));
|
||||||
|
}
|
||||||
|
|
||||||
|
// send data as telementry event when the
|
||||||
|
// product is configured to send telemetry
|
||||||
|
if (!productJson || !productJson.aiConfig || typeof productJson.aiConfig.asimovKey !== 'string') {
|
||||||
|
return Promise.resolve(false);
|
||||||
|
}
|
||||||
|
|
||||||
|
return new Promise(resolve => {
|
||||||
|
try {
|
||||||
|
|
||||||
|
const sizes: any = {};
|
||||||
|
const counts: any = {};
|
||||||
|
for (const entry of sorted) {
|
||||||
|
sizes[entry.name] = entry.totalSize;
|
||||||
|
counts[entry.name] = entry.totalCount;
|
||||||
|
}
|
||||||
|
|
||||||
|
appInsights.setup(productJson.aiConfig.asimovKey)
|
||||||
|
.setAutoCollectConsole(false)
|
||||||
|
.setAutoCollectExceptions(false)
|
||||||
|
.setAutoCollectPerformance(false)
|
||||||
|
.setAutoCollectRequests(false)
|
||||||
|
.setAutoCollectDependencies(false)
|
||||||
|
.setAutoDependencyCorrelation(false)
|
||||||
|
.start();
|
||||||
|
|
||||||
|
appInsights.defaultClient.config.endpointUrl = 'https://vortex.data.microsoft.com/collect/v1';
|
||||||
|
|
||||||
|
/* __GDPR__
|
||||||
|
"monacoworkbench/packagemetrics" : {
|
||||||
|
"commit" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" },
|
||||||
|
"size" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" },
|
||||||
|
"count" : {"classification": "SystemMetaData", "purpose": "PerformanceAndHealth" }
|
||||||
|
}
|
||||||
|
*/
|
||||||
|
appInsights.defaultClient.trackEvent({
|
||||||
|
name: 'monacoworkbench/packagemetrics',
|
||||||
|
properties: { commit, size: JSON.stringify(sizes), count: JSON.stringify(counts) }
|
||||||
|
});
|
||||||
|
|
||||||
|
|
||||||
|
appInsights.defaultClient.flush({
|
||||||
|
callback: () => {
|
||||||
|
appInsights.dispose();
|
||||||
|
resolve(true);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
} catch (err) {
|
||||||
|
console.error('ERROR sending build stats as telemetry event!');
|
||||||
|
console.error(err);
|
||||||
|
resolve(false);
|
||||||
|
}
|
||||||
|
});
|
||||||
|
|
||||||
|
}
|
||||||
@@ -4,30 +4,30 @@
|
|||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var assert = require("assert");
|
const assert = require("assert");
|
||||||
var i18n = require("../i18n");
|
const i18n = require("../i18n");
|
||||||
suite('XLF Parser Tests', function () {
|
suite('XLF Parser Tests', () => {
|
||||||
var sampleXlf = '<?xml version="1.0" encoding="utf-8"?><xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"><file original="vs/base/common/keybinding" source-language="en" datatype="plaintext"><body><trans-unit id="key1"><source xml:lang="en">Key #1</source></trans-unit><trans-unit id="key2"><source xml:lang="en">Key #2 &</source></trans-unit></body></file></xliff>';
|
const sampleXlf = '<?xml version="1.0" encoding="utf-8"?><xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"><file original="vs/base/common/keybinding" source-language="en" datatype="plaintext"><body><trans-unit id="key1"><source xml:lang="en">Key #1</source></trans-unit><trans-unit id="key2"><source xml:lang="en">Key #2 &</source></trans-unit></body></file></xliff>';
|
||||||
var sampleTranslatedXlf = '<?xml version="1.0" encoding="utf-8"?><xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"><file original="vs/base/common/keybinding" source-language="en" target-language="ru" datatype="plaintext"><body><trans-unit id="key1"><source xml:lang="en">Key #1</source><target>Кнопка #1</target></trans-unit><trans-unit id="key2"><source xml:lang="en">Key #2 &</source><target>Кнопка #2 &</target></trans-unit></body></file></xliff>';
|
const sampleTranslatedXlf = '<?xml version="1.0" encoding="utf-8"?><xliff version="1.2" xmlns="urn:oasis:names:tc:xliff:document:1.2"><file original="vs/base/common/keybinding" source-language="en" target-language="ru" datatype="plaintext"><body><trans-unit id="key1"><source xml:lang="en">Key #1</source><target>Кнопка #1</target></trans-unit><trans-unit id="key2"><source xml:lang="en">Key #2 &</source><target>Кнопка #2 &</target></trans-unit></body></file></xliff>';
|
||||||
var originalFilePath = 'vs/base/common/keybinding';
|
const originalFilePath = 'vs/base/common/keybinding';
|
||||||
var keys = ['key1', 'key2'];
|
const keys = ['key1', 'key2'];
|
||||||
var messages = ['Key #1', 'Key #2 &'];
|
const messages = ['Key #1', 'Key #2 &'];
|
||||||
var translatedMessages = { key1: 'Кнопка #1', key2: 'Кнопка #2 &' };
|
const translatedMessages = { key1: 'Кнопка #1', key2: 'Кнопка #2 &' };
|
||||||
test('Keys & messages to XLF conversion', function () {
|
test('Keys & messages to XLF conversion', () => {
|
||||||
var xlf = new i18n.XLF('vscode-workbench');
|
const xlf = new i18n.XLF('vscode-workbench');
|
||||||
xlf.addFile(originalFilePath, keys, messages);
|
xlf.addFile(originalFilePath, keys, messages);
|
||||||
var xlfString = xlf.toString();
|
const xlfString = xlf.toString();
|
||||||
assert.strictEqual(xlfString.replace(/\s{2,}/g, ''), sampleXlf);
|
assert.strictEqual(xlfString.replace(/\s{2,}/g, ''), sampleXlf);
|
||||||
});
|
});
|
||||||
test('XLF to keys & messages conversion', function () {
|
test('XLF to keys & messages conversion', () => {
|
||||||
i18n.XLF.parse(sampleTranslatedXlf).then(function (resolvedFiles) {
|
i18n.XLF.parse(sampleTranslatedXlf).then(function (resolvedFiles) {
|
||||||
assert.deepEqual(resolvedFiles[0].messages, translatedMessages);
|
assert.deepEqual(resolvedFiles[0].messages, translatedMessages);
|
||||||
assert.strictEqual(resolvedFiles[0].originalFilePath, originalFilePath);
|
assert.strictEqual(resolvedFiles[0].originalFilePath, originalFilePath);
|
||||||
});
|
});
|
||||||
});
|
});
|
||||||
test('JSON file source path to Transifex resource match', function () {
|
test('JSON file source path to Transifex resource match', () => {
|
||||||
var editorProject = 'vscode-editor', workbenchProject = 'vscode-workbench';
|
const editorProject = 'vscode-editor', workbenchProject = 'vscode-workbench';
|
||||||
var platform = { name: 'vs/platform', project: editorProject }, editorContrib = { name: 'vs/editor/contrib', project: editorProject }, editor = { name: 'vs/editor', project: editorProject }, base = { name: 'vs/base', project: editorProject }, code = { name: 'vs/code', project: workbenchProject }, workbenchParts = { name: 'vs/workbench/parts/html', project: workbenchProject }, workbenchServices = { name: 'vs/workbench/services/files', project: workbenchProject }, workbench = { name: 'vs/workbench', project: workbenchProject };
|
const platform = { name: 'vs/platform', project: editorProject }, editorContrib = { name: 'vs/editor/contrib', project: editorProject }, editor = { name: 'vs/editor', project: editorProject }, base = { name: 'vs/base', project: editorProject }, code = { name: 'vs/code', project: workbenchProject }, workbenchParts = { name: 'vs/workbench/parts/html', project: workbenchProject }, workbenchServices = { name: 'vs/workbench/services/files', project: workbenchProject }, workbench = { name: 'vs/workbench', project: workbenchProject };
|
||||||
assert.deepEqual(i18n.getResource('vs/platform/actions/browser/menusExtensionPoint'), platform);
|
assert.deepEqual(i18n.getResource('vs/platform/actions/browser/menusExtensionPoint'), platform);
|
||||||
assert.deepEqual(i18n.getResource('vs/editor/contrib/clipboard/browser/clipboard'), editorContrib);
|
assert.deepEqual(i18n.getResource('vs/editor/contrib/clipboard/browser/clipboard'), editorContrib);
|
||||||
assert.deepEqual(i18n.getResource('vs/editor/common/modes/modesRegistry'), editor);
|
assert.deepEqual(i18n.getResource('vs/editor/common/modes/modesRegistry'), editor);
|
||||||
|
|||||||
@@ -15,7 +15,7 @@ suite('XLF Parser Tests', () => {
|
|||||||
const translatedMessages = { key1: 'Кнопка #1', key2: 'Кнопка #2 &' };
|
const translatedMessages = { key1: 'Кнопка #1', key2: 'Кнопка #2 &' };
|
||||||
|
|
||||||
test('Keys & messages to XLF conversion', () => {
|
test('Keys & messages to XLF conversion', () => {
|
||||||
let xlf = new i18n.XLF('vscode-workbench');
|
const xlf = new i18n.XLF('vscode-workbench');
|
||||||
xlf.addFile(originalFilePath, keys, messages);
|
xlf.addFile(originalFilePath, keys, messages);
|
||||||
const xlfString = xlf.toString();
|
const xlfString = xlf.toString();
|
||||||
|
|
||||||
|
|||||||
678
build/lib/treeshaking.js
Normal file
678
build/lib/treeshaking.js
Normal file
@@ -0,0 +1,678 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
'use strict';
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const fs = require("fs");
|
||||||
|
const path = require("path");
|
||||||
|
const ts = require("typescript");
|
||||||
|
const TYPESCRIPT_LIB_FOLDER = path.dirname(require.resolve('typescript/lib/lib.d.ts'));
|
||||||
|
var ShakeLevel;
|
||||||
|
(function (ShakeLevel) {
|
||||||
|
ShakeLevel[ShakeLevel["Files"] = 0] = "Files";
|
||||||
|
ShakeLevel[ShakeLevel["InnerFile"] = 1] = "InnerFile";
|
||||||
|
ShakeLevel[ShakeLevel["ClassMembers"] = 2] = "ClassMembers";
|
||||||
|
})(ShakeLevel = exports.ShakeLevel || (exports.ShakeLevel = {}));
|
||||||
|
function printDiagnostics(diagnostics) {
|
||||||
|
for (let i = 0; i < diagnostics.length; i++) {
|
||||||
|
const diag = diagnostics[i];
|
||||||
|
let result = '';
|
||||||
|
if (diag.file) {
|
||||||
|
result += `${diag.file.fileName}: `;
|
||||||
|
}
|
||||||
|
if (diag.file && diag.start) {
|
||||||
|
let location = diag.file.getLineAndCharacterOfPosition(diag.start);
|
||||||
|
result += `- ${location.line + 1},${location.character} - `;
|
||||||
|
}
|
||||||
|
result += JSON.stringify(diag.messageText);
|
||||||
|
console.log(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function shake(options) {
|
||||||
|
const languageService = createTypeScriptLanguageService(options);
|
||||||
|
const program = languageService.getProgram();
|
||||||
|
const globalDiagnostics = program.getGlobalDiagnostics();
|
||||||
|
if (globalDiagnostics.length > 0) {
|
||||||
|
printDiagnostics(globalDiagnostics);
|
||||||
|
throw new Error(`Compilation Errors encountered.`);
|
||||||
|
}
|
||||||
|
const syntacticDiagnostics = program.getSyntacticDiagnostics();
|
||||||
|
if (syntacticDiagnostics.length > 0) {
|
||||||
|
printDiagnostics(syntacticDiagnostics);
|
||||||
|
throw new Error(`Compilation Errors encountered.`);
|
||||||
|
}
|
||||||
|
const semanticDiagnostics = program.getSemanticDiagnostics();
|
||||||
|
if (semanticDiagnostics.length > 0) {
|
||||||
|
printDiagnostics(semanticDiagnostics);
|
||||||
|
throw new Error(`Compilation Errors encountered.`);
|
||||||
|
}
|
||||||
|
markNodes(languageService, options);
|
||||||
|
return generateResult(languageService, options.shakeLevel);
|
||||||
|
}
|
||||||
|
exports.shake = shake;
|
||||||
|
//#region Discovery, LanguageService & Setup
|
||||||
|
function createTypeScriptLanguageService(options) {
|
||||||
|
// Discover referenced files
|
||||||
|
const FILES = discoverAndReadFiles(options);
|
||||||
|
// Add fake usage files
|
||||||
|
options.inlineEntryPoints.forEach((inlineEntryPoint, index) => {
|
||||||
|
FILES[`inlineEntryPoint.${index}.ts`] = inlineEntryPoint;
|
||||||
|
});
|
||||||
|
// Add additional typings
|
||||||
|
options.typings.forEach((typing) => {
|
||||||
|
const filePath = path.join(options.sourcesRoot, typing);
|
||||||
|
FILES[typing] = fs.readFileSync(filePath).toString();
|
||||||
|
});
|
||||||
|
// Resolve libs
|
||||||
|
const RESOLVED_LIBS = {};
|
||||||
|
options.libs.forEach((filename) => {
|
||||||
|
const filepath = path.join(TYPESCRIPT_LIB_FOLDER, filename);
|
||||||
|
RESOLVED_LIBS[`defaultLib:${filename}`] = fs.readFileSync(filepath).toString();
|
||||||
|
});
|
||||||
|
const compilerOptions = ts.convertCompilerOptionsFromJson(options.compilerOptions, options.sourcesRoot).options;
|
||||||
|
const host = new TypeScriptLanguageServiceHost(RESOLVED_LIBS, FILES, compilerOptions);
|
||||||
|
return ts.createLanguageService(host);
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* Read imports and follow them until all files have been handled
|
||||||
|
*/
|
||||||
|
function discoverAndReadFiles(options) {
|
||||||
|
const FILES = {};
|
||||||
|
const in_queue = Object.create(null);
|
||||||
|
const queue = [];
|
||||||
|
const enqueue = (moduleId) => {
|
||||||
|
if (in_queue[moduleId]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
in_queue[moduleId] = true;
|
||||||
|
queue.push(moduleId);
|
||||||
|
};
|
||||||
|
options.entryPoints.forEach((entryPoint) => enqueue(entryPoint));
|
||||||
|
while (queue.length > 0) {
|
||||||
|
const moduleId = queue.shift();
|
||||||
|
const dts_filename = path.join(options.sourcesRoot, moduleId + '.d.ts');
|
||||||
|
if (fs.existsSync(dts_filename)) {
|
||||||
|
const dts_filecontents = fs.readFileSync(dts_filename).toString();
|
||||||
|
FILES[`${moduleId}.d.ts`] = dts_filecontents;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let ts_filename;
|
||||||
|
if (options.redirects[moduleId]) {
|
||||||
|
ts_filename = path.join(options.sourcesRoot, options.redirects[moduleId] + '.ts');
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
ts_filename = path.join(options.sourcesRoot, moduleId + '.ts');
|
||||||
|
}
|
||||||
|
const ts_filecontents = fs.readFileSync(ts_filename).toString();
|
||||||
|
const info = ts.preProcessFile(ts_filecontents);
|
||||||
|
for (let i = info.importedFiles.length - 1; i >= 0; i--) {
|
||||||
|
const importedFileName = info.importedFiles[i].fileName;
|
||||||
|
if (options.importIgnorePattern.test(importedFileName)) {
|
||||||
|
// Ignore vs/css! imports
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let importedModuleId = importedFileName;
|
||||||
|
if (/(^\.\/)|(^\.\.\/)/.test(importedModuleId)) {
|
||||||
|
importedModuleId = path.join(path.dirname(moduleId), importedModuleId);
|
||||||
|
}
|
||||||
|
enqueue(importedModuleId);
|
||||||
|
}
|
||||||
|
FILES[`${moduleId}.ts`] = ts_filecontents;
|
||||||
|
}
|
||||||
|
return FILES;
|
||||||
|
}
|
||||||
|
/**
|
||||||
|
* A TypeScript language service host
|
||||||
|
*/
|
||||||
|
class TypeScriptLanguageServiceHost {
|
||||||
|
constructor(libs, files, compilerOptions) {
|
||||||
|
this._libs = libs;
|
||||||
|
this._files = files;
|
||||||
|
this._compilerOptions = compilerOptions;
|
||||||
|
}
|
||||||
|
// --- language service host ---------------
|
||||||
|
getCompilationSettings() {
|
||||||
|
return this._compilerOptions;
|
||||||
|
}
|
||||||
|
getScriptFileNames() {
|
||||||
|
return ([]
|
||||||
|
.concat(Object.keys(this._libs))
|
||||||
|
.concat(Object.keys(this._files)));
|
||||||
|
}
|
||||||
|
getScriptVersion(_fileName) {
|
||||||
|
return '1';
|
||||||
|
}
|
||||||
|
getProjectVersion() {
|
||||||
|
return '1';
|
||||||
|
}
|
||||||
|
getScriptSnapshot(fileName) {
|
||||||
|
if (this._files.hasOwnProperty(fileName)) {
|
||||||
|
return ts.ScriptSnapshot.fromString(this._files[fileName]);
|
||||||
|
}
|
||||||
|
else if (this._libs.hasOwnProperty(fileName)) {
|
||||||
|
return ts.ScriptSnapshot.fromString(this._libs[fileName]);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
return ts.ScriptSnapshot.fromString('');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getScriptKind(_fileName) {
|
||||||
|
return ts.ScriptKind.TS;
|
||||||
|
}
|
||||||
|
getCurrentDirectory() {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
getDefaultLibFileName(_options) {
|
||||||
|
return 'defaultLib:lib.d.ts';
|
||||||
|
}
|
||||||
|
isDefaultLibFileName(fileName) {
|
||||||
|
return fileName === this.getDefaultLibFileName(this._compilerOptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
//#region Tree Shaking
|
||||||
|
var NodeColor;
|
||||||
|
(function (NodeColor) {
|
||||||
|
NodeColor[NodeColor["White"] = 0] = "White";
|
||||||
|
NodeColor[NodeColor["Gray"] = 1] = "Gray";
|
||||||
|
NodeColor[NodeColor["Black"] = 2] = "Black";
|
||||||
|
})(NodeColor || (NodeColor = {}));
|
||||||
|
function getColor(node) {
|
||||||
|
return node.$$$color || 0 /* White */;
|
||||||
|
}
|
||||||
|
function setColor(node, color) {
|
||||||
|
node.$$$color = color;
|
||||||
|
}
|
||||||
|
function nodeOrParentIsBlack(node) {
|
||||||
|
while (node) {
|
||||||
|
const color = getColor(node);
|
||||||
|
if (color === 2 /* Black */) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
node = node.parent;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
function nodeOrChildIsBlack(node) {
|
||||||
|
if (getColor(node) === 2 /* Black */) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (const child of node.getChildren()) {
|
||||||
|
if (nodeOrChildIsBlack(child)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
function markNodes(languageService, options) {
|
||||||
|
const program = languageService.getProgram();
|
||||||
|
if (!program) {
|
||||||
|
throw new Error('Could not get program from language service');
|
||||||
|
}
|
||||||
|
if (options.shakeLevel === 0 /* Files */) {
|
||||||
|
// Mark all source files Black
|
||||||
|
program.getSourceFiles().forEach((sourceFile) => {
|
||||||
|
setColor(sourceFile, 2 /* Black */);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const black_queue = [];
|
||||||
|
const gray_queue = [];
|
||||||
|
const sourceFilesLoaded = {};
|
||||||
|
function enqueueTopLevelModuleStatements(sourceFile) {
|
||||||
|
sourceFile.forEachChild((node) => {
|
||||||
|
if (ts.isImportDeclaration(node)) {
|
||||||
|
if (!node.importClause && ts.isStringLiteral(node.moduleSpecifier)) {
|
||||||
|
setColor(node, 2 /* Black */);
|
||||||
|
enqueueImport(node, node.moduleSpecifier.text);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ts.isExportDeclaration(node)) {
|
||||||
|
if (node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier)) {
|
||||||
|
setColor(node, 2 /* Black */);
|
||||||
|
enqueueImport(node, node.moduleSpecifier.text);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (ts.isExpressionStatement(node)
|
||||||
|
|| ts.isIfStatement(node)
|
||||||
|
|| ts.isIterationStatement(node, true)
|
||||||
|
|| ts.isExportAssignment(node)) {
|
||||||
|
enqueue_black(node);
|
||||||
|
}
|
||||||
|
if (ts.isImportEqualsDeclaration(node)) {
|
||||||
|
if (/export/.test(node.getFullText(sourceFile))) {
|
||||||
|
// e.g. "export import Severity = BaseSeverity;"
|
||||||
|
enqueue_black(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
});
|
||||||
|
}
|
||||||
|
function enqueue_gray(node) {
|
||||||
|
if (nodeOrParentIsBlack(node) || getColor(node) === 1 /* Gray */) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setColor(node, 1 /* Gray */);
|
||||||
|
gray_queue.push(node);
|
||||||
|
}
|
||||||
|
function enqueue_black(node) {
|
||||||
|
const previousColor = getColor(node);
|
||||||
|
if (previousColor === 2 /* Black */) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (previousColor === 1 /* Gray */) {
|
||||||
|
// remove from gray queue
|
||||||
|
gray_queue.splice(gray_queue.indexOf(node), 1);
|
||||||
|
setColor(node, 0 /* White */);
|
||||||
|
// add to black queue
|
||||||
|
enqueue_black(node);
|
||||||
|
// // move from one queue to the other
|
||||||
|
// black_queue.push(node);
|
||||||
|
// setColor(node, NodeColor.Black);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
if (nodeOrParentIsBlack(node)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const fileName = node.getSourceFile().fileName;
|
||||||
|
if (/^defaultLib:/.test(fileName) || /\.d\.ts$/.test(fileName)) {
|
||||||
|
setColor(node, 2 /* Black */);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const sourceFile = node.getSourceFile();
|
||||||
|
if (!sourceFilesLoaded[sourceFile.fileName]) {
|
||||||
|
sourceFilesLoaded[sourceFile.fileName] = true;
|
||||||
|
enqueueTopLevelModuleStatements(sourceFile);
|
||||||
|
}
|
||||||
|
if (ts.isSourceFile(node)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setColor(node, 2 /* Black */);
|
||||||
|
black_queue.push(node);
|
||||||
|
if (options.shakeLevel === 2 /* ClassMembers */ && (ts.isMethodDeclaration(node) || ts.isMethodSignature(node) || ts.isPropertySignature(node) || ts.isGetAccessor(node) || ts.isSetAccessor(node))) {
|
||||||
|
const references = languageService.getReferencesAtPosition(node.getSourceFile().fileName, node.name.pos + node.name.getLeadingTriviaWidth());
|
||||||
|
if (references) {
|
||||||
|
for (let i = 0, len = references.length; i < len; i++) {
|
||||||
|
const reference = references[i];
|
||||||
|
const referenceSourceFile = program.getSourceFile(reference.fileName);
|
||||||
|
if (!referenceSourceFile) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
const referenceNode = getTokenAtPosition(referenceSourceFile, reference.textSpan.start, false, false);
|
||||||
|
if (ts.isMethodDeclaration(referenceNode.parent)
|
||||||
|
|| ts.isPropertyDeclaration(referenceNode.parent)
|
||||||
|
|| ts.isGetAccessor(referenceNode.parent)
|
||||||
|
|| ts.isSetAccessor(referenceNode.parent)) {
|
||||||
|
enqueue_gray(referenceNode.parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function enqueueFile(filename) {
|
||||||
|
const sourceFile = program.getSourceFile(filename);
|
||||||
|
if (!sourceFile) {
|
||||||
|
console.warn(`Cannot find source file ${filename}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
enqueue_black(sourceFile);
|
||||||
|
}
|
||||||
|
function enqueueImport(node, importText) {
|
||||||
|
if (options.importIgnorePattern.test(importText)) {
|
||||||
|
// this import should be ignored
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const nodeSourceFile = node.getSourceFile();
|
||||||
|
let fullPath;
|
||||||
|
if (/(^\.\/)|(^\.\.\/)/.test(importText)) {
|
||||||
|
fullPath = path.join(path.dirname(nodeSourceFile.fileName), importText) + '.ts';
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fullPath = importText + '.ts';
|
||||||
|
}
|
||||||
|
enqueueFile(fullPath);
|
||||||
|
}
|
||||||
|
options.entryPoints.forEach(moduleId => enqueueFile(moduleId + '.ts'));
|
||||||
|
// Add fake usage files
|
||||||
|
options.inlineEntryPoints.forEach((_, index) => enqueueFile(`inlineEntryPoint.${index}.ts`));
|
||||||
|
let step = 0;
|
||||||
|
const checker = program.getTypeChecker();
|
||||||
|
while (black_queue.length > 0 || gray_queue.length > 0) {
|
||||||
|
++step;
|
||||||
|
let node;
|
||||||
|
if (step % 100 === 0) {
|
||||||
|
console.log(`${step}/${step + black_queue.length + gray_queue.length} (${black_queue.length}, ${gray_queue.length})`);
|
||||||
|
}
|
||||||
|
if (black_queue.length === 0) {
|
||||||
|
for (let i = 0; i < gray_queue.length; i++) {
|
||||||
|
const node = gray_queue[i];
|
||||||
|
const nodeParent = node.parent;
|
||||||
|
if ((ts.isClassDeclaration(nodeParent) || ts.isInterfaceDeclaration(nodeParent)) && nodeOrChildIsBlack(nodeParent)) {
|
||||||
|
gray_queue.splice(i, 1);
|
||||||
|
black_queue.push(node);
|
||||||
|
setColor(node, 2 /* Black */);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (black_queue.length > 0) {
|
||||||
|
node = black_queue.shift();
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
// only gray nodes remaining...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const nodeSourceFile = node.getSourceFile();
|
||||||
|
const loop = (node) => {
|
||||||
|
const [symbol, symbolImportNode] = getRealNodeSymbol(checker, node);
|
||||||
|
if (symbolImportNode) {
|
||||||
|
setColor(symbolImportNode, 2 /* Black */);
|
||||||
|
}
|
||||||
|
if (symbol && !nodeIsInItsOwnDeclaration(nodeSourceFile, node, symbol)) {
|
||||||
|
for (let i = 0, len = symbol.declarations.length; i < len; i++) {
|
||||||
|
const declaration = symbol.declarations[i];
|
||||||
|
if (ts.isSourceFile(declaration)) {
|
||||||
|
// Do not enqueue full source files
|
||||||
|
// (they can be the declaration of a module import)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (options.shakeLevel === 2 /* ClassMembers */ && (ts.isClassDeclaration(declaration) || ts.isInterfaceDeclaration(declaration))) {
|
||||||
|
enqueue_black(declaration.name);
|
||||||
|
for (let j = 0; j < declaration.members.length; j++) {
|
||||||
|
const member = declaration.members[j];
|
||||||
|
const memberName = member.name ? member.name.getText() : null;
|
||||||
|
if (ts.isConstructorDeclaration(member)
|
||||||
|
|| ts.isConstructSignatureDeclaration(member)
|
||||||
|
|| ts.isIndexSignatureDeclaration(member)
|
||||||
|
|| ts.isCallSignatureDeclaration(member)
|
||||||
|
|| memberName === 'toJSON'
|
||||||
|
|| memberName === 'toString'
|
||||||
|
|| memberName === 'dispose' // TODO: keeping all `dispose` methods
|
||||||
|
) {
|
||||||
|
enqueue_black(member);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// queue the heritage clauses
|
||||||
|
if (declaration.heritageClauses) {
|
||||||
|
for (let heritageClause of declaration.heritageClauses) {
|
||||||
|
enqueue_black(heritageClause);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
enqueue_black(declaration);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
node.forEachChild(loop);
|
||||||
|
};
|
||||||
|
node.forEachChild(loop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
function nodeIsInItsOwnDeclaration(nodeSourceFile, node, symbol) {
|
||||||
|
for (let i = 0, len = symbol.declarations.length; i < len; i++) {
|
||||||
|
const declaration = symbol.declarations[i];
|
||||||
|
const declarationSourceFile = declaration.getSourceFile();
|
||||||
|
if (nodeSourceFile === declarationSourceFile) {
|
||||||
|
if (declaration.pos <= node.pos && node.end <= declaration.end) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
function generateResult(languageService, shakeLevel) {
|
||||||
|
const program = languageService.getProgram();
|
||||||
|
if (!program) {
|
||||||
|
throw new Error('Could not get program from language service');
|
||||||
|
}
|
||||||
|
let result = {};
|
||||||
|
const writeFile = (filePath, contents) => {
|
||||||
|
result[filePath] = contents;
|
||||||
|
};
|
||||||
|
program.getSourceFiles().forEach((sourceFile) => {
|
||||||
|
const fileName = sourceFile.fileName;
|
||||||
|
if (/^defaultLib:/.test(fileName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const destination = fileName;
|
||||||
|
if (/\.d\.ts$/.test(fileName)) {
|
||||||
|
if (nodeOrChildIsBlack(sourceFile)) {
|
||||||
|
writeFile(destination, sourceFile.text);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
let text = sourceFile.text;
|
||||||
|
let result = '';
|
||||||
|
function keep(node) {
|
||||||
|
result += text.substring(node.pos, node.end);
|
||||||
|
}
|
||||||
|
function write(data) {
|
||||||
|
result += data;
|
||||||
|
}
|
||||||
|
function writeMarkedNodes(node) {
|
||||||
|
if (getColor(node) === 2 /* Black */) {
|
||||||
|
return keep(node);
|
||||||
|
}
|
||||||
|
// Always keep certain top-level statements
|
||||||
|
if (ts.isSourceFile(node.parent)) {
|
||||||
|
if (ts.isExpressionStatement(node) && ts.isStringLiteral(node.expression) && node.expression.text === 'use strict') {
|
||||||
|
return keep(node);
|
||||||
|
}
|
||||||
|
if (ts.isVariableStatement(node) && nodeOrChildIsBlack(node)) {
|
||||||
|
return keep(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// Keep the entire import in import * as X cases
|
||||||
|
if (ts.isImportDeclaration(node)) {
|
||||||
|
if (node.importClause && node.importClause.namedBindings) {
|
||||||
|
if (ts.isNamespaceImport(node.importClause.namedBindings)) {
|
||||||
|
if (getColor(node.importClause.namedBindings) === 2 /* Black */) {
|
||||||
|
return keep(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let survivingImports = [];
|
||||||
|
for (let i = 0; i < node.importClause.namedBindings.elements.length; i++) {
|
||||||
|
const importNode = node.importClause.namedBindings.elements[i];
|
||||||
|
if (getColor(importNode) === 2 /* Black */) {
|
||||||
|
survivingImports.push(importNode.getFullText(sourceFile));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const leadingTriviaWidth = node.getLeadingTriviaWidth();
|
||||||
|
const leadingTrivia = sourceFile.text.substr(node.pos, leadingTriviaWidth);
|
||||||
|
if (survivingImports.length > 0) {
|
||||||
|
if (node.importClause && node.importClause.name && getColor(node.importClause) === 2 /* Black */) {
|
||||||
|
return write(`${leadingTrivia}import ${node.importClause.name.text}, {${survivingImports.join(',')} } from${node.moduleSpecifier.getFullText(sourceFile)};`);
|
||||||
|
}
|
||||||
|
return write(`${leadingTrivia}import {${survivingImports.join(',')} } from${node.moduleSpecifier.getFullText(sourceFile)};`);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (node.importClause && node.importClause.name && getColor(node.importClause) === 2 /* Black */) {
|
||||||
|
return write(`${leadingTrivia}import ${node.importClause.name.text} from${node.moduleSpecifier.getFullText(sourceFile)};`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
if (node.importClause && getColor(node.importClause) === 2 /* Black */) {
|
||||||
|
return keep(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (shakeLevel === 2 /* ClassMembers */ && (ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node)) && nodeOrChildIsBlack(node)) {
|
||||||
|
let toWrite = node.getFullText();
|
||||||
|
for (let i = node.members.length - 1; i >= 0; i--) {
|
||||||
|
const member = node.members[i];
|
||||||
|
if (getColor(member) === 2 /* Black */ || !member.name) {
|
||||||
|
// keep method
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/^_(.*)Brand$/.test(member.name.getText())) {
|
||||||
|
// TODO: keep all members ending with `Brand`...
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
let pos = member.pos - node.pos;
|
||||||
|
let end = member.end - node.pos;
|
||||||
|
toWrite = toWrite.substring(0, pos) + toWrite.substring(end);
|
||||||
|
}
|
||||||
|
return write(toWrite);
|
||||||
|
}
|
||||||
|
if (ts.isFunctionDeclaration(node)) {
|
||||||
|
// Do not go inside functions if they haven't been marked
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
node.forEachChild(writeMarkedNodes);
|
||||||
|
}
|
||||||
|
if (getColor(sourceFile) !== 2 /* Black */) {
|
||||||
|
if (!nodeOrChildIsBlack(sourceFile)) {
|
||||||
|
// none of the elements are reachable => don't write this file at all!
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sourceFile.forEachChild(writeMarkedNodes);
|
||||||
|
result += sourceFile.endOfFileToken.getFullText(sourceFile);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
result = text;
|
||||||
|
}
|
||||||
|
writeFile(destination, result);
|
||||||
|
});
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
//#region Utils
|
||||||
|
/**
|
||||||
|
* Returns the node's symbol and the `import` node (if the symbol resolved from a different module)
|
||||||
|
*/
|
||||||
|
function getRealNodeSymbol(checker, node) {
|
||||||
|
const getPropertySymbolsFromContextualType = ts.getPropertySymbolsFromContextualType;
|
||||||
|
const getContainingObjectLiteralElement = ts.getContainingObjectLiteralElement;
|
||||||
|
const getNameFromPropertyName = ts.getNameFromPropertyName;
|
||||||
|
// Go to the original declaration for cases:
|
||||||
|
//
|
||||||
|
// (1) when the aliased symbol was declared in the location(parent).
|
||||||
|
// (2) when the aliased symbol is originating from an import.
|
||||||
|
//
|
||||||
|
function shouldSkipAlias(node, declaration) {
|
||||||
|
if (node.kind !== ts.SyntaxKind.Identifier) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (node.parent === declaration) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
switch (declaration.kind) {
|
||||||
|
case ts.SyntaxKind.ImportClause:
|
||||||
|
case ts.SyntaxKind.ImportEqualsDeclaration:
|
||||||
|
return true;
|
||||||
|
case ts.SyntaxKind.ImportSpecifier:
|
||||||
|
return declaration.parent.kind === ts.SyntaxKind.NamedImports;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (!ts.isShorthandPropertyAssignment(node)) {
|
||||||
|
if (node.getChildCount() !== 0) {
|
||||||
|
return [null, null];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const { parent } = node;
|
||||||
|
let symbol = checker.getSymbolAtLocation(node);
|
||||||
|
let importNode = null;
|
||||||
|
// If this is an alias, and the request came at the declaration location
|
||||||
|
// get the aliased symbol instead. This allows for goto def on an import e.g.
|
||||||
|
// import {A, B} from "mod";
|
||||||
|
// to jump to the implementation directly.
|
||||||
|
if (symbol && symbol.flags & ts.SymbolFlags.Alias && shouldSkipAlias(node, symbol.declarations[0])) {
|
||||||
|
const aliased = checker.getAliasedSymbol(symbol);
|
||||||
|
if (aliased.declarations) {
|
||||||
|
// We should mark the import as visited
|
||||||
|
importNode = symbol.declarations[0];
|
||||||
|
symbol = aliased;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (symbol) {
|
||||||
|
// Because name in short-hand property assignment has two different meanings: property name and property value,
|
||||||
|
// using go-to-definition at such position should go to the variable declaration of the property value rather than
|
||||||
|
// go to the declaration of the property name (in this case stay at the same position). However, if go-to-definition
|
||||||
|
// is performed at the location of property access, we would like to go to definition of the property in the short-hand
|
||||||
|
// assignment. This case and others are handled by the following code.
|
||||||
|
if (node.parent.kind === ts.SyntaxKind.ShorthandPropertyAssignment) {
|
||||||
|
symbol = checker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration);
|
||||||
|
}
|
||||||
|
// If the node is the name of a BindingElement within an ObjectBindingPattern instead of just returning the
|
||||||
|
// declaration the symbol (which is itself), we should try to get to the original type of the ObjectBindingPattern
|
||||||
|
// and return the property declaration for the referenced property.
|
||||||
|
// For example:
|
||||||
|
// import('./foo').then(({ b/*goto*/ar }) => undefined); => should get use to the declaration in file "./foo"
|
||||||
|
//
|
||||||
|
// function bar<T>(onfulfilled: (value: T) => void) { //....}
|
||||||
|
// interface Test {
|
||||||
|
// pr/*destination*/op1: number
|
||||||
|
// }
|
||||||
|
// bar<Test>(({pr/*goto*/op1})=>{});
|
||||||
|
if (ts.isPropertyName(node) && ts.isBindingElement(parent) && ts.isObjectBindingPattern(parent.parent) &&
|
||||||
|
(node === (parent.propertyName || parent.name))) {
|
||||||
|
const name = getNameFromPropertyName(node);
|
||||||
|
const type = checker.getTypeAtLocation(parent.parent);
|
||||||
|
if (name && type) {
|
||||||
|
if (type.isUnion()) {
|
||||||
|
const prop = type.types[0].getProperty(name);
|
||||||
|
if (prop) {
|
||||||
|
symbol = prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
const prop = type.getProperty(name);
|
||||||
|
if (prop) {
|
||||||
|
symbol = prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// If the current location we want to find its definition is in an object literal, try to get the contextual type for the
|
||||||
|
// object literal, lookup the property symbol in the contextual type, and use this for goto-definition.
|
||||||
|
// For example
|
||||||
|
// interface Props{
|
||||||
|
// /*first*/prop1: number
|
||||||
|
// prop2: boolean
|
||||||
|
// }
|
||||||
|
// function Foo(arg: Props) {}
|
||||||
|
// Foo( { pr/*1*/op1: 10, prop2: false })
|
||||||
|
const element = getContainingObjectLiteralElement(node);
|
||||||
|
if (element) {
|
||||||
|
const contextualType = element && checker.getContextualType(element.parent);
|
||||||
|
if (contextualType) {
|
||||||
|
const propertySymbols = getPropertySymbolsFromContextualType(element, checker, contextualType, /*unionSymbolOk*/ false);
|
||||||
|
if (propertySymbols) {
|
||||||
|
symbol = propertySymbols[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if (symbol && symbol.declarations) {
|
||||||
|
return [symbol, importNode];
|
||||||
|
}
|
||||||
|
return [null, null];
|
||||||
|
}
|
||||||
|
/** Get the token whose text contains the position */
|
||||||
|
function getTokenAtPosition(sourceFile, position, allowPositionInLeadingTrivia, includeEndPosition) {
|
||||||
|
let current = sourceFile;
|
||||||
|
outer: while (true) {
|
||||||
|
// find the child that contains 'position'
|
||||||
|
for (const child of current.getChildren()) {
|
||||||
|
const start = allowPositionInLeadingTrivia ? child.getFullStart() : child.getStart(sourceFile, /*includeJsDoc*/ true);
|
||||||
|
if (start > position) {
|
||||||
|
// If this child begins after position, then all subsequent children will as well.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const end = child.getEnd();
|
||||||
|
if (position < end || (position === end && (child.kind === ts.SyntaxKind.EndOfFileToken || includeEndPosition))) {
|
||||||
|
current = child;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
}
|
||||||
830
build/lib/treeshaking.ts
Normal file
830
build/lib/treeshaking.ts
Normal file
@@ -0,0 +1,830 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
'use strict';
|
||||||
|
|
||||||
|
import * as fs from 'fs';
|
||||||
|
import * as path from 'path';
|
||||||
|
import * as ts from 'typescript';
|
||||||
|
|
||||||
|
const TYPESCRIPT_LIB_FOLDER = path.dirname(require.resolve('typescript/lib/lib.d.ts'));
|
||||||
|
|
||||||
|
export const enum ShakeLevel {
|
||||||
|
Files = 0,
|
||||||
|
InnerFile = 1,
|
||||||
|
ClassMembers = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ITreeShakingOptions {
|
||||||
|
/**
|
||||||
|
* The full path to the root where sources are.
|
||||||
|
*/
|
||||||
|
sourcesRoot: string;
|
||||||
|
/**
|
||||||
|
* Module ids.
|
||||||
|
* e.g. `vs/editor/editor.main` or `index`
|
||||||
|
*/
|
||||||
|
entryPoints: string[];
|
||||||
|
/**
|
||||||
|
* Inline usages.
|
||||||
|
*/
|
||||||
|
inlineEntryPoints: string[];
|
||||||
|
/**
|
||||||
|
* TypeScript libs.
|
||||||
|
* e.g. `lib.d.ts`, `lib.es2015.collection.d.ts`
|
||||||
|
*/
|
||||||
|
libs: string[];
|
||||||
|
/**
|
||||||
|
* Other .d.ts files
|
||||||
|
*/
|
||||||
|
typings: string[];
|
||||||
|
/**
|
||||||
|
* TypeScript compiler options.
|
||||||
|
*/
|
||||||
|
compilerOptions?: any;
|
||||||
|
/**
|
||||||
|
* The shake level to perform.
|
||||||
|
*/
|
||||||
|
shakeLevel: ShakeLevel;
|
||||||
|
/**
|
||||||
|
* regex pattern to ignore certain imports e.g. `vs/css!` imports
|
||||||
|
*/
|
||||||
|
importIgnorePattern: RegExp;
|
||||||
|
|
||||||
|
redirects: { [module: string]: string; };
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface ITreeShakingResult {
|
||||||
|
[file: string]: string;
|
||||||
|
}
|
||||||
|
|
||||||
|
function printDiagnostics(diagnostics: ReadonlyArray<ts.Diagnostic>): void {
|
||||||
|
for (let i = 0; i < diagnostics.length; i++) {
|
||||||
|
const diag = diagnostics[i];
|
||||||
|
let result = '';
|
||||||
|
if (diag.file) {
|
||||||
|
result += `${diag.file.fileName}: `;
|
||||||
|
}
|
||||||
|
if (diag.file && diag.start) {
|
||||||
|
let location = diag.file.getLineAndCharacterOfPosition(diag.start);
|
||||||
|
result += `- ${location.line + 1},${location.character} - `
|
||||||
|
}
|
||||||
|
result += JSON.stringify(diag.messageText);
|
||||||
|
console.log(result);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
export function shake(options: ITreeShakingOptions): ITreeShakingResult {
|
||||||
|
const languageService = createTypeScriptLanguageService(options);
|
||||||
|
const program = languageService.getProgram()!;
|
||||||
|
|
||||||
|
const globalDiagnostics = program.getGlobalDiagnostics();
|
||||||
|
if (globalDiagnostics.length > 0) {
|
||||||
|
printDiagnostics(globalDiagnostics);
|
||||||
|
throw new Error(`Compilation Errors encountered.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const syntacticDiagnostics = program.getSyntacticDiagnostics();
|
||||||
|
if (syntacticDiagnostics.length > 0) {
|
||||||
|
printDiagnostics(syntacticDiagnostics);
|
||||||
|
throw new Error(`Compilation Errors encountered.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
const semanticDiagnostics = program.getSemanticDiagnostics();
|
||||||
|
if (semanticDiagnostics.length > 0) {
|
||||||
|
printDiagnostics(semanticDiagnostics);
|
||||||
|
throw new Error(`Compilation Errors encountered.`);
|
||||||
|
}
|
||||||
|
|
||||||
|
markNodes(languageService, options);
|
||||||
|
|
||||||
|
return generateResult(languageService, options.shakeLevel);
|
||||||
|
}
|
||||||
|
|
||||||
|
//#region Discovery, LanguageService & Setup
|
||||||
|
function createTypeScriptLanguageService(options: ITreeShakingOptions): ts.LanguageService {
|
||||||
|
// Discover referenced files
|
||||||
|
const FILES = discoverAndReadFiles(options);
|
||||||
|
|
||||||
|
// Add fake usage files
|
||||||
|
options.inlineEntryPoints.forEach((inlineEntryPoint, index) => {
|
||||||
|
FILES[`inlineEntryPoint.${index}.ts`] = inlineEntryPoint;
|
||||||
|
});
|
||||||
|
|
||||||
|
// Add additional typings
|
||||||
|
options.typings.forEach((typing) => {
|
||||||
|
const filePath = path.join(options.sourcesRoot, typing);
|
||||||
|
FILES[typing] = fs.readFileSync(filePath).toString();
|
||||||
|
});
|
||||||
|
|
||||||
|
// Resolve libs
|
||||||
|
const RESOLVED_LIBS: ILibMap = {};
|
||||||
|
options.libs.forEach((filename) => {
|
||||||
|
const filepath = path.join(TYPESCRIPT_LIB_FOLDER, filename);
|
||||||
|
RESOLVED_LIBS[`defaultLib:${filename}`] = fs.readFileSync(filepath).toString();
|
||||||
|
});
|
||||||
|
|
||||||
|
const compilerOptions = ts.convertCompilerOptionsFromJson(options.compilerOptions, options.sourcesRoot).options;
|
||||||
|
|
||||||
|
const host = new TypeScriptLanguageServiceHost(RESOLVED_LIBS, FILES, compilerOptions);
|
||||||
|
return ts.createLanguageService(host);
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Read imports and follow them until all files have been handled
|
||||||
|
*/
|
||||||
|
function discoverAndReadFiles(options: ITreeShakingOptions): IFileMap {
|
||||||
|
const FILES: IFileMap = {};
|
||||||
|
|
||||||
|
const in_queue: { [module: string]: boolean; } = Object.create(null);
|
||||||
|
const queue: string[] = [];
|
||||||
|
|
||||||
|
const enqueue = (moduleId: string) => {
|
||||||
|
if (in_queue[moduleId]) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
in_queue[moduleId] = true;
|
||||||
|
queue.push(moduleId);
|
||||||
|
};
|
||||||
|
|
||||||
|
options.entryPoints.forEach((entryPoint) => enqueue(entryPoint));
|
||||||
|
|
||||||
|
while (queue.length > 0) {
|
||||||
|
const moduleId = queue.shift()!;
|
||||||
|
const dts_filename = path.join(options.sourcesRoot, moduleId + '.d.ts');
|
||||||
|
if (fs.existsSync(dts_filename)) {
|
||||||
|
const dts_filecontents = fs.readFileSync(dts_filename).toString();
|
||||||
|
FILES[`${moduleId}.d.ts`] = dts_filecontents;
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let ts_filename: string;
|
||||||
|
if (options.redirects[moduleId]) {
|
||||||
|
ts_filename = path.join(options.sourcesRoot, options.redirects[moduleId] + '.ts');
|
||||||
|
} else {
|
||||||
|
ts_filename = path.join(options.sourcesRoot, moduleId + '.ts');
|
||||||
|
}
|
||||||
|
const ts_filecontents = fs.readFileSync(ts_filename).toString();
|
||||||
|
const info = ts.preProcessFile(ts_filecontents);
|
||||||
|
for (let i = info.importedFiles.length - 1; i >= 0; i--) {
|
||||||
|
const importedFileName = info.importedFiles[i].fileName;
|
||||||
|
|
||||||
|
if (options.importIgnorePattern.test(importedFileName)) {
|
||||||
|
// Ignore vs/css! imports
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let importedModuleId = importedFileName;
|
||||||
|
if (/(^\.\/)|(^\.\.\/)/.test(importedModuleId)) {
|
||||||
|
importedModuleId = path.join(path.dirname(moduleId), importedModuleId);
|
||||||
|
}
|
||||||
|
enqueue(importedModuleId);
|
||||||
|
}
|
||||||
|
|
||||||
|
FILES[`${moduleId}.ts`] = ts_filecontents;
|
||||||
|
}
|
||||||
|
|
||||||
|
return FILES;
|
||||||
|
}
|
||||||
|
|
||||||
|
interface ILibMap { [libName: string]: string; }
|
||||||
|
interface IFileMap { [fileName: string]: string; }
|
||||||
|
|
||||||
|
/**
|
||||||
|
* A TypeScript language service host
|
||||||
|
*/
|
||||||
|
class TypeScriptLanguageServiceHost implements ts.LanguageServiceHost {
|
||||||
|
|
||||||
|
private readonly _libs: ILibMap;
|
||||||
|
private readonly _files: IFileMap;
|
||||||
|
private readonly _compilerOptions: ts.CompilerOptions;
|
||||||
|
|
||||||
|
constructor(libs: ILibMap, files: IFileMap, compilerOptions: ts.CompilerOptions) {
|
||||||
|
this._libs = libs;
|
||||||
|
this._files = files;
|
||||||
|
this._compilerOptions = compilerOptions;
|
||||||
|
}
|
||||||
|
|
||||||
|
// --- language service host ---------------
|
||||||
|
|
||||||
|
getCompilationSettings(): ts.CompilerOptions {
|
||||||
|
return this._compilerOptions;
|
||||||
|
}
|
||||||
|
getScriptFileNames(): string[] {
|
||||||
|
return (
|
||||||
|
([] as string[])
|
||||||
|
.concat(Object.keys(this._libs))
|
||||||
|
.concat(Object.keys(this._files))
|
||||||
|
);
|
||||||
|
}
|
||||||
|
getScriptVersion(_fileName: string): string {
|
||||||
|
return '1';
|
||||||
|
}
|
||||||
|
getProjectVersion(): string {
|
||||||
|
return '1';
|
||||||
|
}
|
||||||
|
getScriptSnapshot(fileName: string): ts.IScriptSnapshot {
|
||||||
|
if (this._files.hasOwnProperty(fileName)) {
|
||||||
|
return ts.ScriptSnapshot.fromString(this._files[fileName]);
|
||||||
|
} else if (this._libs.hasOwnProperty(fileName)) {
|
||||||
|
return ts.ScriptSnapshot.fromString(this._libs[fileName]);
|
||||||
|
} else {
|
||||||
|
return ts.ScriptSnapshot.fromString('');
|
||||||
|
}
|
||||||
|
}
|
||||||
|
getScriptKind(_fileName: string): ts.ScriptKind {
|
||||||
|
return ts.ScriptKind.TS;
|
||||||
|
}
|
||||||
|
getCurrentDirectory(): string {
|
||||||
|
return '';
|
||||||
|
}
|
||||||
|
getDefaultLibFileName(_options: ts.CompilerOptions): string {
|
||||||
|
return 'defaultLib:lib.d.ts';
|
||||||
|
}
|
||||||
|
isDefaultLibFileName(fileName: string): boolean {
|
||||||
|
return fileName === this.getDefaultLibFileName(this._compilerOptions);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Tree Shaking
|
||||||
|
|
||||||
|
const enum NodeColor {
|
||||||
|
White = 0,
|
||||||
|
Gray = 1,
|
||||||
|
Black = 2
|
||||||
|
}
|
||||||
|
|
||||||
|
function getColor(node: ts.Node): NodeColor {
|
||||||
|
return (<any>node).$$$color || NodeColor.White;
|
||||||
|
}
|
||||||
|
function setColor(node: ts.Node, color: NodeColor): void {
|
||||||
|
(<any>node).$$$color = color;
|
||||||
|
}
|
||||||
|
function nodeOrParentIsBlack(node: ts.Node): boolean {
|
||||||
|
while (node) {
|
||||||
|
const color = getColor(node);
|
||||||
|
if (color === NodeColor.Black) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
node = node.parent;
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
function nodeOrChildIsBlack(node: ts.Node): boolean {
|
||||||
|
if (getColor(node) === NodeColor.Black) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
for (const child of node.getChildren()) {
|
||||||
|
if (nodeOrChildIsBlack(child)) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function markNodes(languageService: ts.LanguageService, options: ITreeShakingOptions) {
|
||||||
|
const program = languageService.getProgram();
|
||||||
|
if (!program) {
|
||||||
|
throw new Error('Could not get program from language service');
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.shakeLevel === ShakeLevel.Files) {
|
||||||
|
// Mark all source files Black
|
||||||
|
program.getSourceFiles().forEach((sourceFile) => {
|
||||||
|
setColor(sourceFile, NodeColor.Black);
|
||||||
|
});
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const black_queue: ts.Node[] = [];
|
||||||
|
const gray_queue: ts.Node[] = [];
|
||||||
|
const sourceFilesLoaded: { [fileName: string]: boolean } = {};
|
||||||
|
|
||||||
|
function enqueueTopLevelModuleStatements(sourceFile: ts.SourceFile): void {
|
||||||
|
|
||||||
|
sourceFile.forEachChild((node: ts.Node) => {
|
||||||
|
|
||||||
|
if (ts.isImportDeclaration(node)) {
|
||||||
|
if (!node.importClause && ts.isStringLiteral(node.moduleSpecifier)) {
|
||||||
|
setColor(node, NodeColor.Black);
|
||||||
|
enqueueImport(node, node.moduleSpecifier.text);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ts.isExportDeclaration(node)) {
|
||||||
|
if (node.moduleSpecifier && ts.isStringLiteral(node.moduleSpecifier)) {
|
||||||
|
setColor(node, NodeColor.Black);
|
||||||
|
enqueueImport(node, node.moduleSpecifier.text);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (
|
||||||
|
ts.isExpressionStatement(node)
|
||||||
|
|| ts.isIfStatement(node)
|
||||||
|
|| ts.isIterationStatement(node, true)
|
||||||
|
|| ts.isExportAssignment(node)
|
||||||
|
) {
|
||||||
|
enqueue_black(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ts.isImportEqualsDeclaration(node)) {
|
||||||
|
if (/export/.test(node.getFullText(sourceFile))) {
|
||||||
|
// e.g. "export import Severity = BaseSeverity;"
|
||||||
|
enqueue_black(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
function enqueue_gray(node: ts.Node): void {
|
||||||
|
if (nodeOrParentIsBlack(node) || getColor(node) === NodeColor.Gray) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
setColor(node, NodeColor.Gray);
|
||||||
|
gray_queue.push(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
function enqueue_black(node: ts.Node): void {
|
||||||
|
const previousColor = getColor(node);
|
||||||
|
|
||||||
|
if (previousColor === NodeColor.Black) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (previousColor === NodeColor.Gray) {
|
||||||
|
// remove from gray queue
|
||||||
|
gray_queue.splice(gray_queue.indexOf(node), 1);
|
||||||
|
setColor(node, NodeColor.White);
|
||||||
|
|
||||||
|
// add to black queue
|
||||||
|
enqueue_black(node);
|
||||||
|
|
||||||
|
// // move from one queue to the other
|
||||||
|
// black_queue.push(node);
|
||||||
|
// setColor(node, NodeColor.Black);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (nodeOrParentIsBlack(node)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const fileName = node.getSourceFile().fileName;
|
||||||
|
if (/^defaultLib:/.test(fileName) || /\.d\.ts$/.test(fileName)) {
|
||||||
|
setColor(node, NodeColor.Black);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const sourceFile = node.getSourceFile();
|
||||||
|
if (!sourceFilesLoaded[sourceFile.fileName]) {
|
||||||
|
sourceFilesLoaded[sourceFile.fileName] = true;
|
||||||
|
enqueueTopLevelModuleStatements(sourceFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ts.isSourceFile(node)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
setColor(node, NodeColor.Black);
|
||||||
|
black_queue.push(node);
|
||||||
|
|
||||||
|
if (options.shakeLevel === ShakeLevel.ClassMembers && (ts.isMethodDeclaration(node) || ts.isMethodSignature(node) || ts.isPropertySignature(node) || ts.isGetAccessor(node) || ts.isSetAccessor(node))) {
|
||||||
|
const references = languageService.getReferencesAtPosition(node.getSourceFile().fileName, node.name.pos + node.name.getLeadingTriviaWidth());
|
||||||
|
if (references) {
|
||||||
|
for (let i = 0, len = references.length; i < len; i++) {
|
||||||
|
const reference = references[i];
|
||||||
|
const referenceSourceFile = program!.getSourceFile(reference.fileName);
|
||||||
|
if (!referenceSourceFile) {
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
const referenceNode = getTokenAtPosition(referenceSourceFile, reference.textSpan.start, false, false);
|
||||||
|
if (
|
||||||
|
ts.isMethodDeclaration(referenceNode.parent)
|
||||||
|
|| ts.isPropertyDeclaration(referenceNode.parent)
|
||||||
|
|| ts.isGetAccessor(referenceNode.parent)
|
||||||
|
|| ts.isSetAccessor(referenceNode.parent)
|
||||||
|
) {
|
||||||
|
enqueue_gray(referenceNode.parent);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function enqueueFile(filename: string): void {
|
||||||
|
const sourceFile = program!.getSourceFile(filename);
|
||||||
|
if (!sourceFile) {
|
||||||
|
console.warn(`Cannot find source file ${filename}`);
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
enqueue_black(sourceFile);
|
||||||
|
}
|
||||||
|
|
||||||
|
function enqueueImport(node: ts.Node, importText: string): void {
|
||||||
|
if (options.importIgnorePattern.test(importText)) {
|
||||||
|
// this import should be ignored
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
const nodeSourceFile = node.getSourceFile();
|
||||||
|
let fullPath: string;
|
||||||
|
if (/(^\.\/)|(^\.\.\/)/.test(importText)) {
|
||||||
|
fullPath = path.join(path.dirname(nodeSourceFile.fileName), importText) + '.ts';
|
||||||
|
} else {
|
||||||
|
fullPath = importText + '.ts';
|
||||||
|
}
|
||||||
|
enqueueFile(fullPath);
|
||||||
|
}
|
||||||
|
|
||||||
|
options.entryPoints.forEach(moduleId => enqueueFile(moduleId + '.ts'));
|
||||||
|
// Add fake usage files
|
||||||
|
options.inlineEntryPoints.forEach((_, index) => enqueueFile(`inlineEntryPoint.${index}.ts`));
|
||||||
|
|
||||||
|
let step = 0;
|
||||||
|
|
||||||
|
const checker = program.getTypeChecker();
|
||||||
|
while (black_queue.length > 0 || gray_queue.length > 0) {
|
||||||
|
++step;
|
||||||
|
let node: ts.Node;
|
||||||
|
|
||||||
|
if (step % 100 === 0) {
|
||||||
|
console.log(`${step}/${step + black_queue.length + gray_queue.length} (${black_queue.length}, ${gray_queue.length})`);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (black_queue.length === 0) {
|
||||||
|
for (let i = 0; i < gray_queue.length; i++) {
|
||||||
|
const node = gray_queue[i];
|
||||||
|
const nodeParent = node.parent;
|
||||||
|
if ((ts.isClassDeclaration(nodeParent) || ts.isInterfaceDeclaration(nodeParent)) && nodeOrChildIsBlack(nodeParent)) {
|
||||||
|
gray_queue.splice(i, 1);
|
||||||
|
black_queue.push(node);
|
||||||
|
setColor(node, NodeColor.Black);
|
||||||
|
i--;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (black_queue.length > 0) {
|
||||||
|
node = black_queue.shift()!;
|
||||||
|
} else {
|
||||||
|
// only gray nodes remaining...
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
const nodeSourceFile = node.getSourceFile();
|
||||||
|
|
||||||
|
const loop = (node: ts.Node) => {
|
||||||
|
const [symbol, symbolImportNode] = getRealNodeSymbol(checker, node);
|
||||||
|
if (symbolImportNode) {
|
||||||
|
setColor(symbolImportNode, NodeColor.Black);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (symbol && !nodeIsInItsOwnDeclaration(nodeSourceFile, node, symbol)) {
|
||||||
|
for (let i = 0, len = symbol.declarations.length; i < len; i++) {
|
||||||
|
const declaration = symbol.declarations[i];
|
||||||
|
if (ts.isSourceFile(declaration)) {
|
||||||
|
// Do not enqueue full source files
|
||||||
|
// (they can be the declaration of a module import)
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (options.shakeLevel === ShakeLevel.ClassMembers && (ts.isClassDeclaration(declaration) || ts.isInterfaceDeclaration(declaration))) {
|
||||||
|
enqueue_black(declaration.name!);
|
||||||
|
|
||||||
|
for (let j = 0; j < declaration.members.length; j++) {
|
||||||
|
const member = declaration.members[j];
|
||||||
|
const memberName = member.name ? member.name.getText() : null;
|
||||||
|
if (
|
||||||
|
ts.isConstructorDeclaration(member)
|
||||||
|
|| ts.isConstructSignatureDeclaration(member)
|
||||||
|
|| ts.isIndexSignatureDeclaration(member)
|
||||||
|
|| ts.isCallSignatureDeclaration(member)
|
||||||
|
|| memberName === 'toJSON'
|
||||||
|
|| memberName === 'toString'
|
||||||
|
|| memberName === 'dispose'// TODO: keeping all `dispose` methods
|
||||||
|
) {
|
||||||
|
enqueue_black(member);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// queue the heritage clauses
|
||||||
|
if (declaration.heritageClauses) {
|
||||||
|
for (let heritageClause of declaration.heritageClauses) {
|
||||||
|
enqueue_black(heritageClause);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
enqueue_black(declaration);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
node.forEachChild(loop);
|
||||||
|
};
|
||||||
|
node.forEachChild(loop);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
function nodeIsInItsOwnDeclaration(nodeSourceFile: ts.SourceFile, node: ts.Node, symbol: ts.Symbol): boolean {
|
||||||
|
for (let i = 0, len = symbol.declarations.length; i < len; i++) {
|
||||||
|
const declaration = symbol.declarations[i];
|
||||||
|
const declarationSourceFile = declaration.getSourceFile();
|
||||||
|
|
||||||
|
if (nodeSourceFile === declarationSourceFile) {
|
||||||
|
if (declaration.pos <= node.pos && node.end <= declaration.end) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
|
||||||
|
function generateResult(languageService: ts.LanguageService, shakeLevel: ShakeLevel): ITreeShakingResult {
|
||||||
|
const program = languageService.getProgram();
|
||||||
|
if (!program) {
|
||||||
|
throw new Error('Could not get program from language service');
|
||||||
|
}
|
||||||
|
|
||||||
|
let result: ITreeShakingResult = {};
|
||||||
|
const writeFile = (filePath: string, contents: string): void => {
|
||||||
|
result[filePath] = contents;
|
||||||
|
};
|
||||||
|
|
||||||
|
program.getSourceFiles().forEach((sourceFile) => {
|
||||||
|
const fileName = sourceFile.fileName;
|
||||||
|
if (/^defaultLib:/.test(fileName)) {
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
const destination = fileName;
|
||||||
|
if (/\.d\.ts$/.test(fileName)) {
|
||||||
|
if (nodeOrChildIsBlack(sourceFile)) {
|
||||||
|
writeFile(destination, sourceFile.text);
|
||||||
|
}
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
let text = sourceFile.text;
|
||||||
|
let result = '';
|
||||||
|
|
||||||
|
function keep(node: ts.Node): void {
|
||||||
|
result += text.substring(node.pos, node.end);
|
||||||
|
}
|
||||||
|
function write(data: string): void {
|
||||||
|
result += data;
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeMarkedNodes(node: ts.Node): void {
|
||||||
|
if (getColor(node) === NodeColor.Black) {
|
||||||
|
return keep(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
// Always keep certain top-level statements
|
||||||
|
if (ts.isSourceFile(node.parent)) {
|
||||||
|
if (ts.isExpressionStatement(node) && ts.isStringLiteral(node.expression) && node.expression.text === 'use strict') {
|
||||||
|
return keep(node);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ts.isVariableStatement(node) && nodeOrChildIsBlack(node)) {
|
||||||
|
return keep(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// Keep the entire import in import * as X cases
|
||||||
|
if (ts.isImportDeclaration(node)) {
|
||||||
|
if (node.importClause && node.importClause.namedBindings) {
|
||||||
|
if (ts.isNamespaceImport(node.importClause.namedBindings)) {
|
||||||
|
if (getColor(node.importClause.namedBindings) === NodeColor.Black) {
|
||||||
|
return keep(node);
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
let survivingImports: string[] = [];
|
||||||
|
for (let i = 0; i < node.importClause.namedBindings.elements.length; i++) {
|
||||||
|
const importNode = node.importClause.namedBindings.elements[i];
|
||||||
|
if (getColor(importNode) === NodeColor.Black) {
|
||||||
|
survivingImports.push(importNode.getFullText(sourceFile));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
const leadingTriviaWidth = node.getLeadingTriviaWidth();
|
||||||
|
const leadingTrivia = sourceFile.text.substr(node.pos, leadingTriviaWidth);
|
||||||
|
if (survivingImports.length > 0) {
|
||||||
|
if (node.importClause && node.importClause.name && getColor(node.importClause) === NodeColor.Black) {
|
||||||
|
return write(`${leadingTrivia}import ${node.importClause.name.text}, {${survivingImports.join(',')} } from${node.moduleSpecifier.getFullText(sourceFile)};`);
|
||||||
|
}
|
||||||
|
return write(`${leadingTrivia}import {${survivingImports.join(',')} } from${node.moduleSpecifier.getFullText(sourceFile)};`);
|
||||||
|
} else {
|
||||||
|
if (node.importClause && node.importClause.name && getColor(node.importClause) === NodeColor.Black) {
|
||||||
|
return write(`${leadingTrivia}import ${node.importClause.name.text} from${node.moduleSpecifier.getFullText(sourceFile)};`);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
if (node.importClause && getColor(node.importClause) === NodeColor.Black) {
|
||||||
|
return keep(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (shakeLevel === ShakeLevel.ClassMembers && (ts.isClassDeclaration(node) || ts.isInterfaceDeclaration(node)) && nodeOrChildIsBlack(node)) {
|
||||||
|
let toWrite = node.getFullText();
|
||||||
|
for (let i = node.members.length - 1; i >= 0; i--) {
|
||||||
|
const member = node.members[i];
|
||||||
|
if (getColor(member) === NodeColor.Black || !member.name) {
|
||||||
|
// keep method
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
if (/^_(.*)Brand$/.test(member.name.getText())) {
|
||||||
|
// TODO: keep all members ending with `Brand`...
|
||||||
|
continue;
|
||||||
|
}
|
||||||
|
|
||||||
|
let pos = member.pos - node.pos;
|
||||||
|
let end = member.end - node.pos;
|
||||||
|
toWrite = toWrite.substring(0, pos) + toWrite.substring(end);
|
||||||
|
}
|
||||||
|
return write(toWrite);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (ts.isFunctionDeclaration(node)) {
|
||||||
|
// Do not go inside functions if they haven't been marked
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
|
||||||
|
node.forEachChild(writeMarkedNodes);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (getColor(sourceFile) !== NodeColor.Black) {
|
||||||
|
if (!nodeOrChildIsBlack(sourceFile)) {
|
||||||
|
// none of the elements are reachable => don't write this file at all!
|
||||||
|
return;
|
||||||
|
}
|
||||||
|
sourceFile.forEachChild(writeMarkedNodes);
|
||||||
|
result += sourceFile.endOfFileToken.getFullText(sourceFile);
|
||||||
|
} else {
|
||||||
|
result = text;
|
||||||
|
}
|
||||||
|
|
||||||
|
writeFile(destination, result);
|
||||||
|
});
|
||||||
|
|
||||||
|
return result;
|
||||||
|
}
|
||||||
|
|
||||||
|
//#endregion
|
||||||
|
|
||||||
|
//#region Utils
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Returns the node's symbol and the `import` node (if the symbol resolved from a different module)
|
||||||
|
*/
|
||||||
|
function getRealNodeSymbol(checker: ts.TypeChecker, node: ts.Node): [ts.Symbol | null, ts.Declaration | null] {
|
||||||
|
|
||||||
|
// Use some TypeScript internals to avoid code duplication
|
||||||
|
type ObjectLiteralElementWithName = ts.ObjectLiteralElement & { name: ts.PropertyName; parent: ts.ObjectLiteralExpression | ts.JsxAttributes };
|
||||||
|
const getPropertySymbolsFromContextualType: (node: ObjectLiteralElementWithName, checker: ts.TypeChecker, contextualType: ts.Type, unionSymbolOk: boolean) => ReadonlyArray<ts.Symbol> = (<any>ts).getPropertySymbolsFromContextualType;
|
||||||
|
const getContainingObjectLiteralElement: (node: ts.Node) => ObjectLiteralElementWithName | undefined = (<any>ts).getContainingObjectLiteralElement;
|
||||||
|
const getNameFromPropertyName: (name: ts.PropertyName) => string | undefined = (<any>ts).getNameFromPropertyName;
|
||||||
|
|
||||||
|
// Go to the original declaration for cases:
|
||||||
|
//
|
||||||
|
// (1) when the aliased symbol was declared in the location(parent).
|
||||||
|
// (2) when the aliased symbol is originating from an import.
|
||||||
|
//
|
||||||
|
function shouldSkipAlias(node: ts.Node, declaration: ts.Node): boolean {
|
||||||
|
if (node.kind !== ts.SyntaxKind.Identifier) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
if (node.parent === declaration) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
switch (declaration.kind) {
|
||||||
|
case ts.SyntaxKind.ImportClause:
|
||||||
|
case ts.SyntaxKind.ImportEqualsDeclaration:
|
||||||
|
return true;
|
||||||
|
case ts.SyntaxKind.ImportSpecifier:
|
||||||
|
return declaration.parent.kind === ts.SyntaxKind.NamedImports;
|
||||||
|
default:
|
||||||
|
return false;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (!ts.isShorthandPropertyAssignment(node)) {
|
||||||
|
if (node.getChildCount() !== 0) {
|
||||||
|
return [null, null];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
const { parent } = node;
|
||||||
|
|
||||||
|
let symbol = checker.getSymbolAtLocation(node);
|
||||||
|
let importNode: ts.Declaration | null = null;
|
||||||
|
// If this is an alias, and the request came at the declaration location
|
||||||
|
// get the aliased symbol instead. This allows for goto def on an import e.g.
|
||||||
|
// import {A, B} from "mod";
|
||||||
|
// to jump to the implementation directly.
|
||||||
|
if (symbol && symbol.flags & ts.SymbolFlags.Alias && shouldSkipAlias(node, symbol.declarations[0])) {
|
||||||
|
const aliased = checker.getAliasedSymbol(symbol);
|
||||||
|
if (aliased.declarations) {
|
||||||
|
// We should mark the import as visited
|
||||||
|
importNode = symbol.declarations[0];
|
||||||
|
symbol = aliased;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (symbol) {
|
||||||
|
// Because name in short-hand property assignment has two different meanings: property name and property value,
|
||||||
|
// using go-to-definition at such position should go to the variable declaration of the property value rather than
|
||||||
|
// go to the declaration of the property name (in this case stay at the same position). However, if go-to-definition
|
||||||
|
// is performed at the location of property access, we would like to go to definition of the property in the short-hand
|
||||||
|
// assignment. This case and others are handled by the following code.
|
||||||
|
if (node.parent.kind === ts.SyntaxKind.ShorthandPropertyAssignment) {
|
||||||
|
symbol = checker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration);
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the node is the name of a BindingElement within an ObjectBindingPattern instead of just returning the
|
||||||
|
// declaration the symbol (which is itself), we should try to get to the original type of the ObjectBindingPattern
|
||||||
|
// and return the property declaration for the referenced property.
|
||||||
|
// For example:
|
||||||
|
// import('./foo').then(({ b/*goto*/ar }) => undefined); => should get use to the declaration in file "./foo"
|
||||||
|
//
|
||||||
|
// function bar<T>(onfulfilled: (value: T) => void) { //....}
|
||||||
|
// interface Test {
|
||||||
|
// pr/*destination*/op1: number
|
||||||
|
// }
|
||||||
|
// bar<Test>(({pr/*goto*/op1})=>{});
|
||||||
|
if (ts.isPropertyName(node) && ts.isBindingElement(parent) && ts.isObjectBindingPattern(parent.parent) &&
|
||||||
|
(node === (parent.propertyName || parent.name))) {
|
||||||
|
const name = getNameFromPropertyName(node);
|
||||||
|
const type = checker.getTypeAtLocation(parent.parent);
|
||||||
|
if (name && type) {
|
||||||
|
if (type.isUnion()) {
|
||||||
|
const prop = type.types[0].getProperty(name);
|
||||||
|
if (prop) {
|
||||||
|
symbol = prop;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
const prop = type.getProperty(name);
|
||||||
|
if (prop) {
|
||||||
|
symbol = prop;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
// If the current location we want to find its definition is in an object literal, try to get the contextual type for the
|
||||||
|
// object literal, lookup the property symbol in the contextual type, and use this for goto-definition.
|
||||||
|
// For example
|
||||||
|
// interface Props{
|
||||||
|
// /*first*/prop1: number
|
||||||
|
// prop2: boolean
|
||||||
|
// }
|
||||||
|
// function Foo(arg: Props) {}
|
||||||
|
// Foo( { pr/*1*/op1: 10, prop2: false })
|
||||||
|
const element = getContainingObjectLiteralElement(node);
|
||||||
|
if (element) {
|
||||||
|
const contextualType = element && checker.getContextualType(element.parent);
|
||||||
|
if (contextualType) {
|
||||||
|
const propertySymbols = getPropertySymbolsFromContextualType(element, checker, contextualType, /*unionSymbolOk*/ false);
|
||||||
|
if (propertySymbols) {
|
||||||
|
symbol = propertySymbols[0];
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (symbol && symbol.declarations) {
|
||||||
|
return [symbol, importNode];
|
||||||
|
}
|
||||||
|
|
||||||
|
return [null, null];
|
||||||
|
}
|
||||||
|
|
||||||
|
/** Get the token whose text contains the position */
|
||||||
|
function getTokenAtPosition(sourceFile: ts.SourceFile, position: number, allowPositionInLeadingTrivia: boolean, includeEndPosition: boolean): ts.Node {
|
||||||
|
let current: ts.Node = sourceFile;
|
||||||
|
outer: while (true) {
|
||||||
|
// find the child that contains 'position'
|
||||||
|
for (const child of current.getChildren()) {
|
||||||
|
const start = allowPositionInLeadingTrivia ? child.getFullStart() : child.getStart(sourceFile, /*includeJsDoc*/ true);
|
||||||
|
if (start > position) {
|
||||||
|
// If this child begins after position, then all subsequent children will as well.
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
|
||||||
|
const end = child.getEnd();
|
||||||
|
if (position < end || (position === end && (child.kind === ts.SyntaxKind.EndOfFileToken || includeEndPosition))) {
|
||||||
|
current = child;
|
||||||
|
continue outer;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return current;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//#endregion
|
||||||
@@ -3,48 +3,30 @@
|
|||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
var __extends = (this && this.__extends) || (function () {
|
|
||||||
var extendStatics = Object.setPrototypeOf ||
|
|
||||||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
||||||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
||||||
return function (d, b) {
|
|
||||||
extendStatics(d, b);
|
|
||||||
function __() { this.constructor = d; }
|
|
||||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var path_1 = require("path");
|
const path_1 = require("path");
|
||||||
var Lint = require("tslint");
|
const Lint = require("tslint");
|
||||||
var Rule = /** @class */ (function (_super) {
|
class Rule extends Lint.Rules.AbstractRule {
|
||||||
__extends(Rule, _super);
|
apply(sourceFile) {
|
||||||
function Rule() {
|
|
||||||
return _super !== null && _super.apply(this, arguments) || this;
|
|
||||||
}
|
|
||||||
Rule.prototype.apply = function (sourceFile) {
|
|
||||||
return this.applyWithWalker(new ImportPatterns(sourceFile, this.getOptions()));
|
return this.applyWithWalker(new ImportPatterns(sourceFile, this.getOptions()));
|
||||||
};
|
|
||||||
return Rule;
|
|
||||||
}(Lint.Rules.AbstractRule));
|
|
||||||
exports.Rule = Rule;
|
|
||||||
var ImportPatterns = /** @class */ (function (_super) {
|
|
||||||
__extends(ImportPatterns, _super);
|
|
||||||
function ImportPatterns(file, opts) {
|
|
||||||
var _this = _super.call(this, file, opts) || this;
|
|
||||||
_this.imports = Object.create(null);
|
|
||||||
return _this;
|
|
||||||
}
|
}
|
||||||
ImportPatterns.prototype.visitImportDeclaration = function (node) {
|
}
|
||||||
var path = node.moduleSpecifier.getText();
|
exports.Rule = Rule;
|
||||||
|
class ImportPatterns extends Lint.RuleWalker {
|
||||||
|
constructor(file, opts) {
|
||||||
|
super(file, opts);
|
||||||
|
this.imports = Object.create(null);
|
||||||
|
}
|
||||||
|
visitImportDeclaration(node) {
|
||||||
|
let path = node.moduleSpecifier.getText();
|
||||||
// remove quotes
|
// remove quotes
|
||||||
path = path.slice(1, -1);
|
path = path.slice(1, -1);
|
||||||
if (path[0] === '.') {
|
if (path[0] === '.') {
|
||||||
path = path_1.join(path_1.dirname(node.getSourceFile().fileName), path);
|
path = path_1.join(path_1.dirname(node.getSourceFile().fileName), path);
|
||||||
}
|
}
|
||||||
if (this.imports[path]) {
|
if (this.imports[path]) {
|
||||||
this.addFailure(this.createFailure(node.getStart(), node.getWidth(), "Duplicate imports for '" + path + "'."));
|
this.addFailure(this.createFailure(node.getStart(), node.getWidth(), `Duplicate imports for '${path}'.`));
|
||||||
}
|
}
|
||||||
this.imports[path] = true;
|
this.imports[path] = true;
|
||||||
};
|
}
|
||||||
return ImportPatterns;
|
}
|
||||||
}(Lint.RuleWalker));
|
|
||||||
|
|||||||
@@ -3,79 +3,60 @@
|
|||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
var __extends = (this && this.__extends) || (function () {
|
|
||||||
var extendStatics = Object.setPrototypeOf ||
|
|
||||||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
||||||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
||||||
return function (d, b) {
|
|
||||||
extendStatics(d, b);
|
|
||||||
function __() { this.constructor = d; }
|
|
||||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var ts = require("typescript");
|
const ts = require("typescript");
|
||||||
var Lint = require("tslint");
|
const Lint = require("tslint");
|
||||||
var minimatch = require("minimatch");
|
const minimatch = require("minimatch");
|
||||||
var path_1 = require("path");
|
const path_1 = require("path");
|
||||||
var Rule = /** @class */ (function (_super) {
|
class Rule extends Lint.Rules.AbstractRule {
|
||||||
__extends(Rule, _super);
|
apply(sourceFile) {
|
||||||
function Rule() {
|
const configs = this.getOptions().ruleArguments;
|
||||||
return _super !== null && _super.apply(this, arguments) || this;
|
for (const config of configs) {
|
||||||
}
|
|
||||||
Rule.prototype.apply = function (sourceFile) {
|
|
||||||
var configs = this.getOptions().ruleArguments;
|
|
||||||
for (var _i = 0, configs_1 = configs; _i < configs_1.length; _i++) {
|
|
||||||
var config = configs_1[_i];
|
|
||||||
if (minimatch(sourceFile.fileName, config.target)) {
|
if (minimatch(sourceFile.fileName, config.target)) {
|
||||||
return this.applyWithWalker(new ImportPatterns(sourceFile, this.getOptions(), config));
|
return this.applyWithWalker(new ImportPatterns(sourceFile, this.getOptions(), config));
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return [];
|
return [];
|
||||||
};
|
|
||||||
return Rule;
|
|
||||||
}(Lint.Rules.AbstractRule));
|
|
||||||
exports.Rule = Rule;
|
|
||||||
var ImportPatterns = /** @class */ (function (_super) {
|
|
||||||
__extends(ImportPatterns, _super);
|
|
||||||
function ImportPatterns(file, opts, _config) {
|
|
||||||
var _this = _super.call(this, file, opts) || this;
|
|
||||||
_this._config = _config;
|
|
||||||
return _this;
|
|
||||||
}
|
}
|
||||||
ImportPatterns.prototype.visitImportEqualsDeclaration = function (node) {
|
}
|
||||||
|
exports.Rule = Rule;
|
||||||
|
class ImportPatterns extends Lint.RuleWalker {
|
||||||
|
constructor(file, opts, _config) {
|
||||||
|
super(file, opts);
|
||||||
|
this._config = _config;
|
||||||
|
}
|
||||||
|
visitImportEqualsDeclaration(node) {
|
||||||
if (node.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference) {
|
if (node.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference) {
|
||||||
this._validateImport(node.moduleReference.expression.getText(), node);
|
this._validateImport(node.moduleReference.expression.getText(), node);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
ImportPatterns.prototype.visitImportDeclaration = function (node) {
|
visitImportDeclaration(node) {
|
||||||
this._validateImport(node.moduleSpecifier.getText(), node);
|
this._validateImport(node.moduleSpecifier.getText(), node);
|
||||||
};
|
}
|
||||||
ImportPatterns.prototype.visitCallExpression = function (node) {
|
visitCallExpression(node) {
|
||||||
_super.prototype.visitCallExpression.call(this, node);
|
super.visitCallExpression(node);
|
||||||
// import('foo') statements inside the code
|
// import('foo') statements inside the code
|
||||||
if (node.expression.kind === ts.SyntaxKind.ImportKeyword) {
|
if (node.expression.kind === ts.SyntaxKind.ImportKeyword) {
|
||||||
var path = node.arguments[0];
|
const [path] = node.arguments;
|
||||||
this._validateImport(path.getText(), node);
|
this._validateImport(path.getText(), node);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
ImportPatterns.prototype._validateImport = function (path, node) {
|
_validateImport(path, node) {
|
||||||
// remove quotes
|
// remove quotes
|
||||||
path = path.slice(1, -1);
|
path = path.slice(1, -1);
|
||||||
// resolve relative paths
|
// resolve relative paths
|
||||||
if (path[0] === '.') {
|
if (path[0] === '.') {
|
||||||
path = path_1.join(this.getSourceFile().fileName, path);
|
path = path_1.join(this.getSourceFile().fileName, path);
|
||||||
}
|
}
|
||||||
var restrictions;
|
let restrictions;
|
||||||
if (typeof this._config.restrictions === 'string') {
|
if (typeof this._config.restrictions === 'string') {
|
||||||
restrictions = [this._config.restrictions];
|
restrictions = [this._config.restrictions];
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
restrictions = this._config.restrictions;
|
restrictions = this._config.restrictions;
|
||||||
}
|
}
|
||||||
var matched = false;
|
let matched = false;
|
||||||
for (var _i = 0, restrictions_1 = restrictions; _i < restrictions_1.length; _i++) {
|
for (const pattern of restrictions) {
|
||||||
var pattern = restrictions_1[_i];
|
|
||||||
if (minimatch(path, pattern)) {
|
if (minimatch(path, pattern)) {
|
||||||
matched = true;
|
matched = true;
|
||||||
break;
|
break;
|
||||||
@@ -83,8 +64,7 @@ var ImportPatterns = /** @class */ (function (_super) {
|
|||||||
}
|
}
|
||||||
if (!matched) {
|
if (!matched) {
|
||||||
// None of the restrictions matched
|
// None of the restrictions matched
|
||||||
this.addFailure(this.createFailure(node.getStart(), node.getWidth(), "Imports violates '" + restrictions.join(' or ') + "' restrictions. See https://github.com/Microsoft/vscode/wiki/Code-Organization"));
|
this.addFailure(this.createFailure(node.getStart(), node.getWidth(), `Imports violates '${restrictions.join(' or ')}' restrictions. See https://github.com/Microsoft/vscode/wiki/Code-Organization`));
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
return ImportPatterns;
|
}
|
||||||
}(Lint.RuleWalker));
|
|
||||||
|
|||||||
@@ -3,36 +3,22 @@
|
|||||||
* Copyright (c) Microsoft Corporation. All rights reserved.
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
*--------------------------------------------------------------------------------------------*/
|
*--------------------------------------------------------------------------------------------*/
|
||||||
var __extends = (this && this.__extends) || (function () {
|
|
||||||
var extendStatics = Object.setPrototypeOf ||
|
|
||||||
({ __proto__: [] } instanceof Array && function (d, b) { d.__proto__ = b; }) ||
|
|
||||||
function (d, b) { for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; };
|
|
||||||
return function (d, b) {
|
|
||||||
extendStatics(d, b);
|
|
||||||
function __() { this.constructor = d; }
|
|
||||||
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __());
|
|
||||||
};
|
|
||||||
})();
|
|
||||||
Object.defineProperty(exports, "__esModule", { value: true });
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
var ts = require("typescript");
|
const ts = require("typescript");
|
||||||
var Lint = require("tslint");
|
const Lint = require("tslint");
|
||||||
var path_1 = require("path");
|
const path_1 = require("path");
|
||||||
var Rule = /** @class */ (function (_super) {
|
class Rule extends Lint.Rules.AbstractRule {
|
||||||
__extends(Rule, _super);
|
apply(sourceFile) {
|
||||||
function Rule() {
|
const parts = path_1.dirname(sourceFile.fileName).split(/\\|\//);
|
||||||
return _super !== null && _super.apply(this, arguments) || this;
|
const ruleArgs = this.getOptions().ruleArguments[0];
|
||||||
}
|
let config;
|
||||||
Rule.prototype.apply = function (sourceFile) {
|
for (let i = parts.length - 1; i >= 0; i--) {
|
||||||
var parts = path_1.dirname(sourceFile.fileName).split(/\\|\//);
|
|
||||||
var ruleArgs = this.getOptions().ruleArguments[0];
|
|
||||||
var config;
|
|
||||||
for (var i = parts.length - 1; i >= 0; i--) {
|
|
||||||
if (ruleArgs[parts[i]]) {
|
if (ruleArgs[parts[i]]) {
|
||||||
config = {
|
config = {
|
||||||
allowed: new Set(ruleArgs[parts[i]]).add(parts[i]),
|
allowed: new Set(ruleArgs[parts[i]]).add(parts[i]),
|
||||||
disallowed: new Set()
|
disallowed: new Set()
|
||||||
};
|
};
|
||||||
Object.keys(ruleArgs).forEach(function (key) {
|
Object.keys(ruleArgs).forEach(key => {
|
||||||
if (!config.allowed.has(key)) {
|
if (!config.allowed.has(key)) {
|
||||||
config.disallowed.add(key);
|
config.disallowed.add(key);
|
||||||
}
|
}
|
||||||
@@ -44,58 +30,54 @@ var Rule = /** @class */ (function (_super) {
|
|||||||
return [];
|
return [];
|
||||||
}
|
}
|
||||||
return this.applyWithWalker(new LayeringRule(sourceFile, config, this.getOptions()));
|
return this.applyWithWalker(new LayeringRule(sourceFile, config, this.getOptions()));
|
||||||
};
|
|
||||||
return Rule;
|
|
||||||
}(Lint.Rules.AbstractRule));
|
|
||||||
exports.Rule = Rule;
|
|
||||||
var LayeringRule = /** @class */ (function (_super) {
|
|
||||||
__extends(LayeringRule, _super);
|
|
||||||
function LayeringRule(file, config, opts) {
|
|
||||||
var _this = _super.call(this, file, opts) || this;
|
|
||||||
_this._config = config;
|
|
||||||
return _this;
|
|
||||||
}
|
}
|
||||||
LayeringRule.prototype.visitImportEqualsDeclaration = function (node) {
|
}
|
||||||
|
exports.Rule = Rule;
|
||||||
|
class LayeringRule extends Lint.RuleWalker {
|
||||||
|
constructor(file, config, opts) {
|
||||||
|
super(file, opts);
|
||||||
|
this._config = config;
|
||||||
|
}
|
||||||
|
visitImportEqualsDeclaration(node) {
|
||||||
if (node.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference) {
|
if (node.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference) {
|
||||||
this._validateImport(node.moduleReference.expression.getText(), node);
|
this._validateImport(node.moduleReference.expression.getText(), node);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
LayeringRule.prototype.visitImportDeclaration = function (node) {
|
visitImportDeclaration(node) {
|
||||||
this._validateImport(node.moduleSpecifier.getText(), node);
|
this._validateImport(node.moduleSpecifier.getText(), node);
|
||||||
};
|
}
|
||||||
LayeringRule.prototype.visitCallExpression = function (node) {
|
visitCallExpression(node) {
|
||||||
_super.prototype.visitCallExpression.call(this, node);
|
super.visitCallExpression(node);
|
||||||
// import('foo') statements inside the code
|
// import('foo') statements inside the code
|
||||||
if (node.expression.kind === ts.SyntaxKind.ImportKeyword) {
|
if (node.expression.kind === ts.SyntaxKind.ImportKeyword) {
|
||||||
var path = node.arguments[0];
|
const [path] = node.arguments;
|
||||||
this._validateImport(path.getText(), node);
|
this._validateImport(path.getText(), node);
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
LayeringRule.prototype._validateImport = function (path, node) {
|
_validateImport(path, node) {
|
||||||
// remove quotes
|
// remove quotes
|
||||||
path = path.slice(1, -1);
|
path = path.slice(1, -1);
|
||||||
if (path[0] === '.') {
|
if (path[0] === '.') {
|
||||||
path = path_1.join(path_1.dirname(node.getSourceFile().fileName), path);
|
path = path_1.join(path_1.dirname(node.getSourceFile().fileName), path);
|
||||||
}
|
}
|
||||||
var parts = path_1.dirname(path).split(/\\|\//);
|
const parts = path_1.dirname(path).split(/\\|\//);
|
||||||
for (var i = parts.length - 1; i >= 0; i--) {
|
for (let i = parts.length - 1; i >= 0; i--) {
|
||||||
var part = parts[i];
|
const part = parts[i];
|
||||||
if (this._config.allowed.has(part)) {
|
if (this._config.allowed.has(part)) {
|
||||||
// GOOD - same layer
|
// GOOD - same layer
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
if (this._config.disallowed.has(part)) {
|
if (this._config.disallowed.has(part)) {
|
||||||
// BAD - wrong layer
|
// BAD - wrong layer
|
||||||
var message = "Bad layering. You are not allowed to access '" + part + "' from here, allowed layers are: [" + LayeringRule._print(this._config.allowed) + "]";
|
const message = `Bad layering. You are not allowed to access '${part}' from here, allowed layers are: [${LayeringRule._print(this._config.allowed)}]`;
|
||||||
this.addFailure(this.createFailure(node.getStart(), node.getWidth(), message));
|
this.addFailure(this.createFailure(node.getStart(), node.getWidth(), message));
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
};
|
}
|
||||||
LayeringRule._print = function (set) {
|
static _print(set) {
|
||||||
var r = [];
|
const r = [];
|
||||||
set.forEach(function (e) { return r.push(e); });
|
set.forEach(e => r.push(e));
|
||||||
return r.join(', ');
|
return r.join(', ');
|
||||||
};
|
}
|
||||||
return LayeringRule;
|
}
|
||||||
}(Lint.RuleWalker));
|
|
||||||
|
|||||||
@@ -16,9 +16,9 @@ export class Rule extends Lint.Rules.AbstractRule {
|
|||||||
public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
|
public apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
|
||||||
|
|
||||||
const parts = dirname(sourceFile.fileName).split(/\\|\//);
|
const parts = dirname(sourceFile.fileName).split(/\\|\//);
|
||||||
let ruleArgs = this.getOptions().ruleArguments[0];
|
const ruleArgs = this.getOptions().ruleArguments[0];
|
||||||
|
|
||||||
let config: Config;
|
let config: Config | undefined;
|
||||||
for (let i = parts.length - 1; i >= 0; i--) {
|
for (let i = parts.length - 1; i >= 0; i--) {
|
||||||
if (ruleArgs[parts[i]]) {
|
if (ruleArgs[parts[i]]) {
|
||||||
config = {
|
config = {
|
||||||
@@ -26,8 +26,8 @@ export class Rule extends Lint.Rules.AbstractRule {
|
|||||||
disallowed: new Set<string>()
|
disallowed: new Set<string>()
|
||||||
};
|
};
|
||||||
Object.keys(ruleArgs).forEach(key => {
|
Object.keys(ruleArgs).forEach(key => {
|
||||||
if (!config.allowed.has(key)) {
|
if (!config!.allowed.has(key)) {
|
||||||
config.disallowed.add(key);
|
config!.disallowed.add(key);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
break;
|
break;
|
||||||
@@ -98,7 +98,7 @@ class LayeringRule extends Lint.RuleWalker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
static _print(set: Set<string>): string {
|
static _print(set: Set<string>): string {
|
||||||
let r: string[] = [];
|
const r: string[] = [];
|
||||||
set.forEach(e => r.push(e));
|
set.forEach(e => r.push(e));
|
||||||
return r.join(', ');
|
return r.join(', ');
|
||||||
}
|
}
|
||||||
|
|||||||
22
build/lib/tslint/noNewBufferRule.js
Normal file
22
build/lib/tslint/noNewBufferRule.js
Normal file
@@ -0,0 +1,22 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const ts = require("typescript");
|
||||||
|
const Lint = require("tslint");
|
||||||
|
class Rule extends Lint.Rules.AbstractRule {
|
||||||
|
apply(sourceFile) {
|
||||||
|
return this.applyWithWalker(new NewBufferRuleWalker(sourceFile, this.getOptions()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.Rule = Rule;
|
||||||
|
class NewBufferRuleWalker extends Lint.RuleWalker {
|
||||||
|
visitNewExpression(node) {
|
||||||
|
if (node.expression.kind === ts.SyntaxKind.Identifier && node.expression && node.expression.text === 'Buffer') {
|
||||||
|
this.addFailureAtNode(node, '`new Buffer` is deprecated. Consider Buffer.From or Buffer.alloc instead.');
|
||||||
|
}
|
||||||
|
super.visitNewExpression(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
23
build/lib/tslint/noNewBufferRule.ts
Normal file
23
build/lib/tslint/noNewBufferRule.ts
Normal file
@@ -0,0 +1,23 @@
|
|||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
|
||||||
|
import * as ts from 'typescript';
|
||||||
|
import * as Lint from 'tslint';
|
||||||
|
|
||||||
|
export class Rule extends Lint.Rules.AbstractRule {
|
||||||
|
apply(sourceFile: ts.SourceFile): Lint.RuleFailure[] {
|
||||||
|
return this.applyWithWalker(new NewBufferRuleWalker(sourceFile, this.getOptions()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
class NewBufferRuleWalker extends Lint.RuleWalker {
|
||||||
|
visitNewExpression(node: ts.NewExpression) {
|
||||||
|
if (node.expression.kind === ts.SyntaxKind.Identifier && node.expression && (node.expression as ts.Identifier).text === 'Buffer') {
|
||||||
|
this.addFailureAtNode(node, '`new Buffer` is deprecated. Consider Buffer.From or Buffer.alloc instead.');
|
||||||
|
}
|
||||||
|
|
||||||
|
super.visitNewExpression(node);
|
||||||
|
}
|
||||||
|
}
|
||||||
57
build/lib/tslint/noStandaloneEditorRule.js
Normal file
57
build/lib/tslint/noStandaloneEditorRule.js
Normal file
@@ -0,0 +1,57 @@
|
|||||||
|
"use strict";
|
||||||
|
/*---------------------------------------------------------------------------------------------
|
||||||
|
* Copyright (c) Microsoft Corporation. All rights reserved.
|
||||||
|
* Licensed under the Source EULA. See License.txt in the project root for license information.
|
||||||
|
*--------------------------------------------------------------------------------------------*/
|
||||||
|
Object.defineProperty(exports, "__esModule", { value: true });
|
||||||
|
const ts = require("typescript");
|
||||||
|
const Lint = require("tslint");
|
||||||
|
const path_1 = require("path");
|
||||||
|
class Rule extends Lint.Rules.AbstractRule {
|
||||||
|
apply(sourceFile) {
|
||||||
|
if (/vs(\/|\\)editor/.test(sourceFile.fileName)) {
|
||||||
|
// the vs/editor folder is allowed to use the standalone editor
|
||||||
|
return [];
|
||||||
|
}
|
||||||
|
return this.applyWithWalker(new NoStandaloneEditorRuleWalker(sourceFile, this.getOptions()));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
exports.Rule = Rule;
|
||||||
|
class NoStandaloneEditorRuleWalker extends Lint.RuleWalker {
|
||||||
|
constructor(file, opts) {
|
||||||
|
super(file, opts);
|
||||||
|
}
|
||||||
|
visitImportEqualsDeclaration(node) {
|
||||||
|
if (node.moduleReference.kind === ts.SyntaxKind.ExternalModuleReference) {
|
||||||
|
this._validateImport(node.moduleReference.expression.getText(), node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
visitImportDeclaration(node) {
|
||||||
|
this._validateImport(node.moduleSpecifier.getText(), node);
|
||||||
|
}
|
||||||
|
visitCallExpression(node) {
|
||||||
|
super.visitCallExpression(node);
|
||||||
|
// import('foo') statements inside the code
|
||||||
|
if (node.expression.kind === ts.SyntaxKind.ImportKeyword) {
|
||||||
|
const [path] = node.arguments;
|
||||||
|
this._validateImport(path.getText(), node);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
// {{SQL CARBON EDIT}} - Rename node argument to _node to prevent errors since it is not used
|
||||||
|
_validateImport(path, _node) {
|
||||||
|
// remove quotes
|
||||||
|
path = path.slice(1, -1);
|
||||||
|
// resolve relative paths
|
||||||
|
if (path[0] === '.') {
|
||||||
|
path = path_1.join(this.getSourceFile().fileName, path);
|
||||||
|
}
|
||||||
|
if (/vs(\/|\\)editor(\/|\\)standalone/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)common(\/|\\)standalone/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.api/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.main/.test(path)
|
||||||
|
|| /vs(\/|\\)editor(\/|\\)editor.worker/.test(path)) {
|
||||||
|
// {{SQL CARBON EDIT}}
|
||||||
|
//this.addFailure(this.createFailure(node.getStart(), node.getWidth(), `Not allowed to import standalone editor modules. See https://github.com/Microsoft/vscode/wiki/Code-Organization`));
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user