|
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`) |
4 | 19 |
|
5 | | -const cwd = process.cwd() |
6 | 20 | const args = process.argv.slice(2) |
7 | 21 |
|
8 | 22 | type Browser = 'chrome' | 'firefox' |
9 | 23 |
|
10 | 24 | /* |
11 | 25 | Parse args |
12 | 26 | */ |
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[] = [] |
16 | 29 |
|
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}"`) |
20 | 51 | } |
21 | | - browsers.push(browser) |
22 | 52 | } |
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 | + } |
25 | 64 | } |
26 | 65 |
|
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 | +})() |
31 | 76 |
|
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 | + } |
35 | 120 |
|
36 | | - process.env['BROWSER'] = browser |
37 | | - await vite.build() |
| 121 | + const main_version = JSON.stringify(main_pkg.version.match(/\d+.\d+.\d+/)![0]) |
38 | 122 |
|
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 | + } |
41 | 176 | } |
0 commit comments