A fast, local-first "redirection engine" for !bang users with a few extra features ^-^
1import rawBangs from "./bangs.json" with { type: "json" };
2
3// Developer script that converts ./bang.ts' array to hashmap.
4
5const hashbang: {
6 [key: string]: {
7 c?: string; // Category
8 sc?: string; // Subcategory
9 d: string; // Domain
10 ad?: string; // Alternate Domain
11 r: number; // Rank (default to 0)
12 s: string; // Website Name
13 t: string; // Trigger
14 ts?: string[]; // Additional Triggers
15 u: string; // Template URL
16 x?: string; // Regex pattern
17 fmt?: string[]; // Format flags
18 skip_tests?: boolean; // Skip tests flag
19 };
20} = {
21 t3: {
22 c: "AI",
23 d: "www.t3.chat",
24 r: 0,
25 s: "T3 Chat",
26 sc: "AI",
27 t: "t3",
28 u: "https://www.t3.chat/new?q={{{s}}}",
29 },
30 m2: {
31 c: "Online Services",
32 d: "meta.dunkirk.sh",
33 r: 0,
34 s: "metasearch2",
35 sc: "Search",
36 t: "m2",
37 u: "https://meta.dunkirk.sh/search?q={{{s}}}",
38 },
39 tiktok: {
40 c: "Multimedia",
41 sc: "Video",
42 d: "www.tiktok.com",
43 r: 0,
44 s: "TikTok",
45 t: "tiktok",
46 u: "https://www.tiktok.com/search?q={{{s}}}",
47 },
48};
49
50// Convert rawBangs array to hashbang object
51rawBangs.forEach((bang: any) => {
52 if (!bang.t || !bang.u || !bang.s || !bang.d) {
53 console.warn(`Skipping invalid bang: ${JSON.stringify(bang)}`);
54 return;
55 }
56
57 hashbang[bang.t] = {
58 c: bang.c,
59 sc: bang.sc,
60 d: bang.d,
61 ad: bang.ad,
62 r: 0, // Default rank
63 s: bang.s,
64 t: bang.t,
65 ts: bang.ts,
66 u: bang.u,
67 x: bang.x,
68 fmt: bang.fmt,
69 skip_tests: bang.skip_tests,
70 };
71
72 // Add additional triggers (if any) to the hashbang
73 if (bang.ts) {
74 bang.ts.forEach((trigger: string) => {
75 hashbang[trigger] = { ...hashbang[bang.t], t: trigger };
76 });
77 }
78});
79
80Bun.write(
81 "./src/bangs/hashbang.ts",
82 `export const bangs: {[key: string]: ({c?:string, d: string, r: number, s:string, sc?: string, t: string, u: string })} = ${JSON.stringify(hashbang)};`,
83);