Compare commits
1229 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| e87accdfb4 | |||
| 4dcfe3031d | |||
| 1538fbb102 | |||
| b9259b87eb | |||
| 30997dbc88 | |||
| 607eb6d130 | |||
| f2e9b3577d | |||
| cb2c6d8560 | |||
| bfe8346ced | |||
| 88da9bb91b | |||
| 5e2ee1a16c | |||
| 2fdc746392 | |||
| 1667973a66 | |||
| 42f0101440 | |||
| 13b69bff1b | |||
| 2c2226dfd6 | |||
| a3fdfe0e15 | |||
| a0de209a55 | |||
| 0208b50ac7 | |||
| 4a61779aba | |||
| 05057ade05 | |||
| 6fb206853c | |||
| fab68055bf | |||
| d5a77ef3cd | |||
| dcb2605de4 | |||
| e6d38f4539 | |||
| 293b56cfa6 | |||
| 775e93d54b | |||
| 7f840e75df | |||
| 2113ea675e | |||
| 916a5c1a6b | |||
| f684531315 | |||
| fe8dda8996 | |||
| 4cd4b328c8 | |||
| d844c89b94 | |||
| 177ea2b85a | |||
| 50c5c15f49 | |||
| 1810760dc7 | |||
| 4635b92e3f | |||
| 1c652626eb | |||
| 2000cfb1db | |||
| f4d07828e7 | |||
| 95b552671c | |||
| ef3bc3efe1 | |||
| 371ad899f5 | |||
| 2c54158d84 | |||
| 5d9e30bbdc | |||
| e477fd567d | |||
| 6a6c2937fe | |||
| 09e17c4da8 | |||
| fd00469d11 | |||
| cbbeb795f3 | |||
| bba40e0da8 | |||
| d23165d06a | |||
| 405fef6f03 | |||
| 588f217826 | |||
| 3d8b7cf80e | |||
| c0ef923ad3 | |||
| 3df44fc71e | |||
| c1965492d9 | |||
| 1f56ffde80 | |||
| f335fdc002 | |||
| 0c914b5ec8 | |||
| d767b06858 | |||
| d4e49f3944 | |||
| 7dfc5b3faf | |||
| 8a88033ab9 | |||
| 7b06b38c94 | |||
| 5409752817 | |||
| 909f3a3005 | |||
| 4930532c7b | |||
| 8a42e65c6a | |||
| 5d4121a9b4 | |||
| a70e6c49a1 | |||
| 3d83d5f4b5 | |||
| f9dece0743 | |||
| ac0871d0e8 | |||
| ffc19e591d | |||
| c53380ca3d | |||
| 7c74a2026a | |||
| adaed438d9 | |||
| baf38305cb | |||
| 8254712521 | |||
| 53214781e3 | |||
| 88cbbbdf65 | |||
| c10dca9c7b | |||
| 7f2ebb4bde | |||
| f1abb60e4a | |||
| e014c7aff6 | |||
| b79c03433e | |||
| 34eb4d974d | |||
| 3264be3c5e | |||
| 655f4f75fb | |||
| 4383f31696 | |||
| 99eb15d15e | |||
| 2682c6e150 | |||
| 3a5d854e6d | |||
| 1e90c6387c | |||
| 2cca25f4d0 | |||
| 565724d201 | |||
| 3e4955becd | |||
| 7b560c727f | |||
| 35abd9dfdb | |||
| b7ccf3e0e5 | |||
| 0d9ab8fdd0 | |||
| 303f9290a8 | |||
| e0c4dc08a1 | |||
| 8c655883fe | |||
| ba90785115 | |||
| 7b392b626b | |||
| 8e4ceb7d48 | |||
| 2ab1c6e9a9 | |||
| dbdced0971 | |||
| 5e481880bd | |||
| faec063f34 | |||
| bbea38d227 | |||
| a0ef60de49 | |||
| 3313572606 | |||
| c4f850cb14 | |||
| 3bdab738c6 | |||
| faaef31b9f | |||
| ca7b8b8b4c | |||
| 9ca84e0694 | |||
| daaf2b1796 | |||
| 25f7cbea5a | |||
| c485ea9d7b | |||
| 295390c8e9 | |||
| 3ebf816ce2 | |||
| 0e362b851b | |||
| 8d7ba19a08 | |||
| 08f4aa9d10 | |||
| 98175d5c72 | |||
| 7d4cad90bc | |||
| 335354d962 | |||
| fe31d15d27 | |||
| 7ceb6eb50d | |||
| 4c4db46aa8 | |||
| b5724ed343 | |||
| cae94175fe | |||
| 0494a9d410 | |||
| c261b5c1ce | |||
| c89e17ac00 | |||
| 50e7410002 | |||
| c5b0ebf76d | |||
| 1d08978d6c | |||
| fc78b6c933 | |||
| 480a5718fc | |||
| f093bd115c | |||
| 8a86beff14 | |||
| 6020890384 | |||
| 124aa947e2 | |||
| e1add14453 | |||
| e3293837a8 | |||
| 5cb2743780 | |||
| 6f0c79ec25 | |||
| 7de7d1d926 | |||
| 89175f8e85 | |||
| fc48c59eb0 | |||
| 51332bc7e7 | |||
| 7403405d12 | |||
| 1d13947e71 | |||
| f6cb1ffe20 | |||
| 6d92b5651a | |||
| 3ea5bb2a6c | |||
| 1d367eca69 | |||
| d4bf3a2ec3 | |||
| 0ef8881660 | |||
| d7d1121f7d | |||
| 7f089c309f | |||
| 4dcc0bb66c | |||
| 0049be7feb | |||
| 39ff641be9 | |||
| e2fed24995 | |||
| c0aa353f83 | |||
| d8521be63d | |||
| 6d4569c89d | |||
| cd07553b59 | |||
| 641bfcc9f7 | |||
| 6c01371958 | |||
| 7b00260b1a | |||
| 875142373e | |||
| ba505b15ef | |||
| 17d227b142 | |||
| e7e192ffe3 | |||
| c53ec6e12d | |||
| aad6492a6a | |||
| fd5b125c2d | |||
| 5acee76c70 | |||
| 10916fa82a | |||
| f69951a523 | |||
| 38ba85e89d | |||
| 97023921b8 | |||
| f835810f0a | |||
| 46f5589530 | |||
| ff9840c8ef | |||
| 0c197558a1 | |||
| c409ba149d | |||
| 0b896ddfb1 | |||
| 45721eb4fe | |||
| 1289bd03b2 | |||
| c1ba8ba6b8 | |||
| 4973d8f629 | |||
| 3aff4c96c4 | |||
| 4005bc8985 | |||
| 62e9792c39 | |||
| 33183cc595 | |||
| 394d552856 | |||
| aa4f0929e0 | |||
| f99b9215e3 | |||
| c51d621fee | |||
| 7499892bc2 | |||
| cbddebeaa8 | |||
| bbe4c95109 | |||
| 4c6f9f0dd8 | |||
| 90f7dba793 | |||
| 7c492338a2 | |||
| 530f494df8 | |||
| 8fd1f35c59 | |||
| af1518e924 | |||
| 473e381d75 | |||
| 7d3acc747d | |||
| bf7424a67c | |||
| 3fb35871c7 | |||
| d6d20cd704 | |||
| 9cc6a6b885 | |||
| ee0be7b6d0 | |||
| a856337eae | |||
| 6cf47ba4eb | |||
| 3b7a189708 | |||
| 79c542b76a | |||
| e37b7bd73f | |||
| d6f3c34b33 | |||
| bc5cb46e7d | |||
| c7b747c4fa | |||
| d3c51d7acd | |||
| b6881d797c | |||
| b9f802939c | |||
| 6558c2c065 | |||
| 37a089c868 | |||
| f68eff6bb3 | |||
| 88a525f1a7 | |||
| 7e6153ba7d | |||
| 34fddd5940 | |||
| 0e5d6fe8d8 | |||
| e1342a0d9d | |||
| 0cc2d3aaa7 | |||
| 67814505b3 | |||
| bae29c6d62 | |||
| a0e67d4c03 | |||
| 131bc5fbf7 | |||
| 051218e29b | |||
| 6ace8307d8 | |||
| e84bef44b7 | |||
| 3186d762f2 | |||
| c97a3b0a56 | |||
| 78f1bb3b91 | |||
| 67707fbc90 | |||
| 2a57ffa615 | |||
| 216fce74f8 | |||
| 6cd3e6652a | |||
| fe7d79cee6 | |||
| 2f4e7b388b | |||
| 2e289cd152 | |||
| 21a3dcf06c | |||
| 7f56add914 | |||
| 88701c6167 | |||
| e4ce6117a1 | |||
| cec2a61bdf | |||
| 8275ac5853 | |||
| b7bcf97365 | |||
| fa28b480f1 | |||
| 4bb95b7396 | |||
| 5a9bd73e8b | |||
| 4fe0276914 | |||
| 5e8bda55b4 | |||
| d09c4898c1 | |||
| 6ae67ed299 | |||
| 32ff166a74 | |||
| 8feae04281 | |||
| 129f9c147b | |||
| 6e336dd207 | |||
| 161561c48a | |||
| c162e84383 | |||
| dc8d80a6e5 | |||
| 293f67968c | |||
| 4dcf26236e | |||
| a0e8d69243 | |||
| 33cd9bf516 | |||
| 0132797f2f | |||
| 7e2db0aa4e | |||
| cc1d50491b | |||
| 461b86a04b | |||
| 9a3a7c28f4 | |||
| 1c9d0200ca | |||
| 0037cd2e69 | |||
| 028ae061da | |||
| 2e47763ecc | |||
| 924e4a45d0 | |||
| 8361b9553b | |||
| e52be20fba | |||
| da12233ade | |||
| 57500f6c97 | |||
| 199e17d0b1 | |||
| 3b91343082 | |||
| 1753c9163c | |||
| 89e5953e89 | |||
| 5bfd25c8c6 | |||
| e555b24f50 | |||
| 14db37459f | |||
| 1d9779d47c | |||
| 3dedbc5457 | |||
| facb3266c6 | |||
| 01fe5dd2f7 | |||
| 9b22b1e499 | |||
| 4bc8818145 | |||
| 48ef8c86c2 | |||
| 89f359a52f | |||
| 13b8160d74 | |||
| f1c16d6674 | |||
| 76a088e177 | |||
| 630d8c3bb6 | |||
| 744efa30f2 | |||
| bf4a94dc48 | |||
| ce4ba2f6f1 | |||
| 5b232b5d35 | |||
| 35151bbac7 | |||
| f0e959319e | |||
| d0c4475724 | |||
| 99935f1e59 | |||
| fbb43821ba | |||
| c7f5c6c1d1 | |||
| d26f1fa371 | |||
| c3718ff7dd | |||
| d63493a859 | |||
| a72183851a | |||
| 40b2387667 | |||
| d814aa36a7 | |||
| e37eebe4ad | |||
| 0baaaefdf8 | |||
| 58a58906e7 | |||
| bec0d9b00e | |||
| e6a4ab789b | |||
| 36c1d3230c | |||
| 30466ec3fe | |||
| ce414a5ca9 | |||
| e4e6edd573 | |||
| 79927f4dc9 | |||
| 603b833757 | |||
| ba99d1a10d | |||
| efe97e8f51 | |||
| 5ec23bb7ab | |||
| 9b4d01ab75 | |||
| 40191a88d4 | |||
| a19477d179 | |||
| bf98a78f3d | |||
| ba4c2fc1bd | |||
| b56e9ef028 | |||
| dbbd34c520 | |||
| ccb69dbdfa | |||
| 11e555ef6f | |||
| 61e17395c9 | |||
| 733ce3b6b8 | |||
| 375f143199 | |||
| 2419f35eb9 | |||
| 21867c3576 | |||
| 28853b28bc | |||
| e2f27568a5 | |||
| 98b2b796b0 | |||
| b8f3fcf00b | |||
| d3fda9a821 | |||
| 19e69dc13e | |||
| 48543a2dad | |||
| b22f5ae5c2 | |||
| 2acb6a28fe | |||
| 1064cdb79d | |||
| bd7cb1c877 | |||
| 6c314982dc | |||
| d54710f113 | |||
| 1346156ecd | |||
| a2d9f9b417 | |||
| 3de78cca2d | |||
| 5fa7cd9fa9 | |||
| a78c00fb41 | |||
| edc2a03d1c | |||
| 174f8f5823 | |||
| 9fbc94e8d8 | |||
| 6aff35196d | |||
| eceed4ed74 | |||
| 7428731eac | |||
| 89b07ea0ae | |||
| d16daf0fd9 | |||
| 211ab4eea8 | |||
| dbd53f8d14 | |||
| a27680b8c0 | |||
| 07fc9b98cc | |||
| 33582c0448 | |||
| 73be0fef75 | |||
| 611202c905 | |||
| e553f35a68 | |||
| 673649a603 | |||
| c4ed743370 | |||
| 682fa0d3eb | |||
| 30f34eee22 | |||
| eab76bf85b | |||
| bcf405bf9d | |||
| 3c4b0d4a74 | |||
| fb9bd0eb7d | |||
| 7e2dc04123 | |||
| 54ec37994c | |||
| 4a5935ee36 | |||
| 01b9a07320 | |||
| 0fcf0dcd18 | |||
| 80481f142a | |||
| 2be08ce7ab | |||
| 37eb5af3d4 | |||
| 8c8151be92 | |||
| baf31d1c1e | |||
| af2250835a | |||
| 6f2a759ba3 | |||
| 5065901196 | |||
| 41b59e6e11 | |||
| 43afdaadc6 | |||
| 83c5151792 | |||
| 0880ab67c6 | |||
| c0b2143c7c | |||
| c1de162c99 | |||
| a7ef8aba68 | |||
| 3ee4c11a99 | |||
| 990ae10dc2 | |||
| 52b2fd046b | |||
| 9f41f80a91 | |||
| eec4a91ad8 | |||
| 7c51001c3c | |||
| a4ea4b1f5f | |||
| 19fc37539e | |||
| ce7acb0feb | |||
| 105b7678b8 | |||
| b67575586e | |||
| 3dc6898673 | |||
| a73754c1b5 | |||
| 1ebf1c00d6 | |||
| 7dac7d757e | |||
| b1f3192b95 | |||
| 16984d18bb | |||
| e603893d77 | |||
| a7998b30c6 | |||
| 3277a4e8c3 | |||
| 7e769d0e14 | |||
| 713e0579f8 | |||
| 6e130cc020 | |||
| eb036a12d9 | |||
| 534d1f5055 | |||
| cbef909657 | |||
| 874f3b32b3 | |||
| 2fd017cf73 | |||
| 5740b018a7 | |||
| 288bf6805a | |||
| 02d37a369a | |||
| 1d316c3258 | |||
| a56ce62f1a | |||
| c268f42851 | |||
| 7251e802ab | |||
| 5b1a2d10c2 | |||
| 2dd7f292b1 | |||
| 213c53e307 | |||
| ce07dfd8ac | |||
| c1dba462e8 | |||
| 47f0d74812 | |||
| ce80285f8d | |||
| d2dd1a43dd | |||
| 12d73fe90d | |||
| c2741638b2 | |||
| 4a7fb3d509 | |||
| f6ff652ca4 | |||
| 6165cb0f83 | |||
| 1f361b7b10 | |||
| 5269ff978b | |||
| 55595493a9 | |||
| ad3ff0aba7 | |||
| ce48546cef | |||
| 35b3bc995e | |||
| 63f60019d1 | |||
| 0d741b6275 | |||
| 0df9080bbb | |||
| ddcf89e6a2 | |||
| 5de225d5d4 | |||
| 5cddb482f1 | |||
| c000d724de | |||
| 504055f331 | |||
| 7f6880f40e | |||
| 02e4e3c892 | |||
| 993d73c359 | |||
| 97ca0b818e | |||
| 44166f76d4 | |||
| 557d6d37a1 | |||
| d3ad56a307 | |||
| 0641022ec5 | |||
| 80c7a8473a | |||
| d9a954ca91 | |||
| c219f64322 | |||
| f7a9ecff21 | |||
| 2b3126ae04 | |||
| 934c227545 | |||
| cc0515c217 | |||
| 55ba75f2bc | |||
| c220228566 | |||
| 26b476ab3c | |||
| b8a67d530f | |||
| b08c96d2db | |||
| 4773c39a57 | |||
| 892843b290 | |||
| 733244531e | |||
| 66633273e2 | |||
| 0405adcd16 | |||
| 426a7ac8dd | |||
| 3bf6205ff7 | |||
| c7f4986e61 | |||
| 0f0a3fdaf7 | |||
| 7d6911b140 | |||
| b8777539d7 | |||
| b5b1849ab3 | |||
| 0e10c81025 | |||
| 5fc0eaef1a | |||
| 113718c3c1 | |||
| 701bea6cae | |||
| 8d516ed12a | |||
| 667c5744f2 | |||
| 80b7c840e2 | |||
| 919c86796f | |||
| c90c88ecbf | |||
| d9ba0e2c46 | |||
| 45b2fc590b | |||
| 17ffdb0247 | |||
| c2fba15fc6 | |||
| 5937be695f | |||
| a076fcde84 | |||
| ede9931903 | |||
| 722e01608c | |||
| af926370d6 | |||
| 5971aee02e | |||
| cce7ad449a | |||
| d437dd5919 | |||
| f1980730d2 | |||
| 47773e9cae | |||
| 60969b0916 | |||
| ecc7925d03 | |||
| 6d3010dcc7 | |||
| 0164bafbf1 | |||
| 3940606167 | |||
| da9faccada | |||
| 7e708b3bf7 | |||
| 05630c9896 | |||
| 369c56db73 | |||
| 9873459169 | |||
| 7776b3766b | |||
| 29c9004654 | |||
| 601c909004 | |||
| 72aa9a3b62 | |||
| 2ecf7bca97 | |||
| cbdfaccdb2 | |||
| 93d1b9a2d5 | |||
| bfb5ee794e | |||
| 9ae8bd238b | |||
| 98a64e3114 | |||
| 0171f3aec7 | |||
| 2c827bab9a | |||
| ec920093d4 | |||
| 4289ff6652 | |||
| cd32ef60da | |||
| 6ef3d091e1 | |||
| 0f59496778 | |||
| 795b670b3c | |||
| 4ad65e3d69 | |||
| f48b1150cf | |||
| 198db8bc68 | |||
| 3ae447ca44 | |||
| a2ec878ef0 | |||
| d43b5d3337 | |||
| 11e3503dc2 | |||
| accf44b769 | |||
| b612c0e0d6 | |||
| 771c7518e6 | |||
| 4f2bad034a | |||
| 0456669aeb | |||
| 2eb71321e7 | |||
| d2e9e22e4e | |||
| e2427c8dce | |||
| 26162815c8 | |||
| d0c86ea2f7 | |||
| 4f5b4d4472 | |||
| 10d71587e7 | |||
| 9ac777d687 | |||
| 7d1f9f3981 | |||
| a214ab463e | |||
| 2f21f6ef8a | |||
| 590cd8500d | |||
| f48a28264f | |||
| 51953bce09 | |||
| c445d4b839 | |||
| 9dabce1dd7 | |||
| 6b77f08d86 | |||
| 50e03d41ab | |||
| 4759c89628 | |||
| 458ab9b1e0 | |||
| dfb2a7153b | |||
| e9141d82f3 | |||
| d9f42712e4 | |||
| da0658f3d9 | |||
| 412a5a6d8e | |||
| 9cf9e6edd8 | |||
| 28050fc9fb | |||
| ea9f227fa8 | |||
| 05164e90fb | |||
| 97156ccf8a | |||
| 003d55968e | |||
| 98dd21b75c | |||
| a349e34bc2 | |||
| 245c825cbf | |||
| 4ba6698c4b | |||
| dac6edea90 | |||
| b2e2dbe0c2 | |||
| f822fa0d57 | |||
| bbee94edba | |||
| c39c408332 | |||
| dde4a40e69 | |||
| 1afa4d2868 | |||
| d25f371d6c | |||
| 948261d1d1 | |||
| 04b7749f85 | |||
| 8668f0ff5b | |||
| b7d8ff6c99 | |||
| 0894a30f13 | |||
| bd511887a7 | |||
| 0304c0eca0 | |||
| 6d5c6e2fbc | |||
| e7e7912519 | |||
| b9c41d8f99 | |||
| 25a2264ac3 | |||
| ad64657c74 | |||
| 106f18a73a | |||
| 0fb38140a6 | |||
| 60133941ae | |||
| 76db64c073 | |||
| 24b390ba03 | |||
| b4d34d9085 | |||
| f80bea27a9 | |||
| 4b846964be | |||
| e6357e2eef | |||
| d538b6145f | |||
| 229ba3a75c | |||
| 672b867847 | |||
| ca1dacd621 | |||
| 26abb4301d | |||
| 045dac59af | |||
| 1ffa87ea23 | |||
| 357df2bf68 | |||
| 24f3db3e3f | |||
| 4bb51b0120 | |||
| 32b9c1eba1 | |||
| 40bffc1d25 | |||
| ed2c4e2642 | |||
| b3353e220a | |||
| 7dc917babf | |||
| 00dbba04a2 | |||
| 3efd1a0451 | |||
| b7d7ca4014 | |||
| 854a54e9c6 | |||
| 4f4edb109f | |||
| 265bfeb889 | |||
| 96110637d9 | |||
| ad34f98e6d | |||
| a8a1563586 | |||
| 9b25a54a47 | |||
| 4b8c96c769 | |||
| c62ff85e73 | |||
| 7d5a27ec0f | |||
| d6aba040dd | |||
| ca4757db5b | |||
| c917b67cbd | |||
| 9659c97978 | |||
| 7d862d6f2a | |||
| 9c80776d8c | |||
| d5cd288fe8 | |||
| 239e817779 | |||
| 1986215919 | |||
| 239f5f1a2f | |||
| 3bca32c6d5 | |||
| 183eff745d | |||
| 4392d78ff6 | |||
| 858196ab53 | |||
| fb75d8c1f2 | |||
| 7628569579 | |||
| 8a9d5f7753 | |||
| cdcccf5089 | |||
| de95c92e2d | |||
| 3030b8d476 | |||
| 92ed14c0e4 | |||
| 5b94a4de9a | |||
| 709112c498 | |||
| e465ec8835 | |||
| f6eb31bf9d | |||
| 426f939982 | |||
| fab6cebf0d | |||
| ff081dd0f1 | |||
| 868399ed6f | |||
| 1bc9b95289 | |||
| 9af805ab5e | |||
| 6b88081360 | |||
| 667c828359 | |||
| 50d37ce4f6 | |||
| af0246cd27 | |||
| 857e4e49d8 | |||
| c1afed7f98 | |||
| 5480e54185 | |||
| 99d0a0a6fd | |||
| 8a998369d6 | |||
| 8b490c5047 | |||
| 7e70ba6ab2 | |||
| 90e09fc384 | |||
| 266f2e763d | |||
| c979cfb912 | |||
| 8ee29b1e43 | |||
| 26fbc07cac | |||
| f01fe65be4 | |||
| 3fdd6a80f9 | |||
| da1de8db1d | |||
| dd1bf7b49d | |||
| f18913b5a0 | |||
| a2cd227f1a | |||
| 78e64e1f60 | |||
| 23a9b79320 | |||
| 76394ce341 | |||
| 1935df1faa | |||
| 5af4ce28ab | |||
| ce8ee569c4 | |||
| b0508f430e | |||
| 2139a80a7a | |||
| aa4bc2ce03 | |||
| fa65f84e09 | |||
| c06357a351 | |||
| 092a02a624 | |||
| b9699f745f | |||
| 7fa9f10c30 | |||
| 7bf0655dae | |||
| 96c5fdcbeb | |||
| c2e6d40382 | |||
| 810d2a1ceb | |||
| af74f21af9 | |||
| cdf7558a8e | |||
| 41b86e6c10 | |||
| 085c6f8bdd | |||
| 3039c678a5 | |||
| 498882d014 | |||
| 6c2b8c2abb | |||
| e955cc4378 | |||
| eb96dd4803 | |||
| e0bdef98a6 | |||
| 1130007d14 | |||
| d99d092784 | |||
| e3b18a33ca | |||
| 1890aab1e6 | |||
| 42bf350034 | |||
| 5ff52ea113 | |||
| 432e3ba636 | |||
| f7ab52fe9a | |||
| ad8430049d | |||
| 2dffe7ba9e | |||
| 5b8f97e0f6 | |||
| b3a763a48d | |||
| 07569f10b5 | |||
| 7c5a78a1cf | |||
| 5cca5bfe86 | |||
| 0e021e7d7d | |||
| b30ee884a7 | |||
| 869b7c85ca | |||
| 4d0d1ed2a1 | |||
| 291983e4c3 | |||
| 909cff2158 | |||
| 4e676b1dba | |||
| 9149bb9333 | |||
| 4631994f20 | |||
| 82e9178320 | |||
| 67b4688168 | |||
| 6e0e169b6e | |||
| 100ba8edfa | |||
| d7448ecb95 | |||
| 8b1801f378 | |||
| 01a4d57566 | |||
| 7edc9064d9 | |||
| 30c47a65f4 | |||
| 0889f42a00 | |||
| 4999f1ad51 | |||
| f15fbe53cf | |||
| 046f7b5153 | |||
| 5339fe6e06 | |||
| de7ffb10cb | |||
| 80224e6974 | |||
| 0c7c536f73 | |||
| e5c386c39a | |||
| bb2462483e | |||
| d5bc498373 | |||
| 979b7ae651 | |||
| c73330a466 | |||
| efe8eca4e3 | |||
| a37aad18b7 | |||
| cfa0c45213 | |||
| 509481ef06 | |||
| 9aa8175e23 | |||
| 76f59d99a2 | |||
| bd66bd6cf0 | |||
| d69333dea4 | |||
| 3fd7899b93 | |||
| 8f8a2cea56 | |||
| 879011c8e9 | |||
| d5794c3e2e | |||
| 61dbae8b8b | |||
| fcc22ba560 | |||
| 2adeb88fe6 | |||
| e63a78bcdb | |||
| b065f002a4 | |||
| 349a5f52b1 | |||
| aa5e20df05 | |||
| 793b9f238c | |||
| 9c4fdaa4f3 | |||
| d1a9cb488a | |||
| faee2c3e1b | |||
| b7845c318e | |||
| 426a0727c3 | |||
| 584e509a9c | |||
| f3639c2663 | |||
| 1431e75f8b | |||
| be8812e0af | |||
| fd6436d490 | |||
| fd1342f9d1 | |||
| 5fa0012195 | |||
| 9dbb67ef01 | |||
| d16e2f37d4 | |||
| d9e8b53ffe | |||
| 1997e63b7c | |||
| 6f673359ff | |||
| 45dfbff10a | |||
| 348ee96274 | |||
| 8edee32e77 | |||
| 6d8d263ca6 | |||
| 35923709e2 | |||
| fdd4d53448 | |||
| 06419f662e | |||
| 57763ef032 | |||
| 8e506f7749 | |||
| c7f8fe1468 | |||
| 4156a4e36d | |||
| ba3cc7df0f | |||
| 0c212d39eb | |||
| 3bd2e8dbf5 | |||
| 5292119e6e | |||
| 994a397231 | |||
| 353b71f803 | |||
| eb12afe8cc | |||
| 4a176f1b43 | |||
| 8e228baa82 | |||
| 154b53b0d8 | |||
| a3f680d80c | |||
| 0d75fe6b81 | |||
| 4070380ded | |||
| 41195dcef0 | |||
| 78a1e45be2 | |||
| d8e88bc58d | |||
| 448e9b71b8 | |||
| 2e178164cc | |||
| 9f2e3f05a1 | |||
| 405bd29ebd | |||
| b39b54e0ac | |||
| 119c5c9071 | |||
| 7a4c9b128c | |||
| dc5b92030f | |||
| db0a010d7c | |||
| a117a19bdf | |||
| 5f46fdb406 | |||
| f0201de4cc | |||
| 6cd51a318b | |||
| c1a4b27bc7 | |||
| 5113222050 | |||
| 90f12eea5e | |||
| 2403743701 | |||
| 3e6a759309 | |||
| 35a430e9f4 | |||
| b644f7d23d | |||
| 7702a05464 | |||
| 493af5fe82 | |||
| ac66a59cec | |||
| e10c8faa47 | |||
| 9b7d17433c | |||
| a40eb1ff43 | |||
| 04df6c3e9e | |||
| 1b970e5a66 | |||
| 75406c2d01 | |||
| 64d3511fbc | |||
| c610f54977 | |||
| 090ad34f78 | |||
| 358c5205d2 | |||
| 5503cd0589 | |||
| dae42b1bd9 | |||
| 06a25284e8 | |||
| 5989560f15 | |||
| 63c995e5da | |||
| dc5607f554 | |||
| d49302c032 | |||
| 63fef9bd4b | |||
| 6599351d45 | |||
| 47e9531972 | |||
| 3ba31483f4 | |||
| f4ca94f2e1 | |||
| 67f9be2b77 | |||
| e2fd155e1b | |||
| 931068dede | |||
| bc4c9cc40d | |||
| 294665fbe8 | |||
| e8f6a79c8f | |||
| 5fd8b5c5b9 | |||
| 226b2a73af | |||
| 42d421a6fc | |||
| a90203f256 | |||
| c3ef79caa9 | |||
| 1439afcd9c | |||
| d263b19910 | |||
| 1e477226ea | |||
| 026fc1d2e3 | |||
| 2d4bd9857a | |||
| 8f48f5b45c | |||
| 22210b7400 | |||
| 7d05855ee0 | |||
| b2460cbc3d | |||
| 4561957e56 | |||
| 3367fadc3a | |||
| d7e409b042 | |||
| a0b28e8ad1 | |||
| f928a8e58e | |||
| 0bc4b3d0fa | |||
| e352768388 | |||
| 6835b73e49 | |||
| f1503f871b | |||
| c4d8aba5c8 | |||
| 39f24c41ad | |||
| 21644ec889 | |||
| 613470b44d | |||
| 6c918e346b | |||
| bce8539572 | |||
| aab86e00ec | |||
| 2a58726caf | |||
| 4163b35b32 | |||
| 9c6dac8180 | |||
| 80fc37724b | |||
| 77b25f5132 | |||
| 684f098450 | |||
| d09f74d30f | |||
| 3d973b112e | |||
| 96986164a4 | |||
| 78152c20a9 | |||
| 2bb64e9e2f | |||
| 746844dfc8 | |||
| 41b613a2d7 | |||
| 3b3aeea224 | |||
| 71c592a0ce | |||
| 15193fcf5f | |||
| a31f53395f | |||
| 283b134d84 | |||
| 271eb614cd | |||
| 16167bef07 | |||
| 1eac9fa1cd | |||
| 7f819f0020 | |||
| dec1f99a5f | |||
| c705e74fc8 | |||
| 01df10f93e | |||
| 9877f08cf4 | |||
| 3dc4b1d775 | |||
| 02791c51ae | |||
| 49683326e6 | |||
| 947773a82e | |||
| 2a229df624 | |||
| e605ad5e46 | |||
| 0d4f43472b | |||
| b30e467685 | |||
| a56c0b52d5 | |||
| c17ebfd279 | |||
| 5400b1da96 | |||
| 69f4a618b2 | |||
| 16b8b6698c | |||
| b29a700d40 | |||
| bbb1468439 | |||
| 72f9d6a8d3 | |||
| 3ec8da1f17 | |||
| dbea3848df | |||
| 33871435e1 | |||
| f1f22b43dc | |||
| 2fb9a56e0b | |||
| 14e8f66ed7 | |||
| e6f5072462 | |||
| a64f50fa72 | |||
| bb5f6e88d0 | |||
| 6991403203 | |||
| 410bd22f8a | |||
| b81d823602 | |||
| bd5115f9aa | |||
| 7bcbed80d7 | |||
| 8fb62ebf5f | |||
| 209dd9923f | |||
| c75207e391 | |||
| d957f36927 | |||
| 9ac459b6d9 | |||
| e08b2817ba | |||
| 4ca13c409b | |||
| 0d515e2303 | |||
| a2153bc6aa | |||
| ca171afe6f | |||
| bf4e97bd48 | |||
| 8c59a12a03 | |||
| 89569355be | |||
| 3a41b3bdcf | |||
| 12bd7037b3 | |||
| ca4f573be0 | |||
| 07fceeab5a | |||
| 3aa376e912 | |||
| 92d30a8896 | |||
| 83876fb9da | |||
| 29bdf7877c | |||
| 29199e2782 | |||
| 68e1378615 | |||
| cf7efb5bfc | |||
| 8634ee536d | |||
| 632d3cda24 | |||
| 29b6a907d4 | |||
| 7474d09e5d | |||
| fc7bcd7e00 | |||
| f6fb2e4b1d | |||
| 8c8673a272 | |||
| 4404a1173b | |||
| e08c10315e | |||
| 16473c9177 | |||
| 235fd5603f | |||
| d07d5832f5 | |||
| ef8be5d559 | |||
| ccafdc6e1f | |||
| 11827aa4c0 | |||
| 6b0589d343 | |||
| cec1eed99e | |||
| d7e1e9e284 | |||
| cae46453a7 | |||
| a6e948c808 | |||
| 7638020bfc | |||
| 10a62ca17c | |||
| 0afc7c184f | |||
| 168e26aeb4 | |||
| e6b9389b33 | |||
| 377c37425e | |||
| 4af26602bb | |||
| c6624e5cb6 | |||
| f7ae5b91bf | |||
| 07e68496c0 | |||
| d5a947e2cc | |||
| 3f920767f1 | |||
| 3e14d27a1e | |||
| cfa4c14108 | |||
| 209056dbe1 | |||
| 10356a7496 | |||
| d4ae74de44 | |||
| 88d5e7dd5e | |||
| 06c7b0b82e | |||
| 689febda60 | |||
| 80bc6fda8b | |||
| 346eb78c4e | |||
| 2df02f1b09 | |||
| 92915eddc2 | |||
| cddbf460f8 | |||
| 3c63c23e5a | |||
| ba67b1291f | |||
| 7bced28327 | |||
| db2b60700c | |||
| 9034822c44 | |||
| e8254f9aae | |||
| a14179b81a | |||
| 427c5db7f4 | |||
| fcb5865468 | |||
| 41370be2b8 | |||
| d7d8dd8986 | |||
| a0f596e419 | |||
| 0a8894feb7 | |||
| 1db9eea0f8 | |||
| 489783c398 | |||
| be62f327ee | |||
| 32359adb6d | |||
| 2e198af8c3 | |||
| d154fcbd71 | |||
| 21e277b8a2 | |||
| f98cdd0749 | |||
| e60e306426 | |||
| ec36d396d9 | |||
| 135232d880 | |||
| 9c42ca0315 | |||
| 9ad9c569a6 | |||
| a9071d7920 | |||
| 1b4a10fac1 | |||
| d340f3b383 | |||
| f8c5eeab5d | |||
| 9cd2d0df93 | |||
| 78914091b1 | |||
| e12c324613 | |||
| 7cf396b518 | |||
| 8b3b40e627 | |||
| 90e14762e3 | |||
| d1dd8231cd | |||
| e70a3e09bf | |||
| 98656b0044 | |||
| a48aa3c778 | |||
| 05d7b98ba0 | |||
| f291ea6647 | |||
| 5d6e332044 | |||
| acb471fbe5 | |||
| 894f4379e6 | |||
| 1c73007ae6 | |||
| 2f7d744228 | |||
| e2cba90f8d | |||
| 352214ba0a | |||
| bd9b72fb22 | |||
| 50c9a667b3 | |||
| 3d32e6310d | |||
| 3bc54aa9e0 | |||
| def1ec3518 | |||
| 077802f972 | |||
| 914b47f340 | |||
| b2a78fd063 | |||
| 7d1835e59c | |||
| 833ccf3637 | |||
| 51be916f39 | |||
| e375408777 | |||
| 5078dc1cbf | |||
| 875148366e | |||
| c9ec4b4e24 | |||
| efa2b2db27 | |||
| 8ce120b74d | |||
| 26e678a97d | |||
| e71dd7409e | |||
| 58ffc2c6ca | |||
| d3f29362b9 | |||
| b429fe8254 | |||
| e1cb549b28 | |||
| 65a22257cc | |||
| e2f753eaa7 | |||
| c7127b65bf | |||
| 0c58c3572a | |||
| 26ae5fd728 | |||
| 370d92213b | |||
| 6e8321a22a | |||
| a8e8c1ce5d | |||
| a8a8cafd2b | |||
| b609890f28 | |||
| aac09ae092 | |||
| f1ff872944 | |||
| b195d2980a | |||
| d11736181f | |||
| 3e84486dd5 | |||
| a674ce36e4 | |||
| f6569a2625 | |||
| da10da79b3 | |||
| f236b76d5c | |||
| a71c22bedd | |||
| cc528e41cf | |||
| 351962475f | |||
| 6c73392a57 | |||
| 072ad87831 | |||
| 370a1f0574 | |||
| 9ca7aca4b7 | |||
| 0f2e9f66b1 | |||
| d03c3ab713 | |||
| 57c0b34ae9 | |||
| 06a94f0f28 | |||
| 750e7b1262 | |||
| 19e32752bb | |||
| 89c0729964 | |||
| fd07152aea | |||
| b656f189b6 | |||
| 9ac8d70152 | |||
| 8cc0b46335 | |||
| 1f15094da7 | |||
| b881adb853 | |||
| 4bfc3a5629 | |||
| ae6c0bfe40 | |||
| 4ce9c71521 | |||
| ec48323a7d | |||
| 7d9bae16cd | |||
| 163ff3d4e4 | |||
| 43fbf97e10 | |||
| 71faaf2ab1 | |||
| 7b0e743eca | |||
| 31a0c53855 | |||
| e8996063dd | |||
| 00842a3354 | |||
| d33f18ecb7 | |||
| fb7f620316 | |||
| 712e0d3e3b | |||
| 1870dc29c0 | |||
| da6fdc74d8 | |||
| 515e39154a | |||
| ff7731d063 | |||
| e9a3666dd5 | |||
| 55c56d53f4 | |||
| e4d55e6842 | |||
| d8661cf2db | |||
| 8815b126b5 | |||
| 2cd367f29f | |||
| 7395d19489 | |||
| d55cb95479 | |||
| 68ece7d363 | |||
| 6e4a8ac6df | |||
| 790629849f | |||
| f0443a43b2 | |||
| 3041eb5ce0 | |||
| c69247f190 | |||
| 27d6a62e67 | |||
| 6e7fc914aa | |||
| 65d587843b | |||
| c54792af22 | |||
| 7b7e023103 | |||
| 7637d36146 | |||
| 6c62afb123 | |||
| 44210ce6f2 | |||
| e21efc0a5c | |||
| 09a965022f | |||
| 46bf5cf830 | |||
| 7ba7761a57 |
@@ -0,0 +1,13 @@
|
||||
# See here for image contents: https://github.com/microsoft/vscode-dev-containers/tree/v0.148.1/containers/python-3/.devcontainer/base.Dockerfile
|
||||
FROM mcr.microsoft.com/vscode/devcontainers/python:0-3.9
|
||||
|
||||
ENV \
|
||||
DEBIAN_FRONTEND=noninteractive \
|
||||
DEVCONTAINER=true \
|
||||
PATH=$PATH:./node_modules/.bin
|
||||
|
||||
# Install nvm
|
||||
COPY .nvmrc /tmp/.nvmrc
|
||||
RUN \
|
||||
su vscode -c \
|
||||
"source /usr/local/share/nvm/nvm.sh && nvm install $(cat /tmp/.nvmrc) 2>&1"
|
||||
@@ -0,0 +1,31 @@
|
||||
{
|
||||
"name": "Home Assistant Frontend",
|
||||
"build": {
|
||||
"dockerfile": "Dockerfile",
|
||||
"context": ".."
|
||||
},
|
||||
"appPort": 8123,
|
||||
"context": "..",
|
||||
"postCreateCommand": "script/bootstrap",
|
||||
"extensions": [
|
||||
"github.vscode-pull-request-github",
|
||||
"dbaeumer.vscode-eslint",
|
||||
"ms-vscode.vscode-typescript-tslint-plugin",
|
||||
"esbenp.prettier-vscode",
|
||||
"bierner.lit-html",
|
||||
"runem.lit-plugin",
|
||||
"ms-python.vscode-pylance"
|
||||
],
|
||||
"settings": {
|
||||
"terminal.integrated.shell.linux": "/bin/bash",
|
||||
"files.eol": "\n",
|
||||
"editor.tabSize": 2,
|
||||
"editor.formatOnPaste": false,
|
||||
"editor.formatOnSave": true,
|
||||
"editor.formatOnType": true,
|
||||
"[typescript]": {
|
||||
"editor.defaultFormatter": "esbenp.prettier-vscode"
|
||||
},
|
||||
"files.trimTrailingWhitespace": true
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
{
|
||||
"extends": [
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"airbnb-typescript/base",
|
||||
"plugin:@typescript-eslint/recommended",
|
||||
"plugin:wc/recommended",
|
||||
"plugin:lit/recommended",
|
||||
"prettier",
|
||||
@@ -45,16 +45,16 @@
|
||||
"func-names": 0,
|
||||
"prefer-arrow-callback": 0,
|
||||
"no-underscore-dangle": 0,
|
||||
"no-var": 0,
|
||||
"strict": 0,
|
||||
"prefer-spread": 0,
|
||||
"no-plusplus": 0,
|
||||
"no-bitwise": 0,
|
||||
"no-bitwise": 2,
|
||||
"comma-dangle": 0,
|
||||
"vars-on-top": 0,
|
||||
"no-continue": 0,
|
||||
"no-param-reassign": 0,
|
||||
"no-multi-assign": 0,
|
||||
"no-console": 2,
|
||||
"radix": 0,
|
||||
"no-alert": 0,
|
||||
"no-return-await": 0,
|
||||
@@ -75,13 +75,16 @@
|
||||
"object-curly-newline": 0,
|
||||
"default-case": 0,
|
||||
"wc/no-self-class": 0,
|
||||
"no-shadow": 0,
|
||||
"@typescript-eslint/camelcase": 0,
|
||||
"@typescript-eslint/ban-ts-ignore": 0,
|
||||
"@typescript-eslint/ban-ts-comment": 0,
|
||||
"@typescript-eslint/no-use-before-define": 0,
|
||||
"@typescript-eslint/no-non-null-assertion": 0,
|
||||
"@typescript-eslint/no-explicit-any": 0,
|
||||
"@typescript-eslint/no-unused-vars": 0,
|
||||
"@typescript-eslint/explicit-function-return-type": 0
|
||||
"@typescript-eslint/explicit-function-return-type": 0,
|
||||
"@typescript-eslint/explicit-module-boundary-types": 0,
|
||||
"@typescript-eslint/no-shadow": ["error"]
|
||||
},
|
||||
"plugins": ["disable", "import", "lit", "prettier", "@typescript-eslint"],
|
||||
"processor": "disable/disable"
|
||||
|
||||
@@ -51,7 +51,7 @@ DO NOT DELETE ANY TEXT from this template! Otherwise, your issue may be closed w
|
||||
<!--
|
||||
Provide details about the versions you are using, which helps us reproducing
|
||||
and finding the issue quicker. Version information is found in the
|
||||
Home Assistant frontend: Developer tools -> Info.
|
||||
Home Assistant frontend: Configuration -> Info.
|
||||
|
||||
Browser version and operating system is important! Please try to replicate
|
||||
your issue in a different browser and be sure to include your findings.
|
||||
@@ -74,12 +74,12 @@ DO NOT DELETE ANY TEXT from this template! Otherwise, your issue may be closed w
|
||||
|
||||
```
|
||||
|
||||
## Problem-relevant configuration
|
||||
## Problem-relevant frontend configuration
|
||||
|
||||
<!--
|
||||
An example configuration that caused the problem for you. Fill this out even
|
||||
if it seems unimportant to you. Please be sure to remove personal information
|
||||
like passwords, private URLs and other credentials.
|
||||
An example configuration that caused the problem for you, e.g. the YAML configuration
|
||||
of the used cards. Fill this out even if it seems unimportant to you. Please be sure
|
||||
to remove personal information like passwords, private URLs and other credentials.
|
||||
-->
|
||||
|
||||
```yaml
|
||||
@@ -89,7 +89,7 @@ DO NOT DELETE ANY TEXT from this template! Otherwise, your issue may be closed w
|
||||
## Javascript errors shown in your browser console/inspector
|
||||
|
||||
<!--
|
||||
If you come across any javascript or other error logs, e.g., in your browser
|
||||
If you come across any Javascript or other error logs, e.g. in your browser
|
||||
console/inspector please provide them.
|
||||
-->
|
||||
|
||||
|
||||
@@ -1,26 +0,0 @@
|
||||
---
|
||||
name: Request a feature for the UI, Frontend or Lovelace
|
||||
about: Request an new feature for the Home Assistant frontend.
|
||||
labels: feature request
|
||||
---
|
||||
|
||||
<!--
|
||||
DO NOT DELETE ANY TEXT from this template!
|
||||
Otherwise, your request may be closed without comment.
|
||||
-->
|
||||
|
||||
## The request
|
||||
|
||||
<!--
|
||||
Describe to our maintainers, the feature you would like to be added.
|
||||
Please be clear and concise and, if possible, provide a screenshot or mockup.
|
||||
-->
|
||||
|
||||
## The alternatives
|
||||
|
||||
<!--
|
||||
Are you currently using, or have you considered alternatives?
|
||||
If so, could you please describe those?
|
||||
-->
|
||||
|
||||
## Additional information
|
||||
@@ -1,5 +1,8 @@
|
||||
blank_issues_enabled: false
|
||||
contact_links:
|
||||
- name: Request a feature for the UI, Frontend or Lovelace
|
||||
url: https://github.com/home-assistant/frontend/discussions/category_choices
|
||||
about: Request an new feature for the Home Assistant frontend.
|
||||
- name: Report a bug that is NOT related to the UI, Frontend or Lovelace
|
||||
url: https://github.com/home-assistant/core/issues
|
||||
about: This is the issue tracker for our frontend. Please report other issues with the backend repository.
|
||||
|
||||
@@ -18,8 +18,8 @@
|
||||
<!--
|
||||
Describe the big picture of your changes here to communicate to the
|
||||
maintainers why we should accept this pull request. If it fixes a bug
|
||||
or resolves a feature request, be sure to link to that issue in the
|
||||
additional information section.
|
||||
or resolves a feature request, be sure to link to that issue or discussion
|
||||
in the additional information section.
|
||||
-->
|
||||
|
||||
## Type of change
|
||||
@@ -56,7 +56,7 @@
|
||||
-->
|
||||
|
||||
- This PR fixes or closes issue: fixes #
|
||||
- This PR is related to issue:
|
||||
- This PR is related to issue or discussion:
|
||||
- Link to documentation pull request:
|
||||
|
||||
## Checklist
|
||||
|
||||
@@ -1,27 +0,0 @@
|
||||
# Configuration for Lock Threads - https://github.com/dessant/lock-threads
|
||||
|
||||
# Number of days of inactivity before a closed issue or pull request is locked
|
||||
daysUntilLock: 1
|
||||
|
||||
# Skip issues and pull requests created before a given timestamp. Timestamp must
|
||||
# follow ISO 8601 (`YYYY-MM-DD`). Set to `false` to disable
|
||||
skipCreatedBefore: 2020-01-01
|
||||
|
||||
# Issues and pull requests with these labels will be ignored. Set to `[]` to disable
|
||||
exemptLabels: []
|
||||
|
||||
# Label to add before locking, such as `outdated`. Set to `false` to disable
|
||||
lockLabel: false
|
||||
|
||||
# Comment to post before locking. Set to `false` to disable
|
||||
lockComment: false
|
||||
|
||||
# Assign `resolved` as the reason for locking. Set to `false` to disable
|
||||
setLockReason: false
|
||||
|
||||
# Limit to only `issues` or `pulls`
|
||||
only: pulls
|
||||
|
||||
# Optionally, specify configuration settings just for `issues` or `pulls`
|
||||
issues:
|
||||
daysUntilLock: 30
|
||||
@@ -1,56 +0,0 @@
|
||||
# Configuration for probot-stale - https://github.com/probot/stale
|
||||
|
||||
# Number of days of inactivity before an Issue or Pull Request becomes stale
|
||||
daysUntilStale: 90
|
||||
|
||||
# Number of days of inactivity before an Issue or Pull Request with the stale label is closed.
|
||||
# Set to false to disable. If disabled, issues still need to be closed manually, but will remain marked as stale.
|
||||
daysUntilClose: 7
|
||||
|
||||
# Only issues or pull requests with all of these labels are check if stale. Defaults to `[]` (disabled)
|
||||
onlyLabels: []
|
||||
|
||||
# Issues or Pull Requests with these labels will never be considered stale. Set to `[]` to disable
|
||||
exemptLabels:
|
||||
- feature request
|
||||
- Help wanted
|
||||
- to do
|
||||
|
||||
# Set to true to ignore issues in a project (defaults to false)
|
||||
exemptProjects: true
|
||||
|
||||
# Set to true to ignore issues in a milestone (defaults to false)
|
||||
exemptMilestones: true
|
||||
|
||||
# Set to true to ignore issues with an assignee (defaults to false)
|
||||
exemptAssignees: false
|
||||
|
||||
# Label to use when marking as stale
|
||||
staleLabel: stale
|
||||
|
||||
# Comment to post when marking as stale. Set to `false` to disable
|
||||
markComment: >
|
||||
There hasn't been any activity on this issue recently. Due to the high number
|
||||
of incoming GitHub notifications, we have to clean some of the old issues,
|
||||
as many of them have already been resolved with the latest updates.
|
||||
|
||||
Please make sure to update to the latest Home Assistant version and check
|
||||
if that solves the issue. Let us know if that works for you by adding a
|
||||
comment 👍
|
||||
|
||||
This issue now has been marked as stale and will be closed if no further
|
||||
activity occurs. Thank you for your contributions.
|
||||
|
||||
# Comment to post when removing the stale label.
|
||||
# unmarkComment: >
|
||||
# Your comment here.
|
||||
|
||||
# Comment to post when closing a stale Issue or Pull Request.
|
||||
# closeComment: >
|
||||
# Your comment here.
|
||||
|
||||
# Limit the number of actions per hour, from 1-30. Default is 30
|
||||
limitPerRun: 30
|
||||
|
||||
# Limit to only `issues` or `pulls`
|
||||
only: issues
|
||||
@@ -0,0 +1,60 @@
|
||||
name: "CodeQL"
|
||||
|
||||
on:
|
||||
push:
|
||||
branches: [dev, master]
|
||||
pull_request:
|
||||
# The branches below must be a subset of the branches above
|
||||
branches: [dev]
|
||||
|
||||
jobs:
|
||||
analyze:
|
||||
name: Analyze
|
||||
runs-on: ubuntu-latest
|
||||
|
||||
strategy:
|
||||
fail-fast: false
|
||||
matrix:
|
||||
# Override automatic language detection by changing the below list
|
||||
# Supported options are ['csharp', 'cpp', 'go', 'java', 'javascript', 'python']
|
||||
language: ['javascript']
|
||||
# Learn more...
|
||||
# https://docs.github.com/en/github/finding-security-vulnerabilities-and-errors-in-your-code/configuring-code-scanning#overriding-automatic-language-detection
|
||||
|
||||
steps:
|
||||
- name: Checkout repository
|
||||
uses: actions/checkout@v2
|
||||
with:
|
||||
# We must fetch at least the immediate parents so that if this is
|
||||
# a pull request then we can checkout the head.
|
||||
fetch-depth: 2
|
||||
|
||||
# If this run was triggered by a pull request event, then checkout
|
||||
# the head of the pull request instead of the merge commit.
|
||||
- run: git checkout HEAD^2
|
||||
if: ${{ github.event_name == 'pull_request' }}
|
||||
|
||||
# Initializes the CodeQL tools for scanning.
|
||||
- name: Initialize CodeQL
|
||||
uses: github/codeql-action/init@v1
|
||||
with:
|
||||
languages: ${{ matrix.language }}
|
||||
|
||||
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
|
||||
# If this step fails, then you should remove it and run the build manually (see below)
|
||||
- name: Autobuild
|
||||
uses: github/codeql-action/autobuild@v1
|
||||
|
||||
# ℹ️ Command-line programs to run using the OS shell.
|
||||
# 📚 https://git.io/JvXDl
|
||||
|
||||
# ✏️ If the Autobuild fails above, remove it and uncomment the following three lines
|
||||
# and modify them (or add more) to build your code if your project
|
||||
# uses a compiled language
|
||||
|
||||
#- run: |
|
||||
# make bootstrap
|
||||
# make release
|
||||
|
||||
- name: Perform CodeQL Analysis
|
||||
uses: github/codeql-action/analyze@v1
|
||||
@@ -0,0 +1,20 @@
|
||||
name: Lock
|
||||
|
||||
# yamllint disable-line rule:truthy
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 * * * *"
|
||||
|
||||
jobs:
|
||||
lock:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- uses: dessant/lock-threads@v2.0.1
|
||||
with:
|
||||
github-token: ${{ github.token }}
|
||||
issue-lock-inactive-days: "30"
|
||||
issue-exclude-created-before: "2020-10-01T00:00:00Z"
|
||||
issue-lock-reason: ""
|
||||
pr-lock-inactive-days: "1"
|
||||
pr-exclude-created-before: "2020-11-01T00:00:00Z"
|
||||
pr-lock-reason: ""
|
||||
@@ -0,0 +1,42 @@
|
||||
name: Stale
|
||||
|
||||
# yamllint disable-line rule:truthy
|
||||
on:
|
||||
schedule:
|
||||
- cron: "0 * * * *"
|
||||
|
||||
jobs:
|
||||
stale:
|
||||
runs-on: ubuntu-latest
|
||||
steps:
|
||||
- name: 90 days stale policy
|
||||
uses: actions/stale@v3.0.13
|
||||
with:
|
||||
repo-token: ${{ secrets.GITHUB_TOKEN }}
|
||||
days-before-stale: 90
|
||||
days-before-close: 7
|
||||
operations-per-run: 25
|
||||
remove-stale-when-updated: true
|
||||
stale-issue-label: "stale"
|
||||
exempt-issue-labels: "no-stale,Help%20wanted,help-wanted,feature-request,feature%20request"
|
||||
stale-issue-message: >
|
||||
There hasn't been any activity on this issue recently. Due to the
|
||||
high number of incoming GitHub notifications, we have to clean some
|
||||
of the old issues, as many of them have already been resolved with
|
||||
the latest updates.
|
||||
|
||||
Please make sure to update to the latest Home Assistant version and
|
||||
check if that solves the issue. Let us know if that works for you by
|
||||
adding a comment 👍
|
||||
|
||||
This issue has now been marked as stale and will be closed if no
|
||||
further activity occurs. Thank you for your contributions.
|
||||
|
||||
stale-pr-label: "stale"
|
||||
exempt-pr-labels: "no-stale"
|
||||
stale-pr-message: >
|
||||
There hasn't been any activity on this pull request recently. This
|
||||
pull request has been automatically marked as stale because of that
|
||||
and will be closed if no further activity occurs within 7 days.
|
||||
|
||||
Thank you for your contributions.
|
||||
@@ -23,6 +23,8 @@ dist
|
||||
# vscode
|
||||
.vscode/*
|
||||
!.vscode/extensions.json
|
||||
!.vscode/launch.json
|
||||
!.vscode/tasks.json
|
||||
|
||||
# Cast dev settings
|
||||
src/cast/dev_const.ts
|
||||
@@ -33,3 +35,6 @@ yarn-error.log
|
||||
|
||||
#asdf
|
||||
.tool-versions
|
||||
|
||||
# Home Assistant config
|
||||
/config
|
||||
|
||||
@@ -1,6 +0,0 @@
|
||||
jshint:
|
||||
enabled: false
|
||||
|
||||
eslint:
|
||||
enabled: true
|
||||
config_file: .eslintrc-hound.json
|
||||
@@ -0,0 +1,44 @@
|
||||
{
|
||||
// https://github.com/microsoft/vscode-js-debug/blob/master/OPTIONS.md
|
||||
"configurations": [
|
||||
{
|
||||
"name": "Debug Frontend",
|
||||
"request": "launch",
|
||||
"type": "pwa-chrome",
|
||||
"url": "http://localhost:8123/",
|
||||
"webRoot": "${workspaceFolder}/hass_frontend",
|
||||
"disableNetworkCache": true,
|
||||
"preLaunchTask": "Develop Frontend",
|
||||
"outFiles": [
|
||||
"${workspaceFolder}/hass_frontend/frontend_latest/*.js"
|
||||
]
|
||||
},
|
||||
{
|
||||
"name": "Debug Gallery",
|
||||
"request": "launch",
|
||||
"type": "pwa-chrome",
|
||||
"url": "http://localhost:8100/",
|
||||
"webRoot": "${workspaceFolder}/gallery/dist",
|
||||
"disableNetworkCache": true,
|
||||
"preLaunchTask": "Develop Gallery"
|
||||
},
|
||||
{
|
||||
"name": "Debug Demo",
|
||||
"request": "launch",
|
||||
"type": "pwa-chrome",
|
||||
"url": "http://localhost:8090/",
|
||||
"webRoot": "${workspaceFolder}/demo/dist",
|
||||
"disableNetworkCache": true,
|
||||
"preLaunchTask": "Develop Demo"
|
||||
},
|
||||
{
|
||||
"name": "Debug Cast",
|
||||
"request": "launch",
|
||||
"type": "pwa-chrome",
|
||||
"url": "http://localhost:8080/",
|
||||
"webRoot": "${workspaceFolder}/cast/dist",
|
||||
"disableNetworkCache": true,
|
||||
"preLaunchTask": "Develop Cast"
|
||||
},
|
||||
]
|
||||
}
|
||||
@@ -0,0 +1,208 @@
|
||||
{
|
||||
"version": "2.0.0",
|
||||
"tasks": [
|
||||
{
|
||||
"label": "Develop Frontend",
|
||||
"type": "gulp",
|
||||
"task": "develop-app",
|
||||
// Sync changes here to other tasks until issue resolved
|
||||
// https://github.com/Microsoft/vscode/issues/61497
|
||||
"problemMatcher": {
|
||||
"owner": "ha-build",
|
||||
"source": "ha-build",
|
||||
"fileLocation": "absolute",
|
||||
"severity": "error",
|
||||
"pattern": [
|
||||
{
|
||||
"regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)",
|
||||
"severity": 1,
|
||||
"file": 2,
|
||||
"message": 3,
|
||||
"line": 4,
|
||||
"column": 5
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": "Changes detected. Starting compilation",
|
||||
"endsPattern": "Build done @"
|
||||
}
|
||||
},
|
||||
"isBackground": true,
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
},
|
||||
"runOptions": {
|
||||
"instanceLimit": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "Develop Supervisor panel",
|
||||
"type": "gulp",
|
||||
"task": "develop-hassio",
|
||||
"problemMatcher": {
|
||||
"owner": "ha-build",
|
||||
"source": "ha-build",
|
||||
"fileLocation": "absolute",
|
||||
"severity": "error",
|
||||
"pattern": [
|
||||
{
|
||||
"regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)",
|
||||
"severity": 1,
|
||||
"file": 2,
|
||||
"message": 3,
|
||||
"line": 4,
|
||||
"column": 5
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": "Changes detected. Starting compilation",
|
||||
"endsPattern": "Build done @"
|
||||
}
|
||||
},
|
||||
"isBackground": true,
|
||||
"group": "build",
|
||||
"runOptions": {
|
||||
"instanceLimit": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "Develop Gallery",
|
||||
"type": "gulp",
|
||||
"task": "develop-gallery",
|
||||
"problemMatcher": {
|
||||
"owner": "ha-build",
|
||||
"source": "ha-build",
|
||||
"fileLocation": "absolute",
|
||||
"severity": "error",
|
||||
"pattern": [
|
||||
{
|
||||
"regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)",
|
||||
"severity": 1,
|
||||
"file": 2,
|
||||
"message": 3,
|
||||
"line": 4,
|
||||
"column": 5
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": "Changes detected. Starting compilation",
|
||||
"endsPattern": "Build done @"
|
||||
}
|
||||
},
|
||||
|
||||
"isBackground": true,
|
||||
"group": "build",
|
||||
"runOptions": {
|
||||
"instanceLimit": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "Develop Demo",
|
||||
"type": "gulp",
|
||||
"task": "develop-demo",
|
||||
"problemMatcher": {
|
||||
"owner": "ha-build",
|
||||
"source": "ha-build",
|
||||
"fileLocation": "absolute",
|
||||
"severity": "error",
|
||||
"pattern": [
|
||||
{
|
||||
"regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)",
|
||||
"severity": 1,
|
||||
"file": 2,
|
||||
"message": 3,
|
||||
"line": 4,
|
||||
"column": 5
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": "Changes detected. Starting compilation",
|
||||
"endsPattern": "Build done @"
|
||||
}
|
||||
},
|
||||
|
||||
"isBackground": true,
|
||||
"group": "build",
|
||||
"runOptions": {
|
||||
"instanceLimit": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "Develop Cast",
|
||||
"type": "gulp",
|
||||
"task": "develop-cast",
|
||||
"problemMatcher": {
|
||||
"owner": "ha-build",
|
||||
"source": "ha-build",
|
||||
"fileLocation": "absolute",
|
||||
"severity": "error",
|
||||
"pattern": [
|
||||
{
|
||||
"regexp": "(SyntaxError): (.+): (.+) \\((\\d+):(\\d+)\\)",
|
||||
"severity": 1,
|
||||
"file": 2,
|
||||
"message": 3,
|
||||
"line": 4,
|
||||
"column": 5
|
||||
}
|
||||
],
|
||||
"background": {
|
||||
"activeOnStart": true,
|
||||
"beginsPattern": "Changes detected. Starting compilation",
|
||||
"endsPattern": "Build done @"
|
||||
}
|
||||
},
|
||||
|
||||
"isBackground": true,
|
||||
"group": "build",
|
||||
"runOptions": {
|
||||
"instanceLimit": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "Run HA Core in devcontainer",
|
||||
"type": "shell",
|
||||
"command": "script/core",
|
||||
"isBackground": true,
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
},
|
||||
"problemMatcher": [],
|
||||
"runOptions": {
|
||||
"instanceLimit": 1
|
||||
}
|
||||
},
|
||||
{
|
||||
"label": "Run HA Core for Supervisor in devcontainer",
|
||||
"type": "shell",
|
||||
"command": "HASSIO=${input:supervisorHost} HASSIO_TOKEN=${input:supervisorToken} script/core",
|
||||
"isBackground": true,
|
||||
"group": {
|
||||
"kind": "build",
|
||||
"isDefault": true
|
||||
},
|
||||
"problemMatcher": [],
|
||||
"runOptions": {
|
||||
"instanceLimit": 1
|
||||
}
|
||||
}
|
||||
],
|
||||
"inputs": [
|
||||
{
|
||||
"id": "supervisorHost",
|
||||
"type": "promptString",
|
||||
"description": "The IP of the Supervisor host running the Remote API proxy add-on"
|
||||
},
|
||||
{
|
||||
"id": "supervisorToken",
|
||||
"type": "promptString",
|
||||
"description": "The token for the Remote API proxy add-on"
|
||||
}
|
||||
]
|
||||
}
|
||||
@@ -14,7 +14,7 @@ This is the repository for the official [Home Assistant](https://home-assistant.
|
||||
- Development: [Instructions](https://developers.home-assistant.io/docs/frontend/development/)
|
||||
- Production build: `script/build_frontend`
|
||||
- Gallery: `cd gallery && script/develop_gallery`
|
||||
- Hass.io: [Instructions](https://developers.home-assistant.io/docs/en/hassio_hass.html)
|
||||
- Supervisor: [Instructions](https://developers.home-assistant.io/docs/supervisor/developing)
|
||||
|
||||
## Frontend development
|
||||
|
||||
@@ -26,4 +26,4 @@ A complete guide can be found at the following [link](https://www.home-assistant
|
||||
|
||||
Home Assistant is open-source and Apache 2 licensed. Feel free to browse the repository, learn and reuse parts in your own projects.
|
||||
|
||||
We use [BrowserStack](https://www.browserstack.com) to test Home Assistant on a large variation of devices.
|
||||
We use [BrowserStack](https://www.browserstack.com) to test Home Assistant on a large variety of devices.
|
||||
|
||||
@@ -0,0 +1,39 @@
|
||||
# Bundling Home Assistant Frontend
|
||||
|
||||
The Home Assistant build pipeline contains various steps to prepare a build.
|
||||
|
||||
- Generating icon files to be included
|
||||
- Generating translation files to be included
|
||||
- Converting TypeScript, CSS and JSON files to JavaScript
|
||||
- Bundling
|
||||
- Minifying the files
|
||||
- Generating the HTML entrypoint files
|
||||
- Generating the service worker
|
||||
- Compressing the files
|
||||
|
||||
## Converting files
|
||||
|
||||
Currently in Home Assistant we use a bundler to convert TypeScript, CSS and JSON files to JavaScript files that the browser understands.
|
||||
|
||||
We currently rely on Webpack but also have experimental Rollup support. Both of these programs bundle the converted files in both production and development.
|
||||
|
||||
For development, bundling is optional. We just want to get the right files in the browser.
|
||||
|
||||
Responsibilities of the converter during development:
|
||||
|
||||
- Convert TypeScript to JavaScript
|
||||
- Convert CSS to JavaScript that sets the content as the default export
|
||||
- Convert JSON to JavaScript that sets the content as the default export
|
||||
- Make sure import, dynamic import and web worker references work
|
||||
- Add extensions where missing
|
||||
- Resolve absolute package imports
|
||||
- Filter out specific imports/packages
|
||||
- Replace constants with values
|
||||
|
||||
In production, the following responsibilities are added:
|
||||
|
||||
- Minify HTML
|
||||
- Bundle multiple imports so that the browser can fetch less files
|
||||
- Generate a second version that is ES5 compatible
|
||||
|
||||
Configuration for all these steps are specified in [bundle.js](bundle.js).
|
||||
@@ -44,7 +44,7 @@ module.exports.definedVars = ({ isProdBuild, latestBuild, defineOverlay }) => ({
|
||||
});
|
||||
|
||||
module.exports.terserOptions = (latestBuild) => ({
|
||||
safari10: true,
|
||||
safari10: !latestBuild,
|
||||
ecma: latestBuild ? undefined : 5,
|
||||
output: { comments: false },
|
||||
});
|
||||
@@ -52,7 +52,13 @@ module.exports.terserOptions = (latestBuild) => ({
|
||||
module.exports.babelOptions = ({ latestBuild }) => ({
|
||||
babelrc: false,
|
||||
presets: [
|
||||
!latestBuild && [require("@babel/preset-env").default, { modules: false }],
|
||||
!latestBuild && [
|
||||
require("@babel/preset-env").default,
|
||||
{
|
||||
useBuiltIns: "entry",
|
||||
corejs: "3.6",
|
||||
},
|
||||
],
|
||||
require("@babel/preset-typescript").default,
|
||||
].filter(Boolean),
|
||||
plugins: [
|
||||
@@ -62,7 +68,8 @@ module.exports.babelOptions = ({ latestBuild }) => ({
|
||||
{ loose: true, useBuiltIns: true },
|
||||
],
|
||||
// Only support the syntax, Webpack will handle it.
|
||||
"@babel/syntax-dynamic-import",
|
||||
"@babel/plugin-syntax-import-meta",
|
||||
"@babel/plugin-syntax-dynamic-import",
|
||||
"@babel/plugin-proposal-optional-chaining",
|
||||
"@babel/plugin-proposal-nullish-coalescing-operator",
|
||||
[
|
||||
@@ -110,7 +117,7 @@ BundleConfig {
|
||||
*/
|
||||
|
||||
module.exports.config = {
|
||||
app({ isProdBuild, latestBuild, isStatsBuild }) {
|
||||
app({ isProdBuild, latestBuild, isStatsBuild, isWDS }) {
|
||||
return {
|
||||
entry: {
|
||||
service_worker: "./src/entrypoints/service_worker.ts",
|
||||
@@ -125,6 +132,7 @@ module.exports.config = {
|
||||
isProdBuild,
|
||||
latestBuild,
|
||||
isStatsBuild,
|
||||
isWDS,
|
||||
};
|
||||
},
|
||||
|
||||
@@ -178,7 +186,6 @@ module.exports.config = {
|
||||
publicPath: publicPath(latestBuild, paths.hassio_publicPath),
|
||||
isProdBuild,
|
||||
latestBuild,
|
||||
dontHash: new Set(["entrypoint"]),
|
||||
};
|
||||
},
|
||||
|
||||
|
||||
@@ -6,6 +6,9 @@ module.exports = {
|
||||
useRollup() {
|
||||
return process.env.ROLLUP === "1";
|
||||
},
|
||||
useWDS() {
|
||||
return process.env.WDS === "1";
|
||||
},
|
||||
isProdBuild() {
|
||||
return (
|
||||
process.env.NODE_ENV === "production" || module.exports.isStatsBuild()
|
||||
|
||||
@@ -12,6 +12,7 @@ require("./webpack.js");
|
||||
require("./service-worker.js");
|
||||
require("./entry-html.js");
|
||||
require("./rollup.js");
|
||||
require("./wds.js");
|
||||
|
||||
gulp.task(
|
||||
"develop-app",
|
||||
@@ -28,7 +29,11 @@ gulp.task(
|
||||
"build-translations"
|
||||
),
|
||||
"copy-static-app",
|
||||
env.useRollup() ? "rollup-watch-app" : "webpack-watch-app"
|
||||
env.useWDS()
|
||||
? "wds-watch-app"
|
||||
: env.useRollup()
|
||||
? "rollup-watch-app"
|
||||
: "webpack-watch-app"
|
||||
)
|
||||
);
|
||||
|
||||
|
||||
@@ -19,6 +19,7 @@ const renderTemplate = (pth, data = {}, pathFunc = templatePath) => {
|
||||
return compiled({
|
||||
...data,
|
||||
useRollup: env.useRollup(),
|
||||
useWDS: env.useWDS(),
|
||||
renderTemplate,
|
||||
});
|
||||
};
|
||||
@@ -90,12 +91,23 @@ gulp.task("gen-pages-prod", (done) => {
|
||||
});
|
||||
|
||||
gulp.task("gen-index-app-dev", (done) => {
|
||||
// In dev mode we don't mangle names, so we hardcode urls. That way we can
|
||||
// run webpack as last in watch mode, which blocks output.
|
||||
let latestAppJS, latestCoreJS, latestCustomPanelJS;
|
||||
|
||||
if (env.useWDS()) {
|
||||
latestAppJS = "http://localhost:8000/src/entrypoints/app.ts";
|
||||
latestCoreJS = "http://localhost:8000/src/entrypoints/core.ts";
|
||||
latestCustomPanelJS =
|
||||
"http://localhost:8000/src/entrypoints/custom-panel.ts";
|
||||
} else {
|
||||
latestAppJS = "/frontend_latest/app.js";
|
||||
latestCoreJS = "/frontend_latest/core.js";
|
||||
latestCustomPanelJS = "/frontend_latest/custom-panel.js";
|
||||
}
|
||||
|
||||
const content = renderTemplate("index", {
|
||||
latestAppJS: "/frontend_latest/app.js",
|
||||
latestCoreJS: "/frontend_latest/core.js",
|
||||
latestCustomPanelJS: "/frontend_latest/custom-panel.js",
|
||||
latestAppJS,
|
||||
latestCoreJS,
|
||||
latestCustomPanelJS,
|
||||
|
||||
es5AppJS: "/frontend_es5/app.js",
|
||||
es5CoreJS: "/frontend_es5/core.js",
|
||||
@@ -201,8 +213,6 @@ gulp.task("gen-index-cast-prod", (done) => {
|
||||
});
|
||||
|
||||
gulp.task("gen-index-demo-dev", (done) => {
|
||||
// In dev mode we don't mangle names, so we hardcode urls. That way we can
|
||||
// run webpack as last in watch mode, which blocks output.
|
||||
const content = renderDemoTemplate("index", {
|
||||
latestDemoJS: "/frontend_latest/main.js",
|
||||
|
||||
@@ -240,8 +250,6 @@ gulp.task("gen-index-demo-prod", (done) => {
|
||||
});
|
||||
|
||||
gulp.task("gen-index-gallery-dev", (done) => {
|
||||
// In dev mode we don't mangle names, so we hardcode urls. That way we can
|
||||
// run webpack as last in watch mode, which blocks output.
|
||||
const content = renderGalleryTemplate("index", {
|
||||
latestGalleryJS: "./frontend_latest/entrypoint.js",
|
||||
});
|
||||
@@ -269,3 +277,42 @@ gulp.task("gen-index-gallery-prod", (done) => {
|
||||
);
|
||||
done();
|
||||
});
|
||||
|
||||
gulp.task("gen-index-hassio-dev", async () => {
|
||||
writeHassioEntrypoint(
|
||||
`${paths.hassio_publicPath}/frontend_latest/entrypoint.js`,
|
||||
`${paths.hassio_publicPath}/frontend_es5/entrypoint.js`
|
||||
);
|
||||
});
|
||||
|
||||
gulp.task("gen-index-hassio-prod", async () => {
|
||||
const latestManifest = require(path.resolve(
|
||||
paths.hassio_output_latest,
|
||||
"manifest.json"
|
||||
));
|
||||
const es5Manifest = require(path.resolve(
|
||||
paths.hassio_output_es5,
|
||||
"manifest.json"
|
||||
));
|
||||
writeHassioEntrypoint(
|
||||
latestManifest["entrypoint.js"],
|
||||
es5Manifest["entrypoint.js"]
|
||||
);
|
||||
});
|
||||
|
||||
function writeHassioEntrypoint(latestEntrypoint, es5Entrypoint) {
|
||||
fs.mkdirSync(paths.hassio_output_root, { recursive: true });
|
||||
fs.writeFileSync(
|
||||
path.resolve(paths.hassio_output_root, "entrypoint.js"),
|
||||
`
|
||||
try {
|
||||
new Function("import('${latestEntrypoint}')")();
|
||||
} catch (err) {
|
||||
var el = document.createElement('script');
|
||||
el.src = '${es5Entrypoint}';
|
||||
document.body.appendChild(el);
|
||||
}
|
||||
`,
|
||||
{ encoding: "utf-8" }
|
||||
);
|
||||
}
|
||||
|
||||
@@ -11,6 +11,7 @@ const META_PATH = path.resolve(ICON_PACKAGE_PATH, "meta.json");
|
||||
const PACKAGE_PATH = path.resolve(ICON_PACKAGE_PATH, "package.json");
|
||||
const ICON_PATH = path.resolve(ICON_PACKAGE_PATH, "svg");
|
||||
const OUTPUT_DIR = path.resolve(__dirname, "../../build/mdi");
|
||||
const REMOVED_ICONS_PATH = path.resolve(__dirname, "../removedIcons.json");
|
||||
|
||||
const encoding = "utf8";
|
||||
|
||||
@@ -25,6 +26,13 @@ const getMeta = () => {
|
||||
});
|
||||
};
|
||||
|
||||
const addRemovedMeta = (meta) => {
|
||||
const file = fs.readFileSync(REMOVED_ICONS_PATH, { encoding });
|
||||
const removed = JSON.parse(file);
|
||||
const combinedMeta = [...meta, ...removed];
|
||||
return combinedMeta.sort((a, b) => a.name.localeCompare(b.name));
|
||||
};
|
||||
|
||||
const splitBySize = (meta) => {
|
||||
const chunks = [];
|
||||
const CHUNK_SIZE = 50000;
|
||||
@@ -69,7 +77,7 @@ const findDifferentiator = (curString, prevString) => {
|
||||
};
|
||||
|
||||
gulp.task("gen-icons-json", (done) => {
|
||||
const meta = getMeta();
|
||||
const meta = addRemovedMeta(getMeta());
|
||||
const split = splitBySize(meta);
|
||||
|
||||
if (!fs.existsSync(OUTPUT_DIR)) {
|
||||
|
||||
@@ -11,24 +11,6 @@ require("./webpack.js");
|
||||
require("./compress.js");
|
||||
require("./rollup.js");
|
||||
|
||||
async function writeEntrypointJS() {
|
||||
// We ship two builds and we need to do feature detection on what version to load.
|
||||
fs.mkdirSync(paths.hassio_output_root, { recursive: true });
|
||||
fs.writeFileSync(
|
||||
path.resolve(paths.hassio_output_root, "entrypoint.js"),
|
||||
`
|
||||
try {
|
||||
new Function("import('${paths.hassio_publicPath}/frontend_latest/entrypoint.js')")();
|
||||
} catch (err) {
|
||||
var el = document.createElement('script');
|
||||
el.src = '${paths.hassio_publicPath}/frontend_es5/entrypoint.js';
|
||||
document.body.appendChild(el);
|
||||
}
|
||||
`,
|
||||
{ encoding: "utf-8" }
|
||||
);
|
||||
}
|
||||
|
||||
gulp.task(
|
||||
"develop-hassio",
|
||||
gulp.series(
|
||||
@@ -37,7 +19,7 @@ gulp.task(
|
||||
},
|
||||
"clean-hassio",
|
||||
"gen-icons-json",
|
||||
writeEntrypointJS,
|
||||
"gen-index-hassio-dev",
|
||||
env.useRollup() ? "rollup-watch-hassio" : "webpack-watch-hassio"
|
||||
)
|
||||
);
|
||||
@@ -51,7 +33,7 @@ gulp.task(
|
||||
"clean-hassio",
|
||||
"gen-icons-json",
|
||||
env.useRollup() ? "rollup-prod-hassio" : "webpack-prod-hassio",
|
||||
writeEntrypointJS,
|
||||
"gen-index-hassio-prod",
|
||||
...// Don't compress running tests
|
||||
(env.isTest() ? [] : ["compress-hassio"])
|
||||
)
|
||||
|
||||
@@ -7,7 +7,6 @@ const gulp = require("gulp");
|
||||
const fs = require("fs");
|
||||
const foreach = require("gulp-foreach");
|
||||
const merge = require("gulp-merge-json");
|
||||
const minify = require("gulp-jsonminify");
|
||||
const rename = require("gulp-rename");
|
||||
const transform = require("gulp-json-transform");
|
||||
const { mapFiles } = require("../util");
|
||||
@@ -34,21 +33,10 @@ String.prototype.rsplit = function (sep, maxsplit) {
|
||||
: split;
|
||||
};
|
||||
|
||||
// Panel translations which should be split from the core translations. These
|
||||
// should mirror the fragment definitions in polymer.json, so that we load
|
||||
// additional resources at equivalent points.
|
||||
const TRANSLATION_FRAGMENTS = [
|
||||
"config",
|
||||
"history",
|
||||
"logbook",
|
||||
"mailbox",
|
||||
"profile",
|
||||
"shopping-list",
|
||||
"page-authorize",
|
||||
"page-demo",
|
||||
"page-onboarding",
|
||||
"developer-tools",
|
||||
];
|
||||
// Panel translations which should be split from the core translations.
|
||||
const TRANSLATION_FRAGMENTS = Object.keys(
|
||||
require("../../src/translations/en.json").ui.panel
|
||||
);
|
||||
|
||||
function recursiveFlatten(prefix, data) {
|
||||
let output = {};
|
||||
@@ -301,7 +289,6 @@ gulp.task("build-flattened-translations", function () {
|
||||
return flatten(data);
|
||||
})
|
||||
)
|
||||
.pipe(minify())
|
||||
.pipe(
|
||||
rename((filePath) => {
|
||||
if (filePath.dirname === "core") {
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
// Tasks to run Rollup
|
||||
const gulp = require("gulp");
|
||||
const { startDevServer } = require("@web/dev-server");
|
||||
|
||||
gulp.task("wds-watch-app", () => {
|
||||
startDevServer({
|
||||
config: {
|
||||
watch: true,
|
||||
},
|
||||
});
|
||||
});
|
||||
@@ -18,6 +18,14 @@ const bothBuilds = (createConfigFunc, params) => [
|
||||
createConfigFunc({ ...params, latestBuild: false }),
|
||||
];
|
||||
|
||||
/**
|
||||
* @param {{
|
||||
* compiler: import("webpack").Compiler,
|
||||
* contentBase: string,
|
||||
* port: number,
|
||||
* listenHost?: string
|
||||
* }}
|
||||
*/
|
||||
const runDevServer = ({
|
||||
compiler,
|
||||
contentBase,
|
||||
@@ -33,10 +41,13 @@ const runDevServer = ({
|
||||
throw err;
|
||||
}
|
||||
// Server listening
|
||||
log("[webpack-dev-server]", `http://localhost:${port}`);
|
||||
log(
|
||||
"[webpack-dev-server]",
|
||||
`Project is running at http://localhost:${port}`
|
||||
);
|
||||
});
|
||||
|
||||
const handler = (done) => (err, stats) => {
|
||||
const doneHandler = (done) => (err, stats) => {
|
||||
if (err) {
|
||||
log.error(err.stack || err);
|
||||
if (err.details) {
|
||||
@@ -45,22 +56,31 @@ const handler = (done) => (err, stats) => {
|
||||
return;
|
||||
}
|
||||
|
||||
log(`Build done @ ${new Date().toLocaleTimeString()}`);
|
||||
|
||||
if (stats.hasErrors() || stats.hasWarnings()) {
|
||||
log.warn(stats.toString("minimal"));
|
||||
console.log(stats.toString("minimal"));
|
||||
}
|
||||
|
||||
log(`Build done @ ${new Date().toLocaleTimeString()}`);
|
||||
|
||||
if (done) {
|
||||
done();
|
||||
}
|
||||
};
|
||||
|
||||
const prodBuild = (conf) =>
|
||||
new Promise((resolve) => {
|
||||
webpack(
|
||||
conf,
|
||||
// Resolve promise when done. Because we pass a callback, webpack closes itself
|
||||
doneHandler(resolve)
|
||||
);
|
||||
});
|
||||
|
||||
gulp.task("webpack-watch-app", () => {
|
||||
// we are not calling done, so this command will run forever
|
||||
// This command will run forever because we don't close compiler
|
||||
webpack(createAppConfig({ isProdBuild: false, latestBuild: true })).watch(
|
||||
{ ignored: /build-translations/ },
|
||||
handler()
|
||||
doneHandler()
|
||||
);
|
||||
gulp.watch(
|
||||
path.join(paths.translations_src, "en.json"),
|
||||
@@ -68,15 +88,12 @@ gulp.task("webpack-watch-app", () => {
|
||||
);
|
||||
});
|
||||
|
||||
gulp.task(
|
||||
"webpack-prod-app",
|
||||
() =>
|
||||
new Promise((resolve) =>
|
||||
webpack(
|
||||
bothBuilds(createAppConfig, { isProdBuild: true }),
|
||||
handler(resolve)
|
||||
)
|
||||
)
|
||||
gulp.task("webpack-prod-app", () =>
|
||||
prodBuild(
|
||||
bothBuilds(createAppConfig, {
|
||||
isProdBuild: true,
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
gulp.task("webpack-dev-server-demo", () => {
|
||||
@@ -87,17 +104,12 @@ gulp.task("webpack-dev-server-demo", () => {
|
||||
});
|
||||
});
|
||||
|
||||
gulp.task(
|
||||
"webpack-prod-demo",
|
||||
() =>
|
||||
new Promise((resolve) =>
|
||||
webpack(
|
||||
bothBuilds(createDemoConfig, {
|
||||
isProdBuild: true,
|
||||
}),
|
||||
handler(resolve)
|
||||
)
|
||||
)
|
||||
gulp.task("webpack-prod-demo", () =>
|
||||
prodBuild(
|
||||
bothBuilds(createDemoConfig, {
|
||||
isProdBuild: true,
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
gulp.task("webpack-dev-server-cast", () => {
|
||||
@@ -110,41 +122,30 @@ gulp.task("webpack-dev-server-cast", () => {
|
||||
});
|
||||
});
|
||||
|
||||
gulp.task(
|
||||
"webpack-prod-cast",
|
||||
() =>
|
||||
new Promise((resolve) =>
|
||||
webpack(
|
||||
bothBuilds(createCastConfig, {
|
||||
isProdBuild: true,
|
||||
}),
|
||||
|
||||
handler(resolve)
|
||||
)
|
||||
)
|
||||
gulp.task("webpack-prod-cast", () =>
|
||||
prodBuild(
|
||||
bothBuilds(createCastConfig, {
|
||||
isProdBuild: true,
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
gulp.task("webpack-watch-hassio", () => {
|
||||
// we are not calling done, so this command will run forever
|
||||
// This command will run forever because we don't close compiler
|
||||
webpack(
|
||||
createHassioConfig({
|
||||
isProdBuild: false,
|
||||
latestBuild: true,
|
||||
})
|
||||
).watch({}, handler());
|
||||
).watch({}, doneHandler());
|
||||
});
|
||||
|
||||
gulp.task(
|
||||
"webpack-prod-hassio",
|
||||
() =>
|
||||
new Promise((resolve) =>
|
||||
webpack(
|
||||
bothBuilds(createHassioConfig, {
|
||||
isProdBuild: true,
|
||||
}),
|
||||
handler(resolve)
|
||||
)
|
||||
)
|
||||
gulp.task("webpack-prod-hassio", () =>
|
||||
prodBuild(
|
||||
bothBuilds(createHassioConfig, {
|
||||
isProdBuild: true,
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
gulp.task("webpack-dev-server-gallery", () => {
|
||||
@@ -156,17 +157,11 @@ gulp.task("webpack-dev-server-gallery", () => {
|
||||
});
|
||||
});
|
||||
|
||||
gulp.task(
|
||||
"webpack-prod-gallery",
|
||||
() =>
|
||||
new Promise((resolve) =>
|
||||
webpack(
|
||||
createGalleryConfig({
|
||||
isProdBuild: true,
|
||||
latestBuild: true,
|
||||
}),
|
||||
|
||||
handler(resolve)
|
||||
)
|
||||
)
|
||||
gulp.task("webpack-prod-gallery", () =>
|
||||
prodBuild(
|
||||
createGalleryConfig({
|
||||
isProdBuild: true,
|
||||
latestBuild: true,
|
||||
})
|
||||
)
|
||||
);
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
var path = require("path");
|
||||
const path = require("path");
|
||||
|
||||
module.exports = {
|
||||
polymer_dir: path.resolve(__dirname, ".."),
|
||||
@@ -34,6 +34,11 @@ module.exports = {
|
||||
|
||||
hassio_dir: path.resolve(__dirname, "../hassio"),
|
||||
hassio_output_root: path.resolve(__dirname, "../hassio/build"),
|
||||
hassio_output_latest: path.resolve(
|
||||
__dirname,
|
||||
"../hassio/build/frontend_latest"
|
||||
),
|
||||
hassio_output_es5: path.resolve(__dirname, "../hassio/build/frontend_es5"),
|
||||
hassio_publicPath: "/api/hassio/app",
|
||||
|
||||
translations_src: path.resolve(__dirname, "../src/translations"),
|
||||
|
||||
@@ -0,0 +1 @@
|
||||
[]
|
||||
@@ -1,5 +1,3 @@
|
||||
const path = require("path");
|
||||
|
||||
module.exports = function (userOptions = {}) {
|
||||
// Files need to be absolute paths.
|
||||
// This only works if the file has no exports
|
||||
|
||||
@@ -3,7 +3,7 @@ const path = require("path");
|
||||
const commonjs = require("@rollup/plugin-commonjs");
|
||||
const resolve = require("@rollup/plugin-node-resolve");
|
||||
const json = require("@rollup/plugin-json");
|
||||
const babel = require("rollup-plugin-babel");
|
||||
const babel = require("@rollup/plugin-babel").babel;
|
||||
const replace = require("@rollup/plugin-replace");
|
||||
const visualizer = require("rollup-plugin-visualizer");
|
||||
const { string } = require("rollup-plugin-string");
|
||||
@@ -31,6 +31,7 @@ const createRollupConfig = ({
|
||||
isStatsBuild,
|
||||
publicPath,
|
||||
dontHash,
|
||||
isWDS,
|
||||
}) => {
|
||||
return {
|
||||
/**
|
||||
@@ -61,6 +62,7 @@ const createRollupConfig = ({
|
||||
...bundle.babelOptions({ latestBuild }),
|
||||
extensions,
|
||||
exclude: bundle.babelExclude(),
|
||||
babelHelpers: isWDS ? "inline" : "bundled",
|
||||
}),
|
||||
string({
|
||||
// Import certain extensions as strings
|
||||
@@ -69,19 +71,21 @@ const createRollupConfig = ({
|
||||
replace(
|
||||
bundle.definedVars({ isProdBuild, latestBuild, defineOverlay })
|
||||
),
|
||||
manifest({
|
||||
publicPath,
|
||||
}),
|
||||
worker(),
|
||||
dontHashPlugin({ dontHash }),
|
||||
isProdBuild && terser(bundle.terserOptions(latestBuild)),
|
||||
isStatsBuild &&
|
||||
!isWDS &&
|
||||
manifest({
|
||||
publicPath,
|
||||
}),
|
||||
!isWDS && worker(),
|
||||
!isWDS && dontHashPlugin({ dontHash }),
|
||||
!isWDS && isProdBuild && terser(bundle.terserOptions(latestBuild)),
|
||||
!isWDS &&
|
||||
isStatsBuild &&
|
||||
visualizer({
|
||||
// https://github.com/btd/rollup-plugin-visualizer#options
|
||||
open: true,
|
||||
sourcemap: true,
|
||||
}),
|
||||
],
|
||||
].filter(Boolean),
|
||||
},
|
||||
/**
|
||||
* @type { import("rollup").OutputOptions }
|
||||
@@ -108,12 +112,13 @@ const createRollupConfig = ({
|
||||
};
|
||||
};
|
||||
|
||||
const createAppConfig = ({ isProdBuild, latestBuild, isStatsBuild }) => {
|
||||
const createAppConfig = ({ isProdBuild, latestBuild, isStatsBuild, isWDS }) => {
|
||||
return createRollupConfig(
|
||||
bundle.config.app({
|
||||
isProdBuild,
|
||||
latestBuild,
|
||||
isStatsBuild,
|
||||
isWDS,
|
||||
})
|
||||
);
|
||||
};
|
||||
|
||||
@@ -2,9 +2,23 @@ const webpack = require("webpack");
|
||||
const path = require("path");
|
||||
const TerserPlugin = require("terser-webpack-plugin");
|
||||
const ManifestPlugin = require("webpack-manifest-plugin");
|
||||
const WorkerPlugin = require("worker-plugin");
|
||||
const paths = require("./paths.js");
|
||||
const bundle = require("./bundle");
|
||||
const log = require("fancy-log");
|
||||
|
||||
class LogStartCompilePlugin {
|
||||
ignoredFirst = false;
|
||||
|
||||
apply(compiler) {
|
||||
compiler.hooks.beforeCompile.tap("LogStartCompilePlugin", () => {
|
||||
if (!this.ignoredFirst) {
|
||||
this.ignoredFirst = true;
|
||||
return;
|
||||
}
|
||||
log("Changes detected. Starting compilation");
|
||||
});
|
||||
}
|
||||
}
|
||||
|
||||
const createWebpackConfig = ({
|
||||
entry,
|
||||
@@ -22,6 +36,7 @@ const createWebpackConfig = ({
|
||||
const ignorePackages = bundle.ignorePackages({ latestBuild });
|
||||
return {
|
||||
mode: isProdBuild ? "production" : "development",
|
||||
target: ["web", latestBuild ? "es2017" : "es5"],
|
||||
devtool: isProdBuild
|
||||
? "cheap-module-source-map"
|
||||
: "eval-cheap-module-source-map",
|
||||
@@ -30,7 +45,7 @@ const createWebpackConfig = ({
|
||||
module: {
|
||||
rules: [
|
||||
{
|
||||
test: /\.js$|\.ts$/,
|
||||
test: /\.m?js$|\.ts$/,
|
||||
exclude: bundle.babelExclude(),
|
||||
use: {
|
||||
loader: "babel-loader",
|
||||
@@ -46,16 +61,13 @@ const createWebpackConfig = ({
|
||||
optimization: {
|
||||
minimizer: [
|
||||
new TerserPlugin({
|
||||
cache: true,
|
||||
parallel: true,
|
||||
extractComments: true,
|
||||
sourceMap: true,
|
||||
terserOptions: bundle.terserOptions(latestBuild),
|
||||
}),
|
||||
],
|
||||
},
|
||||
plugins: [
|
||||
new WorkerPlugin(),
|
||||
new ManifestPlugin({
|
||||
// Only include the JS of entrypoints
|
||||
filter: (file) => file.isInitial && !file.name.endsWith(".map"),
|
||||
@@ -99,7 +111,17 @@ const createWebpackConfig = ({
|
||||
new RegExp(bundle.emptyPackages({ latestBuild }).join("|")),
|
||||
path.resolve(paths.polymer_dir, "src/util/empty.js")
|
||||
),
|
||||
],
|
||||
// We need to change the import of the polyfill for EventTarget, so we replace the polyfill file with our customized one
|
||||
new webpack.NormalModuleReplacementPlugin(
|
||||
new RegExp(
|
||||
require.resolve(
|
||||
"lit-virtualizer/lib/uni-virtualizer/lib/polyfillLoaders/EventTarget.js"
|
||||
)
|
||||
),
|
||||
path.resolve(paths.polymer_dir, "src/resources/EventTarget-ponyfill.js")
|
||||
),
|
||||
!isProdBuild && new LogStartCompilePlugin(),
|
||||
].filter(Boolean),
|
||||
resolve: {
|
||||
extensions: [".ts", ".js", ".json"],
|
||||
},
|
||||
|
||||
|
Before Width: | Height: | Size: 18 KiB After Width: | Height: | Size: 16 KiB |
|
Before Width: | Height: | Size: 186 KiB After Width: | Height: | Size: 186 KiB |
|
Before Width: | Height: | Size: 68 KiB After Width: | Height: | Size: 68 KiB |
@@ -212,13 +212,8 @@
|
||||
Chromecast is a technology developed by Google, and is available on:
|
||||
</p>
|
||||
<ul>
|
||||
<li>Google Chrome (all platforms except on iOS)</li>
|
||||
<li>
|
||||
Microsoft Edge (all platforms,
|
||||
<a href="https://www.microsoftedgeinsider.com" target="_blank"
|
||||
>dev and canary builds only</a
|
||||
>)
|
||||
</li>
|
||||
<li>Google Chrome (all platforms except iOS)</li>
|
||||
<li>Microsoft Edge (all platforms)</li>
|
||||
</ul>
|
||||
</div>
|
||||
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
import "../../../src/resources/safari-14-attachshadow-patch";
|
||||
import "../../../src/resources/ha-style";
|
||||
import "../../../src/resources/roboto";
|
||||
import "./layout/hc-connect";
|
||||
|
||||
@@ -8,6 +8,7 @@ import {
|
||||
html,
|
||||
LitElement,
|
||||
property,
|
||||
internalProperty,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { CastManager } from "../../../../src/cast/cast_manager";
|
||||
@@ -28,7 +29,7 @@ import {
|
||||
getLovelaceCollection,
|
||||
LovelaceConfig,
|
||||
} from "../../../../src/data/lovelace";
|
||||
import "../../../../src/layouts/loading-screen";
|
||||
import "../../../../src/layouts/hass-loading-screen";
|
||||
import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config";
|
||||
import "./hc-layout";
|
||||
import "@material/mwc-button/mwc-button";
|
||||
@@ -41,13 +42,13 @@ class HcCast extends LitElement {
|
||||
|
||||
@property() public castManager!: CastManager;
|
||||
|
||||
@property() private askWrite = false;
|
||||
@internalProperty() private askWrite = false;
|
||||
|
||||
@property() private lovelaceConfig?: LovelaceConfig | null;
|
||||
@internalProperty() private lovelaceConfig?: LovelaceConfig | null;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
if (this.lovelaceConfig === undefined) {
|
||||
return html` <loading-screen></loading-screen>> `;
|
||||
return html` <hass-loading-screen no-toolbar></hass-loading-screen>> `;
|
||||
}
|
||||
|
||||
const error =
|
||||
|
||||
@@ -17,8 +17,8 @@ import {
|
||||
customElement,
|
||||
html,
|
||||
LitElement,
|
||||
property,
|
||||
TemplateResult,
|
||||
internalProperty,
|
||||
} from "lit-element";
|
||||
import { CastManager, getCastManager } from "../../../../src/cast/cast_manager";
|
||||
import { castSendShowDemo } from "../../../../src/cast/receiver_messages";
|
||||
@@ -27,7 +27,7 @@ import {
|
||||
saveTokens,
|
||||
} from "../../../../src/common/auth/token_storage";
|
||||
import "../../../../src/components/ha-icon";
|
||||
import "../../../../src/layouts/loading-screen";
|
||||
import "../../../../src/layouts/hass-loading-screen";
|
||||
import { registerServiceWorker } from "../../../../src/util/register-service-worker";
|
||||
import "./hc-layout";
|
||||
|
||||
@@ -60,19 +60,19 @@ const INTRO = html`
|
||||
|
||||
@customElement("hc-connect")
|
||||
export class HcConnect extends LitElement {
|
||||
@property() private loading = false;
|
||||
@internalProperty() private loading = false;
|
||||
|
||||
// If we had stored credentials but we cannot connect,
|
||||
// show a screen asking retry or logout.
|
||||
@property() private cannotConnect = false;
|
||||
@internalProperty() private cannotConnect = false;
|
||||
|
||||
@property() private error?: string | TemplateResult;
|
||||
@internalProperty() private error?: string | TemplateResult;
|
||||
|
||||
@property() private auth?: Auth;
|
||||
@internalProperty() private auth?: Auth;
|
||||
|
||||
@property() private connection?: Connection;
|
||||
@internalProperty() private connection?: Connection;
|
||||
|
||||
@property() private castManager?: CastManager | null;
|
||||
@internalProperty() private castManager?: CastManager | null;
|
||||
|
||||
private openDemo = false;
|
||||
|
||||
@@ -98,7 +98,7 @@ export class HcConnect extends LitElement {
|
||||
}
|
||||
|
||||
if (this.castManager === undefined || this.loading) {
|
||||
return html` <loading-screen></loading-screen> `;
|
||||
return html` <hass-loading-screen no-toolbar></hass-loading-screen> `;
|
||||
}
|
||||
|
||||
if (this.castManager === null) {
|
||||
|
||||
@@ -30,7 +30,7 @@ class HcLayout extends LitElement {
|
||||
<ha-card>
|
||||
<div class="layout">
|
||||
<img class="hero" src="/images/google-nest-hub.png" />
|
||||
<div class="card-header">
|
||||
<h1 class="card-header">
|
||||
Home Assistant Cast${this.subtitle ? ` – ${this.subtitle}` : ""}
|
||||
${this.auth
|
||||
? html`
|
||||
@@ -44,7 +44,7 @@ class HcLayout extends LitElement {
|
||||
</div>
|
||||
`
|
||||
: ""}
|
||||
</div>
|
||||
</h1>
|
||||
<slot></slot>
|
||||
</div>
|
||||
</ha-card>
|
||||
|
||||
@@ -6,13 +6,60 @@ import { castContext } from "./cast_context";
|
||||
import { HcMain } from "./layout/hc-main";
|
||||
import { ReceivedMessage } from "./types";
|
||||
|
||||
const controller = new HcMain();
|
||||
document.body.append(controller);
|
||||
const lovelaceController = new HcMain();
|
||||
document.body.append(lovelaceController);
|
||||
|
||||
const mediaPlayer = document.createElement("cast-media-player");
|
||||
mediaPlayer.style.display = "none";
|
||||
document.body.append(mediaPlayer);
|
||||
const playerStylesAdded = false;
|
||||
|
||||
let controls: HTMLElement | null;
|
||||
|
||||
const setTouchControlsVisibility = (visible: boolean) => {
|
||||
if (!castContext.getDeviceCapabilities().touch_input_supported) {
|
||||
return;
|
||||
}
|
||||
controls =
|
||||
controls ||
|
||||
(document.body.querySelector("touch-controls") as HTMLElement | null);
|
||||
if (controls) {
|
||||
controls.style.display = visible ? "initial" : "none";
|
||||
}
|
||||
};
|
||||
|
||||
const showLovelaceController = () => {
|
||||
mediaPlayer.style.display = "none";
|
||||
lovelaceController.style.display = "initial";
|
||||
document.body.setAttribute("style", "overflow-y: auto !important");
|
||||
setTouchControlsVisibility(false);
|
||||
};
|
||||
|
||||
const showMediaPlayer = () => {
|
||||
lovelaceController.style.display = "none";
|
||||
mediaPlayer.style.display = "initial";
|
||||
document.body.removeAttribute("style");
|
||||
setTouchControlsVisibility(true);
|
||||
if (!playerStylesAdded) {
|
||||
const style = document.createElement("style");
|
||||
style.innerHTML = `
|
||||
body {
|
||||
--logo-image: url('https://www.home-assistant.io/images/home-assistant-logo.svg');
|
||||
--logo-repeat: no-repeat;
|
||||
--playback-logo-image: url('https://www.home-assistant.io/images/home-assistant-logo.svg');
|
||||
--theme-hue: 200;
|
||||
--progress-color: #03a9f4;
|
||||
--splash-image: url('https://home-assistant.io/images/cast/splash.png');
|
||||
--splash-size: cover;
|
||||
}
|
||||
`;
|
||||
document.head.appendChild(style);
|
||||
}
|
||||
};
|
||||
|
||||
const options = new cast.framework.CastReceiverOptions();
|
||||
options.disableIdleTimeout = true;
|
||||
options.customNamespaces = {
|
||||
// @ts-ignore
|
||||
[CAST_NS]: cast.framework.system.MessageType.JSON,
|
||||
};
|
||||
|
||||
@@ -30,13 +77,61 @@ options.uiConfig = new cast.framework.ui.UiConfig();
|
||||
// @ts-ignore
|
||||
options.uiConfig.touchScreenOptimizedApp = true;
|
||||
|
||||
castContext.setInactivityTimeout(86400); // 1 day
|
||||
|
||||
castContext.addCustomMessageListener(
|
||||
CAST_NS,
|
||||
// @ts-ignore
|
||||
(ev: ReceivedMessage<HassMessage>) => {
|
||||
// We received a show Lovelace command, stop media from playing, hide media player and show Lovelace controller
|
||||
if (
|
||||
playerManager.getPlayerState() !==
|
||||
cast.framework.messages.PlayerState.IDLE
|
||||
) {
|
||||
playerManager.stop();
|
||||
} else {
|
||||
showLovelaceController();
|
||||
}
|
||||
const msg = ev.data;
|
||||
msg.senderId = ev.senderId;
|
||||
controller.processIncomingMessage(msg);
|
||||
lovelaceController.processIncomingMessage(msg);
|
||||
}
|
||||
);
|
||||
|
||||
const playerManager = castContext.getPlayerManager();
|
||||
|
||||
playerManager.setMessageInterceptor(
|
||||
cast.framework.messages.MessageType.LOAD,
|
||||
(loadRequestData) => {
|
||||
// We received a play media command, hide Lovelace and show media player
|
||||
showMediaPlayer();
|
||||
const media = loadRequestData.media;
|
||||
// Special handling if it came from Google Assistant
|
||||
if (media.entity) {
|
||||
media.contentId = media.entity;
|
||||
media.streamType = cast.framework.messages.StreamType.LIVE;
|
||||
media.contentType = "application/vnd.apple.mpegurl";
|
||||
// @ts-ignore
|
||||
media.hlsVideoSegmentFormat =
|
||||
cast.framework.messages.HlsVideoSegmentFormat.FMP4;
|
||||
}
|
||||
return loadRequestData;
|
||||
}
|
||||
);
|
||||
|
||||
playerManager.addEventListener(
|
||||
cast.framework.events.EventType.MEDIA_STATUS,
|
||||
(event) => {
|
||||
if (
|
||||
event.mediaStatus?.playerState ===
|
||||
cast.framework.messages.PlayerState.IDLE &&
|
||||
event.mediaStatus?.idleReason &&
|
||||
event.mediaStatus?.idleReason !==
|
||||
cast.framework.messages.IdleReason.INTERRUPTED
|
||||
) {
|
||||
// media finished or stopped, return to default Lovelace
|
||||
showLovelaceController();
|
||||
}
|
||||
}
|
||||
);
|
||||
|
||||
|
||||
@@ -1,4 +1,10 @@
|
||||
import { customElement, html, property, TemplateResult } from "lit-element";
|
||||
import {
|
||||
customElement,
|
||||
html,
|
||||
property,
|
||||
internalProperty,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { mockHistory } from "../../../../demo/src/stubs/history";
|
||||
import { LovelaceConfig } from "../../../../src/data/lovelace";
|
||||
import {
|
||||
@@ -13,9 +19,9 @@ import "./hc-lovelace";
|
||||
|
||||
@customElement("hc-demo")
|
||||
class HcDemo extends HassElement {
|
||||
@property() public lovelacePath!: string;
|
||||
@property({ attribute: false }) public lovelacePath!: string;
|
||||
|
||||
@property() private _lovelaceConfig?: LovelaceConfig;
|
||||
@internalProperty() private _lovelaceConfig?: LovelaceConfig;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
if (!this._lovelaceConfig) {
|
||||
|
||||
@@ -11,7 +11,7 @@ import { HomeAssistant } from "../../../../src/types";
|
||||
|
||||
@customElement("hc-launch-screen")
|
||||
class HcLaunchScreen extends LitElement {
|
||||
@property() public hass?: HomeAssistant;
|
||||
@property({ attribute: false }) public hass?: HomeAssistant;
|
||||
|
||||
@property() public error?: string;
|
||||
|
||||
|
||||
@@ -9,19 +9,20 @@ import {
|
||||
} from "lit-element";
|
||||
import { LovelaceConfig } from "../../../../src/data/lovelace";
|
||||
import { Lovelace } from "../../../../src/panels/lovelace/types";
|
||||
import "../../../../src/panels/lovelace/views/hui-panel-view";
|
||||
import "../../../../src/panels/lovelace/views/hui-view";
|
||||
import { HomeAssistant } from "../../../../src/types";
|
||||
import "./hc-launch-screen";
|
||||
|
||||
@customElement("hc-lovelace")
|
||||
class HcLovelace extends LitElement {
|
||||
@property() public hass!: HomeAssistant;
|
||||
@property({ attribute: false }) public hass!: HomeAssistant;
|
||||
|
||||
@property() public lovelaceConfig!: LovelaceConfig;
|
||||
@property({ attribute: false }) public lovelaceConfig!: LovelaceConfig;
|
||||
|
||||
@property() public viewPath?: string | number;
|
||||
|
||||
public urlPath?: string | null;
|
||||
|
||||
protected render(): TemplateResult {
|
||||
const index = this._viewIndex;
|
||||
if (index === undefined) {
|
||||
@@ -35,6 +36,7 @@ class HcLovelace extends LitElement {
|
||||
const lovelace: Lovelace = {
|
||||
config: this.lovelaceConfig,
|
||||
editMode: false,
|
||||
urlPath: this.urlPath!,
|
||||
enableFullEditMode: () => undefined,
|
||||
mode: "storage",
|
||||
language: "en",
|
||||
@@ -42,22 +44,13 @@ class HcLovelace extends LitElement {
|
||||
deleteConfig: async () => undefined,
|
||||
setEditMode: () => undefined,
|
||||
};
|
||||
return this.lovelaceConfig.views[index].panel
|
||||
? html`
|
||||
<hui-panel-view
|
||||
.hass=${this.hass}
|
||||
.lovelace=${lovelace}
|
||||
.config=${this.lovelaceConfig.views[index]}
|
||||
></hui-panel-view>
|
||||
`
|
||||
: html`
|
||||
<hui-view
|
||||
.hass=${this.hass}
|
||||
.lovelace=${lovelace}
|
||||
.index=${index}
|
||||
columns="2"
|
||||
></hui-view>
|
||||
`;
|
||||
return html`
|
||||
<hui-view
|
||||
.hass=${this.hass}
|
||||
.lovelace=${lovelace}
|
||||
.index=${index}
|
||||
></hui-view>
|
||||
`;
|
||||
}
|
||||
|
||||
protected updated(changedProps) {
|
||||
@@ -73,7 +66,7 @@ class HcLovelace extends LitElement {
|
||||
|
||||
if (configBackground) {
|
||||
(this.shadowRoot!.querySelector(
|
||||
"hui-view, hui-panel-view"
|
||||
"hui-view"
|
||||
) as HTMLElement)!.style.setProperty(
|
||||
"--lovelace-background",
|
||||
configBackground
|
||||
|
||||
@@ -3,7 +3,12 @@ import {
|
||||
getAuth,
|
||||
UnsubscribeFunc,
|
||||
} from "home-assistant-js-websocket";
|
||||
import { customElement, html, property, TemplateResult } from "lit-element";
|
||||
import {
|
||||
customElement,
|
||||
html,
|
||||
internalProperty,
|
||||
TemplateResult,
|
||||
} from "lit-element";
|
||||
import { CAST_NS } from "../../../../src/cast/const";
|
||||
import {
|
||||
ConnectMessage,
|
||||
@@ -31,13 +36,13 @@ let resourcesLoaded = false;
|
||||
|
||||
@customElement("hc-main")
|
||||
export class HcMain extends HassElement {
|
||||
@property() private _showDemo = false;
|
||||
@internalProperty() private _showDemo = false;
|
||||
|
||||
@property() private _lovelaceConfig?: LovelaceConfig;
|
||||
@internalProperty() private _lovelaceConfig?: LovelaceConfig;
|
||||
|
||||
@property() private _lovelacePath: string | number | null = null;
|
||||
@internalProperty() private _lovelacePath: string | number | null = null;
|
||||
|
||||
@property() private _error?: string;
|
||||
@internalProperty() private _error?: string;
|
||||
|
||||
private _unsubLovelace?: UnsubscribeFunc;
|
||||
|
||||
@@ -82,6 +87,7 @@ export class HcMain extends HassElement {
|
||||
.hass=${this.hass}
|
||||
.lovelaceConfig=${this._lovelaceConfig}
|
||||
.viewPath=${this._lovelacePath}
|
||||
.urlPath=${this._urlPath}
|
||||
@config-refresh=${this._generateLovelaceConfig}
|
||||
></hc-lovelace>
|
||||
`;
|
||||
@@ -210,9 +216,7 @@ export class HcMain extends HassElement {
|
||||
}
|
||||
this._showDemo = false;
|
||||
this._lovelacePath = msg.viewPath;
|
||||
if (castContext.getDeviceCapabilities().touch_input_supported) {
|
||||
this._breakFree();
|
||||
}
|
||||
|
||||
this._sendStatus();
|
||||
}
|
||||
|
||||
@@ -235,9 +239,6 @@ export class HcMain extends HassElement {
|
||||
this._showDemo = true;
|
||||
this._lovelacePath = "overview";
|
||||
this._sendStatus();
|
||||
if (castContext.getDeviceCapabilities().touch_input_supported) {
|
||||
this._breakFree();
|
||||
}
|
||||
});
|
||||
}
|
||||
|
||||
@@ -258,14 +259,6 @@ export class HcMain extends HassElement {
|
||||
}
|
||||
}
|
||||
|
||||
private _breakFree() {
|
||||
const controls = document.body.querySelector("touch-controls");
|
||||
if (controls) {
|
||||
controls.remove();
|
||||
}
|
||||
document.body.setAttribute("style", "overflow-y: auto !important");
|
||||
}
|
||||
|
||||
private sendMessage(senderId: string, response: any) {
|
||||
castContext.sendCustomMessage(CAST_NS, senderId, response);
|
||||
}
|
||||
|
||||
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 19 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 8.4 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 3.2 KiB After Width: | Height: | Size: 2.7 KiB |
|
Before Width: | Height: | Size: 5.7 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 3.1 KiB After Width: | Height: | Size: 2.6 KiB |
|
Before Width: | Height: | Size: 7.3 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 6.1 KiB After Width: | Height: | Size: 5.9 KiB |
|
Before Width: | Height: | Size: 7.7 KiB After Width: | Height: | Size: 7.6 KiB |
|
Before Width: | Height: | Size: 6.4 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.2 KiB |
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 7.9 KiB After Width: | Height: | Size: 7.7 KiB |
|
Before Width: | Height: | Size: 6.5 KiB After Width: | Height: | Size: 6.3 KiB |
|
Before Width: | Height: | Size: 1.8 KiB After Width: | Height: | Size: 1.5 KiB |
|
Before Width: | Height: | Size: 4.6 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 4.5 KiB After Width: | Height: | Size: 3.9 KiB |
|
Before Width: | Height: | Size: 5.5 KiB After Width: | Height: | Size: 5.2 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 7.9 KiB |
|
Before Width: | Height: | Size: 8.5 KiB After Width: | Height: | Size: 7.2 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 9.6 KiB |
|
Before Width: | Height: | Size: 3.7 KiB After Width: | Height: | Size: 3.1 KiB |
|
Before Width: | Height: | Size: 3.3 KiB After Width: | Height: | Size: 2.9 KiB |
|
Before Width: | Height: | Size: 9.9 KiB After Width: | Height: | Size: 8.7 KiB |
|
Before Width: | Height: | Size: 4.9 KiB After Width: | Height: | Size: 4.4 KiB |
|
Before Width: | Height: | Size: 767 B After Width: | Height: | Size: 532 B |
|
Before Width: | Height: | Size: 803 B After Width: | Height: | Size: 535 B |
|
Before Width: | Height: | Size: 75 KiB After Width: | Height: | Size: 75 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 56 KiB |
|
Before Width: | Height: | Size: 58 KiB After Width: | Height: | Size: 58 KiB |
|
Before Width: | Height: | Size: 71 KiB After Width: | Height: | Size: 71 KiB |
|
Before Width: | Height: | Size: 8.2 KiB After Width: | Height: | Size: 7.1 KiB |
|
Before Width: | Height: | Size: 33 KiB After Width: | Height: | Size: 32 KiB |
|
Before Width: | Height: | Size: 106 KiB After Width: | Height: | Size: 94 KiB |
|
Before Width: | Height: | Size: 60 KiB After Width: | Height: | Size: 60 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 61 KiB |
|
Before Width: | Height: | Size: 56 KiB After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 57 KiB After Width: | Height: | Size: 55 KiB |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 83 KiB After Width: | Height: | Size: 83 KiB |
|
Before Width: | Height: | Size: 30 KiB After Width: | Height: | Size: 30 KiB |
|
Before Width: | Height: | Size: 62 KiB After Width: | Height: | Size: 59 KiB |
|
Before Width: | Height: | Size: 23 KiB After Width: | Height: | Size: 23 KiB |
|
Before Width: | Height: | Size: 11 KiB After Width: | Height: | Size: 11 KiB |
|
Before Width: | Height: | Size: 375 B After Width: | Height: | Size: 184 B |
|
Before Width: | Height: | Size: 24 KiB After Width: | Height: | Size: 20 KiB |
|
Before Width: | Height: | Size: 46 KiB After Width: | Height: | Size: 46 KiB |
|
Before Width: | Height: | Size: 2.4 KiB After Width: | Height: | Size: 1.1 KiB |
|
Before Width: | Height: | Size: 2.3 KiB After Width: | Height: | Size: 1.0 KiB |
|
Before Width: | Height: | Size: 111 KiB After Width: | Height: | Size: 110 KiB |
|
Before Width: | Height: | Size: 20 KiB After Width: | Height: | Size: 19 KiB |
@@ -3,22 +3,10 @@ import { Lovelace } from "../../../src/panels/lovelace/types";
|
||||
import { DemoConfig } from "./types";
|
||||
|
||||
export const demoConfigs: Array<() => Promise<DemoConfig>> = [
|
||||
() =>
|
||||
import(/* webpackChunkName: "arsaboo" */ "./arsaboo").then(
|
||||
(mod) => mod.demoArsaboo
|
||||
),
|
||||
() =>
|
||||
import(/* webpackChunkName: "teachingbirds" */ "./teachingbirds").then(
|
||||
(mod) => mod.demoTeachingbirds
|
||||
),
|
||||
() =>
|
||||
import(/* webpackChunkName: "kernehed" */ "./kernehed").then(
|
||||
(mod) => mod.demoKernehed
|
||||
),
|
||||
() =>
|
||||
import(/* webpackChunkName: "jimpower" */ "./jimpower").then(
|
||||
(mod) => mod.demoJimpower
|
||||
),
|
||||
() => import("./arsaboo").then((mod) => mod.demoArsaboo),
|
||||
() => import("./teachingbirds").then((mod) => mod.demoTeachingbirds),
|
||||
() => import("./kernehed").then((mod) => mod.demoKernehed),
|
||||
() => import("./jimpower").then((mod) => mod.demoJimpower),
|
||||
];
|
||||
|
||||
// eslint-disable-next-line import/no-mutable-exports
|
||||
|
||||
@@ -26,9 +26,9 @@ export const demoThemeJimpower = () => ({
|
||||
"switch-checked-color": "var(--accent-color)",
|
||||
"paper-dialog-background-color": "#434954",
|
||||
"secondary-text-color": "#5294E2",
|
||||
"google-red-500": "#E45E65",
|
||||
"error-color": "#E45E65",
|
||||
"divider-color": "rgba(0, 0, 0, .12)",
|
||||
"google-green-500": "#39E949",
|
||||
"success-color": "#39E949",
|
||||
"switch-unchecked-button-color": "var(--disabled-text-color)",
|
||||
"label-badge-border-color": "green",
|
||||
"paper-listbox-color": "var(--primary-color)",
|
||||
|
||||