-
-
Notifications
You must be signed in to change notification settings - Fork 47
/
prepareExtension.js
179 lines (169 loc) · 4.92 KB
/
prepareExtension.js
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
import {
selectValue,
generateImportWrappers,
writeManifest,
writeConfig,
readPackage,
} from './prepareTools.js';
const env = process.env.TOURNESOL_ENV || 'production';
const browser = process.env.EXTENSION_BROWSER || 'firefox';
if (process.env.EXTENSION_BROWSER && !process.env.MANIFEST_VERSION) {
throw new Error(`MANIFEST_VERSION is required with EXTENSION_BROWSER`);
}
const manifestVersion = parseInt(process.env.MANIFEST_VERSION || 2);
if (manifestVersion != 2 && manifestVersion != 3)
throw new Error(`Invalid manifest version: ${manifestVersion}`);
if (manifestVersion === 2) {
console.info(
`Extension will be configured with manifest version ${manifestVersion}.`
);
} else {
console.info(
`Extension will be configured for ${browser} with manifest version ${manifestVersion}.`
);
}
const { version } = await readPackage();
const hostPermissions = [
...selectValue(env, {
production: ['https://tournesol.app/', 'https://api.tournesol.app/'],
'dev-env': [
'http://localhost/',
'http://localhost:3000/',
'http://localhost:8000/',
],
}),
'https://www.youtube.com/',
];
const permissions = [
'activeTab',
'contextMenus',
'storage',
'webNavigation',
// webRequest and webReauestBlocking were used to overwrite
// headers in the API response. This is no longer the case
// with version > 3.5.2.
// These permissions can be removed as soon as we are confident
// the next release works as expected.
...selectValue(manifestVersion, {
2: ['webRequest', 'webRequestBlocking'],
3: ['scripting'],
}),
];
const allPermissions = selectValue(manifestVersion, {
2: { permissions: [...hostPermissions, ...permissions] },
3: { permissions, host_permissions: hostPermissions },
});
const webAccessibleResourcesFromYouTube = [
'Logo128.png',
'html/*',
'images/*',
'utils.js',
'models/*',
'config.js',
];
const manifest = {
name: 'Tournesol Extension',
version,
description: 'Open Tournesol directly from YouTube',
...allPermissions,
manifest_version: manifestVersion,
icons: {
64: 'Logo64.png',
128: 'Logo128.png',
512: 'Logo512.png',
},
background: selectValue(manifestVersion, {
2: { page: 'background.html', persistent: true },
3: selectValue(browser, {
// It's possible to make a browser-independent background value but
// Chrome only supports that since version 121 released in January 2024.
// See https://developer.mozilla.org/en-US/docs/Mozilla/Add-ons/WebExtensions/manifest.json/background
firefox: {
scripts: ['background.js'],
type: 'module',
},
chrome: {
service_worker: 'background.js',
type: 'module',
},
}),
}),
[selectValue(manifestVersion, { 2: 'browser_action', 3: 'action' })]: {
default_icon: {
16: 'Logo16.png',
64: 'Logo64.png',
},
default_title: 'Tournesol actions',
default_popup: 'browserAction/menu.html',
},
content_scripts: [
{
matches: ['https://*.youtube.com/*'],
js: ['displayHomeRecommendations.js', 'displaySearchRecommendations.js'],
css: ['addTournesolRecommendations.css'],
run_at: 'document_start',
all_frames: true,
},
{
matches: ['https://*.youtube.com/*'],
js: ['addVideoStatistics.js', 'addModal.js', 'addVideoButtons.js'],
css: ['addVideoStatistics.css', 'addModal.css', 'addVideoButtons.css'],
run_at: 'document_end',
all_frames: true,
},
{
matches: selectValue(env, {
production: ['https://tournesol.app/*'],
'dev-env': ['http://localhost:3000/*'],
}),
js: [
'fetchTournesolToken.js',
'fetchTournesolRecommendationsLanguages.js',
],
run_at: 'document_end',
all_frames: true,
},
],
options_ui: {
page: 'options/options.html',
open_in_tab: true,
},
default_locale: 'en',
web_accessible_resources: selectValue(manifestVersion, {
2: webAccessibleResourcesFromYouTube,
3: [
{
matches: [
'https://*.youtube.com/*',
selectValue(env, {
production: 'https://tournesol.app/*',
'dev-env': 'http://localhost:3000/*',
}),
],
resources: webAccessibleResourcesFromYouTube,
},
],
}),
};
// Please DO NOT add a trailing slash to front end URL, this prevents
// creating duplicates in our web analytics tool
const config = {
manifestVersion,
...selectValue(env, {
production: {
frontendUrl: 'https://tournesol.app',
frontendHost: 'tournesol.app',
apiUrl: 'https://api.tournesol.app',
},
'dev-env': {
frontendUrl: 'http://localhost:3000',
frontendHost: 'localhost:3000',
apiUrl: 'http://localhost:8000',
},
}),
};
(async () => {
await generateImportWrappers(manifest, webAccessibleResourcesFromYouTube);
await writeManifest(manifest, 'src/manifest.json');
await writeConfig(config, 'src/config.js');
})();