Compare commits
1258 Commits
| Author | SHA1 | Date | |
|---|---|---|---|
| 1aecdbb71c | |||
| d8e517cb7b | |||
| 9da5b4cacc | |||
| 84af32242b | |||
| 7a81472407 | |||
| 9399d8df42 | |||
| 459f73fd5c | |||
| c1c3d3b7c5 | |||
| 380a9630e5 | |||
| 984568e00c | |||
| 5fefd8e083 | |||
| a6eef643f6 | |||
| a01928e010 | |||
| d901db2316 | |||
| fdda812078 | |||
| 7c59e9d5b5 | |||
| c9b0c4da34 | |||
| 9f214141b4 | |||
| 4638e90f02 | |||
| d1c50ab6f8 | |||
| 489aa0ffd8 | |||
| ebcc605961 | |||
| bb630049d5 | |||
| 39321adfe1 | |||
| ea2b8df906 | |||
| 74a9b1aef4 | |||
| 8b3e35de94 | |||
| 9d4724fa99 | |||
| a8379cbd80 | |||
| bdfb6c5a84 | |||
| 87414d7137 | |||
| f9d0b64d7a | |||
| 97918710bd | |||
| ac340b3f1e | |||
| a2097e148b | |||
| 190be7f732 | |||
| 0333ce5c46 | |||
| 47df623fd4 | |||
| c609efbd9a | |||
| c8cd41a833 | |||
| 02a0110091 | |||
| 6c572c56a3 | |||
| 2db516ef3b | |||
| 9f3787cd95 | |||
| 5511943237 | |||
| 626838eba6 | |||
| 587328f54c | |||
| 1aa88b1fb6 | |||
| e7db119545 | |||
| da79536456 | |||
| aaaff43731 | |||
| 5d77142758 | |||
| 586ea0002b | |||
| e642d6fe76 | |||
| 7148f288d5 | |||
| 40abf3fb5b | |||
| adea6c7177 | |||
| 96a307e99f | |||
| f0201f72ef | |||
| 0b1b677b3d | |||
| b1dcec86cd | |||
| 7c783fe565 | |||
| 9a0207d7cf | |||
| 1b0e047d6b | |||
| 7ab3c7e5d9 | |||
| 9ece49d226 | |||
| 1272e2ec74 | |||
| db16602018 | |||
| 5c202805b9 | |||
| bfc8866b69 | |||
| 9aedc29289 | |||
| e1f3d75ac4 | |||
| 030f23d2e9 | |||
| 6be9a4e71b | |||
| eb0bffb5dd | |||
| 240bbb3676 | |||
| 7d25110a6e | |||
| 598eea703b | |||
| 8793f7bff4 | |||
| c1b3911622 | |||
| b0bf05109d | |||
| d9cb0ebcc8 | |||
| 1eda21f63f | |||
| f2dbcde124 | |||
| 60f00db2c5 | |||
| a9332453fc | |||
| b99da14799 | |||
| f02400a1fb | |||
| bbcb7f7cdd | |||
| 30cf8e6d54 | |||
| 4f772fc0f7 | |||
| 2cf2582138 | |||
| ad4de4b92c | |||
| 27ed73a6ae | |||
| a1570c8917 | |||
| 7e419ddd43 | |||
| b045d3616d | |||
| f6b50e2e77 | |||
| 9d1381cbb3 | |||
| 99b0242d86 | |||
| db27628211 | |||
| 9b9d86229a | |||
| 46f830dacf | |||
| 3dd9bc7772 | |||
| c7335add19 | |||
| c133498208 | |||
| 6a52bb22a3 | |||
| 6f970efda5 | |||
| c69350a0eb | |||
| 4add8820eb | |||
| 033dd4811e | |||
| da5cd32502 | |||
| edf33fdec9 | |||
| 448cbf16c9 | |||
| e45b77b528 | |||
| b61fd1716e | |||
| d584b5cc7e | |||
| faf9cedfbd | |||
| 3a38ac9339 | |||
| 7ea36a3cfc | |||
| 3577c0b47a | |||
| d0bef42186 | |||
| d9f10c62ad | |||
| 35d3c03e4b | |||
| fdd38a1580 | |||
| 3018801f06 | |||
| 8e96bfef06 | |||
| 31071bd11e | |||
| f5619f6be1 | |||
| adad1b5a2c | |||
| a6c4e19a5d | |||
| af6f74c344 | |||
| ce45cb8a89 | |||
| 14d4aa202d | |||
| 4c35798dba | |||
| 656a9b365f | |||
| 67fa3db921 | |||
| f2d3061e97 | |||
| 760c34e416 | |||
| 48398b315c | |||
| 45d0d9d7f1 | |||
| b0f4ac8221 | |||
| 719192b1aa | |||
| 7eb32bdac8 | |||
| 862756fd5b | |||
| 5ba16e72e0 | |||
| e43ae0504d | |||
| acb6cd180c | |||
| a3301d0413 | |||
| b9e72358ac | |||
| 61b42ef326 | |||
| da9e27c28d | |||
| 6f80fbabaa | |||
| d2308bd45c | |||
| d35972d24f | |||
| 298a264934 | |||
| ad63b595b4 | |||
| 986a9ceebf | |||
| 682b65e723 | |||
| cb661506c0 | |||
| 505aa06443 | |||
| f534a978f1 | |||
| 1293815934 | |||
| 0c0fd18bf4 | |||
| c49c31813f | |||
| 877ab11bb4 | |||
| 0d18d8d7e3 | |||
| 5f977857a1 | |||
| a63b21d417 | |||
| e1b7d6090e | |||
| 1bcc5cdd81 | |||
| 873fdbc4b3 | |||
| 79128effea | |||
| 14ef94fc09 | |||
| 759e3e3a4d | |||
| 5b7b16efba | |||
| 7fd171acb5 | |||
| 02ed3f1d44 | |||
| 4f7f3f36a3 | |||
| 73a8cf12a9 | |||
| 5f5eb16705 | |||
| f0f4437870 | |||
| 868c042511 | |||
| bdb49c0b3d | |||
| cc3c43d1bd | |||
| e47131efc1 | |||
| 82d8024fb4 | |||
| c662a59d85 | |||
| 4e50fb1f92 | |||
| fbae370d1e | |||
| 9c64c9dd61 | |||
| 8f6dba20d2 | |||
| f531fcd5c3 | |||
| ff1720a4c6 | |||
| d62203dff8 | |||
| 99b5076d69 | |||
| 298e7101f7 | |||
| b4ce36b708 | |||
| 5d096a4a92 | |||
| e54df0aca8 | |||
| 2e8baf0161 | |||
| c9dca0222c | |||
| 6044ab73bd | |||
| 660945c792 | |||
| bcb20874a8 | |||
| 83ad0e3ff0 | |||
| aad17c8d26 | |||
| b0ef178c9c | |||
| 0175c430a3 | |||
| 2776587392 | |||
| b978465d7a | |||
| f7989ea1e0 | |||
| 0cf34d3170 | |||
| 4fe04c6f8a | |||
| 1773762d2f | |||
| 9057000e45 | |||
| d540233673 | |||
| 9907290a04 | |||
| d9fb919580 | |||
| 17723d5828 | |||
| c7db2d26b3 | |||
| 259cec9ea8 | |||
| 2ced9c40d3 | |||
| 756efc9311 | |||
| 17fd2ff0ce | |||
| 35833c00f0 | |||
| 300c045187 | |||
| 4c05cc19e5 | |||
| 72dab65a1d | |||
| 4e5fb7745a | |||
| 2bc92043f8 | |||
| 3024bd825d | |||
| 0b39774690 | |||
| a461a23845 | |||
| c0867e3374 | |||
| 47040277a2 | |||
| 0f0daf378c | |||
| 51b315f23a | |||
| 60f5117bbc | |||
| 15634ecb95 | |||
| 0a5007aee0 | |||
| bc54e1bd63 | |||
| d8a8202e63 | |||
| c9eb3b0ca9 | |||
| 665f5a52c4 | |||
| 798f3b8e47 | |||
| a886ab28e1 | |||
| 28cff9c90a | |||
| 8ce197b023 | |||
| a5553457c6 | |||
| 7d9ed777fb | |||
| 59362e7274 | |||
| d32d17952c | |||
| 6630bca73f | |||
| befd442075 | |||
| da885ff6c8 | |||
| 349b216439 | |||
| 47b78d66cf | |||
| fe2baef2b1 | |||
| 357bbdaec9 | |||
| a38e3c2733 | |||
| f17e527d72 | |||
| e20de4ca0d | |||
| 16ac53e0a1 | |||
| fee978bf25 | |||
| f80909d63e | |||
| d5b2503155 | |||
| 80ca5760e2 | |||
| 44dab3726f | |||
| c4295a4f4b | |||
| a6a91250d1 | |||
| 1db50ed7a9 | |||
| 342057b3f5 | |||
| 151b1392c6 | |||
| 1d5d0663ac | |||
| 30b8ba495d | |||
| 5775c9ce0f | |||
| 4f82dd87fc | |||
| fab9fa81d1 | |||
| d6ee4560d8 | |||
| 655ba863a0 | |||
| ac92d4019f | |||
| 0ff964a04b | |||
| 89459f0a4d | |||
| 0d56100abb | |||
| dc770b5952 | |||
| 8cd2bff67a | |||
| 11e55e2499 | |||
| 4cab3a5593 | |||
| daa0eed851 | |||
| 868a347d40 | |||
| 48a87aa352 | |||
| dfec8a3608 | |||
| 9a71231436 | |||
| db4592fbb3 | |||
| 8551d6071e | |||
| c40285f750 | |||
| 9238f9fd85 | |||
| ba3d8838e3 | |||
| e9b6f5f97c | |||
| 5b6c82d38f | |||
| 5b41b70abe | |||
| 93f624610f | |||
| 73bdd49471 | |||
| 635f3f0898 | |||
| a53ee6d590 | |||
| 665b9194cf | |||
| 4690418c94 | |||
| 20eea2a7d1 | |||
| ac7b6760f2 | |||
| a593cfbbb6 | |||
| a205f2a0a8 | |||
| 8e2badc92b | |||
| 7c18d9c0b8 | |||
| 55a1f39450 | |||
| d708eca78e | |||
| 5d7e2516b6 | |||
| fb6a29872b | |||
| 187206062e | |||
| 2615e29e52 | |||
| 8ca176d37e | |||
| cb2bf43f30 | |||
| 1719d17cff | |||
| 32afb8d97c | |||
| 72b8a29d76 | |||
| af0a32d478 | |||
| 060e85f90e | |||
| 654a54ac79 | |||
| ef24358942 | |||
| e5e67e39bd | |||
| 228304bef9 | |||
| 78f97f32a2 | |||
| 459662a6c1 | |||
| b150a52471 | |||
| 028c601515 | |||
| af382ef065 | |||
| 91ef7f2ab5 | |||
| 0bf7279c8f | |||
| 62525d33c6 | |||
| 88ff40e301 | |||
| 1a72a0cdc6 | |||
| 2b07b4bc12 | |||
| 06c09e7c87 | |||
| 30b96ac87c | |||
| 2e9b5cffe8 | |||
| 3e1641a6ec | |||
| d64ca52bb0 | |||
| 8c645fa1ce | |||
| 79c9c89923 | |||
| 11d93fe724 | |||
| 039c561a80 | |||
| 64a704fc72 | |||
| 4fbf137d15 | |||
| ff065ab88b | |||
| 7fdf3fb968 | |||
| 7ebd451409 | |||
| a7a48a8a75 | |||
| 27298b7f22 | |||
| 565ce93a9a | |||
| 0bc6088b6a | |||
| 2fb99e8fbb | |||
| cd2050c534 | |||
| 5b557d0224 | |||
| 0137d79ba0 | |||
| e05fbf4fb5 | |||
| 72e6ca5063 | |||
| af9e842fe0 | |||
| 230962686f | |||
| 413cd9354f | |||
| 64a42de31f | |||
| f7f03e2669 | |||
| 1dc7c34bfd | |||
| 0fd5c3846c | |||
| e42e92f9df | |||
| e45c91f941 | |||
| 8f71d80f94 | |||
| 78e896e5fb | |||
| a643852387 | |||
| e221252325 | |||
| 88f126e658 | |||
| 17af05acc8 | |||
| fd436a0d63 | |||
| 0d796b63c2 | |||
| cb143d2bbc | |||
| f3e7758521 | |||
| 23ef101954 | |||
| c2f5efbde4 | |||
| 4ce178c592 | |||
| 7aa30afa7f | |||
| 90aaed202c | |||
| c92ed13d66 | |||
| 0e4953fbfc | |||
| 799d687061 | |||
| 866eb0694c | |||
| e5723aab03 | |||
| f51f5dd19f | |||
| aae5f0789d | |||
| 586fe3950c | |||
| 241c907c65 | |||
| aab4244d84 | |||
| 767a3a987c | |||
| a2924d872a | |||
| 54baf21490 | |||
| 5a3790a7d3 | |||
| 236e099b81 | |||
| 9b54bc4704 | |||
| ffb99af719 | |||
| 90bb145d91 | |||
| 190c87d120 | |||
| 4c511d5728 | |||
| b8ecbc5a54 | |||
| 8c3d756187 | |||
| cfdc6b3e6b | |||
| 226e6c9fbe | |||
| db41f27072 | |||
| db025cd3a2 | |||
| 57229c69c1 | |||
| 8f3a90eeb2 | |||
| a360965d92 | |||
| eb1ace6d20 | |||
| 497c902283 | |||
| 4d4453b830 | |||
| ef53580ed1 | |||
| 52e5387d47 | |||
| f5b7f7e0e5 | |||
| 592bdbe4d9 | |||
| 6fc227bad6 | |||
| d74f6b0735 | |||
| 62ea796045 | |||
| 064704c9b7 | |||
| c846a1febf | |||
| c3959e8427 | |||
| e770f9b6b7 | |||
| 67f35615a2 | |||
| 5c7b6098a2 | |||
| f7d12b7486 | |||
| 3481313859 | |||
| 2f23556893 | |||
| 330e39159a | |||
| aa14676f91 | |||
| 199f330324 | |||
| 63dee97ac3 | |||
| b121ed2fe2 | |||
| 607e1162e5 | |||
| b4d569a915 | |||
| 4fac364542 | |||
| 51c7ee5fa8 | |||
| 9b780f2d00 | |||
| f5aec7ec9b | |||
| 5d991eda31 | |||
| 0318a34046 | |||
| e7c66304d3 | |||
| 4603ebb511 | |||
| ea570c12b7 | |||
| c17ce34a27 | |||
| 0e4d3ad8ab | |||
| 4304f71df2 | |||
| bb5ea34396 | |||
| c30adb409c | |||
| ab83031462 | |||
| cd7285c3ef | |||
| bdb775c88d | |||
| d20793d5e6 | |||
| ae1e276577 | |||
| c031c6e82e | |||
| d06f8128f5 | |||
| 6ba12e9736 | |||
| 0092556c1a | |||
| 9721bca5a1 | |||
| 1b138f86b9 | |||
| e839671f13 | |||
| 842c158f96 | |||
| b14c9107fe | |||
| 21894d2890 | |||
| 22b529453f | |||
| 4ec2ece85f | |||
| cee1424a4c | |||
| d09cf6d4b1 | |||
| 9affa07639 | |||
| cde060ff4f | |||
| 1a9cd438d9 | |||
| 1dbb5a468d | |||
| 1fe01290c0 | |||
| 1b900e942b | |||
| 8e527dc96b | |||
| 1f7ad781df | |||
| c2b151be11 | |||
| a0b63e7350 | |||
| 10902351be | |||
| 1c3009a48f | |||
| 6c6087249f | |||
| 539d482f71 | |||
| cab97bca1e | |||
| 6020083b89 | |||
| 947b24f1b0 | |||
| 2c5ba64b61 | |||
| faa4fcb718 | |||
| 8e9b67fea2 | |||
| 659bdd46a0 | |||
| edcc411d26 | |||
| e022423bad | |||
| 84e1fd44eb | |||
| b68d1ff828 | |||
| c31a5c30ed | |||
| 5b408c2bc2 | |||
| ca29419db6 | |||
| ab26bdc7c1 | |||
| d270250633 | |||
| d75f64df79 | |||
| 5faa5d7537 | |||
| 177223c625 | |||
| a64ff22917 | |||
| 0bf08329b0 | |||
| e3f00d2797 | |||
| 09de72895e | |||
| c0aa12089e | |||
| 0248f58785 | |||
| 247cd66f74 | |||
| 4a1bd41df9 | |||
| efcb593718 | |||
| a82c7cbf71 | |||
| db60e79a99 | |||
| 722eff145f | |||
| 282458748d | |||
| 26197f11a3 | |||
| 9d560f9798 | |||
| 786292c95e | |||
| e760ee444e | |||
| 78f91fefb6 | |||
| fda1e18f48 | |||
| c94168e2d1 | |||
| 3eb505dbde | |||
| fbe502fddf | |||
| c143a9978d | |||
| e3555b663d | |||
| df934d252c | |||
| 447d011b8f | |||
| abe1263d27 | |||
| 143b5ac81f | |||
| 87fbb1f4c3 | |||
| 62f11bf605 | |||
| 3ead54b58e | |||
| 580f4f3cfe | |||
| da0accebe8 | |||
| eb65d0b42a | |||
| c2784135b0 | |||
| 61d54bd1f9 | |||
| 0bd94fce3b | |||
| 2a97c06443 | |||
| 8213aa776a | |||
| 026f78254d | |||
| 0ebb013ba6 | |||
| c5f78d0c8d | |||
| 8771676e69 | |||
| aebbbb0685 | |||
| 68183b648e | |||
| 45809c0198 | |||
| 13163c9ba1 | |||
| aedbba3f3d | |||
| 763dbd5ee8 | |||
| 5821ae0e8c | |||
| 751706d2ae | |||
| cf8554718d | |||
| 5f653b3ff9 | |||
| 5f2e1c38a7 | |||
| 8a9d8be8a4 | |||
| 067b2eccf3 | |||
| 2e1bd6ec93 | |||
| b463cef1c2 | |||
| adf9d39d69 | |||
| b1699592e4 | |||
| 8675abfced | |||
| a1fc19e47c | |||
| 8235de04d2 | |||
| 46a324adc2 | |||
| c0af62316d | |||
| 2fd3503694 | |||
| e6529e6e41 | |||
| 72673ca366 | |||
| cbda49ba7b | |||
| 0ab32e5afa | |||
| 36cfcd0acb | |||
| f746d46247 | |||
| a2de6cbe44 | |||
| e632a2964a | |||
| f736a14651 | |||
| a8b0d40959 | |||
| 4c5504d139 | |||
| fb86deb388 | |||
| 3a8e6135ac | |||
| a38de0c03f | |||
| ea97410fb4 | |||
| e36549ddce | |||
| 10851ae01c | |||
| d553ef6b29 | |||
| 15bf0da82e | |||
| fc246ffaac | |||
| 9785eff21e | |||
| 52fbd2c99e | |||
| 648ae4fb8d | |||
| bbeeabc9ea | |||
| 35cf6e7bc0 | |||
| 78822acdac | |||
| aea123890f | |||
| c369f4a955 | |||
| 16d8240406 | |||
| 24cd01dd31 | |||
| fb22beadb8 | |||
| fa85177648 | |||
| ed07a49dd2 | |||
| 09c9de0a60 | |||
| 523296b29a | |||
| ef67ef47aa | |||
| cb5eb68d62 | |||
| 2e9ab75e2b | |||
| 0c2d795800 | |||
| 97aa173f7e | |||
| 9eb64d94d6 | |||
| a0971cab52 | |||
| 127562e9d0 | |||
| 038e7450e0 | |||
| 6c00763187 | |||
| 2da0f3d686 | |||
| 742d2f1536 | |||
| b4b69783d5 | |||
| c8ddc66cfa | |||
| 2b6ff8d30f | |||
| d79d7ed778 | |||
| ab234c0f45 | |||
| eeb43c6bf4 | |||
| 17bda1eb34 | |||
| 96e28c415c | |||
| 1f9f6d9681 | |||
| f1bb7cb0c2 | |||
| 5eb5be7123 | |||
| 886b2081c2 | |||
| c69e51ce50 | |||
| 861efa3415 | |||
| 792b57542d | |||
| 97e6678e5b | |||
| 66c4ec3f99 | |||
| 8988d6a241 | |||
| b52856bea4 | |||
| 16fee19b85 | |||
| 14011c19cb | |||
| 005a9dff16 | |||
| 3109bbadbe | |||
| 34ae689569 | |||
| 1f216dd57b | |||
| a7963e23db | |||
| 069bd6c435 | |||
| 88a1244ca9 | |||
| 7ee391f688 | |||
| 2b3eab9c2a | |||
| a3fc9e1e18 | |||
| 559d32e6eb | |||
| f904b79367 | |||
| 9cd7cca81c | |||
| 3366c1e35f | |||
| 82be31a408 | |||
| d767f3f598 | |||
| 48967c7c5f | |||
| 6c4da7225d | |||
| e9025fb13e | |||
| 8db6b3187b | |||
| a19f9e12c4 | |||
| a82eb46511 | |||
| e50f2b047a | |||
| 1b41cd26ee | |||
| e32fbed1b7 | |||
| f8acdd6352 | |||
| 9ea89c6340 | |||
| a521a80d43 | |||
| 4c6a57dd33 | |||
| 3ce8c8b1f4 | |||
| 4ee8f7837e | |||
| 1e8e5488af | |||
| 5704765cc4 | |||
| 8c7adbf463 | |||
| 8c4436efe8 | |||
| 5e361c0085 | |||
| ccfc207e92 | |||
| 36be4ce771 | |||
| 18f8a387b0 | |||
| 48c2c07557 | |||
| 61548a9478 | |||
| fd678e9572 | |||
| 63fb913f76 | |||
| faffe20a62 | |||
| 3ed8bd10fd | |||
| 6f3f270573 | |||
| 5347cb4626 | |||
| d6b4d2d1f6 | |||
| 0d7ae287da | |||
| 90cb3bd3bf | |||
| 60eb97c4b2 | |||
| 0ffc6eae3e | |||
| 06a8c5fb0e | |||
| eb86413f35 | |||
| b29d49cbf1 | |||
| c0a0edb30c | |||
| b15a933c75 | |||
| 1851be22a7 | |||
| 39f6c29e4f | |||
| 936e89fbfb | |||
| ad365ecde4 | |||
| b4283e37bd | |||
| b467ad760a | |||
| 9fc6408ef9 | |||
| 394cb1a520 | |||
| ffec88549b | |||
| 4758bea187 | |||
| 6671471f75 | |||
| ae78dc7fb3 | |||
| b62af3d007 | |||
| 43ae44ecd5 | |||
| 5bab9d2f59 | |||
| 7edf1c8103 | |||
| 53b4eac955 | |||
| f9a10c2c52 | |||
| 8206ca9164 | |||
| 1a823cc008 | |||
| efc011eb81 | |||
| 35f6d28977 | |||
| 43fcbec0eb | |||
| a0d56b4d27 | |||
| 38ccb6ace6 | |||
| aaf75f1de1 | |||
| 21e8ca0a2c | |||
| 55444858bc | |||
| 771ea03069 | |||
| 38b71d1350 | |||
| cb781aceb5 | |||
| d53c792218 | |||
| 907f4d3672 | |||
| 8432d73a6b | |||
| 94a5435089 | |||
| edf3cf3f17 | |||
| 48783baec3 | |||
| c70f047696 | |||
| e6e0c713bc | |||
| 3691554a73 | |||
| 1a3436606b | |||
| 2c9e7750ec | |||
| fa67910007 | |||
| c77773eb20 | |||
| 148f3d53a6 | |||
| c7af789173 | |||
| 274d39b9a4 | |||
| d1edb2da0e | |||
| ed860027ef | |||
| 488fa6e773 | |||
| ea51cc04a9 | |||
| 6d1761533f | |||
| e35b540a3b | |||
| 7080b36173 | |||
| 4437dc404b | |||
| b3ddab7bcb | |||
| eb3b9bc334 | |||
| 34ea23030b | |||
| a25721708f | |||
| 6427e74edb | |||
| 15395a8c46 | |||
| 454b076eaf | |||
| 00597f6790 | |||
| ca29feaecf | |||
| f6420e5fdf | |||
| 78e0646043 | |||
| c15e75e6ab | |||
| 863a006ee7 | |||
| 9fd54cfa73 | |||
| 3535fb77fa | |||
| be22fc43cb | |||
| 3fd09edd25 | |||
| d36007b453 | |||
| 9eda887fd8 | |||
| b79220dbd1 | |||
| 927d29535f | |||
| 12805e9862 | |||
| d889a21465 | |||
| 8125d74057 | |||
| c39087a81a | |||
| 7b849b80cb | |||
| b98a5c378e | |||
| 215def7e15 | |||
| 3b954cc6fb | |||
| 20bdd8ad2f | |||
| cb9a9c0530 | |||
| 48d8d236c0 | |||
| 87d9511b31 | |||
| 5d8efef02f | |||
| c9008cd835 | |||
| 203a9cc234 | |||
| 5fcaf7c68b | |||
| c74e530d4a | |||
| 3f78be0c95 | |||
| 2a3d52045d | |||
| ea5b81d25e | |||
| cec9d7103a | |||
| 34dd2c1487 | |||
| a5667f85d0 | |||
| ec3dd52f83 | |||
| 87ebde3abb | |||
| dc5b55bffb | |||
| df20993917 | |||
| caa0fb31e6 | |||
| 95da4fb054 | |||
| a917f32a0e | |||
| 6ca376749c | |||
| 792e3032b9 | |||
| 38a5a2c440 | |||
| 21106ce188 | |||
| ec7263e7de | |||
| e7c3fc2a5e | |||
| f808cb7526 | |||
| c4795e7479 | |||
| b44a96ab81 | |||
| 3bfdc5c755 | |||
| acb75543ff | |||
| 25b45b9c09 | |||
| efd5c40043 | |||
| e47519fb76 | |||
| 171e32c272 | |||
| 54e5ed0bb4 | |||
| a94d673f31 | |||
| b7f7222c26 | |||
| aa5a9d4fa9 | |||
| 77da2d6ade | |||
| 3119c04e10 | |||
| c09994263e | |||
| 2a4fa9ae5c | |||
| c833d3b15b | |||
| d6e095bfce | |||
| 825160a3cc | |||
| e29ca33f82 | |||
| ca5a52c6f1 | |||
| 982c69f8ae | |||
| 6fc7d9254a | |||
| 2e0e104d48 | |||
| 02430fd7b8 | |||
| 2e6d35d193 | |||
| 7cf412ac1f | |||
| 9398cbb596 | |||
| ca9b96142e | |||
| db57c8e079 | |||
| 7e37e11caf | |||
| bb90029c54 | |||
| d3b14afbce | |||
| ba2197a609 | |||
| 4c558d3eb6 | |||
| dcd175444a | |||
| 16fc58404a | |||
| 28c7e7d9ed | |||
| 5a3b42a4b0 | |||
| c9c5d721ec | |||
| 1556b9ad73 | |||
| ca15b1f321 | |||
| 448436cb08 | |||
| c9ddc3d0f2 | |||
| 6b72f883b6 | |||
| cd3446bd7f | |||
| 829b371bba | |||
| 36b399dd49 | |||
| 08f32aa685 | |||
| 05db264e02 | |||
| de5a01834c | |||
| 1d260dbacb | |||
| 53c63b4556 | |||
| 816878bc15 | |||
| e087a0d6ef | |||
| 56b71491a6 | |||
| 121b521157 | |||
| 16c2e3218b | |||
| d9cba55d34 | |||
| 832cd5d640 | |||
| bb95e08d71 | |||
| 35269dad9e | |||
| 64d1498460 | |||
| 0d540a6df9 | |||
| b47c150daa | |||
| 38345481df | |||
| da92449e0f | |||
| 23b3980645 | |||
| 81b4b629c9 | |||
| 4f7e9cb050 | |||
| b226d9b947 | |||
| aabba41e86 | |||
| f19e6908b0 | |||
| 5f651cc3fe | |||
| 8a6acbaaf2 | |||
| 13ab8e4d01 | |||
| bd039dcbab | |||
| 9cd4e8342b | |||
| c9633cefec | |||
| 1dd1370ed7 | |||
| 9ff90d0acf | |||
| b754435589 | |||
| 195d2cceaf | |||
| 420d78b638 | |||
| b35e499355 | |||
| 41c3d6d015 | |||
| 64610bad41 | |||
| 45b7d7c67f | |||
| 0bb2746869 | |||
| f9b0aa45f8 | |||
| 6f6ce33bbd | |||
| e1c6020997 | |||
| 012bd7e67f | |||
| 35778f70cb | |||
| cb4f9aa752 | |||
| f80fb42483 | |||
| 02c79ca244 | |||
| 50e8c86ce9 | |||
| 6fbfc15be7 | |||
| c793d3cf6b | |||
| b5f4d8cc1b | |||
| 77e6d1f5a4 | |||
| 3f149ac4fa | |||
| c0dbffaa82 | |||
| 707f03a3eb | |||
| 8372462041 | |||
| 3fbbe2ccde | |||
| e7880fcde0 | |||
| ee5e76e4b1 | |||
| 1ae8d6bc46 | |||
| de7dd09f60 | |||
| 1649785826 | |||
| 91fc41cb15 | |||
| 9c80ad832b | |||
| 86b7162d99 | |||
| b8f8acd33d | |||
| d8905d23a4 | |||
| 5d2d124e5a | |||
| 4fda203def | |||
| 905bfc7a38 | |||
| 7c6973f0e6 | |||
| 969e39c541 | |||
| b256939cc4 | |||
| c46137644b | |||
| 1bd7ef56c4 | |||
| c258b99cec | |||
| d3abb32cb4 | |||
| 223ede9ff9 | |||
| 9d31a4eba1 | |||
| ea0e40c269 | |||
| bc24ea45a4 | |||
| 86d0c9b397 | |||
| c275ccf0da | |||
| 447a48f306 | |||
| 70b5cbc8db | |||
| 3459de0375 | |||
| c6817479bd | |||
| f02aae21f6 | |||
| 87a62a1791 | |||
| a0d1643021 | |||
| 856a946fa7 | |||
| 9d97164c20 | |||
| 6d526e7043 | |||
| 946072fc5a | |||
| 6b8dfdf02d | |||
| ba85fdf470 | |||
| 295f8601e3 | |||
| a38ccd8624 | |||
| b2dcec2f8a | |||
| e8355029d9 | |||
| 2b374b98d2 | |||
| d14d76a0c8 | |||
| d0f1c7065c | |||
| 3edb66d76d | |||
| bba8cdace1 | |||
| 22f82a67ee | |||
| b32c60ca73 | |||
| c93620cba5 | |||
| dd05ed4d4c | |||
| 21636defda | |||
| bb022646e3 | |||
| 37ad2c7ceb | |||
| b992631e00 | |||
| 35a5cc6717 | |||
| 310b56fe5d | |||
| 148234382e | |||
| c1a97b77b0 | |||
| 557ccb4854 | |||
| 83e7e8aab9 | |||
| 7bf490c59d | |||
| 9670babdbb | |||
| 42dfc2d5cf | |||
| 1527f0e275 | |||
| 66bd957ee0 | |||
| 72e3c5baa2 | |||
| 9318346ab3 | |||
| 1d6aceab0a | |||
| c1b5a9d270 | |||
| f0b2a12724 | |||
| c45677ed48 | |||
| 7a3f075e21 | |||
| 1e12ce2a0d | |||
| eca30296a7 | |||
| 41fa320815 | |||
| 873c24fa50 | |||
| d92db5ba8f | |||
| 1a6fe33f97 | |||
| 2db4ea77a9 | |||
| ba5349ccaf | |||
| addb689de9 | |||
| 2af8d28b82 | |||
| ddbc66813e | |||
| 0c8fc013a8 | |||
| 26e30aaae9 | |||
| 6557dfe430 | |||
| 9cee9eefb4 | |||
| f9cd7aaf05 | |||
| 9049804413 | |||
| d027a496f5 | |||
| dd7abddb7c | |||
| 98d2792e02 | |||
| 39b76d3ec0 | |||
| bc29bfd434 | |||
| 5e60f37ec5 | |||
| 6f901b32eb | |||
| 927aca612e | |||
| 2dcdae91eb | |||
| eb758bdeb8 | |||
| 5acf51af9d | |||
| f9718a1b71 | |||
| cf7f23d4c3 | |||
| 62ecb6f41e | |||
| fc45c37f22 | |||
| 68874e607e | |||
| 35865adcb2 | |||
| 3b63a51475 | |||
| d32e59e38f | |||
| dab8efa140 | |||
| c298d8552b | |||
| 87267347f3 | |||
| 326e84b667 | |||
| 4b005b450e | |||
| 3bf40fc4ed | |||
| 9ace395e11 | |||
| 64f42064ae | |||
| a525d786f1 | |||
| 948ee810da | |||
| 8687b2980e | |||
| 6f0814bc97 | |||
| 148c0da51f | |||
| ba09f3e0f1 | |||
| 54e24652da | |||
| d6516142d2 | |||
| 460667e3c0 | |||
| 6ed61d0766 | |||
| 971daf2784 | |||
| 89d8ef9a50 | |||
| a329e24818 | |||
| 249cf63da8 | |||
| 70a496108a | |||
| 214889e052 | |||
| b6ab7a9567 | |||
| 1ceb9e2e80 | |||
| 15ea81514f | |||
| 21d4e6dede | |||
| 5343430c0f | |||
| 8c834835c4 | |||
| 9a2cc18f64 | |||
| 8683bd4b77 | |||
| dca52864bb | |||
| 0c5643f648 | |||
| b7cdf1597c | |||
| 2770974261 | |||
| ab6a34afb6 | |||
| b0eb7da9b4 | |||
| 4f649fc872 | |||
| 1af64aa02f | |||
| c35acff259 | |||
| 995d4f8080 | |||
| b7e2aa3d8f | |||
| e347f4529f | |||
| 3d9683418d | |||
| bdce363eed | |||
| e7775f291a | |||
| 59f6a28c65 | |||
| f7534464bc | |||
| 01445fb1da | |||
| 1360eb7c01 | |||
| c99a281169 | |||
| 76e63e24c0 | |||
| f5ba1173da | |||
| 12079e6ffc | |||
| ff6740d429 | |||
| e6657cb533 | |||
| 2ad099bf7e | |||
| 6421ab34a4 | |||
| 8919c4015a | |||
| 712f2ed4ac | |||
| d1b9e5ded6 | |||
| 86182044d1 | |||
| e1f181356c | |||
| 5f241cf407 | |||
| b4a2cf4cb2 | |||
| aea137a3a1 | |||
| ad0e8e4144 | |||
| 7fd5752ef1 | |||
| 1a8b7ff635 | |||
| fe3ca0fcbd | |||
| f49ee9f005 | |||
| 961440c0ac | |||
| 9b562b0ca8 | |||
| 7b2563b2dc | |||
| 63f507ecf5 | |||
| 0a88955394 | |||
| 291d25b675 | |||
| 6f902cc598 | |||
| fde488ac82 | |||
| 0873c24ad8 | |||
| 7c02497148 | |||
| 25441a3b97 | |||
| f1cf866fe1 | |||
| d92a126489 | |||
| bcb93afe4e | |||
| 21cf3642cb | |||
| 2ef28ec0c4 | |||
| 59094c9af3 | |||
| ba41691296 | |||
| 8786aa91b3 | |||
| 0623d10653 | |||
| 85174d4994 | |||
| 4e2dd5d618 | |||
| 1a39a0d153 | |||
| f922648dd7 | |||
| e6142e3608 | |||
| ed73451fd0 | |||
| 8a25a2f60f | |||
| 397e9a8b45 | |||
| 7cef7680de | |||
| 0c57375758 | |||
| 2c6af84165 | |||
| 58e1371701 | |||
| 0d8e7463b8 | |||
| 77eeacaf0f | |||
| e80c134150 | |||
| 03c8ab4d6f | |||
| df13b9705c | |||
| 762ba0080d | |||
| 317b1b6dcc | |||
| 93175a6477 | |||
| 60d6707b11 | |||
| 97cbda3dab | |||
| 1611c1dba6 | |||
| b59252284a | |||
| 742b99657a | |||
| e2997a43e0 | |||
| 21dead60fd | |||
| 3d1bc0a12c | |||
| 4b24bee1fb | |||
| 82ed821eb5 | |||
| 60625280c2 | |||
| 083792b5f0 | |||
| 3da3e07bda | |||
| 64d61eb3f1 | |||
| aa6009e476 | |||
| d2cb8f9416 | |||
| 046a4809d3 | |||
| 207b750d4e | |||
| 077fa9939e | |||
| 44d715a29e | |||
| 3ab9fe4ae3 | |||
| 91b28c2cb9 | |||
| d1b523061f | |||
| c69ea3967f | |||
| 41527a2200 | |||
| 281f28192d | |||
| 67ffa44f9c | |||
| 421c0e412d | |||
| d21ee08eb6 | |||
| 7fa150dfae | |||
| 7ba52b18fd | |||
| 66e5079b84 | |||
| f1e8084be8 | |||
| 609ae2ae37 | |||
| c81dfff37c | |||
| 9c27820add | |||
| 22f8e10918 | |||
| 96d41f8b7c | |||
| c4ce44e001 | |||
| 6641ffaeed | |||
| 450dc0975f | |||
| d343555f41 | |||
| 7993908c6c | |||
| 94e1dbce24 | |||
| d14215946a | |||
| 345406f02a | |||
| 6b689bab23 | |||
| fcdf0dcbe9 | |||
| bd35acdae1 | |||
| 21c35ee593 | |||
| 0f09cbee0e | |||
| 183bb02e29 | |||
| 0bf4ea0897 | |||
| cd4d00e23e | |||
| 5de18e5371 | |||
| af823418ee | |||
| 0b8d101c33 | |||
| b587849126 | |||
| 2a35ce0a1e | |||
| c390b70f76 | |||
| c9fd739128 | |||
| 0806c06042 | |||
| 5f74a544a4 | |||
| 121778894c | |||
| 102c72a03c | |||
| a0507866db | |||
| f3874da780 | |||
| cc5d24ec92 | |||
| 08760015da | |||
| 5368371020 | |||
| 08d62a437a | |||
| 37e2348d79 | |||
| 6a30dc46fa | |||
| b75c553e51 | |||
| a56face03d | |||
| 19756c61ce | |||
| 5f54b4de17 | |||
| ea8935c47c | |||
| e37f73880d | |||
| 2e24b9e18a | |||
| f8a0fb37a2 | |||
| dd26b99027 | |||
| d9e9b43f8d | |||
| d580083727 | |||
| 5a70d9e57d | |||
| 1b1af245bd | |||
| 874a531a62 | |||
| a3d409f250 | |||
| b6758ca9fa | |||
| 2672308946 | |||
| 7ac171ed3b | |||
| 6a93f20bb3 | |||
| 921af6a5a1 | |||
| 21ebeacd20 | |||
| 527600031f | |||
| 91a804c492 | |||
| 54f3785063 | |||
| 44e4bc5295 | |||
| f464d7d33f | |||
| d0672739f0 | |||
| 44464f914f | |||
| 8940c41bdb | |||
| 446f265b6c | |||
| 7a465684c0 | |||
| 0369316463 | |||
| 8b74291d18 | |||
| 739b738100 | |||
| 95442dd39b | |||
| 4f82645c08 | |||
| d200c376f8 | |||
| b58fb02016 | |||
| e1bab6c746 | |||
| d10c22fbd9 | |||
| da1f7f3ea5 |
+4
-2
@@ -2,5 +2,7 @@ coverage:
|
|||||||
status:
|
status:
|
||||||
project:
|
project:
|
||||||
default:
|
default:
|
||||||
target: 80%
|
informational: true
|
||||||
threshold: 1%
|
patch:
|
||||||
|
default:
|
||||||
|
informational: true
|
||||||
|
|||||||
@@ -0,0 +1,10 @@
|
|||||||
|
extends:
|
||||||
|
- '@commitlint/config-conventional'
|
||||||
|
rules:
|
||||||
|
subject-case:
|
||||||
|
- 0
|
||||||
|
- always
|
||||||
|
- - sentence-case
|
||||||
|
- start-case
|
||||||
|
- pascal-case
|
||||||
|
- upper-case
|
||||||
@@ -1,2 +1,16 @@
|
|||||||
|
# See https://git-scm.com/docs/gitattributes#_pattern_format for more about `.gitattributes`.
|
||||||
|
|
||||||
|
# Normalize EOL for all files that Git considers text files
|
||||||
* text=auto eol=lf
|
* text=auto eol=lf
|
||||||
|
|
||||||
|
# Mark lock files as generated to avoid diffing
|
||||||
pnpm-lock.yaml linguist-generated
|
pnpm-lock.yaml linguist-generated
|
||||||
|
package-lock.json linguist-generated
|
||||||
|
bun.lockb linguist-generated
|
||||||
|
yarn.lock linguist-generated
|
||||||
|
|
||||||
|
# Exclude templates from language statistics
|
||||||
|
templates/**/* linguist-vendored
|
||||||
|
|
||||||
|
# Other generated files
|
||||||
|
packages/browser/src/gen/** linguist-generated
|
||||||
|
|||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# Set default
|
||||||
|
* @aklinker1 @Timeraa
|
||||||
|
|
||||||
|
# Secure Directories
|
||||||
|
/.github/ @aklinker1
|
||||||
|
|
||||||
|
# Creator of specific wxt modules
|
||||||
|
/packages/auto-icons/ @Timeraa
|
||||||
|
/packages/unocss/ @Timeraa
|
||||||
@@ -0,0 +1,3 @@
|
|||||||
|
# https://docs.github.com/en/repositories/managing-your-repositorys-settings-and-features/customizing-your-repository/displaying-a-sponsor-button-in-your-repository#about-funding-files
|
||||||
|
|
||||||
|
github: wxt-dev
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
---
|
|
||||||
name: Bug report
|
|
||||||
about: Report an issue with WXT
|
|
||||||
title: ''
|
|
||||||
labels: triage
|
|
||||||
assignees: ''
|
|
||||||
---
|
|
||||||
|
|
||||||
### Describe the bug
|
|
||||||
|
|
||||||
A clear and concise description of what the bug is.
|
|
||||||
|
|
||||||
### To Reproduce
|
|
||||||
|
|
||||||
Upload a ZIP or share a link to a repo representing the minimal reproduction. **_If you don't upload a minimal reproduction, you bug report will be closed._**
|
|
||||||
|
|
||||||
Steps to reproduce the behavior:
|
|
||||||
|
|
||||||
1. Go to '...'
|
|
||||||
2. Click on '....'
|
|
||||||
3. Scroll down to '....'
|
|
||||||
4. See error
|
|
||||||
|
|
||||||
### Expected behavior
|
|
||||||
|
|
||||||
A clear and concise description of what you expected to happen.
|
|
||||||
|
|
||||||
### Screenshots
|
|
||||||
|
|
||||||
If applicable, add screenshots to help explain your problem.
|
|
||||||
|
|
||||||
### Environment
|
|
||||||
|
|
||||||
<!--- Run `npx envinfo --system --browsers --binaries --npmPackages wxt,vite` and paste the output below -->
|
|
||||||
|
|
||||||
```
|
|
||||||
Paste output here
|
|
||||||
```
|
|
||||||
|
|
||||||
### Additional context
|
|
||||||
|
|
||||||
Add any other context about the problem here, otherwise you can delete this section.
|
|
||||||
@@ -0,0 +1,75 @@
|
|||||||
|
name: "\U0001F41E Bug report"
|
||||||
|
description: Report an issue with WXT
|
||||||
|
labels: [pending-triage]
|
||||||
|
type: Bug
|
||||||
|
body:
|
||||||
|
- type: markdown
|
||||||
|
attributes:
|
||||||
|
value: |
|
||||||
|
Thanks for taking the time to fill out this bug report!
|
||||||
|
- type: textarea
|
||||||
|
id: bug-description
|
||||||
|
attributes:
|
||||||
|
label: Describe the bug
|
||||||
|
description: A clear and concise description of what the bug is. If you intend to submit a PR for this issue, tell us in the description. Thanks!
|
||||||
|
placeholder: I am doing ... What I expect is ... What actually happening is ...
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: reproduction
|
||||||
|
attributes:
|
||||||
|
label: Reproduction
|
||||||
|
description: |
|
||||||
|
Please provide a minimal reproduction. This can include:
|
||||||
|
|
||||||
|
- A PR with a failing test case
|
||||||
|
- A link to a github repo
|
||||||
|
- A ZIP you upload to this issue
|
||||||
|
|
||||||
|
A [minimal reproduction](https://stackoverflow.com/help/minimal-reproducible-example) is required ([Why?](https://antfu.me/posts/why-reproductions-are-required)). If a report is vague (e.g. just a generic error message) and has no reproduction or a partial reproduction, it will be closed immediately and labeled with as "needs-reproduction". Once a reproduction is provided, it will be re-opened.
|
||||||
|
placeholder: Reproduction URL or attach a ZIP
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: textarea
|
||||||
|
id: reproduction-steps
|
||||||
|
attributes:
|
||||||
|
label: Steps to reproduce
|
||||||
|
description: Please provide any reproduction steps that may need to be described. E.g. if it happens only when running the dev or build script make sure it's clear which one to use.
|
||||||
|
placeholder: Run `npm install` followed by `npm run dev`
|
||||||
|
- type: textarea
|
||||||
|
id: system-info
|
||||||
|
attributes:
|
||||||
|
label: System Info
|
||||||
|
description: Output of `npx envinfo --system --browsers --binaries --npmPackages wxt,vite`
|
||||||
|
render: shell
|
||||||
|
placeholder: System, Binaries, Browsers
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: dropdown
|
||||||
|
id: package-manager
|
||||||
|
attributes:
|
||||||
|
label: Used Package Manager
|
||||||
|
description: Select the used package manager
|
||||||
|
options:
|
||||||
|
- npm
|
||||||
|
- yarn
|
||||||
|
- pnpm
|
||||||
|
- bun
|
||||||
|
validations:
|
||||||
|
required: true
|
||||||
|
- type: checkboxes
|
||||||
|
id: checkboxes
|
||||||
|
attributes:
|
||||||
|
label: Validations
|
||||||
|
description: Before submitting the issue, please make sure you do the following
|
||||||
|
options:
|
||||||
|
- label: Read the [Contributing Guidelines](https://github.com/wxt-dev/wxt/blob/main/CONTRIBUTING.md).
|
||||||
|
required: true
|
||||||
|
- label: Read the [docs](https://wxt.dev/guide/installation.html).
|
||||||
|
required: true
|
||||||
|
- label: Check that there isn't [already an issue](https://github.com/wxt-dev/wxt/issues) that reports the same bug to avoid creating a duplicate.
|
||||||
|
required: true
|
||||||
|
- label: Check that this is a concrete bug. For Q&A open a [GitHub Discussion](https://github.com/wxt-dev/wxt/discussions) or join our [Discord Chat Server](https://discord.gg/ZFsZqGery9).
|
||||||
|
required: true
|
||||||
|
- label: The provided reproduction is a [minimal reproducible example](https://stackoverflow.com/help/minimal-reproducible-example) of the bug.
|
||||||
|
required: true
|
||||||
@@ -0,0 +1,8 @@
|
|||||||
|
blank_issues_enabled: false
|
||||||
|
contact_links:
|
||||||
|
- name: Discord Chat
|
||||||
|
url: https://discord.gg/ZFsZqGery9
|
||||||
|
about: Ask questions and discuss with other WXT users in real time.
|
||||||
|
- name: Questions & Discussions
|
||||||
|
url: https://github.com/wxt-dev/wxt/discussions
|
||||||
|
about: Use GitHub discussions for message-board style questions and discussions.
|
||||||
@@ -2,7 +2,7 @@
|
|||||||
name: Feature request
|
name: Feature request
|
||||||
about: Suggest an idea for WXT
|
about: Suggest an idea for WXT
|
||||||
title: ''
|
title: ''
|
||||||
labels: feature
|
type: Feature
|
||||||
assignees: ''
|
assignees: ''
|
||||||
---
|
---
|
||||||
|
|
||||||
|
|||||||
@@ -0,0 +1,29 @@
|
|||||||
|
name: Basic Setup
|
||||||
|
description: Install PNPM, Node, and dependencies
|
||||||
|
|
||||||
|
inputs:
|
||||||
|
install:
|
||||||
|
default: 'true'
|
||||||
|
description: Whether or not to run 'pnpm install'
|
||||||
|
|
||||||
|
installArgs:
|
||||||
|
default: ''
|
||||||
|
description: Additional args to append to "pnpm install"
|
||||||
|
|
||||||
|
runs:
|
||||||
|
using: composite
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: 🛠️ Setup PNPM
|
||||||
|
uses: pnpm/action-setup@f2b2b233b538f500472c7274c7012f57857d8ce0 # v4.1.0
|
||||||
|
|
||||||
|
- name: 🛠️ Setup NodeJS
|
||||||
|
uses: actions/setup-node@b7234cc9fe124f0f4932554b4e5284543083ae7b # v4.4.0
|
||||||
|
with:
|
||||||
|
node-version: 20
|
||||||
|
cache: pnpm
|
||||||
|
|
||||||
|
- name: 📦 Install Dependencies
|
||||||
|
if: ${{ inputs.install == 'true' }}
|
||||||
|
shell: bash
|
||||||
|
run: pnpm install ${{ inputs.installArgs }}
|
||||||
@@ -6,6 +6,10 @@
|
|||||||
version: 2
|
version: 2
|
||||||
updates:
|
updates:
|
||||||
- package-ecosystem: npm
|
- package-ecosystem: npm
|
||||||
directory: '/' # Location of package manifests
|
directory: /
|
||||||
|
schedule:
|
||||||
|
interval: 'monthly'
|
||||||
|
- package-ecosystem: 'github-actions'
|
||||||
|
directory: '/'
|
||||||
schedule:
|
schedule:
|
||||||
interval: 'monthly'
|
interval: 'monthly'
|
||||||
|
|||||||
@@ -0,0 +1,13 @@
|
|||||||
|
### Overview
|
||||||
|
|
||||||
|
<!-- Describe your changes and why you made them -->
|
||||||
|
|
||||||
|
### Manual Testing
|
||||||
|
|
||||||
|
<!-- Describe how to test your changes to make sure the PR works as intended -->
|
||||||
|
|
||||||
|
### Related Issue
|
||||||
|
|
||||||
|
<!-- If this PR is related to an issue, please link it here -->
|
||||||
|
|
||||||
|
This PR closes #<issue_number>
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
name: ✨ pkg.pr.new
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
pull_request:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
build:
|
||||||
|
name: Publish Test Packages
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
if: ${{ github.repository == 'wxt-dev/wxt' }}
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
uses: ./.github/actions/setup
|
||||||
|
|
||||||
|
- name: Build All Packages
|
||||||
|
run: pnpm buildc all
|
||||||
|
|
||||||
|
- name: Publish
|
||||||
|
run: pnpx pkg-pr-new publish --compact --pnpm './packages/*'
|
||||||
@@ -0,0 +1,29 @@
|
|||||||
|
name: 🎉 PR closed
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request_target:
|
||||||
|
types:
|
||||||
|
- closed
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
pull-requests: write
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
thank-you:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
if: github.event.pull_request.merged == true
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Post Thank You Comment
|
||||||
|
uses: actions/github-script@60a0d83039c74a4aee543508d2ffcb1c3799cdea # v7.0.1
|
||||||
|
env:
|
||||||
|
comment: Thanks for helping make WXT better!
|
||||||
|
with:
|
||||||
|
script: |
|
||||||
|
github.rest.issues.createComment({
|
||||||
|
issue_number: context.issue.number,
|
||||||
|
owner: context.repo.owner,
|
||||||
|
repo: context.repo.repo,
|
||||||
|
body: process.env.comment
|
||||||
|
})
|
||||||
@@ -0,0 +1,26 @@
|
|||||||
|
name: 🛡️ Check PR Title
|
||||||
|
|
||||||
|
on:
|
||||||
|
pull_request:
|
||||||
|
types: [opened, edited]
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
lint-pr-title:
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
|
with:
|
||||||
|
# Only fetch the config file from the repository
|
||||||
|
sparse-checkout-cone-mode: false
|
||||||
|
sparse-checkout: .commitlintrc.yml
|
||||||
|
|
||||||
|
- name: Install dependencies
|
||||||
|
run: npm install --global @commitlint/config-conventional commitlint
|
||||||
|
|
||||||
|
- name: Check PR title with commitlint
|
||||||
|
env:
|
||||||
|
PR_TITLE: ${{ github.event.pull_request.title }}
|
||||||
|
HELP_URL: https://github.com/wxt-dev/wxt/blob/main/CONTRIBUTING.md#conventional-pr-titles
|
||||||
|
run: echo "$PR_TITLE" | npx commitlint --help-url $HELP_URL
|
||||||
@@ -0,0 +1,47 @@
|
|||||||
|
name: 📝 Publish Docs
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
branches:
|
||||||
|
- main
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
tag:
|
||||||
|
description: Docker Image Tag
|
||||||
|
required: true
|
||||||
|
default: latest
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
publish:
|
||||||
|
# Only run if it's the upstream repository, not forks
|
||||||
|
if: github.repository == 'wxt-dev/wxt'
|
||||||
|
name: Publish Docs
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
uses: ./.github/actions/setup
|
||||||
|
|
||||||
|
- name: Login to Docker Registry
|
||||||
|
uses: docker/login-action@184bdaa0721073962dff0199f1fb9940f07167d1 # v3.5.0
|
||||||
|
with:
|
||||||
|
registry: https://${{ secrets.DOCKER_REGISTRY_HOSTNAME }}
|
||||||
|
username: ${{ secrets.DOCKER_REGISTRY_USERNAME }}
|
||||||
|
password: ${{ secrets.DOCKER_REGISTRY_PASSWORD }}
|
||||||
|
|
||||||
|
- name: Build docs
|
||||||
|
run: |
|
||||||
|
pnpm docs:build
|
||||||
|
docker build docs/.vitepress -t ${{ secrets.DOCKER_REGISTRY_HOSTNAME }}/wxt/docs:${{ github.event.inputs.tag || 'latest' }}
|
||||||
|
|
||||||
|
- name: Push Image
|
||||||
|
run: docker push ${{ secrets.DOCKER_REGISTRY_HOSTNAME }}/wxt/docs:${{ github.event.inputs.tag || 'latest' }}
|
||||||
|
|
||||||
|
- name: Deploy
|
||||||
|
run: curl -X POST -i ${{ secrets.UPDATE_DOCS_WEBHOOK }}
|
||||||
@@ -1,47 +1,71 @@
|
|||||||
name: Release
|
name: 🚀 Release
|
||||||
on:
|
on:
|
||||||
workflow_dispatch:
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
package:
|
||||||
|
description: Package to release
|
||||||
|
default: wxt
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- analytics
|
||||||
|
- auto-icons
|
||||||
|
- i18n
|
||||||
|
- module-react
|
||||||
|
- module-solid
|
||||||
|
- module-svelte
|
||||||
|
- module-vue
|
||||||
|
- runner
|
||||||
|
- storage
|
||||||
|
- unocss
|
||||||
|
- webextension-polyfill
|
||||||
|
- wxt
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
validate:
|
validate:
|
||||||
|
name: Validate
|
||||||
uses: './.github/workflows/validate.yml'
|
uses: './.github/workflows/validate.yml'
|
||||||
|
secrets: inherit
|
||||||
|
|
||||||
publish:
|
publish:
|
||||||
|
name: Publish
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
needs:
|
needs:
|
||||||
- validate
|
- validate
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
with:
|
with:
|
||||||
fetch-depth: 0
|
fetch-depth: 0
|
||||||
|
ssh-key: ${{ secrets.DEPLOY_KEY }} # https://github.com/sbellone/release-workflow-example
|
||||||
|
|
||||||
- name: Setup PNPM
|
- name: Setup
|
||||||
uses: pnpm/action-setup@v2
|
uses: ./.github/actions/setup
|
||||||
with:
|
|
||||||
version: 8
|
|
||||||
|
|
||||||
- name: Setup NodeJS
|
- name: Configure Git
|
||||||
uses: actions/setup-node@v3
|
run: |
|
||||||
with:
|
git config user.name 'github-actions[bot]'
|
||||||
node-version: 18
|
git config user.email 'github-actions[bot]@users.noreply.github.com'
|
||||||
cache: 'pnpm'
|
git config --global push.followTags true
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install
|
|
||||||
|
|
||||||
- name: Bump and Tag
|
- name: Bump and Tag
|
||||||
run: |
|
run: |
|
||||||
git config user.email "github-actions@users.noreply.github.com"
|
pnpm tsx scripts/bump-package-version.ts ${{ inputs.package }}
|
||||||
git config user.name "GitHub Actions"
|
|
||||||
pnpx changelogen@latest --release
|
|
||||||
git push
|
git push
|
||||||
git push --tags
|
git push --tags
|
||||||
|
|
||||||
- name: NPM
|
- name: Publish to NPM
|
||||||
|
working-directory: packages/${{ inputs.package }}
|
||||||
run: |
|
run: |
|
||||||
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_AUTH_TOKEN }}" > ~/.npmrc
|
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_AUTH_TOKEN }}" > ~/.npmrc
|
||||||
|
pnpm build
|
||||||
pnpm publish
|
pnpm publish
|
||||||
|
|
||||||
- name: GitHub Release
|
- name: Create GitHub release
|
||||||
run: pnpx changelogen@latest gh release --token ${{ secrets.GITHUB_TOKEN }}
|
run: pnpm tsx scripts/create-github-release.ts ${{ inputs.package }}
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
|||||||
@@ -0,0 +1,43 @@
|
|||||||
|
name: 🔄 Sync Releases
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
inputs:
|
||||||
|
package:
|
||||||
|
description: Package to sync
|
||||||
|
default: wxt
|
||||||
|
type: choice
|
||||||
|
options:
|
||||||
|
- analytics
|
||||||
|
- auto-icons
|
||||||
|
- i18n
|
||||||
|
- module-react
|
||||||
|
- module-solid
|
||||||
|
- module-svelte
|
||||||
|
- module-vue
|
||||||
|
- runner
|
||||||
|
- storage
|
||||||
|
- webextension-polyfill
|
||||||
|
- wxt
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
sync:
|
||||||
|
name: Sync Releases
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
uses: ./.github/actions/setup
|
||||||
|
with:
|
||||||
|
installArgs: --ignore-scripts
|
||||||
|
|
||||||
|
- name: Sync Releases
|
||||||
|
run: pnpm tsx scripts/sync-releases.ts ${{ inputs.package }}
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
@@ -0,0 +1,46 @@
|
|||||||
|
name: 🔄 Update @wxt-dev/browser
|
||||||
|
on:
|
||||||
|
workflow_dispatch:
|
||||||
|
schedule:
|
||||||
|
- cron: '0 0 * * *' # Every day at midnight
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
sync:
|
||||||
|
name: 'Sync with @types/chrome'
|
||||||
|
runs-on: ubuntu-latest
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
uses: ./.github/actions/setup
|
||||||
|
with:
|
||||||
|
installArgs: --ignore-scripts
|
||||||
|
|
||||||
|
- name: Generate Latest Code
|
||||||
|
working-directory: packages/browser
|
||||||
|
run: pnpm gen
|
||||||
|
|
||||||
|
- name: Run Checks
|
||||||
|
working-directory: packages/browser
|
||||||
|
run: pnpm check
|
||||||
|
|
||||||
|
- name: Commit Changes
|
||||||
|
id: commit
|
||||||
|
uses: stefanzweifel/git-auto-commit-action@01d77ca6cb089da1360e540865f7d035c95aa199 # v6.0.1
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
commit_message: 'fix: Upgrade `@wxt-dev/browser` to latest `@types/chrome` version'
|
||||||
|
|
||||||
|
- name: Publish Package
|
||||||
|
if: steps.commit.outputs.changes_detected == 'true'
|
||||||
|
working-directory: packages/browser
|
||||||
|
run: |
|
||||||
|
echo "//registry.npmjs.org/:_authToken=${{ secrets.NPM_AUTH_TOKEN }}" > ~/.npmrc
|
||||||
|
pnpm publish
|
||||||
+115
-105
@@ -1,4 +1,4 @@
|
|||||||
name: Validate
|
name: 🛡️ Validate
|
||||||
on:
|
on:
|
||||||
workflow_call:
|
workflow_call:
|
||||||
pull_request:
|
pull_request:
|
||||||
@@ -6,121 +6,131 @@ on:
|
|||||||
branches:
|
branches:
|
||||||
- main
|
- main
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
jobs:
|
jobs:
|
||||||
wxt:
|
checks:
|
||||||
name: WXT
|
name: Checks
|
||||||
strategy:
|
|
||||||
fail-fast: false
|
|
||||||
matrix:
|
|
||||||
os: [ubuntu-latest, windows-latest]
|
|
||||||
runs-on: ${{ matrix.os }}
|
|
||||||
steps:
|
|
||||||
- name: Checkout
|
|
||||||
uses: actions/checkout@v3
|
|
||||||
|
|
||||||
- name: Setup PNPM
|
|
||||||
uses: pnpm/action-setup@v2
|
|
||||||
with:
|
|
||||||
version: 8
|
|
||||||
|
|
||||||
- name: Setup NodeJS
|
|
||||||
uses: actions/setup-node@v3
|
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
|
||||||
run: pnpm install
|
|
||||||
|
|
||||||
- name: Formatting
|
|
||||||
run: pnpm format:check
|
|
||||||
|
|
||||||
- name: Type Check
|
|
||||||
run: pnpm compile
|
|
||||||
|
|
||||||
- name: Build Demo
|
|
||||||
run: |
|
|
||||||
pnpm build:all:chrome-mv2
|
|
||||||
pnpm build:all:chrome-mv3
|
|
||||||
pnpm build:all:firefox-mv2
|
|
||||||
pnpm build:all:firefox-mv3
|
|
||||||
pnpm tsc --noEmit
|
|
||||||
pnpm wxt zip
|
|
||||||
working-directory: demo
|
|
||||||
|
|
||||||
- name: Tests
|
|
||||||
run: pnpm test:coverage --reporter=default --reporter=hanging-process
|
|
||||||
|
|
||||||
- name: Upload coverage reports to Codecov
|
|
||||||
uses: codecov/codecov-action@v3
|
|
||||||
env:
|
|
||||||
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
|
||||||
|
|
||||||
project-templates:
|
|
||||||
name: Project Templates
|
|
||||||
runs-on: ubuntu-22.04
|
runs-on: ubuntu-22.04
|
||||||
steps:
|
steps:
|
||||||
- name: Checkout
|
- name: Checkout
|
||||||
uses: actions/checkout@v3
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
|
|
||||||
- name: Setup PNPM
|
- name: Setup
|
||||||
uses: pnpm/action-setup@v2
|
uses: ./.github/actions/setup
|
||||||
with:
|
|
||||||
version: 8
|
|
||||||
|
|
||||||
- name: Setup NodeJS
|
- name: Basic Checks
|
||||||
uses: actions/setup-node@v3
|
run: pnpm check
|
||||||
with:
|
|
||||||
node-version: 18
|
|
||||||
cache: 'pnpm'
|
|
||||||
|
|
||||||
- name: Install dependencies
|
builds:
|
||||||
run: pnpm install
|
name: Builds
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
|
|
||||||
- name: Build Local Tarball
|
- name: Setup
|
||||||
|
uses: ./.github/actions/setup
|
||||||
|
|
||||||
|
- name: Build All Packages
|
||||||
|
run: pnpm buildc all
|
||||||
|
|
||||||
|
build-demo:
|
||||||
|
name: Build Demo
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
uses: ./.github/actions/setup
|
||||||
|
|
||||||
|
- name: Build
|
||||||
|
run: pnpm build:all
|
||||||
|
working-directory: packages/wxt-demo
|
||||||
|
|
||||||
|
- name: ZIP
|
||||||
|
run: pnpm wxt zip
|
||||||
|
working-directory: packages/wxt-demo
|
||||||
|
|
||||||
|
tests:
|
||||||
|
name: Tests (${{ matrix.title }})
|
||||||
|
runs-on: ${{ matrix.os }}
|
||||||
|
strategy:
|
||||||
|
matrix:
|
||||||
|
include:
|
||||||
|
- title: 'Linux'
|
||||||
|
os: ubuntu-22.04
|
||||||
|
coverage: true
|
||||||
|
- title: 'Windows'
|
||||||
|
os: windows-latest
|
||||||
|
coverage: false
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
uses: ./.github/actions/setup
|
||||||
|
|
||||||
|
- name: Setup Bun
|
||||||
|
uses: oven-sh/setup-bun@22457c87c1b161cf7dde222c3e82b2b5f8d2bed2 # v2.0.2
|
||||||
|
|
||||||
|
- name: Run Tests
|
||||||
|
if: ${{ ! matrix.coverage }}
|
||||||
|
run: pnpm test
|
||||||
|
|
||||||
|
- name: Run Tests (Coverage)
|
||||||
|
if: matrix.coverage
|
||||||
|
run: pnpm test:coverage --reporter=default --reporter=hanging-process
|
||||||
|
|
||||||
|
- name: Upload Coverage
|
||||||
|
if: matrix.coverage
|
||||||
|
uses: codecov/codecov-action@fdcc8476540edceab3de004e990f80d881c6cc00 # v5.5.0
|
||||||
|
env:
|
||||||
|
CODECOV_TOKEN: ${{ secrets.CODECOV_TOKEN }}
|
||||||
|
|
||||||
|
template:
|
||||||
|
name: Template
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
strategy:
|
||||||
|
fail-fast: false
|
||||||
|
matrix:
|
||||||
|
template:
|
||||||
|
- react
|
||||||
|
- solid
|
||||||
|
- svelte
|
||||||
|
- vanilla
|
||||||
|
- vue
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
uses: ./.github/actions/setup
|
||||||
|
|
||||||
|
- name: Pack WXT package
|
||||||
run: pnpm pack
|
run: pnpm pack
|
||||||
|
working-directory: packages/wxt
|
||||||
|
|
||||||
- name: Validate Vanilla
|
- name: Install Dependencies
|
||||||
working-directory: templates/vanilla
|
run: npm i
|
||||||
run: |
|
working-directory: templates/${{ matrix.template }}
|
||||||
npm i
|
|
||||||
npm i -D ../../wxt-*.tgz
|
|
||||||
npm ls vite
|
|
||||||
npm run build
|
|
||||||
npm run compile
|
|
||||||
|
|
||||||
- name: Validate Vue
|
- name: Install Packed WXT
|
||||||
working-directory: templates/vue
|
run: npm i -D ../../packages/wxt/wxt-*.tgz
|
||||||
run: |
|
working-directory: templates/${{ matrix.template }}
|
||||||
npm i
|
|
||||||
npm i -D ../../wxt-*.tgz
|
|
||||||
npm ls vite
|
|
||||||
npm run build
|
|
||||||
npm run compile
|
|
||||||
|
|
||||||
- name: Validate React
|
- name: Type Check Template
|
||||||
working-directory: templates/react
|
run: pnpm compile
|
||||||
run: |
|
if: matrix.template != 'svelte'
|
||||||
npm i
|
working-directory: templates/${{ matrix.template }}
|
||||||
npm i -D ../../wxt-*.tgz
|
|
||||||
npm ls vite
|
|
||||||
npm run build
|
|
||||||
npm run compile
|
|
||||||
|
|
||||||
- name: Validate Svelte
|
- name: Type Check Template
|
||||||
working-directory: templates/svelte
|
run: pnpm check
|
||||||
run: |
|
if: matrix.template == 'svelte'
|
||||||
npm i
|
working-directory: templates/${{ matrix.template }}
|
||||||
npm i -D ../../wxt-*.tgz
|
|
||||||
npm ls vite
|
|
||||||
npm run build
|
|
||||||
npm run check
|
|
||||||
|
|
||||||
- name: Validate Solid
|
- name: Build Template
|
||||||
working-directory: templates/solid
|
run: pnpm build
|
||||||
run: |
|
working-directory: templates/${{ matrix.template }}
|
||||||
npm i
|
|
||||||
npm i -D ../../wxt-*.tgz
|
|
||||||
npm ls vite
|
|
||||||
npm run build
|
|
||||||
npm run compile
|
|
||||||
|
|||||||
@@ -0,0 +1,45 @@
|
|||||||
|
name: 📼 VHS
|
||||||
|
on:
|
||||||
|
push:
|
||||||
|
paths:
|
||||||
|
- 'docs/tapes/*.tape'
|
||||||
|
workflow_dispatch:
|
||||||
|
|
||||||
|
permissions:
|
||||||
|
contents: read
|
||||||
|
|
||||||
|
jobs:
|
||||||
|
vhs:
|
||||||
|
name: Create VHS
|
||||||
|
runs-on: ubuntu-22.04
|
||||||
|
if: ${{ github.repository == 'wxt-dev/wxt' }}
|
||||||
|
permissions:
|
||||||
|
contents: write
|
||||||
|
steps:
|
||||||
|
- name: Checkout
|
||||||
|
uses: actions/checkout@ff7abcd0c3c05ccf6adc123a8cd1fd4fb30fb493 # v5.0.0
|
||||||
|
|
||||||
|
- name: Setup
|
||||||
|
uses: ./.github/actions/setup
|
||||||
|
with:
|
||||||
|
install: false
|
||||||
|
|
||||||
|
# This prevents pnpm dlx from downloading WXT in the video
|
||||||
|
- name: Pre-install WXT
|
||||||
|
run: |
|
||||||
|
pnpm store add wxt@latest
|
||||||
|
pnpm dlx wxt@latest --version
|
||||||
|
|
||||||
|
- name: Record VHS
|
||||||
|
uses: charmbracelet/vhs-action@59641cdc7fadf3978db65eb8c6937ea2752f4ec3 # v2.1.0
|
||||||
|
with:
|
||||||
|
path: 'docs/tapes/init-demo.tape'
|
||||||
|
|
||||||
|
- name: Save recorded GIF
|
||||||
|
uses: stefanzweifel/git-auto-commit-action@01d77ca6cb089da1360e540865f7d035c95aa199 # v6.0.1
|
||||||
|
env:
|
||||||
|
GITHUB_TOKEN: ${{ secrets.GITHUB_TOKEN }}
|
||||||
|
with:
|
||||||
|
commit_message: 'docs: Update `wxt init` GIF'
|
||||||
|
# https://github.com/charmbracelet/vhs#output
|
||||||
|
file_pattern: 'docs/assets/*.gif'
|
||||||
+6
-3
@@ -5,9 +5,10 @@
|
|||||||
.output
|
.output
|
||||||
.webextrc
|
.webextrc
|
||||||
.wxt
|
.wxt
|
||||||
|
.wxt-runner
|
||||||
*.log
|
*.log
|
||||||
/.vscode/
|
|
||||||
/docs/.vitepress/cache
|
/docs/.vitepress/cache
|
||||||
|
docs/.vitepress/.temp
|
||||||
coverage
|
coverage
|
||||||
dist
|
dist
|
||||||
node_modules
|
node_modules
|
||||||
@@ -17,6 +18,8 @@ web-ext.config.ts
|
|||||||
templates/*/pnpm-lock.yaml
|
templates/*/pnpm-lock.yaml
|
||||||
templates/*/yarn.lock
|
templates/*/yarn.lock
|
||||||
templates/*/package-lock.json
|
templates/*/package-lock.json
|
||||||
docs/api/config.md
|
docs/api/reference
|
||||||
docs/api/cli.md
|
|
||||||
stats.html
|
stats.html
|
||||||
|
.tool-versions
|
||||||
|
.cache
|
||||||
|
*-stats.txt
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
{
|
||||||
|
"$schema": "https://raw.githubusercontent.com/DavidAnson/markdownlint/refs/heads/main/schema/markdownlint-config-schema.json",
|
||||||
|
"line-length": false,
|
||||||
|
"no-inline-html": false,
|
||||||
|
"first-line-heading": false
|
||||||
|
}
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
node_modules
|
||||||
|
.git
|
||||||
|
.output
|
||||||
|
dist
|
||||||
|
|
||||||
|
# Generated files
|
||||||
|
packages/wxt/README.md
|
||||||
|
packages/*/CHANGELOG.md
|
||||||
|
docs/api
|
||||||
+1
-8
@@ -5,11 +5,4 @@ dist
|
|||||||
docs/.vitepress/cache
|
docs/.vitepress/cache
|
||||||
pnpm-lock.yaml
|
pnpm-lock.yaml
|
||||||
CHANGELOG.md
|
CHANGELOG.md
|
||||||
.gitattributes
|
packages/browser/src/gen
|
||||||
.gitignore
|
|
||||||
.prettierignore
|
|
||||||
*.png
|
|
||||||
*.svg
|
|
||||||
*.txt
|
|
||||||
_gitignore
|
|
||||||
_redirects
|
|
||||||
|
|||||||
Vendored
+7
@@ -0,0 +1,7 @@
|
|||||||
|
{
|
||||||
|
"recommendations": [
|
||||||
|
"davidanson.vscode-markdownlint",
|
||||||
|
"esbenp.prettier-vscode",
|
||||||
|
"github.vscode-github-actions"
|
||||||
|
]
|
||||||
|
}
|
||||||
Vendored
+14
@@ -0,0 +1,14 @@
|
|||||||
|
{
|
||||||
|
// Set default formatter
|
||||||
|
"editor.defaultFormatter": "esbenp.prettier-vscode",
|
||||||
|
|
||||||
|
"[json]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
|
||||||
|
"[yaml]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
|
||||||
|
"[typescript]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
|
||||||
|
"[markdown]": { "editor.defaultFormatter": "esbenp.prettier-vscode" },
|
||||||
|
|
||||||
|
// Additional guidelines for Copilot
|
||||||
|
"github.copilot.chat.codeGeneration.instructions": [
|
||||||
|
{ "file": "CONTRIBUTING.md" }
|
||||||
|
]
|
||||||
|
}
|
||||||
-700
@@ -1,700 +0,0 @@
|
|||||||
# Changelog
|
|
||||||
|
|
||||||
## v0.7.2
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.7.1...v0.7.2)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Allow customizing entrypoint options per browser ([#154](https://github.com/wxt-dev/wxt/pull/154))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Default safari to MV2 ([5807931](https://github.com/wxt-dev/wxt/commit/5807931))
|
|
||||||
- Add missing `persistent` type to `defineBackgroundScript` ([d9fdcb5](https://github.com/wxt-dev/wxt/commit/d9fdcb5))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Restructure website to improve UX ([#149](https://github.com/wxt-dev/wxt/pull/149))
|
|
||||||
- Add docs for development and testing ([f58d69d](https://github.com/wxt-dev/wxt/commit/f58d69d))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- **deps-dev:** Bump @types/fs-extra from 11.0.1 to 11.0.2 ([#144](https://github.com/wxt-dev/wxt/pull/144))
|
|
||||||
- **deps-dev:** Bump @faker-js/faker from 8.0.2 to 8.1.0 ([#146](https://github.com/wxt-dev/wxt/pull/146))
|
|
||||||
- **deps-dev:** Bump vitest-mock-extended from 1.2.1 to 1.3.0 ([#147](https://github.com/wxt-dev/wxt/pull/147))
|
|
||||||
- **deps-dev:** Bump vitest from 0.34.3 to 0.34.6 ([#145](https://github.com/wxt-dev/wxt/pull/145))
|
|
||||||
- **deps-dev:** Bump typescript from 5.1 to 5.2 ([#148](https://github.com/wxt-dev/wxt/pull/148))
|
|
||||||
|
|
||||||
## v0.7.1
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.7.0...v0.7.1)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- `createContentScriptUi` helper ([#143](https://github.com/wxt-dev/wxt/pull/143))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Add docs for `createContentScriptUi` ([65fcfc0](https://github.com/wxt-dev/wxt/commit/65fcfc0))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- **release:** V0.7.1-alpha1 ([2d4983e](https://github.com/wxt-dev/wxt/commit/2d4983e))
|
|
||||||
|
|
||||||
## v0.7.0
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.6.6...v0.7.0)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Content script `cssInjectionMode` ([#141](https://github.com/wxt-dev/wxt/pull/141))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Validate transformed manifest correctly ([4b2012c](https://github.com/wxt-dev/wxt/commit/4b2012c))
|
|
||||||
- ⚠️ Output content script CSS to `content-scripts/<name>.css` ([#140](https://github.com/wxt-dev/wxt/pull/140))
|
|
||||||
- Reorder typescript paths to give priority to `@` and `~` over `@@` and `~~` ([#142](https://github.com/wxt-dev/wxt/pull/142))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Store user config metadata in memory ([0591050](https://github.com/wxt-dev/wxt/commit/0591050))
|
|
||||||
|
|
||||||
#### ⚠️ Breaking Changes
|
|
||||||
|
|
||||||
- ⚠️ Content script CSS used to be output to `assets/<name>.css`, but is now `content-scripts/<name>.css` to match the docs. ([#140](https://github.com/wxt-dev/wxt/pull/140))
|
|
||||||
|
|
||||||
## v0.6.6
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.6.5...v0.6.6)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Disable opening browser automatically during dev mode ([#136](https://github.com/wxt-dev/wxt/pull/136))
|
|
||||||
|
|
||||||
## v0.6.5
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.6.4...v0.6.5)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Don't crash when `<all_urls>` matches is used in dev mode ([b48cee9](https://github.com/wxt-dev/wxt/commit/b48cee9))
|
|
||||||
- Support loading `tsx` entrypoints ([#134](https://github.com/wxt-dev/wxt/pull/134))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Add tags for SEO and socials ([96be879](https://github.com/wxt-dev/wxt/commit/96be879))
|
|
||||||
- Add more content to the homepage ([5570793](https://github.com/wxt-dev/wxt/commit/5570793))
|
|
||||||
- Fix DX section sizing ([41e1549](https://github.com/wxt-dev/wxt/commit/41e1549))
|
|
||||||
- Add link to update extensions using WXT ([24e69fe](https://github.com/wxt-dev/wxt/commit/24e69fe))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Code coverage improvements ([#131](https://github.com/wxt-dev/wxt/pull/131))
|
|
||||||
|
|
||||||
## v0.6.4
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.6.3...v0.6.4)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- **content-scripts:** Don't throw an error when including `include` or `exclude` options on a content script ([455e7f3](https://github.com/wxt-dev/wxt/commit/455e7f3))
|
|
||||||
- Use `execaCommand` instead of `node:child_process` ([#130](https://github.com/wxt-dev/wxt/pull/130))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- **templates:** Add `.wxt` directory to gitignore ([#129](https://github.com/wxt-dev/wxt/pull/129))
|
|
||||||
- Increase E2E test timeout ([5482b2f](https://github.com/wxt-dev/wxt/commit/5482b2f))
|
|
||||||
|
|
||||||
## v0.6.3
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.6.2...v0.6.3)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- **client:** Add `block` and `addEventListener` utils to `ContentScriptContext` ([#128](https://github.com/wxt-dev/wxt/pull/128))
|
|
||||||
|
|
||||||
## v0.6.2
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.6.1...v0.6.2)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- `--analyze` build flag ([#125](https://github.com/wxt-dev/wxt/pull/125))
|
|
||||||
- Show spinner when building entrypoints ([#126](https://github.com/wxt-dev/wxt/pull/126))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Fix import typo ([4c43072](https://github.com/wxt-dev/wxt/commit/4c43072))
|
|
||||||
- Update vite docs to use function ([e0929a6](https://github.com/wxt-dev/wxt/commit/e0929a6))
|
|
||||||
|
|
||||||
## v0.6.1
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.6.0...v0.6.1)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Add `transformManifest` option ([#124](https://github.com/wxt-dev/wxt/pull/124))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Don't open browser during development when using WSL ([#123](https://github.com/wxt-dev/wxt/pull/123))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Load extension details from CWS ([8e0a189](https://github.com/wxt-dev/wxt/commit/8e0a189))
|
|
||||||
|
|
||||||
## v0.6.0
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.5.6...v0.6.0)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Export `ContentScriptContext` from `wxt/client` ([1f448d1](https://github.com/wxt-dev/wxt/commit/1f448d1))
|
|
||||||
- ⚠️ Require a function for `vite` configuration ([#121](https://github.com/wxt-dev/wxt/pull/121))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Use the same mode for each build step ([1f6a931](https://github.com/wxt-dev/wxt/commit/1f6a931))
|
|
||||||
- Disable dev logs in production ([3f260ee](https://github.com/wxt-dev/wxt/commit/3f260ee))
|
|
||||||
|
|
||||||
#### ⚠️ Breaking Changes
|
|
||||||
|
|
||||||
- ⚠️ The `vite` config option must now be a function. If you were using an object before, change it from `vite: { ... }` to `vite: () => ({ ... })`. ([#121](https://github.com/wxt-dev/wxt/pull/121))
|
|
||||||
|
|
||||||
## v0.5.6
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.5.5...v0.5.6)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Add `ContentScriptContext` util for stopping invalidated content scripts ([#120](https://github.com/wxt-dev/wxt/pull/120))
|
|
||||||
|
|
||||||
## v0.5.5
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.5.4...v0.5.5)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Automatically replace vite's `process.env.NODE_ENV` output in lib mode with the mode ([92039b8](https://github.com/wxt-dev/wxt/commit/92039b8))
|
|
||||||
|
|
||||||
## v0.5.4
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.5.3...v0.5.4)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Recognize `background/index.ts` as an entrypoint ([419fab8](https://github.com/wxt-dev/wxt/commit/419fab8))
|
|
||||||
- Don't warn about deep entrypoint subdirectories not being recognized ([87e8df9](https://github.com/wxt-dev/wxt/commit/87e8df9))
|
|
||||||
|
|
||||||
## v0.5.3
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.5.2...v0.5.3)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Allow function for vite config ([4ec904e](https://github.com/wxt-dev/wxt/commit/4ec904e))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Refactor how config is resolved ([#118](https://github.com/wxt-dev/wxt/pull/118))
|
|
||||||
|
|
||||||
## v0.5.2
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.5.1...v0.5.2)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Import client utils when getting entrypoint config ([#117](https://github.com/wxt-dev/wxt/pull/117))
|
|
||||||
|
|
||||||
## v0.5.1
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.5.0...v0.5.1)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Allow disabling auto-imports ([#114](https://github.com/wxt-dev/wxt/pull/114))
|
|
||||||
- Include/exclude entrypoints based on target browser ([#115](https://github.com/wxt-dev/wxt/pull/115))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Allow any string for target browser ([b4de93d](https://github.com/wxt-dev/wxt/commit/b4de93d))
|
|
||||||
|
|
||||||
## v0.5.0
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.4.1...v0.5.0)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- **types:** Don't write to files if nothing changes ([#107](https://github.com/wxt-dev/wxt/pull/107))
|
|
||||||
- ⚠️ Change default `publicDir` to `<srcDir>/public` ([5f15f9c](https://github.com/wxt-dev/wxt/commit/5f15f9c))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Add link to examples repo ([46a5036](https://github.com/wxt-dev/wxt/commit/46a5036))
|
|
||||||
- Fix typos ([beafa6a](https://github.com/wxt-dev/wxt/commit/beafa6a))
|
|
||||||
- Make README pretty ([b33b663](https://github.com/wxt-dev/wxt/commit/b33b663))
|
|
||||||
- Add migration docs ([e2350fe](https://github.com/wxt-dev/wxt/commit/e2350fe))
|
|
||||||
- Add vite customization docs ([fe966b6](https://github.com/wxt-dev/wxt/commit/fe966b6))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Move repo to wxt-dev org ([ac7cbfc](https://github.com/wxt-dev/wxt/commit/ac7cbfc))
|
|
||||||
- **deps-dev:** Bump prettier from 3.0.1 to 3.0.3 ([#111](https://github.com/wxt-dev/wxt/pull/111))
|
|
||||||
- **deps-dev:** Bump tsx from 3.12.7 to 3.12.8 ([#109](https://github.com/wxt-dev/wxt/pull/109))
|
|
||||||
- **deps-dev:** Bump @types/node from 20.5.0 to 20.5.9 ([#110](https://github.com/wxt-dev/wxt/pull/110))
|
|
||||||
- Add entrypoints debug log ([dbd84c8](https://github.com/wxt-dev/wxt/commit/dbd84c8))
|
|
||||||
|
|
||||||
#### ⚠️ Breaking Changes
|
|
||||||
|
|
||||||
- ⚠️ Change default `publicDir` to `<srcDir>/public` ([5f15f9c](https://github.com/wxt-dev/wxt/commit/5f15f9c))
|
|
||||||
|
|
||||||
## v0.4.1
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.4.0...v0.4.1)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- **cli:** Add `wxt clean` command to delete generated files ([#106](https://github.com/wxt-dev/wxt/pull/106))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- **init:** Don't show `cd .` when initializing the current directory ([e086374](https://github.com/wxt-dev/wxt/commit/e086374))
|
|
||||||
|
|
||||||
## v0.4.0
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.3.2...v0.4.0)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Add `--debug` flag for printing debug logs for all CLI commands ([#75](https://github.com/wxt-dev/wxt/pull/75))
|
|
||||||
- Replace `web-ext` with `web-ext-run` ([#101](https://github.com/wxt-dev/wxt/pull/101))
|
|
||||||
- Generate types for `browser.i18n.getMessage` ([#103](https://github.com/wxt-dev/wxt/pull/103))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Allow adding custom content scripts ([b428a62](https://github.com/wxt-dev/wxt/commit/b428a62))
|
|
||||||
- Don't overwrite `wxt.config.ts` content scripts, append entrypoints to it ([5f5f1d9](https://github.com/wxt-dev/wxt/commit/5f5f1d9))
|
|
||||||
- ⚠️ Use relative path aliases inside `.wxt/tsconfig.json` ([#102](https://github.com/wxt-dev/wxt/pull/102))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Add contribution guide ([#76](https://github.com/wxt-dev/wxt/pull/76))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Setup dependabot for upgrading dependencies ([d66293c](https://github.com/wxt-dev/wxt/commit/d66293c))
|
|
||||||
- Update social preview ([e164bd5](https://github.com/wxt-dev/wxt/commit/e164bd5))
|
|
||||||
- Setup bug and feature issue templates ([2bde917](https://github.com/wxt-dev/wxt/commit/2bde917))
|
|
||||||
- Upgrade to prettier 3 ([#77](https://github.com/wxt-dev/wxt/pull/77))
|
|
||||||
- **deps-dev:** Bump vitest from 0.32.4 to 0.34.1 ([#81](https://github.com/wxt-dev/wxt/pull/81))
|
|
||||||
- **deps-dev:** Bump ora from 6.3.1 to 7.0.1 ([#79](https://github.com/wxt-dev/wxt/pull/79))
|
|
||||||
- **deps-dev:** Bump @types/node from 20.4.5 to 20.5.0 ([#78](https://github.com/wxt-dev/wxt/pull/78))
|
|
||||||
- **deps-dev:** Bump tsup from 7.1.0 to 7.2.0 ([#80](https://github.com/wxt-dev/wxt/pull/80))
|
|
||||||
- **deps-dev:** Bump @vitest/coverage-v8 from 0.32.4 to 0.34.1 ([#84](https://github.com/wxt-dev/wxt/pull/84))
|
|
||||||
- **deps-dev:** Bump vitepress from 1.0.0-beta.5 to 1.0.0-rc.4 ([#85](https://github.com/wxt-dev/wxt/pull/85))
|
|
||||||
- **deps-dev:** Bump vitest-mock-extended from 1.1.4 to 1.2.0 ([#87](https://github.com/wxt-dev/wxt/pull/87))
|
|
||||||
- **deps-dev:** Bump lint-staged from 13.3.0 to 14.0.0 ([#89](https://github.com/wxt-dev/wxt/pull/89))
|
|
||||||
- Fix remote code E2E test ([83e62a1](https://github.com/wxt-dev/wxt/commit/83e62a1))
|
|
||||||
- Fix failing demo build ([b58a15e](https://github.com/wxt-dev/wxt/commit/b58a15e))
|
|
||||||
- **deps-dev:** Bump vitest-mock-extended from 1.2.0 to 1.2.1 ([#97](https://github.com/wxt-dev/wxt/pull/97))
|
|
||||||
- **deps-dev:** Bump lint-staged from 14.0.0 to 14.0.1 ([#100](https://github.com/wxt-dev/wxt/pull/100))
|
|
||||||
- **deps-dev:** Bump vitest from 0.34.1 to 0.34.3 ([#99](https://github.com/wxt-dev/wxt/pull/99))
|
|
||||||
- Increase E2E test timeout because GitHub Actions Window runner is slow ([2a0842b](https://github.com/wxt-dev/wxt/commit/2a0842b))
|
|
||||||
- **deps-dev:** Bump vitepress from 1.0.0-rc.4 to 1.0.0-rc.10 ([#96](https://github.com/wxt-dev/wxt/pull/96))
|
|
||||||
- Fix test watcher restarting indefinetly ([2c7922c](https://github.com/wxt-dev/wxt/commit/2c7922c))
|
|
||||||
- Remove explict icon config from templates ([93bfee0](https://github.com/wxt-dev/wxt/commit/93bfee0))
|
|
||||||
- Use import aliases in Vue template ([#104](https://github.com/wxt-dev/wxt/pull/104))
|
|
||||||
|
|
||||||
#### ⚠️ Breaking Changes
|
|
||||||
|
|
||||||
- ⚠️ Use relative path aliases inside `.wxt/tsconfig.json` ([#102](https://github.com/wxt-dev/wxt/pull/102))
|
|
||||||
|
|
||||||
## v0.3.2
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.3.1...v0.3.2)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Discover icons from the public directory ([#72](https://github.com/wxt-dev/wxt/pull/72))
|
|
||||||
- Don't allow auto-importing from subdirectories ([d54d611](https://github.com/wxt-dev/wxt/commit/d54d611))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Document the `url:` import prefix for remote code ([323045a](https://github.com/wxt-dev/wxt/commit/323045a))
|
|
||||||
- Fix typos ([97f0938](https://github.com/wxt-dev/wxt/commit/97f0938))
|
|
||||||
- Fix capitalization ([39467d1](https://github.com/wxt-dev/wxt/commit/39467d1))
|
|
||||||
- Generate markdown for config reference ([#74](https://github.com/wxt-dev/wxt/pull/74))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Upgrade dependencies ([798f02f](https://github.com/wxt-dev/wxt/commit/798f02f))
|
|
||||||
- Upgrade vite (`v4.3` → `v4.4`) ([547c185](https://github.com/wxt-dev/wxt/commit/547c185))
|
|
||||||
- Update templates to work with CSS entrypoints ([7f15305](https://github.com/wxt-dev/wxt/commit/7f15305))
|
|
||||||
- Improve file list output in CI ([#73](https://github.com/wxt-dev/wxt/pull/73))
|
|
||||||
|
|
||||||
### 🤖 CI
|
|
||||||
|
|
||||||
- Validate templates against `main` ([#66](https://github.com/wxt-dev/wxt/pull/66))
|
|
||||||
- List vite version when validating project templates ([ef140dc](https://github.com/wxt-dev/wxt/commit/ef140dc))
|
|
||||||
- Validate templates using tarball to avoid version conflicts within the `wxt/node_modules` directory ([edfa075](https://github.com/wxt-dev/wxt/commit/edfa075))
|
|
||||||
|
|
||||||
## v0.3.1
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.3.0...v0.3.1)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- CSS entrypoints ([#61](https://github.com/wxt-dev/wxt/pull/61))
|
|
||||||
- `init` command for bootstrapping new projects ([#65](https://github.com/wxt-dev/wxt/pull/65))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Add zip command to installation scripts ([94a1097](https://github.com/wxt-dev/wxt/commit/94a1097))
|
|
||||||
- Add output paths to entrypoint docs ([3a336eb](https://github.com/wxt-dev/wxt/commit/3a336eb))
|
|
||||||
- Update installation docs ([aea866c](https://github.com/wxt-dev/wxt/commit/aea866c))
|
|
||||||
- Add publishing docs ([4184b05](https://github.com/wxt-dev/wxt/commit/4184b05))
|
|
||||||
- Add a section for extensions using WXT ([709b61a](https://github.com/wxt-dev/wxt/commit/709b61a))
|
|
||||||
- Add a comparison page to compare and contrast against Plasmo ([38d4f9c](https://github.com/wxt-dev/wxt/commit/38d4f9c))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Update template projects to v0.3 ([#56](https://github.com/wxt-dev/wxt/pull/56))
|
|
||||||
- Branding and logo ([#60](https://github.com/wxt-dev/wxt/pull/60))
|
|
||||||
- Simplify binary setup ([#62](https://github.com/wxt-dev/wxt/pull/62))
|
|
||||||
- Add Solid template ([#63](https://github.com/wxt-dev/wxt/pull/63))
|
|
||||||
- Increate E2E test timeout to fix flakey test ([dfe424f](https://github.com/wxt-dev/wxt/commit/dfe424f))
|
|
||||||
|
|
||||||
### 🤖 CI
|
|
||||||
|
|
||||||
- Speed up demo validation ([3a9fd39](https://github.com/wxt-dev/wxt/commit/3a9fd39))
|
|
||||||
- Fix flakey failure when validating templates ([25677ba](https://github.com/wxt-dev/wxt/commit/25677ba))
|
|
||||||
|
|
||||||
### ❤️ Contributors
|
|
||||||
|
|
||||||
- BeanWei ([@BeanWei](https://github.com/BeanWei))
|
|
||||||
|
|
||||||
## v0.3.0
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.2.5...v0.3.0)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- ⚠️ Add type safety to `browser.runtime.getURL` ([58a84ec](https://github.com/wxt-dev/wxt/commit/58a84ec))
|
|
||||||
- ⚠️ Change default `publicDir` to `<rootDir>/public` ([19c0948](https://github.com/wxt-dev/wxt/commit/19c0948))
|
|
||||||
- Windows support ([#50](https://github.com/wxt-dev/wxt/pull/50))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Add `WebWorker` lib to generated tsconfig ([2c70246](https://github.com/wxt-dev/wxt/commit/2c70246))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Update entrypoint directory links ([0aebb67](https://github.com/wxt-dev/wxt/commit/0aebb67))
|
|
||||||
|
|
||||||
### 🌊 Types
|
|
||||||
|
|
||||||
- Allow any string for the `__BROWSER__` global ([6092235](https://github.com/wxt-dev/wxt/commit/6092235))
|
|
||||||
|
|
||||||
### 🤖 CI
|
|
||||||
|
|
||||||
- Improve checks against `demo/` extension ([9cc464f](https://github.com/wxt-dev/wxt/commit/9cc464f))
|
|
||||||
|
|
||||||
#### ⚠️ Breaking Changes
|
|
||||||
|
|
||||||
- ⚠️ Add type safety to `browser.runtime.getURL` ([58a84ec](https://github.com/wxt-dev/wxt/commit/58a84ec))
|
|
||||||
- ⚠️ Change default `publicDir` to `<rootDir>/public` ([19c0948](https://github.com/wxt-dev/wxt/commit/19c0948))
|
|
||||||
|
|
||||||
## v0.2.5
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.2.4...v0.2.5)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Auto-import from subdirectories ([547fee0](https://github.com/wxt-dev/wxt/commit/547fee0))
|
|
||||||
- Include background script in dev mode if user doesn't define one ([ca20a21](https://github.com/wxt-dev/wxt/commit/ca20a21))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Don't crash when generating types in dev mode ([d8c1903](https://github.com/wxt-dev/wxt/commit/d8c1903))
|
|
||||||
- Properly load entrypoints that reference `import.meta` ([54b18cc](https://github.com/wxt-dev/wxt/commit/54b18cc))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Update templates to wxt@0.2 ([9d00eb2](https://github.com/wxt-dev/wxt/commit/9d00eb2))
|
|
||||||
|
|
||||||
### 🤖 CI
|
|
||||||
|
|
||||||
- Validate project templates ([9ac756f](https://github.com/wxt-dev/wxt/commit/9ac756f))
|
|
||||||
|
|
||||||
## v0.2.4
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.2.3...v0.2.4)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Add `wxt zip` command ([#47](https://github.com/wxt-dev/wxt/pull/47))
|
|
||||||
|
|
||||||
## v0.2.3
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.2.2...v0.2.3)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Correctly lookup open port ([#45](https://github.com/wxt-dev/wxt/pull/45))
|
|
||||||
- Read boolean maniest options from meta tags correctly ([495c5c8](https://github.com/wxt-dev/wxt/commit/495c5c8))
|
|
||||||
- Some fields cannot be overridden from `config.manifest` ([#46](https://github.com/wxt-dev/wxt/pull/46))
|
|
||||||
|
|
||||||
## v0.2.2
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.2.1...v0.2.2)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Register content scripts correctly in dev mode ([2fb5a54](https://github.com/wxt-dev/wxt/commit/2fb5a54))
|
|
||||||
|
|
||||||
## v0.2.1
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.2.0...v0.2.1)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Support all content script options ([6f5bf89](https://github.com/wxt-dev/wxt/commit/6f5bf89))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Remove HMR log ([90fa6bf](https://github.com/wxt-dev/wxt/commit/90fa6bf))
|
|
||||||
|
|
||||||
## v0.2.0
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.1.6...v0.2.0)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- ⚠️ Rename `defineBackgroundScript` to `defineBackground` ([5b48ae9](https://github.com/wxt-dev/wxt/commit/5b48ae9))
|
|
||||||
- Recongize unnamed content scripts (`content.ts` and `content/index.ts`) ([3db5cec](https://github.com/wxt-dev/wxt/commit/3db5cec))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Update templates ([f28a29e](https://github.com/wxt-dev/wxt/commit/f28a29e))
|
|
||||||
- Add docs for each type of entrypoint ([77cbfc1](https://github.com/wxt-dev/wxt/commit/77cbfc1))
|
|
||||||
- Add inline JSDoc for public types ([375a2a6](https://github.com/wxt-dev/wxt/commit/375a2a6))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Run `wxt prepare` on `postinstall` ([c1ea9ba](https://github.com/wxt-dev/wxt/commit/c1ea9ba))
|
|
||||||
- Don't format lockfile ([5c7e041](https://github.com/wxt-dev/wxt/commit/5c7e041))
|
|
||||||
|
|
||||||
#### ⚠️ Breaking Changes
|
|
||||||
|
|
||||||
- ⚠️ Rename `defineBackgroundScript` to `defineBackground` ([5b48ae9](https://github.com/wxt-dev/wxt/commit/5b48ae9))
|
|
||||||
|
|
||||||
## v0.1.6
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.1.5...v0.1.6)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Resolve tsconfig paths in vite ([ea92a27](https://github.com/wxt-dev/wxt/commit/ea92a27))
|
|
||||||
- Add logs when a hot reload happens ([977246f](https://github.com/wxt-dev/wxt/commit/977246f))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- React and Vue starter templates ([#33](https://github.com/wxt-dev/wxt/pull/33))
|
|
||||||
- Svelte template ([#34](https://github.com/wxt-dev/wxt/pull/34))
|
|
||||||
|
|
||||||
## v0.1.5
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.1.4...v0.1.5)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Include `vite/client` types ([371be99](https://github.com/wxt-dev/wxt/commit/371be99))
|
|
||||||
|
|
||||||
## v0.1.4
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.1.3...v0.1.4)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Fix regression where manifest was not listed first in build summary ([fa2b656](https://github.com/wxt-dev/wxt/commit/fa2b656))
|
|
||||||
- Fix config hook implementations for vite plugins ([49965e7](https://github.com/wxt-dev/wxt/commit/49965e7))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Update CLI screenshot ([0a26673](https://github.com/wxt-dev/wxt/commit/0a26673))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Update prettier ignore ([68611ae](https://github.com/wxt-dev/wxt/commit/68611ae))
|
|
||||||
|
|
||||||
## v0.1.3
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.1.2...v0.1.3)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Add tsconfig path aliases ([#32](https://github.com/wxt-dev/wxt/pull/32))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Merge `manifest` option from both inline and user config ([05ca998](https://github.com/wxt-dev/wxt/commit/05ca998))
|
|
||||||
- Cleanup build summary with sourcemaps ([ac0b28e](https://github.com/wxt-dev/wxt/commit/ac0b28e))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Create documentation site ([#31](https://github.com/wxt-dev/wxt/pull/31))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Upgrade to pnpm 8 ([0ce7c9d](https://github.com/wxt-dev/wxt/commit/0ce7c9d))
|
|
||||||
|
|
||||||
## v0.1.2
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.1.1...v0.1.2)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Accept a function for `config.manifest` ([ee49837](https://github.com/wxt-dev/wxt/commit/ee49837))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Add missing types for `webextension-polyfill` and the `manifest` option ([636aa48](https://github.com/wxt-dev/wxt/commit/636aa48))
|
|
||||||
- Only add imports to JS files ([b29c3c6](https://github.com/wxt-dev/wxt/commit/b29c3c6))
|
|
||||||
- Generate valid type for `EntrypointPath` when there are no entrypoints ([6e7184d](https://github.com/wxt-dev/wxt/commit/6e7184d))
|
|
||||||
|
|
||||||
### 🌊 Types
|
|
||||||
|
|
||||||
- Change `config.vite` to `UserConfig` ([ef6001e](https://github.com/wxt-dev/wxt/commit/ef6001e))
|
|
||||||
|
|
||||||
## v0.1.1
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.1.0...v0.1.1)
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Allow dashes in entrypoint names ([2e51e73](https://github.com/wxt-dev/wxt/commit/2e51e73))
|
|
||||||
- Unable to read entrypoint options ([#28](https://github.com/wxt-dev/wxt/pull/28))
|
|
||||||
|
|
||||||
## v0.1.0
|
|
||||||
|
|
||||||
Initial release of WXT. Full support for production builds and initial toolkit for development:
|
|
||||||
|
|
||||||
- HMR support when HTML page dependencies change
|
|
||||||
- Reload extension when background changes
|
|
||||||
- Reload HTML pages when saving them directly
|
|
||||||
- Re-register and reload tabs when content scripts change
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.0.2...v0.1.0)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Content scripts reloading ([#25](https://github.com/wxt-dev/wxt/pull/25))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Update feature list ([0255028](https://github.com/wxt-dev/wxt/commit/0255028))
|
|
||||||
|
|
||||||
### 🤖 CI
|
|
||||||
|
|
||||||
- Create github release ([b7c078f](https://github.com/wxt-dev/wxt/commit/b7c078f))
|
|
||||||
|
|
||||||
## v0.0.2
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.0.1...v0.0.2)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Reload extension when source code is changed ([#17](https://github.com/wxt-dev/wxt/pull/17))
|
|
||||||
- Setup background script web socket/reload ([#22](https://github.com/wxt-dev/wxt/pull/22))
|
|
||||||
- Reload HTML files individually ([#23](https://github.com/wxt-dev/wxt/pull/23))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Output chunks to a chunks directory ([2dd7a99](https://github.com/wxt-dev/wxt/commit/2dd7a99))
|
|
||||||
- Remove hash from content script css outputs ([#20](https://github.com/wxt-dev/wxt/pull/20))
|
|
||||||
- Overwrite files with the same name when renaming entrypoints in dev mode ([37986bf](https://github.com/wxt-dev/wxt/commit/37986bf))
|
|
||||||
- Separate template builds to prevent sharing chunks ([7f3a1e8](https://github.com/wxt-dev/wxt/commit/7f3a1e8))
|
|
||||||
- Show Vite warnings and errors ([c51f0e0](https://github.com/wxt-dev/wxt/commit/c51f0e0))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Add milestone progress badge to README ([684197d](https://github.com/wxt-dev/wxt/commit/684197d))
|
|
||||||
- Fix milestone link in README ([e14f81d](https://github.com/wxt-dev/wxt/commit/e14f81d))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Refactor build output type ([#19](https://github.com/wxt-dev/wxt/pull/19))
|
|
||||||
- Refactor build outputs to support transpiled templates ([a78aada](https://github.com/wxt-dev/wxt/commit/a78aada))
|
|
||||||
- Rename `templates` to `virtual-modules` ([#24](https://github.com/wxt-dev/wxt/pull/24))
|
|
||||||
- Update cli screenshot ([54eb118](https://github.com/wxt-dev/wxt/commit/54eb118))
|
|
||||||
|
|
||||||
## v0.0.1
|
|
||||||
|
|
||||||
[compare changes](https://github.com/wxt-dev/wxt/compare/v0.0.0...v0.0.1)
|
|
||||||
|
|
||||||
### 🚀 Enhancements
|
|
||||||
|
|
||||||
- Add logger to config ([232ff7a](https://github.com/wxt-dev/wxt/commit/232ff7a))
|
|
||||||
- Export and bootstrap the `/client` package ([5b07c95](https://github.com/wxt-dev/wxt/commit/5b07c95))
|
|
||||||
- Resolve entrypoints based on filesystem ([a63f061](https://github.com/wxt-dev/wxt/commit/a63f061))
|
|
||||||
- Separate output directories for each browser/manifest version ([f09ffbb](https://github.com/wxt-dev/wxt/commit/f09ffbb))
|
|
||||||
- Build entrypoints and output `manfiest.json` ([1e7c738](https://github.com/wxt-dev/wxt/commit/1e7c738))
|
|
||||||
- Automatically add CSS files to content scripts ([047ce04](https://github.com/wxt-dev/wxt/commit/047ce04))
|
|
||||||
- Download and bundle remote URL imports ([523c7df](https://github.com/wxt-dev/wxt/commit/523c7df))
|
|
||||||
- Generate type declarations and config for project types and auto-imports ([21debad](https://github.com/wxt-dev/wxt/commit/21debad))
|
|
||||||
- Good looking console output ([e2cc995](https://github.com/wxt-dev/wxt/commit/e2cc995))
|
|
||||||
- Dev server working and a valid extension is built ([505e419](https://github.com/wxt-dev/wxt/commit/505e419))
|
|
||||||
- Virtualized content script entrypoint ([ca29537](https://github.com/wxt-dev/wxt/commit/ca29537))
|
|
||||||
- Provide custom, typed globals defined by Vite ([8c59a1c](https://github.com/wxt-dev/wxt/commit/8c59a1c))
|
|
||||||
- Copy public directory to outputs ([1a25f2b](https://github.com/wxt-dev/wxt/commit/1a25f2b))
|
|
||||||
- Support browser and chrome styles for mv2 popups ([7945c94](https://github.com/wxt-dev/wxt/commit/7945c94))
|
|
||||||
- Support browser and chrome styles for mv2 popups ([7abb577](https://github.com/wxt-dev/wxt/commit/7abb577))
|
|
||||||
- Support more CLI flags for `build` and `dev` ([#9](https://github.com/wxt-dev/wxt/pull/9))
|
|
||||||
- Add more supported browser types ([f114c5b](https://github.com/wxt-dev/wxt/commit/f114c5b))
|
|
||||||
- Open browser when starting dev server ([#11](https://github.com/wxt-dev/wxt/pull/11))
|
|
||||||
|
|
||||||
### 🩹 Fixes
|
|
||||||
|
|
||||||
- Support `srcDir` config ([739d19f](https://github.com/wxt-dev/wxt/commit/739d19f))
|
|
||||||
- Root path customization now works ([4faa3b3](https://github.com/wxt-dev/wxt/commit/4faa3b3))
|
|
||||||
- Print durations as ms/s based on total time ([3e37de9](https://github.com/wxt-dev/wxt/commit/3e37de9))
|
|
||||||
- Don't print error twice when background crashes ([407627c](https://github.com/wxt-dev/wxt/commit/407627c))
|
|
||||||
- Load package.json from root not cwd ([3ca16ee](https://github.com/wxt-dev/wxt/commit/3ca16ee))
|
|
||||||
- Only allow a single entrypoint with a given name ([8eb4e86](https://github.com/wxt-dev/wxt/commit/8eb4e86))
|
|
||||||
- Respect the mv2 popup type ([0f37ceb](https://github.com/wxt-dev/wxt/commit/0f37ceb))
|
|
||||||
- Respect background type and persistent manifest options ([573ef80](https://github.com/wxt-dev/wxt/commit/573ef80))
|
|
||||||
- Make content script array orders consistent ([f380378](https://github.com/wxt-dev/wxt/commit/f380378))
|
|
||||||
- Firefox manifest warnings in dev mode ([50bb845](https://github.com/wxt-dev/wxt/commit/50bb845))
|
|
||||||
|
|
||||||
### 📖 Documentation
|
|
||||||
|
|
||||||
- Update README ([785ea54](https://github.com/wxt-dev/wxt/commit/785ea54))
|
|
||||||
- Update README ([99ccadb](https://github.com/wxt-dev/wxt/commit/99ccadb))
|
|
||||||
- Update description ([07a262e](https://github.com/wxt-dev/wxt/commit/07a262e))
|
|
||||||
- Update README ([58a0ef4](https://github.com/wxt-dev/wxt/commit/58a0ef4))
|
|
||||||
- Update README ([23ed6f7](https://github.com/wxt-dev/wxt/commit/23ed6f7))
|
|
||||||
- Add initial release milestone link to README ([b400e54](https://github.com/wxt-dev/wxt/commit/b400e54))
|
|
||||||
- Fix typo in README ([5590c9d](https://github.com/wxt-dev/wxt/commit/5590c9d))
|
|
||||||
|
|
||||||
### 🏡 Chore
|
|
||||||
|
|
||||||
- Refactor cli files into their own directory ([e6c0d84](https://github.com/wxt-dev/wxt/commit/e6c0d84))
|
|
||||||
- Simplify `BuildOutput` type ([1f6c4a0](https://github.com/wxt-dev/wxt/commit/1f6c4a0))
|
|
||||||
- Move `.exvite` directory into `srcDir` instead of `root` ([53fb805](https://github.com/wxt-dev/wxt/commit/53fb805))
|
|
||||||
- Refactor CLI commands ([b8952b6](https://github.com/wxt-dev/wxt/commit/b8952b6))
|
|
||||||
- Improve build summary sorting ([ec57e8c](https://github.com/wxt-dev/wxt/commit/ec57e8c))
|
|
||||||
- Remove comments ([e3e9c0d](https://github.com/wxt-dev/wxt/commit/e3e9c0d))
|
|
||||||
- Refactor internal config creation ([7c634f4](https://github.com/wxt-dev/wxt/commit/7c634f4))
|
|
||||||
- Check virtual entrypoints feature in README ([70208f4](https://github.com/wxt-dev/wxt/commit/70208f4))
|
|
||||||
- Add E2E tests and convert to vitest workspace ([5813302](https://github.com/wxt-dev/wxt/commit/5813302))
|
|
||||||
- Rename package to wxt ([51a1072](https://github.com/wxt-dev/wxt/commit/51a1072))
|
|
||||||
- Fix header log's timestamp ([8ca5657](https://github.com/wxt-dev/wxt/commit/8ca5657))
|
|
||||||
- Fix demo global usage ([1ecfedd](https://github.com/wxt-dev/wxt/commit/1ecfedd))
|
|
||||||
- Refactor folder structure ([9ab3953](https://github.com/wxt-dev/wxt/commit/9ab3953))
|
|
||||||
- Fix release workflow ([2e94f2a](https://github.com/wxt-dev/wxt/commit/2e94f2a))
|
|
||||||
|
|
||||||
### 🤖 CI
|
|
||||||
|
|
||||||
- Create validation workflow ([#12](https://github.com/wxt-dev/wxt/pull/12))
|
|
||||||
- Create release workflow ([#13](https://github.com/wxt-dev/wxt/pull/13))
|
|
||||||
@@ -0,0 +1,128 @@
|
|||||||
|
# Contributor Covenant Code of Conduct
|
||||||
|
|
||||||
|
## Our Pledge
|
||||||
|
|
||||||
|
We as members, contributors, and leaders pledge to make participation in our
|
||||||
|
community a harassment-free experience for everyone, regardless of age, body
|
||||||
|
size, visible or invisible disability, ethnicity, sex characteristics, gender
|
||||||
|
identity and expression, level of experience, education, socio-economic status,
|
||||||
|
nationality, personal appearance, race, religion, or sexual identity
|
||||||
|
and orientation.
|
||||||
|
|
||||||
|
We pledge to act and interact in ways that contribute to an open, welcoming,
|
||||||
|
diverse, inclusive, and healthy community.
|
||||||
|
|
||||||
|
## Our Standards
|
||||||
|
|
||||||
|
Examples of behavior that contributes to a positive environment for our
|
||||||
|
community include:
|
||||||
|
|
||||||
|
- Demonstrating empathy and kindness toward other people
|
||||||
|
- Being respectful of differing opinions, viewpoints, and experiences
|
||||||
|
- Giving and gracefully accepting constructive feedback
|
||||||
|
- Accepting responsibility and apologizing to those affected by our mistakes,
|
||||||
|
and learning from the experience
|
||||||
|
- Focusing on what is best not just for us as individuals, but for the
|
||||||
|
overall community
|
||||||
|
|
||||||
|
Examples of unacceptable behavior include:
|
||||||
|
|
||||||
|
- The use of sexualized language or imagery, and sexual attention or
|
||||||
|
advances of any kind
|
||||||
|
- Trolling, insulting or derogatory comments, and personal or political attacks
|
||||||
|
- Public or private harassment
|
||||||
|
- Publishing others' private information, such as a physical or email
|
||||||
|
address, without their explicit permission
|
||||||
|
- Other conduct which could reasonably be considered inappropriate in a
|
||||||
|
professional setting
|
||||||
|
|
||||||
|
## Enforcement Responsibilities
|
||||||
|
|
||||||
|
Community leaders are responsible for clarifying and enforcing our standards of
|
||||||
|
acceptable behavior and will take appropriate and fair corrective action in
|
||||||
|
response to any behavior that they deem inappropriate, threatening, offensive,
|
||||||
|
or harmful.
|
||||||
|
|
||||||
|
Community leaders have the right and responsibility to remove, edit, or reject
|
||||||
|
comments, commits, code, wiki edits, issues, and other contributions that are
|
||||||
|
not aligned to this Code of Conduct, and will communicate reasons for moderation
|
||||||
|
decisions when appropriate.
|
||||||
|
|
||||||
|
## Scope
|
||||||
|
|
||||||
|
This Code of Conduct applies within all community spaces, and also applies when
|
||||||
|
an individual is officially representing the community in public spaces.
|
||||||
|
Examples of representing our community include using an official e-mail address,
|
||||||
|
posting via an official social media account, or acting as an appointed
|
||||||
|
representative at an online or offline event.
|
||||||
|
|
||||||
|
## Enforcement
|
||||||
|
|
||||||
|
Instances of abusive, harassing, or otherwise unacceptable behavior may be
|
||||||
|
reported to the community leaders responsible for enforcement at
|
||||||
|
<aaronklinker1@gmail.com>.
|
||||||
|
All complaints will be reviewed and investigated promptly and fairly.
|
||||||
|
|
||||||
|
All community leaders are obligated to respect the privacy and security of the
|
||||||
|
reporter of any incident.
|
||||||
|
|
||||||
|
## Enforcement Guidelines
|
||||||
|
|
||||||
|
Community leaders will follow these Community Impact Guidelines in determining
|
||||||
|
the consequences for any action they deem in violation of this Code of Conduct:
|
||||||
|
|
||||||
|
### 1. Correction
|
||||||
|
|
||||||
|
**Community Impact**: Use of inappropriate language or other behavior deemed
|
||||||
|
unprofessional or unwelcome in the community.
|
||||||
|
|
||||||
|
**Consequence**: A private, written warning from community leaders, providing
|
||||||
|
clarity around the nature of the violation and an explanation of why the
|
||||||
|
behavior was inappropriate. A public apology may be requested.
|
||||||
|
|
||||||
|
### 2. Warning
|
||||||
|
|
||||||
|
**Community Impact**: A violation through a single incident or series
|
||||||
|
of actions.
|
||||||
|
|
||||||
|
**Consequence**: A warning with consequences for continued behavior. No
|
||||||
|
interaction with the people involved, including unsolicited interaction with
|
||||||
|
those enforcing the Code of Conduct, for a specified period of time. This
|
||||||
|
includes avoiding interactions in community spaces as well as external channels
|
||||||
|
like social media. Violating these terms may lead to a temporary or
|
||||||
|
permanent ban.
|
||||||
|
|
||||||
|
### 3. Temporary Ban
|
||||||
|
|
||||||
|
**Community Impact**: A serious violation of community standards, including
|
||||||
|
sustained inappropriate behavior.
|
||||||
|
|
||||||
|
**Consequence**: A temporary ban from any sort of interaction or public
|
||||||
|
communication with the community for a specified period of time. No public or
|
||||||
|
private interaction with the people involved, including unsolicited interaction
|
||||||
|
with those enforcing the Code of Conduct, is allowed during this period.
|
||||||
|
Violating these terms may lead to a permanent ban.
|
||||||
|
|
||||||
|
### 4. Permanent Ban
|
||||||
|
|
||||||
|
**Community Impact**: Demonstrating a pattern of violation of community
|
||||||
|
standards, including sustained inappropriate behavior, harassment of an
|
||||||
|
individual, or aggression toward or disparagement of classes of individuals.
|
||||||
|
|
||||||
|
**Consequence**: A permanent ban from any sort of public interaction within
|
||||||
|
the community.
|
||||||
|
|
||||||
|
## Attribution
|
||||||
|
|
||||||
|
This Code of Conduct is adapted from the [Contributor Covenant][homepage],
|
||||||
|
version 2.0, available at
|
||||||
|
<https://www.contributor-covenant.org/version/2/0/code_of_conduct.html>.
|
||||||
|
|
||||||
|
Community Impact Guidelines were inspired by [Mozilla's code of conduct
|
||||||
|
enforcement ladder](https://github.com/mozilla/diversity).
|
||||||
|
|
||||||
|
[homepage]: https://www.contributor-covenant.org
|
||||||
|
|
||||||
|
For answers to common questions about this code of conduct, see the FAQ at
|
||||||
|
<https://www.contributor-covenant.org/faq>. Translations are available at
|
||||||
|
<https://www.contributor-covenant.org/translations>.
|
||||||
+125
-7
@@ -1,6 +1,6 @@
|
|||||||
# Contributing
|
# Contributing
|
||||||
|
|
||||||
Everyone is welcome to contribute to WXT!
|
Everyone is welcome to contribute to **WXT**!
|
||||||
|
|
||||||
If you are changing the docs or fixing a bug, feel free to fork and open a PR.
|
If you are changing the docs or fixing a bug, feel free to fork and open a PR.
|
||||||
|
|
||||||
@@ -8,9 +8,17 @@ If you want to add a new feature, please create an issue or discussion first so
|
|||||||
|
|
||||||
## Conventional Commits
|
## Conventional Commits
|
||||||
|
|
||||||
This project uses [Conventional Commits](https://www.conventionalcommits.org/en) to automate versioning. If you're a new contributor, don't worry about this. When you open a PR, a maintainer will change the PR's title so it's in the style of conventional commits, but that's all.
|
This project uses [Conventional Commit format](https://www.conventionalcommits.org/en/v1.0.0/) to automatically generate a changelog and better understand the changes in the project
|
||||||
|
|
||||||
Maintainers, commits to the `main` branch (either directly or via PRs) must be valid conventional commits.
|
Here are some examples of conventional commit messages:
|
||||||
|
|
||||||
|
- `feat: add new functionality`
|
||||||
|
- `fix: correct typos in code`
|
||||||
|
- `ci: add GitHub Actions for automated testing`
|
||||||
|
|
||||||
|
## Conventional PR Titles
|
||||||
|
|
||||||
|
The title of your pull request should follow the [conventional commit format](#conventional-commits). When a pull request is merged to the main branch, all changes are going to be squashed into a single commit. The message of this commit will be the title of the pull request. And for every release, the commit messages are used to generate the changelog.
|
||||||
|
|
||||||
## Setup
|
## Setup
|
||||||
|
|
||||||
@@ -32,18 +40,19 @@ Here are some helpful commands:
|
|||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Build WXT package
|
# Build WXT package
|
||||||
|
cd packages/wxt
|
||||||
pnpm build
|
pnpm build
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Build WXT package, then build demo extension
|
# Build WXT package, then build demo extension
|
||||||
cd demo
|
cd packages/wxt-demo
|
||||||
pnpm build
|
pnpm build
|
||||||
```
|
```
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
# Build WXT package, then start the demo extension in dev mode
|
# Build WXT package, then start the demo extension in dev mode
|
||||||
cd demo
|
cd packages/wxt-demo
|
||||||
pnpm dev
|
pnpm dev
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -57,9 +66,32 @@ pnpm test
|
|||||||
pnpm docs:dev
|
pnpm docs:dev
|
||||||
```
|
```
|
||||||
|
|
||||||
|
## Profiling
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Build the latest version
|
||||||
|
pnpm --filter wxt build
|
||||||
|
|
||||||
|
# CD to the demo directory
|
||||||
|
cd packages/wxt-demo
|
||||||
|
|
||||||
|
# 1. Generate a flamechart with 0x
|
||||||
|
pnpm dlx 0x node_modules/wxt/bin/wxt.mjs build
|
||||||
|
# 2. Inspect the process with chrome @ chrome://inspect
|
||||||
|
pnpm node --inspect node_modules/wxt/bin/wxt.mjs build
|
||||||
|
```
|
||||||
|
|
||||||
|
## Updating Docs
|
||||||
|
|
||||||
|
Documentation is written with VitePress, and is located in the `docs/` directory.
|
||||||
|
|
||||||
|
The API reference is generated from JSDoc comments in the source code. If there's a typo or change you want to make in there, you'll need to update the source code instead of a file in the `docs/` directory.
|
||||||
|
|
||||||
## Testing
|
## Testing
|
||||||
|
|
||||||
WXT has unit and E2E tests. When making a change or adding a feature, make sure to update the tests or add new ones.
|
WXT has unit and E2E tests. When making a change or adding a feature, make sure to update the tests or add new ones, if they exist.
|
||||||
|
|
||||||
|
> If they don't exist, feel free to create them, but that's a lot for a one-time contributor. A maintainer might add them to your PR though.
|
||||||
|
|
||||||
To run tests for a specific file, add the filename at the end of the test command:
|
To run tests for a specific file, add the filename at the end of the test command:
|
||||||
|
|
||||||
@@ -67,6 +99,92 @@ To run tests for a specific file, add the filename at the end of the test comman
|
|||||||
pnpm test manifest-contents
|
pnpm test manifest-contents
|
||||||
```
|
```
|
||||||
|
|
||||||
Unit and E2E tests are ran together via [Vitest workspaces](https://vitest.dev/guide/#workspaces-support).
|
All test (unit and E2E) for all packages are ran together via [Vitest workspaces](https://vitest.dev/guide/#workspaces-support).
|
||||||
|
|
||||||
If you want to manually test a change, you can modify the demo project for your test, but please don't leave those changes committed once you open a PR.
|
If you want to manually test a change, you can modify the demo project for your test, but please don't leave those changes committed once you open a PR.
|
||||||
|
|
||||||
|
## Templates
|
||||||
|
|
||||||
|
Each directory inside `templates/` is it's own standalone project. Simply `cd` into the directory you're updating, install dependencies with `npm` (NOT `pnpm`), and run the relevant commands
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cd templates/vue
|
||||||
|
npm i
|
||||||
|
npm run dev
|
||||||
|
npm run build
|
||||||
|
```
|
||||||
|
|
||||||
|
Note that templates are hardcoded to a specific version of `wxt` from NPM, they do not use the local version. PR checks will test your PR's changes against the templates, but if you want to manually do it, update the package.json dependency:
|
||||||
|
|
||||||
|
```diff
|
||||||
|
"devDependencies": {
|
||||||
|
"typescript": "^5.3.2",
|
||||||
|
"vite-plugin-solid": "^2.7.0",
|
||||||
|
- "wxt": "^0.8.0"
|
||||||
|
+ "wxt": "../.."
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Then run `npm i` again.
|
||||||
|
|
||||||
|
### Adding Templates
|
||||||
|
|
||||||
|
To add a template, copy the vanilla template and give it a new name.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
cp -r templates/vanilla templates/<new-template-name>
|
||||||
|
```
|
||||||
|
|
||||||
|
That's it. Once your template is merged, it will be available inside `wxt init` immediately. You don't need to release a new version of WXT to release a new template.
|
||||||
|
|
||||||
|
## Releasing Updates
|
||||||
|
|
||||||
|
Releases are done with GitHub actions:
|
||||||
|
|
||||||
|
- Use the [Release workflow](https://github.com/wxt-dev/wxt/actions/workflows/release.yml) to release a single package in the monorepo. This automatically detects the version change with conventional commits, builds and uploads the package to NPM, and creates a GitHub release.
|
||||||
|
- Use the [Sync Releases workflow](https://github.com/wxt-dev/wxt/actions/workflows/sync-releases.yml) to sync the GitHub releases with changes to the changelog. To change a release, update the `CHANGELOG.md` file and run the workflow. It will sync the releases of a single package in the monorepo.
|
||||||
|
|
||||||
|
## Upgrading Dependencies
|
||||||
|
|
||||||
|
WXT has custom rules around what dependencies can be upgraded. Use the `scripts/upgrade-deps.ts` script to upgrade dependencies and follow these rules.
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm tsx scripts/upgrade-deps.ts
|
||||||
|
```
|
||||||
|
|
||||||
|
To see all the options, run:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
pnpm tsx scripts/upgrade-deps.ts --help
|
||||||
|
```
|
||||||
|
|
||||||
|
## Install Unreleased Versions
|
||||||
|
|
||||||
|
This repo uses <https://pkg.pr.new> to publish versions of all it's packages for almost every commit. You can install them via:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
npm i https://pkg.pr.new/[package-name]@[ref]
|
||||||
|
```
|
||||||
|
|
||||||
|
Or use one of the shorthands:
|
||||||
|
|
||||||
|
```sh
|
||||||
|
# Install the latest build of `wxt` from a PR:
|
||||||
|
npm i https://pkg.pr.new/wxt@1283
|
||||||
|
|
||||||
|
# Install the latest build of `@wxt-dev/module-react` on the `main` branch
|
||||||
|
npm i https://pkg.pr.new/@wxt-dev/module-react@main
|
||||||
|
|
||||||
|
# Install `@wxt-dev/storage` from a specific commit:
|
||||||
|
npm i https://pkg.pr.new/@wxt-dev/module-react@426f907
|
||||||
|
```
|
||||||
|
|
||||||
|
## Blog Posts
|
||||||
|
|
||||||
|
Anyone is welcome to submit a blog post on <https://wxt.dev/blog>!
|
||||||
|
|
||||||
|
> [!NOTE]
|
||||||
|
> Before starting on a blog post, please message Aaron on Discord or start a discussion on GitHub to get permission to write about a topic, but most topics are welcome: Major version updates, tutorials, etc.
|
||||||
|
|
||||||
|
- **English only**: Blog posts should be written in English. Unfortunately, our maintainers don't have the bandwidth right now to translate our docs, let alone blog posts. Sorry 😓
|
||||||
|
- **AI**: Please only use AI to translate or proof-read your blog post. Don't generate the whole thing... We don't want to publish that.
|
||||||
|
|||||||
@@ -1,48 +1,41 @@
|
|||||||
<h1 align="center">
|
<div align="center">
|
||||||
<img style="vertical-align:middle" width="44" src="./docs/public/hero-logo.svg" alt="WXT Logo">
|
|
||||||
<span>WXT</span>
|
|
||||||
</h1>
|
|
||||||
|
|
||||||
<p align="center">
|
# <img align="top" width="44" src="https://raw.githubusercontent.com/wxt-dev/wxt/HEAD/docs/public/hero-logo.svg" alt="WXT Logo"> WXT
|
||||||
<a href="https://www.npmjs.com/package/wxt" target="_blank">
|
|
||||||
<img alt="npm" src="https://img.shields.io/npm/v/wxt?labelColor=black&color=%234fa048">
|
|
||||||
</a>
|
|
||||||
<span> </span>
|
|
||||||
<img alt="npm" src="https://img.shields.io/npm/dm/wxt?labelColor=black&color=%234fa048">
|
|
||||||
<span> </span>
|
|
||||||
<img alt="NPM" src="https://img.shields.io/npm/l/wxt?labelColor=black&color=%234fa048">
|
|
||||||
<span> </span>
|
|
||||||
<a href="https://codecov.io/github/wxt-dev/wxt" target="_blank">
|
|
||||||
<img alt="Codecov" src="https://img.shields.io/codecov/c/github/wxt-dev/wxt?labelColor=black&color=%234fa048">
|
|
||||||
</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
[](https://www.npmjs.com/package/wxt)
|
||||||
<span>Next-gen framework for developing web extensions.</span>
|
[](https://www.npmjs.com/package/wxt)
|
||||||
<br/>
|
[](https://github.com/wxt-dev/wxt/blob/main/LICENSE)
|
||||||
<span>⚡</span>
|
[](https://codecov.io/github/wxt-dev/wxt)
|
||||||
<br/>
|
|
||||||
<q><i>It's like Nuxt, but for Chrome Extensions</i></q>
|
|
||||||
</p>
|
|
||||||
|
|
||||||
<p align="center">
|
Next-gen framework for developing web extensions.<br/>⚡<br/><q><i>It's like Nuxt, but for Web Extensions</i></q>
|
||||||
<a href="https://wxt.dev" target="_blank">Get Started</a>
|
|
||||||
•
|
|
||||||
<a href="https://wxt.dev/guide/installation.html" target="_blank">Installation</a>
|
|
||||||
•
|
|
||||||
<a href="https://wxt.dev/entrypoints/background.html" target="_blank">Entrypoints</a>
|
|
||||||
•
|
|
||||||
<a href="https://wxt.dev/api/config.html" target="_blank">Configuration</a>
|
|
||||||
</p>
|
|
||||||
|
|
||||||

|
[Get Started](https://wxt.dev/guide/installation.html) •
|
||||||
|
[Configuration](https://wxt.dev/api/config.html) •
|
||||||
|
[Examples](https://wxt.dev/examples.html) •
|
||||||
|
[Changelog](https://github.com/wxt-dev/wxt/blob/main/packages/wxt/CHANGELOG.md) •
|
||||||
|
[Discord](https://discord.gg/ZFsZqGery9)
|
||||||
|
|
||||||
|
</div>
|
||||||
|
|
||||||
|

|
||||||
|
|
||||||
|
## Demo
|
||||||
|
|
||||||
|
<https://github.com/wxt-dev/wxt/assets/10101283/4d678939-1bdb-495c-9c36-3aa281d84c94>
|
||||||
|
|
||||||
## Quick Start
|
## Quick Start
|
||||||
|
|
||||||
Bootstrap a new project:
|
Bootstrap a new project:
|
||||||
|
|
||||||
```sh
|
```sh
|
||||||
pnpx wxt@latest init <project-name>
|
# npm
|
||||||
|
npx wxt@latest init
|
||||||
|
|
||||||
|
# pnpm
|
||||||
|
pnpm dlx wxt@latest init
|
||||||
|
|
||||||
|
# bun
|
||||||
|
bunx wxt@latest init
|
||||||
```
|
```
|
||||||
|
|
||||||
Or see the [installation guide](https://wxt.dev/guide/installation.html) to get started with WXT.
|
Or see the [installation guide](https://wxt.dev/guide/installation.html) to get started with WXT.
|
||||||
@@ -55,17 +48,22 @@ Or see the [installation guide](https://wxt.dev/guide/installation.html) to get
|
|||||||
- 📂 File based entrypoints
|
- 📂 File based entrypoints
|
||||||
- 🚔 TypeScript
|
- 🚔 TypeScript
|
||||||
- 🦾 Auto-imports
|
- 🦾 Auto-imports
|
||||||
- ⬇️ Download and bundle remote URL imports
|
- 🤖 Automated publishing
|
||||||
- 🎨 Frontend framework agnostic: works with Vue, React, Svelte, etc
|
- 🎨 Frontend framework agnostic: works with Vue, React, Svelte, etc
|
||||||
|
- 📦 [Module system](https://wxt.dev/guide/essentials/wxt-modules.html#overview) for reusing code between extensions
|
||||||
- 🖍️ Quickly bootstrap a new project
|
- 🖍️ Quickly bootstrap a new project
|
||||||
- 📏 Bundle analysis
|
- 📏 Bundle analysis
|
||||||
|
- ⬇️ Download and bundle remote URL imports
|
||||||
|
|
||||||
### Coming Soon
|
## Sponsors
|
||||||
|
|
||||||
- 🤖 Automated publishing
|
WXT is a [MIT-licensed](https://github.com/wxt-dev/wxt/blob/main/LICENSE) open source project with its ongoing development made possible entirely by the support of these awesome backers. If you'd like to join them, please consider [sponsoring WXT's development](https://github.com/sponsors/wxt-dev).
|
||||||
|
|
||||||
|
[](https://github.com/sponsors/wxt-dev)
|
||||||
|
|
||||||
## Contributors
|
## Contributors
|
||||||
|
|
||||||
<a href="https://github.com/wxt-dev/wxt/graphs/contributors">
|
Published under the [MIT](https://github.com/wxt-dev/wxt/blob/main/LICENSE) license.
|
||||||
<img src="https://contrib.rocks/image?repo=wxt-dev/wxt" />
|
Made by [@aklinker1](https://github.com/aklinker1) and [community](https://github.com/wxt-dev/wxt/graphs/contributors) 💛
|
||||||
</a>
|
|
||||||
|
[](https://github.com/wxt-dev/wxt/graphs/contributors)
|
||||||
|
|||||||
+15
@@ -0,0 +1,15 @@
|
|||||||
|
# Security Policy
|
||||||
|
|
||||||
|
While WXT is in prerelease, only the latest version will receive security updates. The latest version is:
|
||||||
|
|
||||||
|
<img alt="npm version" src="https://img.shields.io/npm/v/wxt?labelColor=black&color=%234fa048">
|
||||||
|
|
||||||
|
<!--
|
||||||
|
## Reporting a Vulnerability
|
||||||
|
|
||||||
|
Use this section to tell people how to report a vulnerability.
|
||||||
|
|
||||||
|
Tell them where to go, how often they can expect to get an update on a
|
||||||
|
reported vulnerability, what to expect if the vulnerability is accepted or
|
||||||
|
declined, etc.
|
||||||
|
-->
|
||||||
@@ -1,2 +0,0 @@
|
|||||||
#!/usr/bin/env node
|
|
||||||
require('../dist/cli.cjs');
|
|
||||||
@@ -1,30 +0,0 @@
|
|||||||
{
|
|
||||||
"name": "WXT Demo",
|
|
||||||
"version": "1.0.0",
|
|
||||||
"description": "Demo extension for WXT",
|
|
||||||
"type": "module",
|
|
||||||
"scripts": {
|
|
||||||
"dev": "pnpm -w build && wxt",
|
|
||||||
"build": "pnpm -w build && wxt build",
|
|
||||||
"build:all": "pnpm -w build && run-s -s build:all:*",
|
|
||||||
"build:all:chrome-mv3": "wxt build",
|
|
||||||
"build:all:chrome-mv2": "wxt build --mv2",
|
|
||||||
"build:all:firefox-mv3": "wxt build -b firefox --mv3",
|
|
||||||
"build:all:firefox-mv2": "wxt build -b firefox",
|
|
||||||
"zip": "pnpm -w build && wxt zip",
|
|
||||||
"compile": "pnpm -w build && tsc --noEmit",
|
|
||||||
"postinstall": "pnpm -w build && wxt prepare"
|
|
||||||
},
|
|
||||||
"dependencies": {
|
|
||||||
"webextension-polyfill": "^0.10.0",
|
|
||||||
"react": "^18.2.0",
|
|
||||||
"react-dom": "^18.2.0"
|
|
||||||
},
|
|
||||||
"devDependencies": {
|
|
||||||
"@types/react": "^18.2.14",
|
|
||||||
"@types/react-dom": "^18.2.6",
|
|
||||||
"@types/webextension-polyfill": "^0.10.0",
|
|
||||||
"sass": "^1.64.0",
|
|
||||||
"wxt": "workspace:*"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,4 +0,0 @@
|
|||||||
body {
|
|
||||||
margin: 0;
|
|
||||||
padding: 0;
|
|
||||||
}
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
export default defineBackground(() => {
|
|
||||||
console.log(browser.runtime.id);
|
|
||||||
logId();
|
|
||||||
console.log({
|
|
||||||
browser: __BROWSER__,
|
|
||||||
chrome: __IS_CHROME__,
|
|
||||||
firefox: __IS_FIREFOX__,
|
|
||||||
manifestVersion: __MANIFEST_VERSION__,
|
|
||||||
});
|
|
||||||
|
|
||||||
// @ts-expect-error: should only accept entrypoints or public assets
|
|
||||||
browser.runtime.getURL('/');
|
|
||||||
browser.runtime.getURL('/background.js');
|
|
||||||
browser.runtime.getURL('/icon/128.png');
|
|
||||||
|
|
||||||
// @ts-expect-error: should only accept known message names
|
|
||||||
browser.i18n.getMessage('test');
|
|
||||||
browser.i18n.getMessage('prompt_for_name');
|
|
||||||
browser.i18n.getMessage('hello', 'Aaron');
|
|
||||||
browser.i18n.getMessage('bye', ['Aaron']);
|
|
||||||
browser.i18n.getMessage('@@extension_id');
|
|
||||||
|
|
||||||
console.log('WXT MODE:', import.meta.env.MODE);
|
|
||||||
});
|
|
||||||
@@ -1,24 +0,0 @@
|
|||||||
import '../../common/style.css';
|
|
||||||
import './style.css';
|
|
||||||
|
|
||||||
export default defineContentScript({
|
|
||||||
matches: ['https://*.duckduckgo.com/*'],
|
|
||||||
cssInjectionMode: 'ui',
|
|
||||||
|
|
||||||
async main(ctx) {
|
|
||||||
const ui = await createContentScriptUi(ctx, {
|
|
||||||
name: 'demo-ui',
|
|
||||||
type: 'inline',
|
|
||||||
append: 'before',
|
|
||||||
anchor: 'form[role=search]',
|
|
||||||
mount: (container) => {
|
|
||||||
const app = document.createElement('div');
|
|
||||||
app.textContent = 'Custom content script UI';
|
|
||||||
container.append(app);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
ui.mount();
|
|
||||||
|
|
||||||
setTimeout(ui.remove, 5000);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
@@ -1,29 +0,0 @@
|
|||||||
{
|
|
||||||
"prompt_for_name": {
|
|
||||||
"message": "What's your name?",
|
|
||||||
"description": "Ask for the user's name"
|
|
||||||
},
|
|
||||||
"hello": {
|
|
||||||
"message": "Hello, $USER$",
|
|
||||||
"description": "Greet the user",
|
|
||||||
"placeholders": {
|
|
||||||
"user": {
|
|
||||||
"content": "$1",
|
|
||||||
"example": "Cira"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
},
|
|
||||||
"bye": {
|
|
||||||
"message": "Goodbye, $USER$. Come back to $OUR_SITE$ soon!",
|
|
||||||
"description": "Say goodbye to the user",
|
|
||||||
"placeholders": {
|
|
||||||
"our_site": {
|
|
||||||
"content": "Example.com"
|
|
||||||
},
|
|
||||||
"user": {
|
|
||||||
"content": "$1",
|
|
||||||
"example": "Cira"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
Binary file not shown.
|
Before Width: | Height: | Size: 504 B |
Binary file not shown.
|
Before Width: | Height: | Size: 936 B |
Binary file not shown.
|
Before Width: | Height: | Size: 1.2 KiB |
Binary file not shown.
|
Before Width: | Height: | Size: 2.2 KiB |
@@ -1,7 +0,0 @@
|
|||||||
{
|
|
||||||
"extends": ["../tsconfig.base.json", "./.wxt/tsconfig.json"],
|
|
||||||
"compilerOptions": {
|
|
||||||
"allowImportingTsExtensions": true,
|
|
||||||
"jsx": "react-jsx"
|
|
||||||
}
|
|
||||||
}
|
|
||||||
@@ -1,8 +0,0 @@
|
|||||||
import { defineConfig } from 'wxt';
|
|
||||||
|
|
||||||
export default defineConfig({
|
|
||||||
srcDir: 'src',
|
|
||||||
manifest: {
|
|
||||||
default_locale: 'en',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
@@ -0,0 +1,2 @@
|
|||||||
|
FROM lipanski/docker-static-website:latest
|
||||||
|
COPY dist .
|
||||||
@@ -0,0 +1,70 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import { computed } from 'vue';
|
||||||
|
// @ts-expect-error: Vitepress data-loader magic, this import is correct
|
||||||
|
import { data } from '../loaders/blog.data';
|
||||||
|
import BlogPostPreview from './BlogPostPreview.vue';
|
||||||
|
|
||||||
|
const posts = computed(() =>
|
||||||
|
data
|
||||||
|
.map((post) => ({
|
||||||
|
...post,
|
||||||
|
...post.frontmatter,
|
||||||
|
date: new Date(post.frontmatter.date),
|
||||||
|
}))
|
||||||
|
.sort((a, b) => b.date.getTime() - a.date.getTime()),
|
||||||
|
);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="container">
|
||||||
|
<div>
|
||||||
|
<div class="vp-doc">
|
||||||
|
<h1>Blog</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<ul>
|
||||||
|
<BlogPostPreview v-for="post of posts" :key="post.url" :post />
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.container {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
align-items: center;
|
||||||
|
}
|
||||||
|
.container > div {
|
||||||
|
padding: 32px;
|
||||||
|
max-width: 900px;
|
||||||
|
width: 100%;
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
h1 {
|
||||||
|
padding-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
list-style: none;
|
||||||
|
}
|
||||||
|
ul,
|
||||||
|
li {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
ul li {
|
||||||
|
padding-top: 16px;
|
||||||
|
margin-top: 16px;
|
||||||
|
border-top: 1px solid var(--vp-c-default);
|
||||||
|
}
|
||||||
|
ul li:last-child {
|
||||||
|
padding-bottom: 16px;
|
||||||
|
margin-bottom: 16px;
|
||||||
|
border-bottom: 1px solid var(--vp-c-default);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import useBlogDate from '../composables/useBlogDate';
|
||||||
|
import { useData } from 'vitepress';
|
||||||
|
|
||||||
|
const { frontmatter } = useData();
|
||||||
|
const date = useBlogDate(() => frontmatter.value.date);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="vp-doc">
|
||||||
|
<main class="container-content">
|
||||||
|
<h1 v-html="$frontmatter.title" />
|
||||||
|
<p class="meta-row">
|
||||||
|
<a
|
||||||
|
class="author"
|
||||||
|
v-for="author of $frontmatter.authors"
|
||||||
|
:key="author.github"
|
||||||
|
:href="`https://github.com/${author.github}`"
|
||||||
|
>
|
||||||
|
<img :src="`https://github.com/${author.github}.png?size=96`" />
|
||||||
|
<span>{{ author.name }}</span>
|
||||||
|
</a>
|
||||||
|
<span>•</span>
|
||||||
|
<span>{{ date }}</span>
|
||||||
|
</p>
|
||||||
|
<Content />
|
||||||
|
</main>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
vp-doc {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
main {
|
||||||
|
max-width: 1080px;
|
||||||
|
padding: 32px;
|
||||||
|
margin: auto;
|
||||||
|
}
|
||||||
|
@media (min-width: 768px) {
|
||||||
|
main {
|
||||||
|
padding: 64px;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.meta-row {
|
||||||
|
display: flex;
|
||||||
|
color: var(--vp-c-text-2);
|
||||||
|
gap: 16px;
|
||||||
|
overflow: hidden;
|
||||||
|
padding-bottom: 32px;
|
||||||
|
}
|
||||||
|
.meta-row > * {
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
.author {
|
||||||
|
display: flex;
|
||||||
|
gap: 8px;
|
||||||
|
align-items: center;
|
||||||
|
color: var(--vp-c-text-2);
|
||||||
|
font-weight: normal;
|
||||||
|
text-decoration: none;
|
||||||
|
}
|
||||||
|
.author img {
|
||||||
|
width: 24px;
|
||||||
|
height: 24px;
|
||||||
|
border-radius: 100%;
|
||||||
|
}
|
||||||
|
.author span {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
.author:hover {
|
||||||
|
text-decoration: underline;
|
||||||
|
color: var(--vp-c-text-2);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import useBlogDate from '../composables/useBlogDate';
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
post: {
|
||||||
|
title: string;
|
||||||
|
description?: string;
|
||||||
|
date: Date;
|
||||||
|
url: string;
|
||||||
|
authors: Array<{ name: string; github: string }>;
|
||||||
|
};
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const date = useBlogDate(() => props.post.date);
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<li class="blog-list-item">
|
||||||
|
<a :href="post.url">
|
||||||
|
<div class="vp-doc">
|
||||||
|
<h3 class="title" v-html="post.title" />
|
||||||
|
<p class="description" v-html="post.description" />
|
||||||
|
<p class="meta">
|
||||||
|
{{ post.authors.map((author) => author.name).join(', ') }}
|
||||||
|
•
|
||||||
|
{{ date }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
li {
|
||||||
|
padding: 0;
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
p {
|
||||||
|
margin: 0;
|
||||||
|
}
|
||||||
|
h3 {
|
||||||
|
margin: 0;
|
||||||
|
padding: 0;
|
||||||
|
border: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
li > a > div {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
margin: 0 -16px;
|
||||||
|
padding: 16px;
|
||||||
|
border-radius: 16px;
|
||||||
|
}
|
||||||
|
li > a > div:hover {
|
||||||
|
background: var(--vp-c-default);
|
||||||
|
}
|
||||||
|
li .title {
|
||||||
|
color: var(--vp-c-text);
|
||||||
|
margin-bottom: 12px;
|
||||||
|
}
|
||||||
|
li .description {
|
||||||
|
font-size: 16px;
|
||||||
|
color: var(--vp-c-text-2);
|
||||||
|
margin-bottom: 8px;
|
||||||
|
}
|
||||||
|
li .meta {
|
||||||
|
font-weight: 400;
|
||||||
|
font-size: 12px;
|
||||||
|
color: var(--vp-c-text-2);
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -8,14 +8,14 @@ const props = defineProps<{
|
|||||||
<table class="no-vertical-dividers">
|
<table class="no-vertical-dividers">
|
||||||
<thead>
|
<thead>
|
||||||
<tr>
|
<tr>
|
||||||
<th>Input Pattern</th>
|
<th style="width: 100%">Filename</th>
|
||||||
<th></th>
|
<th></th>
|
||||||
<th>Output Path</th>
|
<th>Output Path</th>
|
||||||
</tr>
|
</tr>
|
||||||
</thead>
|
</thead>
|
||||||
<tbody>
|
<tbody>
|
||||||
<tr v-for="pattern of patterns">
|
<tr v-for="pattern of patterns">
|
||||||
<td style="white-space: nowrap">
|
<td style="white-space: nowrap; padding-right: 8px">
|
||||||
<code>entrypoints/{{ pattern[0] }}</code>
|
<code>entrypoints/{{ pattern[0] }}</code>
|
||||||
</td>
|
</td>
|
||||||
<td style="padding: 6px; opacity: 50%">
|
<td style="padding: 6px; opacity: 50%">
|
||||||
@@ -31,7 +31,7 @@ const props = defineProps<{
|
|||||||
/>
|
/>
|
||||||
</svg>
|
</svg>
|
||||||
</td>
|
</td>
|
||||||
<td style="white-space: nowrap">
|
<td style="white-space: nowrap; padding-left: 8px">
|
||||||
<code>/{{ pattern[1] }}</code>
|
<code>/{{ pattern[1] }}</code>
|
||||||
</td>
|
</td>
|
||||||
</tr>
|
</tr>
|
||||||
|
|||||||
@@ -0,0 +1,226 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import { ref, onMounted, computed, toRaw, Ref } from 'vue';
|
||||||
|
import ExampleSearchFilterByItem from './ExampleSearchFilterByItem.vue';
|
||||||
|
import ExampleSearchResult from './ExampleSearchResult.vue';
|
||||||
|
import { ExamplesMetadata, KeySelectedObject } from '../utils/types';
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
tag?: string;
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const exampleMetadata = ref<ExamplesMetadata>();
|
||||||
|
onMounted(async () => {
|
||||||
|
const res = await fetch(
|
||||||
|
'https://raw.githubusercontent.com/wxt-dev/examples/main/metadata.json',
|
||||||
|
);
|
||||||
|
exampleMetadata.value = await res.json();
|
||||||
|
});
|
||||||
|
|
||||||
|
const searchText = ref('');
|
||||||
|
const selectedApis = ref<KeySelectedObject>({});
|
||||||
|
const selectedPermissions = ref<KeySelectedObject>({});
|
||||||
|
const selectedPackages = ref<KeySelectedObject>({});
|
||||||
|
|
||||||
|
function useRequiredItems(selectedItems: Ref<KeySelectedObject>) {
|
||||||
|
return computed(() =>
|
||||||
|
Array.from(
|
||||||
|
Object.entries(toRaw(selectedItems.value)).reduce(
|
||||||
|
(set, [pkg, checked]) => {
|
||||||
|
if (checked) set.add(pkg);
|
||||||
|
return set;
|
||||||
|
},
|
||||||
|
new Set<string>(),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
const requiredApis = useRequiredItems(selectedApis);
|
||||||
|
const requiredPermissions = useRequiredItems(selectedPermissions);
|
||||||
|
const requiredPackages = useRequiredItems(selectedPackages);
|
||||||
|
|
||||||
|
function doesExampleMatchSelected(
|
||||||
|
exampleItems: string[],
|
||||||
|
requiredItems: Ref<string[]>,
|
||||||
|
) {
|
||||||
|
const exampleItemsSet = new Set(exampleItems);
|
||||||
|
return !requiredItems.value.find((item) => !exampleItemsSet.has(item));
|
||||||
|
}
|
||||||
|
|
||||||
|
const filteredExamples = computed(() => {
|
||||||
|
const text = searchText.value.toLowerCase();
|
||||||
|
return exampleMetadata.value.examples.filter((example) => {
|
||||||
|
const matchesText = example.searchText.toLowerCase().includes(text);
|
||||||
|
const matchesApis = doesExampleMatchSelected(example.apis, requiredApis);
|
||||||
|
const matchesPermissions = doesExampleMatchSelected(
|
||||||
|
example.permissions,
|
||||||
|
requiredPermissions,
|
||||||
|
);
|
||||||
|
const matchesPackages = doesExampleMatchSelected(
|
||||||
|
example.packages,
|
||||||
|
requiredPackages,
|
||||||
|
);
|
||||||
|
return matchesText && matchesApis && matchesPermissions && matchesPackages;
|
||||||
|
});
|
||||||
|
});
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="example-layout">
|
||||||
|
<div class="search">
|
||||||
|
<input v-model="searchText" placeholder="Search for an example..." />
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="filters">
|
||||||
|
<ExampleSearchFilterByItem
|
||||||
|
label="APIs"
|
||||||
|
:items="exampleMetadata?.allApis"
|
||||||
|
v-model="selectedApis"
|
||||||
|
/>
|
||||||
|
<ExampleSearchFilterByItem
|
||||||
|
label="Permissions"
|
||||||
|
:items="exampleMetadata?.allPermissions"
|
||||||
|
v-model="selectedPermissions"
|
||||||
|
/>
|
||||||
|
<ExampleSearchFilterByItem
|
||||||
|
label="Packages"
|
||||||
|
:items="exampleMetadata?.allPackages"
|
||||||
|
v-model="selectedPackages"
|
||||||
|
/>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<div class="results">
|
||||||
|
<p v-if="exampleMetadata == null">Loading examples...</p>
|
||||||
|
<template v-else>
|
||||||
|
<ul class="search-results">
|
||||||
|
<ExampleSearchResult
|
||||||
|
v-for="example of filteredExamples"
|
||||||
|
:key="example.name"
|
||||||
|
:example
|
||||||
|
/>
|
||||||
|
</ul>
|
||||||
|
<p v-if="filteredExamples.length === 0">No matching examples</p>
|
||||||
|
</template>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.example-layout {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: 1fr;
|
||||||
|
grid-template-rows: 1fr;
|
||||||
|
grid-template-areas:
|
||||||
|
'search'
|
||||||
|
'results';
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
@media only screen and (min-width: 720px) {
|
||||||
|
.example-layout {
|
||||||
|
grid-template-columns: 256px 1fr;
|
||||||
|
grid-template-rows: auto 1fr;
|
||||||
|
grid-template-areas:
|
||||||
|
'filters search'
|
||||||
|
'filters results';
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.search {
|
||||||
|
grid-area: search;
|
||||||
|
background: var(--vp-c-bg-soft);
|
||||||
|
padding: 20px;
|
||||||
|
width: 100%;
|
||||||
|
display: flex;
|
||||||
|
border-radius: 16px;
|
||||||
|
}
|
||||||
|
.filters {
|
||||||
|
display: none;
|
||||||
|
grid-area: filters;
|
||||||
|
}
|
||||||
|
@media only screen and (min-width: 720px) {
|
||||||
|
.filters {
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 2px;
|
||||||
|
border-radius: 16px;
|
||||||
|
overflow: hidden;
|
||||||
|
align-self: flex-start;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
.results {
|
||||||
|
grid-area: results;
|
||||||
|
}
|
||||||
|
|
||||||
|
.box {
|
||||||
|
border-radius: 16px;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search input {
|
||||||
|
min-width: 0;
|
||||||
|
flex: 1;
|
||||||
|
font-size: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-col {
|
||||||
|
flex: 1;
|
||||||
|
padding: 16px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
overflow-y: auto;
|
||||||
|
max-height: 200px;
|
||||||
|
font-size: 14px;
|
||||||
|
gap: 4px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.filter-btn {
|
||||||
|
color: var(--vp-c-brand-1);
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-col .header {
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
opacity: 50%;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-col p {
|
||||||
|
display: flex;
|
||||||
|
gap: 4px;
|
||||||
|
align-items: flex-start;
|
||||||
|
text-wrap: wrap;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
line-height: 140%;
|
||||||
|
}
|
||||||
|
|
||||||
|
span {
|
||||||
|
padding-top: 1px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-col input[type='checkbox'] {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
|
||||||
|
.checkbox-col-container {
|
||||||
|
display: flex;
|
||||||
|
}
|
||||||
|
|
||||||
|
.search-results {
|
||||||
|
display: grid;
|
||||||
|
grid-template-columns: repeat(1, 1fr);
|
||||||
|
gap: 16px;
|
||||||
|
}
|
||||||
|
@media only screen and (min-width: 800px) {
|
||||||
|
.search-results {
|
||||||
|
grid-template-columns: repeat(2, 1fr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
@media only screen and (min-width: 1024px) {
|
||||||
|
.search-results {
|
||||||
|
grid-template-columns: repeat(3, 1fr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
a {
|
||||||
|
background-color: red;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,100 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import { computed, toRaw } from 'vue';
|
||||||
|
import { KeySelectedObject } from '../utils/types';
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
label: string;
|
||||||
|
items?: string[];
|
||||||
|
}>();
|
||||||
|
|
||||||
|
const selectedItems = defineModel<KeySelectedObject>({
|
||||||
|
required: true,
|
||||||
|
});
|
||||||
|
|
||||||
|
const count = computed(() => {
|
||||||
|
return Object.values(toRaw(selectedItems.value)).filter(Boolean).length;
|
||||||
|
});
|
||||||
|
|
||||||
|
function toggleItem(pkg: string) {
|
||||||
|
selectedItems.value = {
|
||||||
|
...toRaw(selectedItems.value),
|
||||||
|
[pkg]: !selectedItems.value[pkg],
|
||||||
|
};
|
||||||
|
}
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<div class="filter-container">
|
||||||
|
<p class="header">
|
||||||
|
<span>Filter by {{ label }}</span> <span v-if="count">({{ count }})</span>
|
||||||
|
</p>
|
||||||
|
<div class="scroll-container">
|
||||||
|
<ul>
|
||||||
|
<li v-for="item in items">
|
||||||
|
<label :title="item">
|
||||||
|
<input
|
||||||
|
type="checkbox"
|
||||||
|
:checked="selectedItems[item]"
|
||||||
|
@input="toggleItem(item)"
|
||||||
|
/>
|
||||||
|
<span>{{ item }}</span>
|
||||||
|
</label>
|
||||||
|
</li>
|
||||||
|
</ul>
|
||||||
|
</div>
|
||||||
|
</div>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
.filter-container {
|
||||||
|
height: 300px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
background: var(--vp-c-bg-soft);
|
||||||
|
}
|
||||||
|
|
||||||
|
.scroll-container {
|
||||||
|
flex: 1;
|
||||||
|
overflow: hidden;
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
|
|
||||||
|
.scroll-container ul {
|
||||||
|
position: absolute;
|
||||||
|
overflow-y: auto;
|
||||||
|
left: 0;
|
||||||
|
top: 0;
|
||||||
|
right: 0;
|
||||||
|
bottom: 0;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
gap: 4px;
|
||||||
|
font-size: small;
|
||||||
|
padding: 8px 16px 16px 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
.header {
|
||||||
|
padding: 8px 16px;
|
||||||
|
font-size: 12px;
|
||||||
|
font-weight: bold;
|
||||||
|
opacity: 50%;
|
||||||
|
}
|
||||||
|
label {
|
||||||
|
display: flex;
|
||||||
|
gap: 4px;
|
||||||
|
align-items: flex-start;
|
||||||
|
text-wrap: wrap;
|
||||||
|
overflow-wrap: anywhere;
|
||||||
|
line-height: 140%;
|
||||||
|
cursor: pointer;
|
||||||
|
text-wrap: nowrap;
|
||||||
|
}
|
||||||
|
span {
|
||||||
|
padding-top: 1px;
|
||||||
|
}
|
||||||
|
input[type='checkbox'] {
|
||||||
|
width: 16px;
|
||||||
|
height: 16px;
|
||||||
|
flex-shrink: 0;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -0,0 +1,72 @@
|
|||||||
|
<script lang="ts" setup>
|
||||||
|
import { Example } from '../utils/types';
|
||||||
|
|
||||||
|
const props = defineProps<{
|
||||||
|
example: Example;
|
||||||
|
}>();
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<template>
|
||||||
|
<li>
|
||||||
|
<a :href="example.url" target="_blank">
|
||||||
|
<p class="name">{{ example.name }}</p>
|
||||||
|
<p class="description">{{ example.description }}</p>
|
||||||
|
<p class="link">Open →</p>
|
||||||
|
</a>
|
||||||
|
</li>
|
||||||
|
</template>
|
||||||
|
|
||||||
|
<style scoped>
|
||||||
|
* {
|
||||||
|
min-width: 0;
|
||||||
|
}
|
||||||
|
a {
|
||||||
|
padding: 16px;
|
||||||
|
display: flex;
|
||||||
|
flex-direction: column;
|
||||||
|
border: 2px solid var(--vp-c-bg-soft);
|
||||||
|
border-radius: 16px;
|
||||||
|
color: var(--vp-c-text-1) !important;
|
||||||
|
gap: 8px;
|
||||||
|
}
|
||||||
|
|
||||||
|
a:hover {
|
||||||
|
outline: 2px solid var(--vp-c-brand-2);
|
||||||
|
}
|
||||||
|
.name {
|
||||||
|
font-size: 16px;
|
||||||
|
font-weight: 500;
|
||||||
|
white-space: nowrap;
|
||||||
|
overflow: hidden;
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
flex-shrink: 0;
|
||||||
|
|
||||||
|
text-overflow: ellipsis;
|
||||||
|
overflow: hidden;
|
||||||
|
white-space: nowrap;
|
||||||
|
}
|
||||||
|
.description {
|
||||||
|
height: 53px;
|
||||||
|
opacity: 70%;
|
||||||
|
font-size: 14px;
|
||||||
|
font-weight: normal;
|
||||||
|
line-height: 120%;
|
||||||
|
min-height: 0;
|
||||||
|
|
||||||
|
display: -webkit-box;
|
||||||
|
-webkit-line-clamp: 3;
|
||||||
|
-webkit-box-orient: vertical;
|
||||||
|
overflow: hidden;
|
||||||
|
}
|
||||||
|
|
||||||
|
.link {
|
||||||
|
opacity: 0;
|
||||||
|
transition: 250ms;
|
||||||
|
color: var(--vp-c-brand-2);
|
||||||
|
font-weight: bold;
|
||||||
|
text-align: right;
|
||||||
|
}
|
||||||
|
a:hover .link {
|
||||||
|
opacity: 100%;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
@@ -4,18 +4,120 @@ import useListExtensionDetails, {
|
|||||||
ChromeExtension,
|
ChromeExtension,
|
||||||
} from '../composables/useListExtensionDetails';
|
} from '../composables/useListExtensionDetails';
|
||||||
|
|
||||||
// Add extension IDs here. Order doesn't matter, will be sorted by weekly active users
|
// Add extension IDs to end of the list. On the website, extensions will be sorted by a combination of weekly active users and rating.
|
||||||
|
// Change the commit message or PR title to: "docs: Added "[extension name]" to the homepage"
|
||||||
const chromeExtensionIds = [
|
const chromeExtensionIds = [
|
||||||
'ocfdgncpifmegplaglcnglhioflaimkd', // GitHub: Better Line Counts
|
'ocfdgncpifmegplaglcnglhioflaimkd', // GitHub: Better Line Counts
|
||||||
'mgmdkjcljneegjfajchedjpdhbadklcf', // Anime Skip Player
|
'mgmdkjcljneegjfajchedjpdhbadklcf', // Anime Skip Player
|
||||||
|
'bfbnagnphiehemkdgmmficmjfddgfhpl', // UltraWideo
|
||||||
|
'elfaihghhjjoknimpccccmkioofjjfkf', // StayFree - Website Blocker & Web Analytics
|
||||||
|
'okifoaikfmpfcamplcfjkpdnhfodpkil', // Doozy: Ai Made Easy
|
||||||
|
'lknmjhcajhfbbglglccadlfdjbaiifig', // tl;dv - Record, Transcribe & ChatGPT for Google Meet
|
||||||
|
'oglffgiaiekgeicdgkdlnlkhliajdlja', // Youtube中文配音
|
||||||
|
'agjnjboanicjcpenljmaaigopkgdnihi', // PreMiD
|
||||||
|
'aiakblgmlabokilgljkglggnpflljdgp', // Markdown Sticky Notes
|
||||||
|
'nomnkbngkijpffepcgbbofhcnafpkiep', // DocVersionRedirector
|
||||||
|
'ceicccfeikoipigeghddpocceifjelph', // Plex Skipper
|
||||||
|
'aelkipgppclpfimeamgmlonimflbhlgf', // GitHub Custom Notifier
|
||||||
|
'djnlaiohfaaifbibleebjggkghlmcpcj', // Fluent Read
|
||||||
|
'nhclljcpfmmaiojbhhnkpjcfmacfcian', // Facebook Video Controls
|
||||||
|
'mblkhbaakhbhiimkbcnmeciblfhmafna', // ElemSnap - Quick capture of webpage elements and conversion to images,
|
||||||
|
'oajalfneblkfiejoadecnmodfpnaeblh', // MS Edge TTS (Text to Speech)
|
||||||
|
'nedcanggplmbbgmlpcjiafgjcpdimpea', // YTBlock - Block any content from YouTube™
|
||||||
|
'oadbjpccljkplmhnjekgjamejnbadlne', // demo.fun - Interactive product demos that convert
|
||||||
|
'iopdafdcollfgaoffingmahpffckmjni', // SmartEReply: Elevate Your LinkedIn™ Engagement with AI 🚀📈
|
||||||
|
'khjdmjcmpolknpccmaaipmidphjokhdf', // WorkFlowy MultiFlow
|
||||||
|
'fencadnndhdeggodopebjgdfdlhcimfk', // 香草布丁🌿🍮- https://github.com/Xdy1579883916/vanilla-pudding
|
||||||
|
'bnacincmbaknlbegecpioobkfgejlojp', // MaxFocus: Link Preview
|
||||||
|
'bcpgdpedphodjcjlminjbdeejccjbimp', // 汇率转换-中文版本
|
||||||
|
'loeilaonggnalkaiiaepbegccilkmjjp', // Currency Converter Plus
|
||||||
|
'npcnninnjghigjfiecefheeibomjpkak', // Respond Easy
|
||||||
|
'cfkdcideecefncbglkhneoflfnmhoicc', // mindful - stay focused on your goals
|
||||||
|
'lnhejcpclabmbgpiiomjbhalblnnbffg', // 1Proompt
|
||||||
|
'fonflmjnjbkigocpoommgmhljdpljain', // NiceTab - https://github.com/web-dahuyou/NiceTab
|
||||||
|
'fcffekbnfcfdemeekijbbmgmkognnmkd', // Draftly for LinkedIn
|
||||||
|
'nkndldfehcidpejfkokbeghpnlbppdmo', // YouTube Summarized - Summarize any YouTube video
|
||||||
|
'dbichmdlbjdeplpkhcejgkakobjbjalc', // 社媒助手 - https://github.com/iszhouhua/social-media-copilot
|
||||||
|
'opepfpjeogkbgeigkbepobceinnfmjdd', // Dofollow Links for SEO
|
||||||
|
'pdnenlnelpdomajfejgapbdpmjkfpjkp', // ChatGPT Writer: Use AI on Any Site (GPT-4o, Claude, Gemini, and More)
|
||||||
|
'jobnhifpphkgoelnhnopgkdhbdkiadmj', // discord message translator
|
||||||
|
'ncokhechhpjgjonhjnlaneglmdkfkcbj', // Habit Tracker app widget for daily habit tracking
|
||||||
|
'lnjaiaapbakfhlbjenjkhffcdpoompki', // Catppuccin for GitHub File Explorer Icons
|
||||||
|
'cpaedhbidlpnbdfegakhiamfpndhjpgf', // WebChat: Chat with anyone on any website
|
||||||
|
'fcphghnknhkimeagdglkljinmpbagone', // YouTube Auto HD + FPS
|
||||||
|
'lpomjgbicdemjkgmbnkjncgdebogkhlb', // MultiViewer Companion
|
||||||
|
'ggiafipgeeaaahnjamgpjcgkdpanhddg', // Sync Watch - Watch videos together on any site
|
||||||
|
'nmldnjcblcihmegipecakhmnieiofmgl', // Keyword Rank Checker
|
||||||
|
'gppllamhaciichleihemgilcpledblpn', // YouTube Simple View - Hide distractions & more
|
||||||
|
'pccbghdfdnnkkbcdcibchpbffdgednkf', // Propbar - Property Data Enhancer
|
||||||
|
'lfknakglefggmdkjdfhhofkjnnolffkh', // Text Search Pro - Search by case and whole-word match!
|
||||||
|
'mbenhbocjckkbaojacmaepiameldglij', // Invoice Generator
|
||||||
|
'phlfhkmdofajnbhgmbmjkbkdgppgoppb', // Monthly Bill Tracker
|
||||||
|
'macmkmchfoclhpbncclinhjflmdkaoom', // Wandpen - Instantly improve your writing with AI
|
||||||
|
'lhmgechokhmdekdpgkkemoeecelcaonm', // YouTube Hider - Remove Comments By Keywords, Usernames & Tools
|
||||||
|
'imgheieooppmahcgniieddodaliodeeg', // QA Compass - Record standardized bug reports easily
|
||||||
|
'npgghjedpchajflknnbngajkjkdhncdo', // aesthetic Notion, styled
|
||||||
|
'hmdcmlfkchdmnmnmheododdhjedfccka', // Eye Dropper
|
||||||
|
'eihpmapodnppeemkhkbhikmggfojdkjd', // Cursorful - Screen Recorder with Auto Zoom
|
||||||
|
'hjjkgbibknbahijglkffklflidncplkn', // Show IP – Live View of Website IPs for Developers
|
||||||
|
'ilbikcehnpkmldojkcmlldkoelofnbde', // Strong Password Generator
|
||||||
|
'ocllfkhcdopiafndigclebelbecaiocp', // ZenGram: Mindful Instagram, Your Way
|
||||||
|
'odffpjnpocjfcaclnenaaaddghkgijdb', // Blync: Preview Links, Selection Search, AI Assistant
|
||||||
|
'kofbbilhmnkcmibjbioafflgmpkbnmme', // HTML to Markdown - Convert webpages to markdown
|
||||||
|
'boecmgggeigllcdocgioijmleimjbfkg', // Walmart WFS Profit Calculator
|
||||||
|
'dlnjcbkmomenmieechnmgglgcljhoepd', // Youtube Live Chat Fullscreen
|
||||||
|
'keiealdacakpnbbljlmhfgcebmaadieg', // Python Code Runner
|
||||||
|
'hafcajcllbjnoolpfngclfmmgpikdhlm', // Monochromate
|
||||||
|
'bmoggiinmnodjphdjnmpcnlleamkfedj', // AliasVault - Open-Source Password & (Email) Alias Manager
|
||||||
|
'hlnhhamckimoaiekbglafiebkfimhapb', // SnapThePrice: AI-Powered Real-time Lowest Price Finder
|
||||||
|
'gdjampjdgjmbifnhldgcnccdjkcoicmg', // radiofrance - news & broadcasts (French), music (international)
|
||||||
|
'jlnhphlghikichhgbnkepenehbmloenb', // Blens - Time Tracker and AI Insight
|
||||||
|
'njnammmpdodmfkodnfpammnpdcbhnlcm', // Always Light Mode - Setting website always in light mode
|
||||||
|
'lblmfclcfniabobmamfkdogcgdagbhhb', // DesignPicker - Color Picker & Font Detector
|
||||||
|
'pamnlaoeobcmhkliljfaofekeddpmfoh', // Web to PDF
|
||||||
|
'jmbcbeepjfenihlocplnbmbhimcoooka', // Online CSV Viewer
|
||||||
|
'nkjcoophmpcmmgadnljnlpbpfdfacgbo', // YouTube Video Transcript
|
||||||
|
'lcaieahkjgeggeiihblhcjbbjlppgieh', // NetSuite Record Scripts
|
||||||
|
'gmocfknjllodfiomnljmaehcplnekhlo', // VueTracker
|
||||||
|
'ggcfemmoabhhelfkhknhbnkmeahloiod', // CanCopy - A web extension that allow you to copy any content from website
|
||||||
|
'modkelfkcfjpgbfmnbnllalkiogfofhb', // Language Learning with AI
|
||||||
|
'npfopljnjbamegincfjelhjhnonnjloo', // Bilibili Feed History Helper
|
||||||
|
'edkhpdceeinkcacjdgebjehipmnbomce', // NZBDonkey - The ultimate NZB file download tool
|
||||||
|
'cckggnbnimdbbpmdinkkgbbncopbloob', // WeChat Markdown Editor(微信 Markdown 编辑器)
|
||||||
|
'jcblcjolcojmfopefcighfmkkefbaofg', // Tab Grab
|
||||||
|
'eehmoikadcijkapfjocnhjclpbaindlb', // BrowserLens - https://browserlens.com/
|
||||||
|
'hfhellofkjebbchcdffmicekjdomkcmc', // Epic Games Library Extension
|
||||||
|
'gknigcbhlammoakmmdddkblknanpjiac', // Zen Analytics Pixel Tracker - zapt.web.app
|
||||||
|
'cnklededohhcbmjjdlbjdkkihkgoggol', // Crypto Pulse - Compose your newtab with nature images, widgets & realtime Crypto Price & Bitcoin RSS.
|
||||||
|
'miponnamafdenpgjemkknimgjfibicdc', // Youtube Video Scheduler
|
||||||
|
'nhmbcmalgpkjbomhlhgdicanmkkaajmg', // Chatslator: Livestream Chat Translator
|
||||||
|
'mbamjfdjbcdgpopfnkkmlohadbbnplhm', // 公众号阅读增强器 - https://wxreader.honwhy.wang
|
||||||
|
'hannhecbnjnnbbafffmogdlnajpcomek', // 토탐정
|
||||||
|
'ehboaofjncodknjkngdggmpdinhdoijp', // 2FAS Pass - https://2fas.com/
|
||||||
|
'hnjamiaoicaepbkhdoknhhcedjdocpkd', // Quick Prompt - https://github.com/wenyuanw/quick-prompt
|
||||||
|
'kacblhilkacgfnkjfodalohcnllcgmjd', // Add QR Code Generator Icon Back To Address Bar
|
||||||
|
'fkbdlogfdjmpfepbbbjcgcfbgbcfcnne', // Piwik PRO Tracking Helper
|
||||||
|
'nkbikckldmljjiiajklecmgmajgapbfl', // PIPX - Take Control of Picture-in-Picture, Automatically
|
||||||
|
'hgppdobcpkfkmiegekaglonjajeojmdd', // Browsely - AI-powered browser extension
|
||||||
|
'ehmoihnjgkdimihkhokkmfjdgomohjgm', // Filmbudd Pro - Simple, private – and synced ratings and watch notes across all your devices
|
||||||
|
'alglchohmdikgdjhafiicilegegieafa', // MultiField CopyCat - Copy, Paste & Autofill Web Forms Instantly
|
||||||
|
'aamihahiiogceidpbnfgehacgiecephe', // ChatSight - Add Table of Contents to ChatGPT
|
||||||
];
|
];
|
||||||
|
|
||||||
const { data } = useListExtensionDetails(chromeExtensionIds);
|
const { data, err, isLoading } = useListExtensionDetails(chromeExtensionIds);
|
||||||
const sortedExtensions = computed(() =>
|
const sortedExtensions = computed(() => {
|
||||||
!data.value
|
if (!data.value?.length) return [];
|
||||||
? undefined
|
|
||||||
: [...data.value].sort((l, r) => r.weeklyActiveUsers - l.weeklyActiveUsers),
|
return [...data.value]
|
||||||
);
|
.filter((item) => item != null)
|
||||||
|
.map((item) => ({
|
||||||
|
...item,
|
||||||
|
// Sort based on the user count weighted by the rating
|
||||||
|
sortKey: ((item.rating ?? 5) / 5) * item.weeklyActiveUsers,
|
||||||
|
}))
|
||||||
|
.filter((item) => !!item)
|
||||||
|
.sort((l, r) => r.sortKey - l.sortKey);
|
||||||
|
});
|
||||||
|
|
||||||
function getStoreUrl(extension: ChromeExtension) {
|
function getStoreUrl(extension: ChromeExtension) {
|
||||||
const url = new URL(extension.storeUrl);
|
const url = new URL(extension.storeUrl);
|
||||||
@@ -25,72 +127,56 @@ function getStoreUrl(extension: ChromeExtension) {
|
|||||||
</script>
|
</script>
|
||||||
|
|
||||||
<template>
|
<template>
|
||||||
<section class="vp-doc">
|
<p v-if="isLoading" style="text-align: center; opacity: 50%">Loading...</p>
|
||||||
<div class="container">
|
<p
|
||||||
<h2>Who's Using WXT?</h2>
|
v-else-if="err || sortedExtensions.length === 0"
|
||||||
<p>
|
style="text-align: center; opacity: 50%"
|
||||||
Battle tested and ready for production. Explore chrome extensions made
|
>
|
||||||
with WXT.
|
Failed to load extension details.
|
||||||
</p>
|
</p>
|
||||||
<ul>
|
<ul v-else>
|
||||||
<li v-for="extension of sortedExtensions">
|
<li
|
||||||
<img
|
v-for="extension of sortedExtensions"
|
||||||
:src="extension.iconUrl"
|
:key="extension.id"
|
||||||
:alt="`${extension.name} icon`"
|
class="relative"
|
||||||
referrerpolicy="no-referrer"
|
>
|
||||||
/>
|
<img
|
||||||
<div>
|
:src="extension.iconUrl"
|
||||||
<a
|
:alt="`${extension.name} icon`"
|
||||||
:href="getStoreUrl(extension)"
|
referrerpolicy="no-referrer"
|
||||||
target="_blank"
|
/>
|
||||||
:title="extension.name"
|
<div class="relative">
|
||||||
>{{ extension.name }}</a
|
|
||||||
>
|
|
||||||
<p class="description" :title="extension.shortDescription">
|
|
||||||
{{ extension.shortDescription }}
|
|
||||||
</p>
|
|
||||||
<p class="user-count">
|
|
||||||
{{ extension.weeklyActiveUsers.toLocaleString() }} users
|
|
||||||
</p>
|
|
||||||
</div>
|
|
||||||
</li>
|
|
||||||
</ul>
|
|
||||||
<p class="centered pr">
|
|
||||||
<a
|
<a
|
||||||
href="https://github.com/wxt-dev/wxt/edit/main/docs/.vitepress/components/UsingWxtSection.vue"
|
:href="getStoreUrl(extension)"
|
||||||
target="_blank"
|
target="_blank"
|
||||||
>Open a PR</a
|
:title="extension.name"
|
||||||
|
class="extension-name"
|
||||||
|
>{{ extension.name }}</a
|
||||||
>
|
>
|
||||||
to add your extension to the list!
|
<p class="description" :title="extension.shortDescription">
|
||||||
|
{{ extension.shortDescription }}
|
||||||
|
</p>
|
||||||
|
</div>
|
||||||
|
<p class="user-count">
|
||||||
|
<span>{{ extension.weeklyActiveUsers.toLocaleString() }} users</span
|
||||||
|
><template v-if="extension.rating != null"
|
||||||
|
>,
|
||||||
|
<span>{{ extension.rating }} stars</span>
|
||||||
|
</template>
|
||||||
</p>
|
</p>
|
||||||
</div>
|
</li>
|
||||||
</section>
|
</ul>
|
||||||
|
<p class="centered pr">
|
||||||
|
<a
|
||||||
|
href="https://github.com/wxt-dev/wxt/edit/main/docs/.vitepress/components/UsingWxtSection.vue"
|
||||||
|
target="_blank"
|
||||||
|
>Open a PR</a
|
||||||
|
>
|
||||||
|
to add your extension to the list!
|
||||||
|
</p>
|
||||||
</template>
|
</template>
|
||||||
|
|
||||||
<style scoped>
|
<style scoped>
|
||||||
.vp-doc {
|
|
||||||
padding: 0 24px;
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 640px) {
|
|
||||||
.vp-doc {
|
|
||||||
padding: 0 48px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
@media (min-width: 960px) {
|
|
||||||
.vp-doc {
|
|
||||||
padding: 0 64px;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
.container {
|
|
||||||
max-width: 1152px;
|
|
||||||
margin: 0 auto;
|
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
|
||||||
|
|
||||||
li img {
|
li img {
|
||||||
width: 116px;
|
width: 116px;
|
||||||
height: 116px;
|
height: 116px;
|
||||||
@@ -121,7 +207,8 @@ li {
|
|||||||
background-color: var(--vp-c-bg-soft);
|
background-color: var(--vp-c-bg-soft);
|
||||||
border-radius: 12px;
|
border-radius: 12px;
|
||||||
flex: 1;
|
flex: 1;
|
||||||
gap: 16px;
|
gap: 24px;
|
||||||
|
align-items: center;
|
||||||
}
|
}
|
||||||
|
|
||||||
.centered {
|
.centered {
|
||||||
@@ -136,9 +223,10 @@ li .description {
|
|||||||
}
|
}
|
||||||
li .user-count {
|
li .user-count {
|
||||||
opacity: 70%;
|
opacity: 70%;
|
||||||
text-align: right;
|
|
||||||
width: 100%;
|
|
||||||
font-size: small;
|
font-size: small;
|
||||||
|
position: absolute;
|
||||||
|
bottom: 12px;
|
||||||
|
right: 16px;
|
||||||
}
|
}
|
||||||
|
|
||||||
li a {
|
li a {
|
||||||
@@ -157,8 +245,6 @@ li a:hover {
|
|||||||
|
|
||||||
li div {
|
li div {
|
||||||
flex: 1;
|
flex: 1;
|
||||||
display: flex;
|
|
||||||
flex-direction: column;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
li .description {
|
li .description {
|
||||||
@@ -167,10 +253,18 @@ li .description {
|
|||||||
-webkit-line-clamp: 2;
|
-webkit-line-clamp: 2;
|
||||||
-webkit-box-orient: vertical;
|
-webkit-box-orient: vertical;
|
||||||
overflow: hidden;
|
overflow: hidden;
|
||||||
flex-grow: 1;
|
margin-bottom: 16px;
|
||||||
|
}
|
||||||
|
|
||||||
|
li .extension-name {
|
||||||
|
font-size: large;
|
||||||
}
|
}
|
||||||
|
|
||||||
.pr {
|
.pr {
|
||||||
opacity: 70%;
|
opacity: 70%;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
.relative {
|
||||||
|
position: relative;
|
||||||
|
}
|
||||||
</style>
|
</style>
|
||||||
|
|||||||
@@ -0,0 +1,15 @@
|
|||||||
|
import { computed, toValue, MaybeRefOrGetter } from 'vue';
|
||||||
|
|
||||||
|
const MONTH_FORMATTER = new Intl.DateTimeFormat(
|
||||||
|
globalThis?.navigator?.language,
|
||||||
|
{
|
||||||
|
month: 'long',
|
||||||
|
},
|
||||||
|
);
|
||||||
|
|
||||||
|
export default function (date: MaybeRefOrGetter<Date | string>) {
|
||||||
|
return computed(() => {
|
||||||
|
const d = new Date(toValue(date));
|
||||||
|
return `${MONTH_FORMATTER.format(d)} ${d.getDate()}, ${d.getFullYear()}`;
|
||||||
|
});
|
||||||
|
}
|
||||||
@@ -7,6 +7,7 @@ export interface ChromeExtension {
|
|||||||
weeklyActiveUsers: number;
|
weeklyActiveUsers: number;
|
||||||
shortDescription: string;
|
shortDescription: string;
|
||||||
storeUrl: string;
|
storeUrl: string;
|
||||||
|
rating: number | undefined;
|
||||||
}
|
}
|
||||||
|
|
||||||
const operationName = 'WxtDocsUsedBy';
|
const operationName = 'WxtDocsUsedBy';
|
||||||
@@ -18,12 +19,14 @@ const query = `query ${operationName}($ids:[String!]!) {
|
|||||||
weeklyActiveUsers
|
weeklyActiveUsers
|
||||||
shortDescription
|
shortDescription
|
||||||
storeUrl
|
storeUrl
|
||||||
|
rating
|
||||||
}
|
}
|
||||||
}`;
|
}`;
|
||||||
|
|
||||||
export default function (ids: string[]) {
|
export default function (ids: string[]) {
|
||||||
const data = ref<ChromeExtension[]>();
|
const data = ref<ChromeExtension[]>();
|
||||||
const err = ref<unknown>();
|
const err = ref<unknown>();
|
||||||
|
const isLoading = ref(true);
|
||||||
|
|
||||||
fetch('https://queue.wxt.dev/api', {
|
fetch('https://queue.wxt.dev/api', {
|
||||||
method: 'POST',
|
method: 'POST',
|
||||||
@@ -32,8 +35,12 @@ export default function (ids: string[]) {
|
|||||||
query,
|
query,
|
||||||
variables: { ids },
|
variables: { ids },
|
||||||
}),
|
}),
|
||||||
|
headers: {
|
||||||
|
'Content-Type': 'application/json',
|
||||||
|
},
|
||||||
})
|
})
|
||||||
.then(async (res) => {
|
.then(async (res) => {
|
||||||
|
isLoading.value = false;
|
||||||
const {
|
const {
|
||||||
data: { chromeExtensions },
|
data: { chromeExtensions },
|
||||||
} = await res.json();
|
} = await res.json();
|
||||||
@@ -41,6 +48,7 @@ export default function (ids: string[]) {
|
|||||||
err.value = undefined;
|
err.value = undefined;
|
||||||
})
|
})
|
||||||
.catch((error) => {
|
.catch((error) => {
|
||||||
|
isLoading.value = false;
|
||||||
console.error(error);
|
console.error(error);
|
||||||
data.value = undefined;
|
data.value = undefined;
|
||||||
err.value = error;
|
err.value = error;
|
||||||
@@ -49,5 +57,6 @@ export default function (ids: string[]) {
|
|||||||
return {
|
return {
|
||||||
data,
|
data,
|
||||||
err,
|
err,
|
||||||
|
isLoading,
|
||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|||||||
+220
-86
@@ -1,128 +1,262 @@
|
|||||||
import { defineConfig } from 'vitepress';
|
import { DefaultTheme, defineConfig } from 'vitepress';
|
||||||
import { generateConfigDocs } from './plugins/generate-config-docs';
|
import typedocSidebar from '../api/reference/typedoc-sidebar.json';
|
||||||
import { generateCliDocs } from './plugins/generate-cli-docs';
|
import {
|
||||||
|
menuGroup,
|
||||||
|
menuItem,
|
||||||
|
menuRoot,
|
||||||
|
navItem,
|
||||||
|
prepareTypedocSidebar,
|
||||||
|
} from './utils/menus';
|
||||||
|
import { meta, script } from './utils/head';
|
||||||
|
import footnote from 'markdown-it-footnote';
|
||||||
|
import { version as wxtVersion } from '../../packages/wxt/package.json';
|
||||||
|
import { version as i18nVersion } from '../../packages/i18n/package.json';
|
||||||
|
import { version as autoIconsVersion } from '../../packages/auto-icons/package.json';
|
||||||
|
import { version as unocssVersion } from '../../packages/unocss/package.json';
|
||||||
|
import { version as storageVersion } from '../../packages/storage/package.json';
|
||||||
|
import { version as analyticsVersion } from '../../packages/analytics/package.json';
|
||||||
|
import { version as runnerVersion } from '../../packages/runner/package.json';
|
||||||
|
import addKnowledge from 'vitepress-knowledge';
|
||||||
|
import {
|
||||||
|
groupIconMdPlugin,
|
||||||
|
groupIconVitePlugin,
|
||||||
|
localIconLoader,
|
||||||
|
} from 'vitepress-plugin-group-icons';
|
||||||
|
import { Feed } from 'feed';
|
||||||
|
import { writeFile } from 'node:fs/promises';
|
||||||
|
import { join } from 'node:path';
|
||||||
|
|
||||||
|
const origin = 'https://wxt.dev';
|
||||||
|
|
||||||
const title = 'Next-gen Web Extension Framework';
|
const title = 'Next-gen Web Extension Framework';
|
||||||
const titleSuffix = ' – WXT';
|
const titleSuffix = ' – WXT';
|
||||||
|
|
||||||
const description =
|
const description =
|
||||||
"WXT provides the best developer experience, making it quick, easy, and fun to develop chrome extensions for all browsers. With built-in utilties for building, zipping, and publishing your extension, it's easy to get started.";
|
"WXT provides the best developer experience, making it quick, easy, and fun to develop web extensions. With built-in utilities for building, zipping, and publishing your extension, it's easy to get started.";
|
||||||
const ogTitle = `${title}${titleSuffix}`;
|
const ogTitle = `${title}${titleSuffix}`;
|
||||||
const ogUrl = 'https://wxt.dev';
|
const ogUrl = origin;
|
||||||
const ogImage = 'https://wxt.dev/social-preview.png';
|
const ogImage = `${origin}/social-preview.png`;
|
||||||
|
|
||||||
|
const otherPackages = {
|
||||||
|
analytics: analyticsVersion,
|
||||||
|
'auto-icons': autoIconsVersion,
|
||||||
|
i18n: i18nVersion,
|
||||||
|
storage: storageVersion,
|
||||||
|
unocss: unocssVersion,
|
||||||
|
runner: runnerVersion,
|
||||||
|
};
|
||||||
|
|
||||||
|
const knowledge = addKnowledge<DefaultTheme.Config>({
|
||||||
|
serverUrl: 'https://knowledge.wxt.dev',
|
||||||
|
paths: {
|
||||||
|
'/': 'docs',
|
||||||
|
'/api/': 'api-reference',
|
||||||
|
'/blog/': 'blog',
|
||||||
|
},
|
||||||
|
layoutSelectors: {
|
||||||
|
blog: '.container-content',
|
||||||
|
},
|
||||||
|
pageSelectors: {
|
||||||
|
'examples.md': '#VPContent > .VPPage',
|
||||||
|
'blog.md': '#VPContent > .VPPage',
|
||||||
|
},
|
||||||
|
});
|
||||||
|
|
||||||
// https://vitepress.dev/reference/site-config
|
// https://vitepress.dev/reference/site-config
|
||||||
export default defineConfig({
|
export default defineConfig({
|
||||||
|
extends: knowledge,
|
||||||
|
|
||||||
titleTemplate: `:title${titleSuffix}`,
|
titleTemplate: `:title${titleSuffix}`,
|
||||||
title: 'WXT',
|
title: 'WXT',
|
||||||
description,
|
description,
|
||||||
vite: {
|
vite: {
|
||||||
clearScreen: false,
|
clearScreen: false,
|
||||||
plugins: [generateConfigDocs(), generateCliDocs()],
|
plugins: [
|
||||||
|
groupIconVitePlugin({
|
||||||
|
customIcon: {
|
||||||
|
'wxt.config.ts': localIconLoader(
|
||||||
|
import.meta.url,
|
||||||
|
'../public/logo.svg',
|
||||||
|
),
|
||||||
|
},
|
||||||
|
}),
|
||||||
|
],
|
||||||
},
|
},
|
||||||
lastUpdated: true,
|
lastUpdated: true,
|
||||||
sitemap: {
|
sitemap: {
|
||||||
hostname: 'https://wxt.dev',
|
hostname: origin,
|
||||||
|
},
|
||||||
|
|
||||||
|
async buildEnd(site) {
|
||||||
|
// @ts-expect-error: knowledge.buildEnd is not typed, but it exists.
|
||||||
|
await knowledge.buildEnd(site);
|
||||||
|
|
||||||
|
// Only construct the RSS document for production builds
|
||||||
|
const { default: blogDataLoader } = await import('./loaders/blog.data');
|
||||||
|
const posts = await blogDataLoader.load();
|
||||||
|
const feed = new Feed({
|
||||||
|
copyright: 'MIT',
|
||||||
|
id: 'wxt',
|
||||||
|
title: 'WXT Blog',
|
||||||
|
link: `${origin}/blog`,
|
||||||
|
});
|
||||||
|
posts.forEach((post) => {
|
||||||
|
feed.addItem({
|
||||||
|
date: post.frontmatter.date,
|
||||||
|
link: new URL(post.url, origin).href,
|
||||||
|
title: post.frontmatter.title,
|
||||||
|
description: post.frontmatter.description,
|
||||||
|
});
|
||||||
|
});
|
||||||
|
// console.log('rss.xml:');
|
||||||
|
// console.log(feed.rss2());
|
||||||
|
await writeFile(join(site.outDir, 'rss.xml'), feed.rss2(), 'utf8');
|
||||||
},
|
},
|
||||||
|
|
||||||
head: [
|
head: [
|
||||||
['meta', { property: 'og:type', content: 'website' }],
|
meta('og:type', 'website'),
|
||||||
['meta', { property: 'og:title', content: ogTitle }],
|
meta('og:title', ogTitle),
|
||||||
['meta', { property: 'og:image', content: ogImage }],
|
meta('og:image', ogImage),
|
||||||
['meta', { property: 'og:url', content: ogUrl }],
|
meta('og:url', ogUrl),
|
||||||
['meta', { property: 'og:description', content: description }],
|
meta('og:description', description),
|
||||||
['meta', { name: 'twitter:card', content: 'summary_large_image' }],
|
meta('twitter:card', 'summary_large_image', { useName: true }),
|
||||||
[
|
script('https://umami.aklinker1.io/script.js', {
|
||||||
'script',
|
'data-website-id': 'c1840c18-a12c-4a45-a848-55ae85ef7915',
|
||||||
{
|
async: '',
|
||||||
async: '',
|
}),
|
||||||
'data-website-id': 'c1840c18-a12c-4a45-a848-55ae85ef7915',
|
|
||||||
src: 'https://umami.aklinker1.io/script.js',
|
|
||||||
},
|
|
||||||
],
|
|
||||||
],
|
],
|
||||||
|
|
||||||
|
markdown: {
|
||||||
|
config: (md) => {
|
||||||
|
md.use(footnote);
|
||||||
|
md.use(groupIconMdPlugin);
|
||||||
|
},
|
||||||
|
languageAlias: {
|
||||||
|
mjs: 'js',
|
||||||
|
},
|
||||||
|
},
|
||||||
|
|
||||||
themeConfig: {
|
themeConfig: {
|
||||||
// https://vitepress.dev/reference/default-theme-config
|
// https://vitepress.dev/reference/default-theme-config
|
||||||
logo: {
|
logo: {
|
||||||
src: '/logo.svg',
|
src: '/logo.svg',
|
||||||
alt: 'WXT logo',
|
alt: 'WXT logo',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
footer: {
|
||||||
|
message: [
|
||||||
|
'<a class="light-netlify" href="https://www.netlify.com"> <img src="https://www.netlify.com/v3/img/components/netlify-color-bg.svg" alt="Deploys by Netlify" style="display: inline;" /></a>',
|
||||||
|
'<a class="dark-netlify" href="https://www.netlify.com"> <img src="https://www.netlify.com/v3/img/components/netlify-color-accent.svg" alt="Deploys by Netlify" style="display: inline;" /></a>',
|
||||||
|
'Released under the <a href="https://github.com/wxt-dev/wxt/blob/main/LICENSE">MIT License</a>.',
|
||||||
|
].join('<br/>'),
|
||||||
|
copyright:
|
||||||
|
'Copyright © 2023-present <a href="https://github.com/aklinker1">Aaron Klinker</a>',
|
||||||
|
},
|
||||||
|
|
||||||
editLink: {
|
editLink: {
|
||||||
pattern: 'https://github.com/wxt-dev/wxt/edit/main/docs/:path',
|
pattern: 'https://github.com/wxt-dev/wxt/edit/main/docs/:path',
|
||||||
},
|
},
|
||||||
|
|
||||||
search: {
|
search: {
|
||||||
provider: 'local',
|
provider: 'local',
|
||||||
},
|
},
|
||||||
|
|
||||||
|
socialLinks: [
|
||||||
|
{ icon: 'discord', link: 'https://discord.gg/ZFsZqGery9' },
|
||||||
|
{ icon: 'github', link: 'https://github.com/wxt-dev/wxt' },
|
||||||
|
],
|
||||||
|
|
||||||
nav: [
|
nav: [
|
||||||
{ text: 'Guide', link: '/guide/installation.md' },
|
navItem('Guide', '/guide/installation'),
|
||||||
{ text: 'Entrypoints', link: '/entrypoints/background.md' },
|
navItem('Examples', '/examples'),
|
||||||
{ text: 'API', link: '/api/cli.md' },
|
navItem('API', '/api/reference/wxt'),
|
||||||
|
navItem('Blog', '/blog'),
|
||||||
|
navItem(`v${wxtVersion}`, [
|
||||||
|
navItem('wxt', [
|
||||||
|
navItem(`v${wxtVersion}`, '/'),
|
||||||
|
navItem(
|
||||||
|
`Changelog`,
|
||||||
|
'https://github.com/wxt-dev/wxt/blob/main/packages/wxt/CHANGELOG.md',
|
||||||
|
),
|
||||||
|
]),
|
||||||
|
navItem(
|
||||||
|
'Other Packages',
|
||||||
|
Object.entries(otherPackages).map(([name, version]) =>
|
||||||
|
navItem(`@wxt-dev/${name} — ${version}`, `/${name}`),
|
||||||
|
),
|
||||||
|
),
|
||||||
|
]),
|
||||||
],
|
],
|
||||||
|
|
||||||
sidebar: {
|
sidebar: {
|
||||||
'/guide/': [
|
'/guide/': menuRoot([
|
||||||
{
|
menuGroup('Get Started', '/guide/', [
|
||||||
text: 'Guide',
|
menuItem('Introduction', 'introduction.md'),
|
||||||
items: [
|
menuItem('Installation', 'installation.md'),
|
||||||
{ text: 'Introduction', link: '/guide/introduction.md' },
|
]),
|
||||||
{ text: 'Installation', link: '/guide/installation.md' },
|
menuGroup('Essentials', '/guide/essentials/', [
|
||||||
{ text: 'Configuration', link: '/guide/configuration.md' },
|
menuItem('Project Structure', 'project-structure.md'),
|
||||||
{ text: 'Entrypoints', link: '/guide/entrypoints.md' },
|
menuItem('Entrypoints', 'entrypoints.md'),
|
||||||
{ text: 'Assets', link: '/guide/assets.md' },
|
menuGroup(
|
||||||
{ text: 'Build Targets', link: '/guide/build-targets.md' },
|
'Configuration',
|
||||||
{ text: 'Publishing', link: '/guide/publishing.md' },
|
'/guide/essentials/config/',
|
||||||
{ text: 'Auto-imports', link: '/guide/auto-imports.md' },
|
[
|
||||||
{ text: 'Manifest.json', link: '/guide/manifest.md' },
|
menuItem('Manifest', 'manifest.md'),
|
||||||
{ text: 'Extension APIs', link: '/guide/extension-apis.md' },
|
menuItem('Browser Startup', 'browser-startup.md'),
|
||||||
{ text: 'Remote Code', link: '/guide/remote-code.md' },
|
menuItem('Auto-imports', 'auto-imports.md'),
|
||||||
{ text: 'Development', link: '/guide/development.md' },
|
menuItem('Environment Variables', 'environment-variables.md'),
|
||||||
{ text: 'Testing', link: '/guide/testing.md' },
|
menuItem('Runtime Config', 'runtime.md'),
|
||||||
{ text: 'Vite', link: '/guide/vite.md' },
|
menuItem('Vite', 'vite.md'),
|
||||||
{ text: 'Compare', link: '/guide/compare.md' },
|
menuItem('Build Mode', 'build-mode.md'),
|
||||||
|
menuItem('TypeScript', 'typescript.md'),
|
||||||
|
menuItem('Hooks', 'hooks.md'),
|
||||||
|
menuItem('Entrypoint Loaders', 'entrypoint-loaders.md'),
|
||||||
|
],
|
||||||
|
true,
|
||||||
|
),
|
||||||
|
menuItem('Extension APIs', 'extension-apis.md'),
|
||||||
|
menuItem('Assets', 'assets.md'),
|
||||||
|
menuItem('Target Different Browsers', 'target-different-browsers.md'),
|
||||||
|
menuItem('Content Scripts', 'content-scripts.md'),
|
||||||
|
menuItem('Storage', 'storage.md'),
|
||||||
|
menuItem('Messaging', 'messaging.md'),
|
||||||
|
menuItem('I18n', 'i18n.md'),
|
||||||
|
menuItem('Scripting', 'scripting.md'),
|
||||||
|
menuItem('WXT Modules', 'wxt-modules.md'),
|
||||||
|
menuItem('Frontend Frameworks', 'frontend-frameworks.md'),
|
||||||
|
menuItem('ES Modules', 'es-modules.md'),
|
||||||
|
menuItem('Remote Code', 'remote-code.md'),
|
||||||
|
menuItem('Unit Testing', 'unit-testing.md'),
|
||||||
|
menuItem('E2E Testing', 'e2e-testing.md'),
|
||||||
|
menuItem('Publishing', 'publishing.md'),
|
||||||
|
menuItem('Testing Updates', 'testing-updates.md'),
|
||||||
|
]),
|
||||||
|
menuGroup('Resources', '/guide/resources/', [
|
||||||
|
menuItem('Compare', 'compare.md'),
|
||||||
|
menuItem('FAQ', 'faq.md'),
|
||||||
|
menuItem('Community', 'community.md'),
|
||||||
|
menuItem('Upgrading WXT', 'upgrading.md'),
|
||||||
|
menuItem('Migrate to WXT', 'migrate.md'),
|
||||||
|
menuItem('How WXT Works', 'how-wxt-works.md'),
|
||||||
|
]),
|
||||||
|
]),
|
||||||
|
'/api/': menuRoot([
|
||||||
|
menuGroup(
|
||||||
|
'CLI Reference',
|
||||||
|
'/api/cli/',
|
||||||
|
[
|
||||||
|
menuItem('wxt', 'wxt.md'),
|
||||||
|
menuItem('wxt build', 'wxt-build.md'),
|
||||||
|
menuItem('wxt zip', 'wxt-zip.md'),
|
||||||
|
menuItem('wxt prepare', 'wxt-prepare.md'),
|
||||||
|
menuItem('wxt clean', 'wxt-clean.md'),
|
||||||
|
menuItem('wxt init', 'wxt-init.md'),
|
||||||
|
menuItem('wxt submit', 'wxt-submit.md'),
|
||||||
|
menuItem('wxt submit init', 'wxt-submit-init.md'),
|
||||||
],
|
],
|
||||||
},
|
true,
|
||||||
],
|
),
|
||||||
'/entrypoints/': [
|
menuGroup('API Reference', prepareTypedocSidebar(typedocSidebar), true),
|
||||||
{
|
]),
|
||||||
text: 'Entrypoints',
|
|
||||||
items: [
|
|
||||||
{ text: 'Background', link: '/entrypoints/background.md' },
|
|
||||||
{ text: 'Bookmarks', link: '/entrypoints/bookmarks.md' },
|
|
||||||
{
|
|
||||||
text: 'Content Scripts',
|
|
||||||
link: '/entrypoints/content-scripts.md',
|
|
||||||
},
|
|
||||||
{ text: 'CSS', link: '/entrypoints/css.md' },
|
|
||||||
{ text: 'Devtools', link: '/entrypoints/devtools.md' },
|
|
||||||
{ text: 'History', link: '/entrypoints/history.md' },
|
|
||||||
{ text: 'Newtab', link: '/entrypoints/newtab.md' },
|
|
||||||
{ text: 'Options', link: '/entrypoints/options.md' },
|
|
||||||
{ text: 'Popup', link: '/entrypoints/popup.md' },
|
|
||||||
{ text: 'Sandbox', link: '/entrypoints/sandbox.md' },
|
|
||||||
{ text: 'Sidepanel', link: '/entrypoints/sidepanel.md' },
|
|
||||||
{ text: 'Unlisted Pages', link: '/entrypoints/unlisted-pages.md' },
|
|
||||||
{
|
|
||||||
text: 'Unlisted Scripts',
|
|
||||||
link: '/entrypoints/unlisted-scripts.md',
|
|
||||||
},
|
|
||||||
].sort((l, r) => l.text.localeCompare(r.text)),
|
|
||||||
},
|
|
||||||
],
|
|
||||||
'/api/': [
|
|
||||||
{
|
|
||||||
items: [
|
|
||||||
{ text: 'CLI', link: '/api/cli.md' },
|
|
||||||
{ text: 'Config', link: '/api/config.md' },
|
|
||||||
{ text: 'wxt', link: '/api/wxt.md' },
|
|
||||||
{ text: 'wxt/browser', link: '/api/wxt-browser.md' },
|
|
||||||
{ text: 'wxt/client', link: '/api/wxt-client.md' },
|
|
||||||
],
|
|
||||||
},
|
|
||||||
],
|
|
||||||
},
|
},
|
||||||
|
|
||||||
socialLinks: [{ icon: 'github', link: 'https://github.com/wxt-dev/wxt' }],
|
|
||||||
},
|
},
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
import { createContentLoader } from 'vitepress';
|
||||||
|
|
||||||
|
export default createContentLoader('blog/*.md');
|
||||||
@@ -0,0 +1,61 @@
|
|||||||
|
import { resolve } from 'node:path';
|
||||||
|
import consola from 'consola';
|
||||||
|
import spawn from 'nano-spawn';
|
||||||
|
|
||||||
|
const cliDir = resolve('packages/wxt/src/cli/commands');
|
||||||
|
const cliDirGlob = resolve(cliDir, '**');
|
||||||
|
|
||||||
|
export default {
|
||||||
|
watch: [cliDirGlob],
|
||||||
|
async load() {
|
||||||
|
consola.info(`Generating CLI docs`);
|
||||||
|
|
||||||
|
const [wxt, build, zip, prepare, clean, init, submit, submitInit] =
|
||||||
|
await Promise.all([
|
||||||
|
getWxtHelp(''),
|
||||||
|
getWxtHelp('build'),
|
||||||
|
getWxtHelp('zip'),
|
||||||
|
getWxtHelp('prepare'),
|
||||||
|
getWxtHelp('clean'),
|
||||||
|
getWxtHelp('init'),
|
||||||
|
getPublishExtensionHelp(''),
|
||||||
|
getPublishExtensionHelp('init'),
|
||||||
|
]);
|
||||||
|
|
||||||
|
consola.success(`Generated CLI docs`);
|
||||||
|
return {
|
||||||
|
wxt,
|
||||||
|
build,
|
||||||
|
zip,
|
||||||
|
prepare,
|
||||||
|
clean,
|
||||||
|
init,
|
||||||
|
submit,
|
||||||
|
submitInit,
|
||||||
|
};
|
||||||
|
},
|
||||||
|
};
|
||||||
|
|
||||||
|
async function getHelp(command: string): Promise<string> {
|
||||||
|
const args = command.split(' ');
|
||||||
|
const res = await spawn(args[0], [...args.slice(1), '--help'], {
|
||||||
|
cwd: 'packages/wxt',
|
||||||
|
});
|
||||||
|
return res.stdout;
|
||||||
|
}
|
||||||
|
|
||||||
|
function getWxtHelp(command: string): Promise<string> {
|
||||||
|
return getHelp(`pnpm -s wxt ${command}`.trim());
|
||||||
|
}
|
||||||
|
|
||||||
|
async function getPublishExtensionHelp(command: string): Promise<string> {
|
||||||
|
const res = await getHelp(
|
||||||
|
`./node_modules/.bin/publish-extension ${command}`.trim(),
|
||||||
|
);
|
||||||
|
return res.replace(/\$ publish-extension/g, '$ wxt submit');
|
||||||
|
}
|
||||||
|
|
||||||
|
export interface Command {
|
||||||
|
name: string;
|
||||||
|
docs: string;
|
||||||
|
}
|
||||||
@@ -1,108 +0,0 @@
|
|||||||
import { relative, resolve } from 'node:path';
|
|
||||||
import { readFileSync, writeFileSync } from 'node:fs';
|
|
||||||
import { format } from 'prettier';
|
|
||||||
import consola from 'consola';
|
|
||||||
import { execaCommand } from 'execa';
|
|
||||||
|
|
||||||
let hasGenerated = false;
|
|
||||||
|
|
||||||
const cliDir = resolve('src/cli/commands');
|
|
||||||
const cliDirGlob = resolve(cliDir, '**');
|
|
||||||
const cliTemplatePath = resolve('docs/api/cli.tpl.md');
|
|
||||||
const cliPath = resolve('docs/api/cli.md');
|
|
||||||
|
|
||||||
const PREFACE = `<!--
|
|
||||||
DO NOT EDIT
|
|
||||||
Generated by \`wxt/docs/.vitepress/plugins/generate-config-docs.ts\`
|
|
||||||
To make changes to the config reference, update the JSDoc in \`src/core/types/external.ts\`.
|
|
||||||
-->`;
|
|
||||||
|
|
||||||
export function generateCliDocs() {
|
|
||||||
writeFileSync(cliPath, '');
|
|
||||||
|
|
||||||
const generateDocs = async () => {
|
|
||||||
consola.info(`Generating ${relative(process.cwd(), cliPath)}`);
|
|
||||||
try {
|
|
||||||
const res = await execaCommand('pnpm -s wxt --help');
|
|
||||||
const dev = splitInfo(res.stdout);
|
|
||||||
const lines: Array<string | string[]> = [
|
|
||||||
`## \`wxt\``,
|
|
||||||
'```sh',
|
|
||||||
dev.rest,
|
|
||||||
'```',
|
|
||||||
];
|
|
||||||
|
|
||||||
const commands = await Promise.all(
|
|
||||||
extractCommands(dev.info).map(async (command) => {
|
|
||||||
const res = await execaCommand(`pnpm -s wxt ${command} --help`);
|
|
||||||
const { rest: docs } = splitInfo(res.stdout);
|
|
||||||
return [`## \`wxt ${command}\``, '```sh', docs, '```'];
|
|
||||||
}),
|
|
||||||
);
|
|
||||||
lines.push(...commands);
|
|
||||||
|
|
||||||
const text = await format(
|
|
||||||
PREFACE +
|
|
||||||
'\n\n' +
|
|
||||||
readFileSync(cliTemplatePath, 'utf-8').replace(
|
|
||||||
'{{ DOCS }}',
|
|
||||||
lines.flat().join('\n'),
|
|
||||||
),
|
|
||||||
{ parser: 'markdown' },
|
|
||||||
);
|
|
||||||
|
|
||||||
writeFileSync(cliPath, text);
|
|
||||||
consola.success(`Generated ${relative(process.cwd(), cliPath)}`);
|
|
||||||
} catch (err) {
|
|
||||||
consola.fail(`Failed to generate ${relative(process.cwd(), cliPath)}`);
|
|
||||||
consola.error(err.message);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: 'docs:generate-cli-docs',
|
|
||||||
async config() {
|
|
||||||
if (!hasGenerated) {
|
|
||||||
hasGenerated = true;
|
|
||||||
await generateDocs();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
configureServer(server: any) {
|
|
||||||
server.watcher.add(cliDirGlob);
|
|
||||||
},
|
|
||||||
async handleHotUpdate(ctx: { file: string }) {
|
|
||||||
if (ctx.file === cliTemplatePath || ctx.file.includes(cliDir)) {
|
|
||||||
await generateDocs();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
|
|
||||||
function splitInfo(text: string): { info: string; rest: string } {
|
|
||||||
const infoStart = text.indexOf('For more info,');
|
|
||||||
const infoEnd = text.indexOf('\n\nOptions:');
|
|
||||||
|
|
||||||
if (infoStart === -1 || infoEnd === -1) {
|
|
||||||
return { info: '', rest: text };
|
|
||||||
}
|
|
||||||
|
|
||||||
const info = text.substring(infoStart, infoEnd).trim();
|
|
||||||
const rest = text.replace(info, '').trim().replace('\n\n\n\n', '\n\n');
|
|
||||||
|
|
||||||
return { info, rest };
|
|
||||||
}
|
|
||||||
|
|
||||||
function extractCommands(info: string): string[] {
|
|
||||||
const commands: string[] = [];
|
|
||||||
|
|
||||||
// Split the info by line and iterate through each line
|
|
||||||
info.split('\n').forEach((line) => {
|
|
||||||
// Use regex to capture the command after "$ wxt " and before "--help"
|
|
||||||
const match = line.match(/\$ wxt (\w+) --help/);
|
|
||||||
if (match && match[1]) {
|
|
||||||
commands.push(match[1]);
|
|
||||||
}
|
|
||||||
});
|
|
||||||
|
|
||||||
return commands;
|
|
||||||
}
|
|
||||||
@@ -1,145 +0,0 @@
|
|||||||
import { relative, resolve } from 'node:path';
|
|
||||||
import { Project, ts, Type, Node, JSDocableNode } from 'ts-morph';
|
|
||||||
import { readFileSync, writeFileSync } from 'node:fs';
|
|
||||||
import { format } from 'prettier';
|
|
||||||
import consola from 'consola';
|
|
||||||
|
|
||||||
let hasGenerated = false;
|
|
||||||
|
|
||||||
const externalTypesPath = resolve('src/core/types/external.ts');
|
|
||||||
const configTemplatePath = resolve('docs/api/config.tpl.md');
|
|
||||||
const configPath = resolve('docs/api/config.md');
|
|
||||||
|
|
||||||
const PREFACE = `<!--
|
|
||||||
DO NOT EDIT
|
|
||||||
Generated by \`wxt/docs/.vitepress/plugins/generate-config-docs.ts\`
|
|
||||||
To make changes to the config reference, update the JSDoc in \`src/core/types/external.ts\`.
|
|
||||||
-->`;
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Custom property paths that should not be recursively inspected. Usually 3rd party types.
|
|
||||||
*/
|
|
||||||
const LEAF_PATHS = ['imports', 'vite', 'server'];
|
|
||||||
|
|
||||||
/**
|
|
||||||
* Override any types that resolve to `import(...)` instead of their type names when calling
|
|
||||||
* `type.getText()`.
|
|
||||||
*
|
|
||||||
* This also stops any further type inspection for objects, meaning the object will be documented,
|
|
||||||
* not it's properties.
|
|
||||||
*/
|
|
||||||
const CUSTOM_TYPES = {
|
|
||||||
manifest:
|
|
||||||
'Manifest | Promise<Manifest> | () => Manifest | () => Promise<Manifest>',
|
|
||||||
imports: "false | Partial<import('unimport').UnimportOptions>",
|
|
||||||
vite: "Omit<import('vite').UserConfig, 'root' | 'configFile' | 'mode'>",
|
|
||||||
};
|
|
||||||
|
|
||||||
export function generateConfigDocs() {
|
|
||||||
writeFileSync(configPath, '');
|
|
||||||
|
|
||||||
const generateDocs = async () => {
|
|
||||||
consola.info(`Generating ${relative(process.cwd(), configPath)}`);
|
|
||||||
try {
|
|
||||||
const project = new Project({
|
|
||||||
tsConfigFilePath: resolve('tsconfig.json'),
|
|
||||||
});
|
|
||||||
|
|
||||||
// Load file containing "UserConfig"
|
|
||||||
const externalTypesFile = project.addSourceFileAtPath(externalTypesPath);
|
|
||||||
project.resolveSourceFileDependencies();
|
|
||||||
|
|
||||||
const inlineConfigInterface =
|
|
||||||
externalTypesFile.getInterfaceOrThrow('InlineConfig');
|
|
||||||
|
|
||||||
const getDocsFor = (path: string[], node: Node<ts.Node>): string[] => {
|
|
||||||
const pathStr = path.join('.');
|
|
||||||
|
|
||||||
let type: Type<ts.Type>;
|
|
||||||
if (node.isKind(ts.SyntaxKind.InterfaceDeclaration)) {
|
|
||||||
type = node.getType();
|
|
||||||
} else if (node.isKind(ts.SyntaxKind.PropertySignature)) {
|
|
||||||
type = node.getTypeNodeOrThrow()?.getType();
|
|
||||||
} else if (node.isKind(ts.SyntaxKind.MethodSignature)) {
|
|
||||||
type = node.getType();
|
|
||||||
} else {
|
|
||||||
throw Error('Unsupported type node: ' + node.getKindName());
|
|
||||||
}
|
|
||||||
|
|
||||||
if (type.isObject() && !type.isArray() && !CUSTOM_TYPES[pathStr]) {
|
|
||||||
return type.getProperties().flatMap((property) => {
|
|
||||||
const childPath = [...path, property.getName()];
|
|
||||||
|
|
||||||
return getDocsFor(childPath, property.getDeclarations()[0]);
|
|
||||||
});
|
|
||||||
}
|
|
||||||
|
|
||||||
if ('getJsDocs' in node) {
|
|
||||||
const lines: string[] = [];
|
|
||||||
const docs = (node as unknown as JSDocableNode).getJsDocs();
|
|
||||||
let typeText: string;
|
|
||||||
if (CUSTOM_TYPES[pathStr]) {
|
|
||||||
typeText = CUSTOM_TYPES[pathStr];
|
|
||||||
} else if (type.isUnion() && !type.isBoolean()) {
|
|
||||||
typeText = type
|
|
||||||
.getUnionTypes()
|
|
||||||
.map((type) => type.getText())
|
|
||||||
.join(' | ');
|
|
||||||
} else {
|
|
||||||
typeText = type.getText();
|
|
||||||
}
|
|
||||||
const defaultValue = docs
|
|
||||||
.flatMap((doc) => doc.getTags())
|
|
||||||
.find((tag) => tag.getTagName() === 'default')
|
|
||||||
?.getCommentText();
|
|
||||||
lines.push(
|
|
||||||
'',
|
|
||||||
`## ${pathStr}`,
|
|
||||||
'',
|
|
||||||
`- **Type**: \`${typeText}\``,
|
|
||||||
`- **Default**: \`${defaultValue}\``,
|
|
||||||
...docs.flatMap((doc) => doc.getDescription()),
|
|
||||||
);
|
|
||||||
return lines;
|
|
||||||
}
|
|
||||||
|
|
||||||
return [];
|
|
||||||
};
|
|
||||||
|
|
||||||
const lines = getDocsFor([], inlineConfigInterface);
|
|
||||||
const text = await format(
|
|
||||||
PREFACE +
|
|
||||||
'\n\n' +
|
|
||||||
readFileSync(configTemplatePath, 'utf-8').replace(
|
|
||||||
'{{ DOCS }}',
|
|
||||||
lines.join('\n'),
|
|
||||||
),
|
|
||||||
{ parser: 'markdown' },
|
|
||||||
);
|
|
||||||
|
|
||||||
writeFileSync(configPath, text);
|
|
||||||
consola.success(`Generated ${relative(process.cwd(), configPath)}`);
|
|
||||||
} catch (err) {
|
|
||||||
consola.fail(`Failed to generate ${relative(process.cwd(), configPath)}`);
|
|
||||||
consola.error(err.message);
|
|
||||||
}
|
|
||||||
};
|
|
||||||
|
|
||||||
return {
|
|
||||||
name: 'docs:generate-config-docs',
|
|
||||||
async config() {
|
|
||||||
if (!hasGenerated) {
|
|
||||||
hasGenerated = true;
|
|
||||||
await generateDocs();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
configureServer(server: any) {
|
|
||||||
server.watcher.add(externalTypesPath);
|
|
||||||
},
|
|
||||||
async handleHotUpdate(ctx: { file: string }) {
|
|
||||||
if ([externalTypesPath, configTemplatePath].includes(ctx.file)) {
|
|
||||||
await generateDocs();
|
|
||||||
}
|
|
||||||
},
|
|
||||||
};
|
|
||||||
}
|
|
||||||
@@ -1,77 +1,68 @@
|
|||||||
/* Colors */
|
/* Colors */
|
||||||
:root {
|
:root {
|
||||||
--wxt-c-green: #53bc4a;
|
--wxt-c-green-1: #0b8a00;
|
||||||
|
--wxt-c-green-2: #096600;
|
||||||
|
--wxt-c-green-3: #096600;
|
||||||
|
--wxt-c-green-soft: rgba(11, 138, 0, 0.14);
|
||||||
|
}
|
||||||
|
|
||||||
|
.dark {
|
||||||
--wxt-c-green-1: #67d45e;
|
--wxt-c-green-1: #67d45e;
|
||||||
--wxt-c-green-2: #4fa048;
|
--wxt-c-green-2: #329929;
|
||||||
--wxt-c-green-3: #447e3f;
|
--wxt-c-green-3: #21651b;
|
||||||
|
--wxt-c-green-soft: rgba(103, 212, 94, 0.14);
|
||||||
}
|
}
|
||||||
|
|
||||||
/* https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css */
|
/* https://github.com/vuejs/vitepress/blob/main/src/client/theme-default/styles/vars.css */
|
||||||
|
|
||||||
:root {
|
:root {
|
||||||
--vp-c-brand: var(--wxt-c-green);
|
|
||||||
--vp-c-brand-1: var(--wxt-c-green-1);
|
--vp-c-brand-1: var(--wxt-c-green-1);
|
||||||
--vp-c-brand-2: var(--wxt-c-green-2);
|
--vp-c-brand-2: var(--wxt-c-green-2);
|
||||||
--vp-c-brand-3: var(--wxt-c-green-3);
|
--vp-c-brand-3: var(--wxt-c-green-3);
|
||||||
|
--vp-c-brand-soft: var(--wxt-c-green-soft);
|
||||||
--vp-button-brand-bg: var(--wxt-c-green);
|
|
||||||
--vp-button-brand-hover-bg: var(--wxt-c-green-2);
|
|
||||||
--vp-button-brand-active-bg: var(--wxt-c-green-3);
|
|
||||||
|
|
||||||
--vp-code-link-color: var(--wxt-c-green);
|
|
||||||
|
|
||||||
/* --vp-c-text-1: var(--wxt-c-green-1); */
|
|
||||||
|
|
||||||
--vp-button-brand-text: var(--vp-c-black);
|
|
||||||
--vp-button-brand-hover-text: var(--vp-c-black);
|
|
||||||
--vp-button-brand-active-text: var(--vp-c-black);
|
|
||||||
|
|
||||||
--vp-custom-block-tip-border: var(--wxt-c-green);
|
|
||||||
--vp-custom-block-tip-text: var(--wxt-c-green);
|
|
||||||
|
|
||||||
/* --vp-code-block-bg: #222422;
|
|
||||||
--vp-code-copy-code-bg: #313431;
|
|
||||||
--vp-code-copy-code-hover-bg: #3c403c; */
|
|
||||||
|
|
||||||
--vp-custom-block-tip-bg: var(--vp-code-block-bg);
|
|
||||||
--vp-custom-block-info-bg: var(--vp-code-block-bg);
|
|
||||||
|
|
||||||
--vp-code-color: #476582;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
.vp-doc a {
|
/* Customize Individual Components */
|
||||||
color: var(--wxt-c-green);
|
|
||||||
}
|
|
||||||
|
|
||||||
.dark {
|
|
||||||
--vp-c-bg: #131413;
|
|
||||||
|
|
||||||
--vp-c-bg-soft: #1a1b1a;
|
|
||||||
--vp-c-bg-soft-up: #1f201f;
|
|
||||||
--vp-c-bg-soft-down: #262926;
|
|
||||||
--vp-c-bg-soft-mute: #242424;
|
|
||||||
|
|
||||||
--vp-c-bg-alt: #171817;
|
|
||||||
|
|
||||||
--vp-c-default: #313136;
|
|
||||||
--vp-c-default-1: #3a3a3c;
|
|
||||||
--vp-c-default-2: #505053;
|
|
||||||
--vp-c-default-3: #2c2c30;
|
|
||||||
--vp-c-default-soft: #252529;
|
|
||||||
|
|
||||||
--vp-code-block-bg: #191a19;
|
|
||||||
--vp-code-copy-code-bg: #212321;
|
|
||||||
--vp-code-copy-code-hover-bg: #292d29;
|
|
||||||
|
|
||||||
--vp-custom-block-info-bg: #191a19;
|
|
||||||
|
|
||||||
--vp-code-color: #c9def1;
|
|
||||||
}
|
|
||||||
|
|
||||||
.vp-doc .no-vertical-dividers th,
|
.vp-doc .no-vertical-dividers th,
|
||||||
.vp-doc .no-vertical-dividers td {
|
.vp-doc .no-vertical-dividers td {
|
||||||
border: none;
|
border: none;
|
||||||
}
|
}
|
||||||
|
|
||||||
.vp-doc .no-vertical-dividers tr {
|
.vp-doc .no-vertical-dividers tr {
|
||||||
border: 1px solid var(--vp-c-divider);
|
border: 1px solid var(--vp-c-divider);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
body {
|
||||||
|
overflow-y: scroll;
|
||||||
|
}
|
||||||
|
|
||||||
|
.VPSidebar {
|
||||||
|
user-select: none;
|
||||||
|
}
|
||||||
|
|
||||||
|
.VPSidebarItem .badge {
|
||||||
|
display: inline-block;
|
||||||
|
min-width: 1.6em;
|
||||||
|
padding: 0.3em 0.4em 0.2em;
|
||||||
|
border-radius: 1rem;
|
||||||
|
font-size: 0.75em;
|
||||||
|
line-height: 1;
|
||||||
|
margin-left: 0.5rem;
|
||||||
|
text-align: center;
|
||||||
|
vertical-align: middle;
|
||||||
|
background-color: var(--vp-c-default-2);
|
||||||
|
}
|
||||||
|
|
||||||
|
.light-netlify {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
.dark .light-netlify {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.dark-netlify {
|
||||||
|
display: none;
|
||||||
|
}
|
||||||
|
.dark .dark-netlify {
|
||||||
|
display: inline;
|
||||||
|
}
|
||||||
|
|||||||
@@ -2,13 +2,19 @@ import DefaultTheme from 'vitepress/theme';
|
|||||||
import Icon from '../components/Icon.vue';
|
import Icon from '../components/Icon.vue';
|
||||||
import EntrypointPatterns from '../components/EntrypointPatterns.vue';
|
import EntrypointPatterns from '../components/EntrypointPatterns.vue';
|
||||||
import UsingWxtSection from '../components/UsingWxtSection.vue';
|
import UsingWxtSection from '../components/UsingWxtSection.vue';
|
||||||
|
import ExampleSearch from '../components/ExampleSearch.vue';
|
||||||
|
import BlogLayout from '../components/BlogLayout.vue';
|
||||||
import './custom.css';
|
import './custom.css';
|
||||||
|
import 'virtual:group-icons.css';
|
||||||
|
|
||||||
export default {
|
export default {
|
||||||
extends: DefaultTheme,
|
extends: DefaultTheme,
|
||||||
enhanceApp(ctx) {
|
enhanceApp(ctx) {
|
||||||
ctx.app.component('Icon', Icon);
|
ctx.app
|
||||||
ctx.app.component('EntrypointPatterns', EntrypointPatterns);
|
.component('Icon', Icon)
|
||||||
ctx.app.component('UsingWxtSection', UsingWxtSection);
|
.component('EntrypointPatterns', EntrypointPatterns)
|
||||||
|
.component('UsingWxtSection', UsingWxtSection)
|
||||||
|
.component('ExampleSearch', ExampleSearch)
|
||||||
|
.component('blog', BlogLayout);
|
||||||
},
|
},
|
||||||
};
|
};
|
||||||
|
|||||||
@@ -0,0 +1,28 @@
|
|||||||
|
import { HeadConfig } from 'vitepress/types/shared';
|
||||||
|
|
||||||
|
export function meta(
|
||||||
|
property: string,
|
||||||
|
content: string,
|
||||||
|
options?: { useName: boolean },
|
||||||
|
): HeadConfig {
|
||||||
|
return [
|
||||||
|
'meta',
|
||||||
|
{
|
||||||
|
[options?.useName ? 'name' : 'property']: property,
|
||||||
|
content,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
|
|
||||||
|
export function script(
|
||||||
|
src: string,
|
||||||
|
props: Record<string, string> = {},
|
||||||
|
): HeadConfig {
|
||||||
|
return [
|
||||||
|
'script',
|
||||||
|
{
|
||||||
|
...props,
|
||||||
|
src,
|
||||||
|
},
|
||||||
|
];
|
||||||
|
}
|
||||||
@@ -0,0 +1,107 @@
|
|||||||
|
import { DefaultTheme } from 'vitepress';
|
||||||
|
|
||||||
|
type SidebarItem = DefaultTheme.SidebarItem;
|
||||||
|
type NavItem = DefaultTheme.NavItem;
|
||||||
|
type NavItemWithLink = DefaultTheme.NavItemWithLink;
|
||||||
|
type NavItemWithChildren = DefaultTheme.NavItemWithChildren;
|
||||||
|
type NavItemChildren = DefaultTheme.NavItemChildren;
|
||||||
|
|
||||||
|
export function navItem(text: string): NavItemChildren;
|
||||||
|
export function navItem(text: string, link: string): NavItemChildren;
|
||||||
|
export function navItem(text: string, items: any[]): NavItemWithChildren;
|
||||||
|
export function navItem(text: string, arg2?: unknown): any {
|
||||||
|
if (typeof arg2 === 'string') {
|
||||||
|
return { text, link: arg2 };
|
||||||
|
} else if (Array.isArray(arg2)) {
|
||||||
|
return { text, items: arg2 };
|
||||||
|
}
|
||||||
|
return { text };
|
||||||
|
}
|
||||||
|
|
||||||
|
export function menuRoot(items: SidebarItem[]) {
|
||||||
|
return items.map((item, index) => {
|
||||||
|
// item.collapsed = false; // uncomment to expand all level-0 items
|
||||||
|
return item;
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
export function menuGroup(
|
||||||
|
text: string,
|
||||||
|
items: SidebarItem[],
|
||||||
|
collapsible?: boolean,
|
||||||
|
): SidebarItem;
|
||||||
|
export function menuGroup(
|
||||||
|
text: string,
|
||||||
|
base: string,
|
||||||
|
items: SidebarItem[],
|
||||||
|
collapsible?: boolean,
|
||||||
|
): SidebarItem;
|
||||||
|
export function menuGroup(
|
||||||
|
text: string,
|
||||||
|
a: string | SidebarItem[],
|
||||||
|
b?: SidebarItem[] | boolean,
|
||||||
|
c?: boolean,
|
||||||
|
): SidebarItem {
|
||||||
|
if (typeof a === 'string' && Array.isArray(b)) {
|
||||||
|
return {
|
||||||
|
text,
|
||||||
|
base: a,
|
||||||
|
items: b,
|
||||||
|
collapsed: c,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
if (typeof a !== 'string' && !Array.isArray(b))
|
||||||
|
return {
|
||||||
|
text,
|
||||||
|
items: a,
|
||||||
|
collapsed: b,
|
||||||
|
};
|
||||||
|
|
||||||
|
throw Error('Unknown overload');
|
||||||
|
}
|
||||||
|
|
||||||
|
export function menuItems(items: SidebarItem[]) {
|
||||||
|
return {
|
||||||
|
items,
|
||||||
|
};
|
||||||
|
}
|
||||||
|
|
||||||
|
export function menuItem(
|
||||||
|
text: string,
|
||||||
|
link: string,
|
||||||
|
items?: SidebarItem[],
|
||||||
|
): SidebarItem {
|
||||||
|
if (items) {
|
||||||
|
return { text, link, items };
|
||||||
|
}
|
||||||
|
return { text, link };
|
||||||
|
}
|
||||||
|
|
||||||
|
/**
|
||||||
|
* Clean up and add badges to typedoc leaf sections
|
||||||
|
*/
|
||||||
|
export function prepareTypedocSidebar(items: SidebarItem[]) {
|
||||||
|
// skip contents file
|
||||||
|
const filtered = items.slice(1);
|
||||||
|
|
||||||
|
// remove Typedoc's collapse: true from text nodes
|
||||||
|
const prepareItems = (items: DefaultTheme.SidebarItem[], depth = 0) => {
|
||||||
|
for (const item of items) {
|
||||||
|
if (item.items) {
|
||||||
|
prepareItems(item.items, depth + 1);
|
||||||
|
const hasLeaves = item.items.some((item) => !item.items);
|
||||||
|
if (hasLeaves) {
|
||||||
|
item.text += ` <span class="badge">${item.items.length}</span>`;
|
||||||
|
}
|
||||||
|
} else {
|
||||||
|
delete item.collapsed;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
};
|
||||||
|
|
||||||
|
// process
|
||||||
|
prepareItems(filtered);
|
||||||
|
|
||||||
|
// return
|
||||||
|
return filtered;
|
||||||
|
}
|
||||||
@@ -0,0 +1,18 @@
|
|||||||
|
export interface Example {
|
||||||
|
name: string;
|
||||||
|
description?: string;
|
||||||
|
url: string;
|
||||||
|
searchText: string;
|
||||||
|
apis: string[];
|
||||||
|
permissions: string[];
|
||||||
|
packages: string[];
|
||||||
|
}
|
||||||
|
|
||||||
|
export type ExamplesMetadata = {
|
||||||
|
examples: Example[];
|
||||||
|
allApis: string[];
|
||||||
|
allPermissions: string[];
|
||||||
|
allPackages: string[];
|
||||||
|
};
|
||||||
|
|
||||||
|
export type KeySelectedObject = Record<string, boolean | undefined>;
|
||||||
@@ -0,0 +1 @@
|
|||||||
|
<!--@include: ../packages/analytics/README.md-->
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# CLI Reference
|
|
||||||
|
|
||||||
> Reference generated from `wxt <command> --help`
|
|
||||||
|
|
||||||
{{ DOCS }}
|
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# `wxt build`
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { data } from '../../.vitepress/loaders/cli.data.ts'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="language-sh vp-adaptive-theme active"><pre class="shiki shiki-themes github-light github-dark vp-code"><code>{{ data.build }}</code></pre></div>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# `wxt clean`
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { data } from '../../.vitepress/loaders/cli.data.ts'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="language-sh vp-adaptive-theme active"><pre class="shiki shiki-themes github-light github-dark vp-code"><code>{{ data.clean }}</code></pre></div>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# `wxt init`
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { data } from '../../.vitepress/loaders/cli.data.ts'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="language-sh vp-adaptive-theme active"><pre class="shiki shiki-themes github-light github-dark vp-code"><code>{{ data.init }}</code></pre></div>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# `wxt prepare`
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { data } from '../../.vitepress/loaders/cli.data.ts'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="language-sh vp-adaptive-theme active"><pre class="shiki shiki-themes github-light github-dark vp-code"><code>{{ data.prepare }}</code></pre></div>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# `wxt submit init`
|
||||||
|
|
||||||
|
> Alias for [`publish-browser-extension`](https://www.npmjs.com/package/publish-browser-extension)
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { data } from '../../.vitepress/loaders/cli.data.ts'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="language-sh vp-adaptive-theme active"><pre class="shiki shiki-themes github-light github-dark vp-code"><code>{{ data.submitInit }}</code></pre></div>
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
# `wxt submit`
|
||||||
|
|
||||||
|
> Alias for [`publish-browser-extension`](https://www.npmjs.com/package/publish-browser-extension)
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { data } from '../../.vitepress/loaders/cli.data.ts'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="language-sh vp-adaptive-theme active"><pre class="shiki shiki-themes github-light github-dark vp-code"><code>{{ data.submit }}</code></pre></div>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# `wxt zip`
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { data } from '../../.vitepress/loaders/cli.data.ts'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="language-sh vp-adaptive-theme active"><pre class="shiki shiki-themes github-light github-dark vp-code"><code>{{ data.zip }}</code></pre></div>
|
||||||
@@ -0,0 +1,7 @@
|
|||||||
|
# `wxt`
|
||||||
|
|
||||||
|
<script setup>
|
||||||
|
import { data } from '../../.vitepress/loaders/cli.data.ts'
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<div class="language-sh vp-adaptive-theme active"><pre class="shiki shiki-themes github-light github-dark vp-code"><code>{{ data.wxt }}</code></pre></div>
|
||||||
@@ -1,5 +0,0 @@
|
|||||||
# Config Reference
|
|
||||||
|
|
||||||
All the options you can use in your `wxt.config.ts` file.
|
|
||||||
|
|
||||||
{{ DOCS }}
|
|
||||||
@@ -1,10 +0,0 @@
|
|||||||
# `wxt/browser` Reference
|
|
||||||
|
|
||||||
:::warning 🚧 Under construction
|
|
||||||
This documentation does not exist yet. All APIs are documented with JSDoc, so for now, you can view the documentation in your editor.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
import { browser } from 'wxt/browser';
|
|
||||||
```
|
|
||||||
|
|
||||||
:::
|
|
||||||
@@ -1,14 +0,0 @@
|
|||||||
# `wxt/client` Reference
|
|
||||||
|
|
||||||
:::warning 🚧 Under construction
|
|
||||||
This documentation does not exist yet. All APIs are documented with JSDoc, so for now, you can view the documentation in your editor.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
import {
|
|
||||||
createContentScriptUi,
|
|
||||||
defineBackground,
|
|
||||||
defineContentScript,
|
|
||||||
} from 'wxt/client';
|
|
||||||
```
|
|
||||||
|
|
||||||
:::
|
|
||||||
@@ -1,17 +0,0 @@
|
|||||||
# `wxt` Reference
|
|
||||||
|
|
||||||
:::warning 🚧 Under construction
|
|
||||||
This documentation does not exist yet. All APIs are documented with JSDoc, so for now, you can view the documentation in your editor.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
import {
|
|
||||||
build,
|
|
||||||
clean,
|
|
||||||
createServer,
|
|
||||||
defineConfig,
|
|
||||||
defineRunnerConfig,
|
|
||||||
version,
|
|
||||||
} from 'wxt';
|
|
||||||
```
|
|
||||||
|
|
||||||
:::
|
|
||||||
Binary file not shown.
|
After Width: | Height: | Size: 131 KiB |
@@ -0,0 +1 @@
|
|||||||
|
<!--@include: ../packages/auto-icons/README.md-->
|
||||||
@@ -0,0 +1,9 @@
|
|||||||
|
---
|
||||||
|
layout: page
|
||||||
|
---
|
||||||
|
|
||||||
|
<script lang="ts" setup>
|
||||||
|
import BlogHome from './.vitepress/components/BlogHome.vue';
|
||||||
|
</script>
|
||||||
|
|
||||||
|
<BlogHome />
|
||||||
@@ -0,0 +1,12 @@
|
|||||||
|
---
|
||||||
|
layout: blog
|
||||||
|
title: Real World Messaging
|
||||||
|
description: |
|
||||||
|
The extension messaging APIs are difficult to learn. Let's go beyond the simple examples from Chrome and Firefox's documentation to build our own simple messaging system from scratch.
|
||||||
|
authors:
|
||||||
|
- name: Aaron Klinker
|
||||||
|
github: aklinker1
|
||||||
|
date: 2024-10-20T04:54:23.601Z
|
||||||
|
---
|
||||||
|
|
||||||
|
Test content **bold** _italic_
|
||||||
@@ -0,0 +1,76 @@
|
|||||||
|
---
|
||||||
|
layout: blog
|
||||||
|
title: Introducing <code>#imports</code>
|
||||||
|
description: Learn how WXT's new <code>#imports</code> module works and how to use it.
|
||||||
|
authors:
|
||||||
|
- name: Aaron Klinker
|
||||||
|
github: aklinker1
|
||||||
|
date: 2024-12-06T14:39:00.000Z
|
||||||
|
---
|
||||||
|
|
||||||
|
WXT v0.20 introduced a new way of manually importing its APIs: **the `#imports` module**. This module was introduced to simplify import statements and provide more visibility into all the APIs WXT provides.
|
||||||
|
|
||||||
|
<!-- prettier-ignore -->
|
||||||
|
```ts
|
||||||
|
import { browser } from 'wxt/browser'; // [!code --]
|
||||||
|
import { createShadowRootUi } from 'wxt/utils/content-script-ui/shadow-root'; // [!code --]
|
||||||
|
import { defineContentScript } from 'wxt/utils/define-content-script'; // [!code --]
|
||||||
|
import { injectScript } from 'wxt/utils/inject-script'; // [!code --]
|
||||||
|
import { // [!code ++]
|
||||||
|
browser, createShadowRootUi, defineContentScript, injectScript // [!code ++]
|
||||||
|
} from '#imports'; // [!code ++]
|
||||||
|
```
|
||||||
|
|
||||||
|
The `#imports` module is considered a "virtual module", because the file doesn't actually exist. At build-time, imports are split into individual statements for each API:
|
||||||
|
|
||||||
|
:::code-group
|
||||||
|
|
||||||
|
```ts [What you write]
|
||||||
|
import { defineContentScript, injectScript } from '#imports';
|
||||||
|
```
|
||||||
|
|
||||||
|
```ts [What the bundler sees]
|
||||||
|
import { defineContentScript } from 'wxt/utils/define-content-script';
|
||||||
|
import { injectScript } from 'wxt/utils/inject-script';
|
||||||
|
```
|
||||||
|
|
||||||
|
:::
|
||||||
|
|
||||||
|
Think of `#imports` as a convenient way to access all of WXT's APIs from one place, without impacting performance or bundle size.
|
||||||
|
|
||||||
|
This enables better tree-shaking compared to v0.19 and below.
|
||||||
|
|
||||||
|
:::tip Need to lookup the full import path of an API?
|
||||||
|
Open up your project's `.wxt/types/imports-module.d.ts` file.
|
||||||
|
:::
|
||||||
|
|
||||||
|
## Mocking
|
||||||
|
|
||||||
|
When writing tests, you might need to mock APIs from the `#imports` module. While mocking these APIs is very easy, it may not be immediately clear how to accomplish it.
|
||||||
|
|
||||||
|
Let's look at an example using Vitest. When [configured with `wxt/testing`](/guide/essentials/unit-testing#vitest), Vitest sees the same transformed code as the bundler. That means to mock an API from `#imports`, you need to call `vi.mock` with the real import path, not `#imports`:
|
||||||
|
|
||||||
|
```ts
|
||||||
|
import { injectScript } from '#imports';
|
||||||
|
import { vi } from 'vitest';
|
||||||
|
|
||||||
|
vi.mock('wxt/utils/inject-script')
|
||||||
|
const injectScriptMock = vi.mocked(injectScript);
|
||||||
|
|
||||||
|
injectScriptMock.mockReturnValueOnce(...);
|
||||||
|
```
|
||||||
|
|
||||||
|
## Conclusion
|
||||||
|
|
||||||
|
You don't have to use `#imports` if you don't like - you can continue importing APIs from their submodules. However, using `#imports` is the recommended approach moving forwards.
|
||||||
|
|
||||||
|
- As more APIs are added, you won't have to memorize additional import paths.
|
||||||
|
- If breaking changes are made to import paths in future major versions, `#imports` won't break.
|
||||||
|
|
||||||
|
Happy Coding 😄
|
||||||
|
|
||||||
|
> P.S. Yes, this is exactly how [Nuxt's `#imports`](https://nuxt.com/docs/guide/concepts/auto-imports#explicit-imports) works! We use the exact same library, [`unimport`](https://github.com/unjs/unimport).
|
||||||
|
|
||||||
|
---
|
||||||
|
|
||||||
|
[Discuss this blog post on Github](https://github.com/wxt-dev/wxt/discussions/1543).
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
# Background
|
|
||||||
|
|
||||||
[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/manifest/background/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/background)
|
|
||||||
|
|
||||||
For MV2, the background is added as a script to the background page. For MV3, the background becomes a service worker.
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['background.ts', 'background.js'],
|
|
||||||
['background/index.ts', 'background.js'],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
:::warning
|
|
||||||
The main function of the background **_CANNOT BE ASYNC_**. Event listeners must be added syncronously on background startup. If your main function returns a promise, WXT will log an error.
|
|
||||||
:::
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export default defineBackground(() => {
|
|
||||||
// Executed when background is loaded
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
or
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export default defineBackground({
|
|
||||||
// Set manifest options
|
|
||||||
persistent: undefined | true | false,
|
|
||||||
type: undefined | 'module',
|
|
||||||
|
|
||||||
// Set include/exclude if the background should be removed from some builds
|
|
||||||
include: undefined | string[],
|
|
||||||
exclude: undefined | string[],
|
|
||||||
|
|
||||||
// Executed when background is loaded
|
|
||||||
main() {
|
|
||||||
// ...
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
> All manifest options default to `undefined`.
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# Bookmarks
|
|
||||||
|
|
||||||
[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/override/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/chrome_url_overrides)
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['bookmarks.html', 'bookmarks.html'],
|
|
||||||
['bookmarks/index.html', 'bookmarks.html'],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Title</title>
|
|
||||||
<!-- Set include/exclude if the page should be removed from some builds -->
|
|
||||||
<meta name="manifest.include" content="['chrome', ...]" />
|
|
||||||
<meta name="manifest.exclude" content="['chrome', ...]" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<!-- ... -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
@@ -1,292 +0,0 @@
|
|||||||
# Content Scripts
|
|
||||||
|
|
||||||
[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/content_scripts/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/Content_scripts)
|
|
||||||
|
|
||||||
When creating content script entrypoints, they are automatically included in the `manifest.json` along with any CSS files they import.
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['content.(ts|tsx)', 'content-scripts/content.js'],
|
|
||||||
['content/index.(ts|tsx)', 'content-scripts/content.js'],
|
|
||||||
['<name>.content.(ts|tsx)', 'content-scripts/<name>.js'],
|
|
||||||
['<name>.content/index.(ts|tsx)', 'content-scripts/<name>.js'],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export default defineContentScript({
|
|
||||||
// Set manifest options
|
|
||||||
matches: ['*://google.com/*', '*://duckduckgo.com/*'],
|
|
||||||
excludeMatches: undefined | [],
|
|
||||||
includeGlobs: undefined | [],
|
|
||||||
excludeGlobs: undefined | [],
|
|
||||||
allFrames: undefined | [],
|
|
||||||
runAt: undefined | 'document_start' | 'document_end' | 'document_idle',
|
|
||||||
matchAboutBlank: undefined | true | false,
|
|
||||||
matchOriginAsFallback: undefined | true | false,
|
|
||||||
world: undefined | 'ISOLATED' | 'MAIN',
|
|
||||||
|
|
||||||
// Set include/exclude if the background should be removed from some builds
|
|
||||||
include: undefined | string[],
|
|
||||||
exclude: undefined | string[],
|
|
||||||
|
|
||||||
// Configure how CSS is injected onto the page
|
|
||||||
cssInjectionMode: undefined | "manifest" | "manual" | "ui",
|
|
||||||
|
|
||||||
main(ctx) {
|
|
||||||
// Executed when content script is loaded
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
> All manifest options default to `undefined`.
|
|
||||||
|
|
||||||
When defining multiple content scripts, content script entrypoints that have the same set of options will be merged into a single `content_script` item in the manifest.
|
|
||||||
|
|
||||||
## Context
|
|
||||||
|
|
||||||
Old content scripts are not automatically stopped when an extension updates and reloads. Often, this leads to "Invalidated context" errors in production when a content script from an old version of your extension tries to use a extension API.
|
|
||||||
|
|
||||||
WXT provides a utility for managing this process: `ContentScriptContext`. An instance of this class is provided to you automatically inside the `main` function of your content script.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export default defineContentScript({
|
|
||||||
// ...
|
|
||||||
main(ctx: ContentScriptContext) {
|
|
||||||
// Add custom listeners for stopping work
|
|
||||||
ctx.onInvalidated(() => {
|
|
||||||
// ...
|
|
||||||
});
|
|
||||||
|
|
||||||
// Stop fetch requests
|
|
||||||
fetch('...url', { signal: ctx.signal });
|
|
||||||
|
|
||||||
// Timeout utilities
|
|
||||||
ctx.setTimeout(() => {
|
|
||||||
// ...
|
|
||||||
}, 5e3);
|
|
||||||
ctx.setInterval(() => {
|
|
||||||
// ...
|
|
||||||
}, 60e3);
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
The class extends [`AbortController`](https://developer.mozilla.org/en-US/docs/Web/API/AbortController) and provides other utilities for stopping a content script's logic once it becomes invalidated.
|
|
||||||
|
|
||||||
:::tip
|
|
||||||
When working with content scripts, **you should always use the `ctx` object to stop any async or future work.**
|
|
||||||
|
|
||||||
This prevents old content scripts from interfering with new content scripts, and prevents error messages from the console in production.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## CSS
|
|
||||||
|
|
||||||
To include CSS with your content script, import the CSS file at the top of your entrypoint.
|
|
||||||
|
|
||||||
```
|
|
||||||
|
|
||||||
<srcDir>
|
|
||||||
└─ entrypoints/
|
|
||||||
└─ overlay.content/
|
|
||||||
├─ index.ts
|
|
||||||
└─ style.css
|
|
||||||
```
|
|
||||||
|
|
||||||
```ts
|
|
||||||
// entrypoints/overlay.content/index.ts
|
|
||||||
import './style.css';
|
|
||||||
|
|
||||||
export default defineContentScript({
|
|
||||||
matches: ['*://google.com/*', '*://duckduckgo.com/*'],
|
|
||||||
|
|
||||||
main(ctx) {
|
|
||||||
// ...
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
Any styles imported in your content script will be added to that content script's `css` array in your `manifest.json`:
|
|
||||||
|
|
||||||
```json
|
|
||||||
// .output/chrome-mv3/manifest.json
|
|
||||||
{
|
|
||||||
"content_scripts": [
|
|
||||||
{
|
|
||||||
"matches": ["*://google.com/*", "*://duckduckgo.com/*"],
|
|
||||||
"js": ["content-scripts/overlay.js"],
|
|
||||||
"css": ["content-scripts/overlay.css"]
|
|
||||||
}
|
|
||||||
]
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
To disable this behavior, set `cssInjectionMode` to `"manual"` or `"ui"`.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export default defineContentScript({
|
|
||||||
matches: ['*://google.com/*', '*://duckduckgo.com/*'],
|
|
||||||
cssInjectionMode: 'manual',
|
|
||||||
|
|
||||||
main(ctx) {
|
|
||||||
// ...
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## UI
|
|
||||||
|
|
||||||
WXT provides a utility function, `createContentScriptUi` to simplify mounting a UI from a content script. Internally, it uses the `ShadowRoot` API to isolate your CSS from the webpages.
|
|
||||||
|
|
||||||
`createContentScriptUi` requires a `ContentScriptContext` so that when the context is invalidated, the UI is automatically removed from the webpage.
|
|
||||||
|
|
||||||
:::details When to use `createContentScriptUi`
|
|
||||||
You should only use `createContentScriptUi` if you want your UI's styles isolated from the webpages. If you want to create a more "integrated" UI that uses the page's styles, you can just use the regular JS API's to append your UI to the page.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
const ui = document.createElement('div');
|
|
||||||
const anchor = document.querySelector('#anchor-selector');
|
|
||||||
anchor.append(ui);
|
|
||||||
```
|
|
||||||
|
|
||||||
:::
|
|
||||||
|
|
||||||
### Usage
|
|
||||||
|
|
||||||
To use `createContentScriptUi`, follow these steps:
|
|
||||||
|
|
||||||
1. Import your CSS file at the top of your content script
|
|
||||||
2. Set `cssInjectionMode: "ui"` inside `defineContentScript`
|
|
||||||
3. Call `createContentScriptUi`
|
|
||||||
4. Call `ui.mount()` to add the UI to the webpage
|
|
||||||
|
|
||||||
Here's a basic example:
|
|
||||||
|
|
||||||
```ts
|
|
||||||
// entrypoints/ui.content/index.ts
|
|
||||||
import './style.css';
|
|
||||||
|
|
||||||
export default defineContentScript({
|
|
||||||
// ...
|
|
||||||
cssInjectionMode: 'ui',
|
|
||||||
|
|
||||||
async main(ctx) {
|
|
||||||
const ui = await createContentScriptUi(ctx, {
|
|
||||||
name: 'example-ui',
|
|
||||||
type: 'inline',
|
|
||||||
anchor: '#some-element',
|
|
||||||
append: 'after',
|
|
||||||
mount(container) {
|
|
||||||
// Mount UI inside `container`...
|
|
||||||
},
|
|
||||||
});
|
|
||||||
|
|
||||||
// Yoy must call `mount` to add the UI to the page.
|
|
||||||
ui.mount();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
If you're using a frontend framework, you'll also need to include an `onRemoved` callback:
|
|
||||||
|
|
||||||
:::code-group
|
|
||||||
|
|
||||||
```ts [Vue]
|
|
||||||
import { createApp } from 'vue';
|
|
||||||
|
|
||||||
createContentScriptUi(ctx, {
|
|
||||||
// ...
|
|
||||||
mount(container) {
|
|
||||||
// Create a new app and mount it inside the container
|
|
||||||
const app = createApp(...);
|
|
||||||
app.mount(container);
|
|
||||||
return app;
|
|
||||||
},
|
|
||||||
onRemove(app) {
|
|
||||||
// When the UI is removed from the DOM, call unmount to stop the app
|
|
||||||
app.unmount();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
```ts [React]
|
|
||||||
import ReactDOM from 'react-dom/client';
|
|
||||||
|
|
||||||
createContentScriptUi(ctx, {
|
|
||||||
// ...
|
|
||||||
mount(container) {
|
|
||||||
// Create a root using the container and render your app
|
|
||||||
const root = ReactDOM.createRoot(container);
|
|
||||||
root.render(...);
|
|
||||||
return root;
|
|
||||||
},
|
|
||||||
onRemove(root) {
|
|
||||||
// When the UI is removed from the DOM, call unmount to stop the app
|
|
||||||
root.unmount();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
```ts [Svelte]
|
|
||||||
import App from './App.svelte';
|
|
||||||
|
|
||||||
createContentScriptUi(ctx, {
|
|
||||||
// ...
|
|
||||||
mount(container) {
|
|
||||||
// Mount your app component inside the container
|
|
||||||
return new App({
|
|
||||||
target: container,
|
|
||||||
});
|
|
||||||
},
|
|
||||||
onRemove(app) {
|
|
||||||
// When the UI is removed from the DOM, call $destroy to stop the app
|
|
||||||
app.$destroy();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
```ts [Solid]
|
|
||||||
import { render } from 'solid-js/web';
|
|
||||||
|
|
||||||
createContentScriptUi(ctx, {
|
|
||||||
// ...
|
|
||||||
mount(container) {
|
|
||||||
// Render your app component into the container
|
|
||||||
return render(() => ..., container)
|
|
||||||
},
|
|
||||||
onRemove(unmount) {
|
|
||||||
// When the UI is removed from the DOM, call unmount to stop the app
|
|
||||||
unmount();
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
:::
|
|
||||||
|
|
||||||
### `anchor`
|
|
||||||
|
|
||||||
The anchor dictates where the UI will be mounted.
|
|
||||||
|
|
||||||
### `append`
|
|
||||||
|
|
||||||
Customize where the UI get's appended to the DOM, relative to the `anchor` element.
|
|
||||||
|
|
||||||
### `type`
|
|
||||||
|
|
||||||
There are 3 types of UI's you can mount.
|
|
||||||
|
|
||||||
- `inline`: Shows up inline based on the `anchor` and `append` options
|
|
||||||
- `overlay`: Shows up inline, but styled to be 0px by 0px, with overflow visible. This causes the UI to overlay on top of the webpage's content
|
|
||||||
- `modal`: A fullscreen overlay that covers the entire screen, regardless of where it's anchored.
|
|
||||||
|
|
||||||
> TODO: Add visualization of the different UI types.
|
|
||||||
|
|
||||||
### Overlay `alignment`
|
|
||||||
|
|
||||||
Because the overlay UI type results in a 0px by 0px container being added to the webpage, the `alignment` option allows you to configure which corner of your UI is aligned with the 0x0 element.
|
|
||||||
|
|
||||||
> TODO: Add visualization of the different alignments.
|
|
||||||
@@ -1,44 +0,0 @@
|
|||||||
# CSS
|
|
||||||
|
|
||||||
WXT can build CSS entrypoints individually. CSS entrypoints are always unlisted.
|
|
||||||
|
|
||||||
See [Content Script CSS](/entrypoints/content-scripts#css) documentation for the recomended approach to include CSS with a content script.
|
|
||||||
|
|
||||||
:::info
|
|
||||||
If the recommended approach doesn't work for your use case, you can use any of the filename patterns below to build the styles separate from the JS and use the [`transformManifest` hook](/api/config#transformmanifest) to manually add your CSS file to the manifest.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['<name>.(css|scss|sass|less|styl|stylus)', '<name>.css'],
|
|
||||||
['<name>/index.(css|scss|sass|less|styl|stylus)', '<name>.css'],
|
|
||||||
['content.(css|scss|sass|less|styl|stylus)', 'content-scripts/content.css'],
|
|
||||||
['content/index.(css|scss|sass|less|styl|stylus)', 'content-scripts/content.css'],
|
|
||||||
['<name>.content.(css|scss|sass|less|styl|stylus)', 'content-scripts/<name>.css'],
|
|
||||||
['<name>.content/index.(css|scss|sass|less|styl|stylus)', 'content-scripts/<name>.css'],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
```css
|
|
||||||
body {
|
|
||||||
/* Plain CSS file */
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
Follow Vite's guide to setup a preprocessor: https://vitejs.dev/guide/features.html#css-pre-processors
|
|
||||||
|
|
||||||
```sh
|
|
||||||
pnpm i sass
|
|
||||||
```
|
|
||||||
|
|
||||||
```scss
|
|
||||||
body {
|
|
||||||
h1 {
|
|
||||||
/* ...*/
|
|
||||||
}
|
|
||||||
}
|
|
||||||
```
|
|
||||||
@@ -1,33 +0,0 @@
|
|||||||
# Devtools
|
|
||||||
|
|
||||||
[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/devtools/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/devtools_page)
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['devtools.html', 'devtools.html'],
|
|
||||||
['devtools/index.html', 'devtools.html'],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
Plain old HTML file.
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Title</title>
|
|
||||||
<!-- Set include/exclude if the page should be removed from some builds -->
|
|
||||||
<meta name="manifest.include" content="['chrome', ...]" />
|
|
||||||
<meta name="manifest.exclude" content="['chrome', ...]" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<!-- ... -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# History
|
|
||||||
|
|
||||||
[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/override/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/chrome_url_overrides)
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['history.html', 'history.html'],
|
|
||||||
['history/index.html', 'history.html'],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Title</title>
|
|
||||||
<!-- Set include/exclude if the page should be removed from some builds -->
|
|
||||||
<meta name="manifest.include" content="['chrome', ...]" />
|
|
||||||
<meta name="manifest.exclude" content="['chrome', ...]" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<!-- ... -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
@@ -1,120 +0,0 @@
|
|||||||
# Manifest.json
|
|
||||||
|
|
||||||
The manifest.json is generated at build-time based on files in your `entrypoints` directory and your `wxt.config.ts`.
|
|
||||||
|
|
||||||
## Confiuration
|
|
||||||
|
|
||||||
While entrypoints are generated and added to the manifest at build-time, you can customize or add to your `manifest.json` in the config file.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
import { defineConfig } from 'wxt';
|
|
||||||
|
|
||||||
export default defineConfig({
|
|
||||||
manifest: {
|
|
||||||
host_permissions: ['*://google.com/*'],
|
|
||||||
content_security_policy: {
|
|
||||||
// ...
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## `name`
|
|
||||||
|
|
||||||
If not provided via the `manifest` config, the [manifest's `name`](https://developer.chrome.com/docs/extensions/mv3/manifest/name/) defaults to your package.json's `name` property.
|
|
||||||
|
|
||||||
## `version` and `version_name`
|
|
||||||
|
|
||||||
The [manifest's `version` and `version_name`](https://developer.chrome.com/docs/extensions/mv3/manifest/version/) fields are based on your package.json's `version` property.
|
|
||||||
|
|
||||||
- `version_name` is the exact string listed in your package.json
|
|
||||||
- `version` is the string cleaned up, with any invalid suffixes removed
|
|
||||||
|
|
||||||
### Example
|
|
||||||
|
|
||||||
```json
|
|
||||||
// package.json
|
|
||||||
{
|
|
||||||
"version": "1.3.0-alpha2"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
```json
|
|
||||||
// .output/<dir>/manifest.json
|
|
||||||
{
|
|
||||||
"version": "1.3.0",
|
|
||||||
"version_name": "1.3.0-alpha2"
|
|
||||||
}
|
|
||||||
```
|
|
||||||
|
|
||||||
## `icons`
|
|
||||||
|
|
||||||
By default, WXT will discover icons in your [`public` directory](/guide/assets#public-directory) and use them for the [manifest's `icons`](https://developer.chrome.com/docs/extensions/mv3/manifest/icons/).
|
|
||||||
|
|
||||||
```
|
|
||||||
public/
|
|
||||||
├─ icon-16.png
|
|
||||||
├─ icon-24.png
|
|
||||||
├─ icon-48.png
|
|
||||||
├─ icon-96.png
|
|
||||||
└─ icon-128.png
|
|
||||||
```
|
|
||||||
|
|
||||||
Icon files need to match the following regex to be automatically included in the manifest. Most design software can output icons in one of these formats
|
|
||||||
|
|
||||||
<<< @/../src/core/utils/manifest.ts#snippet
|
|
||||||
|
|
||||||
If you prefer to use filenames in a different format, you can add the icons manually in your `wxt.config.ts` file:
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export default defineConfig({
|
|
||||||
manifest: {
|
|
||||||
icons: {
|
|
||||||
16: '/extension-icon-16.png',
|
|
||||||
24: '/extension-icon-24.png',
|
|
||||||
48: '/extension-icon-48.png',
|
|
||||||
96: '/extension-icon-96.png',
|
|
||||||
128: '/extension-icon-128.png',
|
|
||||||
},
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## `permissions`
|
|
||||||
|
|
||||||
[Permissions](https://developer.chrome.com/docs/extensions/reference/permissions/) must be listed in the manifest config.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export default defineConfig({
|
|
||||||
manifest: {
|
|
||||||
permissions: ['storage', 'tabs'],
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
|
|
||||||
## Localization
|
|
||||||
|
|
||||||
Similar to the icon, the [`_locales` directory](https://developer.chrome.com/docs/extensions/reference/i18n/) should be placed inside the the WXT's [`public` directory](/guide/assets#public-directory).
|
|
||||||
|
|
||||||
```
|
|
||||||
public/
|
|
||||||
└─ _locales/
|
|
||||||
├─ en/
|
|
||||||
│ └─ messages.json
|
|
||||||
├─ es/
|
|
||||||
│ └─ messages.json
|
|
||||||
└─ ko/
|
|
||||||
└─ messages.json
|
|
||||||
```
|
|
||||||
|
|
||||||
Then you'll need to explicitly override the `name` and `description` properties in your config for them to be localized.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
export default defineConfig({
|
|
||||||
manifest: {
|
|
||||||
name: '__MSG_extName__',
|
|
||||||
description: '__MSG_extDescription__',
|
|
||||||
default_locale: 'en',
|
|
||||||
},
|
|
||||||
});
|
|
||||||
```
|
|
||||||
@@ -1,31 +0,0 @@
|
|||||||
# Newtab
|
|
||||||
|
|
||||||
[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/override/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/chrome_url_overrides)
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['newtab.html', 'newtab.html'],
|
|
||||||
['newtab/index.html', 'newtab.html'],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Title</title>
|
|
||||||
<!-- Set include/exclude if the page should be removed from some builds -->
|
|
||||||
<meta name="manifest.include" content="['chrome', ...]" />
|
|
||||||
<meta name="manifest.exclude" content="['chrome', ...]" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<!-- ... -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
@@ -1,36 +0,0 @@
|
|||||||
# Options
|
|
||||||
|
|
||||||
[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/options/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/options_ui)
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['options.html', 'options.html'],
|
|
||||||
['options/index.html', 'options.html'],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Options Title</title>
|
|
||||||
<meta name="manifest.open_in_tab" content="true|false" />
|
|
||||||
<meta name="manifest.chrome_style" content="true|false" />
|
|
||||||
<meta name="manifest.browser_style" content="true|false" />
|
|
||||||
<!-- Set include/exclude if the page should be removed from some builds -->
|
|
||||||
<meta name="manifest.include" content="['chrome', ...]" />
|
|
||||||
<meta name="manifest.exclude" content="['chrome', ...]" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<!-- ... -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
|
|
||||||
> All manifest options default to `undefined` when the `meta` tag is not present.
|
|
||||||
@@ -1,42 +0,0 @@
|
|||||||
# Popup
|
|
||||||
|
|
||||||
[Chrome Docs](https://developer.chrome.com/docs/extensions/reference/action/) • [Firefox Docs](https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/action)
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['popup.html', 'popup.html'],
|
|
||||||
['popup/index.html', 'popup.html'],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Default Popup Title</title>
|
|
||||||
<meta
|
|
||||||
name="manifest.default_icon"
|
|
||||||
content="{
|
|
||||||
16: '/icon-16.png',
|
|
||||||
24: '/icon-24.png',
|
|
||||||
...
|
|
||||||
}"
|
|
||||||
/>
|
|
||||||
<meta name="manifest.type" content="page_action|browser_action" />
|
|
||||||
<!-- Set include/exclude if the page should be removed from some builds -->
|
|
||||||
<meta name="manifest.include" content="['chrome', ...]" />
|
|
||||||
<meta name="manifest.exclude" content="['chrome', ...]" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<!-- ... -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
|
|
||||||
> All manifest options default to `undefined` when the `meta` tag is not present.
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# Sandbox
|
|
||||||
|
|
||||||
[Chrome Docs](https://developer.chrome.com/docs/extensions/mv3/manifest/sandbox/)
|
|
||||||
|
|
||||||
:::tip Chromium Only
|
|
||||||
Firefox does not support sandboxed pages.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['entrypoints/sandbox.html', 'sandbox.html'],
|
|
||||||
['entrypoints/sandbox/index.html', 'sandbox.html'],
|
|
||||||
['entrypoints/<name>.sandbox.html', '<name>.html` '],
|
|
||||||
['entrypoints/<name>.sandbox/index.html', '<name>.html` '],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Title</title>
|
|
||||||
<!-- Set include/exclude if the page should be removed from some builds -->
|
|
||||||
<meta name="manifest.include" content="['chrome', ...]" />
|
|
||||||
<meta name="manifest.exclude" content="['chrome', ...]" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<!-- ... -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
@@ -1,37 +0,0 @@
|
|||||||
# Side Panel
|
|
||||||
|
|
||||||
[Chrome Docs](https://developer.chrome.com/docs/extensions/reference/sidePanel/)
|
|
||||||
|
|
||||||
:::tip Chromium Only
|
|
||||||
Firefox does not support sidepanel pages.
|
|
||||||
:::
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['entrypoints/sidepanel.html', 'sidepanel.html'],
|
|
||||||
['entrypoints/sidepanel/index.html', 'sidepanel.html'],
|
|
||||||
['entrypoints/<name>.sidepanel.html', '<name>.html` '],
|
|
||||||
['entrypoints/<name>.sidepanel/index.html', '<name>.html` '],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Title</title>
|
|
||||||
<!-- Set include/exclude if the page should be removed from some builds -->
|
|
||||||
<meta name="manifest.include" content="['chrome', ...]" />
|
|
||||||
<meta name="manifest.exclude" content="['chrome', ...]" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<!-- ... -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
@@ -1,47 +0,0 @@
|
|||||||
# Unlisted Pages
|
|
||||||
|
|
||||||
HTML pages that are built by Vite, but are not included in the manifest.
|
|
||||||
|
|
||||||
### Examples
|
|
||||||
|
|
||||||
- Onboarding
|
|
||||||
- Dashboard
|
|
||||||
- FAQ
|
|
||||||
- Help
|
|
||||||
- Changelog
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['<name>.html', '<name>.html'],
|
|
||||||
['<name>/index.html', '<name>.html'],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
Pages are accessible at `'/<name>.html'`:
|
|
||||||
|
|
||||||
```ts
|
|
||||||
const url = browser.runtime.getURL('/<name>.html');
|
|
||||||
|
|
||||||
console.log(url); // "chrome-extension://<id>/<name>.html"
|
|
||||||
```
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
```html
|
|
||||||
<!doctype html>
|
|
||||||
<html lang="en">
|
|
||||||
<head>
|
|
||||||
<meta charset="UTF-8" />
|
|
||||||
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
||||||
<title>Title</title>
|
|
||||||
<!-- Set include/exclude if the page should be removed from some builds -->
|
|
||||||
<meta name="manifest.include" content="['chrome', ...]" />
|
|
||||||
<meta name="manifest.exclude" content="['chrome', ...]" />
|
|
||||||
</head>
|
|
||||||
<body>
|
|
||||||
<!-- ... -->
|
|
||||||
</body>
|
|
||||||
</html>
|
|
||||||
```
|
|
||||||
@@ -1,20 +0,0 @@
|
|||||||
# Unlisted Scripts
|
|
||||||
|
|
||||||
TypeScript files that are built, but are not included in the manifest.
|
|
||||||
|
|
||||||
## Filenames
|
|
||||||
|
|
||||||
<EntrypointPatterns
|
|
||||||
:patterns="[
|
|
||||||
['<name>.(ts|tsx)', '<name>.js'],
|
|
||||||
['<name>/index.(ts|tsx)', '<name>.js'],
|
|
||||||
]"
|
|
||||||
/>
|
|
||||||
|
|
||||||
## Definition
|
|
||||||
|
|
||||||
Unlike the background or content scripts, you can define this script's logic in the top level scope.
|
|
||||||
|
|
||||||
```ts
|
|
||||||
// Code goes here
|
|
||||||
```
|
|
||||||
@@ -0,0 +1,19 @@
|
|||||||
|
---
|
||||||
|
layout: page
|
||||||
|
---
|
||||||
|
|
||||||
|
<style>
|
||||||
|
.examples-container {
|
||||||
|
padding: 32px;
|
||||||
|
}
|
||||||
|
</style>
|
||||||
|
|
||||||
|
<div class="examples-container">
|
||||||
|
<div class="vp-doc">
|
||||||
|
<h1>Examples</h1>
|
||||||
|
</div>
|
||||||
|
|
||||||
|
<br />
|
||||||
|
|
||||||
|
<ExampleSearch />
|
||||||
|
</div>
|
||||||
Some files were not shown because too many files have changed in this diff Show More
Reference in New Issue
Block a user