Compare commits
1732 Commits
9.1.5
...
zone.js-0.
Author | SHA1 | Date | |
---|---|---|---|
a38293d213 | |||
4dc8d83d84 | |||
492e236ae6 | |||
34b74cecb6 | |||
81aa119739 | |||
49197d12a0 | |||
9ec2bad4dc | |||
e8d47c2d41 | |||
765fa337e3 | |||
6570292672 | |||
4610093c87 | |||
a3812c6cbd | |||
96f59f64a0 | |||
5bda62c51d | |||
f9f3c54c9a | |||
7669827436 | |||
178a0437b7 | |||
34dbba4a90 | |||
ef608bff83 | |||
06d0d8e31d | |||
60f761b4c2 | |||
93437bbc16 | |||
85be258845 | |||
56ab6d56e9 | |||
6e18d2dacc | |||
9bfb508b87 | |||
497af77d7a | |||
822b838fbc | |||
ac0016cd82 | |||
eb9eebbb45 | |||
aee2d3f994 | |||
8f1317f06f | |||
a83693ddd9 | |||
dd66aa290a | |||
0e5a945ed4 | |||
90e9574ac7 | |||
cdf642b609 | |||
a5d8d03edb | |||
5cfe81f919 | |||
0ec7043490 | |||
c4becca0e4 | |||
b0a8b69ae8 | |||
93ee05d92a | |||
783a5bd7bb | |||
c6350116b5 | |||
898be92f70 | |||
f6d5cdfbd7 | |||
5913e5c4e8 | |||
929e0df377 | |||
c53f19ac47 | |||
ffc3332dcd | |||
8fd25d9614 | |||
a051d97429 | |||
0001dbdede | |||
cbef410e3f | |||
db37c17e02 | |||
61e6ca9b1f | |||
78a33eeef9 | |||
584f37cfca | |||
7d4929918d | |||
b642f0bf45 | |||
520911efd4 | |||
0875fd2360 | |||
c4266fb729 | |||
5ce71e0fbc | |||
437e563507 | |||
b0b4953fd6 | |||
72f4497f11 | |||
96dd78e0c6 | |||
c9b36f9150 | |||
c76dda6aeb | |||
6947ceaf44 | |||
5471789664 | |||
952710b43b | |||
2736a43ecb | |||
f4fee86f77 | |||
47eab61cad | |||
0accd1e68d | |||
2c0282f4c2 | |||
6650d71fe2 | |||
65997c0649 | |||
1d6e67478e | |||
5038e5741b | |||
11485d96fb | |||
acfce0ba1b | |||
ed81588c79 | |||
87274e3eec | |||
a5a7845593 | |||
f35e9158b2 | |||
cee393d0da | |||
118f37b174 | |||
e930b0cd19 | |||
62945efab7 | |||
4cc5982e58 | |||
a84976fdfc | |||
bf717b1a31 | |||
9f3388e491 | |||
b2342d4116 | |||
7f689a291a | |||
ca4ef61c06 | |||
4a1c12c773 | |||
0e733f3689 | |||
0a16e60afa | |||
f84b3786dc | |||
4b06ef75aa | |||
42a164f522 | |||
049b453149 | |||
dace4aacb6 | |||
63624a2d46 | |||
4604fe9ed2 | |||
01ec0f0933 | |||
de66818cf6 | |||
4ede190571 | |||
d4a51ae594 | |||
74a9e126d5 | |||
293270696b | |||
f28b451b0c | |||
5fa012efb8 | |||
aeec223db1 | |||
f2fca6d58e | |||
72755eadd2 | |||
3975dd90a6 | |||
05672ab136 | |||
70e13dc31e | |||
246de9aaad | |||
07a66fc4c2 | |||
6e0a8eb268 | |||
21dfb33b27 | |||
3c474ecf56 | |||
ee03408c44 | |||
d8c05347c3 | |||
faa81dcdd1 | |||
e10b3e22ac | |||
57f8dd2978 | |||
bc69182bdd | |||
82d54fe8c3 | |||
a48c8edd83 | |||
75e90fa456 | |||
26afcdd86c | |||
f3150223da | |||
f4f1bcc997 | |||
4beaddcb83 | |||
89c5255b8c | |||
5dbf357224 | |||
3bbbf39b58 | |||
904adb72d2 | |||
4fe673d518 | |||
d3bd00b7bf | |||
c214cad2b4 | |||
db56cf18ba | |||
f2341e2372 | |||
f7213cb57a | |||
4bce21358d | |||
6205ed0fcc | |||
d66d82a9b5 | |||
889470663d | |||
ac54019315 | |||
26574a7c46 | |||
a7e1eb5312 | |||
2cc3ac0299 | |||
be98a45dd9 | |||
555ae7431d | |||
7dd0db6d4f | |||
1f5d7dc394 | |||
8c16330895 | |||
21213e1531 | |||
fb12c617a4 | |||
ea1968317e | |||
5b15e5eeae | |||
bd5e425c14 | |||
79620f5139 | |||
ac3aa046e5 | |||
23e2188192 | |||
5903e8ad65 | |||
9d04b95166 | |||
eec9f4a84e | |||
8e3710349d | |||
d1f5654f0c | |||
6ae1f198e6 | |||
1a0e7cca2d | |||
c8d757624b | |||
31e42f0947 | |||
ddc9e8e47a | |||
1e3f810f8f | |||
e8084ff906 | |||
827245fdb6 | |||
8b7acc4f8f | |||
393ce5574b | |||
2aeaedc519 | |||
8f66540152 | |||
8f11b516f8 | |||
c8958d76db | |||
f6052a915d | |||
37ed4bd9ff | |||
efe0e03fe1 | |||
ded9aeb447 | |||
b16a69c7a4 | |||
a6971ba89a | |||
93c3d8f9fd | |||
1b70dc931d | |||
3ba97ab391 | |||
e2997ed5ee | |||
bf010b9a07 | |||
387fd89b3f | |||
e991fee6bf | |||
06525cfed3 | |||
e9a8f9f705 | |||
3f9be429fc | |||
4fd635a03a | |||
53a7ed4317 | |||
2df39ee338 | |||
2b6b9c95f9 | |||
c5e178997c | |||
cb7164a236 | |||
4a9f4520ce | |||
914d7099ee | |||
e459dc7c42 | |||
fd7146cc71 | |||
5ef2c983b9 | |||
c74917a7d5 | |||
494a2f3be4 | |||
fc3b3fe39e | |||
5448e84cf0 | |||
7bd18fca19 | |||
5a86fb33ba | |||
5db84d7221 | |||
eb32b6bd6b | |||
b2579d43cd | |||
9fb541787c | |||
812615bb99 | |||
2ede800f0c | |||
f96dcc5ce0 | |||
372a6cf8d7 | |||
b9dce19b3d | |||
964ac1542a | |||
8b01d42e5d | |||
474ecf6d00 | |||
caa7f9808f | |||
69bb49e530 | |||
9dccaa9570 | |||
e1c11a36c7 | |||
c1b47bcfaa | |||
d7ff8d765c | |||
3a598cf5ed | |||
b041c118e3 | |||
6af638d58e | |||
9e0e763156 | |||
758d0e2045 | |||
4744c229db | |||
4dfe0fa068 | |||
3b919ef10f | |||
7b2aac97df | |||
daf8b7f100 | |||
5f815c0565 | |||
c7d5555dfb | |||
323be39297 | |||
0dd859757a | |||
239968d2f1 | |||
cf9176eb46 | |||
2f6777df18 | |||
4ca1c736bb | |||
f2c00aab8d | |||
9aff09b827 | |||
e790c8547e | |||
b627f7f02e | |||
7f6f8bbffb | |||
e4f4d18e7e | |||
837889f0a4 | |||
bd7d8744fa | |||
4c8766573d | |||
8422633b8a | |||
37297cfed7 | |||
19d543f71e | |||
f979914d4e | |||
40975e06c6 | |||
ffe89fb07d | |||
15ea811f05 | |||
4baabf9cd3 | |||
7244e1b4e3 | |||
b1682526dd | |||
75610505c6 | |||
ba3f4c26bb | |||
c8f056beb6 | |||
a2068523fd | |||
145ab3d7e0 | |||
3082f7378b | |||
297b123151 | |||
a93605f2a4 | |||
15dfd3439a | |||
123bff7cb6 | |||
6158dc16b4 | |||
b0a43872a8 | |||
856e74ac98 | |||
6ae3b68acf | |||
49f27e31ed | |||
1a62f74496 | |||
2b1b7180db | |||
fdd4fa0009 | |||
984ed39195 | |||
0c0c54d615 | |||
dfbfabc052 | |||
f3f6a42342 | |||
e498ea9b5a | |||
a91f0f6b82 | |||
d5ddb9f340 | |||
b68fab547a | |||
16a560119a | |||
88d7bb8386 | |||
2d6105a784 | |||
95b8a8706a | |||
d92a0dd72f | |||
55485713a3 | |||
d3169c533e | |||
e4424863c2 | |||
d795a00137 | |||
7fb388f929 | |||
02c6bff9cf | |||
ef28e15884 | |||
a33d630a21 | |||
c4b8964424 | |||
dd8d8c8289 | |||
129107191c | |||
722699fb0c | |||
5614258cc7 | |||
e62a918542 | |||
49ee90b1b5 | |||
7849fdde09 | |||
97adc27207 | |||
41bc2701c4 | |||
a765530277 | |||
5b33798796 | |||
44074499dc | |||
ba54671993 | |||
a85109fd72 | |||
85a2626620 | |||
d192c87f6a | |||
3817e5f1df | |||
171a0d0696 | |||
a1c1c450dc | |||
fd44d84a33 | |||
f0688b4d18 | |||
b9ca6d20cc | |||
e00535a2a4 | |||
593bd594e3 | |||
284c70ee9d | |||
78e1ecb161 | |||
3934f0a833 | |||
297c060ae7 | |||
077f51685a | |||
e162da0753 | |||
354138eba9 | |||
6768fe9927 | |||
57c442f930 | |||
f667e374a9 | |||
15207e3c9c | |||
66129f8ea6 | |||
da14b72550 | |||
27cc56b359 | |||
6acea54f62 | |||
2d52c80332 | |||
03447ba52f | |||
8f349b2375 | |||
19598b47ca | |||
f56ece4fdc | |||
cf2e8b99a8 | |||
c4556db9f5 | |||
a46e0e48a3 | |||
9e77bd3087 | |||
26f28200bf | |||
ce1efc1af2 | |||
d1415162cb | |||
db21c4fb44 | |||
281865bbcf | |||
3406ec15a4 | |||
85951a0465 | |||
0ae00bb1f7 | |||
1373a98e25 | |||
1ed6913b8b | |||
3c4b8b97c1 | |||
f9421184ef | |||
c6ebb77cec | |||
a69507a0ad | |||
886f58d4fe | |||
18f84a0328 | |||
b0ca3cd0c4 | |||
3d77b64fc3 | |||
f645d26e3f | |||
6d9bfb8368 | |||
7997fc5f97 | |||
3cb2a79399 | |||
d896c33b0e | |||
19a484302d | |||
ded075a79c | |||
ba95b79a21 | |||
4faac78e32 | |||
4360eed9b7 | |||
c880e393e9 | |||
b0c79f2373 | |||
a32a317ea1 | |||
bfb7eec698 | |||
7e0b3fd953 | |||
7a6a061a9e | |||
109555b33a | |||
bf31ef29f6 | |||
40096bee00 | |||
45a73dddfd | |||
687477279b | |||
4007422cc6 | |||
1150649139 | |||
7869de6136 | |||
2c4a98a285 | |||
92ff6d93eb | |||
83ace4ed30 | |||
926ffcd8ac | |||
97475d7408 | |||
a29f9a9fb3 | |||
9f28f82598 | |||
261f689e9b | |||
1d9873c44c | |||
d9da7e5a18 | |||
79d8795633 | |||
3e57ca1d98 | |||
c2d017de83 | |||
7baa7ebfc4 | |||
4e5286180b | |||
73001b42fe | |||
c90eb5450d | |||
3e97435f1c | |||
1c7e5cef3e | |||
2cb3d58b42 | |||
44bb85ade4 | |||
50f4d8a1ce | |||
fdea1804d6 | |||
1d8c5d88cd | |||
a68f1a78a7 | |||
86e11f1110 | |||
5da1934115 | |||
86e7cd8117 | |||
e6ee7c2aeb | |||
54687f7765 | |||
59c234cfb4 | |||
a6f3cd93a9 | |||
d9fea857db | |||
03dbcc7a56 | |||
c142b071eb | |||
71acf9dd49 | |||
f5a148b1b7 | |||
4f28192d62 | |||
0fc2bef0cd | |||
f5d1e9a2d1 | |||
036a2faf02 | |||
5be4edfa17 | |||
38d6596742 | |||
0a7a5e3aff | |||
d5fabc303d | |||
ebc0e46501 | |||
3487b549fd | |||
52c7a4bfc6 | |||
827ba05914 | |||
b2857b4e3a | |||
5d5caf21b8 | |||
c1bc070b40 | |||
930eeaf177 | |||
2dd29fbae7 | |||
9613660fee | |||
c0523fc3b4 | |||
de1cffb23b | |||
31f4557621 | |||
7723bfd9ba | |||
e8ea839df8 | |||
90cec40cce | |||
4036281007 | |||
164cd274a4 | |||
fedcfec346 | |||
618cb32407 | |||
4aee0087ea | |||
0681a20d28 | |||
fb06903237 | |||
ecc6fd0d28 | |||
80cab26023 | |||
841dfa68f9 | |||
f0af387f6c | |||
14e90bef58 | |||
db3a21b382 | |||
b8351f3b10 | |||
81053d3160 | |||
bdba1a062d | |||
23f855b300 | |||
94a3e0e81d | |||
9cbde86534 | |||
18e474f522 | |||
cb3db0d31b | |||
d36828a7a1 | |||
f18e2d5898 | |||
375f0a6f67 | |||
281b647f15 | |||
0fc44e0436 | |||
201a546af8 | |||
6e643d9874 | |||
4985267211 | |||
b48cc6ead5 | |||
874792dc43 | |||
e7da4040d6 | |||
2a643e1ab6 | |||
364284b0dc | |||
956b25a100 | |||
8017ca4db3 | |||
22f1ac3e37 | |||
4ee5e730ab | |||
6442875c99 | |||
8f24bc9443 | |||
ac461e1efd | |||
f245c6bb15 | |||
68a9a01a64 | |||
8cd4099db9 | |||
0b54c0c6b4 | |||
1ec609946f | |||
7ad32649c0 | |||
9ad69c1503 | |||
9af2de821c | |||
0270020ac2 | |||
6b662d10c1 | |||
55fd725e74 | |||
f77fd5e02a | |||
63ba74fe4e | |||
aaa1d8e2fe | |||
dbfb50e9f4 | |||
bee44b3359 | |||
723a9ff095 | |||
e472f5f688 | |||
8373b720f3 | |||
301513311e | |||
64cf087ae5 | |||
fec9dcbeb0 | |||
e0e5c9f195 | |||
cfe424e875 | |||
3b9c802dee | |||
ca07da4563 | |||
81c3e809aa | |||
be96510ce9 | |||
cb05c0102f | |||
5f90b64328 | |||
71079ce47e | |||
ca798804b2 | |||
b071495f92 | |||
d5f819ebc1 | |||
1388c1761f | |||
fb8f4b4d72 | |||
f42e6ce917 | |||
175c79d1d8 | |||
945751e2e8 | |||
b769771d60 | |||
a80f654af9 | |||
aa847cb014 | |||
8763d8201c | |||
9f7a37b4e9 | |||
773f7908c0 | |||
f4ced74e3a | |||
8366effeec | |||
5f2e475abf | |||
aa3520eb7d | |||
823dd5b341 | |||
d6d7caa2a8 | |||
dcf7baf3d1 | |||
4d17418569 | |||
a2e069fdda | |||
28534d83ee | |||
a6292faa97 | |||
e2e5f83869 | |||
71138f6004 | |||
fa0104017a | |||
80b67e02b7 | |||
18098d38b8 | |||
9514fd9080 | |||
2e9fdbde9e | |||
df76a2048b | |||
3d156162af | |||
5dc8d287aa | |||
6da9e5851a | |||
250e299dc3 | |||
8f708b561c | |||
e34c33cd46 | |||
6d8c73a4d6 | |||
6ff28ac944 | |||
0de93fd402 | |||
445ac15a78 | |||
856db56cca | |||
354e66efad | |||
702958e968 | |||
df7f3b04b5 | |||
7525f3afc1 | |||
570d156ce4 | |||
26be5b4994 | |||
3821dc5f6c | |||
18cd1a9937 | |||
0551fbdf88 | |||
dca4443a8e | |||
2a745c8df8 | |||
a18f82b458 | |||
696a9b01ef | |||
d7c043ba35 | |||
0c2490368e | |||
bb88c9fa3d | |||
8227b56f9e | |||
1609815743 | |||
763023472b | |||
ba175be41f | |||
f0766a4474 | |||
6f0f0d3ea2 | |||
576e329f33 | |||
585ef2bdd7 | |||
2fcabe1557 | |||
192ef42304 | |||
8fbf40bf40 | |||
8f074296c2 | |||
e49b053dac | |||
87baa06cc6 | |||
ff9f4de4f1 | |||
3a46c2da7c | |||
bfd13c06e1 | |||
5303773daf | |||
ba11f7b90b | |||
1db4f508e6 | |||
6334749d2c | |||
3c7359f026 | |||
8aa29438ac | |||
fc709423f2 | |||
3012a8e71c | |||
77f38d3be1 | |||
7c0f11789b | |||
0a791e4a50 | |||
d89200ad24 | |||
00b7186cb2 | |||
e8896b9de3 | |||
6f6102d8ad | |||
4c7f233fa8 | |||
fd51e01335 | |||
3a525d196b | |||
1eebb7f189 | |||
8effc83b92 | |||
7f8c2225f2 | |||
887c350f9d | |||
103a95c182 | |||
1b17722091 | |||
b280d54470 | |||
d96824acdb | |||
9ebd461a22 | |||
d8c07b83c3 | |||
8f73169979 | |||
3c0424e7e0 | |||
de14b2c670 | |||
c573d91285 | |||
16c7441c2f | |||
736f6337b2 | |||
9c8bc4a239 | |||
cf4da82ac3 | |||
57575e379f | |||
28c3e2d15d | |||
2a45b932e2 | |||
5a12ab4a13 | |||
8a543d8b50 | |||
9893576ef0 | |||
af80bdb470 | |||
b4449e35bf | |||
3d0be5213e | |||
be3e7050d5 | |||
cf98db28d5 | |||
5621452ff0 | |||
b0676e8fab | |||
b142283ba2 | |||
e79b6c31f9 | |||
65cc0c8bd6 | |||
03a6252123 | |||
174aac68f7 | |||
5d3ba8dec7 | |||
fbe1a9cbaa | |||
8f7d89436f | |||
96aa14df01 | |||
2b6ab57d78 | |||
b65b6163f7 | |||
f74cfadf64 | |||
8e5969bb52 | |||
8fdfa7b604 | |||
2fdc18b42c | |||
1296003445 | |||
4dfc3fe6a2 | |||
67e3ecc7e3 | |||
9821443150 | |||
c91cdea0cd | |||
6a3e68b606 | |||
1822cbcd46 | |||
a71f114ba4 | |||
253337dc0a | |||
6e2db228af | |||
cce5583e75 | |||
307db74e93 | |||
88d4b269b5 | |||
ee22aa592e | |||
dd09fb5348 | |||
d0060dcfdc | |||
7b2e2f5d91 | |||
b518b30dae | |||
51aa4aa1c3 | |||
8bb8f98c28 | |||
3c1866b5bb | |||
062b8d90af | |||
8df888dfb4 | |||
778ad3776a | |||
5a733629b5 | |||
65da87722d | |||
937b89c230 | |||
b3d81a837b | |||
7491b854b3 | |||
a1c9f7cdb3 | |||
d88711c2fc | |||
5e742d29d0 | |||
970d10c671 | |||
8851ba9c9d | |||
7f82a2c1c8 | |||
a9910f5991 | |||
ad7046b934 | |||
d72b1e44c6 | |||
eae13e42f3 | |||
3373453736 | |||
4a6dcd006b | |||
7c3c8d6d10 | |||
655da32837 | |||
5b31a0a294 | |||
5d3d8b8330 | |||
c8c74153b1 | |||
9dc5e8e7e2 | |||
1a7a7360b0 | |||
8edf5ba29d | |||
72f1eec3ad | |||
136acdfab6 | |||
095cfd961d | |||
38a7021d5e | |||
b3b03c35b5 | |||
fd45f7485d | |||
58f6079873 | |||
e382632473 | |||
cf9a47ba53 | |||
56dd3e77ac | |||
6c9401c338 | |||
019a696a6a | |||
8b25a64200 | |||
bd71f10234 | |||
e0b35bfc18 | |||
c1539b16ae | |||
737506e79c | |||
469aba0140 | |||
d8c47b971c | |||
24b420527a | |||
bf641e1b4b | |||
406f801b70 | |||
c8e77d8536 | |||
6ea2d1e20e | |||
09eee5b312 | |||
904ebfebf3 | |||
545f1dbac9 | |||
b00121c9a6 | |||
45d79efc3f | |||
1d9e56eba0 | |||
e7c722574f | |||
b358495a6c | |||
f4fac406b9 | |||
5fd2c8f2d6 | |||
421e807f80 | |||
df8b387570 | |||
f01b0337d2 | |||
4ec3026a9a | |||
9021d3f5e1 | |||
81542b3b72 | |||
9185c6e971 | |||
69472a1ed0 | |||
10aba15154 | |||
36dd817913 | |||
0eaa084ced | |||
62e19c8813 | |||
95669df4c3 | |||
6b311552f0 | |||
66947cf9fa | |||
a259a84d3f | |||
d1aa4678be | |||
04c220bbdf | |||
72d6032fa4 | |||
53d4859f48 | |||
f66f4a1b3f | |||
88d68d2d21 | |||
4783a071f3 | |||
9322b9a060 | |||
9bd4b74b06 | |||
e6afcf1f94 | |||
4b4b74548d | |||
1550663b9e | |||
c40cbecdd1 | |||
209a365511 | |||
fb735d625b | |||
d19ef6534f | |||
667aba7508 | |||
d380e93b82 | |||
2156beed0c | |||
b98314e306 | |||
e50c7dcc4c | |||
6b731a067a | |||
0a3dbc1e8a | |||
b24a24ec58 | |||
13ef5d6c7d | |||
54373cc895 | |||
bbe3543c69 | |||
bdbbff6a1a | |||
f81d3f6199 | |||
d0c0f25a48 | |||
1f796e9479 | |||
1237d9cbea | |||
b3969e9654 | |||
6eb868b63a | |||
82a2207f4a | |||
289a96b078 | |||
cb2ab26296 | |||
79850983e6 | |||
fc7e77934f | |||
90b93da743 | |||
ec32eba02c | |||
596fbb3f06 | |||
aed6b131bb | |||
d148fdccf2 | |||
1801d0c650 | |||
a5c30733cb | |||
d7dd2959c8 | |||
a5ffca0576 | |||
196bfa8fae | |||
1d5ca55aab | |||
e0033f1e10 | |||
9206a26e1d | |||
11dd2bef2d | |||
6fc80690ae | |||
f6d2705942 | |||
79dc14199b | |||
71956250dd | |||
e84539f809 | |||
873330b82c | |||
a177b1b7b1 | |||
435a28e937 | |||
c2b4d92708 | |||
a87951a28f | |||
6b565ba8f2 | |||
c29f830c4b | |||
cde4653c62 | |||
e07d940b9b | |||
ee1526029f | |||
eba9dd364e | |||
78a44768e0 | |||
98c047b763 | |||
543b679762 | |||
c00f4ab2ae | |||
2038568f3e | |||
c509243af5 | |||
d4544da804 | |||
b950d4675f | |||
ae5257cda6 | |||
8fd8143ab8 | |||
acf3cff9ee | |||
c5b125b7db | |||
fc5c34d1b8 | |||
0879d2e85d | |||
83fe963a4b | |||
e0eeb4afcb | |||
c942662d79 | |||
6341a837c1 | |||
f954ab6f10 | |||
3ee666580a | |||
dbc2364d16 | |||
eee2fd22e0 | |||
638dd15f61 | |||
9c668e091f | |||
b2816a1536 | |||
2cbc429291 | |||
4c7f32f28c | |||
8572e885b4 | |||
0e3e9cd382 | |||
9118f49a63 | |||
d37049a2a2 | |||
d12cdb5019 | |||
ce879fc416 | |||
712f1bd0b7 | |||
d2fb552116 | |||
5103d908c8 | |||
9318e23e64 | |||
290bc7334d | |||
190561d8a6 | |||
ddb0a4e2e5 | |||
07a07e34bc | |||
dda3f49952 | |||
decd95e7f0 | |||
6abb8d0d91 | |||
2b2146bc58 | |||
3a698e2d08 | |||
8a74508130 | |||
ef1fb6dee4 | |||
e36d5b201a | |||
77b62a52c0 | |||
616543ded0 | |||
2170ea270a | |||
80d0067048 | |||
5218916a7e | |||
1c1eb3045c | |||
4967997536 | |||
666e6d15fa | |||
f3ec37ebbf | |||
cc3b1ebd96 | |||
29490cce30 | |||
bedc0451a0 | |||
a0595f4b4f | |||
8924ec1474 | |||
4481bebb38 | |||
f5bbfd7b8c | |||
41ce5240f2 | |||
243824ef74 | |||
c95802f26f | |||
71c0363bb5 | |||
e03adaf9b0 | |||
38dfbc775f | |||
5229809adb | |||
9d88ca07f8 | |||
97383488e8 | |||
cb566add3c | |||
5c40fd65fa | |||
2b53b07c70 | |||
6de5a12a9d | |||
3a418ab63b | |||
c8c0063499 | |||
34259e90cb | |||
d0c69d207c | |||
1f0818002c | |||
fd65958b88 | |||
12f674f404 | |||
413a0fb1ae | |||
85abfd2171 | |||
1601ee6f6a | |||
6898eab946 | |||
62a85f5e55 | |||
a8af8551ec | |||
7e0eccc4ef | |||
2a970a0af8 | |||
bd7f440357 | |||
d0437b3be0 | |||
1d844b9bd8 | |||
53e95233c3 | |||
879a674420 | |||
71f008f906 | |||
1197965e69 | |||
8154bbd538 | |||
f5e39999d7 | |||
ff33ab1379 | |||
7521834296 | |||
1185aa07a3 | |||
ceca5dded5 | |||
2a145f2463 | |||
e0dfa42d6e | |||
cc37af2314 | |||
87a679b210 | |||
a7359d494a | |||
66e6b932d8 | |||
cc49a91de7 | |||
300c2fec9c | |||
a7faa6bb65 | |||
bcc0a035cc | |||
e99bcbb4d4 | |||
adc9d5cdcb | |||
d330cd85ac | |||
09d6dc50ef | |||
7ac166ff08 | |||
ae4f81cbab | |||
c1fdfd4f14 | |||
62e4acc3d1 | |||
1091ddbb8e | |||
b45acb8d32 | |||
104abe04ba | |||
1bc807c81a | |||
d3b5e5696f | |||
34e4098e85 | |||
8dcf618411 | |||
7cc7955b5d | |||
a075260751 | |||
aba33de5f5 | |||
fe0782afa9 | |||
3545520e81 | |||
5ea9119322 | |||
2e355fd4d3 | |||
12f2101d08 | |||
d3a817549b | |||
c5493c192c | |||
d17084bf97 | |||
f150a304e8 | |||
886e3ebcca | |||
bf682d73d4 | |||
8f3695e20e | |||
829ddf95e5 | |||
fb10f62efc | |||
8197557fcf | |||
e7a0e87c41 | |||
ab9bc8a9ec | |||
469d2b4640 | |||
31796e8e2f | |||
284123c6ba | |||
7259208893 | |||
7e5f6c2dc1 | |||
97dc85ba5e | |||
a937889c3b | |||
aa8f1d569b | |||
5dba3bf1fd | |||
6651b4171d | |||
8c682c52b1 | |||
e5b09cc49a | |||
b199ef6bfc | |||
583a9d38a1 | |||
1fce6d6bae | |||
39f973430a | |||
20346ff192 | |||
bd9c1e6cfc | |||
d76a872efb | |||
a398d6af45 | |||
e836eaf448 | |||
ae364864f6 | |||
cc552dd702 | |||
021dd33ed8 | |||
684726cdac | |||
7b005bb9cf | |||
401ef71ae5 | |||
0a1d078a74 | |||
35502c739c | |||
b2ccc34f9c | |||
eaa38a5adc | |||
cb1373106b | |||
f6ee911cbb | |||
a3313709ea | |||
0eacba5829 | |||
bb924b63e6 | |||
7301e70ddd | |||
7edb026619 | |||
0b7845964b | |||
55979fe0ae | |||
6280cf95b4 | |||
8d817daf78 | |||
946f1179e9 | |||
87fdd23157 | |||
713fb3b587 | |||
0cb0f66c17 | |||
db11a0ddbf | |||
779344012a | |||
650974e1b3 | |||
ed3c549063 | |||
3a116179b1 | |||
5e64c2b1df | |||
d63ecf4c5f | |||
77efddcac3 | |||
d887ba85ad | |||
0c75a06b1e | |||
aaa20093b2 | |||
5568d824dd | |||
17996bf719 | |||
2a330a60ed | |||
569d1ef583 | |||
85b6c94cc6 | |||
818d93d7e9 | |||
d4c0962c7b | |||
e31208beb1 | |||
3569fdf451 | |||
eb6ba9ac80 | |||
4e7a4543b8 | |||
753fed285c | |||
dffcca73e4 | |||
c8f7fc22c7 | |||
b2bd38699b | |||
c025357fb8 | |||
57411c85b9 | |||
07a8016118 | |||
4d69da57ca | |||
7f98b87ca0 | |||
c61decf7e5 | |||
6e7bd939f6 | |||
2021ad12cf | |||
c4f4675ebf | |||
34827559b9 | |||
65c3888d01 | |||
e648a0c4ca | |||
965a688c97 | |||
ab3f4c9fe1 | |||
40f3bb5638 | |||
a08d18a1fe | |||
64d6f35f94 | |||
caa4ab3235 | |||
06a8ad28a7 | |||
382aa50c54 | |||
044a19966d | |||
17e98198f4 | |||
561c0f81a0 | |||
4414be77c4 | |||
1b55da10b1 | |||
78ea2527a1 | |||
4456e7e4de | |||
92c436dd1a | |||
b45f336635 | |||
c3651cec0b | |||
3b52f7066b | |||
8bb741198b | |||
26849ca99d | |||
4d0e175a65 | |||
bd7393fc68 | |||
08ff8aa055 | |||
f60d159d71 | |||
6aa5bfa21a | |||
227ba625e6 | |||
e64176019a | |||
1fc7891add | |||
e7930fcc15 | |||
4b40740324 | |||
a36667d984 | |||
9791c9ecaf | |||
df082307b9 | |||
98d820030c | |||
f001aef2dc | |||
64fc8b8ee5 | |||
a62c1c441c | |||
3d154ab795 | |||
d1ea1f4c7f | |||
5aeb9a4124 | |||
ecce99470a | |||
540c29cd6b | |||
7827501d2a | |||
e28f13a102 | |||
e0002ef9ba | |||
367f6fe12d | |||
9b3ca19675 | |||
9388e47e1e | |||
171d967993 | |||
40e357411e | |||
52c7aae4df | |||
87b1aeac0f | |||
93be1f1543 | |||
cdb5d07606 | |||
3e5fa56956 | |||
cfb37b8994 | |||
a1001f2ea0 | |||
6ca3fb19fd | |||
267f844811 | |||
59e7203a40 | |||
7db177d181 | |||
3f4232a23d | |||
2a634648c2 | |||
97e13991c5 | |||
d42a912343 | |||
03fef736d6 | |||
78b8d0e1ef | |||
aedac71491 | |||
89b44d1900 | |||
2fc5ae561b | |||
cb719ee16e | |||
ed46d9ebd7 | |||
1380c5642b | |||
e3d447229d | |||
327980bf49 | |||
4c30aa8343 | |||
e7c878027a | |||
886f90516d | |||
1faf9bbeb0 | |||
325ad7eb53 | |||
362fba4bde | |||
211d33ad59 | |||
383f04b96d | |||
4e96cdc23f | |||
772c5b8f64 | |||
8f1d0c317e | |||
deac994517 | |||
b754ab298a | |||
3a4e1b8f86 | |||
a73d2a7688 | |||
009f394237 | |||
5ac5ac1dec | |||
cc1e0bbdc0 | |||
ef9f8df9ed | |||
87f951c5c1 | |||
afd58b3739 | |||
c2c14c2a1f | |||
e19930e70d | |||
e7c017cfe3 | |||
8a3493af47 | |||
318e9372c9 | |||
22d80a6780 | |||
593e07bd21 | |||
3dfc7703c2 | |||
2ca2c8fe0f | |||
8004eb0eec | |||
89995075e6 | |||
c2fa65640c | |||
2d065a32ec | |||
fcb68cc139 | |||
01d1c1a9ab | |||
1754beb59c | |||
844208f463 | |||
1689f9378b | |||
011fdfa94f | |||
6466fb20c2 | |||
3f9b3d7666 | |||
8524688a87 | |||
7f58c579f3 | |||
3d7c85b2aa | |||
55c2433171 | |||
03afa36334 | |||
05f1df3224 | |||
901db0e730 | |||
564ca9e8ec | |||
20d377c11b | |||
2c5e873da0 | |||
42a9e5ad7d | |||
cda2530df5 | |||
aaa89bb715 | |||
ea971f7098 | |||
ddaa124162 | |||
7a30153aa1 | |||
7acd33007d | |||
8a56c99f87 | |||
77c0ef38be | |||
5f64e52ed4 | |||
b2a3325258 | |||
95f429c7e2 | |||
f16ca1ce46 | |||
508c555ce2 | |||
f97d8a9cbd | |||
24ec5235a0 | |||
bbd556ee9f | |||
466df41c8f | |||
4e1b5e43fa | |||
b0e362f75b | |||
91092f668e | |||
d268d2ad85 | |||
2486db7c2b | |||
0672a0e547 | |||
9846b19986 | |||
8b79075497 | |||
2956f21d82 | |||
c8ee390d23 | |||
d7440c452a | |||
a2b8dc1cfb | |||
7ebf35c5f8 | |||
dbcaf22805 | |||
0066a1ae70 | |||
491da99abe | |||
13ba84731f | |||
b58bd2bb91 | |||
a32cbed89c | |||
c42f35eb2f | |||
2418c6aca1 | |||
90205079d7 | |||
57a868627f | |||
2cacab92e6 | |||
0520ecb7d0 | |||
047642556c | |||
9edea0bb75 | |||
ce39755937 | |||
7d3f5043e1 | |||
14c0ec97d8 | |||
45f4a47286 | |||
141fcb95a4 | |||
dbf1f6b233 | |||
5d12c19ce9 | |||
352b9c78e0 | |||
019835c721 | |||
255c2b2ff0 | |||
0731fc47e4 | |||
7ffdbc05d2 | |||
4f3ac1d983 | |||
d7c70caa4c | |||
2cddeabce0 | |||
7addc9f1a9 | |||
cb6ddfc215 | |||
681741cd13 | |||
8fe532e593 | |||
198fc6f108 | |||
8d8e419664 | |||
1e208e8c87 | |||
286fbf42c6 | |||
40025f55ad | |||
7eb1a58b26 | |||
28f3c1c96a | |||
0c8adbc4ec | |||
ed1b4a8f19 | |||
bd30c37040 | |||
eb34aa551a | |||
1142c378fd | |||
82a3bd5e8b | |||
5f3fba43fa | |||
eca2246fbc | |||
df71c7c617 | |||
c184de175d | |||
8b65946eb8 | |||
de0c71c467 | |||
39e066add1 | |||
178e750f16 | |||
14be55c9fa | |||
fdd61152c5 | |||
7cc332efe6 | |||
1eba1aaf15 | |||
4e628a887a | |||
b6bc0aeb61 | |||
77d8afb7da | |||
42d1091d6a | |||
d0280a0335 | |||
97d6d909e7 | |||
f7815cf96d | |||
9e43e4900e | |||
8ce38cac0d | |||
a10c126692 | |||
b682bd1916 | |||
26eacd4fcb | |||
fc4741f638 | |||
3f3e9b7555 | |||
53a8459d5f | |||
0ec0ff3bce | |||
f930e75a80 | |||
854bd7d0c8 | |||
e17fe90aaa | |||
0577bf0e3e | |||
4c92cf43cf | |||
c6ecdc9a81 | |||
20cc3ab37e | |||
420b9be1c1 | |||
3c6c00d1d4 | |||
6fa36e387f | |||
9bde1be5a4 | |||
040253c426 | |||
c98a4d6ddd | |||
d5293d2aa3 | |||
d578ab8f3c | |||
9dbb30f884 | |||
fafa50d97f | |||
e010f2ca54 | |||
c9e0db55f7 | |||
ecffc3557f | |||
b861e9c0ac | |||
4213e8d5f0 | |||
bab90a7709 | |||
da79e0433f | |||
1b8752e595 | |||
b3cf5b246f | |||
0a695e181e | |||
a5d1d1161b | |||
a25c3c5c3b | |||
d1a8afbbd0 | |||
f4fcb0c54c | |||
e92b81351b | |||
53805f07ba | |||
e73daa3736 | |||
eef01160f4 | |||
333abf16e4 | |||
388dc93cee | |||
fbd281c26e | |||
420c179b39 | |||
35d61c11fd | |||
e30e1325f3 | |||
fc6c3ae97d | |||
63a28d6805 | |||
b95a336f12 | |||
b4df19c029 | |||
dbd0f8e699 | |||
b7fb92a048 | |||
2ff4b357d7 | |||
1c26f40cd4 | |||
2de34770c4 | |||
0fc6ed3c4a | |||
63455b839a | |||
70b25a3d4f | |||
2200c8a87b | |||
306f46ce92 | |||
1b2d6ea11b | |||
03198de73a | |||
bb0e57eccb | |||
a468f11c7c | |||
9d2241b901 | |||
88a235de3a | |||
7bd9e09c78 | |||
42c58d9fe8 | |||
b3713a112f | |||
e037840b88 | |||
ec6b9cc17d | |||
db4c59dad9 | |||
58ea040570 | |||
6046e86506 | |||
297dab845d | |||
2cb5f59acc | |||
0f3831b105 | |||
9d9d46f52b | |||
d9c4840a9c | |||
12fcc7cafe | |||
95a407d9dd | |||
e9300c979e | |||
df274b478e | |||
f8941a5b6b | |||
38f805cd06 | |||
98931bf9b5 | |||
9b85b533ff | |||
d805526659 | |||
ee435761fd | |||
35c6ed2675 | |||
72f534f7f8 | |||
3cb9b43851 | |||
bf0c520f2e | |||
ee35e223a7 | |||
dc9f4b994e | |||
49be32c931 | |||
1786586747 | |||
45c09416ed | |||
4779c4b94a | |||
793cb328de | |||
966598cda7 | |||
772ccf0d9f | |||
ff6e93163f | |||
dff5129661 | |||
e367593a26 | |||
16039d837e | |||
4665c35453 | |||
4c63241b34 | |||
9aa778e843 | |||
62ba0acfb5 | |||
52d2e46700 | |||
c89421bfa8 | |||
cebd4fada7 | |||
3d82aa781d | |||
89c589085d | |||
a6a7e1bb99 | |||
70dd27ffd8 | |||
7bc5bcde34 | |||
aa0dd0d5ff | |||
e0aa39929b | |||
4172707346 | |||
7c8c41353b | |||
1d9375d115 | |||
f27deea003 | |||
00e6cb1d62 | |||
cae2a893f2 | |||
b34fb04cbf | |||
2365bb89d7 | |||
7b5a0ba8c3 | |||
ad8c4cdd75 | |||
f5ff2068a4 | |||
90a2796a7e | |||
76190c71fc | |||
dd049caf0a | |||
bcd31cb857 | |||
e6161ca307 | |||
d6f6cd0cb1 | |||
b7f2a033df | |||
e37f2663c2 | |||
5e579c4dc9 | |||
f0ec4ae941 | |||
b80b43ddae | |||
f0c570bd41 | |||
e5d2853070 | |||
152293d3cf | |||
ceb61d10c1 | |||
dd806b0d99 | |||
113c75dd27 | |||
b7acf07a70 | |||
519f2baff0 | |||
3962908d36 | |||
afd2cbc3c4 | |||
4275b3412f | |||
1b3ee17888 | |||
8306da5ce1 | |||
75dff8a93a | |||
fc1b557d98 | |||
47f98673c7 | |||
781f5611d1 | |||
deea6da0e0 | |||
43622d32e4 | |||
5db8d93fe5 | |||
535c249f3a | |||
942b986ef3 | |||
acf6075ca9 | |||
28995dba19 | |||
f186c32245 | |||
d7c77cb175 | |||
51b09244ff | |||
458dc10ddc | |||
4341743b4a | |||
b5e92b9a5d | |||
28ff02b116 | |||
f4ef8a92f8 | |||
d7e9d8746a | |||
351759906b | |||
0c2ed4c3e5 | |||
37bfb14956 | |||
81d23b33ef | |||
bb150c2704 | |||
46ff673192 | |||
7842f73e8b | |||
e5f9e3d018 | |||
aebd5f9af6 | |||
4fb034aeec | |||
4da901f8c0 | |||
39b043646b | |||
4480ba3e29 | |||
5e79799b89 | |||
1fa1dd5aaa | |||
8be0972836 | |||
78840e59a7 | |||
c332d4d916 | |||
bb944eecd6 | |||
443f5eee85 | |||
7e5e60b757 | |||
33df4b74da | |||
3c14e9612f | |||
cabf997933 | |||
2ed7146393 | |||
bfda7ca5bd | |||
305b059809 | |||
297b7da166 | |||
6aac91743b | |||
f06d5f02b3 | |||
4a9f0bebc3 | |||
88b0985bad | |||
1e3b8a1354 | |||
5a09753e07 | |||
02bfa9e0e0 | |||
306ff3cd54 | |||
ec5c108b60 | |||
4d9da9b0a1 | |||
3ce7c87cbd | |||
061107c5f6 | |||
9f039d40c1 | |||
b1f1d3ffd2 | |||
03ff380e13 | |||
c6e5fc4fbe | |||
074266b896 | |||
c4dc642f99 | |||
e041ac6f0d | |||
66effde9f3 | |||
663b768780 | |||
0147de9044 | |||
b010849102 | |||
698b0288be | |||
5e80e7e216 | |||
d50cb30443 | |||
29122c518b | |||
58e175318c | |||
f88e63519a | |||
0cc53fb398 | |||
713bce19f4 | |||
d972821889 | |||
2d16b4711e | |||
9181b73e5a | |||
5737e65700 | |||
ca677481a2 | |||
6ab43d7335 | |||
fee316161d | |||
2e4244d521 | |||
3bedfdac9d | |||
ec0ce6005a | |||
a185efbd60 | |||
4aa4e6fd03 | |||
078b0be4dc | |||
13ae2d7271 | |||
99b93e55cb | |||
80e6c07d89 | |||
34aa5570ed | |||
e526f74dfd | |||
9e78f55c32 | |||
f1731d807e | |||
92c4f3d508 | |||
e92fce1c27 | |||
83a9159063 | |||
0a69a2832b | |||
717df13207 | |||
b40b5576df | |||
03f2f1ae47 | |||
a8978ebf8e | |||
7d7b59efa5 | |||
4cf89d4bd7 | |||
d47b318fee | |||
e485236502 | |||
41667de778 | |||
ef4736d052 | |||
db4a448439 | |||
7549c65502 | |||
1beccc1a6c | |||
0075017b43 | |||
4374931b0e | |||
64022f51d4 | |||
f9f6e2e1b3 | |||
aecf9de738 | |||
81195a238b | |||
96a3de6364 | |||
00027130ea | |||
4a18428de6 | |||
7f28845f58 | |||
1dd0b6cc18 | |||
e0415dbf16 | |||
95fc3d4c5c | |||
e145fa13b1 | |||
5fa7b8ba56 | |||
2c7d366c82 | |||
2dd6f25647 | |||
d2623f13d9 | |||
7d0af179e3 | |||
416c786774 | |||
93302b7fb8 | |||
eb8c6c7eff | |||
8660806ddc | |||
4c5e085c93 | |||
d707124fd9 | |||
aece3669e5 | |||
09c84169d5 | |||
d43c30688a | |||
ee70a18a75 | |||
76a8cd57ae | |||
4c7f89ff6d | |||
f9fb8338f5 | |||
6b3aa60446 | |||
2463548fa7 | |||
1140bbc25c | |||
1b4df6484e | |||
f40d51733a | |||
e893c5a330 | |||
8be8466a00 | |||
c8bef1259c | |||
568e9df1d6 | |||
a555fdba32 | |||
36535e9abd | |||
6402a9ae2a | |||
ca25c957bf | |||
93f07aee6c | |||
0af6e9fcbb | |||
008e12edda | |||
1927d0c7db | |||
9a0a90feb3 | |||
76d86d5a07 | |||
de7a9a3b93 | |||
04f61c0c3e | |||
c810ac7153 | |||
c24ad560fa | |||
3d2db5c5f0 | |||
32eafef6a7 | |||
2366480250 | |||
8e55a11283 | |||
e9de28111d | |||
75afd80ae8 | |||
a5eb0e56b6 | |||
4d458db1b5 | |||
24a92472bf | |||
43006bcc45 | |||
326240eb91 | |||
b59bc0e38c | |||
5516802142 | |||
cc4b813e75 | |||
64631063ae | |||
719224bffd | |||
fe2b6923ba | |||
38ad1d97ab | |||
372b9101e2 | |||
7e62aa0c6e | |||
36e927a8c6 | |||
9d8bb634f9 | |||
c5c57f6737 | |||
51a89c32c4 | |||
e1ac2efe4a | |||
702e17cfe2 | |||
4d1d0fa03b | |||
ec8bae1b27 | |||
08348fc2e8 | |||
63fbc71439 | |||
b44f7b5e16 | |||
c5df9ce474 | |||
2510e7dad6 | |||
80c68583d1 | |||
5b6ced5599 | |||
a383116b43 | |||
c6dd900f60 | |||
5ac308060d | |||
bc089abd32 | |||
c94a33c525 | |||
5cee709266 | |||
2d0847c307 | |||
995cd15a69 | |||
16497438d6 | |||
b54db86f43 | |||
44acf6734b | |||
b07b6edc2a | |||
83e4a76afa | |||
bfa7b1a494 | |||
8e0dec538e | |||
1c385a1c22 | |||
f9bc84cd99 | |||
2d7c95fb70 | |||
29e8a64cf0 | |||
00efacf561 | |||
d96995b4e3 | |||
fc3e5cb6d3 | |||
d37dad82f1 | |||
22710fc353 | |||
4f66250618 | |||
d783519835 | |||
b8e9a30d3b | |||
32ce8b1326 | |||
ff4eb0cb63 | |||
9ba46d9f88 | |||
b14ac96750 | |||
55dac05cf2 | |||
ae28d7c0b2 | |||
380de1e7b4 | |||
4f9717331d | |||
36fc28642a | |||
a323b9b1a3 | |||
58f4254fba | |||
4419907b08 | |||
9d415f9c3f | |||
fced8ee40e | |||
1cb7b88505 | |||
0e76b32aa5 | |||
e81ad3a1bc | |||
c3a85ceabc | |||
85e0e366df | |||
0ce8ad3493 | |||
528e25a81a | |||
d25012e864 | |||
c21c46a8e8 | |||
9cc8bd5f7d | |||
ae3eaf8b16 | |||
d714b95fb9 | |||
912692137a | |||
6fc85073d2 | |||
989dea7083 |
13
.bazelrc
13
.bazelrc
@ -74,8 +74,8 @@ test --test_output=errors
|
|||||||
# Trick bazel into treating BUILD files under integration/bazel as being regular files
|
# Trick bazel into treating BUILD files under integration/bazel as being regular files
|
||||||
# This lets us glob() up all the files inside this integration test to make them inputs to tests
|
# This lets us glob() up all the files inside this integration test to make them inputs to tests
|
||||||
# (Note, we cannot use common --deleted_packages because the bazel version command doesn't support it)
|
# (Note, we cannot use common --deleted_packages because the bazel version command doesn't support it)
|
||||||
build --deleted_packages=integration/bazel,integration/bazel/src,integration/bazel/src/hello-world,integration/bazel/test,integration/bazel/test/e2e
|
build --deleted_packages=integration/bazel,integration/bazel/src,integration/bazel/src/hello-world,integration/bazel/test,integration/bazel/tools,integration/bazel/test/e2e
|
||||||
query --deleted_packages=integration/bazel,integration/bazel/src,integration/bazel/src/hello-world,integration/bazel/test,integration/bazel/test/e2e
|
query --deleted_packages=integration/bazel,integration/bazel/src,integration/bazel/src/hello-world,integration/bazel/test,integration/bazel/tools,integration/bazel/test/e2e
|
||||||
|
|
||||||
################################
|
################################
|
||||||
# Temporary Settings for Ivy #
|
# Temporary Settings for Ivy #
|
||||||
@ -136,15 +136,6 @@ build:remote --remote_executor=remotebuildexecution.googleapis.com
|
|||||||
# retry mechanism and we do not want to retry unnecessarily if Karma already tried multiple times.
|
# retry mechanism and we do not want to retry unnecessarily if Karma already tried multiple times.
|
||||||
test:saucelabs --flaky_test_attempts=1
|
test:saucelabs --flaky_test_attempts=1
|
||||||
|
|
||||||
###############################
|
|
||||||
# NodeJS rules settings
|
|
||||||
# These settings are required for rules_nodejs
|
|
||||||
###############################
|
|
||||||
|
|
||||||
# Turn on managed directories feature in Bazel
|
|
||||||
# This allows us to avoid installing a second copy of node_modules
|
|
||||||
common --experimental_allow_incremental_repository_updates
|
|
||||||
|
|
||||||
####################################################
|
####################################################
|
||||||
# User bazel configuration
|
# User bazel configuration
|
||||||
# NOTE: This needs to be the *last* entry in the config.
|
# NOTE: This needs to be the *last* entry in the config.
|
||||||
|
@ -1,3 +1,3 @@
|
|||||||
2.1.1
|
3.5.1
|
||||||
# [NB: this comment has to be after the first line, see https://github.com/bazelbuild/bazelisk/issues/117]
|
# [NB: this comment has to be after the first line, see https://github.com/bazelbuild/bazelisk/issues/117]
|
||||||
# When updating the Bazel version you also need to update the RBE toolchains version in package.bzl
|
# When updating the Bazel version you also need to update the RBE toolchains version in package.bzl
|
||||||
|
@ -12,7 +12,7 @@ We use this as a symmetric AES encryption key to encrypt tokens like
|
|||||||
a GitHub token that enables publishing snapshots.
|
a GitHub token that enables publishing snapshots.
|
||||||
|
|
||||||
To create the github_token file, we take this approach:
|
To create the github_token file, we take this approach:
|
||||||
- Find the angular-builds:token in http://valentine
|
- Find the angular-builds:token in the internal pw database
|
||||||
- Go inside the CircleCI default docker image so you use the same version of openssl as we will at runtime: `docker run --rm -it circleci/node:10.12`
|
- Go inside the CircleCI default docker image so you use the same version of openssl as we will at runtime: `docker run --rm -it circleci/node:10.12`
|
||||||
- echo "https://[token]:@github.com" > credentials
|
- echo "https://[token]:@github.com" > credentials
|
||||||
- openssl aes-256-cbc -e -in credentials -out .circleci/github_token -k $KEY
|
- openssl aes-256-cbc -e -in credentials -out .circleci/github_token -k $KEY
|
||||||
|
@ -14,9 +14,17 @@ build --repository_cache=/home/circleci/bazel_repository_cache
|
|||||||
# Bazel doesn't calculate the memory ceiling correctly when running under Docker.
|
# Bazel doesn't calculate the memory ceiling correctly when running under Docker.
|
||||||
# Limit Bazel to consuming resources that fit in CircleCI "xlarge" class
|
# Limit Bazel to consuming resources that fit in CircleCI "xlarge" class
|
||||||
# https://circleci.com/docs/2.0/configuration-reference/#resource_class
|
# https://circleci.com/docs/2.0/configuration-reference/#resource_class
|
||||||
build --local_cpu_resources=8
|
build --local_cpu_resources=20
|
||||||
build --local_ram_resources=14336
|
build --local_ram_resources=32768
|
||||||
|
|
||||||
# All build executed remotely should be done using our RBE configuration.
|
# All build executed remotely should be done using our RBE configuration.
|
||||||
build:remote --google_default_credentials
|
build:remote --google_default_credentials
|
||||||
|
|
||||||
|
# Upload to GCP's Build Status viewer to allow for us to have better viewing of execution/build
|
||||||
|
# logs. This is only done on CI as the BES (GCP's Build Status viewer) API requires credentials
|
||||||
|
# from service accounts, rather than end user accounts.
|
||||||
|
build:remote --bes_backend=buildeventservice.googleapis.com
|
||||||
|
build:remote --bes_timeout=30s
|
||||||
|
build:remote --bes_results_url="https://source.cloud.google.com/results/invocations/"
|
||||||
|
|
||||||
build --config=remote
|
build --config=remote
|
||||||
|
@ -11,8 +11,8 @@ try-import %workspace%/.circleci/bazel.common.rc
|
|||||||
build --repository_cache=C:/Users/circleci/bazel_repository_cache
|
build --repository_cache=C:/Users/circleci/bazel_repository_cache
|
||||||
|
|
||||||
# Manually set the local resources used in windows CI runs
|
# Manually set the local resources used in windows CI runs
|
||||||
build --local_ram_resources=13500
|
build --local_ram_resources=120000
|
||||||
build --local_cpu_resources=4
|
build --local_cpu_resources=32
|
||||||
|
|
||||||
# All windows jobs run on master and should use http caching
|
# All windows jobs run on master and should use http caching
|
||||||
build --remote_http_cache=https://storage.googleapis.com/angular-team-cache
|
build --remote_http_cache=https://storage.googleapis.com/angular-team-cache
|
||||||
|
@ -22,18 +22,16 @@ version: 2.1
|
|||||||
# **NOTE 1 **: If you change the cache key prefix, also sync the cache_key_fallback to match.
|
# **NOTE 1 **: If you change the cache key prefix, also sync the cache_key_fallback to match.
|
||||||
# **NOTE 2 **: Keep the static part of the cache key as prefix to enable correct fallbacks.
|
# **NOTE 2 **: Keep the static part of the cache key as prefix to enable correct fallbacks.
|
||||||
# See https://circleci.com/docs/2.0/caching/#restoring-cache for how prefixes work in CircleCI.
|
# See https://circleci.com/docs/2.0/caching/#restoring-cache for how prefixes work in CircleCI.
|
||||||
var_3: &cache_key v6-angular-node-12-{{ checksum ".bazelversion" }}-{{ checksum "yarn.lock" }}-{{ checksum "WORKSPACE" }}-{{ checksum "packages/bazel/package.bzl" }}-{{ checksum "aio/yarn.lock" }}
|
var_3: &cache_key v7-angular-node-12-{{ checksum ".bazelversion" }}-{{ checksum "yarn.lock" }}-{{ checksum "WORKSPACE" }}-{{ checksum "packages/bazel/package.bzl" }}-{{ checksum "aio/yarn.lock" }}
|
||||||
# We invalidate the cache if the Bazel version changes because otherwise the `bazelisk` cache
|
# We invalidate the cache if the Bazel version changes because otherwise the `bazelisk` cache
|
||||||
# folder will contain all previously used versions and ultimately cause the cache restoring to
|
# folder will contain all previously used versions and ultimately cause the cache restoring to
|
||||||
# be slower due to its growing size.
|
# be slower due to its growing size.
|
||||||
var_4: &cache_key_fallback v6-angular-node-12-{{ checksum ".bazelversion" }}
|
var_4: &cache_key_fallback v7-angular-node-12-{{ checksum ".bazelversion" }}
|
||||||
var_3_win: &cache_key_win v6-angular-win-node-12-{{ checksum ".bazelversion" }}-{{ checksum "yarn.lock" }}-{{ checksum "WORKSPACE" }}-{{ checksum "packages/bazel/package.bzl" }}-{{ checksum "aio/yarn.lock" }}
|
|
||||||
var_4_win: &cache_key_win_fallback v6-angular-win-node-12-{{ checksum ".bazelversion" }}
|
|
||||||
|
|
||||||
# Cache key for the `components-repo-unit-tests` job. **Note** when updating the SHA in the
|
# Cache key for the `components-repo-unit-tests` job. **Note** when updating the SHA in the
|
||||||
# cache keys also update the SHA for the "COMPONENTS_REPO_COMMIT" environment variable.
|
# cache keys also update the SHA for the "COMPONENTS_REPO_COMMIT" environment variable.
|
||||||
var_5: &components_repo_unit_tests_cache_key v6-angular-components-598db096e668aa7e9debd56eedfd127b7a55e371
|
var_5: &components_repo_unit_tests_cache_key v9-angular-components-09e68db8ed5b1253f2fe38ff954ef0df019fc25a
|
||||||
var_6: &components_repo_unit_tests_cache_key_fallback v6-angular-components-
|
var_6: &components_repo_unit_tests_cache_key_fallback v9-angular-components-
|
||||||
|
|
||||||
# Workspace initially persisted by the `setup` job, and then enhanced by `build-npm-packages` and
|
# Workspace initially persisted by the `setup` job, and then enhanced by `build-npm-packages` and
|
||||||
# `build-ivy-npm-packages`.
|
# `build-ivy-npm-packages`.
|
||||||
@ -67,9 +65,6 @@ var_10: &only_on_master
|
|||||||
# **NOTE 1**: Pin to exact images using an ID (SHA). See https://circleci.com/docs/2.0/circleci-images/#using-a-docker-image-id-to-pin-an-image-to-a-fixed-version.
|
# **NOTE 1**: Pin to exact images using an ID (SHA). See https://circleci.com/docs/2.0/circleci-images/#using-a-docker-image-id-to-pin-an-image-to-a-fixed-version.
|
||||||
# (Using the tag in not necessary when pinning by ID, but include it anyway for documentation purposes.)
|
# (Using the tag in not necessary when pinning by ID, but include it anyway for documentation purposes.)
|
||||||
# **NOTE 2**: If you change the version of the docker images, also change the `cache_key` suffix.
|
# **NOTE 2**: If you change the version of the docker images, also change the `cache_key` suffix.
|
||||||
# **NOTE 3**: If you change the version of the `*-browsers` docker image, make sure the
|
|
||||||
# `--versions.chrome` arg in `integration/bazel-schematics/test.sh` specifies a
|
|
||||||
# ChromeDriver version that is compatible with the Chrome version in the image.
|
|
||||||
executors:
|
executors:
|
||||||
default-executor:
|
default-executor:
|
||||||
parameters:
|
parameters:
|
||||||
@ -83,7 +78,7 @@ executors:
|
|||||||
|
|
||||||
windows-executor:
|
windows-executor:
|
||||||
working_directory: ~/ng
|
working_directory: ~/ng
|
||||||
resource_class: windows.medium
|
resource_class: windows.2xlarge
|
||||||
# CircleCI windows VMs do have the GitBash shell available:
|
# CircleCI windows VMs do have the GitBash shell available:
|
||||||
# https://github.com/CircleCI-Public/windows-preview-docs#shells
|
# https://github.com/CircleCI-Public/windows-preview-docs#shells
|
||||||
# But in this specific case we really should not use it because Bazel must not be ran from
|
# But in this specific case we really should not use it because Bazel must not be ran from
|
||||||
@ -120,7 +115,7 @@ commands:
|
|||||||
sudo apt-get update
|
sudo apt-get update
|
||||||
# Install GTK+ graphical user interface (libgtk-3-0), advanced linux sound architecture (libasound2)
|
# Install GTK+ graphical user interface (libgtk-3-0), advanced linux sound architecture (libasound2)
|
||||||
# and network security service libraries (libnss3) & X11 Screen Saver extension library (libssx1)
|
# and network security service libraries (libnss3) & X11 Screen Saver extension library (libssx1)
|
||||||
# which are dependendies of chrome & needed for karma & protractor headless chrome tests.
|
# which are dependencies of chrome & needed for karma & protractor headless chrome tests.
|
||||||
# This is a very small install which takes around 7s in comparing to using the full
|
# This is a very small install which takes around 7s in comparing to using the full
|
||||||
# circleci/node:x.x.x-browsers image.
|
# circleci/node:x.x.x-browsers image.
|
||||||
sudo apt-get -y install libgtk-3-0 libasound2 libnss3 libxss1
|
sudo apt-get -y install libgtk-3-0 libasound2 libnss3 libxss1
|
||||||
@ -163,7 +158,7 @@ commands:
|
|||||||
description: Sets up a domain that resolves to the local host.
|
description: Sets up a domain that resolves to the local host.
|
||||||
steps:
|
steps:
|
||||||
- run:
|
- run:
|
||||||
name: Preparing environment for running tests on Saucelabs.
|
name: Preparing environment for running tests on Sauce Labs.
|
||||||
command: |
|
command: |
|
||||||
# For SauceLabs jobs, we set up a domain which resolves to the machine which launched
|
# For SauceLabs jobs, we set up a domain which resolves to the machine which launched
|
||||||
# the tunnel. We do this because devices are sometimes not able to properly resolve
|
# the tunnel. We do this because devices are sometimes not able to properly resolve
|
||||||
@ -175,34 +170,23 @@ commands:
|
|||||||
setSecretVar SAUCE_ACCESS_KEY $(echo $SAUCE_ACCESS_KEY | rev)
|
setSecretVar SAUCE_ACCESS_KEY $(echo $SAUCE_ACCESS_KEY | rev)
|
||||||
- run:
|
- run:
|
||||||
# Sets up a local domain in the machine's host file that resolves to the local
|
# Sets up a local domain in the machine's host file that resolves to the local
|
||||||
# host. This domain is helpful in Saucelabs tests where devices are not able to
|
# host. This domain is helpful in Sauce Labs tests where devices are not able to
|
||||||
# properly resolve `localhost` or `127.0.0.1` through the sauce-connect tunnel.
|
# properly resolve `localhost` or `127.0.0.1` through the sauce-connect tunnel.
|
||||||
name: Setting up alias domain for local host.
|
name: Setting up alias domain for local host.
|
||||||
command: echo "127.0.0.1 $SAUCE_LOCALHOST_ALIAS_DOMAIN" | sudo tee -a /etc/hosts
|
command: echo "127.0.0.1 $SAUCE_LOCALHOST_ALIAS_DOMAIN" | sudo tee -a /etc/hosts
|
||||||
|
|
||||||
# Normally this would be an individual job instead of a command.
|
# Normally this would be an individual job instead of a command.
|
||||||
# But startup and setup time for each invidual windows job are high enough to discourage
|
# But startup and setup time for each individual windows job are high enough to discourage
|
||||||
# many small jobs, so instead we use a command for setup unless the gain becomes significant.
|
# many small jobs, so instead we use a command for setup unless the gain becomes significant.
|
||||||
setup_win:
|
setup_win:
|
||||||
description: Setup windows node environment
|
description: Setup windows node environment
|
||||||
steps:
|
steps:
|
||||||
# Use the Linux workspace directly, as it already has checkout, rebased and node modules.
|
- checkout
|
||||||
- custom_attach_workspace
|
|
||||||
# Install Bazel pre-requisites that aren't in the preconfigured CircleCI Windows VM.
|
# Install Bazel pre-requisites that aren't in the preconfigured CircleCI Windows VM.
|
||||||
- run: ./.circleci/windows-env.ps1
|
- run: ./.circleci/windows-env.ps1
|
||||||
- run: node --version
|
- run: node --version
|
||||||
- run: yarn --version
|
- run: yarn --version
|
||||||
- restore_cache:
|
|
||||||
keys:
|
|
||||||
- *cache_key_win
|
|
||||||
- *cache_key_win_fallback
|
|
||||||
# Reinstall to get windows binaries.
|
|
||||||
- run: yarn install --frozen-lockfile --non-interactive
|
- run: yarn install --frozen-lockfile --non-interactive
|
||||||
# Install @bazel/bazelisk globally and use that for the first run.
|
|
||||||
# Workaround for https://github.com/bazelbuild/rules_nodejs/issues/894
|
|
||||||
# NB: the issue was for @bazel/bazel but the same problem applies to @bazel/bazelisk
|
|
||||||
- run: yarn global add @bazel/bazelisk@$env:BAZELISK_VERSION
|
|
||||||
- run: bazelisk info
|
|
||||||
|
|
||||||
notify_webhook_on_fail:
|
notify_webhook_on_fail:
|
||||||
description: Notify a webhook about failure
|
description: Notify a webhook about failure
|
||||||
@ -276,6 +260,7 @@ jobs:
|
|||||||
- run: yarn -s ng-dev format changed $CI_GIT_BASE_REVISION --check
|
- run: yarn -s ng-dev format changed $CI_GIT_BASE_REVISION --check
|
||||||
- run: yarn -s ts-circular-deps:check
|
- run: yarn -s ts-circular-deps:check
|
||||||
- run: yarn -s ng-dev pullapprove verify
|
- run: yarn -s ng-dev pullapprove verify
|
||||||
|
- run: yarn -s ng-dev ngbot verify
|
||||||
- run: yarn -s ng-dev commit-message validate-range --range $CI_COMMIT_RANGE
|
- run: yarn -s ng-dev commit-message validate-range --range $CI_COMMIT_RANGE
|
||||||
|
|
||||||
test:
|
test:
|
||||||
@ -599,8 +584,8 @@ jobs:
|
|||||||
- run:
|
- run:
|
||||||
name: Decrypt github credentials
|
name: Decrypt github credentials
|
||||||
# We need ensure that the same default digest is used for encoding and decoding with
|
# We need ensure that the same default digest is used for encoding and decoding with
|
||||||
# openssl. Openssl versions might have different default digests which can cause
|
# OpenSSL. OpenSSL versions might have different default digests which can cause
|
||||||
# decryption failures based on the installed openssl version. https://stackoverflow.com/a/39641378/4317734
|
# decryption failures based on the installed OpenSSL version. https://stackoverflow.com/a/39641378/4317734
|
||||||
command: 'openssl aes-256-cbc -d -in .circleci/github_token -md md5 -k "${KEY}" -out ~/.git_credentials'
|
command: 'openssl aes-256-cbc -d -in .circleci/github_token -md md5 -k "${KEY}" -out ~/.git_credentials'
|
||||||
- run: ./scripts/ci/publish-build-artifacts.sh
|
- run: ./scripts/ci/publish-build-artifacts.sh
|
||||||
|
|
||||||
@ -656,9 +641,23 @@ jobs:
|
|||||||
name: Starting Saucelabs tunnel service
|
name: Starting Saucelabs tunnel service
|
||||||
command: ./tools/saucelabs/sauce-service.sh run
|
command: ./tools/saucelabs/sauce-service.sh run
|
||||||
background: true
|
background: true
|
||||||
- run: yarn tsc -p packages
|
# add module umd tsc compile option so the test can work
|
||||||
- run: yarn tsc -p modules
|
# properly in the legacy browsers
|
||||||
|
- run: yarn tsc -p packages --module UMD
|
||||||
|
- run: yarn tsc -p modules --module UMD
|
||||||
- run: yarn bazel build //packages/zone.js:npm_package
|
- run: yarn bazel build //packages/zone.js:npm_package
|
||||||
|
# Build test fixtures for a test that rely on Bazel-generated fixtures. Note that disabling
|
||||||
|
# specific tests which are reliant on such generated fixtures is not an option as SystemJS
|
||||||
|
# in the Saucelabs legacy job always fetches referenced files, even if the imports would be
|
||||||
|
# guarded by an check to skip in the Saucelabs legacy job. We should be good running such
|
||||||
|
# test in all supported browsers on Saucelabs anyway until this job can be removed.
|
||||||
|
- run:
|
||||||
|
name: Preparing Bazel-generated fixtures required in legacy tests
|
||||||
|
command: |
|
||||||
|
yarn bazel build //packages/core/test:downleveled_es5_fixture
|
||||||
|
# Needed for the ES5 downlevel reflector test in `packages/core/test/reflection`.
|
||||||
|
cp dist/bin/packages/core/test/reflection/es5_downleveled_inheritance_fixture.js \
|
||||||
|
dist/all/@angular/core/test/reflection/es5_downleveled_inheritance_fixture.js
|
||||||
- run:
|
- run:
|
||||||
# Waiting on ready ensures that we don't run tests too early without Saucelabs not being ready.
|
# Waiting on ready ensures that we don't run tests too early without Saucelabs not being ready.
|
||||||
name: Waiting for Saucelabs tunnel to connect
|
name: Waiting for Saucelabs tunnel to connect
|
||||||
@ -734,10 +733,13 @@ jobs:
|
|||||||
- run: yarn --cwd packages/zone.js promisetest
|
- run: yarn --cwd packages/zone.js promisetest
|
||||||
- run: yarn --cwd packages/zone.js promisefinallytest
|
- run: yarn --cwd packages/zone.js promisefinallytest
|
||||||
- run: yarn bazel build //packages/zone.js:npm_package &&
|
- run: yarn bazel build //packages/zone.js:npm_package &&
|
||||||
cp dist/bin/packages/zone.js/npm_package/dist/zone-mix.js ./packages/zone.js/test/extra/ &&
|
cp dist/bin/packages/zone.js/npm_package/bundles/zone-mix.umd.js ./packages/zone.js/test/extra/ &&
|
||||||
cp dist/bin/packages/zone.js/npm_package/dist/zone-patch-electron.js ./packages/zone.js/test/extra/ &&
|
cp dist/bin/packages/zone.js/npm_package/bundles/zone-patch-electron.umd.js ./packages/zone.js/test/extra/ &&
|
||||||
yarn --cwd packages/zone.js electrontest
|
yarn --cwd packages/zone.js electrontest
|
||||||
- run: yarn --cwd packages/zone.js jesttest
|
- run: yarn --cwd packages/zone.js jest:test
|
||||||
|
- run: yarn --cwd packages/zone.js jest:nodetest
|
||||||
|
- run: yarn --cwd packages/zone.js/test/typings install --frozen-lockfile --non-interactive
|
||||||
|
- run: yarn --cwd packages/zone.js/test/typings test
|
||||||
|
|
||||||
# Windows jobs
|
# Windows jobs
|
||||||
# Docs: https://circleci.com/docs/2.0/hello-world-windows/
|
# Docs: https://circleci.com/docs/2.0/hello-world-windows/
|
||||||
@ -751,12 +753,6 @@ jobs:
|
|||||||
# Probably a powershell command parsing thing. There's no problem using a yarn script though.
|
# Probably a powershell command parsing thing. There's no problem using a yarn script though.
|
||||||
command: yarn circleci-win-ve
|
command: yarn circleci-win-ve
|
||||||
no_output_timeout: 45m
|
no_output_timeout: 45m
|
||||||
# Save bazel repository cache to use on subsequent runs.
|
|
||||||
# We don't save node_modules because it's faster to use the linux workspace and reinstall.
|
|
||||||
- save_cache:
|
|
||||||
key: *cache_key_win
|
|
||||||
paths:
|
|
||||||
- "C:/Users/circleci/bazel_repository_cache"
|
|
||||||
|
|
||||||
test_ivy_aot_win:
|
test_ivy_aot_win:
|
||||||
executor: windows-executor
|
executor: windows-executor
|
||||||
@ -848,26 +844,25 @@ workflows:
|
|||||||
- build-npm-packages
|
- build-npm-packages
|
||||||
- build-ivy-npm-packages
|
- build-ivy-npm-packages
|
||||||
- legacy-unit-tests-saucelabs
|
- legacy-unit-tests-saucelabs
|
||||||
- components-repo-unit-tests:
|
# Temporarily disabled components-repo-unit-tests to update rules_nodejs to 2.0.0. Breaking changes in
|
||||||
requires:
|
# rules_nodejs create a dependency sandwich between angular/angular & angular/components that are very
|
||||||
- build-npm-packages
|
# difficult and time consuming to resolve and involve patching @angular/bazel in components repo such
|
||||||
|
# as https://github.com/angular/components/commit/9e7ba251207df77164d73d66620e619bcbc4d2ad. It is simpler to
|
||||||
|
# 1) land angular/angular upgrade to rule_nodejs 2.0.0 which has breaking changes
|
||||||
|
# 2) land angular/components upgrade to rules_nodejs 2.0.0 using the @angular/bazel builds snapshot
|
||||||
|
# 3) update angular/angular to the landed components commit and re-enable these tests
|
||||||
|
# - components-repo-unit-tests:
|
||||||
|
# requires:
|
||||||
|
# - build-npm-packages
|
||||||
- test_zonejs:
|
- test_zonejs:
|
||||||
requires:
|
requires:
|
||||||
- setup
|
- setup
|
||||||
# Windows Jobs
|
|
||||||
# These are very slow so we run them on non-PRs only for now.
|
|
||||||
# TODO: remove the filter when CircleCI makes Windows FS faster.
|
|
||||||
# The Windows jobs are only run after their non-windows counterparts finish successfully.
|
|
||||||
# This isn't strictly necessary as there is no artifact dependency, but helps economize
|
|
||||||
# CI resources by not attempting to build when we know should fail.
|
|
||||||
- test_win:
|
- test_win:
|
||||||
<<: *skip_on_pull_requests
|
|
||||||
requires:
|
requires:
|
||||||
- test
|
- setup
|
||||||
- test_ivy_aot_win:
|
- test_ivy_aot_win:
|
||||||
<<: *skip_on_pull_requests
|
|
||||||
requires:
|
requires:
|
||||||
- test_ivy_aot
|
- setup
|
||||||
|
|
||||||
monitoring:
|
monitoring:
|
||||||
jobs:
|
jobs:
|
||||||
|
@ -74,7 +74,7 @@ setPublicVar COMPONENTS_REPO_TMP_DIR "/tmp/angular-components-repo"
|
|||||||
setPublicVar COMPONENTS_REPO_URL "https://github.com/angular/components.git"
|
setPublicVar COMPONENTS_REPO_URL "https://github.com/angular/components.git"
|
||||||
setPublicVar COMPONENTS_REPO_BRANCH "master"
|
setPublicVar COMPONENTS_REPO_BRANCH "master"
|
||||||
# **NOTE**: When updating the commit SHA, also update the cache key in the CircleCI `config.yml`.
|
# **NOTE**: When updating the commit SHA, also update the cache key in the CircleCI `config.yml`.
|
||||||
setPublicVar COMPONENTS_REPO_COMMIT "598db096e668aa7e9debd56eedfd127b7a55e371"
|
setPublicVar COMPONENTS_REPO_COMMIT "09e68db8ed5b1253f2fe38ff954ef0df019fc25a"
|
||||||
|
|
||||||
|
|
||||||
####################################################################################################
|
####################################################################################################
|
||||||
|
@ -60,14 +60,15 @@ if (require.resolve === module) {
|
|||||||
|
|
||||||
// Helpers
|
// Helpers
|
||||||
function _main(args) {
|
function _main(args) {
|
||||||
triggerWebhook(...args).
|
triggerWebhook(...args)
|
||||||
then(({statusCode, responseText}) => (200 <= statusCode && statusCode < 400) ?
|
.then(
|
||||||
console.log(`Status: ${statusCode}\n${responseText}`) :
|
({statusCode, responseText}) => (200 <= statusCode && statusCode < 400) ?
|
||||||
Promise.reject(new Error(`Request failed (status: ${statusCode}): ${responseText}`))).
|
console.log(`Status: ${statusCode}\n${responseText}`) :
|
||||||
catch(err => {
|
Promise.reject(new Error(`Request failed (status: ${statusCode}): ${responseText}`)))
|
||||||
console.error(err);
|
.catch(err => {
|
||||||
process.exit(1);
|
console.error(err);
|
||||||
});
|
process.exit(1);
|
||||||
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function postJson(url, data) {
|
function postJson(url, data) {
|
||||||
@ -77,15 +78,12 @@ function postJson(url, data) {
|
|||||||
const statusCode = res.statusCode || -1;
|
const statusCode = res.statusCode || -1;
|
||||||
let responseText = '';
|
let responseText = '';
|
||||||
|
|
||||||
res.
|
res.on('error', reject)
|
||||||
on('error', reject).
|
.on('data', d => responseText += d)
|
||||||
on('data', d => responseText += d).
|
.on('end', () => resolve({statusCode, responseText}));
|
||||||
on('end', () => resolve({statusCode, responseText}));
|
|
||||||
};
|
};
|
||||||
|
|
||||||
request(url, opts, onResponse).
|
request(url, opts, onResponse).on('error', reject).end(JSON.stringify(data));
|
||||||
on('error', reject).
|
|
||||||
end(JSON.stringify(data));
|
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
# https://docs.bazel.build/versions/master/install-windows.html
|
# https://docs.bazel.build/versions/master/install-windows.html
|
||||||
# https://docs.bazel.build/versions/master/windows.html
|
# https://docs.bazel.build/versions/master/windows.html
|
||||||
# Install MSYS2 and packages
|
# Install MSYS2 and packages
|
||||||
choco install msys2 --version 20180531.0.0 --no-progress --package-parameters "/NoUpdate"
|
choco install msys2 --version 20200903.0.0 --no-progress --package-parameters "/NoUpdate"
|
||||||
C:\tools\msys64\usr\bin\bash.exe -l -c "pacman --needed --noconfirm -S zip unzip patch diffutils git"
|
C:\tools\msys64\usr\bin\bash.exe -l -c "pacman --needed --noconfirm -S zip unzip patch diffutils"
|
||||||
|
|
||||||
# Add PATH modifications to the Powershell profile. This is the win equivalent of .bash_profile.
|
# Add PATH modifications to the Powershell profile. This is the win equivalent of .bash_profile.
|
||||||
# https://docs.microsoft.com/en-us/previous-versions//bb613488(v=vs.85)
|
# https://docs.microsoft.com/en-us/previous-versions//bb613488(v=vs.85)
|
||||||
@ -41,7 +41,8 @@ copy .circleci\bazel.windows.rc ${Env:USERPROFILE}\.bazelrc
|
|||||||
####################################################################################################
|
####################################################################################################
|
||||||
# Install specific version of node.
|
# Install specific version of node.
|
||||||
####################################################################################################
|
####################################################################################################
|
||||||
choco install nodejs --version 12.14.1 --no-progress
|
nvm install 12.14.1
|
||||||
|
nvm use 12.14.1
|
||||||
|
|
||||||
# These Bazel prereqs aren't needed because the CircleCI image already includes them.
|
# These Bazel prereqs aren't needed because the CircleCI image already includes them.
|
||||||
# choco install yarn --version 1.16.0 --no-progress
|
# choco install yarn --version 1.16.0 --no-progress
|
||||||
|
@ -1,72 +0,0 @@
|
|||||||
{
|
|
||||||
"commitMessage": {
|
|
||||||
"maxLength": 120,
|
|
||||||
"minBodyLength": 100,
|
|
||||||
"types": [
|
|
||||||
"build",
|
|
||||||
"ci",
|
|
||||||
"docs",
|
|
||||||
"feat",
|
|
||||||
"fix",
|
|
||||||
"perf",
|
|
||||||
"refactor",
|
|
||||||
"release",
|
|
||||||
"style",
|
|
||||||
"test"
|
|
||||||
],
|
|
||||||
"scopes": [
|
|
||||||
"animations",
|
|
||||||
"bazel",
|
|
||||||
"benchpress",
|
|
||||||
"changelog",
|
|
||||||
"common",
|
|
||||||
"compiler",
|
|
||||||
"compiler-cli",
|
|
||||||
"core",
|
|
||||||
"dev-infra",
|
|
||||||
"docs-infra",
|
|
||||||
"elements",
|
|
||||||
"forms",
|
|
||||||
"http",
|
|
||||||
"language-service",
|
|
||||||
"localize",
|
|
||||||
"ngcc",
|
|
||||||
"packaging",
|
|
||||||
"platform-browser",
|
|
||||||
"platform-browser-dynamic",
|
|
||||||
"platform-server",
|
|
||||||
"platform-webworker",
|
|
||||||
"platform-webworker-dynamic",
|
|
||||||
"router",
|
|
||||||
"service-worker",
|
|
||||||
"upgrade",
|
|
||||||
"ve",
|
|
||||||
"zone.js"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"format": {
|
|
||||||
"clang-format": {
|
|
||||||
"matchers": [
|
|
||||||
"dev-infra/**/*.{js,ts}",
|
|
||||||
"packages/**/*.{js,ts}",
|
|
||||||
"!packages/zone.js",
|
|
||||||
"!packages/common/locales/**/*.{js,ts}",
|
|
||||||
"!packages/common/src/i18n/available_locales.ts",
|
|
||||||
"!packages/common/src/i18n/currencies.ts",
|
|
||||||
"!packages/common/src/i18n/locale_en.ts",
|
|
||||||
"modules/benchmarks/**/*.{js,ts}",
|
|
||||||
"modules/playground/**/*.{js,ts}",
|
|
||||||
"tools/**/*.{js,ts}",
|
|
||||||
"!tools/gulp-tasks/cldr/extract.js",
|
|
||||||
"!tools/public_api_guard/**/*.d.ts",
|
|
||||||
"!tools/ts-api-guardian/test/fixtures/**",
|
|
||||||
"./*.{js,ts}",
|
|
||||||
"!**/node_modules/**",
|
|
||||||
"!**/dist/**",
|
|
||||||
"!**/built/**",
|
|
||||||
"!shims_for_IE.js"
|
|
||||||
]
|
|
||||||
},
|
|
||||||
"buildifier": true
|
|
||||||
}
|
|
||||||
}
|
|
4
.github/ISSUE_TEMPLATE/1-bug-report.md
vendored
4
.github/ISSUE_TEMPLATE/1-bug-report.md
vendored
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
name: "\U0001F41EBug report"
|
name: "\U0001F41E Bug report"
|
||||||
about: Report a bug in the Angular Framework
|
about: Report a bug in the Angular Framework
|
||||||
---
|
---
|
||||||
<!--🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅
|
<!--🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅🔅
|
||||||
@ -32,7 +32,7 @@ Existing issues often contain information about workarounds, resolution, or prog
|
|||||||
|
|
||||||
## 🔬 Minimal Reproduction
|
## 🔬 Minimal Reproduction
|
||||||
<!--
|
<!--
|
||||||
Please create and share minimal reproduction of the issue starting with this template: https://stackblitz.com/fork/angular-issue-repro2
|
Please create and share minimal reproduction of the issue starting with this template: https://stackblitz.com/fork/angular-ivy
|
||||||
-->
|
-->
|
||||||
<!-- ✍️--> https://stackblitz.com/...
|
<!-- ✍️--> https://stackblitz.com/...
|
||||||
|
|
||||||
|
2
.github/ISSUE_TEMPLATE/2-feature-request.md
vendored
2
.github/ISSUE_TEMPLATE/2-feature-request.md
vendored
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
name: "\U0001F680Feature request"
|
name: "\U0001F680 Feature request"
|
||||||
about: Suggest a feature for Angular Framework
|
about: Suggest a feature for Angular Framework
|
||||||
|
|
||||||
---
|
---
|
||||||
|
2
.github/ISSUE_TEMPLATE/5-support-request.md
vendored
2
.github/ISSUE_TEMPLATE/5-support-request.md
vendored
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
name: "❓Support request"
|
name: "❓ Support request"
|
||||||
about: Questions and requests for support
|
about: Questions and requests for support
|
||||||
|
|
||||||
---
|
---
|
||||||
|
2
.github/ISSUE_TEMPLATE/6-angular-cli.md
vendored
2
.github/ISSUE_TEMPLATE/6-angular-cli.md
vendored
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
name: "\U0001F6E0️Angular CLI"
|
name: "\U0001F6E0️ Angular CLI"
|
||||||
about: Issues and feature requests for Angular CLI
|
about: Issues and feature requests for Angular CLI
|
||||||
|
|
||||||
---
|
---
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
---
|
---
|
||||||
name: "\U0001F48EAngular Components"
|
name: "\U0001F48E Angular Components"
|
||||||
about: Issues and feature requests for Angular Components
|
about: Issues and feature requests for Angular Components
|
||||||
|
|
||||||
---
|
---
|
||||||
|
57
.github/angular-robot.yml
vendored
57
.github/angular-robot.yml
vendored
@ -38,6 +38,7 @@ merge:
|
|||||||
- "modules/benchmarks/**"
|
- "modules/benchmarks/**"
|
||||||
- "modules/system.d.ts"
|
- "modules/system.d.ts"
|
||||||
- "packages/**"
|
- "packages/**"
|
||||||
|
- "dev-infra/benchmark/driver-utilities/**"
|
||||||
# list of patterns to ignore for the files changed by the PR
|
# list of patterns to ignore for the files changed by the PR
|
||||||
exclude:
|
exclude:
|
||||||
- "packages/*"
|
- "packages/*"
|
||||||
@ -47,7 +48,10 @@ merge:
|
|||||||
- "packages/bazel/src/ng_package/**"
|
- "packages/bazel/src/ng_package/**"
|
||||||
- "packages/bazel/src/protractor/**"
|
- "packages/bazel/src/protractor/**"
|
||||||
- "packages/bazel/src/schematics/**"
|
- "packages/bazel/src/schematics/**"
|
||||||
|
- "packages/compiler-cli/src/ngcc/**"
|
||||||
|
- "packages/compiler-cli/linker/**"
|
||||||
- "packages/compiler-cli/ngcc/**"
|
- "packages/compiler-cli/ngcc/**"
|
||||||
|
- "packages/compiler-cli/src/ngtsc/sourcemaps/**"
|
||||||
- "packages/docs/**"
|
- "packages/docs/**"
|
||||||
- "packages/elements/schematics/**"
|
- "packages/elements/schematics/**"
|
||||||
- "packages/examples/**"
|
- "packages/examples/**"
|
||||||
@ -55,6 +59,8 @@ merge:
|
|||||||
- "packages/localize/**"
|
- "packages/localize/**"
|
||||||
- "packages/private/**"
|
- "packages/private/**"
|
||||||
- "packages/service-worker/**"
|
- "packages/service-worker/**"
|
||||||
|
- "packages/common/locales/**"
|
||||||
|
- "packages/http/**"
|
||||||
- "**/.gitignore"
|
- "**/.gitignore"
|
||||||
- "**/.gitkeep"
|
- "**/.gitkeep"
|
||||||
- "**/yarn.lock"
|
- "**/yarn.lock"
|
||||||
@ -68,20 +74,20 @@ merge:
|
|||||||
- "packages/**/integrationtest/**"
|
- "packages/**/integrationtest/**"
|
||||||
- "packages/**/test/**"
|
- "packages/**/test/**"
|
||||||
- "packages/zone.js/*"
|
- "packages/zone.js/*"
|
||||||
|
- "packages/zone.js/dist/**"
|
||||||
- "packages/zone.js/doc/**"
|
- "packages/zone.js/doc/**"
|
||||||
- "packages/zone.js/example/**"
|
- "packages/zone.js/example/**"
|
||||||
- "packages/zone.js/scripts/**"
|
- "packages/zone.js/scripts/**"
|
||||||
|
|
||||||
# comment that will be added to a PR when there is a conflict, leave empty or set to false to disable
|
# comment that will be added to a PR when there is a conflict, leave empty or set to false to disable
|
||||||
mergeConflictComment: "Hi @{{PRAuthor}}! This PR has merge conflicts due to recent upstream merges.
|
mergeConflictComment: "Hi @{{PRAuthor}}! This PR has merge conflicts due to recent upstream merges.\nPlease help to unblock it by resolving these conflicts. Thanks!"
|
||||||
\nPlease help to unblock it by resolving these conflicts. Thanks!"
|
|
||||||
|
|
||||||
# label to monitor
|
# label to monitor
|
||||||
mergeLabel: "PR action: merge"
|
mergeLabel: "action: merge"
|
||||||
|
|
||||||
# adding any of these labels will also add the merge label
|
# adding any of these labels will also add the merge label
|
||||||
mergeLinkedLabels:
|
mergeLinkedLabels:
|
||||||
- "PR action: merge-assistance"
|
- "action: merge-assistance"
|
||||||
|
|
||||||
# list of checks that will determine if the merge label can be added
|
# list of checks that will determine if the merge label can be added
|
||||||
checks:
|
checks:
|
||||||
@ -94,17 +100,17 @@ merge:
|
|||||||
|
|
||||||
# whether the PR shouldn't have a conflict with the base branch
|
# whether the PR shouldn't have a conflict with the base branch
|
||||||
noConflict: true
|
noConflict: true
|
||||||
# list of labels that a PR needs to have, checked with a regexp (e.g. "PR target:" will work for the label "PR target: master")
|
# list of labels that a PR needs to have, checked with a regexp (e.g. "target:" will work for the label "target: master")
|
||||||
requiredLabels:
|
requiredLabels:
|
||||||
- "PR target: *"
|
- "target: *"
|
||||||
- "cla: yes"
|
- "cla: yes"
|
||||||
|
|
||||||
# list of labels that a PR shouldn't have, checked after the required labels with a regexp
|
# list of labels that a PR shouldn't have, checked after the required labels with a regexp
|
||||||
forbiddenLabels:
|
forbiddenLabels:
|
||||||
- "PR target: TBD"
|
- "target: TBD"
|
||||||
- "PR action: cleanup"
|
- "action: cleanup"
|
||||||
- "PR action: review"
|
- "action: review"
|
||||||
- "PR state: blocked"
|
- "state: blocked"
|
||||||
- "cla: no"
|
- "cla: no"
|
||||||
|
|
||||||
# list of PR statuses that need to be successful
|
# list of PR statuses that need to be successful
|
||||||
@ -121,12 +127,7 @@ merge:
|
|||||||
# the comment that will be added when the merge label is added despite failing checks, leave empty or set to false to disable
|
# the comment that will be added when the merge label is added despite failing checks, leave empty or set to false to disable
|
||||||
# {{MERGE_LABEL}} will be replaced by the value of the mergeLabel option
|
# {{MERGE_LABEL}} will be replaced by the value of the mergeLabel option
|
||||||
# {{PLACEHOLDER}} will be replaced by the list of failing checks
|
# {{PLACEHOLDER}} will be replaced by the list of failing checks
|
||||||
mergeRemovedComment: "I see that you just added the `{{MERGE_LABEL}}` label, but the following checks are still failing:
|
mergeRemovedComment: "I see that you just added the `{{MERGE_LABEL}}` label, but the following checks are still failing:\n{{PLACEHOLDER}}\n\n**If you want your PR to be merged, it has to pass all the CI checks.**\n\nIf you can't get the PR to a green state due to flakes or broken master, please try rebasing to master and/or restarting the CI job. If that fails and you believe that the issue is not due to your change, please contact the caretaker and ask for help."
|
||||||
\n{{PLACEHOLDER}}
|
|
||||||
\n
|
|
||||||
\n**If you want your PR to be merged, it has to pass all the CI checks.**
|
|
||||||
\n
|
|
||||||
\nIf you can't get the PR to a green state due to flakes or broken master, please try rebasing to master and/or restarting the CI job. If that fails and you believe that the issue is not due to your change, please contact the caretaker and ask for help."
|
|
||||||
|
|
||||||
# options for the triage plugin
|
# options for the triage plugin
|
||||||
triage:
|
triage:
|
||||||
@ -141,18 +142,28 @@ triage:
|
|||||||
# arrays of labels that determine if an issue has been fully triaged
|
# arrays of labels that determine if an issue has been fully triaged
|
||||||
l2TriageLabels:
|
l2TriageLabels:
|
||||||
-
|
-
|
||||||
- "type: bug/fix"
|
- "P0"
|
||||||
- "severity*"
|
|
||||||
- "freq*"
|
|
||||||
- "comp: *"
|
- "comp: *"
|
||||||
-
|
-
|
||||||
- "type: feature"
|
- "P1"
|
||||||
- "comp: *"
|
- "comp: *"
|
||||||
-
|
-
|
||||||
- "type: refactor"
|
- "P2"
|
||||||
- "comp: *"
|
- "comp: *"
|
||||||
-
|
-
|
||||||
- "type: RFC / Discussion / question"
|
- "P3"
|
||||||
|
- "comp: *"
|
||||||
|
-
|
||||||
|
- "P4"
|
||||||
|
- "comp: *"
|
||||||
|
-
|
||||||
|
- "P5"
|
||||||
|
- "comp: *"
|
||||||
|
-
|
||||||
|
- "feature"
|
||||||
|
- "comp: *"
|
||||||
|
-
|
||||||
|
- "discussion"
|
||||||
- "comp: *"
|
- "comp: *"
|
||||||
|
|
||||||
# options for the triage PR plugin
|
# options for the triage PR plugin
|
||||||
@ -180,4 +191,4 @@ rerunCircleCI:
|
|||||||
# set to true to disable
|
# set to true to disable
|
||||||
disabled: false
|
disabled: false
|
||||||
# the label which when added triggers a rerun of the default CircleCI workflow
|
# the label which when added triggers a rerun of the default CircleCI workflow
|
||||||
triggerRerunLabel: "PR action: rerun CI at HEAD"
|
triggerRerunLabel: "action: rerun CI at HEAD"
|
||||||
|
2
.github/workflows/lock-closed.yml
vendored
2
.github/workflows/lock-closed.yml
vendored
@ -10,6 +10,6 @@ jobs:
|
|||||||
if: github.repository == 'angular/angular'
|
if: github.repository == 'angular/angular'
|
||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- uses: angular/dev-infra/github-actions/lock-closed@66462f6
|
- uses: angular/dev-infra/github-actions/lock-closed@414834b2b24dd2df37c6ed00808387ee6fd91b66
|
||||||
with:
|
with:
|
||||||
lock-bot-key: ${{ secrets.LOCK_BOT_PRIVATE_KEY }}
|
lock-bot-key: ${{ secrets.LOCK_BOT_PRIVATE_KEY }}
|
||||||
|
6
.gitignore
vendored
6
.gitignore
vendored
@ -40,5 +40,11 @@ yarn-error.log
|
|||||||
# User specific bazel settings
|
# User specific bazel settings
|
||||||
.bazelrc.user
|
.bazelrc.user
|
||||||
|
|
||||||
|
# User specific ng-dev settings
|
||||||
|
.ng-dev.user*
|
||||||
|
|
||||||
.notes.md
|
.notes.md
|
||||||
baseline.json
|
baseline.json
|
||||||
|
|
||||||
|
# Ignore .history for the xyz.local-history VSCode extension
|
||||||
|
.history
|
||||||
|
145
.gitmessage
Normal file
145
.gitmessage
Normal file
@ -0,0 +1,145 @@
|
|||||||
|
<type>(<scope>): <summary>
|
||||||
|
|
||||||
|
<Describe the motivation behind this change - explain WHY you are making this change. Wrap all lines
|
||||||
|
at 100 characters.>
|
||||||
|
|
||||||
|
Fixes #<issue number>
|
||||||
|
|
||||||
|
# ────────────────────────────────────────── 100 chars ────────────────────────────────────────────┤
|
||||||
|
|
||||||
|
|
||||||
|
# Example Commit Messages
|
||||||
|
# =======================
|
||||||
|
|
||||||
|
|
||||||
|
# ─── Example: Simple refactor ────────────────────────────────────────────────────────────────────┤
|
||||||
|
# refactor(core): rename refreshDynamicEmbeddedViews to refreshEmbeddedViews
|
||||||
|
#
|
||||||
|
# Improve code readability. The original name no longer matches how the function is used.
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────────────────────────┤
|
||||||
|
|
||||||
|
|
||||||
|
# ─── Example: Simple docs change ─────────────────────────────────────────────────────────────────┤
|
||||||
|
# docs: clarify the service limitation in providers.md guide
|
||||||
|
#
|
||||||
|
# Fixes #36332
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────────────────────────┤
|
||||||
|
|
||||||
|
|
||||||
|
# ─── Example: A bug fix ──────────────────────────────────────────────────────────────────────────┤
|
||||||
|
# fix(ngcc): ensure lockfile is removed when `analyzeFn` fails
|
||||||
|
#
|
||||||
|
# Previously an error thrown in the `analyzeFn` would cause the ngcc process to exit immediately
|
||||||
|
# without removing the lockfile, and potentially before the unlocker process had been successfully
|
||||||
|
# spawned resulting in the lockfile being orphaned and left behind.
|
||||||
|
#
|
||||||
|
# Now we catch these errors and remove the lockfile as needed.
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────────────────────────┤
|
||||||
|
|
||||||
|
|
||||||
|
# ─── Example: Breaking change ────────────────────────────────────────────────────────────────────┤
|
||||||
|
# feat(bazel): simplify ng_package by dropping esm5 and fesm5
|
||||||
|
#
|
||||||
|
# esm5 and fesm5 distributions are no longer needed and have been deprecated in the past.
|
||||||
|
#
|
||||||
|
# https://v9.angular.io/guide/deprecations#esm5-and-fesm5-code-formats-in-angular-npm-packages
|
||||||
|
#
|
||||||
|
# This commit modifies ng_package to no longer distribute these two formats in npm packages built by
|
||||||
|
# ng_package (e.g. @angular/core).
|
||||||
|
#
|
||||||
|
# This commit intentionally doesn't fully clean up the ng_package rule to remove all traces of esm5
|
||||||
|
# and fems5 build artifacts as that is a bigger cleanup and currently we are narrowing down the
|
||||||
|
# scope of this change to the MVP needed for v10, which in this case is 'do not put esm5 and fesm5'
|
||||||
|
# into the npm packages.
|
||||||
|
#
|
||||||
|
# More cleanup to follow: https://angular-team.atlassian.net/browse/FW-2143
|
||||||
|
#
|
||||||
|
# BREAKING CHANGE: esm5 and fesm5 format is no longer distributed in Angular's npm packages e.g.
|
||||||
|
# @angular/core
|
||||||
|
#
|
||||||
|
# Angular CLI will automatically downlevel the code to es5 if differential loading is enabled in the
|
||||||
|
# Angular project, so no action is required from Angular CLI users.
|
||||||
|
#
|
||||||
|
# If you are not using Angular CLI to build your application or library, and you need to be able to
|
||||||
|
# build es5 artifacts, then you will need to downlevel the distributed Angular code to es5 on your
|
||||||
|
# own.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Fixes #1234
|
||||||
|
# ─────────────────────────────────────────────────────────────────────────────────────────────────┤
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
# Angular Commit Message Format
|
||||||
|
# =============================
|
||||||
|
#
|
||||||
|
# The full specification of the Angular Commit Message Format can be found at
|
||||||
|
# https://github.com/angular/angular/blob/master/CONTRIBUTING.md#commit
|
||||||
|
#
|
||||||
|
# The following is an excerpt of the specification with the most commonly needed info.
|
||||||
|
#
|
||||||
|
# Each commit message consists of a *header*, a *body*, and a *footer*.
|
||||||
|
#
|
||||||
|
# <header>
|
||||||
|
# <BLANK LINE>
|
||||||
|
# <body>
|
||||||
|
# <BLANK LINE>
|
||||||
|
# <footer>
|
||||||
|
#
|
||||||
|
# The header is mandatory.
|
||||||
|
#
|
||||||
|
# The body is mandatory for all commits except for those of scope "docs". When the body is required
|
||||||
|
# it must be at least 20 characters long.
|
||||||
|
#
|
||||||
|
# The footer is optional.
|
||||||
|
#
|
||||||
|
# Any line of the commit message cannot be longer than 100 characters.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Commit Message Header
|
||||||
|
# ---------------------
|
||||||
|
#
|
||||||
|
# <type>(<scope>): <short summary>
|
||||||
|
# │ │ │
|
||||||
|
# │ │ └─⫸ Summary in present tense. Not capitalized. No period at the end.
|
||||||
|
# │ │
|
||||||
|
# │ └─⫸ Commit Scope: animations|bazel|benchpress|common|compiler|compiler-cli|core|
|
||||||
|
# │ elements|forms|http|language-service|localize|platform-browser|
|
||||||
|
# │ platform-browser-dynamic|platform-server|router|service-worker|
|
||||||
|
# │ upgrade|zone.js|packaging|changelog|dev-infra|docs-infra|migrations|
|
||||||
|
# │ ngcc|ve
|
||||||
|
# │ https://github.com/angular/angular/blob/master/CONTRIBUTING.md#scope
|
||||||
|
# │
|
||||||
|
# └─⫸ Commit Type: build|ci|docs|feat|fix|perf|refactor|style|test
|
||||||
|
# https://github.com/angular/angular/blob/master/CONTRIBUTING.md#type
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Commit Message Body
|
||||||
|
# ---------------------
|
||||||
|
#
|
||||||
|
# Just as in the summary, use the imperative, present tense: "fix" not "fixed" nor "fixes".
|
||||||
|
#
|
||||||
|
# Explain the motivation for the change in the commit message body. This commit message should
|
||||||
|
# explain WHY you are making the change. You can include a comparison of the previous behavior with
|
||||||
|
# the new behavior in order to illustrate the impact of the change.
|
||||||
|
#
|
||||||
|
#
|
||||||
|
# Commit Message Footer
|
||||||
|
# ---------------------
|
||||||
|
#
|
||||||
|
# The footer can contain information about breaking changes and is also the place to reference
|
||||||
|
# GitHub issues, Jira tickets, and other PRs that this commit closes or is related to.
|
||||||
|
#
|
||||||
|
# ```
|
||||||
|
# BREAKING CHANGE: <breaking change summary>
|
||||||
|
# <BLANK LINE>
|
||||||
|
# <breaking change description + migration instructions>
|
||||||
|
# <BLANK LINE>
|
||||||
|
# <BLANK LINE>
|
||||||
|
# Fixes #<issue number>
|
||||||
|
# ```
|
||||||
|
#
|
||||||
|
# Breaking Change section should start with the phrase "BREAKING CHANGE: " followed by a summary of
|
||||||
|
# the breaking change, a blank line, and a detailed description of the breaking change that also
|
||||||
|
# includes migration instructions.
|
||||||
|
#
|
19
.ng-dev/caretaker.ts
Normal file
19
.ng-dev/caretaker.ts
Normal file
@ -0,0 +1,19 @@
|
|||||||
|
import {CaretakerConfig} from '../dev-infra/caretaker/config';
|
||||||
|
|
||||||
|
/** The configuration for `ng-dev caretaker` commands. */
|
||||||
|
export const caretaker: CaretakerConfig = {
|
||||||
|
githubQueries: [
|
||||||
|
{
|
||||||
|
name: 'Merge Queue',
|
||||||
|
query: `is:pr is:open status:success label:"action: merge"`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Merge Assistance Queue',
|
||||||
|
query: `is:pr is:open label:"action: merge-assistance"`,
|
||||||
|
},
|
||||||
|
{
|
||||||
|
name: 'Initial Triage Queue',
|
||||||
|
query: `is:open no:milestone`,
|
||||||
|
}
|
||||||
|
]
|
||||||
|
};
|
40
.ng-dev/commit-message.ts
Normal file
40
.ng-dev/commit-message.ts
Normal file
@ -0,0 +1,40 @@
|
|||||||
|
import {CommitMessageConfig} from '../dev-infra/commit-message/config';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* The configuration for `ng-dev commit-message` commands.
|
||||||
|
*/
|
||||||
|
export const commitMessage: CommitMessageConfig = {
|
||||||
|
maxLineLength: 120,
|
||||||
|
minBodyLength: 20,
|
||||||
|
minBodyLengthTypeExcludes: ['docs'],
|
||||||
|
scopes: [
|
||||||
|
'animations',
|
||||||
|
'bazel',
|
||||||
|
'benchpress',
|
||||||
|
'changelog',
|
||||||
|
'common',
|
||||||
|
'compiler',
|
||||||
|
'compiler-cli',
|
||||||
|
'core',
|
||||||
|
'dev-infra',
|
||||||
|
'docs-infra',
|
||||||
|
'elements',
|
||||||
|
'forms',
|
||||||
|
'http',
|
||||||
|
'language-service',
|
||||||
|
'localize',
|
||||||
|
'migrations',
|
||||||
|
'ngcc',
|
||||||
|
'packaging',
|
||||||
|
'platform-browser',
|
||||||
|
'platform-browser-dynamic',
|
||||||
|
'platform-server',
|
||||||
|
'platform-webworker',
|
||||||
|
'platform-webworker-dynamic',
|
||||||
|
'router',
|
||||||
|
'service-worker',
|
||||||
|
'upgrade',
|
||||||
|
've',
|
||||||
|
'zone.js',
|
||||||
|
]
|
||||||
|
};
|
15
.ng-dev/config.ts
Normal file
15
.ng-dev/config.ts
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
import {caretaker} from './caretaker';
|
||||||
|
import {commitMessage} from './commit-message';
|
||||||
|
import {format} from './format';
|
||||||
|
import {github} from './github';
|
||||||
|
import {merge} from './merge';
|
||||||
|
import {release} from './release';
|
||||||
|
|
||||||
|
module.exports = {
|
||||||
|
commitMessage,
|
||||||
|
format,
|
||||||
|
github,
|
||||||
|
merge,
|
||||||
|
caretaker,
|
||||||
|
release,
|
||||||
|
};
|
22
.ng-dev/format.ts
Normal file
22
.ng-dev/format.ts
Normal file
@ -0,0 +1,22 @@
|
|||||||
|
import {FormatConfig} from '../dev-infra/format/config';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration for the `ng-dev format` command.
|
||||||
|
*/
|
||||||
|
export const format: FormatConfig = {
|
||||||
|
'clang-format': {
|
||||||
|
'matchers': [
|
||||||
|
'**/*.{js,ts}',
|
||||||
|
// TODO: burn down format failures and remove aio and integration exceptions.
|
||||||
|
'!aio/**',
|
||||||
|
'!integration/**',
|
||||||
|
// Both third_party and .yarn are directories containing copied code which should
|
||||||
|
// not be modified.
|
||||||
|
'!third_party/**',
|
||||||
|
'!.yarn/**',
|
||||||
|
// Do not format d.ts files as they are generated
|
||||||
|
'!**/*.d.ts',
|
||||||
|
]
|
||||||
|
},
|
||||||
|
'buildifier': true
|
||||||
|
};
|
15
.ng-dev/gitconfig
Normal file
15
.ng-dev/gitconfig
Normal file
@ -0,0 +1,15 @@
|
|||||||
|
# The file is inert unless it's explicitly included into the local git config via:
|
||||||
|
#
|
||||||
|
# ```
|
||||||
|
# git config --add include.path '../.ng-dev/gitconfig'
|
||||||
|
# ```
|
||||||
|
#
|
||||||
|
# Calling that command will append the following into `.git/config` of the current git workspace
|
||||||
|
# (i.e. $GIT_DIR, typically `angular/.git/config`):
|
||||||
|
#
|
||||||
|
# ```
|
||||||
|
# [include]
|
||||||
|
# path = ../.ng-dev/gitconfig
|
||||||
|
# ```
|
||||||
|
[commit]
|
||||||
|
template = .gitmessage
|
11
.ng-dev/github.ts
Normal file
11
.ng-dev/github.ts
Normal file
@ -0,0 +1,11 @@
|
|||||||
|
import {GithubConfig} from '../dev-infra/utils/config';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Github configuration for the `ng-dev` command. This repository is used as
|
||||||
|
* remote for the merge script and other utilities like `ng-dev pr rebase`.
|
||||||
|
*/
|
||||||
|
|
||||||
|
export const github: GithubConfig = {
|
||||||
|
owner: 'angular',
|
||||||
|
name: 'angular'
|
||||||
|
};
|
28
.ng-dev/merge.ts
Normal file
28
.ng-dev/merge.ts
Normal file
@ -0,0 +1,28 @@
|
|||||||
|
import {DevInfraMergeConfig} from '../dev-infra/pr/merge/config';
|
||||||
|
import {getDefaultTargetLabelConfiguration} from '../dev-infra/pr/merge/defaults';
|
||||||
|
import {github} from './github';
|
||||||
|
import {release} from './release';
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Configuration for the merge tool in `ng-dev`. This sets up the labels which
|
||||||
|
* are respected by the merge script (e.g. the target labels).
|
||||||
|
*/
|
||||||
|
export const merge: DevInfraMergeConfig['merge'] = async api => {
|
||||||
|
return {
|
||||||
|
githubApiMerge: false,
|
||||||
|
claSignedLabel: 'cla: yes',
|
||||||
|
mergeReadyLabel: /^action: merge(-assistance)?/,
|
||||||
|
caretakerNoteLabel: 'action: merge-assistance',
|
||||||
|
commitMessageFixupLabel: 'commit message fixup',
|
||||||
|
// We can pick any of the NPM packages as we are in a monorepo where all packages are
|
||||||
|
// published together with the same version and branching.
|
||||||
|
labels: await getDefaultTargetLabelConfiguration(api, github, release),
|
||||||
|
requiredBaseCommits: {
|
||||||
|
// PRs that target either `master` or the patch branch, need to be rebased
|
||||||
|
// on top of the latest commit message validation fix.
|
||||||
|
// These SHAs are the commits that update the required license text in the header.
|
||||||
|
'master': '5aeb9a4124922d8ac08eb73b8f322905a32b0b3a',
|
||||||
|
'10.0.x': '27b95ba64a5d99757f4042073fd1860e20e3ed24',
|
||||||
|
},
|
||||||
|
};
|
||||||
|
};
|
33
.ng-dev/release.ts
Normal file
33
.ng-dev/release.ts
Normal file
@ -0,0 +1,33 @@
|
|||||||
|
import {join} from 'path';
|
||||||
|
import {exec} from 'shelljs';
|
||||||
|
import {ReleaseConfig} from '../dev-infra/release/config';
|
||||||
|
|
||||||
|
/** Configuration for the `ng-dev release` command. */
|
||||||
|
export const release: ReleaseConfig = {
|
||||||
|
npmPackages: [
|
||||||
|
'@angular/animations',
|
||||||
|
'@angular/bazel',
|
||||||
|
'@angular/common',
|
||||||
|
'@angular/compiler',
|
||||||
|
'@angular/compiler-cli',
|
||||||
|
'@angular/core',
|
||||||
|
'@angular/elements',
|
||||||
|
'@angular/forms',
|
||||||
|
'@angular/language-service',
|
||||||
|
'@angular/localize',
|
||||||
|
'@angular/platform-browser',
|
||||||
|
'@angular/platform-browser-dynamic',
|
||||||
|
'@angular/platform-server',
|
||||||
|
'@angular/platform-webworker',
|
||||||
|
'@angular/platform-webworker-dynamic',
|
||||||
|
'@angular/router',
|
||||||
|
'@angular/service-worker',
|
||||||
|
'@angular/upgrade',
|
||||||
|
],
|
||||||
|
// TODO: Implement release package building here.
|
||||||
|
buildPackages: async () => [],
|
||||||
|
// TODO: This can be removed once there is an org-wide tool for changelog generation.
|
||||||
|
generateReleaseNotesForHead: async () => {
|
||||||
|
exec('yarn -s gulp changelog', {cwd: join(__dirname, '../')});
|
||||||
|
},
|
||||||
|
};
|
367
.pullapprove.yml
367
.pullapprove.yml
@ -34,41 +34,8 @@
|
|||||||
####################################################################################
|
####################################################################################
|
||||||
# GitHub usernames
|
# GitHub usernames
|
||||||
####################################################################################
|
####################################################################################
|
||||||
# aikidave - Dave Shevitz
|
# See reviewer list under `required-minimum-review` group. Team member names and
|
||||||
# alan-agius4 - Alan Agius
|
# usernames are managed there.
|
||||||
# alxhub - Alex Rickabaugh
|
|
||||||
# AndrewKushnir - Andrew Kushnir
|
|
||||||
# andrewseguin - Andrew Seguin
|
|
||||||
# atscott - Andrew Scott
|
|
||||||
# ayazhafiz - Ayaz Hafiz
|
|
||||||
# clydin - Charles Lyding
|
|
||||||
# crisbeto - Kristiyan Kostadinov
|
|
||||||
# dennispbrown - Denny Brown
|
|
||||||
# devversion - Paul Gschwendtner
|
|
||||||
# dgp1130 - Doug Parker
|
|
||||||
# filipesilva - Filipe Silva
|
|
||||||
# gkalpak - Georgios Kalpakas
|
|
||||||
# gregmagolan - Greg Magolan
|
|
||||||
# IgorMinar - Igor Minar
|
|
||||||
# jbogarthyde - Judy Bogart
|
|
||||||
# jelbourn - Jeremy Elbourn
|
|
||||||
# JiaLiPassion - Jia Li
|
|
||||||
# JoostK - Joost Koehoorn
|
|
||||||
# josephperrott - Joey Perrott
|
|
||||||
# juleskremer - Jules Kremer
|
|
||||||
# kapunahelewong - Kapunahele Wong
|
|
||||||
# kara - Kara Erickson
|
|
||||||
# kyliau - Keen Yee Liau
|
|
||||||
# manughub - Manu Murthy
|
|
||||||
# matsko - Matias Niemela
|
|
||||||
# mgechev - Minko Gechev
|
|
||||||
# mhevery - Miško Hevery
|
|
||||||
# michaelprentice - Michael Prentice
|
|
||||||
# mmalerba - Miles Malerba
|
|
||||||
# petebacondarwin - Pete Bacon Darwin
|
|
||||||
# pkozlowski-opensource - Pawel Kozlowski
|
|
||||||
# robwormald - Rob Wormald
|
|
||||||
# StephenFluin - Stephen Fluin
|
|
||||||
|
|
||||||
|
|
||||||
####################################################################################
|
####################################################################################
|
||||||
@ -80,8 +47,8 @@
|
|||||||
# Used for approving minor changes, large-scale refactorings, and in emergency situations.
|
# Used for approving minor changes, large-scale refactorings, and in emergency situations.
|
||||||
#
|
#
|
||||||
# IgorMinar
|
# IgorMinar
|
||||||
|
# jelbourn
|
||||||
# josephperrott
|
# josephperrott
|
||||||
# kara
|
|
||||||
# mhevery
|
# mhevery
|
||||||
#
|
#
|
||||||
# =========================================================
|
# =========================================================
|
||||||
@ -100,8 +67,35 @@ version: 3
|
|||||||
# Meta field that goes unused by PullApprove to allow for defining aliases to be
|
# Meta field that goes unused by PullApprove to allow for defining aliases to be
|
||||||
# used throughout the config.
|
# used throughout the config.
|
||||||
meta:
|
meta:
|
||||||
1: &can-be-global-approved "\"global-approvers\" not in groups.approved"
|
# The following groups have no file based conditions and will be initially `active` on all PRs
|
||||||
2: &can-be-global-docs-approved "\"global-docs-approvers\" not in groups.approved"
|
# - `global-approvers`
|
||||||
|
# - `global-docs-approvers`
|
||||||
|
# - `required-minimum-review`
|
||||||
|
#
|
||||||
|
# By checking the number of active/pending/rejected groups when these are excluded, we can determine
|
||||||
|
# if any other groups are matched.
|
||||||
|
#
|
||||||
|
# Note: Because all inactive groups start as pending, we are only checking pending and rejected active groups.
|
||||||
|
#
|
||||||
|
# Also note that the ordering of groups matters in this file. The only groups visible to the current
|
||||||
|
# one are those that appear above it.
|
||||||
|
no-groups-above-this-pending: &no-groups-above-this-pending
|
||||||
|
len(groups.active.pending.exclude("required-minimum-review").exclude("global-approvers").exclude("global-docs-approvers")) == 0
|
||||||
|
no-groups-above-this-rejected: &no-groups-above-this-rejected
|
||||||
|
len(groups.active.rejected.exclude("required-minimum-review").exclude("global-approvers").exclude("global-docs-approvers")) == 0
|
||||||
|
no-groups-above-this-active: &no-groups-above-this-active
|
||||||
|
len(groups.active.exclude("required-minimum-review").exclude("global-approvers").exclude("global-docs-approvers")) == 0
|
||||||
|
|
||||||
|
can-be-global-approved: &can-be-global-approved "\"global-approvers\" not in groups.approved"
|
||||||
|
can-be-global-docs-approved: &can-be-global-docs-approved "\"global-docs-approvers\" not in groups.approved"
|
||||||
|
defaults: &defaults
|
||||||
|
reviews:
|
||||||
|
# Authors provide their approval implicitly, this approval allows for a reviewer
|
||||||
|
# from a group not to need a review specifically for an area of the repository
|
||||||
|
# they own. This is coupled with the `required-minimum-review` group which requires
|
||||||
|
# that all PRs are reviewed by at least one team member who is not the author of
|
||||||
|
# the PR.
|
||||||
|
author_value: 1
|
||||||
|
|
||||||
# turn on 'draft' support
|
# turn on 'draft' support
|
||||||
# https://docs.pullapprove.com/config/github-api-version/
|
# https://docs.pullapprove.com/config/github-api-version/
|
||||||
@ -157,10 +151,63 @@ groups:
|
|||||||
required: 1
|
required: 1
|
||||||
reviewed_for: required
|
reviewed_for: required
|
||||||
|
|
||||||
|
# =========================================================
|
||||||
|
# Require review on all PRs
|
||||||
|
#
|
||||||
|
# All PRs require at least one review. This rule will not
|
||||||
|
# request any reviewers, however will require that at least
|
||||||
|
# one review is provided before the group is satisfied.
|
||||||
|
# =========================================================
|
||||||
|
required-minimum-review:
|
||||||
|
conditions:
|
||||||
|
- *can-be-global-approved
|
||||||
|
- *can-be-global-docs-approved
|
||||||
|
reviews:
|
||||||
|
request: 0 # Do not request any reviews from the reviewer group
|
||||||
|
required: 1 # Require that all PRs have approval from at least one of the users in the group
|
||||||
|
author_value: 0 # The author of the PR cannot provide an approval for themself
|
||||||
|
reviewers:
|
||||||
|
users:
|
||||||
|
- aikidave # Dave Shevitz
|
||||||
|
- alan-agius4 # Alan Agius
|
||||||
|
- alxhub # Alex Rickabaugh
|
||||||
|
- AndrewKushnir # Andrew Kushnir
|
||||||
|
- andrewseguin # Andrew Seguin
|
||||||
|
- atscott # Andrew Scott
|
||||||
|
- ayazhafiz # Ayaz Hafiz
|
||||||
|
- clydin # Charles Lyding
|
||||||
|
- crisbeto # Kristiyan Kostadinov
|
||||||
|
- dennispbrown # Denny Brown
|
||||||
|
- devversion # Paul Gschwendtner
|
||||||
|
- dgp1130 # Doug Parker
|
||||||
|
- filipesilva # Filipe Silva
|
||||||
|
- gkalpak # Georgios Kalpakas
|
||||||
|
- gregmagolan # Greg Magolan
|
||||||
|
- IgorMinar # Igor Minar
|
||||||
|
- jbogarthyde # Judy Bogart
|
||||||
|
- jelbourn # Jeremy Elbourn
|
||||||
|
- jessicajaniuk # Jessica Janiuk
|
||||||
|
- JiaLiPassion # Jia Li
|
||||||
|
- JoostK # Joost Koehoorn
|
||||||
|
- josephperrott # Joey Perrott
|
||||||
|
- juleskremer # Jules Kremer
|
||||||
|
- kapunahelewong # Kapunahele Wong
|
||||||
|
- kara # Kara Erickson
|
||||||
|
- kyliau # Keen Yee Liau
|
||||||
|
- manughub # Manu Murthy
|
||||||
|
- mgechev # Minko Gechev
|
||||||
|
- mhevery # Miško Hevery
|
||||||
|
- mmalerba # Miles Malerba
|
||||||
|
- petebacondarwin # Pete Bacon Darwin
|
||||||
|
- pkozlowski-opensource # Pawel Kozlowski
|
||||||
|
- Splaktar # Michael Prentice
|
||||||
|
- StephenFluin # Stephen Fluin
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Framework: Animations
|
# Framework: Animations
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-animations:
|
fw-animations:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -178,13 +225,16 @@ groups:
|
|||||||
])
|
])
|
||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
- matsko
|
- crisbeto
|
||||||
|
- IgorMinar
|
||||||
|
- jelbourn
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Framework: Compiler
|
# Framework: Compiler
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-compiler:
|
fw-compiler:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -203,13 +253,13 @@ groups:
|
|||||||
- alxhub
|
- alxhub
|
||||||
- AndrewKushnir
|
- AndrewKushnir
|
||||||
- JoostK
|
- JoostK
|
||||||
- kara
|
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Framework: Compiler / ngcc
|
# Framework: Compiler / ngcc
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-ngcc:
|
fw-ngcc:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -226,6 +276,7 @@ groups:
|
|||||||
# Framework: Migrations
|
# Framework: Migrations
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-migrations:
|
fw-migrations:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -234,14 +285,14 @@ groups:
|
|||||||
users:
|
users:
|
||||||
- alxhub
|
- alxhub
|
||||||
- crisbeto
|
- crisbeto
|
||||||
- devversion
|
# OOO as of 2020-09-28 - devversion
|
||||||
- kara
|
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Framework: Core
|
# Framework: Core
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-core:
|
fw-core:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -253,8 +304,6 @@ groups:
|
|||||||
'packages/platform-browser/**',
|
'packages/platform-browser/**',
|
||||||
'packages/examples/platform-browser/**',
|
'packages/examples/platform-browser/**',
|
||||||
'packages/platform-browser-dynamic/**',
|
'packages/platform-browser-dynamic/**',
|
||||||
'packages/platform-webworker/**',
|
|
||||||
'packages/platform-webworker-dynamic/**',
|
|
||||||
'packages/examples/common/**',
|
'packages/examples/common/**',
|
||||||
'packages/docs/**',
|
'packages/docs/**',
|
||||||
'aio/content/guide/accessibility.md',
|
'aio/content/guide/accessibility.md',
|
||||||
@ -276,6 +325,7 @@ groups:
|
|||||||
'aio/content/examples/component-interaction/**',
|
'aio/content/examples/component-interaction/**',
|
||||||
'aio/content/images/guide/component-interaction/**',
|
'aio/content/images/guide/component-interaction/**',
|
||||||
'aio/content/guide/component-styles.md',
|
'aio/content/guide/component-styles.md',
|
||||||
|
'aio/content/guide/view-encapsulation.md',
|
||||||
'aio/content/examples/component-styles/**',
|
'aio/content/examples/component-styles/**',
|
||||||
'aio/content/guide/dependency-injection.md',
|
'aio/content/guide/dependency-injection.md',
|
||||||
'aio/content/examples/dependency-injection/**',
|
'aio/content/examples/dependency-injection/**',
|
||||||
@ -285,6 +335,7 @@ groups:
|
|||||||
'aio/content/images/guide/dependency-injection-in-action/**',
|
'aio/content/images/guide/dependency-injection-in-action/**',
|
||||||
'aio/content/guide/dependency-injection-navtree.md',
|
'aio/content/guide/dependency-injection-navtree.md',
|
||||||
'aio/content/guide/dependency-injection-providers.md',
|
'aio/content/guide/dependency-injection-providers.md',
|
||||||
|
'aio/content/guide/lightweight-injection-tokens.md',
|
||||||
'aio/content/guide/displaying-data.md',
|
'aio/content/guide/displaying-data.md',
|
||||||
'aio/content/examples/displaying-data/**',
|
'aio/content/examples/displaying-data/**',
|
||||||
'aio/content/images/guide/displaying-data/**',
|
'aio/content/images/guide/displaying-data/**',
|
||||||
@ -315,26 +366,38 @@ groups:
|
|||||||
'aio/content/guide/ngmodule-vs-jsmodule.md',
|
'aio/content/guide/ngmodule-vs-jsmodule.md',
|
||||||
'aio/content/guide/module-types.md',
|
'aio/content/guide/module-types.md',
|
||||||
'aio/content/guide/template-syntax.md',
|
'aio/content/guide/template-syntax.md',
|
||||||
|
'aio/content/guide/built-in-template-functions.md',
|
||||||
'aio/content/examples/built-in-template-functions/**',
|
'aio/content/examples/built-in-template-functions/**',
|
||||||
|
'aio/content/guide/event-binding.md',
|
||||||
'aio/content/examples/event-binding/**',
|
'aio/content/examples/event-binding/**',
|
||||||
|
'aio/content/guide/interpolation.md',
|
||||||
'aio/content/examples/interpolation/**',
|
'aio/content/examples/interpolation/**',
|
||||||
'aio/content/examples/template-syntax/**',
|
'aio/content/examples/template-syntax/**',
|
||||||
'aio/content/images/guide/template-syntax/**',
|
'aio/content/images/guide/template-syntax/**',
|
||||||
|
'aio/content/guide/binding-syntax.md',
|
||||||
'aio/content/examples/binding-syntax/**',
|
'aio/content/examples/binding-syntax/**',
|
||||||
|
'aio/content/guide/property-binding.md',
|
||||||
'aio/content/examples/property-binding/**',
|
'aio/content/examples/property-binding/**',
|
||||||
|
'aio/content/guide/attribute-binding.md',
|
||||||
'aio/content/examples/attribute-binding/**',
|
'aio/content/examples/attribute-binding/**',
|
||||||
|
'aio/content/guide/two-way-binding.md',
|
||||||
'aio/content/examples/two-way-binding/**',
|
'aio/content/examples/two-way-binding/**',
|
||||||
|
'aio/content/guide/built-in-directives.md',
|
||||||
'aio/content/examples/built-in-directives/**',
|
'aio/content/examples/built-in-directives/**',
|
||||||
'aio/content/images/guide/built-in-directives/**',
|
'aio/content/images/guide/built-in-directives/**',
|
||||||
|
'aio/content/guide/template-reference-variables.md',
|
||||||
'aio/content/examples/template-reference-variables/**',
|
'aio/content/examples/template-reference-variables/**',
|
||||||
|
'aio/content/guide/inputs-outputs.md',
|
||||||
'aio/content/examples/inputs-outputs/**',
|
'aio/content/examples/inputs-outputs/**',
|
||||||
'aio/content/images/guide/inputs-outputs/**',
|
'aio/content/images/guide/inputs-outputs/**',
|
||||||
|
'aio/content/guide/template-expression-operators.md',
|
||||||
'aio/content/examples/template-expression-operators/**',
|
'aio/content/examples/template-expression-operators/**',
|
||||||
'aio/content/guide/pipes.md',
|
'aio/content/guide/pipes.md',
|
||||||
'aio/content/examples/pipes/**',
|
'aio/content/examples/pipes/**',
|
||||||
'aio/content/images/guide/pipes/**',
|
'aio/content/images/guide/pipes/**',
|
||||||
'aio/content/guide/providers.md',
|
'aio/content/guide/providers.md',
|
||||||
'aio/content/examples/providers/**',
|
'aio/content/examples/providers/**',
|
||||||
|
'aio/content/images/guide/providers/**',
|
||||||
'aio/content/guide/singleton-services.md',
|
'aio/content/guide/singleton-services.md',
|
||||||
'aio/content/guide/set-document-title.md',
|
'aio/content/guide/set-document-title.md',
|
||||||
'aio/content/examples/set-document-title/**',
|
'aio/content/examples/set-document-title/**',
|
||||||
@ -342,7 +405,10 @@ groups:
|
|||||||
'aio/content/guide/sharing-ngmodules.md',
|
'aio/content/guide/sharing-ngmodules.md',
|
||||||
'aio/content/guide/structural-directives.md',
|
'aio/content/guide/structural-directives.md',
|
||||||
'aio/content/examples/structural-directives/**',
|
'aio/content/examples/structural-directives/**',
|
||||||
|
'aio/content/guide/svg-in-templates.md',
|
||||||
|
'aio/content/guide/style-precedence.md',
|
||||||
'aio/content/images/guide/structural-directives/**',
|
'aio/content/images/guide/structural-directives/**',
|
||||||
|
'aio/content/guide/template-statements.md',
|
||||||
'aio/content/guide/user-input.md',
|
'aio/content/guide/user-input.md',
|
||||||
'aio/content/examples/user-input/**',
|
'aio/content/examples/user-input/**',
|
||||||
'aio/content/images/guide/user-input/**'
|
'aio/content/images/guide/user-input/**'
|
||||||
@ -351,22 +417,23 @@ groups:
|
|||||||
users:
|
users:
|
||||||
- alxhub
|
- alxhub
|
||||||
- AndrewKushnir
|
- AndrewKushnir
|
||||||
- kara
|
- atscott
|
||||||
|
- ~kara # do not request reviews from Kara, but allow her to approve PRs
|
||||||
- mhevery
|
- mhevery
|
||||||
- pkozlowski-opensource
|
# OOO as of 2020-09-28 - pkozlowski-opensource
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Framework: Http
|
# Framework: Http
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-http:
|
fw-http:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
- >
|
- >
|
||||||
contains_any_globs(files, [
|
contains_any_globs(files, [
|
||||||
'packages/common/http/**',
|
'packages/common/http/**',
|
||||||
'packages/http/**',
|
|
||||||
'packages/examples/http/**',
|
'packages/examples/http/**',
|
||||||
'aio/content/guide/http.md',
|
'aio/content/guide/http.md',
|
||||||
'aio/content/examples/http/**',
|
'aio/content/examples/http/**',
|
||||||
@ -382,6 +449,7 @@ groups:
|
|||||||
# Framework: Elements
|
# Framework: Elements
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-elements:
|
fw-elements:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -402,6 +470,7 @@ groups:
|
|||||||
# Framework: Forms
|
# Framework: Forms
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-forms:
|
fw-forms:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -434,14 +503,15 @@ groups:
|
|||||||
# Framework: i18n
|
# Framework: i18n
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-i18n:
|
fw-i18n:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
- >
|
- >
|
||||||
contains_any_globs(files, [
|
contains_any_globs(files, [
|
||||||
'packages/core/src/i18n/**',
|
'packages/core/src/i18n/**',
|
||||||
'packages/core/src/render3/i18n.ts',
|
'packages/core/src/render3/i18n/**',
|
||||||
'packages/core/src/render3/i18n.md',
|
'packages/core/src/render3/instructions/i18n.ts',
|
||||||
'packages/core/src/render3/interfaces/i18n.ts',
|
'packages/core/src/render3/interfaces/i18n.ts',
|
||||||
'packages/common/locales/**',
|
'packages/common/locales/**',
|
||||||
'packages/common/src/i18n/**',
|
'packages/common/src/i18n/**',
|
||||||
@ -467,6 +537,7 @@ groups:
|
|||||||
# Framework: Platform Server
|
# Framework: Platform Server
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-platform-server:
|
fw-platform-server:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -486,6 +557,7 @@ groups:
|
|||||||
# Framework: Router
|
# Framework: Router
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-router:
|
fw-router:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -494,6 +566,9 @@ groups:
|
|||||||
'packages/router/**',
|
'packages/router/**',
|
||||||
'packages/examples/router/**',
|
'packages/examples/router/**',
|
||||||
'aio/content/guide/router.md',
|
'aio/content/guide/router.md',
|
||||||
|
'aio/content/guide/router-tutorial.md',
|
||||||
|
'aio/content/guide/router-tutorial-toh.md',
|
||||||
|
'aio/content/examples/router-tutorial/**',
|
||||||
'aio/content/examples/router/**',
|
'aio/content/examples/router/**',
|
||||||
'aio/content/images/guide/router/**'
|
'aio/content/images/guide/router/**'
|
||||||
])
|
])
|
||||||
@ -506,6 +581,7 @@ groups:
|
|||||||
# Framework: Service Worker
|
# Framework: Service Worker
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-service-worker:
|
fw-service-worker:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -533,6 +609,7 @@ groups:
|
|||||||
# Framework: Upgrade
|
# Framework: Upgrade
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-upgrade:
|
fw-upgrade:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -563,13 +640,22 @@ groups:
|
|||||||
# Framework: Testing
|
# Framework: Testing
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-testing:
|
fw-testing:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
- >
|
- >
|
||||||
contains_any_globs(files, [
|
contains_any_globs(files.exclude('packages/compiler-cli/**'), [
|
||||||
'**/testing/**',
|
'**/testing/**',
|
||||||
'aio/content/guide/testing.md',
|
'aio/content/guide/testing.md',
|
||||||
|
'aio/content/guide/test-debugging.md',
|
||||||
|
'aio/content/guide/testing-attribute-directives.md',
|
||||||
|
'aio/content/guide/testing-code-coverage.md',
|
||||||
|
'aio/content/guide/testing-components-basics.md',
|
||||||
|
'aio/content/guide/testing-components-scenarios.md',
|
||||||
|
'aio/content/guide/testing-pipes.md',
|
||||||
|
'aio/content/guide/testing-services.md',
|
||||||
|
'aio/content/guide/testing-utility-apis.md',
|
||||||
'aio/content/examples/testing/**',
|
'aio/content/examples/testing/**',
|
||||||
'aio/content/images/guide/testing/**'
|
'aio/content/images/guide/testing/**'
|
||||||
])
|
])
|
||||||
@ -577,14 +663,14 @@ groups:
|
|||||||
users:
|
users:
|
||||||
- AndrewKushnir
|
- AndrewKushnir
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
- kara
|
# OOO as of 2020-09-28 - pkozlowski-opensource
|
||||||
- pkozlowski-opensource
|
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Framework: Benchmarks
|
# Framework: Benchmarks
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-benchmarks:
|
fw-benchmarks:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- >
|
- >
|
||||||
@ -594,14 +680,14 @@ groups:
|
|||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
- kara
|
# OOO as of 2020-09-28 - pkozlowski-opensource
|
||||||
- pkozlowski-opensource
|
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Framework: Playground
|
# Framework: Playground
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-playground:
|
fw-playground:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- >
|
- >
|
||||||
@ -611,13 +697,15 @@ groups:
|
|||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
- kara
|
- jelbourn
|
||||||
|
# OOO as of 2020-09-28 - pkozlowski-opensource
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Framework: Security
|
# Framework: Security
|
||||||
# =========================================================
|
# =========================================================
|
||||||
fw-security:
|
fw-security:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -635,18 +723,25 @@ groups:
|
|||||||
users:
|
users:
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
- mhevery
|
- mhevery
|
||||||
|
- jelbourn
|
||||||
|
# OOO as of 2020-09-28 - pkozlowski-opensource
|
||||||
|
reviews:
|
||||||
|
request: -1 # request reviews from everyone
|
||||||
|
required: 2 # require at least 2 approvals
|
||||||
|
reviewed_for: required
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Bazel
|
# Bazel
|
||||||
# =========================================================
|
# =========================================================
|
||||||
bazel:
|
bazel:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
- >
|
- >
|
||||||
contains_any_globs(files, [
|
contains_any_globs(files, [
|
||||||
'packages/bazel/**',
|
'packages/bazel/**',
|
||||||
'aio/content/guide/bazel.md'
|
|
||||||
])
|
])
|
||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
@ -659,6 +754,7 @@ groups:
|
|||||||
# Language Service
|
# Language Service
|
||||||
# =========================================================
|
# =========================================================
|
||||||
language-service:
|
language-service:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -678,6 +774,7 @@ groups:
|
|||||||
# zone.js
|
# zone.js
|
||||||
# =========================================================
|
# =========================================================
|
||||||
zone-js:
|
zone-js:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -691,11 +788,27 @@ groups:
|
|||||||
- JiaLiPassion
|
- JiaLiPassion
|
||||||
- mhevery
|
- mhevery
|
||||||
|
|
||||||
|
# =========================================================
|
||||||
|
# in-memory-web-api
|
||||||
|
# =========================================================
|
||||||
|
in-memory-web-api:
|
||||||
|
conditions:
|
||||||
|
- *can-be-global-approved
|
||||||
|
- *can-be-global-docs-approved
|
||||||
|
- >
|
||||||
|
contains_any_globs(files, [
|
||||||
|
'packages/misc/angular-in-memory-web-api/**',
|
||||||
|
])
|
||||||
|
reviewers:
|
||||||
|
users:
|
||||||
|
- IgorMinar
|
||||||
|
- crisbeto
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Benchpress
|
# Benchpress
|
||||||
# =========================================================
|
# =========================================================
|
||||||
benchpress:
|
benchpress:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -706,12 +819,14 @@ groups:
|
|||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
- alxhub
|
- alxhub
|
||||||
|
- josephperrott
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Integration Tests
|
# Integration Tests
|
||||||
# =========================================================
|
# =========================================================
|
||||||
integration-tests:
|
integration-tests:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- >
|
- >
|
||||||
@ -722,7 +837,6 @@ groups:
|
|||||||
users:
|
users:
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
- josephperrott
|
- josephperrott
|
||||||
- kara
|
|
||||||
- mhevery
|
- mhevery
|
||||||
|
|
||||||
|
|
||||||
@ -730,6 +844,7 @@ groups:
|
|||||||
# Docs: Gettings Started & Tutorial
|
# Docs: Gettings Started & Tutorial
|
||||||
# =========================================================
|
# =========================================================
|
||||||
docs-getting-started-and-tutorial:
|
docs-getting-started-and-tutorial:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -762,11 +877,13 @@ groups:
|
|||||||
# Docs: Marketing
|
# Docs: Marketing
|
||||||
# =========================================================
|
# =========================================================
|
||||||
docs-marketing:
|
docs-marketing:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
- >
|
- >
|
||||||
contains_any_globs(files, [
|
contains_any_globs(files, [
|
||||||
|
'aio/content/guide/roadmap.md',
|
||||||
'aio/content/marketing/**',
|
'aio/content/marketing/**',
|
||||||
'aio/content/images/bios/**',
|
'aio/content/images/bios/**',
|
||||||
'aio/content/images/marketing/**',
|
'aio/content/images/marketing/**',
|
||||||
@ -776,14 +893,15 @@ groups:
|
|||||||
])
|
])
|
||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
|
- aikidave
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
- StephenFluin
|
- StephenFluin
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Docs: Observables
|
# Docs: Observables
|
||||||
# =========================================================
|
# =========================================================
|
||||||
docs-observables:
|
docs-observables:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -809,6 +927,7 @@ groups:
|
|||||||
# Docs: Packaging, Tooling, Releasing
|
# Docs: Packaging, Tooling, Releasing
|
||||||
# =========================================================
|
# =========================================================
|
||||||
docs-packaging-and-releasing:
|
docs-packaging-and-releasing:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -828,20 +947,47 @@ groups:
|
|||||||
'aio/content/guide/migration-localize.md',
|
'aio/content/guide/migration-localize.md',
|
||||||
'aio/content/guide/migration-module-with-providers.md',
|
'aio/content/guide/migration-module-with-providers.md',
|
||||||
'aio/content/guide/static-query-migration.md',
|
'aio/content/guide/static-query-migration.md',
|
||||||
'aio/content/guide/updating-to-version-9.md',
|
'aio/content/guide/updating-to-version-10.md',
|
||||||
'aio/content/guide/ivy-compatibility.md',
|
'aio/content/guide/ivy-compatibility.md',
|
||||||
'aio/content/guide/ivy-compatibility-examples.md'
|
'aio/content/guide/ivy-compatibility-examples.md'
|
||||||
])
|
])
|
||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
- kara
|
- jelbourn
|
||||||
|
|
||||||
|
|
||||||
|
# =========================================================
|
||||||
|
# Tooling: Compiler API shared with Angular CLI
|
||||||
|
#
|
||||||
|
# Changing this API might break Angular CLI, so we require
|
||||||
|
# the CLI team to approve changes here.
|
||||||
|
# =========================================================
|
||||||
|
tooling-cli-shared-api:
|
||||||
|
conditions:
|
||||||
|
- *can-be-global-approved
|
||||||
|
- *can-be-global-docs-approved
|
||||||
|
- >
|
||||||
|
contains_any_globs(files, [
|
||||||
|
'packages/compiler-cli/src/tooling.ts'
|
||||||
|
])
|
||||||
|
reviewers:
|
||||||
|
users:
|
||||||
|
- alan-agius4
|
||||||
|
- clydin
|
||||||
|
- kyliau
|
||||||
|
- IgorMinar
|
||||||
|
reviews:
|
||||||
|
request: -1 # request reviews from everyone
|
||||||
|
required: 2 # require at least 2 approvals
|
||||||
|
reviewed_for: required
|
||||||
|
|
||||||
|
|
||||||
# =========================================================
|
# =========================================================
|
||||||
# Docs: CLI
|
# Docs: CLI
|
||||||
# =========================================================
|
# =========================================================
|
||||||
docs-cli:
|
docs-cli:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -858,8 +1004,12 @@ groups:
|
|||||||
'aio/content/images/guide/deployment/**',
|
'aio/content/images/guide/deployment/**',
|
||||||
'aio/content/guide/file-structure.md',
|
'aio/content/guide/file-structure.md',
|
||||||
'aio/content/guide/ivy.md',
|
'aio/content/guide/ivy.md',
|
||||||
|
'aio/content/guide/strict-mode.md',
|
||||||
'aio/content/guide/web-worker.md',
|
'aio/content/guide/web-worker.md',
|
||||||
'aio/content/guide/workspace-config.md',
|
'aio/content/guide/workspace-config.md',
|
||||||
|
'aio/content/guide/migration-solution-style-tsconfig.md',
|
||||||
|
'aio/content/guide/migration-update-module-and-target-compiler-options.md',
|
||||||
|
'aio/content/guide/migration-update-libraries-tslib.md',
|
||||||
])
|
])
|
||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
@ -872,6 +1022,7 @@ groups:
|
|||||||
# Docs: CLI Libraries
|
# Docs: CLI Libraries
|
||||||
# =========================================================
|
# =========================================================
|
||||||
docs-libraries:
|
docs-libraries:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -892,6 +1043,7 @@ groups:
|
|||||||
# Docs: Schematics
|
# Docs: Schematics
|
||||||
# =========================================================
|
# =========================================================
|
||||||
docs-schematics:
|
docs-schematics:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -914,6 +1066,7 @@ groups:
|
|||||||
# Docs-infra
|
# Docs-infra
|
||||||
# =========================================================
|
# =========================================================
|
||||||
docs-infra:
|
docs-infra:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- *can-be-global-docs-approved
|
- *can-be-global-docs-approved
|
||||||
@ -943,31 +1096,34 @@ groups:
|
|||||||
# Dev-infra
|
# Dev-infra
|
||||||
# =========================================================
|
# =========================================================
|
||||||
dev-infra:
|
dev-infra:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- >
|
- >
|
||||||
contains_any_globs(files, [
|
contains_any_globs(files.exclude("CHANGELOG.md").exclude("packages/compiler-cli/**/BUILD.bazel"), [
|
||||||
'*',
|
'*',
|
||||||
'.circleci/**',
|
'.circleci/**',
|
||||||
'.devcontainer/**',
|
'.devcontainer/**',
|
||||||
'.github/**',
|
'.github/**',
|
||||||
|
'.ng-dev/**',
|
||||||
'.vscode/**',
|
'.vscode/**',
|
||||||
'.yarn/**',
|
'.yarn/**',
|
||||||
'dev-infra/**',
|
'dev-infra/**',
|
||||||
'docs/BAZEL.md',
|
'docs/BAZEL.md',
|
||||||
'docs/CARETAKER.md',
|
'docs/CARETAKER.md',
|
||||||
|
'docs/CODING_STANDARDS.md',
|
||||||
'docs/COMMITTER.md',
|
'docs/COMMITTER.md',
|
||||||
'docs/DEBUG.md',
|
'docs/DEBUG.md',
|
||||||
'docs/DEBUG_COMPONENTS_REPO_IVY.md',
|
'docs/DEBUG_COMPONENTS_REPO_IVY.md',
|
||||||
'docs/DEVELOPER.md',
|
'docs/DEVELOPER.md',
|
||||||
|
'docs/FIXUP_COMMITS.md',
|
||||||
'docs/GITHUB_PROCESS.md',
|
'docs/GITHUB_PROCESS.md',
|
||||||
'docs/PR_REVIEW.md',
|
'docs/PR_REVIEW.md',
|
||||||
'docs/SAVED_REPLIES.md',
|
'docs/SAVED_REPLIES.md',
|
||||||
'docs/TOOLS.md',
|
'docs/TOOLS.md',
|
||||||
'docs/TRIAGE_AND_LABELS.md',
|
'docs/TRIAGE_AND_LABELS.md',
|
||||||
|
'docs/images/**',
|
||||||
'goldens/*',
|
'goldens/*',
|
||||||
'modules/e2e_util/e2e_util.ts',
|
|
||||||
'modules/e2e_util/perf_util.ts',
|
|
||||||
'modules/*',
|
'modules/*',
|
||||||
'packages/*',
|
'packages/*',
|
||||||
'packages/examples/test-utils/**',
|
'packages/examples/test-utils/**',
|
||||||
@ -975,15 +1131,10 @@ groups:
|
|||||||
'packages/examples/*',
|
'packages/examples/*',
|
||||||
'scripts/**',
|
'scripts/**',
|
||||||
'third_party/**',
|
'third_party/**',
|
||||||
'tools/brotli-cli/**',
|
|
||||||
'tools/browsers/**',
|
|
||||||
'tools/build/**',
|
'tools/build/**',
|
||||||
'tools/circular_dependency_test/**',
|
'tools/circular_dependency_test/**',
|
||||||
'tools/contributing-stats/**',
|
'tools/contributing-stats/**',
|
||||||
'tools/components/**',
|
|
||||||
'tools/gulp-tasks/**',
|
'tools/gulp-tasks/**',
|
||||||
'tools/ng_rollup_bundle/**',
|
|
||||||
'tools/ngcontainer/**',
|
|
||||||
'tools/npm/**',
|
'tools/npm/**',
|
||||||
'tools/npm_integration_test/**',
|
'tools/npm_integration_test/**',
|
||||||
'tools/rxjs/**',
|
'tools/rxjs/**',
|
||||||
@ -1002,7 +1153,7 @@ groups:
|
|||||||
])
|
])
|
||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
- devversion
|
# OOO as of 2020-09-28 - devversion
|
||||||
- filipesilva
|
- filipesilva
|
||||||
- gkalpak
|
- gkalpak
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
@ -1013,11 +1164,15 @@ groups:
|
|||||||
# Public API
|
# Public API
|
||||||
# =========================================================
|
# =========================================================
|
||||||
public-api:
|
public-api:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
|
- *no-groups-above-this-pending
|
||||||
|
- *no-groups-above-this-rejected
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- >
|
- >
|
||||||
contains_any_globs(files, [
|
contains_any_globs(files, [
|
||||||
'goldens/public-api/**',
|
'goldens/public-api/**',
|
||||||
|
'CHANGELOG.md',
|
||||||
'docs/NAMING.md',
|
'docs/NAMING.md',
|
||||||
'aio/content/guide/glossary.md',
|
'aio/content/guide/glossary.md',
|
||||||
'aio/content/guide/styleguide.md',
|
'aio/content/guide/styleguide.md',
|
||||||
@ -1026,14 +1181,27 @@ groups:
|
|||||||
])
|
])
|
||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
|
- AndrewKushnir
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
|
- alxhub
|
||||||
|
- atscott
|
||||||
|
- jelbourn
|
||||||
|
- petebacondarwin
|
||||||
|
# OOO as of 2020-09-28 - pkozlowski-opensource
|
||||||
|
reviews:
|
||||||
|
request: 4 # Request reviews from four people
|
||||||
|
required: 3 # Require that three people approve
|
||||||
|
reviewed_for: required
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
# ================================================
|
||||||
# Size tracking
|
# Size tracking
|
||||||
# ================================================
|
# ================================================
|
||||||
size-tracking:
|
size-tracking:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
|
- *no-groups-above-this-pending
|
||||||
|
- *no-groups-above-this-rejected
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- >
|
- >
|
||||||
contains_any_globs(files, [
|
contains_any_globs(files, [
|
||||||
@ -1041,15 +1209,27 @@ groups:
|
|||||||
])
|
])
|
||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
|
- AndrewKushnir
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
- kara
|
- alxhub
|
||||||
|
- atscott
|
||||||
|
- jelbourn
|
||||||
|
- petebacondarwin
|
||||||
|
# OOO as of 2020-09-28 - pkozlowski-opensource
|
||||||
|
reviews:
|
||||||
|
request: 4 # Request reviews from four people
|
||||||
|
required: 2 # Require that two people approve
|
||||||
|
reviewed_for: required
|
||||||
|
|
||||||
|
|
||||||
# ================================================
|
# ================================================
|
||||||
# Circular dependencies
|
# Circular dependencies
|
||||||
# ================================================
|
# ================================================
|
||||||
circular-dependencies:
|
circular-dependencies:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
|
- *no-groups-above-this-pending
|
||||||
|
- *no-groups-above-this-rejected
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- >
|
- >
|
||||||
contains_any_globs(files, [
|
contains_any_globs(files, [
|
||||||
@ -1057,9 +1237,13 @@ groups:
|
|||||||
])
|
])
|
||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
|
- AndrewKushnir
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
- josephperrott
|
- alxhub
|
||||||
- kara
|
- atscott
|
||||||
|
- jelbourn
|
||||||
|
- petebacondarwin
|
||||||
|
# OOO as of 2020-09-28 - pkozlowski-opensource
|
||||||
|
|
||||||
|
|
||||||
####################################################################################
|
####################################################################################
|
||||||
@ -1070,6 +1254,7 @@ groups:
|
|||||||
# Code Ownership
|
# Code Ownership
|
||||||
# =========================================================
|
# =========================================================
|
||||||
code-ownership:
|
code-ownership:
|
||||||
|
<<: *defaults
|
||||||
conditions:
|
conditions:
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
- >
|
- >
|
||||||
@ -1078,19 +1263,43 @@ groups:
|
|||||||
])
|
])
|
||||||
reviewers:
|
reviewers:
|
||||||
users:
|
users:
|
||||||
|
- AndrewKushnir
|
||||||
- IgorMinar
|
- IgorMinar
|
||||||
|
- alxhub
|
||||||
|
- atscott
|
||||||
|
- jelbourn
|
||||||
|
- josephperrott
|
||||||
|
- mhevery
|
||||||
|
|
||||||
|
|
||||||
# ====================================================
|
# ====================================================
|
||||||
# Catch all for if no groups match the code change
|
# Catch all for if no groups match the code change
|
||||||
# ====================================================
|
# ====================================================
|
||||||
fallback:
|
fallback:
|
||||||
|
<<: *defaults
|
||||||
|
# A group is considered to be `active` for a PR if at least one of group's
|
||||||
|
# conditions matches the PR.
|
||||||
|
#
|
||||||
|
# The PullApprove CI check should fail if a PR has no `active` groups, as
|
||||||
|
# this indicates the PR is modifying a file that has no owner.
|
||||||
|
#
|
||||||
|
# This is enforced through the pullapprove verification check done
|
||||||
|
# as part of the CircleCI lint job. Failures in this lint job should be
|
||||||
|
# fixed as part of the PR. This can be done by updating the
|
||||||
|
# `.pullapprove.yml` file cover the unmatched path.
|
||||||
|
# The pullapprove verification script is part of the ng-dev tool and can be
|
||||||
|
# run locally with the command: `yarn -s ng-dev pullapprove verify`
|
||||||
|
#
|
||||||
|
# For cases in which the verification check fails to ensure coverage, this
|
||||||
|
# group will be active. The expectation is that this should be remedied
|
||||||
|
# before merging the PR as described above. In an emergency situation
|
||||||
|
# `global-approvers` can still approve PRs that match this `fallback` rule,
|
||||||
|
# but that should be an exception and not an expectation.
|
||||||
conditions:
|
conditions:
|
||||||
|
- *no-groups-above-this-active
|
||||||
|
# When any of the `global-*` groups is approved, they cause other groups to deactivate.
|
||||||
|
# In those cases, the condition above would evaluate to `true` while in reality, only a global
|
||||||
|
# approval has been provided. To ensure we don't activate the fallback group in such cases,
|
||||||
|
# ensure that no explicit global approval has been provided.
|
||||||
- *can-be-global-approved
|
- *can-be-global-approved
|
||||||
# Groups which are found to have matching conditions are `active`
|
- *can-be-global-docs-approved
|
||||||
# according to PullApprove. If no groups are matched and considered
|
|
||||||
# active, we still want to have a review occur.
|
|
||||||
- len(groups.active) == 0
|
|
||||||
reviewers:
|
|
||||||
users:
|
|
||||||
- IgorMinar
|
|
||||||
|
1
.vscode/recommended-settings.json
vendored
1
.vscode/recommended-settings.json
vendored
@ -26,6 +26,7 @@
|
|||||||
"**/bazel-out": true,
|
"**/bazel-out": true,
|
||||||
"**/dist": true,
|
"**/dist": true,
|
||||||
"**/aio/src/generated": true,
|
"**/aio/src/generated": true,
|
||||||
|
".history": true,
|
||||||
},
|
},
|
||||||
"git.ignoreLimitWarning": true,
|
"git.ignoreLimitWarning": true,
|
||||||
}
|
}
|
@ -44654,7 +44654,7 @@ const FOLDERS_IGNORE = [
|
|||||||
const DEFAULT_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([...FOLDERS_IGNORE,
|
const DEFAULT_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([...FOLDERS_IGNORE,
|
||||||
|
|
||||||
// ignore cruft
|
// ignore cruft
|
||||||
'yarn.lock', '.lock-wscript', '.wafpickle-{0..9}', '*.swp', '._*', 'npm-debug.log', 'yarn-error.log', '.npmrc', '.yarnrc', '.npmignore', '.gitignore', '.DS_Store']);
|
'yarn.lock', '.lock-wscript', '.wafpickle-{0..9}', '*.swp', '._*', 'npm-debug.log', 'yarn-error.log', '.npmrc', '.yarnrc', '.yarnrc.yml', '.npmignore', '.gitignore', '.DS_Store']);
|
||||||
|
|
||||||
const NEVER_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([
|
const NEVER_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([
|
||||||
// never ignore these files
|
// never ignore these files
|
||||||
@ -44663,6 +44663,7 @@ const NEVER_IGNORE = (0, (_filter || _load_filter()).ignoreLinesToRegex)([
|
|||||||
function packWithIgnoreAndHeaders(cwd, ignoreFunction, { mapHeader } = {}) {
|
function packWithIgnoreAndHeaders(cwd, ignoreFunction, { mapHeader } = {}) {
|
||||||
return tar.pack(cwd, {
|
return tar.pack(cwd, {
|
||||||
ignore: ignoreFunction,
|
ignore: ignoreFunction,
|
||||||
|
sort: true,
|
||||||
map: header => {
|
map: header => {
|
||||||
const suffix = header.name === '.' ? '' : `/${header.name}`;
|
const suffix = header.name === '.' ? '' : `/${header.name}`;
|
||||||
header.name = `package${suffix}`;
|
header.name = `package${suffix}`;
|
||||||
@ -46678,7 +46679,7 @@ function mkdirfix (name, opts, cb) {
|
|||||||
/* 194 */
|
/* 194 */
|
||||||
/***/ (function(module, exports) {
|
/***/ (function(module, exports) {
|
||||||
|
|
||||||
module.exports = {"name":"yarn","installationMethod":"unknown","version":"1.22.4","license":"BSD-2-Clause","preferGlobal":true,"description":"📦🐈 Fast, reliable, and secure dependency management.","dependencies":{"@zkochan/cmd-shim":"^3.1.0","babel-runtime":"^6.26.0","bytes":"^3.0.0","camelcase":"^4.0.0","chalk":"^2.1.0","cli-table3":"^0.4.0","commander":"^2.9.0","death":"^1.0.0","debug":"^3.0.0","deep-equal":"^1.0.1","detect-indent":"^5.0.0","dnscache":"^1.0.1","glob":"^7.1.1","gunzip-maybe":"^1.4.0","hash-for-dep":"^1.2.3","imports-loader":"^0.8.0","ini":"^1.3.4","inquirer":"^6.2.0","invariant":"^2.2.0","is-builtin-module":"^2.0.0","is-ci":"^1.0.10","is-webpack-bundle":"^1.0.0","js-yaml":"^3.13.1","leven":"^2.0.0","loud-rejection":"^1.2.0","micromatch":"^2.3.11","mkdirp":"^0.5.1","node-emoji":"^1.6.1","normalize-url":"^2.0.0","npm-logical-tree":"^1.2.1","object-path":"^0.11.2","proper-lockfile":"^2.0.0","puka":"^1.0.0","read":"^1.0.7","request":"^2.87.0","request-capture-har":"^1.2.2","rimraf":"^2.5.0","semver":"^5.1.0","ssri":"^5.3.0","strip-ansi":"^4.0.0","strip-bom":"^3.0.0","tar-fs":"^1.16.0","tar-stream":"^1.6.1","uuid":"^3.0.1","v8-compile-cache":"^2.0.0","validate-npm-package-license":"^3.0.4","yn":"^2.0.0"},"devDependencies":{"babel-core":"^6.26.0","babel-eslint":"^7.2.3","babel-loader":"^6.2.5","babel-plugin-array-includes":"^2.0.3","babel-plugin-inline-import":"^3.0.0","babel-plugin-transform-builtin-extend":"^1.1.2","babel-plugin-transform-inline-imports-commonjs":"^1.0.0","babel-plugin-transform-runtime":"^6.4.3","babel-preset-env":"^1.6.0","babel-preset-flow":"^6.23.0","babel-preset-stage-0":"^6.0.0","babylon":"^6.5.0","commitizen":"^2.9.6","cz-conventional-changelog":"^2.0.0","eslint":"^4.3.0","eslint-config-fb-strict":"^22.0.0","eslint-plugin-babel":"^5.0.0","eslint-plugin-flowtype":"^2.35.0","eslint-plugin-jasmine":"^2.6.2","eslint-plugin-jest":"^21.0.0","eslint-plugin-jsx-a11y":"^6.0.2","eslint-plugin-prefer-object-spread":"^1.2.1","eslint-plugin-prettier":"^2.1.2","eslint-plugin-react":"^7.1.0","eslint-plugin-relay":"^0.0.28","eslint-plugin-yarn-internal":"file:scripts/eslint-rules","execa":"^0.11.0","fancy-log":"^1.3.2","flow-bin":"^0.66.0","git-release-notes":"^3.0.0","gulp":"^4.0.0","gulp-babel":"^7.0.0","gulp-if":"^2.0.1","gulp-newer":"^1.0.0","gulp-plumber":"^1.0.1","gulp-sourcemaps":"^2.2.0","jest":"^22.4.4","jsinspect":"^0.12.6","minimatch":"^3.0.4","mock-stdin":"^0.3.0","prettier":"^1.5.2","string-replace-loader":"^2.1.1","temp":"^0.8.3","webpack":"^2.1.0-beta.25","yargs":"^6.3.0"},"resolutions":{"sshpk":"^1.14.2"},"engines":{"node":">=4.0.0"},"repository":"yarnpkg/yarn","bin":{"yarn":"./bin/yarn.js","yarnpkg":"./bin/yarn.js"},"scripts":{"build":"gulp build","build-bundle":"node ./scripts/build-webpack.js","build-chocolatey":"powershell ./scripts/build-chocolatey.ps1","build-deb":"./scripts/build-deb.sh","build-dist":"bash ./scripts/build-dist.sh","build-win-installer":"scripts\\build-windows-installer.bat","changelog":"git-release-notes $(git describe --tags --abbrev=0 $(git describe --tags --abbrev=0)^)..$(git describe --tags --abbrev=0) scripts/changelog.md","dupe-check":"yarn jsinspect ./src","lint":"eslint . && flow check","pkg-tests":"yarn --cwd packages/pkg-tests jest yarn.test.js","prettier":"eslint src __tests__ --fix","release-branch":"./scripts/release-branch.sh","test":"yarn lint && yarn test-only","test-only":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --verbose","test-only-debug":"node --inspect-brk --max_old_space_size=4096 node_modules/jest/bin/jest.js --runInBand --verbose","test-coverage":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --coverage --verbose","watch":"gulp watch","commit":"git-cz"},"jest":{"collectCoverageFrom":["src/**/*.js"],"testEnvironment":"node","modulePathIgnorePatterns":["__tests__/fixtures/","packages/pkg-tests/pkg-tests-fixtures","dist/"],"testPathIgnorePatterns":["__tests__/(fixtures|__mocks__)/","updates/","_(temp|mock|install|init|helpers).js$","packages/pkg-tests"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}}}
|
module.exports = {"name":"yarn","installationMethod":"unknown","version":"1.22.5","license":"BSD-2-Clause","preferGlobal":true,"description":"📦🐈 Fast, reliable, and secure dependency management.","dependencies":{"@zkochan/cmd-shim":"^3.1.0","babel-runtime":"^6.26.0","bytes":"^3.0.0","camelcase":"^4.0.0","chalk":"^2.1.0","cli-table3":"^0.4.0","commander":"^2.9.0","death":"^1.0.0","debug":"^3.0.0","deep-equal":"^1.0.1","detect-indent":"^5.0.0","dnscache":"^1.0.1","glob":"^7.1.1","gunzip-maybe":"^1.4.0","hash-for-dep":"^1.2.3","imports-loader":"^0.8.0","ini":"^1.3.4","inquirer":"^6.2.0","invariant":"^2.2.0","is-builtin-module":"^2.0.0","is-ci":"^1.0.10","is-webpack-bundle":"^1.0.0","js-yaml":"^3.13.1","leven":"^2.0.0","loud-rejection":"^1.2.0","micromatch":"^2.3.11","mkdirp":"^0.5.1","node-emoji":"^1.6.1","normalize-url":"^2.0.0","npm-logical-tree":"^1.2.1","object-path":"^0.11.2","proper-lockfile":"^2.0.0","puka":"^1.0.0","read":"^1.0.7","request":"^2.87.0","request-capture-har":"^1.2.2","rimraf":"^2.5.0","semver":"^5.1.0","ssri":"^5.3.0","strip-ansi":"^4.0.0","strip-bom":"^3.0.0","tar-fs":"^1.16.0","tar-stream":"^1.6.1","uuid":"^3.0.1","v8-compile-cache":"^2.0.0","validate-npm-package-license":"^3.0.4","yn":"^2.0.0"},"devDependencies":{"babel-core":"^6.26.0","babel-eslint":"^7.2.3","babel-loader":"^6.2.5","babel-plugin-array-includes":"^2.0.3","babel-plugin-inline-import":"^3.0.0","babel-plugin-transform-builtin-extend":"^1.1.2","babel-plugin-transform-inline-imports-commonjs":"^1.0.0","babel-plugin-transform-runtime":"^6.4.3","babel-preset-env":"^1.6.0","babel-preset-flow":"^6.23.0","babel-preset-stage-0":"^6.0.0","babylon":"^6.5.0","commitizen":"^2.9.6","cz-conventional-changelog":"^2.0.0","eslint":"^4.3.0","eslint-config-fb-strict":"^22.0.0","eslint-plugin-babel":"^5.0.0","eslint-plugin-flowtype":"^2.35.0","eslint-plugin-jasmine":"^2.6.2","eslint-plugin-jest":"^21.0.0","eslint-plugin-jsx-a11y":"^6.0.2","eslint-plugin-prefer-object-spread":"^1.2.1","eslint-plugin-prettier":"^2.1.2","eslint-plugin-react":"^7.1.0","eslint-plugin-relay":"^0.0.28","eslint-plugin-yarn-internal":"file:scripts/eslint-rules","execa":"^0.11.0","fancy-log":"^1.3.2","flow-bin":"^0.66.0","git-release-notes":"^3.0.0","gulp":"^4.0.0","gulp-babel":"^7.0.0","gulp-if":"^2.0.1","gulp-newer":"^1.0.0","gulp-plumber":"^1.0.1","gulp-sourcemaps":"^2.2.0","jest":"^22.4.4","jsinspect":"^0.12.6","minimatch":"^3.0.4","mock-stdin":"^0.3.0","prettier":"^1.5.2","string-replace-loader":"^2.1.1","temp":"^0.8.3","webpack":"^2.1.0-beta.25","yargs":"^6.3.0"},"resolutions":{"sshpk":"^1.14.2"},"engines":{"node":">=4.0.0"},"repository":"yarnpkg/yarn","bin":{"yarn":"./bin/yarn.js","yarnpkg":"./bin/yarn.js"},"scripts":{"build":"gulp build","build-bundle":"node ./scripts/build-webpack.js","build-chocolatey":"powershell ./scripts/build-chocolatey.ps1","build-deb":"./scripts/build-deb.sh","build-dist":"bash ./scripts/build-dist.sh","build-win-installer":"scripts\\build-windows-installer.bat","changelog":"git-release-notes $(git describe --tags --abbrev=0 $(git describe --tags --abbrev=0)^)..$(git describe --tags --abbrev=0) scripts/changelog.md","dupe-check":"yarn jsinspect ./src","lint":"eslint . && flow check","pkg-tests":"yarn --cwd packages/pkg-tests jest yarn.test.js","prettier":"eslint src __tests__ --fix","release-branch":"./scripts/release-branch.sh","test":"yarn lint && yarn test-only","test-only":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --verbose","test-only-debug":"node --inspect-brk --max_old_space_size=4096 node_modules/jest/bin/jest.js --runInBand --verbose","test-coverage":"node --max_old_space_size=4096 node_modules/jest/bin/jest.js --coverage --verbose","watch":"gulp watch","commit":"git-cz"},"jest":{"collectCoverageFrom":["src/**/*.js"],"testEnvironment":"node","modulePathIgnorePatterns":["__tests__/fixtures/","packages/pkg-tests/pkg-tests-fixtures","dist/"],"testPathIgnorePatterns":["__tests__/(fixtures|__mocks__)/","updates/","_(temp|mock|install|init|helpers).js$","packages/pkg-tests"]},"config":{"commitizen":{"path":"./node_modules/cz-conventional-changelog"}}}
|
||||||
|
|
||||||
/***/ }),
|
/***/ }),
|
||||||
/* 195 */
|
/* 195 */
|
||||||
@ -98338,7 +98339,7 @@ var _buildSubCommands = (0, (_buildSubCommands2 || _load_buildSubCommands()).def
|
|||||||
|
|
||||||
const bundle = yield fetchBundle(config, bundleUrl);
|
const bundle = yield fetchBundle(config, bundleUrl);
|
||||||
|
|
||||||
const yarnPath = path.resolve(config.lockfileFolder, `.yarn/releases/yarn-${bundleVersion}.js`);
|
const yarnPath = path.resolve(config.lockfileFolder, `.yarn/releases/yarn-${bundleVersion}.cjs`);
|
||||||
reporter.log(`Saving it into ${chalk.magenta(yarnPath)}...`);
|
reporter.log(`Saving it into ${chalk.magenta(yarnPath)}...`);
|
||||||
yield (_fs || _load_fs()).mkdirp(path.dirname(yarnPath));
|
yield (_fs || _load_fs()).mkdirp(path.dirname(yarnPath));
|
||||||
yield (_fs || _load_fs()).writeFile(yarnPath, bundle);
|
yield (_fs || _load_fs()).writeFile(yarnPath, bundle);
|
||||||
@ -100190,7 +100191,7 @@ let main = exports.main = (() => {
|
|||||||
|
|
||||||
const config = new (_config || _load_config()).default(reporter);
|
const config = new (_config || _load_config()).default(reporter);
|
||||||
const outputWrapperEnabled = (0, (_conversion || _load_conversion()).boolifyWithDefault)(process.env.YARN_WRAP_OUTPUT, true);
|
const outputWrapperEnabled = (0, (_conversion || _load_conversion()).boolifyWithDefault)(process.env.YARN_WRAP_OUTPUT, true);
|
||||||
const shouldWrapOutput = outputWrapperEnabled && !(_commander || _load_commander()).default.json && command.hasWrapper((_commander || _load_commander()).default, (_commander || _load_commander()).default.args);
|
const shouldWrapOutput = outputWrapperEnabled && !(_commander || _load_commander()).default.json && command.hasWrapper((_commander || _load_commander()).default, (_commander || _load_commander()).default.args) && !(commandName === 'init' && (_commander || _load_commander()).default[`2`]);
|
||||||
|
|
||||||
if (shouldWrapOutput) {
|
if (shouldWrapOutput) {
|
||||||
reporter.header(commandName, { name: 'yarn', version: (_yarnVersion || _load_yarnVersion()).version });
|
reporter.header(commandName, { name: 'yarn', version: (_yarnVersion || _load_yarnVersion()).version });
|
||||||
@ -100604,7 +100605,7 @@ let start = (() => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
try {
|
try {
|
||||||
if (yarnPath.endsWith(`.js`)) {
|
if (/\.[cm]?js$/.test(yarnPath)) {
|
||||||
exitCode = yield (0, (_child || _load_child()).spawnp)(process.execPath, [yarnPath, ...argv], opts);
|
exitCode = yield (0, (_child || _load_child()).spawnp)(process.execPath, [yarnPath, ...argv], opts);
|
||||||
} else {
|
} else {
|
||||||
exitCode = yield (0, (_child || _load_child()).spawnp)(yarnPath, argv, opts);
|
exitCode = yield (0, (_child || _load_child()).spawnp)(yarnPath, argv, opts);
|
2
.yarnrc
2
.yarnrc
@ -2,4 +2,4 @@
|
|||||||
# yarn lockfile v1
|
# yarn lockfile v1
|
||||||
|
|
||||||
|
|
||||||
yarn-path ".yarn/releases/yarn-1.22.4.js"
|
yarn-path ".yarn/releases/yarn-1.22.5.js"
|
||||||
|
17
BUILD.bazel
17
BUILD.bazel
@ -2,7 +2,6 @@ package(default_visibility = ["//visibility:public"])
|
|||||||
|
|
||||||
exports_files([
|
exports_files([
|
||||||
"LICENSE",
|
"LICENSE",
|
||||||
"protractor-perf.conf.js",
|
|
||||||
"karma-js.conf.js",
|
"karma-js.conf.js",
|
||||||
"browser-providers.conf.js",
|
"browser-providers.conf.js",
|
||||||
"scripts/ci/track-payload-size.sh",
|
"scripts/ci/track-payload-size.sh",
|
||||||
@ -21,11 +20,11 @@ filegroup(
|
|||||||
# do not sort
|
# do not sort
|
||||||
srcs = [
|
srcs = [
|
||||||
"@npm//:node_modules/core-js/client/core.js",
|
"@npm//:node_modules/core-js/client/core.js",
|
||||||
"//packages/zone.js/dist:zone.js",
|
"//packages/zone.js/bundles:zone.umd.js",
|
||||||
"//packages/zone.js/dist:zone-testing.js",
|
"//packages/zone.js/bundles:zone-testing.umd.js",
|
||||||
"//packages/zone.js/dist:task-tracking.js",
|
"//packages/zone.js/bundles:task-tracking.umd.js",
|
||||||
"//:test-events.js",
|
"//:test-events.js",
|
||||||
"//:shims_for_IE.js",
|
"//:third_party/shims_for_IE.js",
|
||||||
# Including systemjs because it defines `__eval`, which produces correct stack traces.
|
# Including systemjs because it defines `__eval`, which produces correct stack traces.
|
||||||
"@npm//:node_modules/systemjs/dist/system.src.js",
|
"@npm//:node_modules/systemjs/dist/system.src.js",
|
||||||
"@npm//:node_modules/reflect-metadata/Reflect.js",
|
"@npm//:node_modules/reflect-metadata/Reflect.js",
|
||||||
@ -35,7 +34,7 @@ filegroup(
|
|||||||
filegroup(
|
filegroup(
|
||||||
name = "angularjs_scripts",
|
name = "angularjs_scripts",
|
||||||
srcs = [
|
srcs = [
|
||||||
# We also declare the unminfied AngularJS files since these can be used for
|
# We also declare the unminified AngularJS files since these can be used for
|
||||||
# local debugging (e.g. see: packages/upgrade/test/common/test_helpers.ts)
|
# local debugging (e.g. see: packages/upgrade/test/common/test_helpers.ts)
|
||||||
"@npm//:node_modules/angular/angular.js",
|
"@npm//:node_modules/angular/angular.js",
|
||||||
"@npm//:node_modules/angular/angular.min.js",
|
"@npm//:node_modules/angular/angular.min.js",
|
||||||
@ -48,3 +47,9 @@ filegroup(
|
|||||||
"@npm//:node_modules/angular-mocks-1.6/angular-mocks.js",
|
"@npm//:node_modules/angular-mocks-1.6/angular-mocks.js",
|
||||||
],
|
],
|
||||||
)
|
)
|
||||||
|
|
||||||
|
# Detect if the build is running under --stamp
|
||||||
|
config_setting(
|
||||||
|
name = "stamp",
|
||||||
|
values = {"stamp": "true"},
|
||||||
|
)
|
||||||
|
1260
CHANGELOG.md
1260
CHANGELOG.md
File diff suppressed because it is too large
Load Diff
@ -3,7 +3,7 @@
|
|||||||
|
|
||||||
As contributors and maintainers of the Angular project, we pledge to respect everyone who contributes by posting issues, updating documentation, submitting pull requests, providing feedback in comments, and any other activities.
|
As contributors and maintainers of the Angular project, we pledge to respect everyone who contributes by posting issues, updating documentation, submitting pull requests, providing feedback in comments, and any other activities.
|
||||||
|
|
||||||
Communication through any of Angular's channels (GitHub, Gitter, IRC, mailing lists, Google+, Twitter, etc.) must be constructive and never resort to personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
Communication through any of Angular's channels (GitHub, Discord, Gitter, IRC, mailing lists, Twitter, etc.) must be constructive and never resort to personal attacks, trolling, public or private harassment, insults, or other unprofessional conduct.
|
||||||
|
|
||||||
We promise to extend courtesy and respect to everyone involved in this project regardless of gender, gender identity, sexual orientation, disability, age, race, ethnicity, religion, or level of experience. We expect anyone contributing to the Angular project to do the same.
|
We promise to extend courtesy and respect to everyone involved in this project regardless of gender, gender identity, sexual orientation, disability, age, race, ethnicity, religion, or level of experience. We expect anyone contributing to the Angular project to do the same.
|
||||||
|
|
||||||
|
333
CONTRIBUTING.md
333
CONTRIBUTING.md
@ -1,7 +1,7 @@
|
|||||||
# Contributing to Angular
|
# Contributing to Angular
|
||||||
|
|
||||||
We would love for you to contribute to Angular and help make it even better than it is
|
We would love for you to contribute to Angular and help make it even better than it is today!
|
||||||
today! As a contributor, here are the guidelines we would like you to follow:
|
As a contributor, here are the guidelines we would like you to follow:
|
||||||
|
|
||||||
- [Code of Conduct](#coc)
|
- [Code of Conduct](#coc)
|
||||||
- [Question or Problem?](#question)
|
- [Question or Problem?](#question)
|
||||||
@ -12,50 +12,63 @@ today! As a contributor, here are the guidelines we would like you to follow:
|
|||||||
- [Commit Message Guidelines](#commit)
|
- [Commit Message Guidelines](#commit)
|
||||||
- [Signing the CLA](#cla)
|
- [Signing the CLA](#cla)
|
||||||
|
|
||||||
|
|
||||||
## <a name="coc"></a> Code of Conduct
|
## <a name="coc"></a> Code of Conduct
|
||||||
Help us keep Angular open and inclusive. Please read and follow our [Code of Conduct][coc].
|
|
||||||
|
Help us keep Angular open and inclusive.
|
||||||
|
Please read and follow our [Code of Conduct][coc].
|
||||||
|
|
||||||
|
|
||||||
## <a name="question"></a> Got a Question or Problem?
|
## <a name="question"></a> Got a Question or Problem?
|
||||||
|
|
||||||
Do not open issues for general support questions as we want to keep GitHub issues for bug reports and feature requests. You've got much better chances of getting your question answered on [Stack Overflow](https://stackoverflow.com/questions/tagged/angular) where the questions should be tagged with tag `angular`.
|
Do not open issues for general support questions as we want to keep GitHub issues for bug reports and feature requests.
|
||||||
|
Instead, we recommend using [Stack Overflow](https://stackoverflow.com/questions/tagged/angular) to ask support-related questions. When creating a new question on Stack Overflow, make sure to add the `angular` tag.
|
||||||
|
|
||||||
Stack Overflow is a much better place to ask questions since:
|
Stack Overflow is a much better place to ask questions since:
|
||||||
|
|
||||||
- there are thousands of people willing to help on Stack Overflow
|
- there are thousands of people willing to help on Stack Overflow
|
||||||
- questions and answers stay available for public viewing so your question / answer might help someone else
|
- questions and answers stay available for public viewing so your question/answer might help someone else
|
||||||
- Stack Overflow's voting system assures that the best answers are prominently visible.
|
- Stack Overflow's voting system assures that the best answers are prominently visible.
|
||||||
|
|
||||||
To save your and our time, we will systematically close all issues that are requests for general support and redirect people to Stack Overflow.
|
To save your and our time, we will systematically close all issues that are requests for general support and redirect people to Stack Overflow.
|
||||||
|
|
||||||
If you would like to chat about the question in real-time, you can reach out via [our gitter channel][gitter].
|
If you would like to chat about the question in real-time, you can reach out via [our Discord server][discord].
|
||||||
|
|
||||||
|
|
||||||
## <a name="issue"></a> Found a Bug?
|
## <a name="issue"></a> Found a Bug?
|
||||||
If you find a bug in the source code, you can help us by
|
|
||||||
[submitting an issue](#submit-issue) to our [GitHub Repository][github]. Even better, you can
|
If you find a bug in the source code, you can help us by [submitting an issue](#submit-issue) to our [GitHub Repository][github].
|
||||||
[submit a Pull Request](#submit-pr) with a fix.
|
Even better, you can [submit a Pull Request](#submit-pr) with a fix.
|
||||||
|
|
||||||
|
|
||||||
## <a name="feature"></a> Missing a Feature?
|
## <a name="feature"></a> Missing a Feature?
|
||||||
You can *request* a new feature by [submitting an issue](#submit-issue) to our GitHub
|
You can *request* a new feature by [submitting an issue](#submit-issue) to our GitHub Repository.
|
||||||
Repository. If you would like to *implement* a new feature, please submit an issue with
|
If you would like to *implement* a new feature, please consider the size of the change in order to determine the right steps to proceed:
|
||||||
a proposal for your work first, to be sure that we can use it.
|
|
||||||
Please consider what kind of change it is:
|
* For a **Major Feature**, first open an issue and outline your proposal so that it can be discussed.
|
||||||
|
This process allows us to better coordinate our efforts, prevent duplication of work, and help you to craft the change so that it is successfully accepted into the project.
|
||||||
|
|
||||||
|
**Note**: Adding a new topic to the documentation, or significantly re-writing a topic, counts as a major feature.
|
||||||
|
|
||||||
* For a **Major Feature**, first open an issue and outline your proposal so that it can be
|
|
||||||
discussed. This will also allow us to better coordinate our efforts, prevent duplication of work,
|
|
||||||
and help you to craft the change so that it is successfully accepted into the project.
|
|
||||||
* **Small Features** can be crafted and directly [submitted as a Pull Request](#submit-pr).
|
* **Small Features** can be crafted and directly [submitted as a Pull Request](#submit-pr).
|
||||||
|
|
||||||
|
|
||||||
## <a name="submit"></a> Submission Guidelines
|
## <a name="submit"></a> Submission Guidelines
|
||||||
|
|
||||||
|
|
||||||
### <a name="submit-issue"></a> Submitting an Issue
|
### <a name="submit-issue"></a> Submitting an Issue
|
||||||
|
|
||||||
Before you submit an issue, please search the issue tracker, maybe an issue for your problem already exists and the discussion might inform you of workarounds readily available.
|
Before you submit an issue, please search the issue tracker, maybe an issue for your problem already exists and the discussion might inform you of workarounds readily available.
|
||||||
|
|
||||||
We want to fix all the issues as soon as possible, but before fixing a bug we need to reproduce and confirm it. In order to reproduce bugs, we will systematically ask you to provide a minimal reproduction. Having a minimal reproducible scenario gives us a wealth of important information without going back & forth to you with additional questions.
|
We want to fix all the issues as soon as possible, but before fixing a bug we need to reproduce and confirm it.
|
||||||
|
In order to reproduce bugs, we require that you provide a minimal reproduction.
|
||||||
|
Having a minimal reproducible scenario gives us a wealth of important information without going back and forth to you with additional questions.
|
||||||
|
|
||||||
A minimal reproduction allows us to quickly confirm a bug (or point out a coding problem) as well as confirm that we are fixing the right problem.
|
A minimal reproduction allows us to quickly confirm a bug (or point out a coding problem) as well as confirm that we are fixing the right problem.
|
||||||
|
|
||||||
We will be insisting on a minimal reproduction scenario in order to save maintainers time and ultimately be able to fix more bugs. Interestingly, from our experience, users often find coding problems themselves while preparing a minimal reproduction. We understand that sometimes it might be hard to extract essential bits of code from a larger codebase but we really need to isolate the problem before we can fix it.
|
We require a minimal reproduction to save maintainers' time and ultimately be able to fix more bugs.
|
||||||
|
Often, developers find coding problems themselves while preparing a minimal reproduction.
|
||||||
|
We understand that sometimes it might be hard to extract essential bits of code from a larger codebase but we really need to isolate the problem before we can fix it.
|
||||||
|
|
||||||
Unfortunately, we are not able to investigate / fix bugs without a minimal reproduction, so if we don't hear back from you, we are going to close an issue that doesn't have enough info to be reproduced.
|
Unfortunately, we are not able to investigate / fix bugs without a minimal reproduction, so if we don't hear back from you, we are going to close an issue that doesn't have enough info to be reproduced.
|
||||||
|
|
||||||
@ -63,57 +76,101 @@ You can file new issues by selecting from our [new issue templates](https://gith
|
|||||||
|
|
||||||
|
|
||||||
### <a name="submit-pr"></a> Submitting a Pull Request (PR)
|
### <a name="submit-pr"></a> Submitting a Pull Request (PR)
|
||||||
|
|
||||||
Before you submit your Pull Request (PR) consider the following guidelines:
|
Before you submit your Pull Request (PR) consider the following guidelines:
|
||||||
|
|
||||||
1. Search [GitHub](https://github.com/angular/angular/pulls) for an open or closed PR
|
1. Search [GitHub](https://github.com/angular/angular/pulls) for an open or closed PR that relates to your submission.
|
||||||
that relates to your submission. You don't want to duplicate effort.
|
You don't want to duplicate existing efforts.
|
||||||
1. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add.
|
|
||||||
Discussing the design up front helps to ensure that we're ready to accept your work.
|
2. Be sure that an issue describes the problem you're fixing, or documents the design for the feature you'd like to add.
|
||||||
1. Please sign our [Contributor License Agreement (CLA)](#cla) before sending PRs.
|
Discussing the design upfront helps to ensure that we're ready to accept your work.
|
||||||
We cannot accept code without this. Make sure you sign with the primary email address of the Git identity that has been granted access to the Angular repository.
|
|
||||||
1. Fork the angular/angular repo.
|
3. Please sign our [Contributor License Agreement (CLA)](#cla) before sending PRs.
|
||||||
1. Make your changes in a new git branch:
|
We cannot accept code without a signed CLA.
|
||||||
|
Make sure you author all contributed Git commits with email address associated with your CLA signature.
|
||||||
|
|
||||||
|
4. Fork the angular/angular repo.
|
||||||
|
|
||||||
|
5. Make your changes in a new git branch:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git checkout -b my-fix-branch master
|
git checkout -b my-fix-branch master
|
||||||
```
|
```
|
||||||
|
|
||||||
1. Create your patch, **including appropriate test cases**.
|
6. Create your patch, **including appropriate test cases**.
|
||||||
1. Follow our [Coding Rules](#rules).
|
|
||||||
1. Run the full Angular test suite, as described in the [developer documentation][dev-doc],
|
7. Follow our [Coding Rules](#rules).
|
||||||
and ensure that all tests pass.
|
|
||||||
1. Commit your changes using a descriptive commit message that follows our
|
8. Run the full Angular test suite, as described in the [developer documentation][dev-doc], and ensure that all tests pass.
|
||||||
[commit message conventions](#commit). Adherence to these conventions
|
|
||||||
is necessary because release notes are automatically generated from these messages.
|
9. Commit your changes using a descriptive commit message that follows our [commit message conventions](#commit).
|
||||||
|
Adherence to these conventions is necessary because release notes are automatically generated from these messages.
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git commit -a
|
git commit --all
|
||||||
```
|
```
|
||||||
Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.
|
Note: the optional commit `-a` command line option will automatically "add" and "rm" edited files.
|
||||||
|
|
||||||
1. Push your branch to GitHub:
|
10. Push your branch to GitHub:
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git push origin my-fix-branch
|
git push origin my-fix-branch
|
||||||
```
|
```
|
||||||
|
|
||||||
1. In GitHub, send a pull request to `angular:master`.
|
11. In GitHub, send a pull request to `angular:master`.
|
||||||
* If we suggest changes then:
|
|
||||||
* Make the required updates.
|
|
||||||
* Re-run the Angular test suites to ensure tests are still passing.
|
#### Addressing review feedback
|
||||||
* Rebase your branch and force push to your GitHub repository (this will update your Pull Request):
|
|
||||||
|
If we ask for changes via code reviews then:
|
||||||
|
|
||||||
|
1. Make the required updates to the code.
|
||||||
|
|
||||||
|
2. Re-run the Angular test suites to ensure tests are still passing.
|
||||||
|
|
||||||
|
3. Create a fixup commit and push to your GitHub repository (this will update your Pull Request):
|
||||||
|
|
||||||
```shell
|
```shell
|
||||||
git rebase master -i
|
git commit --all --fixup HEAD
|
||||||
git push -f
|
git push
|
||||||
```
|
```
|
||||||
|
|
||||||
|
For more info on working with fixup commits see [here](docs/FIXUP_COMMITS.md).
|
||||||
|
|
||||||
That's it! Thank you for your contribution!
|
That's it! Thank you for your contribution!
|
||||||
|
|
||||||
|
|
||||||
|
##### Updating the commit message
|
||||||
|
|
||||||
|
A reviewer might often suggest changes to a commit message (for example, to add more context for a change or adhere to our [commit message guidelines](#commit)).
|
||||||
|
In order to update the commit message of the last commit on your branch:
|
||||||
|
|
||||||
|
1. Check out your branch:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git checkout my-fix-branch
|
||||||
|
```
|
||||||
|
|
||||||
|
2. Amend the last commit and modify the commit message:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git commit --amend
|
||||||
|
```
|
||||||
|
|
||||||
|
3. Push to your GitHub repository:
|
||||||
|
|
||||||
|
```shell
|
||||||
|
git push --force-with-lease
|
||||||
|
```
|
||||||
|
|
||||||
|
> NOTE:<br />
|
||||||
|
> If you need to update the commit message of an earlier commit, you can use `git rebase` in interactive mode.
|
||||||
|
> See the [git docs](https://git-scm.com/docs/git-rebase#_interactive_mode) for more details.
|
||||||
|
|
||||||
|
|
||||||
#### After your pull request is merged
|
#### After your pull request is merged
|
||||||
|
|
||||||
After your pull request is merged, you can safely delete your branch and pull the changes
|
After your pull request is merged, you can safely delete your branch and pull the changes from the main (upstream) repository:
|
||||||
from the main (upstream) repository:
|
|
||||||
|
|
||||||
* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows:
|
* Delete the remote branch on GitHub either through the GitHub web UI or your local shell as follows:
|
||||||
|
|
||||||
@ -139,55 +196,66 @@ from the main (upstream) repository:
|
|||||||
git pull --ff upstream master
|
git pull --ff upstream master
|
||||||
```
|
```
|
||||||
|
|
||||||
|
|
||||||
## <a name="rules"></a> Coding Rules
|
## <a name="rules"></a> Coding Rules
|
||||||
To ensure consistency throughout the source code, keep these rules in mind as you are working:
|
To ensure consistency throughout the source code, keep these rules in mind as you are working:
|
||||||
|
|
||||||
* All features or bug fixes **must be tested** by one or more specs (unit-tests).
|
* All features or bug fixes **must be tested** by one or more specs (unit-tests).
|
||||||
* All public API methods **must be documented**. (Details TBC).
|
* All public API methods **must be documented**.
|
||||||
* We follow [Google's JavaScript Style Guide][js-style-guide], but wrap all code at
|
* We follow [Google's JavaScript Style Guide][js-style-guide], but wrap all code at **100 characters**.
|
||||||
**100 characters**. An automated formatter is available, see
|
|
||||||
[DEVELOPER.md](docs/DEVELOPER.md#clang-format).
|
|
||||||
|
|
||||||
## <a name="commit"></a> Commit Message Guidelines
|
An automated formatter is available, see [DEVELOPER.md](docs/DEVELOPER.md#clang-format).
|
||||||
|
|
||||||
We have very precise rules over how our git commit messages can be formatted. This leads to **more
|
|
||||||
readable messages** that are easy to follow when looking through the **project history**. But also,
|
|
||||||
we use the git commit messages to **generate the Angular change log**.
|
|
||||||
|
|
||||||
### Commit Message Format
|
## <a name="commit"></a> Commit Message Format
|
||||||
Each commit message consists of a **header**, a **body** and a **footer**. The header has a special
|
|
||||||
format that includes a **type**, a **scope** and a **subject**:
|
*This specification is inspired and supersedes the [AngularJS commit message format][commit-message-format].*
|
||||||
|
|
||||||
|
We have very precise rules over how our Git commit messages must be formatted.
|
||||||
|
This format leads to **easier to read commit history**.
|
||||||
|
|
||||||
|
Each commit message consists of a **header**, a **body**, and a **footer**.
|
||||||
|
|
||||||
|
|
||||||
```
|
```
|
||||||
<type>(<scope>): <subject>
|
<header>
|
||||||
<BLANK LINE>
|
<BLANK LINE>
|
||||||
<body>
|
<body>
|
||||||
<BLANK LINE>
|
<BLANK LINE>
|
||||||
<footer>
|
<footer>
|
||||||
```
|
```
|
||||||
|
|
||||||
The **header** is mandatory and the **scope** of the header is optional.
|
The `header` is mandatory and must conform to the [Commit Message Header](#commit-header) format.
|
||||||
|
|
||||||
Any line of the commit message cannot be longer than 100 characters! This allows the message to be easier
|
The `body` is mandatory for all commits except for those of scope "docs".
|
||||||
to read on GitHub as well as in various git tools.
|
When the body is required it must be at least 20 characters long.
|
||||||
|
|
||||||
The footer should contain a [closing reference to an issue](https://help.github.com/articles/closing-issues-via-commit-messages/) if any.
|
The `footer` is optional.
|
||||||
|
|
||||||
Samples: (even more [samples](https://github.com/angular/angular/commits/master))
|
Any line of the commit message cannot be longer than 100 characters.
|
||||||
|
|
||||||
|
|
||||||
|
#### <a href="commit-header"></a>Commit Message Header
|
||||||
|
|
||||||
```
|
```
|
||||||
docs(changelog): update changelog to beta.5
|
<type>(<scope>): <short summary>
|
||||||
```
|
│ │ │
|
||||||
```
|
│ │ └─⫸ Summary in present tense. Not capitalized. No period at the end.
|
||||||
fix(release): need to depend on latest rxjs and zone.js
|
│ │
|
||||||
|
│ └─⫸ Commit Scope: animations|bazel|benchpress|common|compiler|compiler-cli|core|
|
||||||
The version in our package.json gets copied to the one we publish, and users need the latest of these.
|
│ elements|forms|http|language-service|localize|platform-browser|
|
||||||
|
│ platform-browser-dynamic|platform-server|router|service-worker|
|
||||||
|
│ upgrade|zone.js|packaging|changelog|dev-infra|docs-infra|migrations|
|
||||||
|
│ ngcc|ve
|
||||||
|
│
|
||||||
|
└─⫸ Commit Type: build|ci|docs|feat|fix|perf|refactor|style|test
|
||||||
```
|
```
|
||||||
|
|
||||||
### Revert
|
The `<type>` and `<summary>` fields are mandatory, the `(<scope>)` field is optional.
|
||||||
If the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit. In the body it should say: `This reverts commit <hash>.`, where the hash is the SHA of the commit being reverted.
|
|
||||||
|
|
||||||
|
##### Type
|
||||||
|
|
||||||
### Type
|
|
||||||
Must be one of the following:
|
Must be one of the following:
|
||||||
|
|
||||||
* **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
|
* **build**: Changes that affect the build system or external dependencies (example scopes: gulp, broccoli, npm)
|
||||||
@ -197,69 +265,95 @@ Must be one of the following:
|
|||||||
* **fix**: A bug fix
|
* **fix**: A bug fix
|
||||||
* **perf**: A code change that improves performance
|
* **perf**: A code change that improves performance
|
||||||
* **refactor**: A code change that neither fixes a bug nor adds a feature
|
* **refactor**: A code change that neither fixes a bug nor adds a feature
|
||||||
* **style**: Changes that do not affect the meaning of the code (white-space, formatting, missing semi-colons, etc)
|
|
||||||
* **test**: Adding missing tests or correcting existing tests
|
* **test**: Adding missing tests or correcting existing tests
|
||||||
|
|
||||||
### Scope
|
|
||||||
|
##### Scope
|
||||||
The scope should be the name of the npm package affected (as perceived by the person reading the changelog generated from commit messages).
|
The scope should be the name of the npm package affected (as perceived by the person reading the changelog generated from commit messages).
|
||||||
|
|
||||||
The following is the list of supported scopes:
|
The following is the list of supported scopes:
|
||||||
|
|
||||||
* **animations**
|
* `animations`
|
||||||
* **bazel**
|
* `bazel`
|
||||||
* **benchpress**
|
* `benchpress`
|
||||||
* **common**
|
* `common`
|
||||||
* **compiler**
|
* `compiler`
|
||||||
* **compiler-cli**
|
* `compiler-cli`
|
||||||
* **core**
|
* `core`
|
||||||
* **elements**
|
* `elements`
|
||||||
* **forms**
|
* `forms`
|
||||||
* **http**
|
* `http`
|
||||||
* **language-service**
|
* `language-service`
|
||||||
* **localize**
|
* `localize`
|
||||||
* **platform-browser**
|
* `platform-browser`
|
||||||
* **platform-browser-dynamic**
|
* `platform-browser-dynamic`
|
||||||
* **platform-server**
|
* `platform-server`
|
||||||
* **platform-webworker**
|
* `router`
|
||||||
* **platform-webworker-dynamic**
|
* `service-worker`
|
||||||
* **router**
|
* `upgrade`
|
||||||
* **service-worker**
|
* `zone.js`
|
||||||
* **upgrade**
|
|
||||||
* **zone.js**
|
|
||||||
|
|
||||||
There are currently a few exceptions to the "use package name" rule:
|
There are currently a few exceptions to the "use package name" rule:
|
||||||
|
|
||||||
* **packaging**: used for changes that change the npm package layout in all of our packages, e.g.
|
* `packaging`: used for changes that change the npm package layout in all of our packages, e.g. public path changes, package.json changes done to all packages, d.ts file/format changes, changes to bundles, etc.
|
||||||
public path changes, package.json changes done to all packages, d.ts file/format changes, changes
|
|
||||||
to bundles, etc.
|
|
||||||
* **changelog**: used for updating the release notes in CHANGELOG.md
|
|
||||||
* **docs-infra**: used for docs-app (angular.io) related changes within the /aio directory of the
|
|
||||||
repo
|
|
||||||
* **dev-infra**: used for dev-infra related changes within the directories /scripts, /tools and /dev-infra
|
|
||||||
* **ngcc**: used for changes to the [Angular Compatibility Compiler](./packages/compiler-cli/ngcc/README.md)
|
|
||||||
* **ve**: used for changes specific to ViewEngine (legacy compiler/renderer).
|
|
||||||
* none/empty string: useful for `style`, `test` and `refactor` changes that are done across all
|
|
||||||
packages (e.g. `style: add missing semicolons`) and for docs changes that are not related to a
|
|
||||||
specific package (e.g. `docs: fix typo in tutorial`).
|
|
||||||
|
|
||||||
### Subject
|
* `changelog`: used for updating the release notes in CHANGELOG.md
|
||||||
The subject contains a succinct description of the change:
|
|
||||||
|
* `dev-infra`: used for dev-infra related changes within the directories /scripts, /tools and /dev-infra
|
||||||
|
|
||||||
|
* `docs-infra`: used for docs-app (angular.io) related changes within the /aio directory of the repo
|
||||||
|
|
||||||
|
* `migrations`: used for changes to the `ng update` migrations.
|
||||||
|
|
||||||
|
* `ngcc`: used for changes to the [Angular Compatibility Compiler](./packages/compiler-cli/ngcc/README.md)
|
||||||
|
|
||||||
|
* `ve`: used for changes specific to ViewEngine (legacy compiler/renderer).
|
||||||
|
|
||||||
|
* none/empty string: useful for `style`, `test` and `refactor` changes that are done across all packages (e.g. `style: add missing semicolons`) and for docs changes that are not related to a specific package (e.g. `docs: fix typo in tutorial`).
|
||||||
|
|
||||||
|
|
||||||
|
##### Summary
|
||||||
|
|
||||||
|
Use the summary field to provide a succinct description of the change:
|
||||||
|
|
||||||
* use the imperative, present tense: "change" not "changed" nor "changes"
|
* use the imperative, present tense: "change" not "changed" nor "changes"
|
||||||
* don't capitalize the first letter
|
* don't capitalize the first letter
|
||||||
* no dot (.) at the end
|
* no dot (.) at the end
|
||||||
|
|
||||||
### Body
|
|
||||||
Just as in the **subject**, use the imperative, present tense: "change" not "changed" nor "changes".
|
|
||||||
The body should include the motivation for the change and contrast this with previous behavior.
|
|
||||||
|
|
||||||
### Footer
|
#### Commit Message Body
|
||||||
The footer should contain any information about **Breaking Changes** and is also the place to
|
|
||||||
reference GitHub issues that this commit **Closes**.
|
|
||||||
|
|
||||||
**Breaking Changes** should start with the word `BREAKING CHANGE:` with a space or two newlines. The rest of the commit message is then used for this.
|
Just as in the summary, use the imperative, present tense: "fix" not "fixed" nor "fixes".
|
||||||
|
|
||||||
|
Explain the motivation for the change in the commit message body. This commit message should explain _why_ you are making the change.
|
||||||
|
You can include a comparison of the previous behavior with the new behavior in order to illustrate the impact of the change.
|
||||||
|
|
||||||
|
|
||||||
|
#### Commit Message Footer
|
||||||
|
|
||||||
|
The footer can contain information about breaking changes and is also the place to reference GitHub issues, Jira tickets, and other PRs that this commit closes or is related to.
|
||||||
|
|
||||||
|
```
|
||||||
|
BREAKING CHANGE: <breaking change summary>
|
||||||
|
<BLANK LINE>
|
||||||
|
<breaking change description + migration instructions>
|
||||||
|
<BLANK LINE>
|
||||||
|
<BLANK LINE>
|
||||||
|
Fixes #<issue number>
|
||||||
|
```
|
||||||
|
|
||||||
|
Breaking Change section should start with the phrase "BREAKING CHANGE: " followed by a summary of the breaking change, a blank line, and a detailed description of the breaking change that also includes migration instructions.
|
||||||
|
|
||||||
|
|
||||||
|
### Revert commits
|
||||||
|
|
||||||
|
If the commit reverts a previous commit, it should begin with `revert: `, followed by the header of the reverted commit.
|
||||||
|
|
||||||
|
The content of the commit message body should contain:
|
||||||
|
|
||||||
|
- information about the SHA of the commit being reverted in the following format: `This reverts commit <SHA>`,
|
||||||
|
- a clear description of the reason for reverting the commit message.
|
||||||
|
|
||||||
A detailed explanation can be found in this [document][commit-message-format].
|
|
||||||
|
|
||||||
## <a name="cla"></a> Signing the CLA
|
## <a name="cla"></a> Signing the CLA
|
||||||
|
|
||||||
@ -270,18 +364,17 @@ changes to be accepted, the CLA must be signed. It's a quick process, we promise
|
|||||||
* For corporations, we'll need you to
|
* For corporations, we'll need you to
|
||||||
[print, sign and one of scan+email, fax or mail the form][corporate-cla].
|
[print, sign and one of scan+email, fax or mail the form][corporate-cla].
|
||||||
|
|
||||||
<hr>
|
If you have more than one GitHub accounts, or multiple email addresses associated with a single GitHub account, you must sign the CLA using the primary email address of the GitHub account used to author Git commits and send pull requests.
|
||||||
|
|
||||||
If you have more than one Git identity, you must make sure that you sign the CLA using the primary email address associated with the ID that has been granted access to the Angular repository. Git identities can be associated with more than one email address, and only one is primary. Here are some links to help you sort out multiple Git identities and email addresses:
|
The following documents can help you sort out issues with GitHub accounts and multiple email addresses:
|
||||||
|
|
||||||
* https://help.github.com/articles/setting-your-commit-email-address-in-git/
|
* https://help.github.com/articles/setting-your-commit-email-address-in-git/
|
||||||
* https://stackoverflow.com/questions/37245303/what-does-usera-committed-with-userb-13-days-ago-on-github-mean
|
* https://stackoverflow.com/questions/37245303/what-does-usera-committed-with-userb-13-days-ago-on-github-mean
|
||||||
* https://help.github.com/articles/about-commit-email-addresses/
|
* https://help.github.com/articles/about-commit-email-addresses/
|
||||||
* https://help.github.com/articles/blocking-command-line-pushes-that-expose-your-personal-email-address/
|
* https://help.github.com/articles/blocking-command-line-pushes-that-expose-your-personal-email-address/
|
||||||
|
|
||||||
Note that if you have more than one Git identity, it is important to verify that you are logged in with the same ID with which you signed the CLA, before you commit changes. If not, your PR will fail the CLA check.
|
|
||||||
|
|
||||||
<hr>
|
|
||||||
|
|
||||||
[angular-group]: https://groups.google.com/forum/#!forum/angular
|
[angular-group]: https://groups.google.com/forum/#!forum/angular
|
||||||
[coc]: https://github.com/angular/code-of-conduct/blob/master/CODE_OF_CONDUCT.md
|
[coc]: https://github.com/angular/code-of-conduct/blob/master/CODE_OF_CONDUCT.md
|
||||||
@ -289,7 +382,7 @@ changes to be accepted, the CLA must be signed. It's a quick process, we promise
|
|||||||
[corporate-cla]: http://code.google.com/legal/corporate-cla-v1.0.html
|
[corporate-cla]: http://code.google.com/legal/corporate-cla-v1.0.html
|
||||||
[dev-doc]: https://github.com/angular/angular/blob/master/docs/DEVELOPER.md
|
[dev-doc]: https://github.com/angular/angular/blob/master/docs/DEVELOPER.md
|
||||||
[github]: https://github.com/angular/angular
|
[github]: https://github.com/angular/angular
|
||||||
[gitter]: https://gitter.im/angular/angular
|
[discord]: https://discord.gg/angular
|
||||||
[individual-cla]: http://code.google.com/legal/individual-cla-v1.0.html
|
[individual-cla]: http://code.google.com/legal/individual-cla-v1.0.html
|
||||||
[js-style-guide]: https://google.github.io/styleguide/jsguide.html
|
[js-style-guide]: https://google.github.io/styleguide/jsguide.html
|
||||||
[jsfiddle]: http://jsfiddle.net
|
[jsfiddle]: http://jsfiddle.net
|
||||||
|
145
README.md
145
README.md
@ -1,26 +1,151 @@
|
|||||||
[](https://circleci.com/gh/angular/workflows/angular/tree/master)
|
<h1 align="center">Angular - One framework. Mobile & desktop.</h1>
|
||||||
[](https://gitter.im/angular/angular?utm_source=badge&utm_medium=badge&utm_campaign=pr-badge&utm_content=badge)
|
|
||||||
[](https://www.npmjs.com/@angular/core)
|
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<img src="aio/src/assets/images/logos/angular/angular.png" alt="angular-logo" width="120px" height="120px"/>
|
||||||
|
<br>
|
||||||
|
<i>Angular is a development platform for building mobile and desktop web applications
|
||||||
|
<br> using Typescript/JavaScript and other languages.</i>
|
||||||
|
<br>
|
||||||
|
</p>
|
||||||
|
|
||||||
# Angular
|
<p align="center">
|
||||||
|
<a href="https://www.angular.io"><strong>www.angular.io</strong></a>
|
||||||
|
<br>
|
||||||
|
</p>
|
||||||
|
|
||||||
Angular is a development platform for building mobile and desktop web applications using TypeScript/JavaScript and other languages.
|
<p align="center">
|
||||||
|
<a href="CONTRIBUTING.md">Contributing Guidelines</a>
|
||||||
|
·
|
||||||
|
<a href="https://github.com/angular/angular/issues">Submit an Issue</a>
|
||||||
|
·
|
||||||
|
<a href="https://blog.angular.io/">Blog</a>
|
||||||
|
<br>
|
||||||
|
<br>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<p align="center">
|
||||||
|
<a href="https://circleci.com/gh/angular/workflows/angular/tree/master">
|
||||||
|
<img src="https://img.shields.io/circleci/build/github/angular/angular/master.svg?logo=circleci&logoColor=fff&label=CircleCI" alt="CI status" />
|
||||||
|
</a>
|
||||||
|
<a href="https://www.npmjs.com/@angular/core">
|
||||||
|
<img src="https://img.shields.io/npm/v/@angular/core.svg?logo=npm&logoColor=fff&label=NPM+package&color=limegreen" alt="Angular on npm" />
|
||||||
|
</a>
|
||||||
|
<a href="https://discord.gg/angular">
|
||||||
|
<img src="https://img.shields.io/discord/463752820026376202.svg?logo=discord&logoColor=fff&label=Discord&color=7389d8" alt="Discord conversation" />
|
||||||
|
</a>
|
||||||
|
</p>
|
||||||
|
|
||||||
|
<hr>
|
||||||
|
|
||||||
|
## Documentation
|
||||||
|
|
||||||
|
Get started with Angular, learn the fundamentals and explore advanced topics on our documentation website.
|
||||||
|
|
||||||
|
- [Getting Started][quickstart]
|
||||||
|
- [Architecture][architecture]
|
||||||
|
- [Components and Templates][componentstemplates]
|
||||||
|
- [Forms][forms]
|
||||||
|
- [API][api]
|
||||||
|
|
||||||
|
### Advanced
|
||||||
|
|
||||||
|
- [Angular Elements][angularelements]
|
||||||
|
- [Server Side Rendering][ssr]
|
||||||
|
- [Schematics][schematics]
|
||||||
|
- [Lazy Loading][lazyloading]
|
||||||
|
|
||||||
|
## Development Setup
|
||||||
|
|
||||||
|
### Prerequisites
|
||||||
|
|
||||||
|
- Install [Node.js] which includes [Node Package Manager][npm]
|
||||||
|
|
||||||
|
### Setting Up a Project
|
||||||
|
|
||||||
|
Intall the Angular CLI globally:
|
||||||
|
|
||||||
|
```
|
||||||
|
npm install -g @angular/cli
|
||||||
|
```
|
||||||
|
|
||||||
|
Create workspace:
|
||||||
|
|
||||||
|
```
|
||||||
|
ng new [PROJECT NAME]
|
||||||
|
```
|
||||||
|
|
||||||
|
Run the application:
|
||||||
|
|
||||||
|
```
|
||||||
|
cd [PROJECT NAME]
|
||||||
|
ng serve
|
||||||
|
```
|
||||||
|
|
||||||
## Quickstart
|
## Quickstart
|
||||||
|
|
||||||
[Get started in 5 minutes][quickstart].
|
[Get started in 5 minutes][quickstart].
|
||||||
|
|
||||||
|
## Ecosystem
|
||||||
|
|
||||||
|
<p>
|
||||||
|
<img src="/docs/images/angular-ecosystem-logos.png" alt="angular ecosystem logos" width="500px" height="auto">
|
||||||
|
</p>
|
||||||
|
|
||||||
|
- [Angular Command Line (CLI)][cli]
|
||||||
|
- [Angular Material][angularmaterial]
|
||||||
|
|
||||||
## Changelog
|
## Changelog
|
||||||
|
|
||||||
[Learn about the latest improvements][changelog].
|
[Learn about the latest improvements][changelog].
|
||||||
|
|
||||||
## Want to help?
|
## Upgrading
|
||||||
|
|
||||||
Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on our
|
Check out our [upgrade guide](https://update.angular.io/) to find out the best way to upgrade your project.
|
||||||
guidelines for [contributing][contributing] and then check out one of our issues in the [hotlist: community-help](https://github.com/angular/angular/labels/hotlist%3A%20community-help).
|
|
||||||
|
|
||||||
[contributing]: https://github.com/angular/angular/blob/master/CONTRIBUTING.md
|
## Contributing
|
||||||
|
|
||||||
|
### Contributing Guidelines
|
||||||
|
|
||||||
|
Read through our [contributing guidelines][contributing] to learn about our submission process, coding rules and more.
|
||||||
|
|
||||||
|
### Want to Help?
|
||||||
|
|
||||||
|
Want to file a bug, contribute some code, or improve documentation? Excellent! Read up on our guidelines for [contributing][contributing] and then check out one of our issues in the [hotlist: community-help](https://github.com/angular/angular/labels/hotlist%3A%20community-help).
|
||||||
|
|
||||||
|
### Code of Conduct
|
||||||
|
|
||||||
|
Help us keep Angular open and inclusive. Please read and follow our [Code of Conduct][codeofconduct].
|
||||||
|
|
||||||
|
## Community
|
||||||
|
|
||||||
|
Join the conversation and help the community.
|
||||||
|
|
||||||
|
- [Twitter][twitter]
|
||||||
|
- [Gitter][gitter]
|
||||||
|
- Find a Local [Meetup][meetup]
|
||||||
|
|
||||||
|
[](https://www.github.com/angular/angular)
|
||||||
|
|
||||||
|
**Love Angular? Give our repo a star :star: :arrow_up:.**
|
||||||
|
|
||||||
|
[contributing]: CONTRIBUTING.md
|
||||||
[quickstart]: https://angular.io/start
|
[quickstart]: https://angular.io/start
|
||||||
[changelog]: https://github.com/angular/angular/blob/master/CHANGELOG.md
|
[changelog]: CHANGELOG.md
|
||||||
[ng]: https://angular.io
|
[ng]: https://angular.io
|
||||||
|
[documentation]: https://angular.io/docs
|
||||||
|
[angularmaterial]: https://material.angular.io/
|
||||||
|
[cli]: https://cli.angular.io/
|
||||||
|
[architecture]: https://angular.io/guide/architecture
|
||||||
|
[componentstemplates]: https://angular.io/guide/displaying-data
|
||||||
|
[forms]: https://angular.io/guide/forms-overview
|
||||||
|
[api]: https://angular.io/api
|
||||||
|
[angularelements]: https://angular.io/guide/elements
|
||||||
|
[ssr]: https://angular.io/guide/universal
|
||||||
|
[schematics]: https://angular.io/guide/schematics
|
||||||
|
[lazyloading]: https://angular.io/guide/lazy-loading-ngmodules
|
||||||
|
[node.js]: https://nodejs.org/
|
||||||
|
[npm]: https://www.npmjs.com/get-npm
|
||||||
|
[codeofconduct]: CODE_OF_CONDUCT.md
|
||||||
|
[twitter]: https://www.twitter.com/angular
|
||||||
|
[gitter]: https://gitter.im/angular/angular
|
||||||
|
[meetup]: https://www.meetup.com/find/?keywords=angular"
|
||||||
|
29
WORKSPACE
29
WORKSPACE
@ -8,8 +8,8 @@ load("@bazel_tools//tools/build_defs/repo:http.bzl", "http_archive")
|
|||||||
# Fetch rules_nodejs so we can install our npm dependencies
|
# Fetch rules_nodejs so we can install our npm dependencies
|
||||||
http_archive(
|
http_archive(
|
||||||
name = "build_bazel_rules_nodejs",
|
name = "build_bazel_rules_nodejs",
|
||||||
sha256 = "f9e7b9f42ae202cc2d2ce6d698ccb49a9f7f7ea572a78fd451696d03ef2ee116",
|
sha256 = "4952ef879704ab4ad6729a29007e7094aef213ea79e9f2e94cbe1c9a753e63ef",
|
||||||
urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/1.6.0/rules_nodejs-1.6.0.tar.gz"],
|
urls = ["https://github.com/bazelbuild/rules_nodejs/releases/download/2.2.0/rules_nodejs-2.2.0.tar.gz"],
|
||||||
)
|
)
|
||||||
|
|
||||||
# Check the rules_nodejs version and download npm dependencies
|
# Check the rules_nodejs version and download npm dependencies
|
||||||
@ -17,7 +17,7 @@ http_archive(
|
|||||||
# assert on that.
|
# assert on that.
|
||||||
load("@build_bazel_rules_nodejs//:index.bzl", "check_rules_nodejs_version", "node_repositories", "yarn_install")
|
load("@build_bazel_rules_nodejs//:index.bzl", "check_rules_nodejs_version", "node_repositories", "yarn_install")
|
||||||
|
|
||||||
check_rules_nodejs_version(minimum_version_string = "1.6.0")
|
check_rules_nodejs_version(minimum_version_string = "2.2.0")
|
||||||
|
|
||||||
# Setup the Node.js toolchain
|
# Setup the Node.js toolchain
|
||||||
node_repositories(
|
node_repositories(
|
||||||
@ -39,23 +39,18 @@ yarn_install(
|
|||||||
yarn_lock = "//:yarn.lock",
|
yarn_lock = "//:yarn.lock",
|
||||||
)
|
)
|
||||||
|
|
||||||
# Install all bazel dependencies of the @npm npm packages
|
|
||||||
load("@npm//:install_bazel_dependencies.bzl", "install_bazel_dependencies")
|
|
||||||
|
|
||||||
install_bazel_dependencies()
|
|
||||||
|
|
||||||
# Load angular dependencies
|
# Load angular dependencies
|
||||||
load("//packages/bazel:package.bzl", "rules_angular_dev_dependencies")
|
load("//packages/bazel:package.bzl", "rules_angular_dev_dependencies")
|
||||||
|
|
||||||
rules_angular_dev_dependencies()
|
rules_angular_dev_dependencies()
|
||||||
|
|
||||||
# Load protractor dependencies
|
# Load protractor dependencies
|
||||||
load("@npm_bazel_protractor//:package.bzl", "npm_bazel_protractor_dependencies")
|
load("@npm//@bazel/protractor:package.bzl", "npm_bazel_protractor_dependencies")
|
||||||
|
|
||||||
npm_bazel_protractor_dependencies()
|
npm_bazel_protractor_dependencies()
|
||||||
|
|
||||||
# Load karma dependencies
|
# Load karma dependencies
|
||||||
load("@npm_bazel_karma//:package.bzl", "npm_bazel_karma_dependencies")
|
load("@npm//@bazel/karma:package.bzl", "npm_bazel_karma_dependencies")
|
||||||
|
|
||||||
npm_bazel_karma_dependencies()
|
npm_bazel_karma_dependencies()
|
||||||
|
|
||||||
@ -64,15 +59,10 @@ load("@io_bazel_rules_webtesting//web:repositories.bzl", "web_test_repositories"
|
|||||||
|
|
||||||
web_test_repositories()
|
web_test_repositories()
|
||||||
|
|
||||||
load("//tools/browsers:browser_repositories.bzl", "browser_repositories")
|
load("//dev-infra/browsers:browser_repositories.bzl", "browser_repositories")
|
||||||
|
|
||||||
browser_repositories()
|
browser_repositories()
|
||||||
|
|
||||||
# Setup the rules_typescript tooolchain
|
|
||||||
load("@npm_bazel_typescript//:index.bzl", "ts_setup_workspace")
|
|
||||||
|
|
||||||
ts_setup_workspace()
|
|
||||||
|
|
||||||
# Setup the rules_sass toolchain
|
# Setup the rules_sass toolchain
|
||||||
load("@io_bazel_rules_sass//sass:sass_repositories.bzl", "sass_repositories")
|
load("@io_bazel_rules_sass//sass:sass_repositories.bzl", "sass_repositories")
|
||||||
|
|
||||||
@ -91,17 +81,18 @@ rbe_autoconfig(
|
|||||||
# Need to specify a base container digest in order to ensure that we can use the checked-in
|
# Need to specify a base container digest in order to ensure that we can use the checked-in
|
||||||
# platform configurations for the "ubuntu16_04" image. Otherwise the autoconfig rule would
|
# platform configurations for the "ubuntu16_04" image. Otherwise the autoconfig rule would
|
||||||
# need to pull the image and run it in order determine the toolchain configuration. See:
|
# need to pull the image and run it in order determine the toolchain configuration. See:
|
||||||
# https://github.com/bazelbuild/bazel-toolchains/blob/1.1.2/configs/ubuntu16_04_clang/versions.bzl
|
# https://github.com/bazelbuild/bazel-toolchains/blob/3.5.1/configs/ubuntu16_04_clang/versions.bzl
|
||||||
base_container_digest = "sha256:1ab40405810effefa0b2f45824d6d608634ccddbf06366760c341ef6fbead011",
|
base_container_digest = "sha256:f6568d8168b14aafd1b707019927a63c2d37113a03bcee188218f99bd0327ea1",
|
||||||
# Note that if you change the `digest`, you might also need to update the
|
# Note that if you change the `digest`, you might also need to update the
|
||||||
# `base_container_digest` to make sure marketplace.gcr.io/google/rbe-ubuntu16-04-webtest:<digest>
|
# `base_container_digest` to make sure marketplace.gcr.io/google/rbe-ubuntu16-04-webtest:<digest>
|
||||||
# and marketplace.gcr.io/google/rbe-ubuntu16-04:<base_container_digest> have
|
# and marketplace.gcr.io/google/rbe-ubuntu16-04:<base_container_digest> have
|
||||||
# the same Clang and JDK installed. Clang is needed because of the dependency on
|
# the same Clang and JDK installed. Clang is needed because of the dependency on
|
||||||
# @com_google_protobuf. Java is needed for the Bazel's test executor Java tool.
|
# @com_google_protobuf. Java is needed for the Bazel's test executor Java tool.
|
||||||
digest = "sha256:0b8fa87db4b8e5366717a7164342a029d1348d2feea7ecc4b18c780bc2507059",
|
digest = "sha256:f743114235a43355bf8324e2ba0fa6a597236fe06f7bc99aaa9ac703631c306b",
|
||||||
env = clang_env(),
|
env = clang_env(),
|
||||||
registry = "marketplace.gcr.io",
|
registry = "marketplace.gcr.io",
|
||||||
# We can't use the default "ubuntu16_04" RBE image provided by the autoconfig because we need
|
# We can't use the default "ubuntu16_04" RBE image provided by the autoconfig because we need
|
||||||
# a specific Linux kernel that comes with "libx11" in order to run headless browser tests.
|
# a specific Linux kernel that comes with "libx11" in order to run headless browser tests.
|
||||||
repository = "google/rbe-ubuntu16-04-webtest",
|
repository = "google/rbe-ubuntu16-04-webtest",
|
||||||
|
use_checked_in_confs = "Force",
|
||||||
)
|
)
|
||||||
|
@ -6,6 +6,7 @@ Everything in this folder is part of the documentation project. This includes
|
|||||||
* the dgeni configuration for converting source files to rendered files that can be viewed in the web site.
|
* the dgeni configuration for converting source files to rendered files that can be viewed in the web site.
|
||||||
* the tooling for setting up examples for development; and generating live-example and zip files from the examples.
|
* the tooling for setting up examples for development; and generating live-example and zip files from the examples.
|
||||||
|
|
||||||
|
<a name="developer-tasks"></a>
|
||||||
## Developer tasks
|
## Developer tasks
|
||||||
|
|
||||||
We use [Yarn](https://yarnpkg.com) to manage the dependencies and to run build tasks.
|
We use [Yarn](https://yarnpkg.com) to manage the dependencies and to run build tasks.
|
||||||
@ -35,8 +36,9 @@ Here are the most important tasks you might need to use:
|
|||||||
|
|
||||||
* `yarn boilerplate:add` - generate all the boilerplate code for the examples, so that they can be run locally.
|
* `yarn boilerplate:add` - generate all the boilerplate code for the examples, so that they can be run locally.
|
||||||
* `yarn boilerplate:add:viewengine` - same as `boilerplate:add` but also turns on `ViewEngine` (pre-Ivy) mode.
|
* `yarn boilerplate:add:viewengine` - same as `boilerplate:add` but also turns on `ViewEngine` (pre-Ivy) mode.
|
||||||
|
|
||||||
* `yarn boilerplate:remove` - remove all the boilerplate code that was added via `yarn boilerplate:add`.
|
* `yarn boilerplate:remove` - remove all the boilerplate code that was added via `yarn boilerplate:add`.
|
||||||
|
* `yarn create-example` - create a new example directory containing initial source files.
|
||||||
|
|
||||||
* `yarn generate-stackblitz` - generate the stackblitz files that are used by the `live-example` tags in the docs.
|
* `yarn generate-stackblitz` - generate the stackblitz files that are used by the `live-example` tags in the docs.
|
||||||
* `yarn generate-zips` - generate the zip files from the examples. Zip available via the `live-example` tags in the docs.
|
* `yarn generate-zips` - generate the zip files from the examples. Zip available via the `live-example` tags in the docs.
|
||||||
|
|
||||||
|
@ -16,13 +16,6 @@ import {BuildNums, PrNums, SHA} from './constants';
|
|||||||
|
|
||||||
const logger = new Logger('mock-external-apis');
|
const logger = new Logger('mock-external-apis');
|
||||||
|
|
||||||
const log = (...args: any[]) => {
|
|
||||||
// Filter out non-matching URL checks
|
|
||||||
if (!/^matching.+: false$/.test(args[0])) {
|
|
||||||
logger.log(...args);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
const AIO_CIRCLE_CI_TOKEN = getEnvVar('AIO_CIRCLE_CI_TOKEN');
|
const AIO_CIRCLE_CI_TOKEN = getEnvVar('AIO_CIRCLE_CI_TOKEN');
|
||||||
const AIO_GITHUB_TOKEN = getEnvVar('AIO_GITHUB_TOKEN');
|
const AIO_GITHUB_TOKEN = getEnvVar('AIO_GITHUB_TOKEN');
|
||||||
|
|
||||||
@ -91,8 +84,8 @@ const createArchive = (buildNum: number, prNum: number, sha: string) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Create request scopes
|
// Create request scopes
|
||||||
const circleCiApi = nock(CIRCLE_CI_API_HOST).log(log).persist();
|
const circleCiApi = nock(CIRCLE_CI_API_HOST).persist();
|
||||||
const githubApi = nock(GITHUB_API_HOST).log(log).persist().matchHeader('Authorization', `token ${AIO_GITHUB_TOKEN}`);
|
const githubApi = nock(GITHUB_API_HOST).persist().matchHeader('Authorization', `token ${AIO_GITHUB_TOKEN}`);
|
||||||
|
|
||||||
//////////////////////////////
|
//////////////////////////////
|
||||||
|
|
||||||
|
@ -27,28 +27,28 @@
|
|||||||
"body-parser": "^1.19.0",
|
"body-parser": "^1.19.0",
|
||||||
"delete-empty": "^3.0.0",
|
"delete-empty": "^3.0.0",
|
||||||
"express": "^4.17.1",
|
"express": "^4.17.1",
|
||||||
"jasmine": "^3.5.0",
|
"jasmine": "^3.6.1",
|
||||||
"nock": "^12.0.3",
|
"nock": "^13.0.4",
|
||||||
"node-fetch": "^2.6.0",
|
"node-fetch": "^2.6.1",
|
||||||
"shelljs": "^0.8.4",
|
"shelljs": "^0.8.4",
|
||||||
"source-map-support": "^0.5.19",
|
"source-map-support": "^0.5.19",
|
||||||
"tar-stream": "^2.1.2",
|
"tar-stream": "^2.1.3",
|
||||||
"tslib": "^1.11.1"
|
"tslib": "^2.0.1"
|
||||||
},
|
},
|
||||||
"devDependencies": {
|
"devDependencies": {
|
||||||
"@types/body-parser": "^1.19.0",
|
"@types/body-parser": "^1.19.0",
|
||||||
"@types/express": "^4.17.6",
|
"@types/express": "^4.17.8",
|
||||||
"@types/jasmine": "^3.5.10",
|
"@types/jasmine": "^3.5.14",
|
||||||
"@types/nock": "^11.1.0",
|
"@types/nock": "^11.1.0",
|
||||||
"@types/node": "^13.13.2",
|
"@types/node": "^14.6.4",
|
||||||
"@types/node-fetch": "^2.5.7",
|
"@types/node-fetch": "^2.5.7",
|
||||||
"@types/shelljs": "^0.8.7",
|
"@types/shelljs": "^0.8.8",
|
||||||
"@types/supertest": "^2.0.8",
|
"@types/supertest": "^2.0.10",
|
||||||
"nodemon": "^2.0.3",
|
"nodemon": "^2.0.4",
|
||||||
"npm-run-all": "^4.1.5",
|
"npm-run-all": "^4.1.5",
|
||||||
"supertest": "^4.0.2",
|
"supertest": "^4.0.2",
|
||||||
"tslint": "^6.1.1",
|
"tslint": "^6.1.3",
|
||||||
"tslint-jasmine-noSkipOrFocus": "^1.0.9",
|
"tslint-jasmine-noSkipOrFocus": "^1.0.9",
|
||||||
"typescript": "^3.8.3"
|
"typescript": "^4.0.2"
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -214,23 +214,24 @@ describe('GithubApi', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should call \'https.request()\' with the correct options', () => {
|
it('should call \'https.request()\' with the correct options', async () => {
|
||||||
const requestHandler = nock('https://api.github.com')
|
const requestHandler = nock('https://api.github.com')
|
||||||
.intercept('/path', 'method')
|
.intercept('/path', 'method')
|
||||||
.reply(200);
|
.reply(200);
|
||||||
|
|
||||||
(api as any).request('method', '/path');
|
await (api as any).request('method', '/path');
|
||||||
requestHandler.done();
|
requestHandler.done();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should add the \'Authorization\' header containing the \'githubToken\'', () => {
|
it('should add the \'Authorization\' header containing the \'githubToken\'', async () => {
|
||||||
const requestHandler = nock('https://api.github.com')
|
const requestHandler = nock('https://api.github.com')
|
||||||
.intercept('/path', 'method', undefined, {
|
.intercept('/path', 'method', undefined, {
|
||||||
reqheaders: {Authorization: 'token 12345'},
|
reqheaders: {Authorization: 'token 12345'},
|
||||||
})
|
})
|
||||||
.reply(200);
|
.reply(200);
|
||||||
(api as any).request('method', '/path');
|
|
||||||
|
await (api as any).request('method', '/path');
|
||||||
requestHandler.done();
|
requestHandler.done();
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -244,12 +245,13 @@ describe('GithubApi', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should \'JSON.stringify\' and send the data along with the request', () => {
|
it('should \'JSON.stringify\' and send the data along with the request', async () => {
|
||||||
const data = {key: 'value'};
|
const data = {key: 'value'};
|
||||||
const requestHandler = nock('https://api.github.com')
|
const requestHandler = nock('https://api.github.com')
|
||||||
.intercept('/path', 'method', JSON.stringify(data))
|
.intercept('/path', 'method', JSON.stringify(data))
|
||||||
.reply(200);
|
.reply(200);
|
||||||
(api as any).request('method', '/path', data);
|
|
||||||
|
await (api as any).request('method', '/path', data);
|
||||||
requestHandler.done();
|
requestHandler.done();
|
||||||
});
|
});
|
||||||
|
|
||||||
|
File diff suppressed because it is too large
Load Diff
@ -22,7 +22,7 @@ you don't need to specify values for those.
|
|||||||
The domain name of the server.
|
The domain name of the server.
|
||||||
|
|
||||||
- `AIO_GITHUB_ORGANIZATION`:
|
- `AIO_GITHUB_ORGANIZATION`:
|
||||||
The GitHub organization whose teams are whitelisted for accepting build artifacts.
|
The GitHub organization whose teams are trusted for accepting build artifacts.
|
||||||
See also `AIO_GITHUB_TEAM_SLUGS`.
|
See also `AIO_GITHUB_TEAM_SLUGS`.
|
||||||
|
|
||||||
- `AIO_GITHUB_REPO`:
|
- `AIO_GITHUB_REPO`:
|
||||||
|
@ -98,7 +98,7 @@ This section describes how each of the aforementioned sub-tasks is accomplished:
|
|||||||
Such a label can only have been added by a maintainer (with the necessary rights) and
|
Such a label can only have been added by a maintainer (with the necessary rights) and
|
||||||
designates that they have manually verified the PR contents.
|
designates that they have manually verified the PR contents.
|
||||||
2. We can verify (again using the GitHub API) the author's membership in one of the
|
2. We can verify (again using the GitHub API) the author's membership in one of the
|
||||||
whitelisted/trusted GitHub teams. For this operation, we need a Personal Access Token with the
|
trusted GitHub teams. For this operation, we need a Personal Access Token with the
|
||||||
`read:org` scope issued by a user that can "see" the specified GitHub organization.
|
`read:org` scope issued by a user that can "see" the specified GitHub organization.
|
||||||
Here too, we use the token by @mary-poppins.
|
Here too, we use the token by @mary-poppins.
|
||||||
|
|
||||||
|
@ -4,9 +4,8 @@
|
|||||||
## Install git, Node.js and yarn
|
## Install git, Node.js and yarn
|
||||||
- `sudo apt-get update`
|
- `sudo apt-get update`
|
||||||
- `sudo apt-get install -y git`
|
- `sudo apt-get install -y git`
|
||||||
- Install [nvm](https://github.com/nvm-sh/nvm#installing-and-updating).
|
- Install the latest stable version of [Node.js](https://nodejs.org/en/download).
|
||||||
- Install Node.js: `nvm install 12`
|
- Install the latest stable version of [yarn](https://classic.yarnpkg.com/en/docs/install).
|
||||||
- Install yarn: `npm install --global yarn`
|
|
||||||
|
|
||||||
|
|
||||||
## Checkout repository
|
## Checkout repository
|
||||||
@ -18,7 +17,11 @@
|
|||||||
- You can overwrite the default environment variables inside the image, by passing new values using
|
- You can overwrite the default environment variables inside the image, by passing new values using
|
||||||
`--build-arg`.
|
`--build-arg`.
|
||||||
|
|
||||||
**Note:** The script has to execute docker commands with `sudo`.
|
**Note 1:** The script has to execute docker commands with `sudo`.
|
||||||
|
|
||||||
|
**Note 2:**
|
||||||
|
The script has to execute `yarn` commands, so make sure `yarn` is on the `PATH` when invoking the
|
||||||
|
script.
|
||||||
|
|
||||||
|
|
||||||
## Example
|
## Example
|
||||||
|
@ -8,7 +8,7 @@ VM host to update the preview server based on changes in the source code.
|
|||||||
|
|
||||||
The script will pull the latest changes from the origin's master branch and examine if there have
|
The script will pull the latest changes from the origin's master branch and examine if there have
|
||||||
been any changes in files inside the preview server source code directory (see below). If there are,
|
been any changes in files inside the preview server source code directory (see below). If there are,
|
||||||
it will create a new image and verify that is works as expected. Finally, it will stop and remove
|
it will create a new image and verify that it works as expected. Finally, it will stop and remove
|
||||||
the old docker container and image, create a new container based on the new image and start it.
|
the old docker container and image, create a new container based on the new image and start it.
|
||||||
|
|
||||||
The script assumes that the preview server source code is in the repository's
|
The script assumes that the preview server source code is in the repository's
|
||||||
@ -25,7 +25,11 @@ used for.
|
|||||||
|
|
||||||
**Note 1:** The script has to execute docker commands with `sudo`.
|
**Note 1:** The script has to execute docker commands with `sudo`.
|
||||||
|
|
||||||
**Note 2:** Make sure the user that executes the script has access to update the repository
|
**Note 2:**
|
||||||
|
The script has to execute `yarn` commands, so make sure `yarn` is on the `PATH` when invoking the
|
||||||
|
script.
|
||||||
|
|
||||||
|
**Note 3:** Make sure the user that executes the script has access to update the repository.
|
||||||
|
|
||||||
|
|
||||||
## Run the script manually
|
## Run the script manually
|
||||||
@ -50,3 +54,9 @@ log its output to `update-preview-server.log` (assuming the user has the necessa
|
|||||||
# Periodically check for changes and update the preview server (if necessary)
|
# Periodically check for changes and update the preview server (if necessary)
|
||||||
*/30 * * * * /path/to/update-preview-server.sh /path/to/repo /path/to/secrets /path/to/builds /path/to/localcerts /path/to/logs >> /path/to/update-preview-server.log 2>&1
|
*/30 * * * * /path/to/update-preview-server.sh /path/to/repo /path/to/secrets /path/to/builds /path/to/localcerts /path/to/logs >> /path/to/update-preview-server.log 2>&1
|
||||||
```
|
```
|
||||||
|
|
||||||
|
**Note:**
|
||||||
|
Keep in mind that cron jobs run in non-interactive, non-login shells. This means that the execution
|
||||||
|
context might be different compared to when running the same commands from an interactive, login
|
||||||
|
shell. For example, `.bashrc` files are normally _not_ sourced automatically in cron jobs. See
|
||||||
|
[here](http://www.gnu.org/software/bash/manual/html_node/Bash-Startup-Files.html) for more info.
|
||||||
|
@ -13,7 +13,8 @@ readonly HOST_LOCALCERTS_DIR=$4
|
|||||||
readonly HOST_LOGS_DIR=$5
|
readonly HOST_LOGS_DIR=$5
|
||||||
|
|
||||||
# Constants
|
# Constants
|
||||||
readonly PROVISIONAL_IMAGE_NAME=aio-builds:provisional
|
readonly PROVISIONAL_TAG=provisional
|
||||||
|
readonly PROVISIONAL_IMAGE_NAME=aio-builds:$PROVISIONAL_TAG
|
||||||
readonly LATEST_IMAGE_NAME=aio-builds:latest
|
readonly LATEST_IMAGE_NAME=aio-builds:latest
|
||||||
readonly CONTAINER_NAME=aio
|
readonly CONTAINER_NAME=aio
|
||||||
|
|
||||||
@ -30,7 +31,7 @@ readonly CONTAINER_NAME=aio
|
|||||||
# Do not update the server unless files inside `aio-builds-setup/` have changed
|
# Do not update the server unless files inside `aio-builds-setup/` have changed
|
||||||
# or the last attempt failed (identified by the provisional image still being around).
|
# or the last attempt failed (identified by the provisional image still being around).
|
||||||
readonly relevantChangedFilesCount=$(git diff --name-only $lastDeployedCommit...HEAD | grep -P "^aio/aio-builds-setup/" | wc -l)
|
readonly relevantChangedFilesCount=$(git diff --name-only $lastDeployedCommit...HEAD | grep -P "^aio/aio-builds-setup/" | wc -l)
|
||||||
readonly lastAttemptFailed=$(sudo docker rmi "$PROVISIONAL_IMAGE_NAME" >> /dev/fd/3 && echo "true" || echo "false")
|
readonly lastAttemptFailed=$(sudo docker image ls | grep "$PROVISIONAL_TAG" >> /dev/fd/3 && echo "true" || echo "false")
|
||||||
if [[ $relevantChangedFilesCount -eq 0 ]] && [[ "$lastAttemptFailed" != "true" ]]; then
|
if [[ $relevantChangedFilesCount -eq 0 ]] && [[ "$lastAttemptFailed" != "true" ]]; then
|
||||||
echo "Skipping update because no relevant files have been touched."
|
echo "Skipping update because no relevant files have been touched."
|
||||||
exit 0
|
exit 0
|
||||||
|
@ -58,7 +58,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"styles": [
|
"styles": [
|
||||||
"src/styles.scss"
|
"src/styles/main.scss"
|
||||||
],
|
],
|
||||||
"scripts": [],
|
"scripts": [],
|
||||||
"budgets": [
|
"budgets": [
|
||||||
@ -158,7 +158,7 @@
|
|||||||
}
|
}
|
||||||
],
|
],
|
||||||
"styles": [
|
"styles": [
|
||||||
"src/styles.scss"
|
"src/styles/main.scss"
|
||||||
],
|
],
|
||||||
"scripts": []
|
"scripts": []
|
||||||
}
|
}
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
# CLI Overview and Command Reference
|
# CLI Overview and Command Reference
|
||||||
|
|
||||||
The Angular CLI is a command-line interface tool that you use to initialize, develop, scaffold, and maintain Angular applications. You can use the tool directly in a command shell, or indirectly through an interactive UI such as [Angular Console](https://angularconsole.com).
|
The Angular CLI is a command-line interface tool that you use to initialize, develop, scaffold, and maintain Angular applications directly from a command shell.
|
||||||
|
|
||||||
## Installing Angular CLI
|
## Installing Angular CLI
|
||||||
|
|
||||||
@ -109,9 +109,3 @@ Options that specify files can be given as absolute paths, or as paths relative
|
|||||||
The [ng generate](cli/generate) and [ng add](cli/add) commands take as an argument the artifact or library to be generated or added to the current project.
|
The [ng generate](cli/generate) and [ng add](cli/add) commands take as an argument the artifact or library to be generated or added to the current project.
|
||||||
In addition to any general options, each artifact or library defines its own options in a *schematic*.
|
In addition to any general options, each artifact or library defines its own options in a *schematic*.
|
||||||
Schematic options are supplied to the command in the same format as immediate command options.
|
Schematic options are supplied to the command in the same format as immediate command options.
|
||||||
|
|
||||||
|
|
||||||
### Building with Bazel
|
|
||||||
|
|
||||||
Optionally, you can configure the Angular CLI to use [Bazel](https://docs.bazel.build) as the build tool. For more information, see [Building with Bazel](guide/bazel).
|
|
||||||
|
|
||||||
|
5
aio/content/examples/.gitignore
vendored
5
aio/content/examples/.gitignore
vendored
@ -17,7 +17,9 @@
|
|||||||
**/e2e/tsconfig.e2e.json
|
**/e2e/tsconfig.e2e.json
|
||||||
**/src/karma.conf.js
|
**/src/karma.conf.js
|
||||||
**/.angular-cli.json
|
**/.angular-cli.json
|
||||||
|
**/.browserslistrc
|
||||||
**/.editorconfig
|
**/.editorconfig
|
||||||
|
**/.gitignore
|
||||||
**/angular.json
|
**/angular.json
|
||||||
**/tsconfig.json
|
**/tsconfig.json
|
||||||
**/bs-config.e2e.json
|
**/bs-config.e2e.json
|
||||||
@ -29,8 +31,9 @@
|
|||||||
**/tslint.json
|
**/tslint.json
|
||||||
**/karma-test-shim.js
|
**/karma-test-shim.js
|
||||||
**/browser-test-shim.js
|
**/browser-test-shim.js
|
||||||
**/browserslist
|
|
||||||
**/node_modules
|
**/node_modules
|
||||||
|
**/yarn.lock
|
||||||
|
**/package-lock.json
|
||||||
|
|
||||||
# built files
|
# built files
|
||||||
*.map
|
*.map
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
'use strict'; // necessary for es6 output in node
|
|
||||||
|
|
||||||
import { browser, element, by } from 'protractor';
|
import { browser, element, by } from 'protractor';
|
||||||
|
|
||||||
describe('Accessibility example e2e tests', () => {
|
describe('Accessibility example e2e tests', () => {
|
||||||
@ -8,11 +6,11 @@ describe('Accessibility example e2e tests', () => {
|
|||||||
browser.get('');
|
browser.get('');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display Accessibility Example', function () {
|
it('should display Accessibility Example', () => {
|
||||||
expect(element(by.css('h1')).getText()).toEqual('Accessibility Example');
|
expect(element(by.css('h1')).getText()).toEqual('Accessibility Example');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should take a number and change progressbar width', function () {
|
it('should take a number and change progressbar width', () => {
|
||||||
element(by.css('input')).sendKeys('16');
|
element(by.css('input')).sendKeys('16');
|
||||||
expect(element(by.css('input')).getAttribute('value')).toEqual('016');
|
expect(element(by.css('input')).getAttribute('value')).toEqual('016');
|
||||||
expect(element(by.css('app-example-progressbar div')).getCssValue('width')).toBe('48px');
|
expect(element(by.css('app-example-progressbar div')).getCssValue('width')).toBe('48px');
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
// tslint:disable: no-host-metadata-property
|
||||||
// #docregion progressbar-component
|
// #docregion progressbar-component
|
||||||
import { Component, Input } from '@angular/core';
|
import { Component, Input } from '@angular/core';
|
||||||
|
|
||||||
|
@ -1,20 +1,18 @@
|
|||||||
'use strict'; // necessary for es6 output in node
|
|
||||||
|
|
||||||
import { browser, element, by } from 'protractor';
|
import { browser, element, by } from 'protractor';
|
||||||
|
|
||||||
describe('AngularJS to Angular Quick Reference Tests', function () {
|
describe('AngularJS to Angular Quick Reference Tests', () => {
|
||||||
|
|
||||||
beforeAll(function () {
|
beforeAll(() => {
|
||||||
browser.get('');
|
browser.get('');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display no poster images after bootstrap', function () {
|
it('should display no poster images after bootstrap', () => {
|
||||||
testImagesAreDisplayed(false);
|
testImagesAreDisplayed(false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display proper movie data', function () {
|
it('should display proper movie data', () => {
|
||||||
// We check only a few samples
|
// We check only a few samples
|
||||||
let expectedSamples: any[] = [
|
const expectedSamples: any[] = [
|
||||||
{row: 0, column: 0, element: 'img', attr: 'src', value: 'images/hero.png', contains: true},
|
{row: 0, column: 0, element: 'img', attr: 'src', value: 'images/hero.png', contains: true},
|
||||||
{row: 0, column: 2, value: 'Celeritas'},
|
{row: 0, column: 2, value: 'Celeritas'},
|
||||||
{row: 1, column: 3, matches: /Dec 1[678], 2015/}, // absorb timezone dif; we care about date format
|
{row: 1, column: 3, matches: /Dec 1[678], 2015/}, // absorb timezone dif; we care about date format
|
||||||
@ -25,18 +23,17 @@ describe('AngularJS to Angular Quick Reference Tests', function () {
|
|||||||
];
|
];
|
||||||
|
|
||||||
// Go through the samples
|
// Go through the samples
|
||||||
let movieRows = getMovieRows();
|
const movieRows = getMovieRows();
|
||||||
for (let i = 0; i < expectedSamples.length; i++) {
|
for (const sample of expectedSamples) {
|
||||||
let sample = expectedSamples[i];
|
const tableCell = movieRows.get(sample.row)
|
||||||
let tableCell = movieRows.get(sample.row)
|
|
||||||
.all(by.tagName('td')).get(sample.column);
|
.all(by.tagName('td')).get(sample.column);
|
||||||
// Check the cell or its nested element
|
// Check the cell or its nested element
|
||||||
let elementToCheck = sample.element
|
const elementToCheck = sample.element
|
||||||
? tableCell.element(by.tagName(sample.element))
|
? tableCell.element(by.tagName(sample.element))
|
||||||
: tableCell;
|
: tableCell;
|
||||||
|
|
||||||
// Check element attribute or text
|
// Check element attribute or text
|
||||||
let valueToCheck = sample.attr
|
const valueToCheck = sample.attr
|
||||||
? elementToCheck.getAttribute(sample.attr)
|
? elementToCheck.getAttribute(sample.attr)
|
||||||
: elementToCheck.getText();
|
: elementToCheck.getText();
|
||||||
|
|
||||||
@ -51,42 +48,42 @@ describe('AngularJS to Angular Quick Reference Tests', function () {
|
|||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display images after Show Poster', function () {
|
it('should display images after Show Poster', () => {
|
||||||
testPosterButtonClick('Show Poster', true);
|
testPosterButtonClick('Show Poster', true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should hide images after Hide Poster', function () {
|
it('should hide images after Hide Poster', () => {
|
||||||
testPosterButtonClick('Hide Poster', false);
|
testPosterButtonClick('Hide Poster', false);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display no movie when no favorite hero is specified', function () {
|
it('should display no movie when no favorite hero is specified', () => {
|
||||||
testFavoriteHero(null, 'Please enter your favorite hero.');
|
testFavoriteHero(null, 'Please enter your favorite hero.');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display no movie for Magneta', function () {
|
it('should display no movie for Magneta', () => {
|
||||||
testFavoriteHero('Magneta', 'No movie, sorry!');
|
testFavoriteHero('Magneta', 'No movie, sorry!');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display a movie for Dr Nice', function () {
|
it('should display a movie for Dr Nice', () => {
|
||||||
testFavoriteHero('Dr Nice', 'Excellent choice!');
|
testFavoriteHero('Dr Nice', 'Excellent choice!');
|
||||||
});
|
});
|
||||||
|
|
||||||
function testImagesAreDisplayed(isDisplayed: boolean) {
|
function testImagesAreDisplayed(isDisplayed: boolean) {
|
||||||
let expectedMovieCount = 3;
|
const expectedMovieCount = 3;
|
||||||
|
|
||||||
let movieRows = getMovieRows();
|
const movieRows = getMovieRows();
|
||||||
expect(movieRows.count()).toBe(expectedMovieCount);
|
expect(movieRows.count()).toBe(expectedMovieCount);
|
||||||
for (let i = 0; i < expectedMovieCount; i++) {
|
for (let i = 0; i < expectedMovieCount; i++) {
|
||||||
let movieImage = movieRows.get(i).element(by.css('td > img'));
|
const movieImage = movieRows.get(i).element(by.css('td > img'));
|
||||||
expect(movieImage.isDisplayed()).toBe(isDisplayed);
|
expect(movieImage.isDisplayed()).toBe(isDisplayed);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function testPosterButtonClick(expectedButtonText: string, isDisplayed: boolean) {
|
function testPosterButtonClick(expectedButtonText: string, isDisplayed: boolean) {
|
||||||
let posterButton = element(by.css('app-movie-list tr > th > button'));
|
const posterButton = element(by.css('app-movie-list tr > th > button'));
|
||||||
expect(posterButton.getText()).toBe(expectedButtonText);
|
expect(posterButton.getText()).toBe(expectedButtonText);
|
||||||
|
|
||||||
posterButton.click().then(function () {
|
posterButton.click().then(() => {
|
||||||
testImagesAreDisplayed(isDisplayed);
|
testImagesAreDisplayed(isDisplayed);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
@ -96,12 +93,12 @@ describe('AngularJS to Angular Quick Reference Tests', function () {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function testFavoriteHero(heroName: string, expectedLabel: string) {
|
function testFavoriteHero(heroName: string, expectedLabel: string) {
|
||||||
let movieListComp = element(by.tagName('app-movie-list'));
|
const movieListComp = element(by.tagName('app-movie-list'));
|
||||||
let heroInput = movieListComp.element(by.tagName('input'));
|
const heroInput = movieListComp.element(by.tagName('input'));
|
||||||
let favoriteHeroLabel = movieListComp.element(by.tagName('h3'));
|
const favoriteHeroLabel = movieListComp.element(by.tagName('h3'));
|
||||||
let resultLabel = movieListComp.element(by.css('span > p'));
|
const resultLabel = movieListComp.element(by.css('span > p'));
|
||||||
|
|
||||||
heroInput.clear().then(function () {
|
heroInput.clear().then(() => {
|
||||||
heroInput.sendKeys(heroName || '');
|
heroInput.sendKeys(heroName || '');
|
||||||
expect(resultLabel.getText()).toBe(expectedLabel);
|
expect(resultLabel.getText()).toBe(expectedLabel);
|
||||||
if (heroName) {
|
if (heroName) {
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// #docregion
|
// #docregion
|
||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { Routes, RouterModule } from '@angular/router';
|
import { Routes, RouterModule } from '@angular/router';
|
||||||
|
|
||||||
import { MovieListComponent } from './movie-list.component';
|
import { MovieListComponent } from './movie-list.component';
|
||||||
|
|
||||||
|
@ -1,8 +1,8 @@
|
|||||||
// #docregion
|
// #docregion
|
||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [ BrowserModule ],
|
imports: [ BrowserModule ],
|
||||||
|
@ -1,9 +1,9 @@
|
|||||||
// #docregion
|
// #docregion
|
||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
import { FormsModule } from '@angular/forms';
|
import { FormsModule } from '@angular/forms';
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
import { MovieListComponent } from './movie-list.component';
|
import { MovieListComponent } from './movie-list.component';
|
||||||
import { AppRoutingModule } from './app-routing.module';
|
import { AppRoutingModule } from './app-routing.module';
|
||||||
|
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
'use strict'; // necessary for es6 output in node
|
|
||||||
|
|
||||||
import { browser, ExpectedConditions as EC } from 'protractor';
|
import { browser, ExpectedConditions as EC } from 'protractor';
|
||||||
import { logging } from 'selenium-webdriver';
|
import { logging } from 'selenium-webdriver';
|
||||||
import * as openClose from './open-close.po';
|
import * as openClose from './open-close.po';
|
||||||
|
@ -32,15 +32,15 @@ export const slideInAnimation =
|
|||||||
// #enddocregion style-view
|
// #enddocregion style-view
|
||||||
// #docregion query
|
// #docregion query
|
||||||
query(':enter', [
|
query(':enter', [
|
||||||
style({ left: '-100%'})
|
style({ left: '-100%' })
|
||||||
]),
|
]),
|
||||||
query(':leave', animateChild()),
|
query(':leave', animateChild()),
|
||||||
group([
|
group([
|
||||||
query(':leave', [
|
query(':leave', [
|
||||||
animate('300ms ease-out', style({ left: '100%'}))
|
animate('300ms ease-out', style({ left: '100%' }))
|
||||||
]),
|
]),
|
||||||
query(':enter', [
|
query(':enter', [
|
||||||
animate('300ms ease-out', style({ left: '0%'}))
|
animate('300ms ease-out', style({ left: '0%' }))
|
||||||
])
|
])
|
||||||
]),
|
]),
|
||||||
query(':enter', animateChild()),
|
query(':enter', animateChild()),
|
||||||
@ -56,15 +56,15 @@ export const slideInAnimation =
|
|||||||
})
|
})
|
||||||
]),
|
]),
|
||||||
query(':enter', [
|
query(':enter', [
|
||||||
style({ left: '-100%'})
|
style({ left: '-100%' })
|
||||||
]),
|
]),
|
||||||
query(':leave', animateChild()),
|
query(':leave', animateChild()),
|
||||||
group([
|
group([
|
||||||
query(':leave', [
|
query(':leave', [
|
||||||
animate('200ms ease-out', style({ left: '100%'}))
|
animate('200ms ease-out', style({ left: '100%' }))
|
||||||
]),
|
]),
|
||||||
query(':enter', [
|
query(':enter', [
|
||||||
animate('300ms ease-out', style({ left: '0%'}))
|
animate('300ms ease-out', style({ left: '0%' }))
|
||||||
])
|
])
|
||||||
]),
|
]),
|
||||||
query(':enter', animateChild()),
|
query(':enter', animateChild()),
|
||||||
|
@ -17,7 +17,7 @@ Toggle All Animations <input type="checkbox" [checked]="!animationsDisabled" (cl
|
|||||||
</nav>
|
</nav>
|
||||||
|
|
||||||
<!-- #docregion route-animations-outlet -->
|
<!-- #docregion route-animations-outlet -->
|
||||||
<div [@routeAnimations]="prepareRoute(outlet)" >
|
<div [@routeAnimations]="prepareRoute(outlet)">
|
||||||
<router-outlet #outlet="outlet"></router-outlet>
|
<router-outlet #outlet="outlet"></router-outlet>
|
||||||
</div>
|
</div>
|
||||||
<!-- #enddocregion route-animations-outlet -->
|
<!-- #enddocregion route-animations-outlet -->
|
||||||
|
@ -34,7 +34,7 @@ export class AppComponent {
|
|||||||
|
|
||||||
// #docregion prepare-router-outlet
|
// #docregion prepare-router-outlet
|
||||||
prepareRoute(outlet: RouterOutlet) {
|
prepareRoute(outlet: RouterOutlet) {
|
||||||
return outlet && outlet.activatedRouteData && outlet.activatedRouteData['animation'];
|
return outlet && outlet.activatedRouteData && outlet.activatedRouteData.animation;
|
||||||
}
|
}
|
||||||
|
|
||||||
// #enddocregion prepare-router-outlet
|
// #enddocregion prepare-router-outlet
|
||||||
|
@ -1,4 +1,6 @@
|
|||||||
|
// tslint:disable: variable-name
|
||||||
// #docplaster
|
// #docplaster
|
||||||
|
// #docregion
|
||||||
import { Component, HostBinding, OnInit } from '@angular/core';
|
import { Component, HostBinding, OnInit } from '@angular/core';
|
||||||
import { trigger, transition, animate, style, query, stagger } from '@angular/animations';
|
import { trigger, transition, animate, style, query, stagger } from '@angular/animations';
|
||||||
import { HEROES } from './mock-heroes';
|
import { HEROES } from './mock-heroes';
|
||||||
@ -52,13 +54,11 @@ export class HeroListPageComponent implements OnInit {
|
|||||||
@HostBinding('@pageAnimations')
|
@HostBinding('@pageAnimations')
|
||||||
public animatePage = true;
|
public animatePage = true;
|
||||||
|
|
||||||
_heroes = [];
|
|
||||||
// #docregion filter-animations
|
// #docregion filter-animations
|
||||||
heroTotal = -1;
|
heroTotal = -1;
|
||||||
// #enddocregion filter-animations
|
// #enddocregion filter-animations
|
||||||
get heroes() {
|
get heroes() { return this._heroes; }
|
||||||
return this._heroes;
|
private _heroes = [];
|
||||||
}
|
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this._heroes = HEROES;
|
this._heroes = HEROES;
|
||||||
|
@ -8,8 +8,7 @@ import { trigger, transition, state, animate, style, AnimationEvent } from '@ang
|
|||||||
// #docregion trigger, trigger-wildcard1, trigger-transition
|
// #docregion trigger, trigger-wildcard1, trigger-transition
|
||||||
animations: [
|
animations: [
|
||||||
trigger('openClose', [
|
trigger('openClose', [
|
||||||
// #enddocregion events1
|
// #docregion state1
|
||||||
// #docregion state1, events1
|
|
||||||
// ...
|
// ...
|
||||||
// #enddocregion events1
|
// #enddocregion events1
|
||||||
state('open', style({
|
state('open', style({
|
||||||
@ -34,8 +33,7 @@ import { trigger, transition, state, animate, style, AnimationEvent } from '@ang
|
|||||||
transition('closed => open', [
|
transition('closed => open', [
|
||||||
animate('0.5s')
|
animate('0.5s')
|
||||||
]),
|
]),
|
||||||
// #enddocregion trigger, component
|
// #enddocregion transition2, trigger, component
|
||||||
// #enddocregion transition2
|
|
||||||
// #docregion trigger-wildcard1
|
// #docregion trigger-wildcard1
|
||||||
transition('* => closed', [
|
transition('* => closed', [
|
||||||
animate('1s')
|
animate('1s')
|
||||||
@ -70,7 +68,9 @@ import { trigger, transition, state, animate, style, AnimationEvent } from '@ang
|
|||||||
})
|
})
|
||||||
// #docregion events
|
// #docregion events
|
||||||
export class OpenCloseComponent {
|
export class OpenCloseComponent {
|
||||||
// #enddocregion events1, events
|
// #enddocregion events1, events, component
|
||||||
|
@Input() logging = false;
|
||||||
|
// #docregion component
|
||||||
isOpen = true;
|
isOpen = true;
|
||||||
|
|
||||||
toggle() {
|
toggle() {
|
||||||
@ -78,9 +78,8 @@ export class OpenCloseComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// #enddocregion component
|
// #enddocregion component
|
||||||
@Input() logging = false;
|
|
||||||
// #docregion events1, events
|
// #docregion events1, events
|
||||||
onAnimationEvent ( event: AnimationEvent ) {
|
onAnimationEvent( event: AnimationEvent ) {
|
||||||
// #enddocregion events1, events
|
// #enddocregion events1, events
|
||||||
if (!this.logging) {
|
if (!this.logging) {
|
||||||
return;
|
return;
|
||||||
|
@ -1,5 +1,3 @@
|
|||||||
'use strict'; // necessary for es6 output in node
|
|
||||||
|
|
||||||
import { protractor, browser, element, by, ElementFinder } from 'protractor';
|
import { protractor, browser, element, by, ElementFinder } from 'protractor';
|
||||||
|
|
||||||
const nameSuffix = 'X';
|
const nameSuffix = 'X';
|
||||||
@ -21,7 +19,7 @@ describe('Architecture', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it(`has h2 '${expectedH2}'`, () => {
|
it(`has h2 '${expectedH2}'`, () => {
|
||||||
let h2 = element.all(by.css('h2')).map((elt: any) => elt.getText());
|
const h2 = element.all(by.css('h2')).map((elt: any) => elt.getText());
|
||||||
expect(h2).toEqual(expectedH2);
|
expect(h2).toEqual(expectedH2);
|
||||||
});
|
});
|
||||||
|
|
||||||
@ -34,42 +32,42 @@ function heroTests() {
|
|||||||
const targetHero: Hero = { id: 2, name: 'Dr Nice' };
|
const targetHero: Hero = { id: 2, name: 'Dr Nice' };
|
||||||
|
|
||||||
it('has the right number of heroes', () => {
|
it('has the right number of heroes', () => {
|
||||||
let page = getPageElts();
|
const page = getPageElts();
|
||||||
expect(page.heroes.count()).toEqual(3);
|
expect(page.heroes.count()).toEqual(3);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('has no hero details initially', function () {
|
it('has no hero details initially', () => {
|
||||||
let page = getPageElts();
|
const page = getPageElts();
|
||||||
expect(page.heroDetail.isPresent()).toBeFalsy('no hero detail');
|
expect(page.heroDetail.isPresent()).toBeFalsy('no hero detail');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('shows selected hero details', async () => {
|
it('shows selected hero details', async () => {
|
||||||
await element(by.cssContainingText('li', targetHero.name)).click();
|
await element(by.cssContainingText('li', targetHero.name)).click();
|
||||||
let page = getPageElts();
|
const page = getPageElts();
|
||||||
let hero = await heroFromDetail(page.heroDetail);
|
const hero = await heroFromDetail(page.heroDetail);
|
||||||
expect(hero.id).toEqual(targetHero.id);
|
expect(hero.id).toEqual(targetHero.id);
|
||||||
expect(hero.name).toEqual(targetHero.name);
|
expect(hero.name).toEqual(targetHero.name);
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`shows updated hero name in details`, async () => {
|
it(`shows updated hero name in details`, async () => {
|
||||||
let input = element.all(by.css('input')).first();
|
const input = element.all(by.css('input')).first();
|
||||||
input.sendKeys(nameSuffix);
|
input.sendKeys(nameSuffix);
|
||||||
let page = getPageElts();
|
const page = getPageElts();
|
||||||
let hero = await heroFromDetail(page.heroDetail);
|
const hero = await heroFromDetail(page.heroDetail);
|
||||||
let newName = targetHero.name + nameSuffix;
|
const newName = targetHero.name + nameSuffix;
|
||||||
expect(hero.id).toEqual(targetHero.id);
|
expect(hero.id).toEqual(targetHero.id);
|
||||||
expect(hero.name).toEqual(newName);
|
expect(hero.name).toEqual(newName);
|
||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
function salesTaxTests() {
|
function salesTaxTests() {
|
||||||
it('has no sales tax initially', function () {
|
it('has no sales tax initially', () => {
|
||||||
let page = getPageElts();
|
const page = getPageElts();
|
||||||
expect(page.salesTaxDetail.isPresent()).toBeFalsy('no sales tax info');
|
expect(page.salesTaxDetail.isPresent()).toBeFalsy('no sales tax info');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('shows sales tax', async function () {
|
it('shows sales tax', async () => {
|
||||||
let page = getPageElts();
|
const page = getPageElts();
|
||||||
page.salesTaxAmountInput.sendKeys('10', protractor.Key.ENTER);
|
page.salesTaxAmountInput.sendKeys('10', protractor.Key.ENTER);
|
||||||
expect(page.salesTaxDetail.getText()).toEqual('The sales tax is $1.00');
|
expect(page.salesTaxDetail.getText()).toEqual('The sales tax is $1.00');
|
||||||
});
|
});
|
||||||
@ -88,13 +86,11 @@ function getPageElts() {
|
|||||||
|
|
||||||
async function heroFromDetail(detail: ElementFinder): Promise<Hero> {
|
async function heroFromDetail(detail: ElementFinder): Promise<Hero> {
|
||||||
// Get hero id from the first <div>
|
// Get hero id from the first <div>
|
||||||
// let _id = await detail.all(by.css('div')).first().getText();
|
const id = await detail.all(by.css('div')).first().getText();
|
||||||
let _id = await detail.all(by.css('div')).first().getText();
|
|
||||||
// Get name from the h2
|
// Get name from the h2
|
||||||
// let _name = await detail.element(by.css('h4')).getText();
|
const name = await detail.element(by.css('h4')).getText();
|
||||||
let _name = await detail.element(by.css('h4')).getText();
|
|
||||||
return {
|
return {
|
||||||
id: +_id.substr(_id.indexOf(' ') + 1),
|
id: +id.substr(id.indexOf(' ') + 1),
|
||||||
name: _name.substr(0, _name.lastIndexOf(' '))
|
name: name.substr(0, name.lastIndexOf(' ')),
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
@ -1,15 +1,15 @@
|
|||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
import { FormsModule } from '@angular/forms';
|
import { FormsModule } from '@angular/forms';
|
||||||
// #docregion imports
|
// #docregion imports
|
||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
// #enddocregion imports
|
// #enddocregion imports
|
||||||
import { HeroDetailComponent } from './hero-detail.component';
|
import { HeroDetailComponent } from './hero-detail.component';
|
||||||
import { HeroListComponent } from './hero-list.component';
|
import { HeroListComponent } from './hero-list.component';
|
||||||
import { SalesTaxComponent } from './sales-tax.component';
|
import { SalesTaxComponent } from './sales-tax.component';
|
||||||
import { HeroService } from './hero.service';
|
import { HeroService } from './hero.service';
|
||||||
import { BackendService } from './backend.service';
|
import { BackendService } from './backend.service';
|
||||||
import { Logger } from './logger.service';
|
import { Logger } from './logger.service';
|
||||||
|
|
||||||
@NgModule({
|
@NgModule({
|
||||||
imports: [
|
imports: [
|
||||||
|
@ -18,7 +18,7 @@ export class BackendService {
|
|||||||
// TODO: get from the database
|
// TODO: get from the database
|
||||||
return Promise.resolve<Hero[]>(HEROES);
|
return Promise.resolve<Hero[]>(HEROES);
|
||||||
}
|
}
|
||||||
let err = new Error('Cannot get object of this type');
|
const err = new Error('Cannot get object of this type');
|
||||||
this.logger.error(err);
|
this.logger.error(err);
|
||||||
throw err;
|
throw err;
|
||||||
}
|
}
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Component, OnInit } from '@angular/core';
|
import { Component, OnInit } from '@angular/core';
|
||||||
|
|
||||||
import { Hero } from './hero';
|
import { Hero } from './hero';
|
||||||
import { HeroService } from './hero.service';
|
import { HeroService } from './hero.service';
|
||||||
|
|
||||||
// #docregion metadata, providers
|
// #docregion metadata, providers
|
||||||
@Component({
|
@Component({
|
||||||
|
@ -22,7 +22,7 @@ export class AppComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
// #docregion module
|
// #docregion module
|
||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
// #docregion import-browser-module
|
// #docregion import-browser-module
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
// #enddocregion import-browser-module
|
// #enddocregion import-browser-module
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
import { SalesTaxService } from './sales-tax.service';
|
import { SalesTaxService } from './sales-tax.service';
|
||||||
import { TaxRateService } from './tax-rate.service';
|
import { TaxRateService } from './tax-rate.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-sales-tax',
|
selector: 'app-sales-tax',
|
||||||
|
@ -7,7 +7,7 @@ export class SalesTaxService {
|
|||||||
constructor(private rateService: TaxRateService) { }
|
constructor(private rateService: TaxRateService) { }
|
||||||
|
|
||||||
getVAT(value: string | number) {
|
getVAT(value: string | number) {
|
||||||
let amount = (typeof value === 'string') ?
|
const amount = (typeof value === 'string') ?
|
||||||
parseFloat(value) : value;
|
parseFloat(value) : value;
|
||||||
return (amount || 0) * this.rateService.getRate('VAT');
|
return (amount || 0) * this.rateService.getRate('VAT');
|
||||||
}
|
}
|
||||||
|
@ -1,34 +1,32 @@
|
|||||||
'use strict'; // necessary for es6 output in node
|
|
||||||
|
|
||||||
import { browser, element, by } from 'protractor';
|
import { browser, element, by } from 'protractor';
|
||||||
|
|
||||||
describe('Attribute binding example', function () {
|
describe('Attribute binding example', () => {
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(() => {
|
||||||
browser.get('');
|
browser.get('');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display Property Binding with Angular', function () {
|
it('should display Property Binding with Angular', () => {
|
||||||
expect(element(by.css('h1')).getText()).toEqual('Attribute, class, and style bindings');
|
expect(element(by.css('h1')).getText()).toEqual('Attribute, class, and style bindings');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display a table', function() {
|
it('should display a table', () => {
|
||||||
expect(element.all(by.css('table')).isPresent()).toBe(true);
|
expect(element.all(by.css('table')).isPresent()).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display an Aria button', function () {
|
it('should display an Aria button', () => {
|
||||||
expect(element.all(by.css('button')).get(0).getText()).toBe('Go for it with Aria');
|
expect(element.all(by.css('button')).get(0).getText()).toBe('Go for it with Aria');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display a blue background on div', function () {
|
it('should display a blue background on div', () => {
|
||||||
expect(element.all(by.css('div')).get(1).getCssValue('background-color')).toEqual('rgba(25, 118, 210, 1)');
|
expect(element.all(by.css('div')).get(1).getCssValue('background-color')).toEqual('rgba(25, 118, 210, 1)');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display a blue div with a red border', function () {
|
it('should display a blue div with a red border', () => {
|
||||||
expect(element.all(by.css('div')).get(1).getCssValue('border')).toEqual('2px solid rgb(212, 30, 46)');
|
expect(element.all(by.css('div')).get(1).getCssValue('border')).toEqual('2px solid rgb(212, 30, 46)');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display a div with many classes', function () {
|
it('should display a div with many classes', () => {
|
||||||
expect(element.all(by.css('div')).get(1).getAttribute('class')).toContain('special');
|
expect(element.all(by.css('div')).get(1).getAttribute('class')).toContain('special');
|
||||||
expect(element.all(by.css('div')).get(1).getAttribute('class')).toContain('clearance');
|
expect(element.all(by.css('div')).get(1).getAttribute('class')).toContain('clearance');
|
||||||
});
|
});
|
||||||
|
@ -3,8 +3,10 @@
|
|||||||
<h2>Attribute binding</h2>
|
<h2>Attribute binding</h2>
|
||||||
<!-- #docregion attrib-binding-colspan -->
|
<!-- #docregion attrib-binding-colspan -->
|
||||||
<table border=1>
|
<table border=1>
|
||||||
|
<!-- #docregion colspan -->
|
||||||
<!-- expression calculates colspan=2 -->
|
<!-- expression calculates colspan=2 -->
|
||||||
<tr><td [attr.colspan]="1 + 1">One-Two</td></tr>
|
<tr><td [attr.colspan]="1 + 1">One-Two</td></tr>
|
||||||
|
<!-- #enddocregion colspan -->
|
||||||
|
|
||||||
<!-- ERROR: There is no `colspan` property to set!
|
<!-- ERROR: There is no `colspan` property to set!
|
||||||
<tr><td colspan="{{1 + 1}}">Three-Four</td></tr>
|
<tr><td colspan="{{1 + 1}}">Three-Four</td></tr>
|
||||||
@ -32,31 +34,31 @@
|
|||||||
<!-- #docregion basic-specificity -->
|
<!-- #docregion basic-specificity -->
|
||||||
<h3>Basic specificity</h3>
|
<h3>Basic specificity</h3>
|
||||||
|
|
||||||
<!-- The `class.special` binding will override any value for the `special` class in `classExpr`. -->
|
<!-- The `class.special` binding overrides any value for the `special` class in `classExpression`. -->
|
||||||
<div [class.special]="isSpecial" [class]="classExpr">Some text.</div>
|
<div [class.special]="isSpecial" [class]="classExpression">Some text.</div>
|
||||||
|
|
||||||
<!-- The `style.color` binding will override any value for the `color` property in `styleExpr`. -->
|
<!-- The `style.color` binding overrides any value for the `color` property in `styleExpression`. -->
|
||||||
<div [style.color]="color" [style]="styleExpr">Some text.</div>
|
<div [style.color]="color" [style]="styleExpression">Some text.</div>
|
||||||
<!-- #enddocregion basic-specificity -->
|
<!-- #enddocregion basic-specificity -->
|
||||||
|
|
||||||
<!-- #docregion source-specificity -->
|
<!-- #docregion source-specificity -->
|
||||||
<h3>Source specificity</h3>
|
<h3>Source specificity</h3>
|
||||||
|
|
||||||
<!-- The `class.special` template binding will override any host binding to the `special` class set by `dirWithClassBinding` or `comp-with-host-binding`.-->
|
<!-- The `class.special` template binding overrides any host binding to the `special` class set by `dirWithClassBinding` or `comp-with-host-binding`.-->
|
||||||
<comp-with-host-binding [class.special]="isSpecial" dirWithClassBinding>Some text.</comp-with-host-binding>
|
<comp-with-host-binding [class.special]="isSpecial" dirWithClassBinding>Some text.</comp-with-host-binding>
|
||||||
|
|
||||||
<!-- The `style.color` template binding will override any host binding to the `color` property set by `dirWithStyleBinding` or `comp-with-host-binding`. -->
|
<!-- The `style.color` template binding overrides any host binding to the `color` property set by `dirWithStyleBinding` or `comp-with-host-binding`. -->
|
||||||
<comp-with-host-binding [style.color]="color" dirWithStyleBinding>Some text.</comp-with-host-binding>
|
<comp-with-host-binding [style.color]="color" dirWithStyleBinding>Some text.</comp-with-host-binding>
|
||||||
<!-- #enddocregion source-specificity -->
|
<!-- #enddocregion source-specificity -->
|
||||||
|
|
||||||
<!-- #docregion dynamic-priority -->
|
<!-- #docregion dynamic-priority -->
|
||||||
<h3>Dynamic vs static</h3>
|
<h3>Dynamic vs static</h3>
|
||||||
|
|
||||||
<!-- If `classExpr` has a value for the `special` class, this value will override the `class="special"` below -->
|
<!-- If `classExpression` has a value for the `special` class, this value overrides the `class="special"` below -->
|
||||||
<div class="special" [class]="classExpr">Some text.</div>
|
<div class="special" [class]="classExpression">Some text.</div>
|
||||||
|
|
||||||
<!-- If `styleExpr` has a value for the `color` property, this value will override the `style="color: blue"` below -->
|
<!-- If `styleExpression` has a value for the `color` property, this value overrides the `style="color: blue"` below -->
|
||||||
<div style="color: blue" [style]="styleExpr">Some text.</div>
|
<div style="color: blue" [style]="styleExpression">Some text.</div>
|
||||||
|
|
||||||
<!-- #enddocregion dynamic-priority -->
|
<!-- #enddocregion dynamic-priority -->
|
||||||
|
|
||||||
|
@ -9,7 +9,7 @@ export class AppComponent {
|
|||||||
actionName = 'Go for it';
|
actionName = 'Go for it';
|
||||||
isSpecial = true;
|
isSpecial = true;
|
||||||
canSave = true;
|
canSave = true;
|
||||||
classExpr = 'special clearance';
|
classExpression = 'special clearance';
|
||||||
styleExpr = 'color: red';
|
styleExpression = 'color: red';
|
||||||
color = 'blue';
|
color = 'blue';
|
||||||
}
|
}
|
||||||
|
@ -1,16 +1,19 @@
|
|||||||
import { Component } from '@angular/core';
|
import { Component, HostBinding } from '@angular/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'comp-with-host-binding',
|
selector: 'comp-with-host-binding',
|
||||||
template: 'I am a component!',
|
template: 'I am a component!',
|
||||||
host: {
|
|
||||||
'[class.special]': 'isSpecial',
|
|
||||||
'[style.color]': 'color',
|
|
||||||
'[style.width]': 'width'
|
|
||||||
}
|
|
||||||
})
|
})
|
||||||
export class CompWithHostBindingComponent {
|
export class CompWithHostBindingComponent {
|
||||||
|
@HostBinding('class.special')
|
||||||
isSpecial = false;
|
isSpecial = false;
|
||||||
|
|
||||||
|
@HostBinding('style.color')
|
||||||
color = 'green';
|
color = 'green';
|
||||||
|
|
||||||
|
// #docregion hostbinding
|
||||||
|
@HostBinding('style.width')
|
||||||
width = '200px';
|
width = '200px';
|
||||||
|
// #enddocregion hostbinding
|
||||||
|
|
||||||
}
|
}
|
||||||
|
@ -1,17 +1,15 @@
|
|||||||
'use strict'; // necessary for es6 output in node
|
|
||||||
|
|
||||||
import { browser, element, by } from 'protractor';
|
import { browser, element, by } from 'protractor';
|
||||||
|
|
||||||
describe('Attribute directives', () => {
|
describe('Attribute directives', () => {
|
||||||
|
|
||||||
let _title = 'My First Attribute Directive';
|
const title = 'My First Attribute Directive';
|
||||||
|
|
||||||
beforeAll(() => {
|
beforeAll(() => {
|
||||||
browser.get('');
|
browser.get('');
|
||||||
});
|
});
|
||||||
|
|
||||||
it(`should display correct title: ${_title}`, () => {
|
it(`should display correct title: ${title}`, () => {
|
||||||
expect(element(by.css('h1')).getText()).toEqual(_title);
|
expect(element(by.css('h1')).getText()).toEqual(title);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should be able to select green highlight', () => {
|
it('should be able to select green highlight', () => {
|
||||||
|
@ -3,7 +3,7 @@
|
|||||||
import { NgModule } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
|
|
||||||
import { AppComponent } from './app.component.1';
|
import { AppComponent } from './app.component.1';
|
||||||
import { HighlightDirective as HLD1 } from './highlight.directive.1';
|
import { HighlightDirective as HLD1 } from './highlight.directive.1';
|
||||||
import { HighlightDirective as HLD2 } from './highlight.directive.2';
|
import { HighlightDirective as HLD2 } from './highlight.directive.2';
|
||||||
import { HighlightDirective as HLD3 } from './highlight.directive.3';
|
import { HighlightDirective as HLD3 } from './highlight.directive.3';
|
||||||
|
@ -3,57 +3,55 @@ import { logging } from 'selenium-webdriver';
|
|||||||
|
|
||||||
describe('Binding syntax e2e tests', () => {
|
describe('Binding syntax e2e tests', () => {
|
||||||
|
|
||||||
beforeEach(function () {
|
beforeEach(() => browser.get(''));
|
||||||
browser.get('');
|
|
||||||
});
|
|
||||||
|
|
||||||
|
|
||||||
// helper function used to test what's logged to the console
|
// helper function used to test what's logged to the console
|
||||||
async function logChecker(button, contents) {
|
async function logChecker(button, contents) {
|
||||||
const logs = await browser.manage().logs().get(logging.Type.BROWSER);
|
const logs = await browser.manage().logs().get(logging.Type.BROWSER);
|
||||||
const message = logs.filter(({ message }) => message.indexOf(contents) !== -1 ? true : false);
|
const messages = logs.filter(({ message }) => message.indexOf(contents) !== -1 ? true : false);
|
||||||
expect(message.length).toBeGreaterThan(0);
|
expect(messages.length).toBeGreaterThan(0);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
it('should display Binding syntax', function () {
|
it('should display Binding syntax', () => {
|
||||||
expect(element(by.css('h1')).getText()).toEqual('Binding syntax');
|
expect(element(by.css('h1')).getText()).toEqual('Binding syntax');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display Save button', function () {
|
it('should display Save button', () => {
|
||||||
expect(element.all(by.css('button')).get(0).getText()).toBe('Save');
|
expect(element.all(by.css('button')).get(0).getText()).toBe('Save');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display HTML attributes and DOM properties', function () {
|
it('should display HTML attributes and DOM properties', () => {
|
||||||
expect(element.all(by.css('h2')).get(1).getText()).toBe('HTML attributes and DOM properties');
|
expect(element.all(by.css('h2')).get(1).getText()).toBe('HTML attributes and DOM properties');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display 1. Use the inspector...', function () {
|
it('should display 1. Use the inspector...', () => {
|
||||||
expect(element.all(by.css('p')).get(0).getText()).toContain('1. Use the inspector');
|
expect(element.all(by.css('p')).get(0).getText()).toContain('1. Use the inspector');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display Disabled property vs. attribute', function () {
|
it('should display Disabled property vs. attribute', () => {
|
||||||
expect(element.all(by.css('h3')).get(0).getText()).toBe('Disabled property vs. attribute');
|
expect(element.all(by.css('h3')).get(0).getText()).toBe('Disabled property vs. attribute');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should log a message including Sarah', async () => {
|
it('should log a message including Sarah', async () => {
|
||||||
let attributeButton = element.all(by.css('button')).get(1);
|
const attributeButton = element.all(by.css('button')).get(1);
|
||||||
await attributeButton.click();
|
await attributeButton.click();
|
||||||
const contents = 'Sarah';
|
const contents = 'Sarah';
|
||||||
logChecker(attributeButton, contents);
|
logChecker(attributeButton, contents);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should log a message including Sarah for DOM property', async () => {
|
it('should log a message including Sarah for DOM property', async () => {
|
||||||
let DOMPropertyButton = element.all(by.css('button')).get(2);
|
const DOMPropertyButton = element.all(by.css('button')).get(2);
|
||||||
await DOMPropertyButton.click();
|
await DOMPropertyButton.click();
|
||||||
const contents = 'Sarah';
|
const contents = 'Sarah';
|
||||||
logChecker(DOMPropertyButton, contents);
|
logChecker(DOMPropertyButton, contents);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should log a message including Sally for DOM property', async () => {
|
it('should log a message including Sally for DOM property', async () => {
|
||||||
let DOMPropertyButton = element.all(by.css('button')).get(2);
|
const DOMPropertyButton = element.all(by.css('button')).get(2);
|
||||||
let input = element(by.css('input'));
|
const input = element(by.css('input'));
|
||||||
input.sendKeys('Sally');
|
input.sendKeys('Sally');
|
||||||
await DOMPropertyButton.click();
|
await DOMPropertyButton.click();
|
||||||
const contents = 'Sally';
|
const contents = 'Sally';
|
||||||
@ -61,14 +59,14 @@ describe('Binding syntax e2e tests', () => {
|
|||||||
});
|
});
|
||||||
|
|
||||||
it('should log a message that Test Button works', async () => {
|
it('should log a message that Test Button works', async () => {
|
||||||
let testButton = element.all(by.css('button')).get(3);
|
const testButton = element.all(by.css('button')).get(3);
|
||||||
await testButton.click();
|
await testButton.click();
|
||||||
const contents = 'Test';
|
const contents = 'Test';
|
||||||
logChecker(testButton, contents);
|
logChecker(testButton, contents);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should toggle Test Button disabled', async () => {
|
it('should toggle Test Button disabled', async () => {
|
||||||
let toggleButton = element.all(by.css('button')).get(4);
|
const toggleButton = element.all(by.css('button')).get(4);
|
||||||
await toggleButton.click();
|
await toggleButton.click();
|
||||||
const contents = 'true';
|
const contents = 'true';
|
||||||
logChecker(toggleButton, contents);
|
logChecker(toggleButton, contents);
|
||||||
|
@ -26,7 +26,7 @@ export class AppComponent {
|
|||||||
|
|
||||||
toggleDisabled(): any {
|
toggleDisabled(): any {
|
||||||
|
|
||||||
let testButton = <HTMLInputElement> document.getElementById('testButton');
|
const testButton = document.getElementById('testButton') as HTMLInputElement;
|
||||||
testButton.disabled = !testButton.disabled;
|
testButton.disabled = !testButton.disabled;
|
||||||
console.warn(testButton.disabled);
|
console.warn(testButton.disabled);
|
||||||
}
|
}
|
||||||
|
@ -21,11 +21,13 @@ import { ItemDirective } from './item.directive';
|
|||||||
ItemDirective
|
ItemDirective
|
||||||
],
|
],
|
||||||
// #enddocregion declarations
|
// #enddocregion declarations
|
||||||
|
// #docregion imports
|
||||||
imports: [
|
imports: [
|
||||||
BrowserModule,
|
BrowserModule,
|
||||||
FormsModule,
|
FormsModule,
|
||||||
HttpClientModule
|
HttpClientModule
|
||||||
],
|
],
|
||||||
|
// #enddocregion imports
|
||||||
providers: [],
|
providers: [],
|
||||||
bootstrap: [AppComponent]
|
bootstrap: [AppComponent]
|
||||||
})
|
})
|
||||||
|
@ -1,21 +1,19 @@
|
|||||||
'use strict';
|
|
||||||
|
|
||||||
import { browser, element, by } from 'protractor';
|
import { browser, element, by } from 'protractor';
|
||||||
|
|
||||||
describe('Built-in Directives', function () {
|
describe('Built-in Directives', () => {
|
||||||
|
|
||||||
beforeAll(function () {
|
beforeAll(() => {
|
||||||
browser.get('');
|
browser.get('');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should have title Built-in Directives', function () {
|
it('should have title Built-in Directives', () => {
|
||||||
let title = element.all(by.css('h1')).get(0);
|
const title = element.all(by.css('h1')).get(0);
|
||||||
expect(title.getText()).toEqual('Built-in Directives');
|
expect(title.getText()).toEqual('Built-in Directives');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should change first Teapot header', async () => {
|
it('should change first Teapot header', async () => {
|
||||||
let firstLabel = element.all(by.css('p')).get(0);
|
const firstLabel = element.all(by.css('p')).get(0);
|
||||||
let firstInput = element.all(by.css('input')).get(0);
|
const firstInput = element.all(by.css('input')).get(0);
|
||||||
|
|
||||||
expect(firstLabel.getText()).toEqual('Current item name: Teapot');
|
expect(firstLabel.getText()).toEqual('Current item name: Teapot');
|
||||||
firstInput.sendKeys('abc');
|
firstInput.sendKeys('abc');
|
||||||
@ -23,49 +21,49 @@ describe('Built-in Directives', function () {
|
|||||||
});
|
});
|
||||||
|
|
||||||
|
|
||||||
it('should modify sentence when modified checkbox checked', function () {
|
it('should modify sentence when modified checkbox checked', () => {
|
||||||
let modifiedChkbxLabel = element.all(by.css('input[type="checkbox"]')).get(1);
|
const modifiedChkbxLabel = element.all(by.css('input[type="checkbox"]')).get(1);
|
||||||
let modifiedSentence = element.all(by.css('div')).get(1);
|
const modifiedSentence = element.all(by.css('div')).get(1);
|
||||||
|
|
||||||
modifiedChkbxLabel.click();
|
modifiedChkbxLabel.click();
|
||||||
expect(modifiedSentence.getText()).toContain('modified');
|
expect(modifiedSentence.getText()).toContain('modified');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should modify sentence when normal checkbox checked', function () {
|
it('should modify sentence when normal checkbox checked', () => {
|
||||||
let normalChkbxLabel = element.all(by.css('input[type="checkbox"]')).get(4);
|
const normalChkbxLabel = element.all(by.css('input[type="checkbox"]')).get(4);
|
||||||
let normalSentence = element.all(by.css('div')).get(7);
|
const normalSentence = element.all(by.css('div')).get(7);
|
||||||
|
|
||||||
normalChkbxLabel.click();
|
normalChkbxLabel.click();
|
||||||
expect(normalSentence.getText()).toContain('normal weight and, extra large');
|
expect(normalSentence.getText()).toContain('normal weight and, extra large');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should toggle app-item-detail', function () {
|
it('should toggle app-item-detail', () => {
|
||||||
let toggleButton = element.all(by.css('button')).get(3);
|
const toggleButton = element.all(by.css('button')).get(3);
|
||||||
let toggledDiv = element.all(by.css('app-item-detail')).get(0);
|
const toggledDiv = element.all(by.css('app-item-detail')).get(0);
|
||||||
|
|
||||||
toggleButton.click();
|
toggleButton.click();
|
||||||
expect(toggledDiv.isDisplayed()).toBe(true);
|
expect(toggledDiv.isDisplayed()).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should hide app-item-detail', function () {
|
it('should hide app-item-detail', () => {
|
||||||
let hiddenMessage = element.all(by.css('p')).get(11);
|
const hiddenMessage = element.all(by.css('p')).get(11);
|
||||||
let hiddenDiv = element.all(by.css('app-item-detail')).get(2);
|
const hiddenDiv = element.all(by.css('app-item-detail')).get(2);
|
||||||
|
|
||||||
expect(hiddenMessage.getText()).toContain('in the DOM');
|
expect(hiddenMessage.getText()).toContain('in the DOM');
|
||||||
expect(hiddenDiv.isDisplayed()).toBe(true);
|
expect(hiddenDiv.isDisplayed()).toBe(true);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should have 10 lists each containing the string Teapot', function () {
|
it('should have 10 lists each containing the string Teapot', () => {
|
||||||
let listDiv = element.all(by.cssContainingText('.box', 'Teapot'));
|
const listDiv = element.all(by.cssContainingText('.box', 'Teapot'));
|
||||||
expect(listDiv.count()).toBe(10);
|
expect(listDiv.count()).toBe(10);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should switch case', function () {
|
it('should switch case', () => {
|
||||||
let tvRadioButton = element.all(by.css('input[type="radio"]')).get(3);
|
const tvRadioButton = element.all(by.css('input[type="radio"]')).get(3);
|
||||||
let tvDiv = element(by.css('app-lost-item'));
|
const tvDiv = element(by.css('app-lost-item'));
|
||||||
|
|
||||||
let fishbowlRadioButton = element.all(by.css('input[type="radio"]')).get(4);
|
const fishbowlRadioButton = element.all(by.css('input[type="radio"]')).get(4);
|
||||||
let fishbowlDiv = element(by.css('app-unknown-item'));
|
const fishbowlDiv = element(by.css('app-unknown-item'));
|
||||||
|
|
||||||
tvRadioButton.click();
|
tvRadioButton.click();
|
||||||
expect(tvDiv.getText()).toContain('Television');
|
expect(tvDiv.getText()).toContain('Television');
|
||||||
|
@ -30,6 +30,14 @@ export class AppComponent implements OnInit {
|
|||||||
itemsWithTrackByCountReset = 0;
|
itemsWithTrackByCountReset = 0;
|
||||||
itemIdIncrement = 1;
|
itemIdIncrement = 1;
|
||||||
|
|
||||||
|
// #docregion setClasses
|
||||||
|
currentClasses: {};
|
||||||
|
// #enddocregion setClasses
|
||||||
|
|
||||||
|
// #docregion setStyles
|
||||||
|
currentStyles: {};
|
||||||
|
// #enddocregion setStyles
|
||||||
|
|
||||||
ngOnInit() {
|
ngOnInit() {
|
||||||
this.resetItems();
|
this.resetItems();
|
||||||
this.setCurrentClasses();
|
this.setCurrentClasses();
|
||||||
@ -41,20 +49,18 @@ export class AppComponent implements OnInit {
|
|||||||
this.currentItem.name = name.toUpperCase();
|
this.currentItem.name = name.toUpperCase();
|
||||||
}
|
}
|
||||||
|
|
||||||
// #docregion setClasses
|
// #docregion setClasses
|
||||||
currentClasses: {};
|
|
||||||
setCurrentClasses() {
|
setCurrentClasses() {
|
||||||
// CSS classes: added/removed per current state of component properties
|
// CSS classes: added/removed per current state of component properties
|
||||||
this.currentClasses = {
|
this.currentClasses = {
|
||||||
'saveable': this.canSave,
|
saveable: this.canSave,
|
||||||
'modified': !this.isUnchanged,
|
modified: !this.isUnchanged,
|
||||||
'special': this.isSpecial
|
special: this.isSpecial
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
// #enddocregion setClasses
|
// #enddocregion setClasses
|
||||||
|
|
||||||
// #docregion setStyles
|
// #docregion setStyles
|
||||||
currentStyles: {};
|
|
||||||
setCurrentStyles() {
|
setCurrentStyles() {
|
||||||
// CSS styles: set per current state of component properties
|
// CSS styles: set per current state of component properties
|
||||||
this.currentStyles = {
|
this.currentStyles = {
|
||||||
@ -70,11 +76,7 @@ export class AppComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
giveNullCustomerValue() {
|
giveNullCustomerValue() {
|
||||||
!(this.nullCustomer = null) ? (this.nullCustomer = 'Kelly') : (this.nullCustomer = null);
|
this.nullCustomer = 'Kelly';
|
||||||
}
|
|
||||||
|
|
||||||
resetNullItem() {
|
|
||||||
this.nullCustomer = null;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
resetItems() {
|
resetItems() {
|
||||||
@ -84,7 +86,7 @@ export class AppComponent implements OnInit {
|
|||||||
}
|
}
|
||||||
|
|
||||||
resetList() {
|
resetList() {
|
||||||
this.resetItems()
|
this.resetItems();
|
||||||
this.itemsWithTrackByCountReset = 0;
|
this.itemsWithTrackByCountReset = 0;
|
||||||
this.itemsNoTrackByCount = ++this.itemsNoTrackByCount;
|
this.itemsNoTrackByCount = ++this.itemsNoTrackByCount;
|
||||||
}
|
}
|
||||||
@ -107,7 +109,7 @@ export class AppComponent implements OnInit {
|
|||||||
trackByItems(index: number, item: Item): number { return item.id; }
|
trackByItems(index: number, item: Item): number { return item.id; }
|
||||||
// #enddocregion trackByItems
|
// #enddocregion trackByItems
|
||||||
|
|
||||||
trackById(index: number, item: any): number { return item['id']; }
|
trackById(index: number, item: any): number { return item.id; }
|
||||||
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@ -1,19 +1,17 @@
|
|||||||
'use strict'; // necessary for es6 output in node
|
|
||||||
|
|
||||||
import { browser, element, by } from 'protractor';
|
import { browser, element, by } from 'protractor';
|
||||||
|
|
||||||
describe('Built Template Functions Example', function () {
|
describe('Built Template Functions Example', () => {
|
||||||
beforeAll(function () {
|
beforeAll(() => {
|
||||||
browser.get('');
|
browser.get('');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should have title Built-in Template Functions', function () {
|
it('should have title Built-in Template Functions', () => {
|
||||||
let title = element.all(by.css('h1')).get(0);
|
const title = element.all(by.css('h1')).get(0);
|
||||||
expect(title.getText()).toEqual('Built-in Template Functions');
|
expect(title.getText()).toEqual('Built-in Template Functions');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should display $any( ) in h2', function () {
|
it('should display $any( ) in h2', () => {
|
||||||
let header = element(by.css('h2'));
|
const header = element(by.css('h2'));
|
||||||
expect(header.getText()).toContain('$any( )');
|
expect(header.getText()).toContain('$any( )');
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -0,0 +1,9 @@
|
|||||||
|
/*
|
||||||
|
* This example project is special in that it is not a cli app. To run tests appropriate for this
|
||||||
|
* project, the test command is overwritten in `aio/content/examples/observables/example-config.json`.
|
||||||
|
*
|
||||||
|
* This is an empty placeholder file to ensure that `aio/tools/examples/run-example-e2e.js` runs
|
||||||
|
* tests for this project.
|
||||||
|
*
|
||||||
|
* TODO: Fix our infrastructure/tooling, so that this hack is not necessary.
|
||||||
|
*/
|
@ -0,0 +1,12 @@
|
|||||||
|
{
|
||||||
|
"tests": [
|
||||||
|
{
|
||||||
|
"cmd": "yarn",
|
||||||
|
"args": ["tsc", "--project", "tsconfig.spec.json", "--module", "commonjs"]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"cmd": "yarn",
|
||||||
|
"args": ["jasmine", "out-tsc/**/*.spec.js"]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
@ -0,0 +1,26 @@
|
|||||||
|
import { docRegionChain, docRegionObservable, docRegionUnsubscribe } from './observables';
|
||||||
|
|
||||||
|
describe('observables', () => {
|
||||||
|
it('should print 2', (doneFn: DoneFn) => {
|
||||||
|
const consoleLogSpy = spyOn(console, 'log');
|
||||||
|
const observable = docRegionObservable(console);
|
||||||
|
observable.subscribe(() => {
|
||||||
|
expect(consoleLogSpy).toHaveBeenCalledTimes(1);
|
||||||
|
expect(consoleLogSpy).toHaveBeenCalledWith(2);
|
||||||
|
doneFn();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should close the subscription', () => {
|
||||||
|
const subscription = docRegionUnsubscribe();
|
||||||
|
expect(subscription.closed).toBeTruthy();
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should chain an observable', (doneFn: DoneFn) => {
|
||||||
|
const observable = docRegionChain();
|
||||||
|
observable.subscribe(value => {
|
||||||
|
expect(value).toBe(4);
|
||||||
|
doneFn();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
});
|
@ -1,40 +1,72 @@
|
|||||||
import { map } from 'rxjs/operators';
|
// #docplaster
|
||||||
|
|
||||||
import { Observable } from 'rxjs';
|
import { Observable } from 'rxjs';
|
||||||
|
import { map } from 'rxjs/operators';
|
||||||
|
|
||||||
// #docregion observable
|
export function docRegionObservable(console: Console) {
|
||||||
|
// #docregion observable
|
||||||
|
|
||||||
// declare a publishing operation
|
// declare a publishing operation
|
||||||
const observable = new Observable<number>(observer => {
|
const observable = new Observable<number>(observer => {
|
||||||
// Subscriber fn...
|
// Subscriber fn...
|
||||||
});
|
// #enddocregion observable
|
||||||
|
// The below code is used for unit testing only
|
||||||
|
observer.next(2);
|
||||||
|
// #docregion observable
|
||||||
|
});
|
||||||
|
|
||||||
// initiate execution
|
// initiate execution
|
||||||
observable.subscribe(() => {
|
observable.subscribe(value => {
|
||||||
// observer handles notifications
|
// observer handles notifications
|
||||||
});
|
// #enddocregion observable
|
||||||
|
// The below code is used for unit testing only
|
||||||
|
console.log(value);
|
||||||
|
// #docregion observable
|
||||||
|
});
|
||||||
|
|
||||||
// #enddocregion observable
|
// #enddocregion observable
|
||||||
|
return observable;
|
||||||
|
}
|
||||||
|
|
||||||
// #docregion unsubscribe
|
export function docRegionUnsubscribe() {
|
||||||
|
const observable = new Observable<number>(() => {
|
||||||
|
// Subscriber fn...
|
||||||
|
});
|
||||||
|
// #docregion unsubscribe
|
||||||
|
|
||||||
const subscription = observable.subscribe(() => {
|
const subscription = observable.subscribe(() => {
|
||||||
// observer handles notifications
|
// observer handles notifications
|
||||||
});
|
});
|
||||||
|
|
||||||
subscription.unsubscribe();
|
subscription.unsubscribe();
|
||||||
|
|
||||||
// #enddocregion unsubscribe
|
// #enddocregion unsubscribe
|
||||||
|
return subscription;
|
||||||
|
}
|
||||||
|
|
||||||
// #docregion error
|
export function docRegionError() {
|
||||||
|
const observable = new Observable<number>(() => {
|
||||||
|
// Subscriber fn...
|
||||||
|
});
|
||||||
|
|
||||||
observable.subscribe(() => {
|
// #docregion error
|
||||||
throw Error('my error');
|
observable.subscribe(() => {
|
||||||
});
|
throw new Error('my error');
|
||||||
|
});
|
||||||
|
// #enddocregion error
|
||||||
|
}
|
||||||
|
|
||||||
// #enddocregion error
|
export function docRegionChain() {
|
||||||
|
let observable = new Observable<number>(observer => {
|
||||||
|
// Subscriber fn...
|
||||||
|
observer.next(2);
|
||||||
|
});
|
||||||
|
|
||||||
// #docregion chain
|
observable =
|
||||||
|
// #docregion chain
|
||||||
|
|
||||||
observable.pipe(map(v => 2 * v));
|
observable.pipe(map(v => 2 * v));
|
||||||
|
|
||||||
// #enddocregion chain
|
// #enddocregion chain
|
||||||
|
return observable;
|
||||||
|
}
|
||||||
|
@ -0,0 +1,23 @@
|
|||||||
|
import { docRegionError, docRegionPromise } from './promises';
|
||||||
|
|
||||||
|
describe('promises', () => {
|
||||||
|
it('should print 2', (doneFn: DoneFn) => {
|
||||||
|
const consoleLogSpy = spyOn(console, 'log');
|
||||||
|
const pr = docRegionPromise(console, 2);
|
||||||
|
pr.then((value) => {
|
||||||
|
expect(consoleLogSpy).toHaveBeenCalledTimes(1);
|
||||||
|
expect(consoleLogSpy).toHaveBeenCalledWith(2);
|
||||||
|
expect(value).toBe(4);
|
||||||
|
doneFn();
|
||||||
|
});
|
||||||
|
});
|
||||||
|
|
||||||
|
it('should throw an error', (doneFn: DoneFn) => {
|
||||||
|
const promise = docRegionError();
|
||||||
|
promise
|
||||||
|
.then(() => {
|
||||||
|
throw new Error('Promise should be rejected.');
|
||||||
|
},
|
||||||
|
() => doneFn());
|
||||||
|
});
|
||||||
|
});
|
@ -1,25 +1,44 @@
|
|||||||
// #docregion promise
|
// #docplaster
|
||||||
// initiate execution
|
|
||||||
const promise = new Promise<number>((resolve, reject) => {
|
|
||||||
// Executer fn...
|
|
||||||
});
|
|
||||||
|
|
||||||
promise.then(value => {
|
export function docRegionPromise(console: Console, inputValue: number) {
|
||||||
// handle result here
|
// #docregion promise
|
||||||
});
|
// initiate execution
|
||||||
|
let promise = new Promise<number>((resolve, reject) => {
|
||||||
|
// Executer fn...
|
||||||
|
// #enddocregion promise
|
||||||
|
// The below is used in the unit tests.
|
||||||
|
resolve(inputValue);
|
||||||
|
// #docregion promise
|
||||||
|
});
|
||||||
|
// #enddocregion promise
|
||||||
|
promise =
|
||||||
|
// #docregion promise
|
||||||
|
promise.then(value => {
|
||||||
|
// handle result here
|
||||||
|
// #enddocregion promise
|
||||||
|
// The below is used in the unit tests.
|
||||||
|
console.log(value);
|
||||||
|
return value;
|
||||||
|
// #docregion promise
|
||||||
|
});
|
||||||
|
// #enddocregion promise
|
||||||
|
promise =
|
||||||
|
// #docregion chain
|
||||||
|
promise.then(v => 2 * v);
|
||||||
|
// #enddocregion chain
|
||||||
|
|
||||||
// #enddocregion promise
|
return promise;
|
||||||
|
}
|
||||||
|
|
||||||
// #docregion chain
|
export function docRegionError() {
|
||||||
|
let promise = Promise.resolve();
|
||||||
|
promise =
|
||||||
|
// #docregion error
|
||||||
|
|
||||||
promise.then(v => 2 * v);
|
promise.then(() => {
|
||||||
|
throw new Error('my error');
|
||||||
|
});
|
||||||
|
|
||||||
// #enddocregion chain
|
// #enddocregion error
|
||||||
|
return promise;
|
||||||
// #docregion error
|
}
|
||||||
|
|
||||||
promise.then(() => {
|
|
||||||
throw Error('my error');
|
|
||||||
});
|
|
||||||
|
|
||||||
// #enddocregion error
|
|
||||||
|
@ -1,229 +1,236 @@
|
|||||||
'use strict'; // necessary for es6 output in node
|
import { browser, by, element } from 'protractor';
|
||||||
|
|
||||||
import { browser, element, by } from 'protractor';
|
describe('Component Communication Cookbook Tests', () => {
|
||||||
|
|
||||||
describe('Component Communication Cookbook Tests', function () {
|
beforeEach(() => browser.get(browser.baseUrl));
|
||||||
|
|
||||||
// Note: '?e2e' which app can read to know it is running in protractor
|
describe('Parent-to-child communication', () => {
|
||||||
// e.g. `if (!/e2e/.test(location.search)) { ...`
|
|
||||||
beforeAll(function () {
|
|
||||||
browser.get('?e2e');
|
|
||||||
});
|
|
||||||
|
|
||||||
describe('Parent-to-child communication', function() {
|
|
||||||
// #docregion parent-to-child
|
// #docregion parent-to-child
|
||||||
// ...
|
// ...
|
||||||
let _heroNames = ['Dr IQ', 'Magneta', 'Bombasto'];
|
const heroNames = ['Dr IQ', 'Magneta', 'Bombasto'];
|
||||||
let _masterName = 'Master';
|
const masterName = 'Master';
|
||||||
|
|
||||||
it('should pass properties to children properly', function () {
|
it('should pass properties to children properly', () => {
|
||||||
let parent = element.all(by.tagName('app-hero-parent')).get(0);
|
const parent = element(by.tagName('app-hero-parent'));
|
||||||
let heroes = parent.all(by.tagName('app-hero-child'));
|
const heroes = parent.all(by.tagName('app-hero-child'));
|
||||||
|
|
||||||
for (let i = 0; i < _heroNames.length; i++) {
|
for (let i = 0; i < heroNames.length; i++) {
|
||||||
let childTitle = heroes.get(i).element(by.tagName('h3')).getText();
|
const childTitle = heroes.get(i).element(by.tagName('h3')).getText();
|
||||||
let childDetail = heroes.get(i).element(by.tagName('p')).getText();
|
const childDetail = heroes.get(i).element(by.tagName('p')).getText();
|
||||||
expect(childTitle).toEqual(_heroNames[i] + ' says:');
|
expect(childTitle).toEqual(heroNames[i] + ' says:');
|
||||||
expect(childDetail).toContain(_masterName);
|
expect(childDetail).toContain(masterName);
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
// ...
|
// ...
|
||||||
// #enddocregion parent-to-child
|
// #enddocregion parent-to-child
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Parent-to-child communication with setter', function() {
|
describe('Parent-to-child communication with setter', () => {
|
||||||
// #docregion parent-to-child-setter
|
// #docregion parent-to-child-setter
|
||||||
// ...
|
// ...
|
||||||
it('should display trimmed, non-empty names', function () {
|
it('should display trimmed, non-empty names', () => {
|
||||||
let _nonEmptyNameIndex = 0;
|
const nonEmptyNameIndex = 0;
|
||||||
let _nonEmptyName = '"Dr IQ"';
|
const nonEmptyName = '"Dr IQ"';
|
||||||
let parent = element.all(by.tagName('app-name-parent')).get(0);
|
const parent = element(by.tagName('app-name-parent'));
|
||||||
let hero = parent.all(by.tagName('app-name-child')).get(_nonEmptyNameIndex);
|
const hero = parent.all(by.tagName('app-name-child')).get(nonEmptyNameIndex);
|
||||||
|
|
||||||
let displayName = hero.element(by.tagName('h3')).getText();
|
const displayName = hero.element(by.tagName('h3')).getText();
|
||||||
expect(displayName).toEqual(_nonEmptyName);
|
expect(displayName).toEqual(nonEmptyName);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should replace empty name with default name', function () {
|
it('should replace empty name with default name', () => {
|
||||||
let _emptyNameIndex = 1;
|
const emptyNameIndex = 1;
|
||||||
let _defaultName = '"<no name set>"';
|
const defaultName = '"<no name set>"';
|
||||||
let parent = element.all(by.tagName('app-name-parent')).get(0);
|
const parent = element(by.tagName('app-name-parent'));
|
||||||
let hero = parent.all(by.tagName('app-name-child')).get(_emptyNameIndex);
|
const hero = parent.all(by.tagName('app-name-child')).get(emptyNameIndex);
|
||||||
|
|
||||||
let displayName = hero.element(by.tagName('h3')).getText();
|
const displayName = hero.element(by.tagName('h3')).getText();
|
||||||
expect(displayName).toEqual(_defaultName);
|
expect(displayName).toEqual(defaultName);
|
||||||
});
|
});
|
||||||
// ...
|
// ...
|
||||||
// #enddocregion parent-to-child-setter
|
// #enddocregion parent-to-child-setter
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Parent-to-child communication with ngOnChanges', function() {
|
describe('Parent-to-child communication with ngOnChanges', () => {
|
||||||
// #docregion parent-to-child-onchanges
|
// #docregion parent-to-child-onchanges
|
||||||
// ...
|
// ...
|
||||||
// Test must all execute in this exact order
|
// Test must all execute in this exact order
|
||||||
it('should set expected initial values', function () {
|
it('should set expected initial values', () => {
|
||||||
let actual = getActual();
|
const actual = getActual();
|
||||||
|
|
||||||
let initialLabel = 'Version 1.23';
|
const initialLabel = 'Version 1.23';
|
||||||
let initialLog = 'Initial value of major set to 1, Initial value of minor set to 23';
|
const initialLog = 'Initial value of major set to 1, Initial value of minor set to 23';
|
||||||
|
|
||||||
expect(actual.label).toBe(initialLabel);
|
expect(actual.label).toBe(initialLabel);
|
||||||
expect(actual.count).toBe(1);
|
expect(actual.count).toBe(1);
|
||||||
expect(actual.logs.get(0).getText()).toBe(initialLog);
|
expect(actual.logs.get(0).getText()).toBe(initialLog);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should set expected values after clicking \'Minor\' twice', function () {
|
it('should set expected values after clicking \'Minor\' twice', async () => {
|
||||||
let repoTag = element(by.tagName('app-version-parent'));
|
const repoTag = element(by.tagName('app-version-parent'));
|
||||||
let newMinorButton = repoTag.all(by.tagName('button')).get(0);
|
const newMinorButton = repoTag.all(by.tagName('button')).get(0);
|
||||||
|
|
||||||
newMinorButton.click().then(function() {
|
await newMinorButton.click();
|
||||||
newMinorButton.click().then(function() {
|
await newMinorButton.click();
|
||||||
let actual = getActual();
|
|
||||||
|
|
||||||
let labelAfter2Minor = 'Version 1.25';
|
const actual = getActual();
|
||||||
let logAfter2Minor = 'minor changed from 24 to 25';
|
|
||||||
|
|
||||||
expect(actual.label).toBe(labelAfter2Minor);
|
const labelAfter2Minor = 'Version 1.25';
|
||||||
expect(actual.count).toBe(3);
|
const logAfter2Minor = 'minor changed from 24 to 25';
|
||||||
expect(actual.logs.get(2).getText()).toBe(logAfter2Minor);
|
|
||||||
});
|
expect(actual.label).toBe(labelAfter2Minor);
|
||||||
});
|
expect(actual.count).toBe(3);
|
||||||
|
expect(actual.logs.get(2).getText()).toBe(logAfter2Minor);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should set expected values after clicking \'Major\' once', function () {
|
it('should set expected values after clicking \'Major\' once', async () => {
|
||||||
let repoTag = element(by.tagName('app-version-parent'));
|
const repoTag = element(by.tagName('app-version-parent'));
|
||||||
let newMajorButton = repoTag.all(by.tagName('button')).get(1);
|
const newMajorButton = repoTag.all(by.tagName('button')).get(1);
|
||||||
|
|
||||||
newMajorButton.click().then(function() {
|
await newMajorButton.click();
|
||||||
let actual = getActual();
|
const actual = getActual();
|
||||||
|
|
||||||
let labelAfterMajor = 'Version 2.0';
|
const labelAfterMajor = 'Version 2.0';
|
||||||
let logAfterMajor = 'major changed from 1 to 2, minor changed from 25 to 0';
|
const logAfterMajor = 'major changed from 1 to 2, minor changed from 23 to 0';
|
||||||
|
|
||||||
expect(actual.label).toBe(labelAfterMajor);
|
expect(actual.label).toBe(labelAfterMajor);
|
||||||
expect(actual.count).toBe(4);
|
expect(actual.count).toBe(2);
|
||||||
expect(actual.logs.get(3).getText()).toBe(logAfterMajor);
|
expect(actual.logs.get(1).getText()).toBe(logAfterMajor);
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
function getActual() {
|
function getActual() {
|
||||||
let versionTag = element(by.tagName('app-version-child'));
|
const versionTag = element(by.tagName('app-version-child'));
|
||||||
let label = versionTag.element(by.tagName('h3')).getText();
|
const label = versionTag.element(by.tagName('h3')).getText();
|
||||||
let ul = versionTag.element((by.tagName('ul')));
|
const ul = versionTag.element((by.tagName('ul')));
|
||||||
let logs = ul.all(by.tagName('li'));
|
const logs = ul.all(by.tagName('li'));
|
||||||
|
|
||||||
return {
|
return {
|
||||||
label: label,
|
label,
|
||||||
logs: logs,
|
logs,
|
||||||
count: logs.count()
|
count: logs.count()
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
// ...
|
// ...
|
||||||
// #enddocregion parent-to-child-onchanges
|
// #enddocregion parent-to-child-onchanges
|
||||||
|
|
||||||
});
|
});
|
||||||
|
|
||||||
describe('Child-to-parent communication', function() {
|
describe('Child-to-parent communication', () => {
|
||||||
// #docregion child-to-parent
|
// #docregion child-to-parent
|
||||||
// ...
|
// ...
|
||||||
it('should not emit the event initially', function () {
|
it('should not emit the event initially', () => {
|
||||||
let voteLabel = element(by.tagName('app-vote-taker'))
|
const voteLabel = element(by.tagName('app-vote-taker')).element(by.tagName('h3'));
|
||||||
.element(by.tagName('h3')).getText();
|
expect(voteLabel.getText()).toBe('Agree: 0, Disagree: 0');
|
||||||
expect(voteLabel).toBe('Agree: 0, Disagree: 0');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should process Agree vote', function () {
|
it('should process Agree vote', async () => {
|
||||||
let agreeButton1 = element.all(by.tagName('app-voter')).get(0)
|
const voteLabel = element(by.tagName('app-vote-taker')).element(by.tagName('h3'));
|
||||||
|
const agreeButton1 = element.all(by.tagName('app-voter')).get(0)
|
||||||
.all(by.tagName('button')).get(0);
|
.all(by.tagName('button')).get(0);
|
||||||
agreeButton1.click().then(function() {
|
|
||||||
let voteLabel = element(by.tagName('app-vote-taker'))
|
await agreeButton1.click();
|
||||||
.element(by.tagName('h3')).getText();
|
|
||||||
expect(voteLabel).toBe('Agree: 1, Disagree: 0');
|
expect(voteLabel.getText()).toBe('Agree: 1, Disagree: 0');
|
||||||
});
|
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should process Disagree vote', function () {
|
it('should process Disagree vote', async () => {
|
||||||
let agreeButton1 = element.all(by.tagName('app-voter')).get(1)
|
const voteLabel = element(by.tagName('app-vote-taker')).element(by.tagName('h3'));
|
||||||
|
const agreeButton1 = element.all(by.tagName('app-voter')).get(1)
|
||||||
.all(by.tagName('button')).get(1);
|
.all(by.tagName('button')).get(1);
|
||||||
agreeButton1.click().then(function() {
|
|
||||||
let voteLabel = element(by.tagName('app-vote-taker'))
|
await agreeButton1.click();
|
||||||
.element(by.tagName('h3')).getText();
|
|
||||||
expect(voteLabel).toBe('Agree: 1, Disagree: 1');
|
expect(voteLabel.getText()).toBe('Agree: 0, Disagree: 1');
|
||||||
});
|
|
||||||
});
|
});
|
||||||
// ...
|
// ...
|
||||||
// #enddocregion child-to-parent
|
// #enddocregion child-to-parent
|
||||||
});
|
});
|
||||||
|
|
||||||
// Can't run timer tests in protractor because
|
describe('Parent calls child via local var', () => {
|
||||||
// interaction w/ zones causes all tests to freeze & timeout.
|
countDownTimerTests('app-countdown-parent-lv');
|
||||||
xdescribe('Parent calls child via local var', function() {
|
|
||||||
countDownTimerTests('countdown-parent-lv');
|
|
||||||
});
|
});
|
||||||
|
|
||||||
xdescribe('Parent calls ViewChild', function() {
|
describe('Parent calls ViewChild', () => {
|
||||||
countDownTimerTests('countdown-parent-vc');
|
countDownTimerTests('app-countdown-parent-vc');
|
||||||
});
|
});
|
||||||
|
|
||||||
function countDownTimerTests(parentTag: string) {
|
function countDownTimerTests(parentTag: string) {
|
||||||
// #docregion countdown-timer-tests
|
// #docregion countdown-timer-tests
|
||||||
// ...
|
// ...
|
||||||
it('timer and parent seconds should match', function () {
|
// The tests trigger periodic asynchronous operations (via `setInterval()`), which will prevent
|
||||||
let parent = element(by.tagName(parentTag));
|
// the app from stabilizing. See https://angular.io/api/core/ApplicationRef#is-stable-examples
|
||||||
let message = parent.element(by.tagName('app-countdown-timer')).getText();
|
// for more details.
|
||||||
browser.sleep(10); // give `seconds` a chance to catchup with `message`
|
// To allow the tests to complete, we will disable automatically waiting for the Angular app to
|
||||||
let seconds = parent.element(by.className('seconds')).getText();
|
// stabilize.
|
||||||
expect(message).toContain(seconds);
|
beforeEach(() => browser.waitForAngularEnabled(false));
|
||||||
|
afterEach(() => browser.waitForAngularEnabled(true));
|
||||||
|
|
||||||
|
it('timer and parent seconds should match', async () => {
|
||||||
|
const parent = element(by.tagName(parentTag));
|
||||||
|
const startButton = parent.element(by.buttonText('Start'));
|
||||||
|
const seconds = parent.element(by.className('seconds'));
|
||||||
|
const timer = parent.element(by.tagName('app-countdown-timer'));
|
||||||
|
|
||||||
|
await startButton.click();
|
||||||
|
|
||||||
|
// Wait for `<app-countdown-timer>` to be populated with any text.
|
||||||
|
await browser.wait(() => timer.getText(), 2000);
|
||||||
|
|
||||||
|
expect(await timer.getText()).toContain(await seconds.getText());
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should stop the countdown', function () {
|
it('should stop the countdown', async () => {
|
||||||
let parent = element(by.tagName(parentTag));
|
const parent = element(by.tagName(parentTag));
|
||||||
let stopButton = parent.all(by.tagName('button')).get(1);
|
const startButton = parent.element(by.buttonText('Start'));
|
||||||
|
const stopButton = parent.element(by.buttonText('Stop'));
|
||||||
|
const timer = parent.element(by.tagName('app-countdown-timer'));
|
||||||
|
|
||||||
stopButton.click().then(function() {
|
await startButton.click();
|
||||||
let message = parent.element(by.tagName('app-countdown-timer')).getText();
|
expect(await timer.getText()).not.toContain('Holding');
|
||||||
expect(message).toContain('Holding');
|
|
||||||
});
|
await stopButton.click();
|
||||||
|
expect(await timer.getText()).toContain('Holding');
|
||||||
});
|
});
|
||||||
// ...
|
// ...
|
||||||
// #enddocregion countdown-timer-tests
|
// #enddocregion countdown-timer-tests
|
||||||
}
|
}
|
||||||
|
|
||||||
|
describe('Parent and children communicate via a service', () => {
|
||||||
describe('Parent and children communicate via a service', function() {
|
|
||||||
// #docregion bidirectional-service
|
// #docregion bidirectional-service
|
||||||
// ...
|
// ...
|
||||||
it('should announce a mission', function () {
|
it('should announce a mission', async () => {
|
||||||
let missionControl = element(by.tagName('app-mission-control'));
|
const missionControl = element(by.tagName('app-mission-control'));
|
||||||
let announceButton = missionControl.all(by.tagName('button')).get(0);
|
const announceButton = missionControl.all(by.tagName('button')).get(0);
|
||||||
announceButton.click().then(function () {
|
const history = missionControl.all(by.tagName('li'));
|
||||||
let history = missionControl.all(by.tagName('li'));
|
|
||||||
expect(history.count()).toBe(1);
|
await announceButton.click();
|
||||||
expect(history.get(0).getText()).toMatch(/Mission.* announced/);
|
|
||||||
});
|
expect(history.count()).toBe(1);
|
||||||
|
expect(history.get(0).getText()).toMatch(/Mission.* announced/);
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should confirm the mission by Lovell', function () {
|
it('should confirm the mission by Lovell', async () => {
|
||||||
testConfirmMission(1, 2, 'Lovell');
|
await testConfirmMission(1, 'Lovell');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should confirm the mission by Haise', function () {
|
it('should confirm the mission by Haise', async () => {
|
||||||
testConfirmMission(3, 3, 'Haise');
|
await testConfirmMission(3, 'Haise');
|
||||||
});
|
});
|
||||||
|
|
||||||
it('should confirm the mission by Swigert', function () {
|
it('should confirm the mission by Swigert', async () => {
|
||||||
testConfirmMission(2, 4, 'Swigert');
|
await testConfirmMission(2, 'Swigert');
|
||||||
});
|
});
|
||||||
|
|
||||||
function testConfirmMission(buttonIndex: number, expectedLogCount: number, astronaut: string) {
|
async function testConfirmMission(buttonIndex: number, astronaut: string) {
|
||||||
let _confirmedLog = ' confirmed the mission';
|
const missionControl = element(by.tagName('app-mission-control'));
|
||||||
let missionControl = element(by.tagName('app-mission-control'));
|
const announceButton = missionControl.all(by.tagName('button')).get(0);
|
||||||
let confirmButton = missionControl.all(by.tagName('button')).get(buttonIndex);
|
const confirmButton = missionControl.all(by.tagName('button')).get(buttonIndex);
|
||||||
confirmButton.click().then(function () {
|
const history = missionControl.all(by.tagName('li'));
|
||||||
let history = missionControl.all(by.tagName('li'));
|
|
||||||
expect(history.count()).toBe(expectedLogCount);
|
await announceButton.click();
|
||||||
expect(history.get(expectedLogCount - 1).getText()).toBe(astronaut + _confirmedLog);
|
await confirmButton.click();
|
||||||
});
|
|
||||||
|
expect(history.count()).toBe(2);
|
||||||
|
expect(history.get(1).getText()).toBe(`${astronaut} confirmed the mission`);
|
||||||
}
|
}
|
||||||
// ...
|
// ...
|
||||||
// #enddocregion bidirectional-service
|
// #enddocregion bidirectional-service
|
||||||
|
@ -1,13 +0,0 @@
|
|||||||
{
|
|
||||||
"tests": [
|
|
||||||
{
|
|
||||||
"cmd": "yarn",
|
|
||||||
"args": [
|
|
||||||
"e2e",
|
|
||||||
"--protractor-config=e2e/protractor-puppeteer.conf.js",
|
|
||||||
"--no-webdriver-update",
|
|
||||||
"--port={PORT}"
|
|
||||||
]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
|
@ -30,22 +30,21 @@
|
|||||||
<app-vote-taker></app-vote-taker>
|
<app-vote-taker></app-vote-taker>
|
||||||
</div>
|
</div>
|
||||||
<a href="#top" class="to-top">Back to Top</a>
|
<a href="#top" class="to-top">Back to Top</a>
|
||||||
<hr>
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
<div id="parent-to-child-local-var">
|
<div id="parent-to-child-local-var">
|
||||||
<app-countdown-parent-lv></app-countdown-parent-lv>
|
<app-countdown-parent-lv></app-countdown-parent-lv>
|
||||||
</div>
|
</div>
|
||||||
<a href="#top" class="to-top">Back to Top</a>
|
<a href="#top" class="to-top">Back to Top</a>
|
||||||
<hr>
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
<div id="parent-to-view-child">
|
<div id="parent-to-view-child">
|
||||||
<app-countdown-parent-vc></app-countdown-parent-vc>
|
<app-countdown-parent-vc></app-countdown-parent-vc>
|
||||||
</div>
|
</div>
|
||||||
<a href="#top" class="to-top">Back to Top</a>
|
<a href="#top" class="to-top">Back to Top</a>
|
||||||
<hr>
|
|
||||||
|
|
||||||
|
<hr>
|
||||||
<div id="bidirectional-service">
|
<div id="bidirectional-service">
|
||||||
<app-mission-control></app-mission-control>
|
<app-mission-control></app-mission-control>
|
||||||
</div>
|
</div>
|
||||||
<a href="#top" class="to-top">Back to Top</a>
|
<a href="#top" class="to-top">Back to Top</a>
|
||||||
<hr>
|
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
import { NgModule, CUSTOM_ELEMENTS_SCHEMA } from '@angular/core';
|
import { NgModule } from '@angular/core';
|
||||||
import { BrowserModule } from '@angular/platform-browser';
|
import { BrowserModule } from '@angular/platform-browser';
|
||||||
|
|
||||||
import { AppComponent } from './app.component';
|
import { AppComponent } from './app.component';
|
||||||
import { AstronautComponent } from './astronaut.component';
|
import { AstronautComponent } from './astronaut.component';
|
||||||
@ -15,10 +15,17 @@ import { VersionParentComponent } from './version-parent.component';
|
|||||||
import { VoterComponent } from './voter.component';
|
import { VoterComponent } from './voter.component';
|
||||||
import { VoteTakerComponent } from './votetaker.component';
|
import { VoteTakerComponent } from './votetaker.component';
|
||||||
|
|
||||||
let directives: any[] = [
|
|
||||||
|
@NgModule({
|
||||||
|
imports: [
|
||||||
|
BrowserModule,
|
||||||
|
],
|
||||||
|
declarations: [
|
||||||
AppComponent,
|
AppComponent,
|
||||||
AstronautComponent,
|
AstronautComponent,
|
||||||
|
CountdownLocalVarParentComponent,
|
||||||
CountdownTimerComponent,
|
CountdownTimerComponent,
|
||||||
|
CountdownViewChildParentComponent,
|
||||||
HeroChildComponent,
|
HeroChildComponent,
|
||||||
HeroParentComponent,
|
HeroParentComponent,
|
||||||
MissionControlComponent,
|
MissionControlComponent,
|
||||||
@ -27,28 +34,8 @@ let directives: any[] = [
|
|||||||
VersionChildComponent,
|
VersionChildComponent,
|
||||||
VersionParentComponent,
|
VersionParentComponent,
|
||||||
VoterComponent,
|
VoterComponent,
|
||||||
VoteTakerComponent
|
VoteTakerComponent,
|
||||||
];
|
|
||||||
|
|
||||||
let schemas: any[] = [];
|
|
||||||
|
|
||||||
// Include Countdown examples
|
|
||||||
// unless in e2e tests which they break.
|
|
||||||
if (!/e2e/.test(location.search)) {
|
|
||||||
console.log('adding countdown timer examples');
|
|
||||||
directives.push(CountdownLocalVarParentComponent);
|
|
||||||
directives.push(CountdownViewChildParentComponent);
|
|
||||||
} else {
|
|
||||||
// In e2e test use CUSTOM_ELEMENTS_SCHEMA to suppress unknown element errors
|
|
||||||
schemas.push(CUSTOM_ELEMENTS_SCHEMA);
|
|
||||||
}
|
|
||||||
|
|
||||||
@NgModule({
|
|
||||||
imports: [
|
|
||||||
BrowserModule
|
|
||||||
],
|
],
|
||||||
declarations: directives,
|
|
||||||
bootstrap: [ AppComponent ],
|
bootstrap: [ AppComponent ],
|
||||||
schemas: schemas
|
|
||||||
})
|
})
|
||||||
export class AppModule { }
|
export class AppModule { }
|
||||||
|
@ -2,7 +2,7 @@
|
|||||||
import { Component, Input, OnDestroy } from '@angular/core';
|
import { Component, Input, OnDestroy } from '@angular/core';
|
||||||
|
|
||||||
import { MissionService } from './mission.service';
|
import { MissionService } from './mission.service';
|
||||||
import { Subscription } from 'rxjs';
|
import { Subscription } from 'rxjs';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-astronaut',
|
selector: 'app-astronaut',
|
||||||
|
@ -2,8 +2,8 @@
|
|||||||
// #docregion vc
|
// #docregion vc
|
||||||
import { AfterViewInit, ViewChild } from '@angular/core';
|
import { AfterViewInit, ViewChild } from '@angular/core';
|
||||||
// #docregion lv
|
// #docregion lv
|
||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
import { CountdownTimerComponent } from './countdown-timer.component';
|
import { CountdownTimerComponent } from './countdown-timer.component';
|
||||||
|
|
||||||
// #enddocregion lv
|
// #enddocregion lv
|
||||||
// #enddocregion vc
|
// #enddocregion vc
|
||||||
|
@ -1,19 +1,16 @@
|
|||||||
// #docregion
|
// #docregion
|
||||||
import { Component, OnDestroy, OnInit } from '@angular/core';
|
import { Component, OnDestroy } from '@angular/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-countdown-timer',
|
selector: 'app-countdown-timer',
|
||||||
template: '<p>{{message}}</p>'
|
template: '<p>{{message}}</p>'
|
||||||
})
|
})
|
||||||
export class CountdownTimerComponent implements OnInit, OnDestroy {
|
export class CountdownTimerComponent implements OnDestroy {
|
||||||
|
|
||||||
intervalId = 0;
|
intervalId = 0;
|
||||||
message = '';
|
message = '';
|
||||||
seconds = 11;
|
seconds = 11;
|
||||||
|
|
||||||
clearTimer() { clearInterval(this.intervalId); }
|
|
||||||
|
|
||||||
ngOnInit() { this.start(); }
|
|
||||||
ngOnDestroy() { this.clearTimer(); }
|
ngOnDestroy() { this.clearTimer(); }
|
||||||
|
|
||||||
start() { this.countDown(); }
|
start() { this.countDown(); }
|
||||||
@ -22,6 +19,8 @@ export class CountdownTimerComponent implements OnInit, OnDestroy {
|
|||||||
this.message = `Holding at T-${this.seconds} seconds`;
|
this.message = `Holding at T-${this.seconds} seconds`;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private clearTimer() { clearInterval(this.intervalId); }
|
||||||
|
|
||||||
private countDown() {
|
private countDown() {
|
||||||
this.clearTimer();
|
this.clearTimer();
|
||||||
this.intervalId = window.setInterval(() => {
|
this.intervalId = window.setInterval(() => {
|
||||||
|
@ -12,6 +12,6 @@ import { Hero } from './hero';
|
|||||||
})
|
})
|
||||||
export class HeroChildComponent {
|
export class HeroChildComponent {
|
||||||
@Input() hero: Hero;
|
@Input() hero: Hero;
|
||||||
@Input('master') masterName: string;
|
@Input('master') masterName: string; // tslint:disable-line: no-input-rename
|
||||||
}
|
}
|
||||||
// #enddocregion
|
// #enddocregion
|
||||||
|
@ -1,6 +1,6 @@
|
|||||||
// #docregion
|
// #docregion
|
||||||
import { Injectable } from '@angular/core';
|
import { Injectable } from '@angular/core';
|
||||||
import { Subject } from 'rxjs';
|
import { Subject } from 'rxjs';
|
||||||
|
|
||||||
@Injectable()
|
@Injectable()
|
||||||
export class MissionService {
|
export class MissionService {
|
||||||
|
@ -1,7 +1,7 @@
|
|||||||
// #docregion
|
// #docregion
|
||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
import { MissionService } from './mission.service';
|
import { MissionService } from './mission.service';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-mission-control',
|
selector: 'app-mission-control',
|
||||||
@ -34,7 +34,7 @@ export class MissionControlComponent {
|
|||||||
}
|
}
|
||||||
|
|
||||||
announce() {
|
announce() {
|
||||||
let mission = this.missions[this.nextMission++];
|
const mission = this.missions[this.nextMission++];
|
||||||
this.missionService.announceMission(mission);
|
this.missionService.announceMission(mission);
|
||||||
this.history.push(`Mission "${mission}" announced`);
|
this.history.push(`Mission "${mission}" announced`);
|
||||||
if (this.nextMission >= this.missions.length) { this.nextMission = 0; }
|
if (this.nextMission >= this.missions.length) { this.nextMission = 0; }
|
||||||
|
@ -1,3 +1,4 @@
|
|||||||
|
// tslint:disable: variable-name
|
||||||
// #docregion
|
// #docregion
|
||||||
import { Component, Input } from '@angular/core';
|
import { Component, Input } from '@angular/core';
|
||||||
|
|
||||||
@ -6,13 +7,11 @@ import { Component, Input } from '@angular/core';
|
|||||||
template: '<h3>"{{name}}"</h3>'
|
template: '<h3>"{{name}}"</h3>'
|
||||||
})
|
})
|
||||||
export class NameChildComponent {
|
export class NameChildComponent {
|
||||||
private _name = '';
|
|
||||||
|
|
||||||
@Input()
|
@Input()
|
||||||
|
get name(): string { return this._name; }
|
||||||
set name(name: string) {
|
set name(name: string) {
|
||||||
this._name = (name && name.trim()) || '<no name set>';
|
this._name = (name && name.trim()) || '<no name set>';
|
||||||
}
|
}
|
||||||
|
private _name = '';
|
||||||
get name(): string { return this._name; }
|
|
||||||
}
|
}
|
||||||
// #enddocregion
|
// #enddocregion
|
||||||
|
@ -18,14 +18,14 @@ export class VersionChildComponent implements OnChanges {
|
|||||||
changeLog: string[] = [];
|
changeLog: string[] = [];
|
||||||
|
|
||||||
ngOnChanges(changes: {[propKey: string]: SimpleChange}) {
|
ngOnChanges(changes: {[propKey: string]: SimpleChange}) {
|
||||||
let log: string[] = [];
|
const log: string[] = [];
|
||||||
for (let propName in changes) {
|
for (const propName in changes) {
|
||||||
let changedProp = changes[propName];
|
const changedProp = changes[propName];
|
||||||
let to = JSON.stringify(changedProp.currentValue);
|
const to = JSON.stringify(changedProp.currentValue);
|
||||||
if (changedProp.isFirstChange()) {
|
if (changedProp.isFirstChange()) {
|
||||||
log.push(`Initial value of ${propName} set to ${to}`);
|
log.push(`Initial value of ${propName} set to ${to}`);
|
||||||
} else {
|
} else {
|
||||||
let from = JSON.stringify(changedProp.previousValue);
|
const from = JSON.stringify(changedProp.previousValue);
|
||||||
log.push(`${propName} changed from ${from} to ${to}`);
|
log.push(`${propName} changed from ${from} to ${to}`);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -1,5 +1,5 @@
|
|||||||
// #docregion
|
// #docregion
|
||||||
import { Component } from '@angular/core';
|
import { Component } from '@angular/core';
|
||||||
|
|
||||||
@Component({
|
@Component({
|
||||||
selector: 'app-vote-taker',
|
selector: 'app-vote-taker',
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user