extension-develop 2.0.0-beta.6 → 2.0.0-beta.7

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
@@ -0,0 +1,58 @@
1
+ import {createExtensionsPageTab, handleFirstRun} from './define-initial-tab.js'
2
+ import {connect, disconnect, keepAlive} from './reload-service.js'
3
+
4
+ function bgGreen(str) {
5
+ return `background: #0A0C10; color: #26FFB8; ${str}`
6
+ }
7
+ chrome.tabs.query({active: true}, async ([initialTab]) => {
8
+ console.log(
9
+ `%c
10
+ ██████████████████████████████████████████████████████████
11
+ ██████████████████████████████████████████████████████████
12
+ ████████████████████████████ ██████████████████████████
13
+ █████████████████████████ ██████ ███████████████
14
+ ███████████████████████ ███ ███ ████████████
15
+ ██████████████████████ ██████ ███ ███████████
16
+ ███████████████████████ ██████ ██████ ███████████
17
+ ████████████████ ██████ ██████████████ ███████████
18
+ █████████████ ████ ████████████ ████████████
19
+ ███████████ ██ █████████████ ███████████████
20
+ ██████████ ██████ █████████████████ █████████████
21
+ ███████████ ████████████████████████████ ███████████
22
+ █████████████ █████████████████ ██████ ██████████
23
+ ███████████████ ██████████████ ██ ██████████
24
+ ████████████ ████████████ ████ █████████████
25
+ ███████████ █████████████ ██████ ███████████████
26
+ ███████████ ██████ ██████ ███████████████████████
27
+ ███████████ ████ ██████ ██████████████████████
28
+ ████████████ ██ ███ ███████████████████████
29
+ ███████████████ ██████ █████████████████████████
30
+ ██████████████████████████ ████████████████████████████
31
+ ██████████████████████████████████████████████████████████
32
+ ██████████████████████████████████████████████████████████
33
+ MIT (c) ${new Date().getFullYear()} - Cezar Augusto and the Extension.js Authors.
34
+ `,
35
+ bgGreen('')
36
+ )
37
+
38
+ if (
39
+ initialTab.url === 'chrome://newtab/' ||
40
+ initialTab.url === 'chrome://welcome/'
41
+ ) {
42
+ await handleFirstRun()
43
+ } else {
44
+ createExtensionsPageTab(initialTab, 'chrome://extensions/')
45
+ }
46
+ })
47
+
48
+ chrome.runtime.onInstalled.addListener(async () => {
49
+ let isConnected = false
50
+
51
+ if (isConnected) {
52
+ disconnect()
53
+ } else {
54
+ await connect()
55
+ isConnected = true
56
+ keepAlive()
57
+ }
58
+ })
@@ -0,0 +1,67 @@
1
+ async function getDevExtension() {
2
+ const allExtensions = await new Promise((resolve) => {
3
+ chrome.management.getAll(resolve)
4
+ })
5
+
6
+ const devExtensions = allExtensions.filter((extension) => {
7
+ return (
8
+ // Do not include itself
9
+ extension.id !== chrome.runtime.id &&
10
+ // Reload extension
11
+ extension.id !== 'igcijhgmihmjbbahdabahfbpffalcfnn' &&
12
+ // Show only unpackaged extensions
13
+ extension.installType === 'development'
14
+ )
15
+ })
16
+
17
+ return devExtensions[0]
18
+ }
19
+
20
+ // Ideas here are adapted from
21
+ // https://github.com/jeremyben/webpack-chrome-extension-launcher
22
+ // Released under MIT license.
23
+
24
+ // Create a new tab and set it to background.
25
+ // We want the user-selected page to be active,
26
+ // not chrome://extensions.
27
+ export function createExtensionsPageTab(initialTab, url) {
28
+ // Check if url tab is open
29
+ chrome.tabs.query({url: 'chrome://extensions/'}, (tabs) => {
30
+ const extensionsTabExist = tabs.length > 0
31
+
32
+ // Return if url exists
33
+ if (extensionsTabExist) return
34
+
35
+ // Create an inactive tab
36
+ chrome.tabs.create(
37
+ {url, active: false},
38
+ function setBackgroundTab(extensionsTab) {
39
+ // Get current url tab and move it left.
40
+ // This action auto-activates the tab
41
+ chrome.tabs.move(extensionsTab.id, {index: 0}, () => {
42
+ // Get user-selected initial page tab and activate the right tab
43
+ setTimeout(() => {
44
+ chrome.tabs.update(initialTab.id, {active: true})
45
+ }, 500)
46
+ })
47
+ }
48
+ )
49
+ })
50
+ }
51
+
52
+ // Function to handle first run logic
53
+ export async function handleFirstRun() {
54
+ chrome.tabs.update({url: 'chrome://extensions/'})
55
+
56
+ const devExtension = await getDevExtension()
57
+
58
+ chrome.storage.local.get(devExtension.id, (result) => {
59
+ if (result[devExtension.id] && result[devExtension.id].didRun) {
60
+ return
61
+ }
62
+
63
+ chrome.tabs.create({url: 'pages/welcome.html'})
64
+ // Ensure the welcome page shows only once per extension installation
65
+ chrome.storage.local.set({[devExtension.id]: {didRun: true}})
66
+ })
67
+ }
@@ -0,0 +1,17 @@
1
+ {
2
+ "name": "Extension Manager",
3
+ "description": "Extension.js developer tools for tabs and reload management.",
4
+ "version": "1.0",
5
+ "manifest_version": 3,
6
+ "key": "MIIBIjANBgkqhkiG9w0BAQEFAAOCAQ8AMIIBCgKCAQEAolEJq/DBHxY5dBpOqBRWNCl7vRPBvJPlpEzF19fYFVzzaH44AF6+sKjN3jwIKlsgI82F3TIuwoNFiN1yBu5Unf8SVBE4BTO92P02/ACcGYQxicgCLFUGQKlq4uSrwSPaBYl7FHcYl5SERgxnIGCGnaGMdL2vC7waCj2/U/iKoBF9I1lBH9/aKCSjTd3h2UYo7gg6n5nY/ENbzylDt42T3ATmvnVJfYhSNKA9Dv/zryknfnHYYgBKHtz7pDZwWnYdxs78n2VEKwGj7TgbXuIPDpCkrMnU9PTKpHbXFYARA4H9qYORQmYazfIxUZRnKQNSR+GAOGrb8JK+ijeQdwzDAwIDAQAB",
7
+ "background": {
8
+ "service_worker": "background.js",
9
+ "type": "module"
10
+ },
11
+ "icons": {
12
+ "16": "images/logo.png",
13
+ "48": "images/logo.png",
14
+ "128": "images/logo.png"
15
+ },
16
+ "permissions": ["management", "tabs", "storage"]
17
+ }
@@ -0,0 +1,268 @@
1
+ /* $color-text: #dedce5; */
2
+ /* Sakura.css v1.5.0
3
+ * ================
4
+ * Minimal css theme.
5
+ * Project: https://github.com/oxalorg/sakura/
6
+ */
7
+ /* Body */
8
+ html {
9
+ font-size: 62.5%;
10
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
11
+ 'Helvetica Neue', Arial, 'Noto Sans', sans-serif;
12
+ }
13
+
14
+ body {
15
+ font-size: 1.8rem;
16
+ line-height: 1.618;
17
+ max-width: 38em;
18
+ margin: auto;
19
+ color: #c9c9c9;
20
+ background-color: #222222;
21
+ padding: 13px;
22
+ }
23
+
24
+ @media (max-width: 684px) {
25
+ body {
26
+ font-size: 1.53rem;
27
+ }
28
+ }
29
+ @media (max-width: 382px) {
30
+ body {
31
+ font-size: 1.35rem;
32
+ }
33
+ }
34
+ h1,
35
+ h2,
36
+ h3,
37
+ h4,
38
+ h5,
39
+ h6 {
40
+ line-height: 1.1;
41
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
42
+ 'Helvetica Neue', Arial, 'Noto Sans', sans-serif;
43
+ font-weight: 700;
44
+ margin-top: 3rem;
45
+ margin-bottom: 1.5rem;
46
+ overflow-wrap: break-word;
47
+ word-wrap: break-word;
48
+ -ms-word-break: break-all;
49
+ word-break: break-word;
50
+ }
51
+
52
+ h1 {
53
+ font-size: 2.35em;
54
+ }
55
+
56
+ h2 {
57
+ font-size: 2em;
58
+ }
59
+
60
+ h3 {
61
+ font-size: 1.75em;
62
+ }
63
+
64
+ h4 {
65
+ font-size: 1.5em;
66
+ }
67
+
68
+ h5 {
69
+ font-size: 1.25em;
70
+ }
71
+
72
+ h6 {
73
+ font-size: 1em;
74
+ }
75
+
76
+ p {
77
+ margin-top: 0px;
78
+ margin-bottom: 2.5rem;
79
+ }
80
+
81
+ small,
82
+ sub,
83
+ sup {
84
+ font-size: 75%;
85
+ }
86
+
87
+ hr {
88
+ border-color: #ffffff;
89
+ }
90
+
91
+ a {
92
+ text-decoration: none;
93
+ color: #ffffff;
94
+ }
95
+ a:visited {
96
+ color: #e6e6e6;
97
+ }
98
+ a:hover {
99
+ color: #c9c9c9;
100
+ border-bottom: 2px solid #c9c9c9;
101
+ }
102
+
103
+ ul {
104
+ padding-left: 1.4em;
105
+ margin-top: 0px;
106
+ margin-bottom: 2.5rem;
107
+ }
108
+
109
+ li {
110
+ margin-bottom: 0.4em;
111
+ }
112
+
113
+ blockquote {
114
+ margin-left: 0px;
115
+ margin-right: 0px;
116
+ padding-left: 1em;
117
+ padding-top: 0.8em;
118
+ padding-bottom: 0.8em;
119
+ padding-right: 0.8em;
120
+ border-left: 5px solid #ffffff;
121
+ margin-bottom: 2.5rem;
122
+ background-color: #4a4a4a;
123
+ }
124
+
125
+ blockquote p {
126
+ margin-bottom: 0;
127
+ }
128
+
129
+ img,
130
+ video {
131
+ height: auto;
132
+ max-width: 100%;
133
+ margin-top: 0px;
134
+ margin-bottom: 2.5rem;
135
+ }
136
+
137
+ /* Pre and Code */
138
+ pre {
139
+ background-color: #4a4a4a;
140
+ display: block;
141
+ padding: 1em;
142
+ overflow-x: auto;
143
+ margin-top: 0px;
144
+ margin-bottom: 2.5rem;
145
+ font-size: 0.9em;
146
+ }
147
+
148
+ code,
149
+ kbd,
150
+ samp {
151
+ font-size: 0.9em;
152
+ padding: 0 0.5em;
153
+ background-color: #4a4a4a;
154
+ white-space: pre-wrap;
155
+ }
156
+
157
+ pre > code {
158
+ padding: 0;
159
+ background-color: transparent;
160
+ white-space: pre;
161
+ font-size: 1em;
162
+ }
163
+
164
+ /* Tables */
165
+ table {
166
+ text-align: justify;
167
+ width: 100%;
168
+ border-collapse: collapse;
169
+ margin-bottom: 2rem;
170
+ }
171
+
172
+ td,
173
+ th {
174
+ padding: 0.5em;
175
+ border-bottom: 1px solid #4a4a4a;
176
+ }
177
+
178
+ /* Buttons, forms and input */
179
+ input,
180
+ textarea {
181
+ border: 1px solid #c9c9c9;
182
+ }
183
+ input:focus,
184
+ textarea:focus {
185
+ border: 1px solid #ffffff;
186
+ }
187
+
188
+ textarea {
189
+ width: 100%;
190
+ }
191
+
192
+ .button,
193
+ button,
194
+ input[type='submit'],
195
+ input[type='reset'],
196
+ input[type='button'],
197
+ input[type='file']::file-selector-button {
198
+ display: inline-block;
199
+ padding: 5px 10px;
200
+ text-align: center;
201
+ text-decoration: none;
202
+ white-space: nowrap;
203
+ background-color: #ffffff;
204
+ color: #222222;
205
+ border-radius: 1px;
206
+ border: 1px solid #ffffff;
207
+ cursor: pointer;
208
+ box-sizing: border-box;
209
+ }
210
+ .button[disabled],
211
+ button[disabled],
212
+ input[type='submit'][disabled],
213
+ input[type='reset'][disabled],
214
+ input[type='button'][disabled],
215
+ input[type='file']::file-selector-button[disabled] {
216
+ cursor: default;
217
+ opacity: 0.5;
218
+ }
219
+ .button:hover,
220
+ button:hover,
221
+ input[type='submit']:hover,
222
+ input[type='reset']:hover,
223
+ input[type='button']:hover,
224
+ input[type='file']::file-selector-button:hover {
225
+ background-color: #c9c9c9;
226
+ color: #222222;
227
+ outline: 0;
228
+ }
229
+ .button:focus-visible,
230
+ button:focus-visible,
231
+ input[type='submit']:focus-visible,
232
+ input[type='reset']:focus-visible,
233
+ input[type='button']:focus-visible,
234
+ input[type='file']::file-selector-button:focus-visible {
235
+ outline-style: solid;
236
+ outline-width: 2px;
237
+ }
238
+
239
+ textarea,
240
+ select,
241
+ input {
242
+ color: #c9c9c9;
243
+ padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
244
+ margin-bottom: 10px;
245
+ background-color: #4a4a4a;
246
+ border: 1px solid #4a4a4a;
247
+ border-radius: 4px;
248
+ box-shadow: none;
249
+ box-sizing: border-box;
250
+ }
251
+ textarea:focus,
252
+ select:focus,
253
+ input:focus {
254
+ border: 1px solid #ffffff;
255
+ outline: 0;
256
+ }
257
+
258
+ input[type='checkbox']:focus {
259
+ outline: 1px dotted #ffffff;
260
+ }
261
+
262
+ label,
263
+ legend,
264
+ fieldset {
265
+ display: block;
266
+ margin-bottom: 0.5rem;
267
+ font-weight: 600;
268
+ }
@@ -0,0 +1,267 @@
1
+ /* Sakura.css v1.5.0
2
+ * ================
3
+ * Minimal css theme.
4
+ * Project: https://github.com/oxalorg/sakura/
5
+ */
6
+ /* Body */
7
+ html {
8
+ font-size: 62.5%;
9
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
10
+ 'Helvetica Neue', Arial, 'Noto Sans', sans-serif;
11
+ }
12
+
13
+ body {
14
+ font-size: 1.8rem;
15
+ line-height: 1.618;
16
+ max-width: 38em;
17
+ margin: auto;
18
+ color: #4a4a4a;
19
+ background-color: #f9f9f9;
20
+ padding: 13px;
21
+ }
22
+
23
+ @media (max-width: 684px) {
24
+ body {
25
+ font-size: 1.53rem;
26
+ }
27
+ }
28
+ @media (max-width: 382px) {
29
+ body {
30
+ font-size: 1.35rem;
31
+ }
32
+ }
33
+ h1,
34
+ h2,
35
+ h3,
36
+ h4,
37
+ h5,
38
+ h6 {
39
+ line-height: 1.1;
40
+ font-family: -apple-system, BlinkMacSystemFont, 'Segoe UI', Roboto,
41
+ 'Helvetica Neue', Arial, 'Noto Sans', sans-serif;
42
+ font-weight: 700;
43
+ margin-top: 3rem;
44
+ margin-bottom: 1.5rem;
45
+ overflow-wrap: break-word;
46
+ word-wrap: break-word;
47
+ -ms-word-break: break-all;
48
+ word-break: break-word;
49
+ }
50
+
51
+ h1 {
52
+ font-size: 2.35em;
53
+ }
54
+
55
+ h2 {
56
+ font-size: 2em;
57
+ }
58
+
59
+ h3 {
60
+ font-size: 1.75em;
61
+ }
62
+
63
+ h4 {
64
+ font-size: 1.5em;
65
+ }
66
+
67
+ h5 {
68
+ font-size: 1.25em;
69
+ }
70
+
71
+ h6 {
72
+ font-size: 1em;
73
+ }
74
+
75
+ p {
76
+ margin-top: 0px;
77
+ margin-bottom: 2.5rem;
78
+ }
79
+
80
+ small,
81
+ sub,
82
+ sup {
83
+ font-size: 75%;
84
+ }
85
+
86
+ hr {
87
+ border-color: #1d7484;
88
+ }
89
+
90
+ a {
91
+ text-decoration: none;
92
+ color: #1d7484;
93
+ }
94
+ a:visited {
95
+ color: #144f5a;
96
+ }
97
+ a:hover {
98
+ color: #982c61;
99
+ border-bottom: 2px solid #4a4a4a;
100
+ }
101
+
102
+ ul {
103
+ padding-left: 1.4em;
104
+ margin-top: 0px;
105
+ margin-bottom: 2.5rem;
106
+ }
107
+
108
+ li {
109
+ margin-bottom: 0.4em;
110
+ }
111
+
112
+ blockquote {
113
+ margin-left: 0px;
114
+ margin-right: 0px;
115
+ padding-left: 1em;
116
+ padding-top: 0.8em;
117
+ padding-bottom: 0.8em;
118
+ padding-right: 0.8em;
119
+ border-left: 5px solid #1d7484;
120
+ margin-bottom: 2.5rem;
121
+ background-color: #f1f1f1;
122
+ }
123
+
124
+ blockquote p {
125
+ margin-bottom: 0;
126
+ }
127
+
128
+ img,
129
+ video {
130
+ height: auto;
131
+ max-width: 100%;
132
+ margin-top: 0px;
133
+ margin-bottom: 2.5rem;
134
+ }
135
+
136
+ /* Pre and Code */
137
+ pre {
138
+ background-color: #f1f1f1;
139
+ display: block;
140
+ padding: 1em;
141
+ overflow-x: auto;
142
+ margin-top: 0px;
143
+ margin-bottom: 2.5rem;
144
+ font-size: 0.9em;
145
+ }
146
+
147
+ code,
148
+ kbd,
149
+ samp {
150
+ font-size: 0.9em;
151
+ padding: 0 0.5em;
152
+ background-color: #f1f1f1;
153
+ white-space: pre-wrap;
154
+ }
155
+
156
+ pre > code {
157
+ padding: 0;
158
+ background-color: transparent;
159
+ white-space: pre;
160
+ font-size: 1em;
161
+ }
162
+
163
+ /* Tables */
164
+ table {
165
+ text-align: justify;
166
+ width: 100%;
167
+ border-collapse: collapse;
168
+ margin-bottom: 2rem;
169
+ }
170
+
171
+ td,
172
+ th {
173
+ padding: 0.5em;
174
+ border-bottom: 1px solid #f1f1f1;
175
+ }
176
+
177
+ /* Buttons, forms and input */
178
+ input,
179
+ textarea {
180
+ border: 1px solid #4a4a4a;
181
+ }
182
+ input:focus,
183
+ textarea:focus {
184
+ border: 1px solid #1d7484;
185
+ }
186
+
187
+ textarea {
188
+ width: 100%;
189
+ }
190
+
191
+ .button,
192
+ button,
193
+ input[type='submit'],
194
+ input[type='reset'],
195
+ input[type='button'],
196
+ input[type='file']::file-selector-button {
197
+ display: inline-block;
198
+ padding: 5px 10px;
199
+ text-align: center;
200
+ text-decoration: none;
201
+ white-space: nowrap;
202
+ background-color: #1d7484;
203
+ color: #f9f9f9;
204
+ border-radius: 1px;
205
+ border: 1px solid #1d7484;
206
+ cursor: pointer;
207
+ box-sizing: border-box;
208
+ }
209
+ .button[disabled],
210
+ button[disabled],
211
+ input[type='submit'][disabled],
212
+ input[type='reset'][disabled],
213
+ input[type='button'][disabled],
214
+ input[type='file']::file-selector-button[disabled] {
215
+ cursor: default;
216
+ opacity: 0.5;
217
+ }
218
+ .button:hover,
219
+ button:hover,
220
+ input[type='submit']:hover,
221
+ input[type='reset']:hover,
222
+ input[type='button']:hover,
223
+ input[type='file']::file-selector-button:hover {
224
+ background-color: #982c61;
225
+ color: #f9f9f9;
226
+ outline: 0;
227
+ }
228
+ .button:focus-visible,
229
+ button:focus-visible,
230
+ input[type='submit']:focus-visible,
231
+ input[type='reset']:focus-visible,
232
+ input[type='button']:focus-visible,
233
+ input[type='file']::file-selector-button:focus-visible {
234
+ outline-style: solid;
235
+ outline-width: 2px;
236
+ }
237
+
238
+ textarea,
239
+ select,
240
+ input {
241
+ color: #4a4a4a;
242
+ padding: 6px 10px; /* The 6px vertically centers text on FF, ignored by Webkit */
243
+ margin-bottom: 10px;
244
+ background-color: #f1f1f1;
245
+ border: 1px solid #f1f1f1;
246
+ border-radius: 4px;
247
+ box-shadow: none;
248
+ box-sizing: border-box;
249
+ }
250
+ textarea:focus,
251
+ select:focus,
252
+ input:focus {
253
+ border: 1px solid #1d7484;
254
+ outline: 0;
255
+ }
256
+
257
+ input[type='checkbox']:focus {
258
+ outline: 1px dotted #1d7484;
259
+ }
260
+
261
+ label,
262
+ legend,
263
+ fieldset {
264
+ display: block;
265
+ margin-bottom: 0.5rem;
266
+ font-weight: 600;
267
+ }