) => {
28 | const list = props.lists.find((l) => l.slug === rp.match.params.listSlug);
29 | return list ? (
30 |
40 | ) : props.lists && props.lists.length ? (
41 |
42 | ) : null;
43 | };
44 | return ;
45 | };
46 |
--------------------------------------------------------------------------------
/web/src/components/listsTable/ListsTableHoc.tsx:
--------------------------------------------------------------------------------
1 | import { RouteComponentProps } from "react-router-dom";
2 | import {
3 | useLanguages,
4 | useLicenses,
5 | useLists,
6 | useMaintainers,
7 | useSoftware,
8 | useSyntaxes,
9 | useTags,
10 | } from "../../hooks";
11 | import { ListDrawer } from "./ListDrawer";
12 | import { ListsTable } from "./ListsTable";
13 |
14 | export const ListsTableHoc = (props: RouteComponentProps) => {
15 | const lists = useLists();
16 | const languages = useLanguages();
17 | const licenses = useLicenses();
18 | const maintainers = useMaintainers();
19 | const software = useSoftware();
20 | const syntaxes = useSyntaxes();
21 | const tags = useTags();
22 | return (
23 | <>
24 |
34 |
43 | >
44 | );
45 | };
46 |
--------------------------------------------------------------------------------
/web/src/components/listsTable/arraySorter.ts:
--------------------------------------------------------------------------------
1 | interface ArraySortableEntity {
2 | id: number;
3 | name: string;
4 | }
5 |
6 | export const arraySorter = (
7 | a: number[],
8 | b: number[],
9 | entities: ArraySortableEntity[],
10 | ) =>
11 | a && a.length
12 | ? b && b.length
13 | ? a.length === b.length
14 | ? entities
15 | .filter((e: ArraySortableEntity) => a.includes(e.id))
16 | .map((e: ArraySortableEntity) => e.name)
17 | .join()
18 | .toLowerCase() >
19 | entities
20 | .filter((e: ArraySortableEntity) => b.includes(e.id))
21 | .map((e: ArraySortableEntity) => e.name)
22 | .join()
23 | .toLowerCase()
24 | ? 1
25 | : -1
26 | : a.length > b.length
27 | ? -1
28 | : 1
29 | : -1
30 | : 1;
31 |
--------------------------------------------------------------------------------
/web/src/components/listsTable/index.ts:
--------------------------------------------------------------------------------
1 | import { ListsTableHoc } from "./ListsTableHoc";
2 |
3 | export { ListsTableHoc as ListsTable };
4 |
--------------------------------------------------------------------------------
/web/src/components/maintainerCloud/MaintainerCloud.tsx:
--------------------------------------------------------------------------------
1 | import { Tag } from "antd";
2 | import { Maintainer } from "../../interfaces/Maintainer";
3 |
4 | interface Props {
5 | maintainers: Maintainer[];
6 | }
7 |
8 | export const MaintainerCloud = (props: Props) =>
9 | props.maintainers && props.maintainers.length ? (
10 |
11 | {props.maintainers.map((m: Maintainer, i: number) =>
12 | m.url ? (
13 |
14 |
20 | {m.name}
21 |
22 |
23 | ) : (
24 |
{m.name}
25 | ),
26 | )}
27 |
28 | ) : null;
29 |
--------------------------------------------------------------------------------
/web/src/components/maintainerCloud/index.ts:
--------------------------------------------------------------------------------
1 | import { MaintainerCloud } from "./MaintainerCloud";
2 |
3 | export { MaintainerCloud };
4 |
--------------------------------------------------------------------------------
/web/src/components/maintainers/Maintainers.tsx:
--------------------------------------------------------------------------------
1 | import "./maintainers.css";
2 | import { HomeOutlined, MailOutlined, TwitterOutlined } from "@ant-design/icons";
3 | import { Card } from "antd";
4 | import { Maintainer } from "../../interfaces/Maintainer";
5 |
6 | interface Props {
7 | maintainers: Maintainer[];
8 | }
9 |
10 | export const Maintainers = (props: Props) =>
11 | props.maintainers && props.maintainers.length ? (
12 | <>
13 | Maintainer{props.maintainers.length > 1 ? "s" : ""}:
14 | {props.maintainers.map((m: Maintainer, index: number) => (
15 |
16 | ))}
17 | >
18 | ) : null;
19 |
20 | interface MaintainerComponentProps {
21 | maintainer: Maintainer;
22 | }
23 |
24 | const MaintainerComponent = (props: MaintainerComponentProps) => {
25 | let actions = [];
26 | if (props.maintainer.url) {
27 | actions.push(
28 |
34 |
35 | ,
36 | );
37 | }
38 | if (props.maintainer.emailAddress) {
39 | actions.push(
40 |
46 |
47 | ,
48 | );
49 | }
50 | if (props.maintainer.twitterHandle) {
51 | actions.push(
52 |
58 |
59 | ,
60 | );
61 | }
62 | return ;
63 | };
64 |
--------------------------------------------------------------------------------
/web/src/components/maintainers/index.ts:
--------------------------------------------------------------------------------
1 | import { Maintainers } from "./Maintainers";
2 |
3 | export { Maintainers };
4 |
--------------------------------------------------------------------------------
/web/src/components/maintainers/maintainers.css:
--------------------------------------------------------------------------------
1 | .ant-card-body {
2 | display: none;
3 | }
4 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/SoftwareCloud.tsx:
--------------------------------------------------------------------------------
1 | import { Software } from "../../interfaces/Software";
2 | import { SoftwareIcon } from "./SoftwareIcon";
3 |
4 | interface Props {
5 | software: Software[];
6 | showLabel?: boolean;
7 | }
8 |
9 | export const SoftwareCloud = (props: Props) =>
10 | props.software && props.software.length ? (
11 |
12 | {props.showLabel &&
{`Software:`}
}
13 | {props.software.map((s: Software, i: number) =>
14 | s.homeUrl ? (
15 |
25 |
26 |
27 | ) : (
28 |
29 | ),
30 | )}
31 |
32 | ) : null;
33 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/SoftwareIcon.tsx:
--------------------------------------------------------------------------------
1 | import {
2 | img01,
3 | img02,
4 | img03,
5 | img04,
6 | img05,
7 | img06,
8 | img07,
9 | img08,
10 | img10,
11 | img11,
12 | img12,
13 | img13,
14 | img14,
15 | img15,
16 | img16,
17 | img17,
18 | img18,
19 | img19,
20 | img20,
21 | img21,
22 | img22,
23 | img23,
24 | img24,
25 | img25,
26 | img26,
27 | img27,
28 | img28,
29 | img29,
30 | img30,
31 | img31,
32 | img32,
33 | img33,
34 | img34,
35 | img35,
36 | img36,
37 | img37,
38 | img38,
39 | img39,
40 | img40,
41 | img41,
42 | img42,
43 | img43,
44 | img44,
45 | img45,
46 | img46,
47 | img47,
48 | } from "./imgs";
49 |
50 | interface Props {
51 | id: number;
52 | }
53 |
54 | export const SoftwareIcon = (props: Props) =>
55 | icons[props.id] ? (
56 |
62 | ) : null;
63 |
64 | interface Icon {
65 | image: any;
66 | imageTitle: string;
67 | }
68 |
69 | const icons: { [id: number]: Icon } = {
70 | 1: { image: img01, imageTitle: "uBlock Origin" },
71 | 2: { image: img02, imageTitle: "Adblock Plus" },
72 | 3: { image: img03, imageTitle: "AdGuard (free versions)" },
73 | 4: { image: img04, imageTitle: "DNS66" },
74 | 5: { image: img05, imageTitle: "Nano Adblocker" },
75 | 6: { image: img06, imageTitle: "AdBlock" },
76 | 7: { image: img07, imageTitle: "AdAway" },
77 | 8: { image: img08, imageTitle: "Personal Blocklist" },
78 | 10: { image: img10, imageTitle: "Redirector" },
79 | 11: { image: img11, imageTitle: "Hosts File Editor" },
80 | 12: { image: img12, imageTitle: "Gas Mask" },
81 | 13: { image: img13, imageTitle: "MinerBlock" },
82 | 14: { image: img14, imageTitle: "Pi-hole" },
83 | 15: { image: img15, imageTitle: "uBlock" },
84 | 16: { image: img16, imageTitle: "Internet Explorer (TPL)" },
85 | 17: { image: img17, imageTitle: "Google Hit Hider by Domain" },
86 | 18: { image: img18, imageTitle: "FireHOL" },
87 | 19: { image: img19, imageTitle: "Samsung Knox" },
88 | 20: { image: img20, imageTitle: "Little Snitch" },
89 | 21: { image: img21, imageTitle: "Privoxy" },
90 | 22: { image: img22, imageTitle: "Diversion" },
91 | 23: { image: img23, imageTitle: "dnsmasq" },
92 | 24: { image: img24, imageTitle: "Slimjet" },
93 | 25: { image: img25, imageTitle: "uMatrix" },
94 | 26: { image: img26, imageTitle: "Blokada" },
95 | 27: { image: img27, imageTitle: "hostsmgr" },
96 | 28: { image: img28, imageTitle: "personalDNSfilter" },
97 | 29: { image: img29, imageTitle: "Unbound" },
98 | 30: { image: img30, imageTitle: "BIND" },
99 | 31: { image: img31, imageTitle: "AdGuard Home" },
100 | 32: { image: img32, imageTitle: "AdNauseam" },
101 | 33: { image: img33, imageTitle: "Legacy Unix derivatives" },
102 | 34: { image: img34, imageTitle: "Windows command line" },
103 | 35: { image: img35, imageTitle: "Shadowsocks" },
104 | 36: { image: img36, imageTitle: "ShadowsocksR" },
105 | 37: { image: img37, imageTitle: "Shadowrocket" },
106 | 38: { image: img38, imageTitle: "DNSRedirector" },
107 | 39: { image: img39, imageTitle: "pfBlockerNG" },
108 | 40: { image: img40, imageTitle: "Opera's built-in adblocker" },
109 | 41: { image: img41, imageTitle: "Surge" },
110 | 42: { image: img42, imageTitle: "dnscrypt-proxy" },
111 | 43: { image: img43, imageTitle: "SmartDNS" },
112 | 44: { image: img44, imageTitle: "AdGuard for Windows/macOS" },
113 | 45: { image: img45, imageTitle: "AdGuard for Android" },
114 | 46: { image: img46, imageTitle: "Vivaldi's Privacy settings" },
115 | 47: { image: img47, imageTitle: "Polish Cookie Consent" },
116 | };
117 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/01-uBlock-Origin.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/02-Adblock-Plus.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/03-AdGuard.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/04-DNS66.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/04-DNS66.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/05-Nano-Adblocker.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/05-Nano-Adblocker.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/06-AdBlock.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/06-AdBlock.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/07-AdAway.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/07-AdAway.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/08-Personal-Blocklist.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/08-Personal-Blocklist.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/10-Redirector.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/10-Redirector.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/11-Hosts-File-Editor.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/11-Hosts-File-Editor.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/12-Gas-Mask.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/12-Gas-Mask.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/13-MinerBlock.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/14-Pi-hole.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/15-uBlock.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/16-Internet-Explorer-TPL.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/17-Google-Hit-Hider-by-Domain.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/17-Google-Hit-Hider-by-Domain.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/17-Google-Hit-Hider-by-Domain.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/18-FireHOL.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/18-FireHOL.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/19-Samsung-Knox.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/19-Samsung-Knox.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/19-Samsung-Knox.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/20-Little-Snitch.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/20-Little-Snitch.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/21-Privoxy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/21-Privoxy.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/22-Diversion.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/22-Diversion.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/22-Diversion.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/23-dnsmasq.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/23-dnsmasq.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/24-Slimjet.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/24-Slimjet.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/25-uMatrix.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/25-uMatrix.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/26-Blokada.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/26-Blokada.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/27-hostsmgr.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/27-hostsmgr.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/28-personalDNSfilter.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/29-Unbound.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/29-Unbound.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/30-BIND.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/30-BIND.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/31-AdGuard-Home.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/31-AdGuard-Home.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/31-AdGuard-Home.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/32-AdNauseam.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/32-AdNauseam.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/33-Legacy-Unix-Derivatives.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/33-Legacy-Unix-Derivatives.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/34-Windows-command-line.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/34-Windows-command-line.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/35-Shadowsocks.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/35-Shadowsocks.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/36-ShadowsocksR.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/36-ShadowsocksR.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/37-Shadowrocket.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/37-Shadowrocket.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/38-DNSRedirector.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/38-DNSRedirector.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/39-pfBlockerNG.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/39-pfBlockerNG.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/40-Opera.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/40-Opera.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/41-Surge.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/41-Surge.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/42-dnscrypt-proxy.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/42-dnscrypt-proxy.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/43-SmartDNS.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/43-SmartDNS.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/44-AdGuard-for-WindowsMac.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/45-AdGuard-for-Android.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/46-Vivaldi.svg:
--------------------------------------------------------------------------------
1 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/47-PolishCookieConsent.png:
--------------------------------------------------------------------------------
https://raw.githubusercontent.com/collinbarrett/FilterLists/2d08fb07ce715780fafc27d75e8714b74a02d2e8/web/src/components/softwareCloud/imgs/47-PolishCookieConsent.png
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/imgs.d.ts:
--------------------------------------------------------------------------------
1 | declare module "*.svg" {
2 | const content: any;
3 | export default content;
4 | }
5 |
6 | declare module "*.png" {
7 | const content: any;
8 | export default content;
9 | }
10 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/imgs/index.ts:
--------------------------------------------------------------------------------
1 | import img01 from "./01-uBlock-Origin.svg";
2 | import img02 from "./02-Adblock-Plus.svg";
3 | import img03 from "./03-AdGuard.svg";
4 | import img04 from "./04-DNS66.png";
5 | import img05 from "./05-Nano-Adblocker.png";
6 | import img06 from "./06-AdBlock.png";
7 | import img07 from "./07-AdAway.png";
8 | import img08 from "./08-Personal-Blocklist.png";
9 | import img10 from "./10-Redirector.png";
10 | import img11 from "./11-Hosts-File-Editor.png";
11 | import img12 from "./12-Gas-Mask.png";
12 | import img13 from "./13-MinerBlock.svg";
13 | import img14 from "./14-Pi-hole.svg";
14 | import img15 from "./15-uBlock.svg";
15 | import img16 from "./16-Internet-Explorer-TPL.svg";
16 | import img17 from "./17-Google-Hit-Hider-by-Domain.svg";
17 | import img18 from "./18-FireHOL.png";
18 | import img19 from "./19-Samsung-Knox.svg";
19 | import img20 from "./20-Little-Snitch.png";
20 | import img21 from "./21-Privoxy.png";
21 | import img22 from "./22-Diversion.svg";
22 | import img23 from "./23-dnsmasq.png";
23 | import img24 from "./24-Slimjet.png";
24 | import img25 from "./25-uMatrix.png";
25 | import img26 from "./26-Blokada.png";
26 | import img27 from "./27-hostsmgr.png";
27 | import img28 from "./28-personalDNSfilter.svg";
28 | import img29 from "./29-Unbound.png";
29 | import img30 from "./30-BIND.png";
30 | import img31 from "./31-AdGuard-Home.svg";
31 | import img32 from "./32-AdNauseam.png";
32 | import img33 from "./33-Legacy-Unix-Derivatives.png";
33 | import img34 from "./34-Windows-command-line.png";
34 | import img35 from "./35-Shadowsocks.png";
35 | import img36 from "./36-ShadowsocksR.png";
36 | import img37 from "./37-Shadowrocket.png";
37 | import img38 from "./38-DNSRedirector.png";
38 | import img39 from "./39-pfBlockerNG.png";
39 | import img40 from "./40-Opera.png";
40 | import img41 from "./41-Surge.png";
41 | import img42 from "./42-dnscrypt-proxy.png";
42 | import img43 from "./43-SmartDNS.png";
43 | import img44 from "./44-AdGuard-for-WindowsMac.svg";
44 | import img45 from "./45-AdGuard-for-Android.svg";
45 | import img46 from "./46-Vivaldi.svg";
46 | import img47 from "./47-PolishCookieConsent.png";
47 |
48 | export {
49 | img01,
50 | img02,
51 | img03,
52 | img04,
53 | img05,
54 | img06,
55 | img07,
56 | img08,
57 | img10,
58 | img11,
59 | img12,
60 | img13,
61 | img14,
62 | img15,
63 | img16,
64 | img17,
65 | img18,
66 | img19,
67 | img20,
68 | img21,
69 | img22,
70 | img23,
71 | img24,
72 | img25,
73 | img26,
74 | img27,
75 | img28,
76 | img29,
77 | img30,
78 | img31,
79 | img32,
80 | img33,
81 | img34,
82 | img35,
83 | img36,
84 | img37,
85 | img38,
86 | img39,
87 | img40,
88 | img41,
89 | img42,
90 | img43,
91 | img44,
92 | img45,
93 | img46,
94 | img47,
95 | };
96 |
--------------------------------------------------------------------------------
/web/src/components/softwareCloud/index.ts:
--------------------------------------------------------------------------------
1 | import { SoftwareCloud } from "./SoftwareCloud";
2 | import { SoftwareIcon } from "./SoftwareIcon";
3 |
4 | export { SoftwareCloud, SoftwareIcon };
5 |
--------------------------------------------------------------------------------
/web/src/components/syntaxCloud/SyntaxCloud.tsx:
--------------------------------------------------------------------------------
1 | import { Syntax } from "../../interfaces/Syntax";
2 | import { SyntaxTag } from "../SyntaxTag";
3 |
4 | interface Props {
5 | syntaxes: Syntax[];
6 | showLabel?: boolean;
7 | }
8 |
9 | export const SyntaxCloud = (props: Props) =>
10 | props.syntaxes && props.syntaxes.length ? (
11 |
12 | {props.showLabel && (
13 |
{`Syntax${props.syntaxes.length > 1 ? "es" : ""}:`}
14 | )}
15 | {props.syntaxes.map((s: Syntax, i: number) => (
16 |
17 | ))}
18 |
19 | ) : null;
20 |
--------------------------------------------------------------------------------
/web/src/components/syntaxCloud/index.ts:
--------------------------------------------------------------------------------
1 | import { SyntaxCloud } from "./SyntaxCloud";
2 |
3 | export { SyntaxCloud };
4 |
--------------------------------------------------------------------------------
/web/src/components/tagCloud/TagCloud.tsx:
--------------------------------------------------------------------------------
1 | import { Tag } from "antd";
2 | import { Tag as TagInterface } from "../../interfaces/Tag";
3 |
4 | interface Props {
5 | tags: TagInterface[];
6 | showLabel?: boolean;
7 | }
8 |
9 | export const TagCloud = (props: Props) =>
10 | props.tags && props.tags.length ? (
11 |
12 | {props.showLabel &&
{`Tag${props.tags.length > 1 ? "s" : ""}:`}
}
13 | {props.tags.map((t: TagInterface, i: number) => (
14 |
15 | {t.name}
16 |
17 | ))}
18 |
19 | ) : null;
20 |
--------------------------------------------------------------------------------
/web/src/components/tagCloud/index.ts:
--------------------------------------------------------------------------------
1 | import { TagCloud } from "./TagCloud";
2 |
3 | export { TagCloud };
4 |
--------------------------------------------------------------------------------
/web/src/constants.ts:
--------------------------------------------------------------------------------
1 | export const SlugifyOptions = { remove: /[^a-zA-Z0-9- ]/g, lower: true };
2 |
--------------------------------------------------------------------------------
/web/src/hooks/index.ts:
--------------------------------------------------------------------------------
1 | import { useLanguages } from "./useLanguages";
2 | import { useLicenses } from "./useLicenses";
3 | import { useLists } from "./useLists";
4 | import { useListDetails } from "./useListDetails";
5 | import { useMaintainers } from "./useMaintainers";
6 | import { useSearchColumnFilter } from "./useSearchColumnFilter";
7 | import { useSoftware } from "./useSoftware";
8 | import { useSyntaxes } from "./useSyntaxes";
9 | import { useTablePageSizer } from "./useTablePageSizer";
10 | import { useTags } from "./useTags";
11 |
12 | export {
13 | useLanguages,
14 | useLicenses,
15 | useLists,
16 | useListDetails,
17 | useMaintainers,
18 | useSearchColumnFilter,
19 | useSoftware,
20 | useSyntaxes,
21 | useTablePageSizer,
22 | useTags,
23 | };
24 |
--------------------------------------------------------------------------------
/web/src/hooks/useApiData.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from "react";
2 |
3 | export const useApiData = (url: string) => {
4 | const [data, setData] = useState();
5 | useEffect(() => {
6 | const fetchData = async () =>
7 | (await fetch(url)).json().then((r) => setData(r));
8 | fetchData();
9 | }, [url]);
10 | return data;
11 | };
12 |
--------------------------------------------------------------------------------
/web/src/hooks/useLanguages.tsx:
--------------------------------------------------------------------------------
1 | import { Language } from "../interfaces/Language";
2 | import { useApiData } from "./useApiData";
3 |
4 | export const useLanguages = () =>
5 | (useApiData("https://api.filterlists.com/languages") || []).sort(
6 | (a: Language, b: Language) => a.name.localeCompare(b.name),
7 | );
8 |
--------------------------------------------------------------------------------
/web/src/hooks/useLicenses.tsx:
--------------------------------------------------------------------------------
1 | import { License } from "../interfaces/License";
2 | import { useApiData } from "./useApiData";
3 |
4 | export const useLicenses = () =>
5 | (useApiData("https://api.filterlists.com/licenses") || []).sort(
6 | (a: License, b: License) => a.name.localeCompare(b.name),
7 | );
8 |
--------------------------------------------------------------------------------
/web/src/hooks/useListDetails.tsx:
--------------------------------------------------------------------------------
1 | import { ListDetails } from "../interfaces/ListDetails";
2 | import { useApiData } from "./useApiData";
3 |
4 | export const useListDetails = (id: number) => {
5 | return useApiData("https://api.filterlists.com/lists/" + id);
6 | };
7 |
--------------------------------------------------------------------------------
/web/src/hooks/useLists.tsx:
--------------------------------------------------------------------------------
1 | import slugify from "slugify";
2 | import { SlugifyOptions } from "../constants";
3 | import { List } from "../interfaces/List";
4 | import { useApiData } from "./useApiData";
5 |
6 | export const useLists = () => {
7 | const lists = useApiData("https://api.filterlists.com/lists");
8 | lists && lists.forEach((l) => (l.slug = slugify(l.name, SlugifyOptions)));
9 | return (lists || []).sort((a: List, b: List) => a.name.localeCompare(b.name));
10 | };
11 |
--------------------------------------------------------------------------------
/web/src/hooks/useMaintainers.tsx:
--------------------------------------------------------------------------------
1 | import { Maintainer } from "../interfaces/Maintainer";
2 | import { useApiData } from "./useApiData";
3 |
4 | export const useMaintainers = () =>
5 | (
6 | useApiData("https://api.filterlists.com/maintainers") || []
7 | ).sort((a: Maintainer, b: Maintainer) => a.name.localeCompare(b.name));
8 |
--------------------------------------------------------------------------------
/web/src/hooks/useSearchColumnFilter.tsx:
--------------------------------------------------------------------------------
1 | import { SearchOutlined } from "@ant-design/icons";
2 | import { Button, Input } from "antd";
3 | import React, { useEffect, useState } from "react";
4 | import {
5 | FilterConfirmProps,
6 | FilterDropdownProps,
7 | } from "antd/lib/table/interface";
8 |
9 | interface FilterPropsState {
10 | filterDropdown?:
11 | | React.ReactNode
12 | | ((props: FilterDropdownProps) => React.ReactNode);
13 | filterIcon?: React.ReactNode | ((filtered: boolean) => React.ReactNode);
14 | onFilter?: (value: any, record: T) => boolean;
15 | }
16 |
17 | export const useSearchColumnFilter = (dataIndex: string) => {
18 | const [filterProps, setFilterProps] = useState>({
19 | filterDropdown: undefined,
20 | filterIcon: undefined,
21 | onFilter: undefined,
22 | });
23 | useEffect(() => {
24 | const handleSearch = (confirm?: (param: FilterConfirmProps) => void) => {
25 | confirm && confirm({ closeDropdown: true });
26 | };
27 | const handleReset = (clearFilters?: (selectedKeys: string[]) => void) => {
28 | clearFilters && clearFilters([]);
29 | };
30 | setFilterProps({
31 | filterDropdown: ({
32 | setSelectedKeys,
33 | selectedKeys,
34 | confirm,
35 | clearFilters,
36 | }) => (
37 |
38 |
44 | setSelectedKeys &&
45 | setSelectedKeys(e.target.value ? [e.target.value] : [])
46 | }
47 | onPressEnter={() => handleSearch(confirm)}
48 | style={{ width: 188, marginBottom: 8, display: "block" }}
49 | />
50 |
59 |
66 |
67 | ),
68 | filterIcon: (filtered) => (
69 |
70 | ),
71 | onFilter: (value, record) => {
72 | const searchValue = (record as any)[dataIndex];
73 | return (
74 | searchValue &&
75 | searchValue
76 | .toString()
77 | .toLowerCase()
78 | .includes(value.toString().toLowerCase())
79 | );
80 | },
81 | });
82 | }, [dataIndex]);
83 | return filterProps;
84 | };
85 |
--------------------------------------------------------------------------------
/web/src/hooks/useSoftware.tsx:
--------------------------------------------------------------------------------
1 | import { Software } from "../interfaces/Software";
2 | import { useApiData } from "./useApiData";
3 |
4 | export const useSoftware = () =>
5 | (useApiData("https://api.filterlists.com/software") || []).sort(
6 | (a: Software, b: Software) => a.name.localeCompare(b.name),
7 | );
8 |
--------------------------------------------------------------------------------
/web/src/hooks/useSyntaxes.tsx:
--------------------------------------------------------------------------------
1 | import { Syntax } from "../interfaces/Syntax";
2 | import { useApiData } from "./useApiData";
3 |
4 | export const useSyntaxes = () =>
5 | (useApiData("https://api.filterlists.com/syntaxes") || []).sort(
6 | (a: Syntax, b: Syntax) => a.name.localeCompare(b.name),
7 | );
8 |
--------------------------------------------------------------------------------
/web/src/hooks/useTablePageSizer.tsx:
--------------------------------------------------------------------------------
1 | import { useEffect, useState } from "react";
2 |
3 | interface TablePageSize {
4 | pageSize: number;
5 | isNarrowWindow: boolean;
6 | isWideWindow: boolean;
7 | }
8 |
9 | export const useTablePageSizer = () => {
10 | const [state, setState] = useState(calculateSize());
11 | useEffect(() => {
12 | const updatePageSize = () => setState(calculateSize());
13 | window.addEventListener("resize", updatePageSize);
14 | return () => window.removeEventListener("resize", updatePageSize);
15 | }, []);
16 | return state;
17 | };
18 |
19 | const calculateSize = () => ({
20 | pageSize:
21 | window.innerWidth < 576
22 | ? Math.floor((window.innerHeight - 214) / 51)
23 | : Math.floor((window.innerHeight - 187) / 63),
24 | isNarrowWindow: window.innerWidth < 576 ? true : false,
25 | isWideWindow: window.innerWidth > 1918 ? true : false,
26 | });
27 |
--------------------------------------------------------------------------------
/web/src/hooks/useTags.tsx:
--------------------------------------------------------------------------------
1 | import { Tag } from "../interfaces/Tag";
2 | import { useApiData } from "./useApiData";
3 |
4 | export const useTags = () =>
5 | (useApiData("https://api.filterlists.com/tags") || []).sort(
6 | (a: Tag, b: Tag) => a.name.localeCompare(b.name),
7 | );
8 |
--------------------------------------------------------------------------------
/web/src/index.css:
--------------------------------------------------------------------------------
1 | body {
2 | margin: 0;
3 | font-family: -apple-system, BlinkMacSystemFont, "Segoe UI", "Roboto", "Oxygen",
4 | "Ubuntu", "Cantarell", "Fira Sans", "Droid Sans", "Helvetica Neue",
5 | sans-serif;
6 | -webkit-font-smoothing: antialiased;
7 | -moz-osx-font-smoothing: grayscale;
8 | }
9 |
10 | code {
11 | font-family: source-code-pro, Menlo, Monaco, Consolas, "Courier New",
12 | monospace;
13 | }
14 |
15 | td.ant-table-cell > * {
16 | height: 42px;
17 | overflow: hidden;
18 | }
19 |
20 | td.ant-table-cell {
21 | padding: 2px 4px 4px 2px;
22 | }
23 |
24 | td.ant-table-column-sort {
25 | background: rgb(20, 20, 20);
26 | }
27 |
28 | .ant-tag {
29 | margin: 0px 8px 2px 0px;
30 | }
31 |
--------------------------------------------------------------------------------
/web/src/index.tsx:
--------------------------------------------------------------------------------
1 | import React from "react";
2 | import { createRoot } from "react-dom/client";
3 | import { App } from "./App";
4 | import "./index.css";
5 | import reportWebVitals from "./reportWebVitals";
6 |
7 | const container = document.getElementById("root");
8 | const root = createRoot(container!);
9 |
10 | root.render(
11 |
12 |
13 | ,
14 | );
15 |
16 | // If you want to start measuring performance in your app, pass a function
17 | // to log results (for example: reportWebVitals(console.log))
18 | // or send to an analytics endpoint. Learn more: https://bit.ly/CRA-vitals
19 | reportWebVitals();
20 |
--------------------------------------------------------------------------------
/web/src/interfaces/Language.ts:
--------------------------------------------------------------------------------
1 | export interface Language {
2 | id: number;
3 | iso6391: string;
4 | name: string;
5 | filterListIds: number[];
6 | }
7 |
--------------------------------------------------------------------------------
/web/src/interfaces/License.ts:
--------------------------------------------------------------------------------
1 | export interface License {
2 | id: number;
3 | name: string;
4 | url: string;
5 | permitsModification: boolean;
6 | permitsDistribution: boolean;
7 | permitsCommercialUse: boolean;
8 | filterListIds: number[];
9 | }
10 |
--------------------------------------------------------------------------------
/web/src/interfaces/List.ts:
--------------------------------------------------------------------------------
1 | export interface List {
2 | id: number;
3 | name: string;
4 | description?: string;
5 | licenseId?: number;
6 | syntaxIds: number[];
7 | languageIds: number[];
8 | tagIds: number[];
9 | maintainerIds: number[];
10 |
11 | // auto-generated by useLists hook
12 | slug: string;
13 | }
14 |
--------------------------------------------------------------------------------
/web/src/interfaces/ListDetails.ts:
--------------------------------------------------------------------------------
1 | export interface ListDetails {
2 | id: number;
3 | name: string;
4 | description?: string;
5 | licenseId?: number;
6 | syntaxIds: number[];
7 | languageIds: number[];
8 | tagIds: number[];
9 | viewUrls: ViewUrl[];
10 | homeUrl?: string;
11 | onionUrl?: string;
12 | policyUrl?: string;
13 | submissionUrl?: string;
14 | issuesUrl?: string;
15 | forumUrl?: string;
16 | chatUrl?: string;
17 | emailAddress?: string;
18 | donateUrl?: string;
19 | maintainerIds: number[];
20 | upstreamFilterListIds: number[];
21 | forkFilterListIds: number[];
22 | includedInFilterListIds: number[];
23 | includesFilterListIds: number[];
24 | dependencyFilterListIds: number[];
25 | dependentFilterListIds: number[];
26 | }
27 |
28 | export interface ViewUrl {
29 | segmentNumber: number;
30 | primariness: number;
31 | url: string;
32 | }
33 |
--------------------------------------------------------------------------------
/web/src/interfaces/Maintainer.ts:
--------------------------------------------------------------------------------
1 | export interface Maintainer {
2 | id: number;
3 | name: string;
4 | url?: string;
5 | emailAddress?: string;
6 | twitterHandle?: string;
7 | filterListIds: number[];
8 | }
9 |
--------------------------------------------------------------------------------
/web/src/interfaces/Software.ts:
--------------------------------------------------------------------------------
1 | export interface Software {
2 | id: number;
3 | name: string;
4 | description?: string;
5 | homeUrl?: string;
6 | downloadUrl?: string;
7 | supportsAbpUrlScheme: boolean;
8 | syntaxIds: number[];
9 | }
10 |
--------------------------------------------------------------------------------
/web/src/interfaces/Syntax.ts:
--------------------------------------------------------------------------------
1 | export interface Syntax {
2 | id: number;
3 | name: string;
4 | description?: string;
5 | url?: string;
6 | filterListIds: number[];
7 | softwareIds: number[];
8 | }
9 |
--------------------------------------------------------------------------------
/web/src/interfaces/Tag.ts:
--------------------------------------------------------------------------------
1 | export interface Tag {
2 | id: number;
3 | name: string;
4 | description?: string;
5 | filterListIds: number[];
6 | }
7 |
--------------------------------------------------------------------------------
/web/src/react-app-env.d.ts:
--------------------------------------------------------------------------------
1 | ///
2 |
--------------------------------------------------------------------------------
/web/src/reportWebVitals.ts:
--------------------------------------------------------------------------------
1 | import { ReportHandler } from "web-vitals";
2 |
3 | const reportWebVitals = (onPerfEntry?: ReportHandler) => {
4 | if (onPerfEntry && onPerfEntry instanceof Function) {
5 | import("web-vitals").then(({ getCLS, getFID, getFCP, getLCP, getTTFB }) => {
6 | getCLS(onPerfEntry);
7 | getFID(onPerfEntry);
8 | getFCP(onPerfEntry);
9 | getLCP(onPerfEntry);
10 | getTTFB(onPerfEntry);
11 | });
12 | }
13 | };
14 |
15 | export default reportWebVitals;
16 |
--------------------------------------------------------------------------------
/web/src/setupProxy.js:
--------------------------------------------------------------------------------
1 | const { createProxyMiddleware } = require("http-proxy-middleware");
2 |
3 | module.exports = function (app) {
4 | app.use(
5 | "https://api.filterlists.com",
6 | createProxyMiddleware({
7 | target: "http://localhost:8080",
8 | changeOrigin: true,
9 | }),
10 | );
11 | };
12 |
--------------------------------------------------------------------------------
/web/src/setupTests.ts:
--------------------------------------------------------------------------------
1 | // jest-dom adds custom jest matchers for asserting on DOM nodes.
2 | // allows you to do things like:
3 | // expect(element).toHaveTextContent(/react/i)
4 | // learn more: https://github.com/testing-library/jest-dom
5 | import "@testing-library/jest-dom";
6 |
--------------------------------------------------------------------------------
/web/src/utils/index.ts:
--------------------------------------------------------------------------------
1 | import { nameof } from "./nameof";
2 |
3 | export { nameof };
4 |
--------------------------------------------------------------------------------
/web/src/utils/nameof.ts:
--------------------------------------------------------------------------------
1 | //https://stackoverflow.com/a/50470026/2343739
2 | export const nameof = (name: Extract) => name;
3 |
--------------------------------------------------------------------------------
/web/staticwebapp.config.json:
--------------------------------------------------------------------------------
1 | {
2 | "routes": [
3 | {
4 | "route": "/static/*",
5 | "headers": {
6 | "Cache-Control": "public, max-age=31536000, immutable"
7 | }
8 | },
9 | {
10 | "route": "/favicon.ico",
11 | "headers": {
12 | "Cache-Control": "public, max-age=86400"
13 | }
14 | },
15 | {
16 | "route": "/logo_filterlists.png",
17 | "headers": {
18 | "Cache-Control": "public, max-age=31536000, immutable"
19 | }
20 | },
21 | {
22 | "route": "/icon_filterlists.png",
23 | "headers": {
24 | "Cache-Control": "public, max-age=31536000, immutable"
25 | }
26 | },
27 | {
28 | "route": "/manifest.json",
29 | "headers": {
30 | "Cache-Control": "public, max-age=86400"
31 | }
32 | },
33 | {
34 | "route": "/robots.txt",
35 | "headers": {
36 | "Cache-Control": "public, max-age=86400"
37 | }
38 | },
39 | {
40 | "route": "/tpl-redirect.js",
41 | "headers": {
42 | "Cache-Control": "public, max-age=86400"
43 | }
44 | },
45 | {
46 | "route": "/tpl.html",
47 | "headers": {
48 | "Cache-Control": "public, max-age=86400"
49 | }
50 | }
51 | ],
52 | "navigationFallback": {
53 | "rewrite": "/index.html"
54 | },
55 | "trailingSlash": "never",
56 | "globalHeaders": {
57 | "Content-Security-Policy": "upgrade-insecure-requests; default-src 'none'; base-uri 'none'; frame-ancestors 'none'; form-action 'none'; connect-src 'self' https://api.filterlists.com; script-src 'self' 'unsafe-inline'; style-src 'self' 'unsafe-inline'; img-src 'self' data:; manifest-src 'self';",
58 | "Permissions-Policy": "accelerometer=(), ambient-light-sensor=(), attribution-reporting=(), autoplay=(), battery=(), bluetooth=(), browsing-topics=(), camera=(), compute-pressure=(), display-capture=(), document-domain=(), encrypted-media=(), execution-while-not-rendered=(), execution-while-out-of-viewport=(), fullscreen=(), gamepad=(), geolocation=(), gyroscope=(), hid=(), identity-credentials-get=(), idle-detection=(), local-fonts=(), magnetometer=(), microphone=(), midi=(), otp-credentials=(), payment=(), picture-in-picture=(), publickey-credentials-create=(), publickey-credentials-get=(), screen-wake-lock=(), serial=(), speaker-selection=(), storage-access=(), usb=(), web-share=(), window-management=(), xr-spatial-tracking=()"
59 | }
60 | }
61 |
--------------------------------------------------------------------------------
/web/tsconfig.json:
--------------------------------------------------------------------------------
1 | {
2 | "compilerOptions": {
3 | "target": "es5",
4 | "lib": ["dom", "dom.iterable", "esnext"],
5 | "allowJs": true,
6 | "skipLibCheck": true,
7 | "esModuleInterop": true,
8 | "allowSyntheticDefaultImports": true,
9 | "strict": true,
10 | "forceConsistentCasingInFileNames": true,
11 | "noFallthroughCasesInSwitch": true,
12 | "module": "esnext",
13 | "moduleResolution": "node",
14 | "resolveJsonModule": true,
15 | "isolatedModules": true,
16 | "noEmit": true,
17 | "jsx": "react-jsx"
18 | },
19 | "include": ["src"]
20 | }
21 |
--------------------------------------------------------------------------------