Skip to content

Commit 6c4165a

Browse files
committed
Refactor extension build process and remove vite.config.ts
1 parent d641478 commit 6c4165a

File tree

3 files changed

+163
-152
lines changed

3 files changed

+163
-152
lines changed

packages/extension/build.ts

Lines changed: 159 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -1,41 +1,176 @@
1-
import child_process from 'node:child_process'
2-
import fs from 'node:fs'
3-
import * as vite from 'vite'
1+
import * as path from 'node:path'
2+
import * as url from 'node:url'
3+
import * as crx from '@crxjs/vite-plugin'
4+
import * as vite from 'vite'
5+
import solid from 'vite-plugin-solid'
6+
import pkg from './package.json' with {type: 'json'}
7+
import main_pkg from 'solid-devtools/package.json' with {type: 'json'}
8+
9+
import {
10+
ICONS_BLUE,
11+
ICONS_GRAY,
12+
} from './src/shared.ts'
13+
14+
15+
const filename = url.fileURLToPath(import.meta.url)
16+
const dirname = path.dirname(filename)
17+
18+
const dist_dirname = path.join(dirname, `dist`)
419

5-
const cwd = process.cwd()
620
const args = process.argv.slice(2)
721

822
type Browser = 'chrome' | 'firefox'
923

1024
/*
1125
Parse args
1226
*/
13-
const browsers: Browser[] = []
14-
for (const arg of args) {
15-
if (!arg.startsWith('--browser=')) continue
27+
let is_dev = false
28+
let browsers: Browser[] = []
1629

17-
const browser = arg.slice('--browser='.length)
18-
if (browser !== 'chrome' && browser !== 'firefox') {
19-
throw new Error('browser arg must be "chrome" or "firefox", was ' + browser)
30+
for (let arg of args) {
31+
switch (arg) {
32+
case '--watch':
33+
is_dev = true
34+
break
35+
case '--chrome':
36+
case 'chrome':
37+
case '--browser=chrome':
38+
if (!browsers.includes('chrome')) {
39+
browsers.push('chrome')
40+
}
41+
break
42+
case '--firefox':
43+
case 'firefox':
44+
case '--browser=firefox':
45+
if (!browsers.includes('firefox')) {
46+
browsers.push('firefox')
47+
}
48+
break
49+
default:
50+
throw Error(`Unknown arg: "${arg}"`)
2051
}
21-
browsers.push(browser)
2252
}
23-
if (browsers.length === 0) {
24-
throw new Error('No browsers specified')
53+
54+
if (is_dev) {
55+
if (browsers.length === 0) {
56+
browsers.push('chrome')
57+
} else if (browsers.length > 1) {
58+
throw Error('Watch mode can only be used with one browser')
59+
}
60+
} else {
61+
if (browsers.length === 0) {
62+
browsers.push('chrome', 'firefox')
63+
}
2564
}
2665

27-
/*
28-
Build and zip
29-
*/
30-
const dist = `${cwd}/dist`
66+
const manifest_version = (() => {
67+
// Convert from Semver (example: 0.1.0-beta6)
68+
const [major, minor, patch, label = '0'] = pkg.version
69+
// can only contain digits, dots, or dash
70+
.replace(/[^\d.-]+/g, '')
71+
// split into version parts
72+
.split(/[.-]/)
73+
74+
return `${major}.${minor}.${patch}.${label}`
75+
})()
3176

32-
for (const browser of browsers) {
33-
const dist_dir = `${dist}/${browser}`
34-
const dist_zip = `${dist}/${browser}.zip`
77+
type Manifest_Additional_Fields = {
78+
browser_specific_settings?: Record<string, Record<string, string>>
79+
}
80+
81+
for (let browser of browsers) {
82+
83+
let is_chrome = browser === 'chrome'
84+
85+
const manifest: crx.ManifestV3Export & Manifest_Additional_Fields = {
86+
manifest_version: 3,
87+
name: `${is_dev ? '[DEV] ' : ''}Solid Devtools`,
88+
description: 'Chrome Developer Tools extension for debugging SolidJS applications.',
89+
homepage_url: 'https://github.com/thetarnav/solid-devtools',
90+
version: manifest_version,
91+
version_name: is_chrome ? pkg.version : undefined,
92+
browser_specific_settings: is_chrome
93+
? undefined
94+
: {gecko: {id: '{abfd162e-9948-403a-a75c-6e61184e1d47}'}},
95+
author: is_chrome ? {email: 'gthetarnav@gmail.com'} : 'Damian Tarnawski' as any,
96+
minimum_chrome_version: '94',
97+
devtools_page: 'src/devtools.html',
98+
content_scripts: [{
99+
matches: ['*://*/*'],
100+
js: ['src/content.ts'],
101+
run_at: 'document_start',
102+
}],
103+
background: is_chrome
104+
? {
105+
service_worker: 'src/background.ts',
106+
type: 'module',
107+
}
108+
: {
109+
scripts: ['src/background.ts'],
110+
type: 'module',
111+
},
112+
permissions: [],
113+
action: {
114+
default_icon: ICONS_GRAY,
115+
default_title: 'Solid Devtools',
116+
default_popup: 'src/popup.html',
117+
},
118+
icons: ICONS_BLUE,
119+
}
35120

36-
process.env['BROWSER'] = browser
37-
await vite.build()
121+
const main_version = JSON.stringify(main_pkg.version.match(/\d+.\d+.\d+/)![0])
38122

39-
if (fs.existsSync(dist_zip)) fs.rmSync(dist_zip)
40-
child_process.exec(`cd ${dist_dir} && zip -r ${dist_zip} .`)
123+
const vite_config: vite.InlineConfig = {
124+
root: dirname,
125+
configFile: false,
126+
server: {port: 3333},
127+
resolve: {
128+
conditions: ['browser'],
129+
},
130+
plugins: [
131+
{
132+
name: 'replace-version',
133+
enforce: 'pre',
134+
transform(code, id) {
135+
if (id.includes('solid-devtools')) {
136+
code = code.replace(/import\.meta\.env\.EXPECTED_CLIENT/g, main_version)
137+
}
138+
return code
139+
},
140+
},
141+
solid({dev: false, hot: false}),
142+
crx.crx({
143+
manifest: manifest,
144+
browser: browser,
145+
}),
146+
],
147+
define: {
148+
'import.meta.env.BROWSER': JSON.stringify(browser),
149+
},
150+
build: {
151+
minify: false,
152+
target: 'esnext',
153+
emptyOutDir: !is_dev,
154+
outDir: path.join(dist_dirname, browser),
155+
rollupOptions: {
156+
input: {panel: 'src/panel.html'},
157+
},
158+
},
159+
esbuild: {
160+
dropLabels: [is_dev ? 'PROD' : 'DEV'],
161+
},
162+
optimizeDeps: {
163+
exclude: ['@solid-devtools/debugger'],
164+
},
165+
}
166+
167+
if (is_dev) {
168+
let server = await vite.createServer(vite_config)
169+
170+
await server.listen()
171+
172+
server.printUrls()
173+
} else {
174+
await vite.build(vite_config)
175+
}
41176
}

packages/extension/package.json

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -6,10 +6,10 @@
66
"author": "Damian Tarnawski <gthetarnav@gmail.com>",
77
"type": "module",
88
"scripts": {
9-
"dev": "vite",
10-
"build:chrome": "node --experimental-transform-types ./build.ts --browser=chrome",
11-
"build:firefox": "node --experimental-transform-types ./build.ts --browser=firefox",
12-
"build": "node --experimental-transform-types ./build.ts --browser=firefox --browser=chrome",
9+
"dev": "node --experimental-transform-types ./build.ts --watch",
10+
"build:chrome": "node --experimental-transform-types ./build.ts chrome",
11+
"build:firefox": "node --experimental-transform-types ./build.ts firefox",
12+
"build": "node --experimental-transform-types ./build.ts",
1313
"test:unit": "echo \"No unit tests\"",
1414
"test:types": "tsc --noEmit --paths null",
1515
"firefox-run": "pnpx web-ext run -s dist/firefox -p dev"

packages/extension/vite.config.ts

Lines changed: 0 additions & 124 deletions
This file was deleted.

0 commit comments

Comments
 (0)