mirror of
https://github.com/home-assistant/frontend.git
synced 2025-08-16 20:59:26 +00:00
Compare commits
571 Commits
20240930.0
...
fix_new_sc
Author | SHA1 | Date | |
---|---|---|---|
![]() |
637eb6e894 | ||
![]() |
f688780677 | ||
![]() |
0ce98a86e6 | ||
![]() |
bf624f5ca7 | ||
![]() |
ce5ce37de7 | ||
![]() |
da727d3a3a | ||
![]() |
9d83cc6988 | ||
![]() |
ed625d4e0b | ||
![]() |
84157c8ea5 | ||
![]() |
8f19c0abb0 | ||
![]() |
008647aa7a | ||
![]() |
b86d6021da | ||
![]() |
98af479fd3 | ||
![]() |
d1c981bc19 | ||
![]() |
1b0e53d3d9 | ||
![]() |
0d49927541 | ||
![]() |
9e8d452438 | ||
![]() |
ddd646007e | ||
![]() |
787fba82bd | ||
![]() |
1393a3ade8 | ||
![]() |
bf24d67066 | ||
![]() |
9774deef6d | ||
![]() |
8390c6e29b | ||
![]() |
c78d371a9c | ||
![]() |
7750299a66 | ||
![]() |
43f31dd455 | ||
![]() |
df21900341 | ||
![]() |
6934f0626c | ||
![]() |
ea5bf17780 | ||
![]() |
0b7af715a8 | ||
![]() |
8579bee053 | ||
![]() |
400ddbf625 | ||
![]() |
5fdefc0c20 | ||
![]() |
c72c74828e | ||
![]() |
e0b157d280 | ||
![]() |
e02736b4e2 | ||
![]() |
af049274d9 | ||
![]() |
7a12fd2853 | ||
![]() |
f724d8e7a9 | ||
![]() |
0d7e0df194 | ||
![]() |
7d567bc386 | ||
![]() |
ad52386ae0 | ||
![]() |
512fee47b6 | ||
![]() |
4092f56ea5 | ||
![]() |
926972cce6 | ||
![]() |
d51eea7bb6 | ||
![]() |
a3ca889ca3 | ||
![]() |
a7406b3201 | ||
![]() |
b54057cc4b | ||
![]() |
d77dd5300e | ||
![]() |
9396d5cf8c | ||
![]() |
a78ddb50fd | ||
![]() |
64e8b636b9 | ||
![]() |
2c604ff946 | ||
![]() |
f8ce7c2ce1 | ||
![]() |
af1622e306 | ||
![]() |
3c03dfb322 | ||
![]() |
697a99f913 | ||
![]() |
06925f0716 | ||
![]() |
afcfdb5140 | ||
![]() |
6126280f2d | ||
![]() |
8e6f4886e8 | ||
![]() |
480de9ef03 | ||
![]() |
614c4ec404 | ||
![]() |
d43291ae52 | ||
![]() |
7c486ec969 | ||
![]() |
19f54b6ba2 | ||
![]() |
97cc9f9ab9 | ||
![]() |
a104d38fc9 | ||
![]() |
2582023ab2 | ||
![]() |
e731f060f1 | ||
![]() |
c3942d244d | ||
![]() |
f4ef4c628a | ||
![]() |
a0f3e4f785 | ||
![]() |
2c13c5a18c | ||
![]() |
22cfd40ccc | ||
![]() |
5c7d9b3fa3 | ||
![]() |
55b6aa09d9 | ||
![]() |
96395dd5e1 | ||
![]() |
7191edd3c6 | ||
![]() |
6169379f4c | ||
![]() |
5500dd1332 | ||
![]() |
5c681896f3 | ||
![]() |
d826113319 | ||
![]() |
f72b298f97 | ||
![]() |
90b7cad7ac | ||
![]() |
e0239486bc | ||
![]() |
e10fb3c168 | ||
![]() |
5ee8bee6dc | ||
![]() |
4b678ffb41 | ||
![]() |
82c23026b3 | ||
![]() |
94b7b60fe0 | ||
![]() |
e1553a7ccf | ||
![]() |
fb0ca49742 | ||
![]() |
97015788a2 | ||
![]() |
0cf05ea2cc | ||
![]() |
acbe77c0d6 | ||
![]() |
bede8c66c5 | ||
![]() |
de87aee15b | ||
![]() |
36312cc273 | ||
![]() |
3120184d63 | ||
![]() |
a1be9d923e | ||
![]() |
7dee34ca75 | ||
![]() |
f7c8c6e3e8 | ||
![]() |
3411967fd9 | ||
![]() |
125805d6d1 | ||
![]() |
e0e158b64c | ||
![]() |
078095db3f | ||
![]() |
8c7fcc725c | ||
![]() |
988fa3e4e4 | ||
![]() |
f9118a4b87 | ||
![]() |
164944ceff | ||
![]() |
bc195c61cc | ||
![]() |
f54bb20fef | ||
![]() |
71214351ca | ||
![]() |
0a954cf1c7 | ||
![]() |
2782b2fb1b | ||
![]() |
a532b4461d | ||
![]() |
dd7987e199 | ||
![]() |
81cc73ece3 | ||
![]() |
f9701b2363 | ||
![]() |
adb22abd7d | ||
![]() |
4df90ebbc3 | ||
![]() |
4655929fed | ||
![]() |
39b00f1063 | ||
![]() |
bd0bfc1fbe | ||
![]() |
09c5dab69f | ||
![]() |
25a7f6ebf7 | ||
![]() |
a5e12cb558 | ||
![]() |
a2927f281d | ||
![]() |
3c23c18faf | ||
![]() |
616bd065e0 | ||
![]() |
a525c44794 | ||
![]() |
2d3579c08a | ||
![]() |
6ef36dce3e | ||
![]() |
74bf1d2a82 | ||
![]() |
8ea2e3f471 | ||
![]() |
1b74e94f14 | ||
![]() |
536d2e0ab0 | ||
![]() |
c610778b0f | ||
![]() |
0791b1bc71 | ||
![]() |
c93f6f683a | ||
![]() |
999969b78d | ||
![]() |
10b8627f51 | ||
![]() |
528fcecd16 | ||
![]() |
f8fb5d7bf2 | ||
![]() |
3e02d95e01 | ||
![]() |
4ef6661532 | ||
![]() |
6cc6d9fb45 | ||
![]() |
43911ef3be | ||
![]() |
6b0afe6ebb | ||
![]() |
811977b366 | ||
![]() |
fc2e3b7bcf | ||
![]() |
6b8068a22a | ||
![]() |
2899388395 | ||
![]() |
4e63eacb79 | ||
![]() |
881ff13832 | ||
![]() |
79c7cf59ee | ||
![]() |
b82d880bfd | ||
![]() |
64374a4fcb | ||
![]() |
0e0be279ea | ||
![]() |
08a8e053d3 | ||
![]() |
7d9752abdf | ||
![]() |
0c382f1967 | ||
![]() |
7833a31eea | ||
![]() |
8e796e013a | ||
![]() |
757ed2e80c | ||
![]() |
d2665f1349 | ||
![]() |
84f7c62ee2 | ||
![]() |
a9d7082218 | ||
![]() |
766de17ea3 | ||
![]() |
8988bd519f | ||
![]() |
6ccd4fa431 | ||
![]() |
5b8e63a213 | ||
![]() |
6a337cc486 | ||
![]() |
f7f936cb54 | ||
![]() |
7252169325 | ||
![]() |
b7ef633a3e | ||
![]() |
995155696f | ||
![]() |
7996f4e0b2 | ||
![]() |
ac6e61b9b8 | ||
![]() |
b7f3e40340 | ||
![]() |
39b4e85dcd | ||
![]() |
37d2c6844a | ||
![]() |
b8e2298cdd | ||
![]() |
a3ff065c7a | ||
![]() |
a224d6c61b | ||
![]() |
cd0980d13e | ||
![]() |
13cb32a83f | ||
![]() |
12a9cf4b32 | ||
![]() |
8cce13163f | ||
![]() |
46a55630fa | ||
![]() |
c92bee4f1d | ||
![]() |
940cbd42c3 | ||
![]() |
39bf7c9ad4 | ||
![]() |
64c260c1c4 | ||
![]() |
36f3ef9e86 | ||
![]() |
42622fe21e | ||
![]() |
64f7afd60f | ||
![]() |
3282785cf2 | ||
![]() |
2c1931adb1 | ||
![]() |
c9cad254d2 | ||
![]() |
f4f2cce57e | ||
![]() |
556315b360 | ||
![]() |
bed470f79d | ||
![]() |
9acf946097 | ||
![]() |
231ef4b5b4 | ||
![]() |
f8bcc6dde4 | ||
![]() |
11ed4600fd | ||
![]() |
c0e2d6fa23 | ||
![]() |
942562161a | ||
![]() |
d35c40b585 | ||
![]() |
8cd0ddceb8 | ||
![]() |
c3ee49298a | ||
![]() |
89dc1a7ebc | ||
![]() |
ced70fd9a1 | ||
![]() |
253c8f358b | ||
![]() |
23b55484c3 | ||
![]() |
1990b8fa84 | ||
![]() |
03ea08f98c | ||
![]() |
1f5f6c5f8a | ||
![]() |
fa821b1c4f | ||
![]() |
f51bc40203 | ||
![]() |
c7dae49c42 | ||
![]() |
b056b71557 | ||
![]() |
0db2b45cc3 | ||
![]() |
1be1003549 | ||
![]() |
b8a13dd6eb | ||
![]() |
cae5540c44 | ||
![]() |
d47966cdf7 | ||
![]() |
991cf83ff3 | ||
![]() |
b83be38514 | ||
![]() |
17982e0bdc | ||
![]() |
b918862bb1 | ||
![]() |
6bdc7af09f | ||
![]() |
7cbebfd603 | ||
![]() |
42b1f938d6 | ||
![]() |
311f221387 | ||
![]() |
3c6be8cf99 | ||
![]() |
28703b39da | ||
![]() |
db03e271f5 | ||
![]() |
7c851d4542 | ||
![]() |
4d107f978c | ||
![]() |
de57b025e6 | ||
![]() |
3f4351476f | ||
![]() |
d763a014ad | ||
![]() |
52a91d8403 | ||
![]() |
f6cc435f86 | ||
![]() |
349b1ccaad | ||
![]() |
ca921be9d2 | ||
![]() |
919932e414 | ||
![]() |
97a8b6da34 | ||
![]() |
1eceaa0d1b | ||
![]() |
ba3fae2577 | ||
![]() |
93ed1cae5e | ||
![]() |
d8618b4a25 | ||
![]() |
1f6b0360de | ||
![]() |
e1830470b6 | ||
![]() |
9e002f7940 | ||
![]() |
a1380e93ea | ||
![]() |
c511672b0d | ||
![]() |
d6d6d1d0b5 | ||
![]() |
bee629f7ed | ||
![]() |
188fe44c2e | ||
![]() |
25c02b1219 | ||
![]() |
e5e84acd07 | ||
![]() |
722ccc017f | ||
![]() |
d8df380edc | ||
![]() |
cbfcad71d5 | ||
![]() |
327a9ff836 | ||
![]() |
ae2c389273 | ||
![]() |
5ce75cea0d | ||
![]() |
ee79c3a983 | ||
![]() |
f396be2ed7 | ||
![]() |
8a4b96f1ff | ||
![]() |
17b6bf0673 | ||
![]() |
387392713c | ||
![]() |
125ad9c794 | ||
![]() |
ae33b10cb2 | ||
![]() |
1181ddcbbf | ||
![]() |
f7103febdf | ||
![]() |
6e8c1f1a63 | ||
![]() |
9f55ef811d | ||
![]() |
4c898a2a5a | ||
![]() |
a56e22790d | ||
![]() |
2d8fbc652f | ||
![]() |
46f0e0212d | ||
![]() |
786b9ee8d6 | ||
![]() |
1e73cebda6 | ||
![]() |
9b9adf3c7a | ||
![]() |
a08c7a319f | ||
![]() |
5e8868e4b1 | ||
![]() |
64285d5155 | ||
![]() |
ce39b1a2c8 | ||
![]() |
5247b74fd4 | ||
![]() |
26e914290d | ||
![]() |
ed3096157c | ||
![]() |
04a45a4361 | ||
![]() |
5430040b96 | ||
![]() |
4bd70167ad | ||
![]() |
e908fbb48e | ||
![]() |
38da01abfa | ||
![]() |
c3b7ce8dc4 | ||
![]() |
0488d199ac | ||
![]() |
df3e4576db | ||
![]() |
6bd7788815 | ||
![]() |
a6971d61d1 | ||
![]() |
9cdae4fea7 | ||
![]() |
7adf9f8526 | ||
![]() |
35dcb46703 | ||
![]() |
17db85ebad | ||
![]() |
fa39595c37 | ||
![]() |
4db908171f | ||
![]() |
7306b8c102 | ||
![]() |
452cfee2cd | ||
![]() |
928bf3465e | ||
![]() |
0b38143765 | ||
![]() |
2f974078e0 | ||
![]() |
efe90fcc55 | ||
![]() |
01e33f5412 | ||
![]() |
51fdc484c3 | ||
![]() |
3d9fa462a6 | ||
![]() |
32b5d67806 | ||
![]() |
20d3681da3 | ||
![]() |
9b97274bf6 | ||
![]() |
ede0dff030 | ||
![]() |
4cd4635fa5 | ||
![]() |
7832219749 | ||
![]() |
a8d4726caf | ||
![]() |
4b3e20c6ca | ||
![]() |
f9a53743ce | ||
![]() |
89250c0c01 | ||
![]() |
4ef944ea08 | ||
![]() |
5f58c183f4 | ||
![]() |
f71feff916 | ||
![]() |
50fb3b314b | ||
![]() |
06298562cd | ||
![]() |
89e74f3f07 | ||
![]() |
da96c27893 | ||
![]() |
3321dd4ca7 | ||
![]() |
7106d56b33 | ||
![]() |
25cd8a9d9f | ||
![]() |
deb077b5e9 | ||
![]() |
a4bb0e04ab | ||
![]() |
1df60056b2 | ||
![]() |
c4bc1f627f | ||
![]() |
f4df5852fb | ||
![]() |
152b665f2e | ||
![]() |
f1d49aaeb1 | ||
![]() |
5db293ce01 | ||
![]() |
744cda3974 | ||
![]() |
79e223cf8e | ||
![]() |
eb8d23320a | ||
![]() |
7bfa72e7ac | ||
![]() |
031548c155 | ||
![]() |
a7d3ab9d17 | ||
![]() |
d2e00a0f0a | ||
![]() |
eea9e660ac | ||
![]() |
5644c78664 | ||
![]() |
7677471dcc | ||
![]() |
c0ca7e425e | ||
![]() |
29d9b61319 | ||
![]() |
3c8da03d66 | ||
![]() |
9a9b2e3900 | ||
![]() |
830d8d2410 | ||
![]() |
cda34a6ffd | ||
![]() |
76ee9ce202 | ||
![]() |
00bd32acba | ||
![]() |
bc11c0b3ac | ||
![]() |
51f89b00c1 | ||
![]() |
67852125e5 | ||
![]() |
7a36cf67e3 | ||
![]() |
d175e84623 | ||
![]() |
9fff3adbfb | ||
![]() |
5f6396b187 | ||
![]() |
42f2341e06 | ||
![]() |
48dfa1163b | ||
![]() |
28e12f7fd1 | ||
![]() |
5f58ac4fb6 | ||
![]() |
25e7c4f1b2 | ||
![]() |
00934f2183 | ||
![]() |
d302eaffe6 | ||
![]() |
901f736d5f | ||
![]() |
e55f32ae91 | ||
![]() |
3e0c998e74 | ||
![]() |
597866ff4e | ||
![]() |
64e21e185c | ||
![]() |
7a1838ee1a | ||
![]() |
4debac60ae | ||
![]() |
4af231e62b | ||
![]() |
432cf4a7ed | ||
![]() |
df064967ca | ||
![]() |
dc0cab9307 | ||
![]() |
3180747a0a | ||
![]() |
1542095138 | ||
![]() |
6c1937f247 | ||
![]() |
9db1e52a55 | ||
![]() |
f92c63135c | ||
![]() |
a3bf1a014b | ||
![]() |
31fba48ad5 | ||
![]() |
05dfa1bb1a | ||
![]() |
f0f47aac3b | ||
![]() |
9b42494667 | ||
![]() |
42df951f89 | ||
![]() |
f4996424a2 | ||
![]() |
fd01302d9a | ||
![]() |
2daaa1cb9c | ||
![]() |
9fde175c6b | ||
![]() |
f1b24e847e | ||
![]() |
7a587de54e | ||
![]() |
eb69f95f83 | ||
![]() |
359a3a4af9 | ||
![]() |
a8b75e7814 | ||
![]() |
2b898822d1 | ||
![]() |
fc9a0958d4 | ||
![]() |
5843877cc8 | ||
![]() |
913837f064 | ||
![]() |
386ac5d779 | ||
![]() |
3a1a4ade68 | ||
![]() |
dd35112a04 | ||
![]() |
afcb4c56fa | ||
![]() |
58f210f45b | ||
![]() |
f4d9d55ecd | ||
![]() |
995955491f | ||
![]() |
2ab9aed5b4 | ||
![]() |
1693f5b5c9 | ||
![]() |
f096e1698c | ||
![]() |
2f46caa806 | ||
![]() |
5c9b53ffb7 | ||
![]() |
f6e00e7262 | ||
![]() |
5d49f4007e | ||
![]() |
ca20c2d292 | ||
![]() |
f1ab24da99 | ||
![]() |
e16e851952 | ||
![]() |
0b562a4b16 | ||
![]() |
7734922059 | ||
![]() |
54320c3dbf | ||
![]() |
849cfed669 | ||
![]() |
8932dfd504 | ||
![]() |
b9922b2f8e | ||
![]() |
11fc5bc755 | ||
![]() |
67ac4882f2 | ||
![]() |
413171bb3c | ||
![]() |
b111eb2316 | ||
![]() |
9bafabe3e9 | ||
![]() |
202bc6440b | ||
![]() |
e2a89a55b7 | ||
![]() |
1e05730ec7 | ||
![]() |
885a63d3f6 | ||
![]() |
206fbac618 | ||
![]() |
4509661652 | ||
![]() |
4669decfd0 | ||
![]() |
f05c204da3 | ||
![]() |
338692d2c3 | ||
![]() |
5415690585 | ||
![]() |
418315d20b | ||
![]() |
9bbffb6919 | ||
![]() |
e338d63ec5 | ||
![]() |
264aedbff3 | ||
![]() |
4103ef362c | ||
![]() |
a04a449eb9 | ||
![]() |
08633c197b | ||
![]() |
f8b3a429c6 | ||
![]() |
946c8a59b4 | ||
![]() |
f93c7e1b6e | ||
![]() |
6298534b9c | ||
![]() |
5175b42069 | ||
![]() |
e01e31341b | ||
![]() |
203d900d16 | ||
![]() |
4d9e9aaead | ||
![]() |
82ec308be0 | ||
![]() |
dcafbcb06c | ||
![]() |
aa5f8dc082 | ||
![]() |
4dcae9c69c | ||
![]() |
13a1af97da | ||
![]() |
e3c435fd78 | ||
![]() |
a32dee7071 | ||
![]() |
c098858b73 | ||
![]() |
9e509e3bc9 | ||
![]() |
79ac2a72fa | ||
![]() |
b063840f46 | ||
![]() |
4366308b2b | ||
![]() |
126826e52c | ||
![]() |
e31af5d31b | ||
![]() |
fca97cd734 | ||
![]() |
ca94267c44 | ||
![]() |
df1f26cee7 | ||
![]() |
24a4e075e6 | ||
![]() |
43fcc6238e | ||
![]() |
b40b96248b | ||
![]() |
c7ac4c7490 | ||
![]() |
6cd8471b91 | ||
![]() |
940eaa26e0 | ||
![]() |
79e68ce125 | ||
![]() |
e581d35432 | ||
![]() |
d3d578e0f4 | ||
![]() |
79c71cbe48 | ||
![]() |
82b50a1c5d | ||
![]() |
6cfda78aa1 | ||
![]() |
f9ff938775 | ||
![]() |
778fcab90d | ||
![]() |
07e5aa30c6 | ||
![]() |
3f0ec03a14 | ||
![]() |
1bb871b9ac | ||
![]() |
0e8783fb01 | ||
![]() |
1d88c4465b | ||
![]() |
1f0cfb5fd6 | ||
![]() |
a21e17fb23 | ||
![]() |
5de888c91a | ||
![]() |
2dd4090db3 | ||
![]() |
35aafd45dc | ||
![]() |
c778b881ab | ||
![]() |
04acecc832 | ||
![]() |
a10a9916be | ||
![]() |
3604ffa64a | ||
![]() |
a0724749d3 | ||
![]() |
45a75c3a7c | ||
![]() |
f0dcfa4aa3 | ||
![]() |
1c4b66cb1e | ||
![]() |
af2d575bf0 | ||
![]() |
92165d776a | ||
![]() |
a8bbd8ab90 | ||
![]() |
43ac9dbea7 | ||
![]() |
bba9eca4e9 | ||
![]() |
40f65b1980 | ||
![]() |
23a33b10a1 | ||
![]() |
67a93013c7 | ||
![]() |
1f838d7529 | ||
![]() |
ffc0435144 | ||
![]() |
5877d69c87 | ||
![]() |
99035cea8f | ||
![]() |
1b441a7eec | ||
![]() |
ad49e9f7b0 | ||
![]() |
e32b15ede2 | ||
![]() |
a35b4376ea | ||
![]() |
619f9f76ee | ||
![]() |
f771bc10db | ||
![]() |
b8889a1183 | ||
![]() |
eb6b45eaed | ||
![]() |
31a748ed93 | ||
![]() |
0110bdd24a | ||
![]() |
365b712976 | ||
![]() |
7d97dbe15b | ||
![]() |
8bc0ea5a0b | ||
![]() |
44948a3474 | ||
![]() |
bc51b53b4a | ||
![]() |
693dbfd050 | ||
![]() |
67217b9dd0 | ||
![]() |
487795b7c4 | ||
![]() |
a30e0d33f9 | ||
![]() |
0c1b8abe03 | ||
![]() |
ce9c5149d5 | ||
![]() |
adbcdc62eb | ||
![]() |
faf872bfb8 | ||
![]() |
fe0fb2382a | ||
![]() |
e84c3a85db | ||
![]() |
cdd29295e5 | ||
![]() |
f7532f3476 | ||
![]() |
fdf9fab709 | ||
![]() |
c8930cec87 | ||
![]() |
f9c336890d | ||
![]() |
c721de109f | ||
![]() |
1c95e8d6ec | ||
![]() |
57cf2c1341 | ||
![]() |
f7d5c5f850 | ||
![]() |
470f5127f4 | ||
![]() |
34e361601a | ||
![]() |
70d6cce8f8 | ||
![]() |
f9814f35d1 | ||
![]() |
f30603753e | ||
![]() |
ce9993fd36 |
@@ -4,13 +4,12 @@
|
|||||||
# - released in the last year + current alpha/beta versions
|
# - released in the last year + current alpha/beta versions
|
||||||
# - Firefox extended support release (ESR)
|
# - Firefox extended support release (ESR)
|
||||||
# - with global utilization at or above 0.5%
|
# - with global utilization at or above 0.5%
|
||||||
# - must support dynamic import of ES modules
|
# - exclude dead browsers (no security maintenance for 2+ years)
|
||||||
# - exclude browsers no longer being maintained
|
|
||||||
# - exclude KaiOS, QQ, and UC browsers due to lack of sufficient feature support data
|
# - exclude KaiOS, QQ, and UC browsers due to lack of sufficient feature support data
|
||||||
unreleased versions
|
unreleased versions
|
||||||
last 1 year
|
last 1 year
|
||||||
Firefox ESR
|
Firefox ESR
|
||||||
>= 0.5% and supports es6-module-dynamic-import
|
>= 0.5%
|
||||||
not dead
|
not dead
|
||||||
not KaiOS > 0
|
not KaiOS > 0
|
||||||
not QQAndroid > 0
|
not QQAndroid > 0
|
||||||
@@ -20,23 +19,18 @@ not UCAndroid > 0
|
|||||||
# Legacy builds are served when modern requirements are not met and support browsers:
|
# Legacy builds are served when modern requirements are not met and support browsers:
|
||||||
# - released in the last 7 years + current alpha/beta versionss
|
# - released in the last 7 years + current alpha/beta versionss
|
||||||
# - with global utilization at or above 0.05%
|
# - with global utilization at or above 0.05%
|
||||||
# The lattermost query ensures that support for popular old browsers is not dropped too early
|
# - exclude dead browsers (no security maintenance for 2+ years)
|
||||||
# (e.g. IE 11, Android 4.4, or Samsung 4).
|
# - exclude Opera Mini which does not support web sockets
|
||||||
#
|
|
||||||
# In addition, legacy browsers must support some minimum features that cannot be polyfilled:
|
|
||||||
# - ES5 (strict mode)
|
|
||||||
# - web sockets to communicate with backend
|
|
||||||
# - inline SVG used widely in buttons, widgets, etc.
|
|
||||||
# - custom events used for most user interactions
|
|
||||||
# - CSS flexbox used in the majority of the layout
|
|
||||||
# Nearly all of these are redundant with the above rules.
|
|
||||||
# As of May 2023, only web sockets must be added to the query.
|
|
||||||
unreleased versions
|
unreleased versions
|
||||||
last 7 years
|
last 7 years
|
||||||
>= 0.05% and supports websockets
|
>= 0.05%
|
||||||
|
not dead
|
||||||
|
not op_mini all
|
||||||
|
|
||||||
[legacy-sw]
|
[legacy-sw]
|
||||||
# Same as legacy plus supports service workers
|
# Same as legacy plus supports service workers
|
||||||
unreleased versions
|
unreleased versions
|
||||||
last 7 years
|
last 7 years
|
||||||
>= 0.05% and supports websockets and supports serviceworkers
|
>= 0.05% and supports serviceworkers
|
||||||
|
not dead
|
||||||
|
not op_mini all
|
||||||
|
130
.eslintrc.json
130
.eslintrc.json
@@ -1,130 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": [
|
|
||||||
"airbnb-base",
|
|
||||||
"airbnb-typescript/base",
|
|
||||||
"plugin:@typescript-eslint/recommended",
|
|
||||||
"plugin:wc/recommended",
|
|
||||||
"plugin:lit/all",
|
|
||||||
"plugin:lit-a11y/recommended",
|
|
||||||
"prettier"
|
|
||||||
],
|
|
||||||
"parser": "@typescript-eslint/parser",
|
|
||||||
"parserOptions": {
|
|
||||||
"ecmaVersion": 2020,
|
|
||||||
"ecmaFeatures": {
|
|
||||||
"modules": true
|
|
||||||
},
|
|
||||||
"sourceType": "module",
|
|
||||||
"project": "./tsconfig.json"
|
|
||||||
},
|
|
||||||
"settings": {
|
|
||||||
"import/resolver": {
|
|
||||||
"webpack": {
|
|
||||||
"config": "./webpack.config.cjs"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"globals": {
|
|
||||||
"__DEV__": false,
|
|
||||||
"__DEMO__": false,
|
|
||||||
"__BUILD__": false,
|
|
||||||
"__VERSION__": false,
|
|
||||||
"__STATIC_PATH__": false,
|
|
||||||
"__SUPERVISOR__": false,
|
|
||||||
"Polymer": true
|
|
||||||
},
|
|
||||||
"env": {
|
|
||||||
"browser": true,
|
|
||||||
"es6": true
|
|
||||||
},
|
|
||||||
"rules": {
|
|
||||||
"class-methods-use-this": "off",
|
|
||||||
"new-cap": "off",
|
|
||||||
"prefer-template": "off",
|
|
||||||
"object-shorthand": "off",
|
|
||||||
"func-names": "off",
|
|
||||||
"no-underscore-dangle": "off",
|
|
||||||
"strict": "off",
|
|
||||||
"no-plusplus": "off",
|
|
||||||
"no-bitwise": "error",
|
|
||||||
"comma-dangle": "off",
|
|
||||||
"vars-on-top": "off",
|
|
||||||
"no-continue": "off",
|
|
||||||
"no-param-reassign": "off",
|
|
||||||
"no-multi-assign": "off",
|
|
||||||
"no-console": "error",
|
|
||||||
"radix": "off",
|
|
||||||
"no-alert": "off",
|
|
||||||
"no-nested-ternary": "off",
|
|
||||||
"prefer-destructuring": "off",
|
|
||||||
"no-restricted-globals": [2, "event"],
|
|
||||||
"prefer-promise-reject-errors": "off",
|
|
||||||
"import/prefer-default-export": "off",
|
|
||||||
"import/no-default-export": "off",
|
|
||||||
"import/no-unresolved": "off",
|
|
||||||
"import/no-cycle": "off",
|
|
||||||
"import/extensions": [
|
|
||||||
"error",
|
|
||||||
"ignorePackages",
|
|
||||||
{
|
|
||||||
"ts": "never",
|
|
||||||
"js": "never"
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"no-restricted-syntax": ["error", "LabeledStatement", "WithStatement"],
|
|
||||||
"object-curly-newline": "off",
|
|
||||||
"default-case": "off",
|
|
||||||
"wc/no-self-class": "off",
|
|
||||||
"no-shadow": "off",
|
|
||||||
"@typescript-eslint/camelcase": "off",
|
|
||||||
"@typescript-eslint/ban-ts-comment": "off",
|
|
||||||
"@typescript-eslint/no-use-before-define": "off",
|
|
||||||
"@typescript-eslint/no-non-null-assertion": "off",
|
|
||||||
"@typescript-eslint/no-explicit-any": "off",
|
|
||||||
"@typescript-eslint/explicit-function-return-type": "off",
|
|
||||||
"@typescript-eslint/explicit-module-boundary-types": "off",
|
|
||||||
"@typescript-eslint/no-shadow": ["error"],
|
|
||||||
"@typescript-eslint/naming-convention": [
|
|
||||||
"off",
|
|
||||||
{
|
|
||||||
"selector": "default",
|
|
||||||
"format": ["camelCase", "snake_case"],
|
|
||||||
"leadingUnderscore": "allow",
|
|
||||||
"trailingUnderscore": "allow"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"selector": ["variable"],
|
|
||||||
"format": ["camelCase", "snake_case", "UPPER_CASE"],
|
|
||||||
"leadingUnderscore": "allow",
|
|
||||||
"trailingUnderscore": "allow"
|
|
||||||
},
|
|
||||||
{
|
|
||||||
"selector": "typeLike",
|
|
||||||
"format": ["PascalCase"]
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"@typescript-eslint/no-unused-vars": "off",
|
|
||||||
"unused-imports/no-unused-vars": [
|
|
||||||
"error",
|
|
||||||
{
|
|
||||||
"vars": "all",
|
|
||||||
"varsIgnorePattern": "^_",
|
|
||||||
"args": "after-used",
|
|
||||||
"argsIgnorePattern": "^_",
|
|
||||||
"ignoreRestSiblings": true
|
|
||||||
}
|
|
||||||
],
|
|
||||||
"unused-imports/no-unused-imports": "error",
|
|
||||||
"lit/attribute-names": "warn",
|
|
||||||
"lit/attribute-value-entities": "off",
|
|
||||||
"lit/no-template-map": "off",
|
|
||||||
"lit/no-native-attributes": "warn",
|
|
||||||
"lit/no-this-assign-in-render": "warn",
|
|
||||||
"lit-a11y/click-events-have-key-events": ["off"],
|
|
||||||
"lit-a11y/no-autofocus": "off",
|
|
||||||
"lit-a11y/alt-text": "warn",
|
|
||||||
"lit-a11y/anchor-is-valid": "warn",
|
|
||||||
"lit-a11y/role-has-required-aria-attrs": "warn"
|
|
||||||
},
|
|
||||||
"plugins": ["unused-imports"]
|
|
||||||
}
|
|
8
.github/workflows/cast_deployment.yaml
vendored
8
.github/workflows/cast_deployment.yaml
vendored
@@ -21,12 +21,12 @@ jobs:
|
|||||||
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
|
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
with:
|
with:
|
||||||
ref: dev
|
ref: dev
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
@@ -57,12 +57,12 @@ jobs:
|
|||||||
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
|
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
with:
|
with:
|
||||||
ref: master
|
ref: master
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
|
56
.github/workflows/ci.yaml
vendored
56
.github/workflows/ci.yaml
vendored
@@ -24,20 +24,26 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
id: setup-node
|
||||||
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
|
- uses: actions/cache@v4.2.0
|
||||||
|
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
|
||||||
|
with:
|
||||||
|
path: "node_modules"
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('yarn.lock') }}
|
||||||
|
restore-keys: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
if: steps.yarn-cache.outputs.cache-hit != 'true'
|
||||||
run: yarn install --immutable
|
run: yarn install --immutable
|
||||||
- name: Check for duplicate dependencies
|
|
||||||
run: yarn dedupe --check
|
|
||||||
- name: Build resources
|
- name: Build resources
|
||||||
run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data gather-gallery-pages
|
run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data gather-gallery-pages
|
||||||
- name: Setup lint cache
|
- name: Setup lint cache
|
||||||
uses: actions/cache@v4.0.2
|
uses: actions/cache@v4.2.0
|
||||||
with:
|
with:
|
||||||
path: |
|
path: |
|
||||||
node_modules/.cache/prettier
|
node_modules/.cache/prettier
|
||||||
@@ -58,13 +64,21 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
id: setup-node
|
||||||
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
|
- uses: actions/cache@v4.2.0
|
||||||
|
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
|
||||||
|
with:
|
||||||
|
path: "node_modules"
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('yarn.lock') }}
|
||||||
|
restore-keys: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
if: steps.yarn-cache.outputs.cache-hit != 'true'
|
||||||
run: yarn install --immutable
|
run: yarn install --immutable
|
||||||
- name: Build resources
|
- name: Build resources
|
||||||
run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data
|
run: ./node_modules/.bin/gulp gen-icons-json build-translations build-locale-data
|
||||||
@@ -76,20 +90,28 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
id: setup-node
|
||||||
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
|
- uses: actions/cache@v4.2.0
|
||||||
|
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
|
||||||
|
with:
|
||||||
|
path: "node_modules"
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('yarn.lock') }}
|
||||||
|
restore-keys: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
if: steps.yarn-cache.outputs.cache-hit != 'true'
|
||||||
run: yarn install --immutable
|
run: yarn install --immutable
|
||||||
- name: Build Application
|
- name: Build Application
|
||||||
run: ./node_modules/.bin/gulp build-app
|
run: ./node_modules/.bin/gulp build-app
|
||||||
env:
|
env:
|
||||||
IS_TEST: "true"
|
IS_TEST: "true"
|
||||||
- name: Upload bundle stats
|
- name: Upload bundle stats
|
||||||
uses: actions/upload-artifact@v4.4.0
|
uses: actions/upload-artifact@v4.4.3
|
||||||
with:
|
with:
|
||||||
name: frontend-bundle-stats
|
name: frontend-bundle-stats
|
||||||
path: build/stats/*.json
|
path: build/stats/*.json
|
||||||
@@ -100,20 +122,28 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
id: setup-node
|
||||||
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
|
- uses: actions/cache@v4.2.0
|
||||||
|
id: yarn-cache # use this to check for `cache-hit` (`steps.yarn-cache.outputs.cache-hit != 'true'`)
|
||||||
|
with:
|
||||||
|
path: "node_modules"
|
||||||
|
key: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}-${{ hashFiles('yarn.lock') }}
|
||||||
|
restore-keys: ${{ runner.os }}-yarn-${{ hashFiles('.yarnrc.yml') }}-${{ steps.setup-node.outputs.node-version }}
|
||||||
- name: Install dependencies
|
- name: Install dependencies
|
||||||
|
if: steps.yarn-cache.outputs.cache-hit != 'true'
|
||||||
run: yarn install --immutable
|
run: yarn install --immutable
|
||||||
- name: Build Application
|
- name: Build Application
|
||||||
run: ./node_modules/.bin/gulp build-hassio
|
run: ./node_modules/.bin/gulp build-hassio
|
||||||
env:
|
env:
|
||||||
IS_TEST: "true"
|
IS_TEST: "true"
|
||||||
- name: Upload bundle stats
|
- name: Upload bundle stats
|
||||||
uses: actions/upload-artifact@v4.4.0
|
uses: actions/upload-artifact@v4.4.3
|
||||||
with:
|
with:
|
||||||
name: supervisor-bundle-stats
|
name: supervisor-bundle-stats
|
||||||
path: build/stats/*.json
|
path: build/stats/*.json
|
||||||
|
2
.github/workflows/codeql-analysis.yml
vendored
2
.github/workflows/codeql-analysis.yml
vendored
@@ -23,7 +23,7 @@ jobs:
|
|||||||
|
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout repository
|
- name: Checkout repository
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
with:
|
with:
|
||||||
# We must fetch at least the immediate parents so that if this is
|
# We must fetch at least the immediate parents so that if this is
|
||||||
# a pull request then we can checkout the head.
|
# a pull request then we can checkout the head.
|
||||||
|
8
.github/workflows/demo_deployment.yaml
vendored
8
.github/workflows/demo_deployment.yaml
vendored
@@ -22,12 +22,12 @@ jobs:
|
|||||||
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
|
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
with:
|
with:
|
||||||
ref: dev
|
ref: dev
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
@@ -58,12 +58,12 @@ jobs:
|
|||||||
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
|
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
with:
|
with:
|
||||||
ref: master
|
ref: master
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
|
4
.github/workflows/design_deployment.yaml
vendored
4
.github/workflows/design_deployment.yaml
vendored
@@ -16,10 +16,10 @@ jobs:
|
|||||||
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
|
url: ${{ steps.deploy.outputs.NETLIFY_LIVE_URL || steps.deploy.outputs.NETLIFY_URL }}
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
|
4
.github/workflows/design_preview.yaml
vendored
4
.github/workflows/design_preview.yaml
vendored
@@ -21,10 +21,10 @@ jobs:
|
|||||||
if: github.repository == 'home-assistant/frontend' && contains(github.event.pull_request.labels.*.name, 'needs design preview')
|
if: github.repository == 'home-assistant/frontend' && contains(github.event.pull_request.labels.*.name, 'needs design preview')
|
||||||
steps:
|
steps:
|
||||||
- name: Check out files from GitHub
|
- name: Check out files from GitHub
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
|
8
.github/workflows/nightly.yaml
vendored
8
.github/workflows/nightly.yaml
vendored
@@ -20,7 +20,7 @@ jobs:
|
|||||||
contents: write
|
contents: write
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
|
|
||||||
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
- name: Set up Python ${{ env.PYTHON_VERSION }}
|
||||||
uses: actions/setup-python@v5
|
uses: actions/setup-python@v5
|
||||||
@@ -28,7 +28,7 @@ jobs:
|
|||||||
python-version: ${{ env.PYTHON_VERSION }}
|
python-version: ${{ env.PYTHON_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
@@ -57,14 +57,14 @@ jobs:
|
|||||||
run: tar -czvf translations.tar.gz translations
|
run: tar -czvf translations.tar.gz translations
|
||||||
|
|
||||||
- name: Upload build artifacts
|
- name: Upload build artifacts
|
||||||
uses: actions/upload-artifact@v4.4.0
|
uses: actions/upload-artifact@v4.4.3
|
||||||
with:
|
with:
|
||||||
name: wheels
|
name: wheels
|
||||||
path: dist/home_assistant_frontend*.whl
|
path: dist/home_assistant_frontend*.whl
|
||||||
if-no-files-found: error
|
if-no-files-found: error
|
||||||
|
|
||||||
- name: Upload translations
|
- name: Upload translations
|
||||||
uses: actions/upload-artifact@v4.4.0
|
uses: actions/upload-artifact@v4.4.3
|
||||||
with:
|
with:
|
||||||
name: translations
|
name: translations
|
||||||
path: translations.tar.gz
|
path: translations.tar.gz
|
||||||
|
2
.github/workflows/relative-ci.yaml
vendored
2
.github/workflows/relative-ci.yaml
vendored
@@ -17,7 +17,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Send bundle stats and build information to RelativeCI
|
- name: Send bundle stats and build information to RelativeCI
|
||||||
uses: relative-ci/agent-action@v2.1.12
|
uses: relative-ci/agent-action@v2.1.14
|
||||||
with:
|
with:
|
||||||
key: ${{ secrets[format('RELATIVE_CI_KEY_{0}_{1}', matrix.bundle, matrix.build)] }}
|
key: ${{ secrets[format('RELATIVE_CI_KEY_{0}_{1}', matrix.bundle, matrix.build)] }}
|
||||||
token: ${{ github.token }}
|
token: ${{ github.token }}
|
||||||
|
66
.github/workflows/release.yaml
vendored
66
.github/workflows/release.yaml
vendored
@@ -23,7 +23,7 @@ jobs:
|
|||||||
contents: write # Required to upload release assets
|
contents: write # Required to upload release assets
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
|
|
||||||
- name: Verify version
|
- name: Verify version
|
||||||
uses: home-assistant/actions/helpers/verify-version@master
|
uses: home-assistant/actions/helpers/verify-version@master
|
||||||
@@ -34,7 +34,7 @@ jobs:
|
|||||||
python-version: ${{ env.PYTHON_VERSION }}
|
python-version: ${{ env.PYTHON_VERSION }}
|
||||||
|
|
||||||
- name: Setup Node
|
- name: Setup Node
|
||||||
uses: actions/setup-node@v4.0.4
|
uses: actions/setup-node@v4.1.0
|
||||||
with:
|
with:
|
||||||
node-version-file: ".nvmrc"
|
node-version-file: ".nvmrc"
|
||||||
cache: yarn
|
cache: yarn
|
||||||
@@ -55,7 +55,7 @@ jobs:
|
|||||||
script/release
|
script/release
|
||||||
|
|
||||||
- name: Upload release assets
|
- name: Upload release assets
|
||||||
uses: softprops/action-gh-release@v2.0.8
|
uses: softprops/action-gh-release@v2.1.0
|
||||||
with:
|
with:
|
||||||
files: |
|
files: |
|
||||||
dist/*.whl
|
dist/*.whl
|
||||||
@@ -74,10 +74,68 @@ jobs:
|
|||||||
echo "home-assistant-frontend==$version" > ./requirements.txt
|
echo "home-assistant-frontend==$version" > ./requirements.txt
|
||||||
|
|
||||||
- name: Build wheels
|
- name: Build wheels
|
||||||
uses: home-assistant/wheels@2024.07.1
|
uses: home-assistant/wheels@2024.11.0
|
||||||
with:
|
with:
|
||||||
abi: cp312
|
abi: cp312
|
||||||
tag: musllinux_1_2
|
tag: musllinux_1_2
|
||||||
arch: amd64
|
arch: amd64
|
||||||
wheels-key: ${{ secrets.WHEELS_KEY }}
|
wheels-key: ${{ secrets.WHEELS_KEY }}
|
||||||
requirements: "requirements.txt"
|
requirements: "requirements.txt"
|
||||||
|
|
||||||
|
release-landing-page:
|
||||||
|
name: Release landing-page frontend
|
||||||
|
if: github.event.release.prerelease == false
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write # Required to upload release assets
|
||||||
|
steps:
|
||||||
|
- name: Checkout the repository
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@v4.1.0
|
||||||
|
with:
|
||||||
|
node-version-file: ".nvmrc"
|
||||||
|
cache: yarn
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install
|
||||||
|
- name: Download Translations
|
||||||
|
run: ./script/translations_download
|
||||||
|
env:
|
||||||
|
LOKALISE_TOKEN: ${{ secrets.LOKALISE_TOKEN }}
|
||||||
|
- name: Build landing-page
|
||||||
|
run: landing-page/script/build_landing_page
|
||||||
|
- name: Tar folder
|
||||||
|
run: tar -czf landing-page/home_assistant_frontend_landingpage-${{ github.event.release.tag_name }}.tar.gz -C landing-page/dist .
|
||||||
|
- name: Upload release asset
|
||||||
|
uses: softprops/action-gh-release@v2.1.0
|
||||||
|
with:
|
||||||
|
files: landing-page/home_assistant_frontend_landingpage-${{ github.event.release.tag_name }}.tar.gz
|
||||||
|
|
||||||
|
release-supervisor:
|
||||||
|
name: Release supervisor frontend
|
||||||
|
if: github.event.release.prerelease == false
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write # Required to upload release assets
|
||||||
|
steps:
|
||||||
|
- name: Checkout the repository
|
||||||
|
uses: actions/checkout@v4.2.2
|
||||||
|
- name: Setup Node
|
||||||
|
uses: actions/setup-node@v4.1.0
|
||||||
|
with:
|
||||||
|
node-version-file: ".nvmrc"
|
||||||
|
cache: yarn
|
||||||
|
- name: Install dependencies
|
||||||
|
run: yarn install
|
||||||
|
- name: Download Translations
|
||||||
|
run: ./script/translations_download
|
||||||
|
env:
|
||||||
|
LOKALISE_TOKEN: ${{ secrets.LOKALISE_TOKEN }}
|
||||||
|
- name: Build supervisor
|
||||||
|
run: hassio/script/build_hassio
|
||||||
|
- name: Tar folder
|
||||||
|
run: tar -czf hassio/home_assistant_frontend_supervisor-${{ github.event.release.tag_name }}.tar.gz -C hassio/build .
|
||||||
|
- name: Upload release asset
|
||||||
|
uses: softprops/action-gh-release@v2.1.0
|
||||||
|
with:
|
||||||
|
files: hassio/home_assistant_frontend_supervisor-${{ github.event.release.tag_name }}.tar.gz
|
||||||
|
2
.github/workflows/translations.yaml
vendored
2
.github/workflows/translations.yaml
vendored
@@ -13,7 +13,7 @@ jobs:
|
|||||||
runs-on: ubuntu-latest
|
runs-on: ubuntu-latest
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout the repository
|
- name: Checkout the repository
|
||||||
uses: actions/checkout@v4.2.0
|
uses: actions/checkout@v4.2.2
|
||||||
|
|
||||||
- name: Upload Translations
|
- name: Upload Translations
|
||||||
run: |
|
run: |
|
||||||
|
3
.gitignore
vendored
3
.gitignore
vendored
@@ -50,3 +50,6 @@ src/cast/dev_const.ts
|
|||||||
|
|
||||||
# Jetbrains
|
# Jetbrains
|
||||||
/.idea/
|
/.idea/
|
||||||
|
|
||||||
|
# test coverage
|
||||||
|
test/coverage/
|
||||||
|
3
.vscode/extensions.json
vendored
3
.vscode/extensions.json
vendored
@@ -4,6 +4,7 @@
|
|||||||
"esbenp.prettier-vscode",
|
"esbenp.prettier-vscode",
|
||||||
"runem.lit-plugin",
|
"runem.lit-plugin",
|
||||||
"github.vscode-pull-request-github",
|
"github.vscode-pull-request-github",
|
||||||
"eamodio.gitlens"
|
"eamodio.gitlens",
|
||||||
|
"vitest.explorer"
|
||||||
]
|
]
|
||||||
}
|
}
|
||||||
|
32
.vscode/tasks.json
vendored
32
.vscode/tasks.json
vendored
@@ -100,6 +100,38 @@
|
|||||||
"instanceLimit": 1
|
"instanceLimit": 1
|
||||||
}
|
}
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
"label": "Develop Landing Page",
|
||||||
|
"type": "gulp",
|
||||||
|
"task": "develop-landing-page",
|
||||||
|
"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",
|
"label": "Develop Demo",
|
||||||
"type": "gulp",
|
"type": "gulp",
|
||||||
|
925
.yarn/releases/yarn-4.5.0.cjs
vendored
925
.yarn/releases/yarn-4.5.0.cjs
vendored
File diff suppressed because one or more lines are too long
934
.yarn/releases/yarn-4.5.3.cjs
vendored
Executable file
934
.yarn/releases/yarn-4.5.3.cjs
vendored
Executable file
File diff suppressed because one or more lines are too long
@@ -6,4 +6,4 @@ enableGlobalCache: false
|
|||||||
|
|
||||||
nodeLinker: node-modules
|
nodeLinker: node-modules
|
||||||
|
|
||||||
yarnPath: .yarn/releases/yarn-4.5.0.cjs
|
yarnPath: .yarn/releases/yarn-4.5.3.cjs
|
||||||
|
@@ -1,12 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": "../.eslintrc.json",
|
|
||||||
"rules": {
|
|
||||||
"no-console": "off",
|
|
||||||
"import/no-extraneous-dependencies": "off",
|
|
||||||
"import/extensions": "off",
|
|
||||||
"import/no-dynamic-require": "off",
|
|
||||||
"global-require": "off",
|
|
||||||
"@typescript-eslint/no-var-requires": "off",
|
|
||||||
"prefer-arrow-callback": "off"
|
|
||||||
}
|
|
||||||
}
|
|
@@ -15,7 +15,7 @@ The Home Assistant build pipeline contains various steps to prepare a build.
|
|||||||
|
|
||||||
Currently in Home Assistant we use a bundler to convert TypeScript, CSS and JSON files to JavaScript files that the browser understands.
|
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.
|
We currently rely on Webpack. 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.
|
For development, bundling is optional. We just want to get the right files in the browser.
|
||||||
|
|
||||||
|
@@ -147,6 +147,7 @@ const polyfillMap = {
|
|||||||
...Object.fromEntries(
|
...Object.fromEntries(
|
||||||
[
|
[
|
||||||
"DateTimeFormat",
|
"DateTimeFormat",
|
||||||
|
"DurationFormat",
|
||||||
"DisplayNames",
|
"DisplayNames",
|
||||||
"ListFormat",
|
"ListFormat",
|
||||||
"NumberFormat",
|
"NumberFormat",
|
||||||
|
@@ -53,6 +53,11 @@ module.exports.definedVars = ({ isProdBuild, latestBuild, defineOverlay }) => ({
|
|||||||
__SUPERVISOR__: false,
|
__SUPERVISOR__: false,
|
||||||
__BACKWARDS_COMPAT__: false,
|
__BACKWARDS_COMPAT__: false,
|
||||||
__STATIC_PATH__: "/static/",
|
__STATIC_PATH__: "/static/",
|
||||||
|
__HASS_URL__: `\`${
|
||||||
|
"HASS_URL" in process.env
|
||||||
|
? process.env["HASS_URL"]
|
||||||
|
: "${location.protocol}//${location.host}"
|
||||||
|
}\``,
|
||||||
"process.env.NODE_ENV": JSON.stringify(
|
"process.env.NODE_ENV": JSON.stringify(
|
||||||
isProdBuild ? "production" : "development"
|
isProdBuild ? "production" : "development"
|
||||||
),
|
),
|
||||||
@@ -152,7 +157,6 @@ module.exports.babelOptions = ({
|
|||||||
exclude: [
|
exclude: [
|
||||||
// \\ for Windows, / for Mac OS and Linux
|
// \\ for Windows, / for Mac OS and Linux
|
||||||
/node_modules[\\/]core-js/,
|
/node_modules[\\/]core-js/,
|
||||||
/node_modules[\\/]webpack[\\/]buildin/,
|
|
||||||
],
|
],
|
||||||
sourceMaps: !isTestBuild,
|
sourceMaps: !isTestBuild,
|
||||||
overrides: [
|
overrides: [
|
||||||
@@ -226,13 +230,12 @@ module.exports.config = {
|
|||||||
return {
|
return {
|
||||||
name: "frontend" + nameSuffix(latestBuild),
|
name: "frontend" + nameSuffix(latestBuild),
|
||||||
entry: {
|
entry: {
|
||||||
"service-worker":
|
"service-worker": !latestBuild
|
||||||
!env.useRollup() && !latestBuild
|
? {
|
||||||
? {
|
import: "./src/entrypoints/service-worker.ts",
|
||||||
import: "./src/entrypoints/service-worker.ts",
|
layer: "sw",
|
||||||
layer: "sw",
|
}
|
||||||
}
|
: "./src/entrypoints/service-worker.ts",
|
||||||
: "./src/entrypoints/service-worker.ts",
|
|
||||||
app: "./src/entrypoints/app.ts",
|
app: "./src/entrypoints/app.ts",
|
||||||
authorize: "./src/entrypoints/authorize.ts",
|
authorize: "./src/entrypoints/authorize.ts",
|
||||||
onboarding: "./src/entrypoints/onboarding.ts",
|
onboarding: "./src/entrypoints/onboarding.ts",
|
||||||
@@ -328,4 +331,17 @@ module.exports.config = {
|
|||||||
},
|
},
|
||||||
};
|
};
|
||||||
},
|
},
|
||||||
|
|
||||||
|
landingPage({ isProdBuild, latestBuild }) {
|
||||||
|
return {
|
||||||
|
name: "landing-page" + nameSuffix(latestBuild),
|
||||||
|
entry: {
|
||||||
|
entrypoint: path.resolve(paths.landingPage_dir, "src/entrypoint.js"),
|
||||||
|
},
|
||||||
|
outputPath: outputPath(paths.landingPage_output_root, latestBuild),
|
||||||
|
publicPath: publicPath(latestBuild),
|
||||||
|
isProdBuild,
|
||||||
|
latestBuild,
|
||||||
|
};
|
||||||
|
},
|
||||||
};
|
};
|
||||||
|
@@ -2,26 +2,22 @@ const fs = require("fs");
|
|||||||
const path = require("path");
|
const path = require("path");
|
||||||
const paths = require("./paths.cjs");
|
const paths = require("./paths.cjs");
|
||||||
|
|
||||||
|
const isTrue = (value) => value === "1" || value?.toLowerCase() === "true";
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
useRollup() {
|
|
||||||
return process.env.ROLLUP === "1";
|
|
||||||
},
|
|
||||||
useWDS() {
|
|
||||||
return process.env.WDS === "1";
|
|
||||||
},
|
|
||||||
isProdBuild() {
|
isProdBuild() {
|
||||||
return (
|
return (
|
||||||
process.env.NODE_ENV === "production" || module.exports.isStatsBuild()
|
process.env.NODE_ENV === "production" || module.exports.isStatsBuild()
|
||||||
);
|
);
|
||||||
},
|
},
|
||||||
isStatsBuild() {
|
isStatsBuild() {
|
||||||
return process.env.STATS === "1";
|
return isTrue(process.env.STATS);
|
||||||
},
|
},
|
||||||
isTestBuild() {
|
isTestBuild() {
|
||||||
return process.env.IS_TEST === "true";
|
return isTrue(process.env.IS_TEST);
|
||||||
},
|
},
|
||||||
isNetlify() {
|
isNetlify() {
|
||||||
return process.env.NETLIFY === "true";
|
return isTrue(process.env.NETLIFY);
|
||||||
},
|
},
|
||||||
version() {
|
version() {
|
||||||
const version = fs
|
const version = fs
|
||||||
@@ -33,6 +29,6 @@ module.exports = {
|
|||||||
return version[1];
|
return version[1];
|
||||||
},
|
},
|
||||||
isDevContainer() {
|
isDevContainer() {
|
||||||
return process.env.DEV_CONTAINER === "1";
|
return isTrue(process.env.DEV_CONTAINER);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
16
build-scripts/eslint.config.mjs
Normal file
16
build-scripts/eslint.config.mjs
Normal file
@@ -0,0 +1,16 @@
|
|||||||
|
import rootConfig from "../eslint.config.mjs";
|
||||||
|
|
||||||
|
export default [
|
||||||
|
...rootConfig,
|
||||||
|
{
|
||||||
|
rules: {
|
||||||
|
"no-console": "off",
|
||||||
|
"import/no-extraneous-dependencies": "off",
|
||||||
|
"import/extensions": "off",
|
||||||
|
"import/no-dynamic-require": "off",
|
||||||
|
"global-require": "off",
|
||||||
|
"@typescript-eslint/no-var-requires": "off",
|
||||||
|
"prefer-arrow-callback": "off",
|
||||||
|
},
|
||||||
|
},
|
||||||
|
];
|
@@ -6,11 +6,9 @@ import "./entry-html.js";
|
|||||||
import "./gather-static.js";
|
import "./gather-static.js";
|
||||||
import "./gen-icons-json.js";
|
import "./gen-icons-json.js";
|
||||||
import "./locale-data.js";
|
import "./locale-data.js";
|
||||||
import "./rollup.js";
|
|
||||||
import "./service-worker.js";
|
import "./service-worker.js";
|
||||||
import "./translations.js";
|
import "./translations.js";
|
||||||
import "./wds.js";
|
import "./rspack.js";
|
||||||
import "./webpack.js";
|
|
||||||
|
|
||||||
gulp.task(
|
gulp.task(
|
||||||
"develop-app",
|
"develop-app",
|
||||||
@@ -27,11 +25,7 @@ gulp.task(
|
|||||||
"build-locale-data"
|
"build-locale-data"
|
||||||
),
|
),
|
||||||
"copy-static-app",
|
"copy-static-app",
|
||||||
env.useWDS()
|
"rspack-watch-app"
|
||||||
? "wds-watch-app"
|
|
||||||
: env.useRollup()
|
|
||||||
? "rollup-watch-app"
|
|
||||||
: "webpack-watch-app"
|
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -44,9 +38,20 @@ gulp.task(
|
|||||||
"clean",
|
"clean",
|
||||||
gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"),
|
gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"),
|
||||||
"copy-static-app",
|
"copy-static-app",
|
||||||
env.useRollup() ? "rollup-prod-app" : "webpack-prod-app",
|
"rspack-prod-app",
|
||||||
gulp.parallel("gen-pages-app-prod", "gen-service-worker-app-prod"),
|
gulp.parallel("gen-pages-app-prod", "gen-service-worker-app-prod"),
|
||||||
// Don't compress running tests
|
// Don't compress running tests
|
||||||
...(env.isTestBuild() ? [] : ["compress-app"])
|
...(env.isTestBuild() || env.isStatsBuild() ? [] : ["compress-app"])
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
"analyze-app",
|
||||||
|
gulp.series(
|
||||||
|
async function setEnv() {
|
||||||
|
process.env.STATS = "1";
|
||||||
|
},
|
||||||
|
"clean",
|
||||||
|
"rspack-prod-app"
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@@ -1,12 +1,10 @@
|
|||||||
import gulp from "gulp";
|
import gulp from "gulp";
|
||||||
import env from "../env.cjs";
|
|
||||||
import "./clean.js";
|
import "./clean.js";
|
||||||
import "./entry-html.js";
|
import "./entry-html.js";
|
||||||
import "./gather-static.js";
|
import "./gather-static.js";
|
||||||
import "./rollup.js";
|
|
||||||
import "./service-worker.js";
|
import "./service-worker.js";
|
||||||
import "./translations.js";
|
import "./translations.js";
|
||||||
import "./webpack.js";
|
import "./rspack.js";
|
||||||
|
|
||||||
gulp.task(
|
gulp.task(
|
||||||
"develop-cast",
|
"develop-cast",
|
||||||
@@ -19,7 +17,7 @@ gulp.task(
|
|||||||
gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"),
|
gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"),
|
||||||
"copy-static-cast",
|
"copy-static-cast",
|
||||||
"gen-pages-cast-dev",
|
"gen-pages-cast-dev",
|
||||||
env.useRollup() ? "rollup-dev-server-cast" : "webpack-dev-server-cast"
|
"rspack-dev-server-cast"
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -33,7 +31,7 @@ gulp.task(
|
|||||||
"translations-enable-merge-backend",
|
"translations-enable-merge-backend",
|
||||||
gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"),
|
gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"),
|
||||||
"copy-static-cast",
|
"copy-static-cast",
|
||||||
env.useRollup() ? "rollup-prod-cast" : "webpack-prod-cast",
|
"rspack-prod-cast",
|
||||||
"gen-pages-cast-prod"
|
"gen-pages-cast-prod"
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@@ -38,3 +38,14 @@ gulp.task(
|
|||||||
])
|
])
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
"clean-landing-page",
|
||||||
|
gulp.parallel("clean-translations", async () =>
|
||||||
|
deleteSync([
|
||||||
|
paths.landingPage_output_root,
|
||||||
|
paths.landingPage_build,
|
||||||
|
paths.build_dir,
|
||||||
|
])
|
||||||
|
)
|
||||||
|
);
|
||||||
|
@@ -3,7 +3,6 @@
|
|||||||
import { constants } from "node:zlib";
|
import { constants } from "node:zlib";
|
||||||
import gulp from "gulp";
|
import gulp from "gulp";
|
||||||
import brotli from "gulp-brotli";
|
import brotli from "gulp-brotli";
|
||||||
import zopfli from "gulp-zopfli-green";
|
|
||||||
import paths from "../paths.cjs";
|
import paths from "../paths.cjs";
|
||||||
|
|
||||||
const filesGlob = "*.{js,json,css,svg,xml}";
|
const filesGlob = "*.{js,json,css,svg,xml}";
|
||||||
@@ -13,7 +12,6 @@ const brotliOptions = {
|
|||||||
[constants.BROTLI_PARAM_QUALITY]: constants.BROTLI_MAX_QUALITY,
|
[constants.BROTLI_PARAM_QUALITY]: constants.BROTLI_MAX_QUALITY,
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
const zopfliOptions = { threshold: 150 };
|
|
||||||
|
|
||||||
const compressDistBrotli = (rootDir, modernDir, compressServiceWorker = true) =>
|
const compressDistBrotli = (rootDir, modernDir, compressServiceWorker = true) =>
|
||||||
gulp
|
gulp
|
||||||
@@ -29,20 +27,6 @@ const compressDistBrotli = (rootDir, modernDir, compressServiceWorker = true) =>
|
|||||||
.pipe(brotli(brotliOptions))
|
.pipe(brotli(brotliOptions))
|
||||||
.pipe(gulp.dest(rootDir));
|
.pipe(gulp.dest(rootDir));
|
||||||
|
|
||||||
const compressDistZopfli = (rootDir, modernDir, compressModern = false) =>
|
|
||||||
gulp
|
|
||||||
.src(
|
|
||||||
[
|
|
||||||
`${rootDir}/**/${filesGlob}`,
|
|
||||||
compressModern ? undefined : `!${modernDir}/**/${filesGlob}`,
|
|
||||||
`!${rootDir}/{sw-modern,service_worker}.js`,
|
|
||||||
`${rootDir}/{authorize,onboarding}.html`,
|
|
||||||
].filter(Boolean),
|
|
||||||
{ base: rootDir }
|
|
||||||
)
|
|
||||||
.pipe(zopfli(zopfliOptions))
|
|
||||||
.pipe(gulp.dest(rootDir));
|
|
||||||
|
|
||||||
const compressAppBrotli = () =>
|
const compressAppBrotli = () =>
|
||||||
compressDistBrotli(paths.app_output_root, paths.app_output_latest);
|
compressDistBrotli(paths.app_output_root, paths.app_output_latest);
|
||||||
const compressHassioBrotli = () =>
|
const compressHassioBrotli = () =>
|
||||||
@@ -52,17 +36,5 @@ const compressHassioBrotli = () =>
|
|||||||
false
|
false
|
||||||
);
|
);
|
||||||
|
|
||||||
const compressAppZopfli = () =>
|
gulp.task("compress-app", compressAppBrotli);
|
||||||
compressDistZopfli(paths.app_output_root, paths.app_output_latest);
|
gulp.task("compress-hassio", compressHassioBrotli);
|
||||||
const compressHassioZopfli = () =>
|
|
||||||
compressDistZopfli(
|
|
||||||
paths.hassio_output_root,
|
|
||||||
paths.hassio_output_latest,
|
|
||||||
true
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.task("compress-app", gulp.parallel(compressAppBrotli, compressAppZopfli));
|
|
||||||
gulp.task(
|
|
||||||
"compress-hassio",
|
|
||||||
gulp.parallel(compressHassioBrotli, compressHassioZopfli)
|
|
||||||
);
|
|
||||||
|
@@ -1,13 +1,11 @@
|
|||||||
import gulp from "gulp";
|
import gulp from "gulp";
|
||||||
import env from "../env.cjs";
|
|
||||||
import "./clean.js";
|
import "./clean.js";
|
||||||
import "./entry-html.js";
|
import "./entry-html.js";
|
||||||
import "./gather-static.js";
|
import "./gather-static.js";
|
||||||
import "./gen-icons-json.js";
|
import "./gen-icons-json.js";
|
||||||
import "./rollup.js";
|
|
||||||
import "./service-worker.js";
|
import "./service-worker.js";
|
||||||
import "./translations.js";
|
import "./translations.js";
|
||||||
import "./webpack.js";
|
import "./rspack.js";
|
||||||
|
|
||||||
gulp.task(
|
gulp.task(
|
||||||
"develop-demo",
|
"develop-demo",
|
||||||
@@ -24,7 +22,7 @@ gulp.task(
|
|||||||
"build-locale-data"
|
"build-locale-data"
|
||||||
),
|
),
|
||||||
"copy-static-demo",
|
"copy-static-demo",
|
||||||
env.useRollup() ? "rollup-dev-server-demo" : "webpack-dev-server-demo"
|
"rspack-dev-server-demo"
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -39,7 +37,18 @@ gulp.task(
|
|||||||
"translations-enable-merge-backend",
|
"translations-enable-merge-backend",
|
||||||
gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"),
|
gulp.parallel("gen-icons-json", "build-translations", "build-locale-data"),
|
||||||
"copy-static-demo",
|
"copy-static-demo",
|
||||||
env.useRollup() ? "rollup-prod-demo" : "webpack-prod-demo",
|
"rspack-prod-demo",
|
||||||
"gen-pages-demo-prod"
|
"gen-pages-demo-prod"
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
"analyze-demo",
|
||||||
|
gulp.series(
|
||||||
|
async function setEnv() {
|
||||||
|
process.env.STATS = "1";
|
||||||
|
},
|
||||||
|
"clean",
|
||||||
|
"rspack-prod-demo"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
@@ -13,7 +13,7 @@ const srcMeta = "src/translations/translationMetadata.json";
|
|||||||
const encoding = "utf8";
|
const encoding = "utf8";
|
||||||
|
|
||||||
function hasHtml(data) {
|
function hasHtml(data) {
|
||||||
return /<[a-z][\s\S]*>/i.test(data);
|
return /<\S*>/i.test(data);
|
||||||
}
|
}
|
||||||
|
|
||||||
function recursiveCheckHasHtml(file, data, errors, recKey) {
|
function recursiveCheckHasHtml(file, data, errors, recKey) {
|
||||||
@@ -127,6 +127,7 @@ gulp.task("fetch-lokalise", async function () {
|
|||||||
replace_breaks: false,
|
replace_breaks: false,
|
||||||
json_unescaped_slashes: true,
|
json_unescaped_slashes: true,
|
||||||
export_empty_as: "skip",
|
export_empty_as: "skip",
|
||||||
|
filter_data: ["verified"],
|
||||||
})
|
})
|
||||||
.then((download) => fetch(download.bundle_url))
|
.then((download) => fetch(download.bundle_url))
|
||||||
.then((response) => {
|
.then((response) => {
|
||||||
|
@@ -11,7 +11,6 @@ import { minify } from "html-minifier-terser";
|
|||||||
import template from "lodash.template";
|
import template from "lodash.template";
|
||||||
import { dirname, extname, resolve } from "node:path";
|
import { dirname, extname, resolve } from "node:path";
|
||||||
import { htmlMinifierOptions, terserOptions } from "../bundle.cjs";
|
import { htmlMinifierOptions, terserOptions } from "../bundle.cjs";
|
||||||
import env from "../env.cjs";
|
|
||||||
import paths from "../paths.cjs";
|
import paths from "../paths.cjs";
|
||||||
|
|
||||||
// macOS companion app has no way to obtain the Safari version used by WKWebView,
|
// macOS companion app has no way to obtain the Safari version used by WKWebView,
|
||||||
@@ -56,8 +55,6 @@ const getCommonTemplateVars = () => {
|
|||||||
{ ignorePatch: true, allowHigherVersions: true }
|
{ ignorePatch: true, allowHigherVersions: true }
|
||||||
);
|
);
|
||||||
return {
|
return {
|
||||||
useRollup: env.useRollup(),
|
|
||||||
useWDS: env.useWDS(),
|
|
||||||
modernRegex: compileRegex(browserRegexes.concat(haMacOSRegex)).toString(),
|
modernRegex: compileRegex(browserRegexes.concat(haMacOSRegex)).toString(),
|
||||||
};
|
};
|
||||||
};
|
};
|
||||||
@@ -93,13 +90,11 @@ const minifyHtml = (content, ext) => {
|
|||||||
};
|
};
|
||||||
|
|
||||||
// Function to generate a dev task for each project's configuration
|
// Function to generate a dev task for each project's configuration
|
||||||
// Note Currently WDS paths are hard-coded to only work for app
|
|
||||||
const genPagesDevTask =
|
const genPagesDevTask =
|
||||||
(
|
(
|
||||||
pageEntries,
|
pageEntries,
|
||||||
inputRoot,
|
inputRoot,
|
||||||
outputRoot,
|
outputRoot,
|
||||||
useWDS = false,
|
|
||||||
inputSub = "src/html",
|
inputSub = "src/html",
|
||||||
publicRoot = ""
|
publicRoot = ""
|
||||||
) =>
|
) =>
|
||||||
@@ -110,17 +105,13 @@ const genPagesDevTask =
|
|||||||
resolve(inputRoot, inputSub, `${page}.template`),
|
resolve(inputRoot, inputSub, `${page}.template`),
|
||||||
{
|
{
|
||||||
...commonVars,
|
...commonVars,
|
||||||
latestEntryJS: entries.map((entry) =>
|
latestEntryJS: entries.map(
|
||||||
useWDS
|
(entry) => `${publicRoot}/frontend_latest/${entry}.js`
|
||||||
? `http://localhost:8000/src/entrypoints/${entry}.ts`
|
|
||||||
: `${publicRoot}/frontend_latest/${entry}.js`
|
|
||||||
),
|
),
|
||||||
es5EntryJS: entries.map(
|
es5EntryJS: entries.map(
|
||||||
(entry) => `${publicRoot}/frontend_es5/${entry}.js`
|
(entry) => `${publicRoot}/frontend_es5/${entry}.js`
|
||||||
),
|
),
|
||||||
latestCustomPanelJS: useWDS
|
latestCustomPanelJS: `${publicRoot}/frontend_latest/custom-panel.js`,
|
||||||
? "http://localhost:8000/src/entrypoints/custom-panel.ts"
|
|
||||||
: `${publicRoot}/frontend_latest/custom-panel.js`,
|
|
||||||
es5CustomPanelJS: `${publicRoot}/frontend_es5/custom-panel.js`,
|
es5CustomPanelJS: `${publicRoot}/frontend_es5/custom-panel.js`,
|
||||||
}
|
}
|
||||||
);
|
);
|
||||||
@@ -177,12 +168,7 @@ const APP_PAGE_ENTRIES = {
|
|||||||
|
|
||||||
gulp.task(
|
gulp.task(
|
||||||
"gen-pages-app-dev",
|
"gen-pages-app-dev",
|
||||||
genPagesDevTask(
|
genPagesDevTask(APP_PAGE_ENTRIES, paths.polymer_dir, paths.app_output_root)
|
||||||
APP_PAGE_ENTRIES,
|
|
||||||
paths.polymer_dir,
|
|
||||||
paths.app_output_root,
|
|
||||||
env.useWDS()
|
|
||||||
)
|
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task(
|
gulp.task(
|
||||||
@@ -258,6 +244,28 @@ gulp.task(
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
const LANDING_PAGE_PAGE_ENTRIES = { "index.html": ["entrypoint"] };
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
"gen-pages-landing-page-dev",
|
||||||
|
genPagesDevTask(
|
||||||
|
LANDING_PAGE_PAGE_ENTRIES,
|
||||||
|
paths.landingPage_dir,
|
||||||
|
paths.landingPage_output_root
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
"gen-pages-landing-page-prod",
|
||||||
|
genPagesProdTask(
|
||||||
|
LANDING_PAGE_PAGE_ENTRIES,
|
||||||
|
paths.landingPage_dir,
|
||||||
|
paths.landingPage_output_root,
|
||||||
|
paths.landingPage_output_latest,
|
||||||
|
paths.landingPage_output_es5
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
const HASSIO_PAGE_ENTRIES = { "entrypoint.js": ["entrypoint"] };
|
const HASSIO_PAGE_ENTRIES = { "entrypoint.js": ["entrypoint"] };
|
||||||
|
|
||||||
gulp.task(
|
gulp.task(
|
||||||
@@ -266,7 +274,6 @@ gulp.task(
|
|||||||
HASSIO_PAGE_ENTRIES,
|
HASSIO_PAGE_ENTRIES,
|
||||||
paths.hassio_dir,
|
paths.hassio_dir,
|
||||||
paths.hassio_output_root,
|
paths.hassio_output_root,
|
||||||
undefined,
|
|
||||||
"src",
|
"src",
|
||||||
paths.hassio_publicPath
|
paths.hassio_publicPath
|
||||||
)
|
)
|
||||||
|
@@ -66,7 +66,7 @@ gulp.task("fetch-nightly-translations", async function () {
|
|||||||
tokenAuth = JSON.parse(await readFile(TOKEN_FILE, "utf-8"));
|
tokenAuth = JSON.parse(await readFile(TOKEN_FILE, "utf-8"));
|
||||||
} catch {
|
} catch {
|
||||||
if (!allowTokenSetup) {
|
if (!allowTokenSetup) {
|
||||||
console.log("No token found so build wil continue with English only");
|
console.log("No token found so build will continue with English only");
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
const auth = createOAuthDeviceAuth({
|
const auth = createOAuthDeviceAuth({
|
||||||
|
@@ -4,16 +4,14 @@ import gulp from "gulp";
|
|||||||
import yaml from "js-yaml";
|
import yaml from "js-yaml";
|
||||||
import { marked } from "marked";
|
import { marked } from "marked";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import env from "../env.cjs";
|
|
||||||
import paths from "../paths.cjs";
|
import paths from "../paths.cjs";
|
||||||
import "./clean.js";
|
import "./clean.js";
|
||||||
import "./entry-html.js";
|
import "./entry-html.js";
|
||||||
import "./gather-static.js";
|
import "./gather-static.js";
|
||||||
import "./gen-icons-json.js";
|
import "./gen-icons-json.js";
|
||||||
import "./rollup.js";
|
|
||||||
import "./service-worker.js";
|
import "./service-worker.js";
|
||||||
import "./translations.js";
|
import "./translations.js";
|
||||||
import "./webpack.js";
|
import "./rspack.js";
|
||||||
|
|
||||||
gulp.task("gather-gallery-pages", async function gatherPages() {
|
gulp.task("gather-gallery-pages", async function gatherPages() {
|
||||||
const pageDir = path.resolve(paths.gallery_dir, "src/pages");
|
const pageDir = path.resolve(paths.gallery_dir, "src/pages");
|
||||||
@@ -158,9 +156,7 @@ gulp.task(
|
|||||||
"copy-static-gallery",
|
"copy-static-gallery",
|
||||||
"gen-pages-gallery-dev",
|
"gen-pages-gallery-dev",
|
||||||
gulp.parallel(
|
gulp.parallel(
|
||||||
env.useRollup()
|
"rspack-dev-server-gallery",
|
||||||
? "rollup-dev-server-gallery"
|
|
||||||
: "webpack-dev-server-gallery",
|
|
||||||
async function watchMarkdownFiles() {
|
async function watchMarkdownFiles() {
|
||||||
gulp.watch(
|
gulp.watch(
|
||||||
[
|
[
|
||||||
@@ -189,7 +185,7 @@ gulp.task(
|
|||||||
"gather-gallery-pages"
|
"gather-gallery-pages"
|
||||||
),
|
),
|
||||||
"copy-static-gallery",
|
"copy-static-gallery",
|
||||||
env.useRollup() ? "rollup-prod-gallery" : "webpack-prod-gallery",
|
"rspack-prod-gallery",
|
||||||
"gen-pages-gallery-prod"
|
"gen-pages-gallery-prod"
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
@@ -4,7 +4,6 @@ import fs from "fs-extra";
|
|||||||
import gulp from "gulp";
|
import gulp from "gulp";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import paths from "../paths.cjs";
|
import paths from "../paths.cjs";
|
||||||
import env from "../env.cjs";
|
|
||||||
|
|
||||||
const npmPath = (...parts) =>
|
const npmPath = (...parts) =>
|
||||||
path.resolve(paths.polymer_dir, "node_modules", ...parts);
|
path.resolve(paths.polymer_dir, "node_modules", ...parts);
|
||||||
@@ -69,9 +68,6 @@ function copyPolyfills(staticDir) {
|
|||||||
}
|
}
|
||||||
|
|
||||||
function copyLoaderJS(staticDir) {
|
function copyLoaderJS(staticDir) {
|
||||||
if (!env.useRollup()) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
const staticPath = genStaticPath(staticDir);
|
const staticPath = genStaticPath(staticDir);
|
||||||
copyFileDir(npmPath("systemjs/dist/s.min.js"), staticPath("js"));
|
copyFileDir(npmPath("systemjs/dist/s.min.js"), staticPath("js"));
|
||||||
copyFileDir(npmPath("systemjs/dist/s.min.js.map"), staticPath("js"));
|
copyFileDir(npmPath("systemjs/dist/s.min.js.map"), staticPath("js"));
|
||||||
@@ -106,6 +102,14 @@ function copyMapPanel(staticDir) {
|
|||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function copyZXingWasm(staticDir) {
|
||||||
|
const staticPath = genStaticPath(staticDir);
|
||||||
|
copyFileDir(
|
||||||
|
npmPath("zxing-wasm/dist/reader/zxing_reader.wasm"),
|
||||||
|
staticPath("js")
|
||||||
|
);
|
||||||
|
}
|
||||||
|
|
||||||
gulp.task("copy-locale-data", async () => {
|
gulp.task("copy-locale-data", async () => {
|
||||||
const staticDir = paths.app_output_static;
|
const staticDir = paths.app_output_static;
|
||||||
copyLocaleData(staticDir);
|
copyLocaleData(staticDir);
|
||||||
@@ -121,6 +125,11 @@ gulp.task("copy-translations-supervisor", async () => {
|
|||||||
copyTranslations(staticDir);
|
copyTranslations(staticDir);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
gulp.task("copy-translations-landing-page", async () => {
|
||||||
|
const staticDir = paths.landingPage_output_static;
|
||||||
|
copyTranslations(staticDir);
|
||||||
|
});
|
||||||
|
|
||||||
gulp.task("copy-static-supervisor", async () => {
|
gulp.task("copy-static-supervisor", async () => {
|
||||||
const staticDir = paths.hassio_output_static;
|
const staticDir = paths.hassio_output_static;
|
||||||
copyLocaleData(staticDir);
|
copyLocaleData(staticDir);
|
||||||
@@ -143,6 +152,7 @@ gulp.task("copy-static-app", async () => {
|
|||||||
copyMapPanel(staticDir);
|
copyMapPanel(staticDir);
|
||||||
|
|
||||||
// Qr Scanner assets
|
// Qr Scanner assets
|
||||||
|
copyZXingWasm(staticDir);
|
||||||
copyQrScannerWorker(staticDir);
|
copyQrScannerWorker(staticDir);
|
||||||
});
|
});
|
||||||
|
|
||||||
@@ -194,3 +204,14 @@ gulp.task("copy-static-gallery", async () => {
|
|||||||
copyLocaleData(paths.gallery_output_static);
|
copyLocaleData(paths.gallery_output_static);
|
||||||
copyMdiIcons(paths.gallery_output_static);
|
copyMdiIcons(paths.gallery_output_static);
|
||||||
});
|
});
|
||||||
|
|
||||||
|
gulp.task("copy-static-landing-page", async () => {
|
||||||
|
// Copy landing-page static files
|
||||||
|
fs.copySync(
|
||||||
|
path.resolve(paths.landingPage_dir, "public"),
|
||||||
|
paths.landingPage_output_root
|
||||||
|
);
|
||||||
|
|
||||||
|
copyFonts(paths.landingPage_output_static);
|
||||||
|
copyTranslations(paths.landingPage_output_static);
|
||||||
|
});
|
||||||
|
@@ -5,9 +5,8 @@ import "./compress.js";
|
|||||||
import "./entry-html.js";
|
import "./entry-html.js";
|
||||||
import "./gather-static.js";
|
import "./gather-static.js";
|
||||||
import "./gen-icons-json.js";
|
import "./gen-icons-json.js";
|
||||||
import "./rollup.js";
|
|
||||||
import "./translations.js";
|
import "./translations.js";
|
||||||
import "./webpack.js";
|
import "./rspack.js";
|
||||||
|
|
||||||
gulp.task(
|
gulp.task(
|
||||||
"develop-hassio",
|
"develop-hassio",
|
||||||
@@ -22,7 +21,7 @@ gulp.task(
|
|||||||
"copy-translations-supervisor",
|
"copy-translations-supervisor",
|
||||||
"build-locale-data",
|
"build-locale-data",
|
||||||
"copy-static-supervisor",
|
"copy-static-supervisor",
|
||||||
env.useRollup() ? "rollup-watch-hassio" : "webpack-watch-hassio"
|
"rspack-watch-hassio"
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -38,7 +37,7 @@ gulp.task(
|
|||||||
"copy-translations-supervisor",
|
"copy-translations-supervisor",
|
||||||
"build-locale-data",
|
"build-locale-data",
|
||||||
"copy-static-supervisor",
|
"copy-static-supervisor",
|
||||||
env.useRollup() ? "rollup-prod-hassio" : "webpack-prod-hassio",
|
"rspack-prod-hassio",
|
||||||
"gen-pages-hassio-prod",
|
"gen-pages-hassio-prod",
|
||||||
...// Don't compress running tests
|
...// Don't compress running tests
|
||||||
(env.isTestBuild() ? [] : ["compress-hassio"])
|
(env.isTestBuild() ? [] : ["compress-hassio"])
|
||||||
|
41
build-scripts/gulp/landing-page.js
Normal file
41
build-scripts/gulp/landing-page.js
Normal file
@@ -0,0 +1,41 @@
|
|||||||
|
import gulp from "gulp";
|
||||||
|
import "./clean.js";
|
||||||
|
import "./compress.js";
|
||||||
|
import "./entry-html.js";
|
||||||
|
import "./gather-static.js";
|
||||||
|
import "./gen-icons-json.js";
|
||||||
|
import "./translations.js";
|
||||||
|
import "./rspack.js";
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
"develop-landing-page",
|
||||||
|
gulp.series(
|
||||||
|
async function setEnv() {
|
||||||
|
process.env.NODE_ENV = "development";
|
||||||
|
},
|
||||||
|
"clean-landing-page",
|
||||||
|
"translations-enable-merge-backend",
|
||||||
|
"build-landing-page-translations",
|
||||||
|
"copy-translations-landing-page",
|
||||||
|
"build-locale-data",
|
||||||
|
"copy-static-landing-page",
|
||||||
|
"gen-pages-landing-page-dev",
|
||||||
|
"rspack-watch-landing-page"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
"build-landing-page",
|
||||||
|
gulp.series(
|
||||||
|
async function setEnv() {
|
||||||
|
process.env.NODE_ENV = "production";
|
||||||
|
},
|
||||||
|
"clean-landing-page",
|
||||||
|
"build-landing-page-translations",
|
||||||
|
"copy-translations-landing-page",
|
||||||
|
"build-locale-data",
|
||||||
|
"copy-static-landing-page",
|
||||||
|
"rspack-prod-landing-page",
|
||||||
|
"gen-pages-landing-page-prod"
|
||||||
|
)
|
||||||
|
);
|
@@ -24,8 +24,11 @@ const convertToJSON = async (
|
|||||||
) => {
|
) => {
|
||||||
let localeData;
|
let localeData;
|
||||||
try {
|
try {
|
||||||
|
// use "pt" for "pt-BR", because "pt-BR" is unsupported by @formatjs
|
||||||
|
const language = lang === "pt-BR" ? "pt" : lang;
|
||||||
|
|
||||||
localeData = await readFile(
|
localeData = await readFile(
|
||||||
join(formatjsDir, pkg, subDir, `${lang}.js`),
|
join(formatjsDir, pkg, subDir, `${language}.js`),
|
||||||
"utf-8"
|
"utf-8"
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@@ -1,147 +0,0 @@
|
|||||||
// Tasks to run Rollup
|
|
||||||
|
|
||||||
import log from "fancy-log";
|
|
||||||
import gulp from "gulp";
|
|
||||||
import http from "http";
|
|
||||||
import open from "open";
|
|
||||||
import path from "path";
|
|
||||||
import { rollup } from "rollup";
|
|
||||||
import handler from "serve-handler";
|
|
||||||
import paths from "../paths.cjs";
|
|
||||||
import rollupConfig from "../rollup.cjs";
|
|
||||||
|
|
||||||
const bothBuilds = (createConfigFunc, params) =>
|
|
||||||
gulp.series(
|
|
||||||
async function buildLatest() {
|
|
||||||
await buildRollup(
|
|
||||||
createConfigFunc({
|
|
||||||
...params,
|
|
||||||
latestBuild: true,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
},
|
|
||||||
async function buildES5() {
|
|
||||||
await buildRollup(
|
|
||||||
createConfigFunc({
|
|
||||||
...params,
|
|
||||||
latestBuild: false,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
|
|
||||||
function createServer(serveOptions) {
|
|
||||||
const server = http.createServer((request, response) =>
|
|
||||||
handler(request, response, {
|
|
||||||
public: serveOptions.root,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
server.listen(
|
|
||||||
serveOptions.port,
|
|
||||||
serveOptions.networkAccess ? "0.0.0.0" : undefined,
|
|
||||||
() => {
|
|
||||||
log.info(`Available at http://localhost:${serveOptions.port}`);
|
|
||||||
open(`http://localhost:${serveOptions.port}`);
|
|
||||||
}
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
function watchRollup(createConfig, extraWatchSrc = [], serveOptions = null) {
|
|
||||||
const { inputOptions, outputOptions } = createConfig({
|
|
||||||
isProdBuild: false,
|
|
||||||
latestBuild: true,
|
|
||||||
});
|
|
||||||
|
|
||||||
const watcher = rollup.watch({
|
|
||||||
...inputOptions,
|
|
||||||
output: [outputOptions],
|
|
||||||
watch: {
|
|
||||||
include: ["src/**"] + extraWatchSrc,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
let startedHttp = false;
|
|
||||||
|
|
||||||
watcher.on("event", (event) => {
|
|
||||||
if (event.code === "BUNDLE_END") {
|
|
||||||
log(`Build done @ ${new Date().toLocaleTimeString()}`);
|
|
||||||
} else if (event.code === "ERROR") {
|
|
||||||
log.error(event.error);
|
|
||||||
} else if (event.code === "END") {
|
|
||||||
if (startedHttp || !serveOptions) {
|
|
||||||
return;
|
|
||||||
}
|
|
||||||
startedHttp = true;
|
|
||||||
createServer(serveOptions);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.watch(
|
|
||||||
path.join(paths.translations_src, "en.json"),
|
|
||||||
gulp.series("build-translations", "copy-translations-app")
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
async function buildRollup(config) {
|
|
||||||
const bundle = await rollup.rollup(config.inputOptions);
|
|
||||||
await bundle.write(config.outputOptions);
|
|
||||||
}
|
|
||||||
|
|
||||||
gulp.task("rollup-watch-app", () => {
|
|
||||||
watchRollup(rollupConfig.createAppConfig);
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("rollup-watch-hassio", () => {
|
|
||||||
watchRollup(rollupConfig.createHassioConfig, ["hassio/src/**"]);
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("rollup-dev-server-demo", () => {
|
|
||||||
watchRollup(rollupConfig.createDemoConfig, ["demo/src/**"], {
|
|
||||||
root: paths.demo_output_root,
|
|
||||||
port: 8090,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("rollup-dev-server-cast", () => {
|
|
||||||
watchRollup(rollupConfig.createCastConfig, ["cast/src/**"], {
|
|
||||||
root: paths.cast_output_root,
|
|
||||||
port: 8080,
|
|
||||||
networkAccess: true,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task("rollup-dev-server-gallery", () => {
|
|
||||||
watchRollup(rollupConfig.createGalleryConfig, ["gallery/src/**"], {
|
|
||||||
root: paths.gallery_output_root,
|
|
||||||
port: 8100,
|
|
||||||
});
|
|
||||||
});
|
|
||||||
|
|
||||||
gulp.task(
|
|
||||||
"rollup-prod-app",
|
|
||||||
bothBuilds(rollupConfig.createAppConfig, { isProdBuild: true })
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.task(
|
|
||||||
"rollup-prod-demo",
|
|
||||||
bothBuilds(rollupConfig.createDemoConfig, { isProdBuild: true })
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.task(
|
|
||||||
"rollup-prod-cast",
|
|
||||||
bothBuilds(rollupConfig.createCastConfig, { isProdBuild: true })
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.task("rollup-prod-hassio", () =>
|
|
||||||
bothBuilds(rollupConfig.createHassioConfig, { isProdBuild: true })
|
|
||||||
);
|
|
||||||
|
|
||||||
gulp.task("rollup-prod-gallery", () =>
|
|
||||||
buildRollup(
|
|
||||||
rollupConfig.createGalleryConfig({
|
|
||||||
isProdBuild: true,
|
|
||||||
latestBuild: true,
|
|
||||||
})
|
|
||||||
)
|
|
||||||
);
|
|
@@ -1,11 +1,11 @@
|
|||||||
// Tasks to run webpack.
|
// Tasks to run rspack.
|
||||||
|
|
||||||
import fs from "fs";
|
import fs from "fs";
|
||||||
import path from "path";
|
import path from "path";
|
||||||
import log from "fancy-log";
|
import log from "fancy-log";
|
||||||
import gulp from "gulp";
|
import gulp from "gulp";
|
||||||
import webpack from "webpack";
|
import rspack from "@rspack/core";
|
||||||
import WebpackDevServer from "webpack-dev-server";
|
import { RspackDevServer } from "@rspack/dev-server";
|
||||||
import env from "../env.cjs";
|
import env from "../env.cjs";
|
||||||
import paths from "../paths.cjs";
|
import paths from "../paths.cjs";
|
||||||
import {
|
import {
|
||||||
@@ -14,7 +14,8 @@ import {
|
|||||||
createDemoConfig,
|
createDemoConfig,
|
||||||
createGalleryConfig,
|
createGalleryConfig,
|
||||||
createHassioConfig,
|
createHassioConfig,
|
||||||
} from "../webpack.cjs";
|
createLandingPageConfig,
|
||||||
|
} from "../rspack.cjs";
|
||||||
|
|
||||||
const bothBuilds = (createConfigFunc, params) => [
|
const bothBuilds = (createConfigFunc, params) => [
|
||||||
createConfigFunc({ ...params, latestBuild: true }),
|
createConfigFunc({ ...params, latestBuild: true }),
|
||||||
@@ -30,7 +31,7 @@ const isWsl =
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* @param {{
|
* @param {{
|
||||||
* compiler: import("webpack").Compiler,
|
* compiler: import("@rspack/core").Compiler,
|
||||||
* contentBase: string,
|
* contentBase: string,
|
||||||
* port: number,
|
* port: number,
|
||||||
* listenHost?: string
|
* listenHost?: string
|
||||||
@@ -41,12 +42,13 @@ const runDevServer = async ({
|
|||||||
contentBase,
|
contentBase,
|
||||||
port,
|
port,
|
||||||
listenHost = undefined,
|
listenHost = undefined,
|
||||||
|
proxy = undefined,
|
||||||
}) => {
|
}) => {
|
||||||
if (listenHost === undefined) {
|
if (listenHost === undefined) {
|
||||||
// For dev container, we need to listen on all hosts
|
// For dev container, we need to listen on all hosts
|
||||||
listenHost = env.isDevContainer() ? "0.0.0.0" : "localhost";
|
listenHost = env.isDevContainer() ? "0.0.0.0" : "localhost";
|
||||||
}
|
}
|
||||||
const server = new WebpackDevServer(
|
const server = new RspackDevServer(
|
||||||
{
|
{
|
||||||
hot: false,
|
hot: false,
|
||||||
open: true,
|
open: true,
|
||||||
@@ -56,13 +58,14 @@ const runDevServer = async ({
|
|||||||
directory: contentBase,
|
directory: contentBase,
|
||||||
watch: true,
|
watch: true,
|
||||||
},
|
},
|
||||||
|
proxy,
|
||||||
},
|
},
|
||||||
compiler
|
compiler
|
||||||
);
|
);
|
||||||
|
|
||||||
await server.start();
|
await server.start();
|
||||||
// Server listening
|
// Server listening
|
||||||
log("[webpack-dev-server]", `Project is running at http://localhost:${port}`);
|
log("[rspack-dev-server]", `Project is running at http://localhost:${port}`);
|
||||||
};
|
};
|
||||||
|
|
||||||
const doneHandler = (done) => (err, stats) => {
|
const doneHandler = (done) => (err, stats) => {
|
||||||
@@ -87,16 +90,16 @@ const doneHandler = (done) => (err, stats) => {
|
|||||||
|
|
||||||
const prodBuild = (conf) =>
|
const prodBuild = (conf) =>
|
||||||
new Promise((resolve) => {
|
new Promise((resolve) => {
|
||||||
webpack(
|
rspack(
|
||||||
conf,
|
conf,
|
||||||
// Resolve promise when done. Because we pass a callback, webpack closes itself
|
// Resolve promise when done. Because we pass a callback, rspack closes itself
|
||||||
doneHandler(resolve)
|
doneHandler(resolve)
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task("webpack-watch-app", () => {
|
gulp.task("rspack-watch-app", () => {
|
||||||
// This command will run forever because we don't close compiler
|
// This command will run forever because we don't close compiler
|
||||||
webpack(
|
rspack(
|
||||||
process.env.ES5
|
process.env.ES5
|
||||||
? bothBuilds(createAppConfig, { isProdBuild: false })
|
? bothBuilds(createAppConfig, { isProdBuild: false })
|
||||||
: createAppConfig({ isProdBuild: false, latestBuild: true })
|
: createAppConfig({ isProdBuild: false, latestBuild: true })
|
||||||
@@ -107,7 +110,7 @@ gulp.task("webpack-watch-app", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task("webpack-prod-app", () =>
|
gulp.task("rspack-prod-app", () =>
|
||||||
prodBuild(
|
prodBuild(
|
||||||
bothBuilds(createAppConfig, {
|
bothBuilds(createAppConfig, {
|
||||||
isProdBuild: true,
|
isProdBuild: true,
|
||||||
@@ -117,9 +120,9 @@ gulp.task("webpack-prod-app", () =>
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("webpack-dev-server-demo", () =>
|
gulp.task("rspack-dev-server-demo", () =>
|
||||||
runDevServer({
|
runDevServer({
|
||||||
compiler: webpack(
|
compiler: rspack(
|
||||||
createDemoConfig({ isProdBuild: false, latestBuild: true })
|
createDemoConfig({ isProdBuild: false, latestBuild: true })
|
||||||
),
|
),
|
||||||
contentBase: paths.demo_output_root,
|
contentBase: paths.demo_output_root,
|
||||||
@@ -127,17 +130,18 @@ gulp.task("webpack-dev-server-demo", () =>
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("webpack-prod-demo", () =>
|
gulp.task("rspack-prod-demo", () =>
|
||||||
prodBuild(
|
prodBuild(
|
||||||
bothBuilds(createDemoConfig, {
|
bothBuilds(createDemoConfig, {
|
||||||
isProdBuild: true,
|
isProdBuild: true,
|
||||||
|
isStatsBuild: env.isStatsBuild(),
|
||||||
})
|
})
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("webpack-dev-server-cast", () =>
|
gulp.task("rspack-dev-server-cast", () =>
|
||||||
runDevServer({
|
runDevServer({
|
||||||
compiler: webpack(
|
compiler: rspack(
|
||||||
createCastConfig({ isProdBuild: false, latestBuild: true })
|
createCastConfig({ isProdBuild: false, latestBuild: true })
|
||||||
),
|
),
|
||||||
contentBase: paths.cast_output_root,
|
contentBase: paths.cast_output_root,
|
||||||
@@ -147,7 +151,7 @@ gulp.task("webpack-dev-server-cast", () =>
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("webpack-prod-cast", () =>
|
gulp.task("rspack-prod-cast", () =>
|
||||||
prodBuild(
|
prodBuild(
|
||||||
bothBuilds(createCastConfig, {
|
bothBuilds(createCastConfig, {
|
||||||
isProdBuild: true,
|
isProdBuild: true,
|
||||||
@@ -155,9 +159,9 @@ gulp.task("webpack-prod-cast", () =>
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("webpack-watch-hassio", () => {
|
gulp.task("rspack-watch-hassio", () => {
|
||||||
// This command will run forever because we don't close compiler
|
// This command will run forever because we don't close compiler
|
||||||
webpack(
|
rspack(
|
||||||
createHassioConfig({
|
createHassioConfig({
|
||||||
isProdBuild: false,
|
isProdBuild: false,
|
||||||
latestBuild: true,
|
latestBuild: true,
|
||||||
@@ -170,7 +174,7 @@ gulp.task("webpack-watch-hassio", () => {
|
|||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
|
||||||
gulp.task("webpack-prod-hassio", () =>
|
gulp.task("rspack-prod-hassio", () =>
|
||||||
prodBuild(
|
prodBuild(
|
||||||
bothBuilds(createHassioConfig, {
|
bothBuilds(createHassioConfig, {
|
||||||
isProdBuild: true,
|
isProdBuild: true,
|
||||||
@@ -180,9 +184,9 @@ gulp.task("webpack-prod-hassio", () =>
|
|||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("webpack-dev-server-gallery", () =>
|
gulp.task("rspack-dev-server-gallery", () =>
|
||||||
runDevServer({
|
runDevServer({
|
||||||
compiler: webpack(
|
compiler: rspack(
|
||||||
createGalleryConfig({ isProdBuild: false, latestBuild: true })
|
createGalleryConfig({ isProdBuild: false, latestBuild: true })
|
||||||
),
|
),
|
||||||
contentBase: paths.gallery_output_root,
|
contentBase: paths.gallery_output_root,
|
||||||
@@ -191,7 +195,7 @@ gulp.task("webpack-dev-server-gallery", () =>
|
|||||||
})
|
})
|
||||||
);
|
);
|
||||||
|
|
||||||
gulp.task("webpack-prod-gallery", () =>
|
gulp.task("rspack-prod-gallery", () =>
|
||||||
prodBuild(
|
prodBuild(
|
||||||
createGalleryConfig({
|
createGalleryConfig({
|
||||||
isProdBuild: true,
|
isProdBuild: true,
|
||||||
@@ -199,3 +203,30 @@ gulp.task("webpack-prod-gallery", () =>
|
|||||||
})
|
})
|
||||||
)
|
)
|
||||||
);
|
);
|
||||||
|
|
||||||
|
gulp.task("rspack-watch-landing-page", () => {
|
||||||
|
// This command will run forever because we don't close compiler
|
||||||
|
rspack(
|
||||||
|
process.env.ES5
|
||||||
|
? bothBuilds(createLandingPageConfig, { isProdBuild: false })
|
||||||
|
: createLandingPageConfig({ isProdBuild: false, latestBuild: true })
|
||||||
|
).watch({ poll: isWsl }, doneHandler());
|
||||||
|
|
||||||
|
gulp.watch(
|
||||||
|
path.join(paths.translations_src, "en.json"),
|
||||||
|
gulp.series(
|
||||||
|
"build-landing-page-translations",
|
||||||
|
"copy-translations-landing-page"
|
||||||
|
)
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
|
gulp.task("rspack-prod-landing-page", () =>
|
||||||
|
prodBuild(
|
||||||
|
bothBuilds(createLandingPageConfig, {
|
||||||
|
isProdBuild: true,
|
||||||
|
isStatsBuild: env.isStatsBuild(),
|
||||||
|
isTestBuild: env.isTestBuild(),
|
||||||
|
})
|
||||||
|
)
|
||||||
|
);
|
@@ -172,12 +172,14 @@ const createMasterTranslation = () =>
|
|||||||
|
|
||||||
const FRAGMENTS = ["base"];
|
const FRAGMENTS = ["base"];
|
||||||
|
|
||||||
const toggleSupervisorFragment = async () => {
|
const setFragment = (fragment) => async () => {
|
||||||
FRAGMENTS[0] = "supervisor";
|
FRAGMENTS[0] = fragment;
|
||||||
};
|
};
|
||||||
|
|
||||||
const panelFragment = (fragment) =>
|
const panelFragment = (fragment) =>
|
||||||
fragment !== "base" && fragment !== "supervisor";
|
fragment !== "base" &&
|
||||||
|
fragment !== "supervisor" &&
|
||||||
|
fragment !== "landing-page";
|
||||||
|
|
||||||
const HASHES = new Map();
|
const HASHES = new Map();
|
||||||
|
|
||||||
@@ -224,6 +226,9 @@ const createTranslations = async () => {
|
|||||||
case "supervisor":
|
case "supervisor":
|
||||||
// Supervisor key is at the top level
|
// Supervisor key is at the top level
|
||||||
return [flatten(data.supervisor), ""];
|
return [flatten(data.supervisor), ""];
|
||||||
|
case "landing-page":
|
||||||
|
// landing-page key is at the top level
|
||||||
|
return [flatten(data["landing-page"]), ""];
|
||||||
default:
|
default:
|
||||||
// Create a fragment with only the given panel
|
// Create a fragment with only the given panel
|
||||||
return [
|
return [
|
||||||
@@ -322,5 +327,10 @@ gulp.task(
|
|||||||
|
|
||||||
gulp.task(
|
gulp.task(
|
||||||
"build-supervisor-translations",
|
"build-supervisor-translations",
|
||||||
gulp.series(toggleSupervisorFragment, "build-translations")
|
gulp.series(setFragment("supervisor"), "build-translations")
|
||||||
|
);
|
||||||
|
|
||||||
|
gulp.task(
|
||||||
|
"build-landing-page-translations",
|
||||||
|
gulp.series(setFragment("landing-page"), "build-translations")
|
||||||
);
|
);
|
||||||
|
@@ -1,10 +0,0 @@
|
|||||||
import gulp from "gulp";
|
|
||||||
import { startDevServer } from "@web/dev-server";
|
|
||||||
|
|
||||||
gulp.task("wds-watch-app", async () => {
|
|
||||||
startDevServer({
|
|
||||||
config: {
|
|
||||||
watch: true,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
});
|
|
@@ -33,6 +33,22 @@ module.exports = {
|
|||||||
),
|
),
|
||||||
gallery_output_static: path.resolve(__dirname, "../gallery/dist/static"),
|
gallery_output_static: path.resolve(__dirname, "../gallery/dist/static"),
|
||||||
|
|
||||||
|
landingPage_dir: path.resolve(__dirname, "../landing-page"),
|
||||||
|
landingPage_build: path.resolve(__dirname, "../landing-page/build"),
|
||||||
|
landingPage_output_root: path.resolve(__dirname, "../landing-page/dist"),
|
||||||
|
landingPage_output_latest: path.resolve(
|
||||||
|
__dirname,
|
||||||
|
"../landing-page/dist/frontend_latest"
|
||||||
|
),
|
||||||
|
landingPage_output_es5: path.resolve(
|
||||||
|
__dirname,
|
||||||
|
"../landing-page/dist/frontend_es5"
|
||||||
|
),
|
||||||
|
landingPage_output_static: path.resolve(
|
||||||
|
__dirname,
|
||||||
|
"../landing-page/dist/static"
|
||||||
|
),
|
||||||
|
|
||||||
hassio_dir: path.resolve(__dirname, "../hassio"),
|
hassio_dir: path.resolve(__dirname, "../hassio"),
|
||||||
hassio_output_root: path.resolve(__dirname, "../hassio/build"),
|
hassio_output_root: path.resolve(__dirname, "../hassio/build"),
|
||||||
hassio_output_static: path.resolve(__dirname, "../hassio/build/static"),
|
hassio_output_static: path.resolve(__dirname, "../hassio/build/static"),
|
||||||
|
@@ -1,14 +0,0 @@
|
|||||||
module.exports = function (opts = {}) {
|
|
||||||
const dontHash = opts.dontHash || new Set();
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: "dont-hash",
|
|
||||||
renderChunk(_code, chunk, _options) {
|
|
||||||
if (!chunk.isEntry || !dontHash.has(chunk.name)) {
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
chunk.fileName = `${chunk.name}.js`;
|
|
||||||
return null;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
@@ -1,24 +0,0 @@
|
|||||||
module.exports = function (userOptions = {}) {
|
|
||||||
// Files need to be absolute paths.
|
|
||||||
// This only works if the file has no exports
|
|
||||||
// and only is imported for its side effects
|
|
||||||
const files = userOptions.files || [];
|
|
||||||
|
|
||||||
if (files.length === 0) {
|
|
||||||
return {
|
|
||||||
name: "ignore",
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: "ignore",
|
|
||||||
|
|
||||||
load(id) {
|
|
||||||
return files.some((toIgnorePath) => id.startsWith(toIgnorePath))
|
|
||||||
? {
|
|
||||||
code: "",
|
|
||||||
}
|
|
||||||
: null;
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
@@ -1,34 +0,0 @@
|
|||||||
const url = require("url");
|
|
||||||
|
|
||||||
const defaultOptions = {
|
|
||||||
publicPath: "",
|
|
||||||
};
|
|
||||||
|
|
||||||
module.exports = function (userOptions = {}) {
|
|
||||||
const options = { ...defaultOptions, ...userOptions };
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: "manifest",
|
|
||||||
generateBundle(outputOptions, bundle) {
|
|
||||||
const manifest = {};
|
|
||||||
|
|
||||||
for (const chunk of Object.values(bundle)) {
|
|
||||||
if (!chunk.isEntry) {
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
// Add js extension to mimic Webpack manifest.
|
|
||||||
manifest[`${chunk.name}.js`] = url.resolve(
|
|
||||||
options.publicPath,
|
|
||||||
chunk.fileName
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
this.emitFile({
|
|
||||||
type: "asset",
|
|
||||||
source: JSON.stringify(manifest, undefined, 2),
|
|
||||||
name: "manifest.json",
|
|
||||||
fileName: "manifest.json",
|
|
||||||
});
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
@@ -1,152 +0,0 @@
|
|||||||
// Worker plugin
|
|
||||||
// Each worker will include all of its dependencies
|
|
||||||
// instead of relying on an importer.
|
|
||||||
|
|
||||||
// Forked from v.1.4.1
|
|
||||||
// https://github.com/surma/rollup-plugin-off-main-thread
|
|
||||||
/**
|
|
||||||
* Copyright 2018 Google Inc. All Rights Reserved.
|
|
||||||
* Licensed under the Apache License, Version 2.0 (the "License");
|
|
||||||
* you may not use this file except in compliance with the License.
|
|
||||||
* You may obtain a copy of the License at
|
|
||||||
* http://www.apache.org/licenses/LICENSE-2.0
|
|
||||||
* Unless required by applicable law or agreed to in writing, software
|
|
||||||
* distributed under the License is distributed on an "AS IS" BASIS,
|
|
||||||
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
|
|
||||||
* See the License for the specific language governing permissions and
|
|
||||||
* limitations under the License.
|
|
||||||
*/
|
|
||||||
|
|
||||||
const rollup = require("rollup");
|
|
||||||
const path = require("path");
|
|
||||||
const MagicString = require("magic-string");
|
|
||||||
|
|
||||||
const defaultOpts = {
|
|
||||||
// A RegExp to find `new Workers()` calls. The second capture group _must_
|
|
||||||
// capture the provided file name without the quotes.
|
|
||||||
workerRegexp: /new Worker\((["'])(.+?)\1(,[^)]+)?\)/g,
|
|
||||||
plugins: ["node-resolve", "commonjs", "babel", "terser", "ignore"],
|
|
||||||
};
|
|
||||||
|
|
||||||
async function getBundledWorker(workerPath, rollupOptions) {
|
|
||||||
const bundle = await rollup.rollup({
|
|
||||||
...rollupOptions,
|
|
||||||
input: {
|
|
||||||
worker: workerPath,
|
|
||||||
},
|
|
||||||
});
|
|
||||||
const { output } = await bundle.generate({
|
|
||||||
// Generates cleanest output, we shouldn't have any imports/exports
|
|
||||||
// that would be incompatible with ES5.
|
|
||||||
format: "es",
|
|
||||||
// We should not export anything. This will fail build if we are.
|
|
||||||
exports: "none",
|
|
||||||
});
|
|
||||||
|
|
||||||
let code;
|
|
||||||
|
|
||||||
for (const chunkOrAsset of output) {
|
|
||||||
if (chunkOrAsset.name === "worker") {
|
|
||||||
code = chunkOrAsset.code;
|
|
||||||
} else if (chunkOrAsset.type !== "asset") {
|
|
||||||
throw new Error("Unexpected extra output");
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return code;
|
|
||||||
}
|
|
||||||
|
|
||||||
module.exports = function (opts = {}) {
|
|
||||||
opts = { ...defaultOpts, ...opts };
|
|
||||||
|
|
||||||
let rollupOptions;
|
|
||||||
let refIds;
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: "hass-worker",
|
|
||||||
|
|
||||||
async buildStart(options) {
|
|
||||||
refIds = {};
|
|
||||||
rollupOptions = {
|
|
||||||
plugins: options.plugins.filter((plugin) =>
|
|
||||||
opts.plugins.includes(plugin.name)
|
|
||||||
),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
|
|
||||||
async transform(code, id) {
|
|
||||||
// Copy the regexp as they are stateful and this hook is async.
|
|
||||||
const workerRegexp = new RegExp(
|
|
||||||
opts.workerRegexp.source,
|
|
||||||
opts.workerRegexp.flags
|
|
||||||
);
|
|
||||||
if (!workerRegexp.test(code)) {
|
|
||||||
return undefined;
|
|
||||||
}
|
|
||||||
|
|
||||||
const ms = new MagicString(code);
|
|
||||||
// Reset the regexp
|
|
||||||
workerRegexp.lastIndex = 0;
|
|
||||||
for (;;) {
|
|
||||||
const match = workerRegexp.exec(code);
|
|
||||||
if (!match) {
|
|
||||||
break;
|
|
||||||
}
|
|
||||||
|
|
||||||
const workerFile = match[2];
|
|
||||||
let optionsObject = {};
|
|
||||||
// Parse the optional options object
|
|
||||||
if (match[3] && match[3].length > 0) {
|
|
||||||
// FIXME: ooooof!
|
|
||||||
// eslint-disable-next-line @typescript-eslint/no-implied-eval
|
|
||||||
optionsObject = new Function(`return ${match[3].slice(1)};`)();
|
|
||||||
}
|
|
||||||
delete optionsObject.type;
|
|
||||||
|
|
||||||
if (!/^.*\//.test(workerFile)) {
|
|
||||||
this.warn(
|
|
||||||
`Paths passed to the Worker constructor must be relative or absolute, i.e. start with /, ./ or ../ (just like dynamic import!). Ignoring "${workerFile}".`
|
|
||||||
);
|
|
||||||
continue;
|
|
||||||
}
|
|
||||||
|
|
||||||
// Find worker file and store it as a chunk with ID prefixed for our loader
|
|
||||||
// eslint-disable-next-line no-await-in-loop
|
|
||||||
const resolvedWorkerFile = (await this.resolve(workerFile, id)).id;
|
|
||||||
let chunkRefId;
|
|
||||||
if (resolvedWorkerFile in refIds) {
|
|
||||||
chunkRefId = refIds[resolvedWorkerFile];
|
|
||||||
} else {
|
|
||||||
this.addWatchFile(resolvedWorkerFile);
|
|
||||||
// eslint-disable-next-line no-await-in-loop
|
|
||||||
const source = await getBundledWorker(
|
|
||||||
resolvedWorkerFile,
|
|
||||||
rollupOptions
|
|
||||||
);
|
|
||||||
chunkRefId = refIds[resolvedWorkerFile] = this.emitFile({
|
|
||||||
name: path.basename(resolvedWorkerFile),
|
|
||||||
source,
|
|
||||||
type: "asset",
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
const workerParametersStartIndex = match.index + "new Worker(".length;
|
|
||||||
const workerParametersEndIndex =
|
|
||||||
match.index + match[0].length - ")".length;
|
|
||||||
|
|
||||||
ms.overwrite(
|
|
||||||
workerParametersStartIndex,
|
|
||||||
workerParametersEndIndex,
|
|
||||||
`import.meta.ROLLUP_FILE_URL_${chunkRefId}, ${JSON.stringify(
|
|
||||||
optionsObject
|
|
||||||
)}`
|
|
||||||
);
|
|
||||||
}
|
|
||||||
|
|
||||||
return {
|
|
||||||
code: ms.toString(),
|
|
||||||
map: ms.generateMap({ hires: true }),
|
|
||||||
};
|
|
||||||
},
|
|
||||||
};
|
|
||||||
};
|
|
@@ -1,146 +0,0 @@
|
|||||||
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 replace = require("@rollup/plugin-replace");
|
|
||||||
const visualizer = require("rollup-plugin-visualizer");
|
|
||||||
const { string } = require("rollup-plugin-string");
|
|
||||||
const { terser } = require("rollup-plugin-terser");
|
|
||||||
const manifest = require("./rollup-plugins/manifest-plugin.cjs");
|
|
||||||
const worker = require("./rollup-plugins/worker-plugin.cjs");
|
|
||||||
const dontHashPlugin = require("./rollup-plugins/dont-hash-plugin.cjs");
|
|
||||||
const ignore = require("./rollup-plugins/ignore-plugin.cjs");
|
|
||||||
|
|
||||||
const bundle = require("./bundle.cjs");
|
|
||||||
const paths = require("./paths.cjs");
|
|
||||||
|
|
||||||
const extensions = [".js", ".ts"];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* @param {Object} arg
|
|
||||||
* @param { import("rollup").InputOption } arg.input
|
|
||||||
*/
|
|
||||||
const createRollupConfig = ({
|
|
||||||
entry,
|
|
||||||
outputPath,
|
|
||||||
defineOverlay,
|
|
||||||
isProdBuild,
|
|
||||||
latestBuild,
|
|
||||||
isStatsBuild,
|
|
||||||
publicPath,
|
|
||||||
dontHash,
|
|
||||||
isWDS,
|
|
||||||
}) => ({
|
|
||||||
/**
|
|
||||||
* @type { import("rollup").InputOptions }
|
|
||||||
*/
|
|
||||||
inputOptions: {
|
|
||||||
input: entry,
|
|
||||||
// Some entry points contain no JavaScript. This setting silences a warning about that.
|
|
||||||
// https://rollupjs.org/configuration-options/#preserveentrysignatures
|
|
||||||
preserveEntrySignatures: false,
|
|
||||||
plugins: [
|
|
||||||
ignore({
|
|
||||||
files: bundle
|
|
||||||
.emptyPackages({ latestBuild })
|
|
||||||
// TEMP HACK: Makes Rollup build work again
|
|
||||||
.concat(
|
|
||||||
require.resolve(
|
|
||||||
"@webcomponents/scoped-custom-element-registry/scoped-custom-element-registry.min"
|
|
||||||
)
|
|
||||||
),
|
|
||||||
}),
|
|
||||||
resolve({
|
|
||||||
extensions,
|
|
||||||
preferBuiltins: false,
|
|
||||||
browser: true,
|
|
||||||
rootDir: paths.polymer_dir,
|
|
||||||
}),
|
|
||||||
commonjs(),
|
|
||||||
json(),
|
|
||||||
babel({
|
|
||||||
...bundle.babelOptions({ latestBuild, isProdBuild }),
|
|
||||||
extensions,
|
|
||||||
babelHelpers: isWDS ? "inline" : "bundled",
|
|
||||||
}),
|
|
||||||
string({
|
|
||||||
// Import certain extensions as strings
|
|
||||||
include: [path.join(paths.polymer_dir, "node_modules/**/*.css")],
|
|
||||||
}),
|
|
||||||
replace(bundle.definedVars({ isProdBuild, latestBuild, defineOverlay })),
|
|
||||||
!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 }
|
|
||||||
*/
|
|
||||||
outputOptions: {
|
|
||||||
// https://rollupjs.org/configuration-options/#output-dir
|
|
||||||
dir: outputPath,
|
|
||||||
// https://rollupjs.org/configuration-options/#output-format
|
|
||||||
format: latestBuild ? "es" : "systemjs",
|
|
||||||
// https://rollupjs.org/configuration-options/#output-externallivebindings
|
|
||||||
externalLiveBindings: false,
|
|
||||||
// https://rollupjs.org/configuration-options/#output-entryfilenames
|
|
||||||
// https://rollupjs.org/configuration-options/#output-chunkfilenames
|
|
||||||
// https://rollupjs.org/configuration-options/#output-assetfilenames
|
|
||||||
entryFileNames:
|
|
||||||
isProdBuild && !isStatsBuild ? "[name]-[hash].js" : "[name].js",
|
|
||||||
chunkFileNames: isProdBuild && !isStatsBuild ? "c.[hash].js" : "[name].js",
|
|
||||||
assetFileNames: isProdBuild && !isStatsBuild ? "a.[hash].js" : "[name].js",
|
|
||||||
// https://rollupjs.org/configuration-options/#output-sourcemap
|
|
||||||
sourcemap: isProdBuild ? true : "inline",
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
const createAppConfig = ({ isProdBuild, latestBuild, isStatsBuild, isWDS }) =>
|
|
||||||
createRollupConfig(
|
|
||||||
bundle.config.app({
|
|
||||||
isProdBuild,
|
|
||||||
latestBuild,
|
|
||||||
isStatsBuild,
|
|
||||||
isWDS,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) =>
|
|
||||||
createRollupConfig(
|
|
||||||
bundle.config.demo({
|
|
||||||
isProdBuild,
|
|
||||||
latestBuild,
|
|
||||||
isStatsBuild,
|
|
||||||
})
|
|
||||||
);
|
|
||||||
|
|
||||||
const createCastConfig = ({ isProdBuild, latestBuild }) =>
|
|
||||||
createRollupConfig(bundle.config.cast({ isProdBuild, latestBuild }));
|
|
||||||
|
|
||||||
const createHassioConfig = ({ isProdBuild, latestBuild }) =>
|
|
||||||
createRollupConfig(bundle.config.hassio({ isProdBuild, latestBuild }));
|
|
||||||
|
|
||||||
const createGalleryConfig = ({ isProdBuild, latestBuild }) =>
|
|
||||||
createRollupConfig(bundle.config.gallery({ isProdBuild, latestBuild }));
|
|
||||||
|
|
||||||
module.exports = {
|
|
||||||
createAppConfig,
|
|
||||||
createDemoConfig,
|
|
||||||
createCastConfig,
|
|
||||||
createHassioConfig,
|
|
||||||
createGalleryConfig,
|
|
||||||
createRollupConfig,
|
|
||||||
};
|
|
@@ -1,16 +1,13 @@
|
|||||||
const { existsSync } = require("fs");
|
const { existsSync } = require("fs");
|
||||||
const path = require("path");
|
const path = require("path");
|
||||||
const webpack = require("webpack");
|
const rspack = require("@rspack/core");
|
||||||
|
const { RsdoctorRspackPlugin } = require("@rsdoctor/rspack-plugin");
|
||||||
const { StatsWriterPlugin } = require("webpack-stats-plugin");
|
const { StatsWriterPlugin } = require("webpack-stats-plugin");
|
||||||
const filterStats = require("@bundle-stats/plugin-webpack-filter").default;
|
const filterStats = require("@bundle-stats/plugin-webpack-filter").default;
|
||||||
const TerserPlugin = require("terser-webpack-plugin");
|
const TerserPlugin = require("terser-webpack-plugin");
|
||||||
const { WebpackManifestPlugin } = require("webpack-manifest-plugin");
|
const { WebpackManifestPlugin } = require("rspack-manifest-plugin");
|
||||||
const log = require("fancy-log");
|
const log = require("fancy-log");
|
||||||
const WebpackBar = require("webpackbar");
|
const WebpackBar = require("webpackbar/rspack");
|
||||||
const {
|
|
||||||
TransformAsyncModulesPlugin,
|
|
||||||
} = require("transform-async-modules-webpack-plugin");
|
|
||||||
const { dependencies } = require("../package.json");
|
|
||||||
const paths = require("./paths.cjs");
|
const paths = require("./paths.cjs");
|
||||||
const bundle = require("./bundle.cjs");
|
const bundle = require("./bundle.cjs");
|
||||||
|
|
||||||
@@ -28,7 +25,7 @@ class LogStartCompilePlugin {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
const createWebpackConfig = ({
|
const createRspackConfig = ({
|
||||||
name,
|
name,
|
||||||
entry,
|
entry,
|
||||||
outputPath,
|
outputPath,
|
||||||
@@ -102,13 +99,18 @@ const createWebpackConfig = ({
|
|||||||
splitChunks: {
|
splitChunks: {
|
||||||
// Disable splitting for web workers and worklets because imports of
|
// Disable splitting for web workers and worklets because imports of
|
||||||
// external chunks are broken for:
|
// external chunks are broken for:
|
||||||
// - ESM output: https://github.com/webpack/webpack/issues/17014
|
chunks: !isProdBuild
|
||||||
// - Worklets use `importScripts`: https://github.com/webpack/webpack/issues/11543
|
? // improve incremental build speed, but blows up bundle size
|
||||||
chunks: (chunk) =>
|
new RegExp(
|
||||||
!chunk.canBeInitial() &&
|
`^(?!(${Object.keys(entry).join("|")}|.*work(?:er|let))$)`
|
||||||
!new RegExp(`^.+-work${latestBuild ? "(?:let|er)" : "let"}$`).test(
|
)
|
||||||
chunk.name
|
: // - ESM output: https://github.com/webpack/webpack/issues/17014
|
||||||
),
|
// - Worklets use `importScripts`: https://github.com/webpack/webpack/issues/11543
|
||||||
|
(chunk) =>
|
||||||
|
!chunk.canBeInitial() &&
|
||||||
|
!new RegExp(
|
||||||
|
`^.+-work${latestBuild ? "(?:let|er)" : "let"}$`
|
||||||
|
).test(chunk.name),
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
plugins: [
|
plugins: [
|
||||||
@@ -117,10 +119,10 @@ const createWebpackConfig = ({
|
|||||||
// Only include the JS of entrypoints
|
// Only include the JS of entrypoints
|
||||||
filter: (file) => file.isInitial && !file.name.endsWith(".map"),
|
filter: (file) => file.isInitial && !file.name.endsWith(".map"),
|
||||||
}),
|
}),
|
||||||
new webpack.DefinePlugin(
|
new rspack.DefinePlugin(
|
||||||
bundle.definedVars({ isProdBuild, latestBuild, defineOverlay })
|
bundle.definedVars({ isProdBuild, latestBuild, defineOverlay })
|
||||||
),
|
),
|
||||||
new webpack.IgnorePlugin({
|
new rspack.IgnorePlugin({
|
||||||
checkResource(resource, context) {
|
checkResource(resource, context) {
|
||||||
// Only use ignore to intercept imports that we don't control
|
// Only use ignore to intercept imports that we don't control
|
||||||
// inside node_module dependencies.
|
// inside node_module dependencies.
|
||||||
@@ -152,7 +154,7 @@ const createWebpackConfig = ({
|
|||||||
);
|
);
|
||||||
},
|
},
|
||||||
}),
|
}),
|
||||||
new webpack.NormalModuleReplacementPlugin(
|
new rspack.NormalModuleReplacementPlugin(
|
||||||
new RegExp(
|
new RegExp(
|
||||||
bundle.emptyPackages({ latestBuild, isHassioBuild }).join("|")
|
bundle.emptyPackages({ latestBuild, isHassioBuild }).join("|")
|
||||||
),
|
),
|
||||||
@@ -168,10 +170,14 @@ const createWebpackConfig = ({
|
|||||||
stats: { assets: true, chunks: true, modules: true },
|
stats: { assets: true, chunks: true, modules: true },
|
||||||
transform: (stats) => JSON.stringify(filterStats(stats)),
|
transform: (stats) => JSON.stringify(filterStats(stats)),
|
||||||
}),
|
}),
|
||||||
!latestBuild &&
|
isProdBuild &&
|
||||||
new TransformAsyncModulesPlugin({
|
isStatsBuild &&
|
||||||
browserslistEnv: "legacy",
|
new RsdoctorRspackPlugin({
|
||||||
runtime: { version: dependencies["@babel/runtime"] },
|
reportDir: path.join(paths.build_dir, "rsdoctor"),
|
||||||
|
features: ["plugins", "bundle"],
|
||||||
|
supports: {
|
||||||
|
generateTileGraph: true,
|
||||||
|
},
|
||||||
}),
|
}),
|
||||||
].filter(Boolean),
|
].filter(Boolean),
|
||||||
resolve: {
|
resolve: {
|
||||||
@@ -188,6 +194,7 @@ const createWebpackConfig = ({
|
|||||||
"lit/directives/cache$": "lit/directives/cache.js",
|
"lit/directives/cache$": "lit/directives/cache.js",
|
||||||
"lit/directives/repeat$": "lit/directives/repeat.js",
|
"lit/directives/repeat$": "lit/directives/repeat.js",
|
||||||
"lit/directives/live$": "lit/directives/live.js",
|
"lit/directives/live$": "lit/directives/live.js",
|
||||||
|
"lit/directives/keyed$": "lit/directives/keyed.js",
|
||||||
"lit/polyfill-support$": "lit/polyfill-support.js",
|
"lit/polyfill-support$": "lit/polyfill-support.js",
|
||||||
"@lit-labs/virtualizer/layouts/grid":
|
"@lit-labs/virtualizer/layouts/grid":
|
||||||
"@lit-labs/virtualizer/layouts/grid.js",
|
"@lit-labs/virtualizer/layouts/grid.js",
|
||||||
@@ -209,8 +216,6 @@ const createWebpackConfig = ({
|
|||||||
isProdBuild && !isStatsBuild ? "[id].[contenthash][ext]" : "[id][ext]",
|
isProdBuild && !isStatsBuild ? "[id].[contenthash][ext]" : "[id][ext]",
|
||||||
crossOriginLoading: "use-credentials",
|
crossOriginLoading: "use-credentials",
|
||||||
hashFunction: "xxhash64",
|
hashFunction: "xxhash64",
|
||||||
hashDigest: "base64url",
|
|
||||||
hashDigestLength: 11, // full length of 64 bit base64url
|
|
||||||
path: outputPath,
|
path: outputPath,
|
||||||
publicPath,
|
publicPath,
|
||||||
// To silence warning in worker plugin
|
// To silence warning in worker plugin
|
||||||
@@ -252,17 +257,17 @@ const createAppConfig = ({
|
|||||||
isStatsBuild,
|
isStatsBuild,
|
||||||
isTestBuild,
|
isTestBuild,
|
||||||
}) =>
|
}) =>
|
||||||
createWebpackConfig(
|
createRspackConfig(
|
||||||
bundle.config.app({ isProdBuild, latestBuild, isStatsBuild, isTestBuild })
|
bundle.config.app({ isProdBuild, latestBuild, isStatsBuild, isTestBuild })
|
||||||
);
|
);
|
||||||
|
|
||||||
const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) =>
|
const createDemoConfig = ({ isProdBuild, latestBuild, isStatsBuild }) =>
|
||||||
createWebpackConfig(
|
createRspackConfig(
|
||||||
bundle.config.demo({ isProdBuild, latestBuild, isStatsBuild })
|
bundle.config.demo({ isProdBuild, latestBuild, isStatsBuild })
|
||||||
);
|
);
|
||||||
|
|
||||||
const createCastConfig = ({ isProdBuild, latestBuild }) =>
|
const createCastConfig = ({ isProdBuild, latestBuild }) =>
|
||||||
createWebpackConfig(bundle.config.cast({ isProdBuild, latestBuild }));
|
createRspackConfig(bundle.config.cast({ isProdBuild, latestBuild }));
|
||||||
|
|
||||||
const createHassioConfig = ({
|
const createHassioConfig = ({
|
||||||
isProdBuild,
|
isProdBuild,
|
||||||
@@ -270,7 +275,7 @@ const createHassioConfig = ({
|
|||||||
isStatsBuild,
|
isStatsBuild,
|
||||||
isTestBuild,
|
isTestBuild,
|
||||||
}) =>
|
}) =>
|
||||||
createWebpackConfig(
|
createRspackConfig(
|
||||||
bundle.config.hassio({
|
bundle.config.hassio({
|
||||||
isProdBuild,
|
isProdBuild,
|
||||||
latestBuild,
|
latestBuild,
|
||||||
@@ -280,7 +285,10 @@ const createHassioConfig = ({
|
|||||||
);
|
);
|
||||||
|
|
||||||
const createGalleryConfig = ({ isProdBuild, latestBuild }) =>
|
const createGalleryConfig = ({ isProdBuild, latestBuild }) =>
|
||||||
createWebpackConfig(bundle.config.gallery({ isProdBuild, latestBuild }));
|
createRspackConfig(bundle.config.gallery({ isProdBuild, latestBuild }));
|
||||||
|
|
||||||
|
const createLandingPageConfig = ({ isProdBuild, latestBuild }) =>
|
||||||
|
createRspackConfig(bundle.config.landingPage({ isProdBuild, latestBuild }));
|
||||||
|
|
||||||
module.exports = {
|
module.exports = {
|
||||||
createAppConfig,
|
createAppConfig,
|
||||||
@@ -288,5 +296,6 @@ module.exports = {
|
|||||||
createCastConfig,
|
createCastConfig,
|
||||||
createHassioConfig,
|
createHassioConfig,
|
||||||
createGalleryConfig,
|
createGalleryConfig,
|
||||||
createWebpackConfig,
|
createRspackConfig,
|
||||||
|
createLandingPageConfig,
|
||||||
};
|
};
|
@@ -1,10 +0,0 @@
|
|||||||
import rollup from "../build-scripts/rollup.cjs";
|
|
||||||
import env from "../build-scripts/env.cjs";
|
|
||||||
|
|
||||||
const config = rollup.createCastConfig({
|
|
||||||
isProdBuild: env.isProdBuild(),
|
|
||||||
latestBuild: true,
|
|
||||||
isStatsBuild: env.isStatsBuild(),
|
|
||||||
});
|
|
||||||
|
|
||||||
export default { ...config.inputOptions, output: config.outputOptions };
|
|
@@ -1,10 +1,12 @@
|
|||||||
import "@material/mwc-button/mwc-button";
|
import "@material/mwc-button/mwc-button";
|
||||||
import { ActionDetail } from "@material/mwc-list/mwc-list";
|
import "@material/mwc-list/mwc-list";
|
||||||
|
import type { ActionDetail } from "@material/mwc-list/mwc-list";
|
||||||
import { mdiCast, mdiCastConnected, mdiViewDashboard } from "@mdi/js";
|
import { mdiCast, mdiCastConnected, mdiViewDashboard } from "@mdi/js";
|
||||||
import { Auth, Connection } from "home-assistant-js-websocket";
|
import type { Auth, Connection } from "home-assistant-js-websocket";
|
||||||
import { CSSResultGroup, LitElement, TemplateResult, css, html } from "lit";
|
import type { CSSResultGroup, TemplateResult } from "lit";
|
||||||
|
import { LitElement, css, html } from "lit";
|
||||||
import { customElement, property, state } from "lit/decorators";
|
import { customElement, property, state } from "lit/decorators";
|
||||||
import { CastManager } from "../../../../src/cast/cast_manager";
|
import type { CastManager } from "../../../../src/cast/cast_manager";
|
||||||
import {
|
import {
|
||||||
castSendShowLovelaceView,
|
castSendShowLovelaceView,
|
||||||
ensureConnectedCastSession,
|
ensureConnectedCastSession,
|
||||||
@@ -23,7 +25,7 @@ import {
|
|||||||
getLovelaceCollection,
|
getLovelaceCollection,
|
||||||
} from "../../../../src/data/lovelace";
|
} from "../../../../src/data/lovelace";
|
||||||
import { isStrategyDashboard } from "../../../../src/data/lovelace/config/types";
|
import { isStrategyDashboard } from "../../../../src/data/lovelace/config/types";
|
||||||
import { LovelaceViewConfig } from "../../../../src/data/lovelace/config/view";
|
import type { LovelaceViewConfig } from "../../../../src/data/lovelace/config/view";
|
||||||
import "../../../../src/layouts/hass-loading-screen";
|
import "../../../../src/layouts/hass-loading-screen";
|
||||||
import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config";
|
import { generateDefaultViewConfig } from "../../../../src/panels/lovelace/common/generate-lovelace-config";
|
||||||
import "./hc-layout";
|
import "./hc-layout";
|
||||||
@@ -89,8 +91,8 @@ class HcCast extends LitElement {
|
|||||||
generateDefaultViewConfig({}, {}, {}, {}, () => ""),
|
generateDefaultViewConfig({}, {}, {}, {}, () => ""),
|
||||||
]
|
]
|
||||||
).map(
|
).map(
|
||||||
(view, idx) =>
|
(view, idx) => html`
|
||||||
html`<ha-list-item
|
<ha-list-item
|
||||||
graphic="avatar"
|
graphic="avatar"
|
||||||
.activated=${this.castManager.status?.lovelacePath ===
|
.activated=${this.castManager.status?.lovelacePath ===
|
||||||
(view.path ?? idx)}
|
(view.path ?? idx)}
|
||||||
@@ -108,8 +110,9 @@ class HcCast extends LitElement {
|
|||||||
: html`<ha-svg-icon
|
: html`<ha-svg-icon
|
||||||
slot="item-icon"
|
slot="item-icon"
|
||||||
.path=${mdiViewDashboard}
|
.path=${mdiViewDashboard}
|
||||||
></ha-svg-icon>`}</ha-list-item
|
></ha-svg-icon>`}
|
||||||
> `
|
</ha-list-item>
|
||||||
|
`
|
||||||
)}</mwc-list
|
)}</mwc-list
|
||||||
>
|
>
|
||||||
`}
|
`}
|
||||||
|
@@ -1,19 +1,23 @@
|
|||||||
import "@material/mwc-button";
|
import "@material/mwc-button";
|
||||||
import { mdiCastConnected, mdiCast } from "@mdi/js";
|
import { mdiCastConnected, mdiCast } from "@mdi/js";
|
||||||
import {
|
import type {
|
||||||
Auth,
|
Auth,
|
||||||
Connection,
|
Connection,
|
||||||
|
getAuthOptions,
|
||||||
|
} from "home-assistant-js-websocket";
|
||||||
|
import {
|
||||||
createConnection,
|
createConnection,
|
||||||
ERR_CANNOT_CONNECT,
|
ERR_CANNOT_CONNECT,
|
||||||
ERR_HASS_HOST_REQUIRED,
|
ERR_HASS_HOST_REQUIRED,
|
||||||
ERR_INVALID_AUTH,
|
ERR_INVALID_AUTH,
|
||||||
ERR_INVALID_HTTPS_TO_HTTP,
|
ERR_INVALID_HTTPS_TO_HTTP,
|
||||||
getAuth,
|
getAuth,
|
||||||
getAuthOptions,
|
|
||||||
} from "home-assistant-js-websocket";
|
} from "home-assistant-js-websocket";
|
||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
import type { CSSResultGroup, TemplateResult } from "lit";
|
||||||
|
import { css, html, LitElement } from "lit";
|
||||||
import { customElement, state } from "lit/decorators";
|
import { customElement, state } from "lit/decorators";
|
||||||
import { CastManager, getCastManager } from "../../../../src/cast/cast_manager";
|
import type { CastManager } from "../../../../src/cast/cast_manager";
|
||||||
|
import { getCastManager } from "../../../../src/cast/cast_manager";
|
||||||
import { castSendShowDemo } from "../../../../src/cast/receiver_messages";
|
import { castSendShowDemo } from "../../../../src/cast/receiver_messages";
|
||||||
import {
|
import {
|
||||||
loadTokens,
|
loadTokens,
|
||||||
|
@@ -1,10 +1,7 @@
|
|||||||
import {
|
import type { Auth, Connection, HassUser } from "home-assistant-js-websocket";
|
||||||
Auth,
|
import { getUser } from "home-assistant-js-websocket";
|
||||||
Connection,
|
import type { CSSResultGroup, TemplateResult } from "lit";
|
||||||
getUser,
|
import { css, html, LitElement } from "lit";
|
||||||
HassUser,
|
|
||||||
} from "home-assistant-js-websocket";
|
|
||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
|
||||||
import { customElement, property } from "lit/decorators";
|
import { customElement, property } from "lit/decorators";
|
||||||
import "../../../../src/components/ha-card";
|
import "../../../../src/components/ha-card";
|
||||||
|
|
||||||
@@ -88,7 +85,7 @@ class HcLayout extends LitElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
.card-header {
|
.card-header {
|
||||||
color: var(--ha-card-header-color, --primary-text-color);
|
color: var(--ha-card-header-color, var(--primary-text-color));
|
||||||
font-family: var(--ha-card-header-font-family, inherit);
|
font-family: var(--ha-card-header-font-family, inherit);
|
||||||
font-size: var(--ha-card-header-font-size, 24px);
|
font-size: var(--ha-card-header-font-size, 24px);
|
||||||
letter-spacing: -0.012em;
|
letter-spacing: -0.012em;
|
||||||
|
@@ -1,4 +1,5 @@
|
|||||||
import { convertEntities, Entity } from "../../../../src/fake_data/entity";
|
import type { Entity } from "../../../../src/fake_data/entity";
|
||||||
|
import { convertEntities } from "../../../../src/fake_data/entity";
|
||||||
|
|
||||||
export const castDemoEntities: () => Entity[] = () =>
|
export const castDemoEntities: () => Entity[] = () =>
|
||||||
convertEntities({
|
convertEntities({
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { LovelaceCardConfig } from "../../../../src/data/lovelace/config/card";
|
import type { LovelaceCardConfig } from "../../../../src/data/lovelace/config/card";
|
||||||
import { LovelaceConfig } from "../../../../src/data/lovelace/config/types";
|
import type { LovelaceConfig } from "../../../../src/data/lovelace/config/types";
|
||||||
import { castContext } from "../cast_context";
|
import { castContext } from "../cast_context";
|
||||||
|
|
||||||
export const castDemoLovelace: () => LovelaceConfig = () => {
|
export const castDemoLovelace: () => LovelaceConfig = () => {
|
||||||
|
@@ -1,10 +1,10 @@
|
|||||||
import { framework } from "./cast_framework";
|
import { framework } from "./cast_framework";
|
||||||
import { CAST_NS } from "../../../src/cast/const";
|
import { CAST_NS } from "../../../src/cast/const";
|
||||||
import { HassMessage } from "../../../src/cast/receiver_messages";
|
import type { HassMessage } from "../../../src/cast/receiver_messages";
|
||||||
import "../../../src/resources/custom-card-support";
|
import "../../../src/resources/custom-card-support";
|
||||||
import { castContext } from "./cast_context";
|
import { castContext } from "./cast_context";
|
||||||
import { HcMain } from "./layout/hc-main";
|
import { HcMain } from "./layout/hc-main";
|
||||||
import { ReceivedMessage } from "./types";
|
import type { ReceivedMessage } from "./types";
|
||||||
|
|
||||||
const lovelaceController = new HcMain();
|
const lovelaceController = new HcMain();
|
||||||
document.body.append(lovelaceController);
|
document.body.append(lovelaceController);
|
||||||
|
@@ -1,13 +1,11 @@
|
|||||||
import { html, nothing } from "lit";
|
import { html, nothing } from "lit";
|
||||||
import { customElement, property, state } from "lit/decorators";
|
import { customElement, property, state } from "lit/decorators";
|
||||||
import { mockHistory } from "../../../../demo/src/stubs/history";
|
import { mockHistory } from "../../../../demo/src/stubs/history";
|
||||||
import { LovelaceConfig } from "../../../../src/data/lovelace/config/types";
|
import type { LovelaceConfig } from "../../../../src/data/lovelace/config/types";
|
||||||
import {
|
import type { MockHomeAssistant } from "../../../../src/fake_data/provide_hass";
|
||||||
MockHomeAssistant,
|
import { provideHass } from "../../../../src/fake_data/provide_hass";
|
||||||
provideHass,
|
|
||||||
} from "../../../../src/fake_data/provide_hass";
|
|
||||||
import { HassElement } from "../../../../src/state/hass-element";
|
import { HassElement } from "../../../../src/state/hass-element";
|
||||||
import { HomeAssistant } from "../../../../src/types";
|
import type { HomeAssistant } from "../../../../src/types";
|
||||||
import { castDemoEntities } from "../demo/cast-demo-entities";
|
import { castDemoEntities } from "../demo/cast-demo-entities";
|
||||||
import { castDemoLovelace } from "../demo/cast-demo-lovelace";
|
import { castDemoLovelace } from "../demo/cast-demo-lovelace";
|
||||||
import "./hc-lovelace";
|
import "./hc-lovelace";
|
||||||
|
@@ -1,6 +1,7 @@
|
|||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
import type { CSSResultGroup, TemplateResult } from "lit";
|
||||||
|
import { css, html, LitElement } from "lit";
|
||||||
import { customElement, property } from "lit/decorators";
|
import { customElement, property } from "lit/decorators";
|
||||||
import { HomeAssistant } from "../../../../src/types";
|
import type { HomeAssistant } from "../../../../src/types";
|
||||||
|
|
||||||
@customElement("hc-launch-screen")
|
@customElement("hc-launch-screen")
|
||||||
class HcLaunchScreen extends LitElement {
|
class HcLaunchScreen extends LitElement {
|
||||||
|
@@ -1,11 +1,18 @@
|
|||||||
import { css, CSSResultGroup, html, LitElement, TemplateResult } from "lit";
|
import {
|
||||||
import { customElement, property, query } from "lit/decorators";
|
css,
|
||||||
|
type CSSResultGroup,
|
||||||
|
html,
|
||||||
|
LitElement,
|
||||||
|
type TemplateResult,
|
||||||
|
} from "lit";
|
||||||
|
import { customElement, property } from "lit/decorators";
|
||||||
import { fireEvent } from "../../../../src/common/dom/fire_event";
|
import { fireEvent } from "../../../../src/common/dom/fire_event";
|
||||||
import { LovelaceConfig } from "../../../../src/data/lovelace/config/types";
|
import type { LovelaceConfig } from "../../../../src/data/lovelace/config/types";
|
||||||
import { getPanelTitleFromUrlPath } from "../../../../src/data/panel";
|
import { getPanelTitleFromUrlPath } from "../../../../src/data/panel";
|
||||||
import { Lovelace } from "../../../../src/panels/lovelace/types";
|
import type { Lovelace } from "../../../../src/panels/lovelace/types";
|
||||||
import "../../../../src/panels/lovelace/views/hui-view";
|
import "../../../../src/panels/lovelace/views/hui-view";
|
||||||
import { HomeAssistant } from "../../../../src/types";
|
import "../../../../src/panels/lovelace/views/hui-view-container";
|
||||||
|
import type { HomeAssistant } from "../../../../src/types";
|
||||||
import "./hc-launch-screen";
|
import "./hc-launch-screen";
|
||||||
|
|
||||||
(window as any).loadCardHelpers = () =>
|
(window as any).loadCardHelpers = () =>
|
||||||
@@ -18,11 +25,9 @@ class HcLovelace extends LitElement {
|
|||||||
@property({ attribute: false })
|
@property({ attribute: false })
|
||||||
public lovelaceConfig!: LovelaceConfig;
|
public lovelaceConfig!: LovelaceConfig;
|
||||||
|
|
||||||
@property() public viewPath?: string | number | null;
|
@property({ attribute: false }) public viewPath?: string | number | null;
|
||||||
|
|
||||||
@property() public urlPath: string | null = null;
|
@property({ attribute: false }) public urlPath: string | null = null;
|
||||||
|
|
||||||
@query("hui-view") private _huiView?: HTMLElement;
|
|
||||||
|
|
||||||
protected render(): TemplateResult {
|
protected render(): TemplateResult {
|
||||||
const index = this._viewIndex;
|
const index = this._viewIndex;
|
||||||
@@ -45,13 +50,24 @@ class HcLovelace extends LitElement {
|
|||||||
saveConfig: async () => undefined,
|
saveConfig: async () => undefined,
|
||||||
deleteConfig: async () => undefined,
|
deleteConfig: async () => undefined,
|
||||||
setEditMode: () => undefined,
|
setEditMode: () => undefined,
|
||||||
|
showToast: () => undefined,
|
||||||
};
|
};
|
||||||
|
|
||||||
|
const viewConfig = this.lovelaceConfig.views[index];
|
||||||
|
const background = viewConfig.background || this.lovelaceConfig.background;
|
||||||
|
|
||||||
return html`
|
return html`
|
||||||
<hui-view
|
<hui-view-container
|
||||||
.hass=${this.hass}
|
.hass=${this.hass}
|
||||||
.lovelace=${lovelace}
|
.background=${background}
|
||||||
.index=${index}
|
.theme=${viewConfig.theme}
|
||||||
></hui-view>
|
>
|
||||||
|
<hui-view
|
||||||
|
.hass=${this.hass}
|
||||||
|
.lovelace=${lovelace}
|
||||||
|
.index=${index}
|
||||||
|
></hui-view>
|
||||||
|
</hui-view-container>
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -81,26 +97,6 @@ class HcLovelace extends LitElement {
|
|||||||
}${viewTitle || ""}`
|
}${viewTitle || ""}`
|
||||||
: undefined,
|
: undefined,
|
||||||
});
|
});
|
||||||
|
|
||||||
const configBackground =
|
|
||||||
this.lovelaceConfig.views[index].background ||
|
|
||||||
this.lovelaceConfig.background;
|
|
||||||
|
|
||||||
const backgroundStyle =
|
|
||||||
typeof configBackground === "string"
|
|
||||||
? configBackground
|
|
||||||
: configBackground?.image
|
|
||||||
? `center / cover no-repeat url('${configBackground.image}')`
|
|
||||||
: undefined;
|
|
||||||
|
|
||||||
if (backgroundStyle) {
|
|
||||||
this._huiView!.style.setProperty(
|
|
||||||
"--lovelace-background",
|
|
||||||
backgroundStyle
|
|
||||||
);
|
|
||||||
} else {
|
|
||||||
this._huiView!.style.removeProperty("--lovelace-background");
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -124,19 +120,15 @@ class HcLovelace extends LitElement {
|
|||||||
|
|
||||||
static get styles(): CSSResultGroup {
|
static get styles(): CSSResultGroup {
|
||||||
return css`
|
return css`
|
||||||
:host {
|
hui-view-container {
|
||||||
min-height: 100vh;
|
|
||||||
height: 0;
|
|
||||||
display: flex;
|
display: flex;
|
||||||
flex-direction: column;
|
position: relative;
|
||||||
|
min-height: 100vh;
|
||||||
box-sizing: border-box;
|
box-sizing: border-box;
|
||||||
background: var(--primary-background-color);
|
|
||||||
}
|
|
||||||
:host > * {
|
|
||||||
flex: 1;
|
|
||||||
}
|
}
|
||||||
hui-view {
|
hui-view {
|
||||||
background: var(--lovelace-background, var(--primary-background-color));
|
flex: 1 1 100%;
|
||||||
|
max-width: 100%;
|
||||||
}
|
}
|
||||||
`;
|
`;
|
||||||
}
|
}
|
||||||
|
@@ -1,35 +1,33 @@
|
|||||||
import {
|
import type { UnsubscribeFunc } from "home-assistant-js-websocket";
|
||||||
createConnection,
|
import { createConnection, getAuth } from "home-assistant-js-websocket";
|
||||||
getAuth,
|
import type { TemplateResult } from "lit";
|
||||||
UnsubscribeFunc,
|
import { html } from "lit";
|
||||||
} from "home-assistant-js-websocket";
|
|
||||||
import { html, TemplateResult } from "lit";
|
|
||||||
import { customElement, state } from "lit/decorators";
|
import { customElement, state } from "lit/decorators";
|
||||||
import { CAST_NS } from "../../../../src/cast/const";
|
import { CAST_NS } from "../../../../src/cast/const";
|
||||||
import {
|
import type {
|
||||||
ConnectMessage,
|
ConnectMessage,
|
||||||
GetStatusMessage,
|
GetStatusMessage,
|
||||||
HassMessage,
|
HassMessage,
|
||||||
ShowDemoMessage,
|
ShowDemoMessage,
|
||||||
ShowLovelaceViewMessage,
|
ShowLovelaceViewMessage,
|
||||||
} from "../../../../src/cast/receiver_messages";
|
} from "../../../../src/cast/receiver_messages";
|
||||||
import {
|
import type {
|
||||||
ReceiverErrorCode,
|
|
||||||
ReceiverErrorMessage,
|
ReceiverErrorMessage,
|
||||||
ReceiverStatusMessage,
|
ReceiverStatusMessage,
|
||||||
} from "../../../../src/cast/sender_messages";
|
} from "../../../../src/cast/sender_messages";
|
||||||
|
import { ReceiverErrorCode } from "../../../../src/cast/sender_messages";
|
||||||
import { atLeastVersion } from "../../../../src/common/config/version";
|
import { atLeastVersion } from "../../../../src/common/config/version";
|
||||||
import { isNavigationClick } from "../../../../src/common/dom/is-navigation-click";
|
import { isNavigationClick } from "../../../../src/common/dom/is-navigation-click";
|
||||||
import {
|
import {
|
||||||
getLegacyLovelaceCollection,
|
getLegacyLovelaceCollection,
|
||||||
getLovelaceCollection,
|
getLovelaceCollection,
|
||||||
} from "../../../../src/data/lovelace";
|
} from "../../../../src/data/lovelace";
|
||||||
import {
|
import type {
|
||||||
isStrategyDashboard,
|
|
||||||
LegacyLovelaceConfig,
|
LegacyLovelaceConfig,
|
||||||
LovelaceConfig,
|
LovelaceConfig,
|
||||||
LovelaceDashboardStrategyConfig,
|
LovelaceDashboardStrategyConfig,
|
||||||
} from "../../../../src/data/lovelace/config/types";
|
} from "../../../../src/data/lovelace/config/types";
|
||||||
|
import { isStrategyDashboard } from "../../../../src/data/lovelace/config/types";
|
||||||
import { fetchResources } from "../../../../src/data/lovelace/resource";
|
import { fetchResources } from "../../../../src/data/lovelace/resource";
|
||||||
import { loadLovelaceResources } from "../../../../src/panels/lovelace/common/load-resources";
|
import { loadLovelaceResources } from "../../../../src/panels/lovelace/common/load-resources";
|
||||||
import { HassElement } from "../../../../src/state/hass-element";
|
import { HassElement } from "../../../../src/state/hass-element";
|
||||||
@@ -146,10 +144,10 @@ export class HcMain extends HassElement {
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (senderId) {
|
if (senderId) {
|
||||||
this.sendMessage(senderId, status);
|
this._sendMessage(senderId, status);
|
||||||
} else {
|
} else {
|
||||||
for (const sender of castContext.getSenders()) {
|
for (const sender of castContext.getSenders()) {
|
||||||
this.sendMessage(sender.id, status);
|
this._sendMessage(sender.id, status);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -166,10 +164,10 @@ export class HcMain extends HassElement {
|
|||||||
};
|
};
|
||||||
|
|
||||||
if (senderId) {
|
if (senderId) {
|
||||||
this.sendMessage(senderId, error);
|
this._sendMessage(senderId, error);
|
||||||
} else {
|
} else {
|
||||||
for (const sender of castContext.getSenders()) {
|
for (const sender of castContext.getSenders()) {
|
||||||
this.sendMessage(sender.id, error);
|
this._sendMessage(sender.id, error);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -396,7 +394,7 @@ export class HcMain extends HassElement {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private sendMessage(senderId: string, response: any) {
|
private _sendMessage(senderId: string, response: any) {
|
||||||
castContext.sendCustomMessage(CAST_NS, senderId, response);
|
castContext.sendCustomMessage(CAST_NS, senderId, response);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@@ -1,8 +0,0 @@
|
|||||||
import webpack from "../build-scripts/webpack.cjs";
|
|
||||||
import env from "../build-scripts/env.cjs";
|
|
||||||
|
|
||||||
export default webpack.createCastConfig({
|
|
||||||
isProdBuild: env.isProdBuild(),
|
|
||||||
isStatsBuild: env.isStatsBuild(),
|
|
||||||
latestBuild: true,
|
|
||||||
});
|
|
@@ -1,10 +0,0 @@
|
|||||||
import rollup from "../build-scripts/rollup.cjs";
|
|
||||||
import env from "../build-scripts/env.cjs";
|
|
||||||
|
|
||||||
const config = rollup.createDemoConfig({
|
|
||||||
isProdBuild: env.isProdBuild(),
|
|
||||||
latestBuild: true,
|
|
||||||
isStatsBuild: env.isStatsBuild(),
|
|
||||||
});
|
|
||||||
|
|
||||||
export default { ...config.inputOptions, output: config.outputOptions };
|
|
@@ -4,11 +4,6 @@
|
|||||||
# Stop on errors
|
# Stop on errors
|
||||||
set -e
|
set -e
|
||||||
|
|
||||||
cd "$(dirname "$0")/.."
|
cd "$(dirname "$0")/../.."
|
||||||
|
|
||||||
export STATS=1
|
./node_modules/.bin/gulp analyze-demo
|
||||||
statsfile="compilation-stats-demo.json"
|
|
||||||
|
|
||||||
./node_modules/.bin/webpack-cli --profile --node-env=production --json=$statsfile
|
|
||||||
npx webpack-bundle-analyzer $statsfile dist/frontend_latest
|
|
||||||
rm -f $statsfile
|
|
@@ -1,5 +1,5 @@
|
|||||||
import { convertEntities } from "../../../../src/fake_data/entity";
|
import { convertEntities } from "../../../../src/fake_data/entity";
|
||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
|
|
||||||
export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
export const demoEntitiesArsaboo: DemoConfig["entities"] = (localize) =>
|
||||||
convertEntities({
|
convertEntities({
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
import { demoEntitiesArsaboo } from "./entities";
|
import { demoEntitiesArsaboo } from "./entities";
|
||||||
import { demoLovelaceArsaboo } from "./lovelace";
|
import { demoLovelaceArsaboo } from "./lovelace";
|
||||||
import { demoThemeArsaboo } from "./theme";
|
import { demoThemeArsaboo } from "./theme";
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
|
|
||||||
export const demoLovelaceArsaboo: DemoConfig["lovelace"] = (localize) => ({
|
export const demoLovelaceArsaboo: DemoConfig["lovelace"] = (localize) => ({
|
||||||
title: "Home Assistant",
|
title: "Home Assistant",
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
import { Lovelace } from "../../../src/panels/lovelace/types";
|
import type { Lovelace } from "../../../src/panels/lovelace/types";
|
||||||
import { energyEntities } from "../stubs/entities";
|
import { energyEntities } from "../stubs/entities";
|
||||||
import { DemoConfig } from "./types";
|
import type { DemoConfig } from "./types";
|
||||||
|
|
||||||
export const demoConfigs: Array<() => Promise<DemoConfig>> = [
|
export const demoConfigs: Array<() => Promise<DemoConfig>> = [
|
||||||
() => import("./sections").then((mod) => mod.demoSections),
|
() => import("./sections").then((mod) => mod.demoSections),
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { convertEntities } from "../../../../src/fake_data/entity";
|
import { convertEntities } from "../../../../src/fake_data/entity";
|
||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
|
|
||||||
export const demoEntitiesJimpower: DemoConfig["entities"] = () =>
|
export const demoEntitiesJimpower: DemoConfig["entities"] = () =>
|
||||||
convertEntities({
|
convertEntities({
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
import { demoEntitiesJimpower } from "./entities";
|
import { demoEntitiesJimpower } from "./entities";
|
||||||
import { demoLovelaceJimpower } from "./lovelace";
|
import { demoLovelaceJimpower } from "./lovelace";
|
||||||
import { demoThemeJimpower } from "./theme";
|
import { demoThemeJimpower } from "./theme";
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import "../../custom-cards/card-modder";
|
import "../../custom-cards/card-modder";
|
||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
|
|
||||||
export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({
|
export const demoLovelaceJimpower: DemoConfig["lovelace"] = () => ({
|
||||||
name: "Kingia Castle",
|
name: "Kingia Castle",
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { convertEntities } from "../../../../src/fake_data/entity";
|
import { convertEntities } from "../../../../src/fake_data/entity";
|
||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
|
|
||||||
export const demoEntitiesKernehed: DemoConfig["entities"] = () =>
|
export const demoEntitiesKernehed: DemoConfig["entities"] = () =>
|
||||||
convertEntities({
|
convertEntities({
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
import { demoEntitiesKernehed } from "./entities";
|
import { demoEntitiesKernehed } from "./entities";
|
||||||
import { demoLovelaceKernehed } from "./lovelace";
|
import { demoLovelaceKernehed } from "./lovelace";
|
||||||
import { demoThemeKernehed } from "./theme";
|
import { demoThemeKernehed } from "./theme";
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
|
|
||||||
export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
export const demoLovelaceKernehed: DemoConfig["lovelace"] = () => ({
|
||||||
name: "Hem",
|
name: "Hem",
|
||||||
|
@@ -1,16 +0,0 @@
|
|||||||
import { html } from "lit";
|
|
||||||
import { DemoConfig } from "../types";
|
|
||||||
|
|
||||||
export const demoLovelaceDescription: DemoConfig["description"] = (
|
|
||||||
localize
|
|
||||||
) => html`
|
|
||||||
<p>
|
|
||||||
${localize("ui.panel.page-demo.config.sections.description", {
|
|
||||||
blog_post: html`<a
|
|
||||||
href="https://www.home-assistant.io/blog/2024/03/04/dashboard-chapter-1/"
|
|
||||||
target="_blank"
|
|
||||||
>${localize("ui.panel.page-demo.config.sections.description_blog_post")}
|
|
||||||
</a>`,
|
|
||||||
})}
|
|
||||||
</p>
|
|
||||||
`;
|
|
@@ -1,5 +1,5 @@
|
|||||||
import { convertEntities } from "../../../../src/fake_data/entity";
|
import { convertEntities } from "../../../../src/fake_data/entity";
|
||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
|
|
||||||
export const demoEntitiesSections: DemoConfig["entities"] = (localize) =>
|
export const demoEntitiesSections: DemoConfig["entities"] = (localize) =>
|
||||||
convertEntities({
|
convertEntities({
|
||||||
@@ -111,6 +111,16 @@ export const demoEntitiesSections: DemoConfig["entities"] = (localize) =>
|
|||||||
friendly_name: "Living room Temperature",
|
friendly_name: "Living room Temperature",
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"sensor.living_room_humidity": {
|
||||||
|
entity_id: "sensor.living_room_humidity",
|
||||||
|
state: "57",
|
||||||
|
attributes: {
|
||||||
|
state_class: "measurement",
|
||||||
|
unit_of_measurement: "%",
|
||||||
|
device_class: "humidity",
|
||||||
|
friendly_name: "Living room Humidity",
|
||||||
|
},
|
||||||
|
},
|
||||||
"sensor.outdoor_temperature": {
|
"sensor.outdoor_temperature": {
|
||||||
entity_id: "sensor.outdoor_temperature",
|
entity_id: "sensor.outdoor_temperature",
|
||||||
state: "10.5",
|
state: "10.5",
|
||||||
@@ -189,6 +199,14 @@ export const demoEntitiesSections: DemoConfig["entities"] = (localize) =>
|
|||||||
supported_features: 32,
|
supported_features: 32,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"binary_sensor.kitchen_motion": {
|
||||||
|
entity_id: "light.kitchen_motion",
|
||||||
|
state: "on",
|
||||||
|
attributes: {
|
||||||
|
device_class: "motion",
|
||||||
|
friendly_name: "Kitchen motion",
|
||||||
|
},
|
||||||
|
},
|
||||||
"light.worktop_spotlights": {
|
"light.worktop_spotlights": {
|
||||||
entity_id: "light.worktop_spotlights",
|
entity_id: "light.worktop_spotlights",
|
||||||
state: "off",
|
state: "off",
|
||||||
@@ -423,6 +441,14 @@ export const demoEntitiesSections: DemoConfig["entities"] = (localize) =>
|
|||||||
supported_features: 64063,
|
supported_features: 64063,
|
||||||
},
|
},
|
||||||
},
|
},
|
||||||
|
"switch.in_meeting": {
|
||||||
|
entity_id: "switch.in_meeting",
|
||||||
|
state: "on",
|
||||||
|
attributes: {
|
||||||
|
icon: "mdi:laptop-account",
|
||||||
|
friendly_name: "In a meeting",
|
||||||
|
},
|
||||||
|
},
|
||||||
"sensor.standing_desk_height": {
|
"sensor.standing_desk_height": {
|
||||||
entity_id: "sensor.standing_desk_height",
|
entity_id: "sensor.standing_desk_height",
|
||||||
state: "72",
|
state: "72",
|
||||||
|
@@ -1,5 +1,4 @@
|
|||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
import { demoLovelaceDescription } from "./description";
|
|
||||||
import { demoEntitiesSections } from "./entities";
|
import { demoEntitiesSections } from "./entities";
|
||||||
import { demoLovelaceSections } from "./lovelace";
|
import { demoLovelaceSections } from "./lovelace";
|
||||||
|
|
||||||
@@ -7,7 +6,6 @@ export const demoSections: DemoConfig = {
|
|||||||
authorName: "Home Assistant",
|
authorName: "Home Assistant",
|
||||||
authorUrl: "https://github.com/home-assistant/frontend/",
|
authorUrl: "https://github.com/home-assistant/frontend/",
|
||||||
name: "Home Demo",
|
name: "Home Demo",
|
||||||
description: demoLovelaceDescription,
|
|
||||||
lovelace: demoLovelaceSections,
|
lovelace: demoLovelaceSections,
|
||||||
entities: demoEntitiesSections,
|
entities: demoEntitiesSections,
|
||||||
theme: () => ({}),
|
theme: () => ({}),
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { isFrontpageEmbed } from "../../util/is_frontpage";
|
import { isFrontpageEmbed } from "../../util/is_frontpage";
|
||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
|
|
||||||
export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({
|
export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({
|
||||||
title: "Home Assistant Demo",
|
title: "Home Assistant Demo",
|
||||||
@@ -30,12 +30,36 @@ export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
? []
|
? []
|
||||||
: [
|
: [
|
||||||
{
|
{
|
||||||
title: `${localize("ui.panel.page-demo.config.sections.titles.welcome")} 👋`,
|
cards: [
|
||||||
cards: [{ type: "custom:ha-demo-card" }],
|
{
|
||||||
|
type: "heading",
|
||||||
|
heading: `${localize("ui.panel.page-demo.config.sections.titles.welcome")} 👋`,
|
||||||
|
},
|
||||||
|
{ type: "custom:ha-demo-card" },
|
||||||
|
],
|
||||||
},
|
},
|
||||||
]),
|
]),
|
||||||
{
|
{
|
||||||
cards: [
|
cards: [
|
||||||
|
{
|
||||||
|
type: "heading",
|
||||||
|
heading: localize(
|
||||||
|
"ui.panel.page-demo.config.sections.titles.living_room"
|
||||||
|
),
|
||||||
|
icon: "mdi:sofa",
|
||||||
|
badges: [
|
||||||
|
{
|
||||||
|
type: "entity",
|
||||||
|
entity: "sensor.living_room_temperature",
|
||||||
|
color: "red",
|
||||||
|
},
|
||||||
|
{
|
||||||
|
type: "entity",
|
||||||
|
entity: "sensor.living_room_humidity",
|
||||||
|
color: "indigo",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: "tile",
|
type: "tile",
|
||||||
entity: "light.floor_lamp",
|
entity: "light.floor_lamp",
|
||||||
@@ -54,13 +78,6 @@ export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
type: "tile",
|
type: "tile",
|
||||||
entity: "light.bar_lamp",
|
entity: "light.bar_lamp",
|
||||||
},
|
},
|
||||||
{
|
|
||||||
graph: "line",
|
|
||||||
type: "sensor",
|
|
||||||
entity: "sensor.living_room_temperature",
|
|
||||||
detail: 1,
|
|
||||||
name: "Temperature",
|
|
||||||
},
|
|
||||||
{
|
{
|
||||||
type: "tile",
|
type: "tile",
|
||||||
entity: "cover.living_room_garden_shutter",
|
entity: "cover.living_room_garden_shutter",
|
||||||
@@ -71,11 +88,25 @@ export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
entity: "media_player.living_room_nest_mini",
|
entity: "media_player.living_room_nest_mini",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
title: `🛋️ ${localize("ui.panel.page-demo.config.sections.titles.living_room")} `,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "grid",
|
type: "grid",
|
||||||
cards: [
|
cards: [
|
||||||
|
{
|
||||||
|
type: "heading",
|
||||||
|
heading: localize(
|
||||||
|
"ui.panel.page-demo.config.sections.titles.kitchen"
|
||||||
|
),
|
||||||
|
icon: "mdi:fridge",
|
||||||
|
badges: [
|
||||||
|
{
|
||||||
|
type: "entity",
|
||||||
|
entity: "binary_sensor.kitchen_motion",
|
||||||
|
show_state: false,
|
||||||
|
color: "blue",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: "tile",
|
type: "tile",
|
||||||
entity: "cover.kitchen_shutter",
|
entity: "cover.kitchen_shutter",
|
||||||
@@ -106,11 +137,17 @@ export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
entity: "media_player.kitchen_nest_audio",
|
entity: "media_player.kitchen_nest_audio",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
title: `👩🍳 ${localize("ui.panel.page-demo.config.sections.titles.kitchen")}`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "grid",
|
type: "grid",
|
||||||
cards: [
|
cards: [
|
||||||
|
{
|
||||||
|
type: "heading",
|
||||||
|
heading: localize(
|
||||||
|
"ui.panel.page-demo.config.sections.titles.energy"
|
||||||
|
),
|
||||||
|
icon: "mdi:transmission-tower",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: "tile",
|
type: "tile",
|
||||||
entity: "binary_sensor.tesla_wall_connector_vehicle_connected",
|
entity: "binary_sensor.tesla_wall_connector_vehicle_connected",
|
||||||
@@ -148,11 +185,17 @@ export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
color: "dark-grey",
|
color: "dark-grey",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
title: `⚡️ ${localize("ui.panel.page-demo.config.sections.titles.energy")}`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "grid",
|
type: "grid",
|
||||||
cards: [
|
cards: [
|
||||||
|
{
|
||||||
|
type: "heading",
|
||||||
|
heading: localize(
|
||||||
|
"ui.panel.page-demo.config.sections.titles.climate"
|
||||||
|
),
|
||||||
|
icon: "mdi:thermometer",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: "tile",
|
type: "tile",
|
||||||
entity: "sun.sun",
|
entity: "sun.sun",
|
||||||
@@ -185,16 +228,38 @@ export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
state_content: ["preset_mode", "current_temperature"],
|
state_content: ["preset_mode", "current_temperature"],
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
title: `🌤️ ${localize("ui.panel.page-demo.config.sections.titles.climate")}`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "grid",
|
type: "grid",
|
||||||
cards: [
|
cards: [
|
||||||
|
{
|
||||||
|
type: "heading",
|
||||||
|
heading: localize(
|
||||||
|
"ui.panel.page-demo.config.sections.titles.study"
|
||||||
|
),
|
||||||
|
icon: "mdi:desk-lamp",
|
||||||
|
badges: [
|
||||||
|
{
|
||||||
|
type: "entity",
|
||||||
|
entity: "switch.in_meeting",
|
||||||
|
state: "on",
|
||||||
|
state_content: "name",
|
||||||
|
visibility: [
|
||||||
|
{
|
||||||
|
condition: "state",
|
||||||
|
state: "on",
|
||||||
|
entity: "switch.in_meeting",
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
|
],
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: "tile",
|
type: "tile",
|
||||||
entity: "cover.study_shutter",
|
entity: "cover.study_shutter",
|
||||||
name: "Shutter",
|
name: "Shutter",
|
||||||
},
|
},
|
||||||
|
|
||||||
{
|
{
|
||||||
type: "tile",
|
type: "tile",
|
||||||
entity: "light.study_spotlights",
|
entity: "light.study_spotlights",
|
||||||
@@ -211,12 +276,23 @@ export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
color: "brown",
|
color: "brown",
|
||||||
icon: "mdi:desk",
|
icon: "mdi:desk",
|
||||||
},
|
},
|
||||||
|
{
|
||||||
|
type: "tile",
|
||||||
|
entity: "switch.in_meeting",
|
||||||
|
name: "Meeting mode",
|
||||||
|
},
|
||||||
],
|
],
|
||||||
title: `🧑💻 ${localize("ui.panel.page-demo.config.sections.titles.study")}`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "grid",
|
type: "grid",
|
||||||
cards: [
|
cards: [
|
||||||
|
{
|
||||||
|
type: "heading",
|
||||||
|
heading: localize(
|
||||||
|
"ui.panel.page-demo.config.sections.titles.outdoor"
|
||||||
|
),
|
||||||
|
icon: "mdi:tree",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: "tile",
|
type: "tile",
|
||||||
entity: "light.outdoor_light",
|
entity: "light.outdoor_light",
|
||||||
@@ -246,11 +322,17 @@ export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
name: "Illuminance",
|
name: "Illuminance",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
title: `🌳 ${localize("ui.panel.page-demo.config.sections.titles.outdoor")}`,
|
|
||||||
},
|
},
|
||||||
{
|
{
|
||||||
type: "grid",
|
type: "grid",
|
||||||
cards: [
|
cards: [
|
||||||
|
{
|
||||||
|
type: "heading",
|
||||||
|
heading: localize(
|
||||||
|
"ui.panel.page-demo.config.sections.titles.updates"
|
||||||
|
),
|
||||||
|
icon: "mdi:update",
|
||||||
|
},
|
||||||
{
|
{
|
||||||
type: "tile",
|
type: "tile",
|
||||||
entity: "automation.home_assistant_auto_update",
|
entity: "automation.home_assistant_auto_update",
|
||||||
@@ -276,7 +358,6 @@ export const demoLovelaceSections: DemoConfig["lovelace"] = (localize) => ({
|
|||||||
icon: "mdi:home-assistant",
|
icon: "mdi:home-assistant",
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
title: `🎉 ${localize("ui.panel.page-demo.config.sections.titles.updates")}`,
|
|
||||||
},
|
},
|
||||||
],
|
],
|
||||||
},
|
},
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { convertEntities } from "../../../../src/fake_data/entity";
|
import { convertEntities } from "../../../../src/fake_data/entity";
|
||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
|
|
||||||
export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
export const demoEntitiesTeachingbirds: DemoConfig["entities"] = () =>
|
||||||
convertEntities({
|
convertEntities({
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
import { demoEntitiesTeachingbirds } from "./entities";
|
import { demoEntitiesTeachingbirds } from "./entities";
|
||||||
import { demoLovelaceTeachingbirds } from "./lovelace";
|
import { demoLovelaceTeachingbirds } from "./lovelace";
|
||||||
import { demoThemeTeachingbirds } from "./theme";
|
import { demoThemeTeachingbirds } from "./theme";
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { DemoConfig } from "../types";
|
import type { DemoConfig } from "../types";
|
||||||
|
|
||||||
export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({
|
export const demoLovelaceTeachingbirds: DemoConfig["lovelace"] = () => ({
|
||||||
title: "Home",
|
title: "Home",
|
||||||
|
@@ -1,7 +1,7 @@
|
|||||||
import { TemplateResult } from "lit";
|
import type { TemplateResult } from "lit";
|
||||||
import { LocalizeFunc } from "../../../src/common/translations/localize";
|
import type { LocalizeFunc } from "../../../src/common/translations/localize";
|
||||||
import { LovelaceConfig } from "../../../src/data/lovelace/config/types";
|
import type { LovelaceConfig } from "../../../src/data/lovelace/config/types";
|
||||||
import { Entity } from "../../../src/fake_data/entity";
|
import type { Entity } from "../../../src/fake_data/entity";
|
||||||
|
|
||||||
export interface DemoConfig {
|
export interface DemoConfig {
|
||||||
index?: number;
|
index?: number;
|
||||||
|
@@ -1,14 +1,15 @@
|
|||||||
import { mdiTelevision } from "@mdi/js";
|
import { mdiTelevision } from "@mdi/js";
|
||||||
import { css, CSSResultGroup, html, LitElement, nothing } from "lit";
|
import type { CSSResultGroup } from "lit";
|
||||||
|
import { css, html, LitElement, nothing } from "lit";
|
||||||
import { customElement, state } from "lit/decorators";
|
import { customElement, state } from "lit/decorators";
|
||||||
import { CastManager } from "../../../src/cast/cast_manager";
|
import type { CastManager } from "../../../src/cast/cast_manager";
|
||||||
import { castSendShowDemo } from "../../../src/cast/receiver_messages";
|
import { castSendShowDemo } from "../../../src/cast/receiver_messages";
|
||||||
import "../../../src/components/ha-icon";
|
import "../../../src/components/ha-icon";
|
||||||
import {
|
import type {
|
||||||
CastConfig,
|
CastConfig,
|
||||||
LovelaceRow,
|
LovelaceRow,
|
||||||
} from "../../../src/panels/lovelace/entity-rows/types";
|
} from "../../../src/panels/lovelace/entity-rows/types";
|
||||||
import { HomeAssistant } from "../../../src/types";
|
import type { HomeAssistant } from "../../../src/types";
|
||||||
|
|
||||||
@customElement("cast-demo-row")
|
@customElement("cast-demo-row")
|
||||||
class CastDemoRow extends LitElement implements LovelaceRow {
|
class CastDemoRow extends LitElement implements LovelaceRow {
|
||||||
@@ -45,7 +46,6 @@ class CastDemoRow extends LitElement implements LovelaceRow {
|
|||||||
this.requestUpdate();
|
this.requestUpdate();
|
||||||
});
|
});
|
||||||
mgr.castContext.addEventListener(
|
mgr.castContext.addEventListener(
|
||||||
// eslint-disable-next-line no-undef
|
|
||||||
cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
|
cast.framework.CastContextEventType.SESSION_STATE_CHANGED,
|
||||||
(ev) => {
|
(ev) => {
|
||||||
// On Android, opening a new session always results in SESSION_RESUMED.
|
// On Android, opening a new session always results in SESSION_RESUMED.
|
||||||
|
@@ -1,13 +1,17 @@
|
|||||||
import { css, CSSResultGroup, html, LitElement, nothing } from "lit";
|
import type { CSSResultGroup } from "lit";
|
||||||
|
import { css, html, LitElement, nothing } from "lit";
|
||||||
import { customElement, property, state } from "lit/decorators";
|
import { customElement, property, state } from "lit/decorators";
|
||||||
import { until } from "lit/directives/until";
|
import { until } from "lit/directives/until";
|
||||||
import { fireEvent } from "../../../src/common/dom/fire_event";
|
import { fireEvent } from "../../../src/common/dom/fire_event";
|
||||||
import "../../../src/components/ha-card";
|
import "../../../src/components/ha-card";
|
||||||
import "../../../src/components/ha-button";
|
import "../../../src/components/ha-button";
|
||||||
import "../../../src/components/ha-circular-progress";
|
import "../../../src/components/ha-circular-progress";
|
||||||
import { LovelaceCardConfig } from "../../../src/data/lovelace/config/card";
|
import type { LovelaceCardConfig } from "../../../src/data/lovelace/config/card";
|
||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
import { Lovelace, LovelaceCard } from "../../../src/panels/lovelace/types";
|
import type {
|
||||||
|
Lovelace,
|
||||||
|
LovelaceCard,
|
||||||
|
} from "../../../src/panels/lovelace/types";
|
||||||
import {
|
import {
|
||||||
demoConfigs,
|
demoConfigs,
|
||||||
selectedDemoConfig,
|
selectedDemoConfig,
|
||||||
@@ -22,7 +26,7 @@ export class HADemoCard extends LitElement implements LovelaceCard {
|
|||||||
|
|
||||||
@state() private _switching = false;
|
@state() private _switching = false;
|
||||||
|
|
||||||
private _hidden = localStorage.hide_demo_card;
|
private _hidden = window.localStorage.getItem("hide_demo_card");
|
||||||
|
|
||||||
public getCardSize() {
|
public getCardSize() {
|
||||||
return this._hidden ? 0 : 2;
|
return this._hidden ? 0 : 2;
|
||||||
|
@@ -3,12 +3,10 @@ import "../../src/resources/compatibility";
|
|||||||
import { customElement } from "lit/decorators";
|
import { customElement } from "lit/decorators";
|
||||||
import { isNavigationClick } from "../../src/common/dom/is-navigation-click";
|
import { isNavigationClick } from "../../src/common/dom/is-navigation-click";
|
||||||
import { navigate } from "../../src/common/navigate";
|
import { navigate } from "../../src/common/navigate";
|
||||||
import {
|
import type { MockHomeAssistant } from "../../src/fake_data/provide_hass";
|
||||||
MockHomeAssistant,
|
import { provideHass } from "../../src/fake_data/provide_hass";
|
||||||
provideHass,
|
|
||||||
} from "../../src/fake_data/provide_hass";
|
|
||||||
import { HomeAssistantAppEl } from "../../src/layouts/home-assistant";
|
import { HomeAssistantAppEl } from "../../src/layouts/home-assistant";
|
||||||
import { HomeAssistant } from "../../src/types";
|
import type { HomeAssistant } from "../../src/types";
|
||||||
import { selectedDemoConfig } from "./configs/demo-configs";
|
import { selectedDemoConfig } from "./configs/demo-configs";
|
||||||
import { mockAreaRegistry } from "./stubs/area_registry";
|
import { mockAreaRegistry } from "./stubs/area_registry";
|
||||||
import { mockAuth } from "./stubs/auth";
|
import { mockAuth } from "./stubs/auth";
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { AreaRegistryEntry } from "../../../src/data/area_registry";
|
import type { AreaRegistryEntry } from "../../../src/data/area_registry";
|
||||||
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockAreaRegistry = (
|
export const mockAreaRegistry = (
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockAuth = (hass: MockHomeAssistant) => {
|
export const mockAuth = (hass: MockHomeAssistant) => {
|
||||||
hass.mockWS("config/auth/list", () => []);
|
hass.mockWS("config/auth/list", () => []);
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockConfig = (hass: MockHomeAssistant) => {
|
export const mockConfig = (hass: MockHomeAssistant) => {
|
||||||
hass.mockWS("validate_config", () => ({
|
hass.mockWS("validate_config", () => ({
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockConfigEntries = (hass: MockHomeAssistant) => {
|
export const mockConfigEntries = (hass: MockHomeAssistant) => {
|
||||||
hass.mockWS("config_entries/get", () => ({
|
hass.mockWS("config_entries/get", () => ({
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { DeviceRegistryEntry } from "../../../src/data/device_registry";
|
import type { DeviceRegistryEntry } from "../../../src/data/device_registry";
|
||||||
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockDeviceRegistry = (
|
export const mockDeviceRegistry = (
|
||||||
|
@@ -1,11 +1,11 @@
|
|||||||
import { format, startOfToday, startOfTomorrow } from "date-fns";
|
import { format, startOfToday, startOfTomorrow } from "date-fns";
|
||||||
import {
|
import type {
|
||||||
EnergyInfo,
|
EnergyInfo,
|
||||||
EnergyPreferences,
|
EnergyPreferences,
|
||||||
EnergySolarForecasts,
|
EnergySolarForecasts,
|
||||||
FossilEnergyConsumption,
|
FossilEnergyConsumption,
|
||||||
} from "../../../src/data/energy";
|
} from "../../../src/data/energy";
|
||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockEnergy = (hass: MockHomeAssistant) => {
|
export const mockEnergy = (hass: MockHomeAssistant) => {
|
||||||
hass.mockWS(
|
hass.mockWS(
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { EntityRegistryEntry } from "../../../src/data/entity_registry";
|
import type { EntityRegistryEntry } from "../../../src/data/entity_registry";
|
||||||
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockEntityRegistry = (
|
export const mockEntityRegistry = (
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockEvents = (hass: MockHomeAssistant) => {
|
export const mockEvents = (hass: MockHomeAssistant) => {
|
||||||
hass.mockAPI("events", () => []);
|
hass.mockAPI("events", () => []);
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { FloorRegistryEntry } from "../../../src/data/floor_registry";
|
import type { FloorRegistryEntry } from "../../../src/data/floor_registry";
|
||||||
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockFloorRegistry = (
|
export const mockFloorRegistry = (
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockFrontend = (hass: MockHomeAssistant) => {
|
export const mockFrontend = (hass: MockHomeAssistant) => {
|
||||||
hass.mockWS("frontend/get_user_data", () => ({
|
hass.mockWS("frontend/get_user_data", () => ({
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { HassioSupervisorInfo } from "../../../src/data/hassio/supervisor";
|
import type { HassioSupervisorInfo } from "../../../src/data/hassio/supervisor";
|
||||||
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockHassioSupervisor = (hass: MockHomeAssistant) => {
|
export const mockHassioSupervisor = (hass: MockHomeAssistant) => {
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import { HassEntity } from "home-assistant-js-websocket";
|
import type { HassEntity } from "home-assistant-js-websocket";
|
||||||
import { HistoryStates } from "../../../src/data/history";
|
import type { HistoryStates } from "../../../src/data/history";
|
||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
const generateStateHistory = (
|
const generateStateHistory = (
|
||||||
state: HassEntity,
|
state: HassEntity,
|
||||||
|
@@ -1,6 +1,6 @@
|
|||||||
import { IconCategory } from "../../../src/data/icons";
|
import type { IconCategory } from "../../../src/data/icons";
|
||||||
import { ENTITY_COMPONENT_ICONS } from "../../../src/fake_data/entity_component_icons";
|
import { ENTITY_COMPONENT_ICONS } from "../../../src/fake_data/entity_component_icons";
|
||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockIcons = (hass: MockHomeAssistant) => {
|
export const mockIcons = (hass: MockHomeAssistant) => {
|
||||||
hass.mockWS(
|
hass.mockWS(
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { LabelRegistryEntry } from "../../../src/data/label_registry";
|
import type { LabelRegistryEntry } from "../../../src/data/label_registry";
|
||||||
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockLabelRegistry = (
|
export const mockLabelRegistry = (
|
||||||
|
@@ -1,4 +1,4 @@
|
|||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockMediaPlayer = (hass: MockHomeAssistant) => {
|
export const mockMediaPlayer = (hass: MockHomeAssistant) => {
|
||||||
hass.mockWS("media_player_thumbnail", () => Promise.reject());
|
hass.mockWS("media_player_thumbnail", () => Promise.reject());
|
||||||
|
@@ -1,5 +1,5 @@
|
|||||||
import { PersistentNotificationMessage } from "../../../src/data/persistent_notification";
|
import type { PersistentNotificationMessage } from "../../../src/data/persistent_notification";
|
||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
export const mockPersistentNotification = (hass: MockHomeAssistant) => {
|
export const mockPersistentNotification = (hass: MockHomeAssistant) => {
|
||||||
hass.mockWS("persistent_notification/subscribe", (_msg, _hass, onChange) => {
|
hass.mockWS("persistent_notification/subscribe", (_msg, _hass, onChange) => {
|
||||||
|
@@ -5,12 +5,12 @@ import {
|
|||||||
differenceInHours,
|
differenceInHours,
|
||||||
endOfDay,
|
endOfDay,
|
||||||
} from "date-fns";
|
} from "date-fns";
|
||||||
import {
|
import type {
|
||||||
Statistics,
|
Statistics,
|
||||||
StatisticsMetaData,
|
StatisticsMetaData,
|
||||||
StatisticValue,
|
StatisticValue,
|
||||||
} from "../../../src/data/recorder";
|
} from "../../../src/data/recorder";
|
||||||
import { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
import type { MockHomeAssistant } from "../../../src/fake_data/provide_hass";
|
||||||
|
|
||||||
const generateMeanStatistics = (
|
const generateMeanStatistics = (
|
||||||
start: Date,
|
start: Date,
|
||||||
|
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user