139 lines
3.0 kB
1
import { ExtensionSettingsManifest } from "./config";
2
import { Snowflake } from "./discord";
3
import { WebpackModuleFunc } from "./discord/webpack";
4
5
export enum ExtensionTag {
6
Accessibility = "accessibility",
7
Appearance = "appearance",
8
Chat = "chat",
9
Commands = "commands",
10
ContextMenu = "contextMenu",
11
DangerZone = "dangerZone",
12
Development = "development",
13
Fixes = "fixes",
14
Fun = "fun",
15
Markdown = "markdown",
16
Voice = "voice",
17
Privacy = "privacy",
18
Profiles = "profiles",
19
QualityOfLife = "qol",
20
Library = "library"
21
}
22
23
export type ExtensionAuthor =
24
| string
25
| {
26
name: string;
27
id?: Snowflake;
28
};
29
30
export type ExtensionManifest = {
31
id: string;
32
version?: string;
33
apiLevel?: number;
34
environment?: ExtensionEnvironment;
35
36
meta?: {
37
name?: string;
38
tagline?: string;
39
description?: string;
40
authors?: ExtensionAuthor[];
41
deprecated?: boolean;
42
tags?: ExtensionTag[];
43
source?: string;
44
changelog?: string;
45
};
46
47
dependencies?: string[];
48
suggested?: string[];
49
incompatible?: string[];
50
51
settings?: Record<string, ExtensionSettingsManifest>;
52
53
cors?: string[];
54
blocked?: string[];
55
};
56
57
export enum ExtensionEnvironment {
58
Both = "both",
59
Desktop = "desktop",
60
Web = "web"
61
}
62
63
export enum ExtensionLoadSource {
64
Developer,
65
Core,
66
Normal
67
}
68
69
export type DetectedExtension = {
70
id: string;
71
manifest: ExtensionManifest;
72
source: { type: ExtensionLoadSource; url?: string };
73
scripts: {
74
web?: string;
75
webPath?: string;
76
webpackModules?: Record<string, string>;
77
nodePath?: string;
78
hostPath?: string;
79
style?: string;
80
};
81
};
82
83
export type ProcessedExtensions = {
84
extensions: DetectedExtension[];
85
dependencyGraph: Map<string, Set<string> | null>;
86
};
87
88
export type PatchMatch = string | RegExp;
89
export type PatchReplaceFn = (substring: string, ...args: string[]) => string;
90
export type PatchReplaceModule = (orig: string) => WebpackModuleFunc;
91
92
export enum PatchReplaceType {
93
Normal,
94
Module
95
}
96
97
export type PatchReplace =
98
| {
99
type?: PatchReplaceType.Normal;
100
match: PatchMatch;
101
replacement: string | PatchReplaceFn;
102
}
103
| {
104
type: PatchReplaceType.Module;
105
replacement: PatchReplaceModule;
106
};
107
108
export type Patch = {
109
find: PatchMatch;
110
replace: PatchReplace | PatchReplace[];
111
hardFail?: boolean; // if any patches fail, all fail
112
prerequisite?: () => boolean;
113
};
114
115
export type ExplicitExtensionDependency = {
116
ext?: string;
117
id: string;
118
};
119
120
export type ExtensionDependency = string | RegExp | ExplicitExtensionDependency;
121
122
export type ExtensionWebpackModule = {
123
entrypoint?: boolean;
124
dependencies?: ExtensionDependency[];
125
run?: WebpackModuleFunc;
126
};
127
128
export type ExtensionWebExports = {
129
patches?: Patch[];
130
webpackModules?: Record<string, ExtensionWebpackModule>;
131
styles?: string[];
132
};
133
134
export type IdentifiedPatch = Patch & {
135
ext: string;
136
id: number;
137
};
138
139
export type IdentifiedWebpackModule = ExtensionWebpackModule & ExplicitExtensionDependency;
140