Skip to content

Commit 445a9d8

Browse files
committed
Feat: Add start of devtools extension
1 parent 02ee6fe commit 445a9d8

File tree

21 files changed

+2650
-62
lines changed

21 files changed

+2650
-62
lines changed

package-lock.json

Lines changed: 441 additions & 62 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

tools/devtools/icons/icon128.png

8.45 KB
Loading

tools/devtools/icons/icon16.png

1.58 KB
Loading

tools/devtools/icons/icon32.png

2.3 KB
Loading

tools/devtools/icons/icon48.png

3.25 KB
Loading
361 KB
Loading

tools/devtools/images/ss-ours.png

51.4 KB
Loading

tools/devtools/manifest.json

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,45 @@
1+
{
2+
"manifest_version": 3,
3+
"name": "Semantic UI DevTools",
4+
"version": "1.0.0",
5+
"description": "Developer tools for debugging Semantic UI web components",
6+
7+
"icons": {
8+
"16": "icons/icon16.png",
9+
"32": "icons/icon32.png",
10+
"48": "icons/icon48.png",
11+
"128": "icons/icon128.png"
12+
},
13+
14+
"devtools_page": "devtools/devtools.html",
15+
16+
"background": {
17+
"service_worker": "background/service-worker.js",
18+
"type": "module"
19+
},
20+
21+
"content_scripts": [
22+
{
23+
"matches": ["<all_urls>"],
24+
"js": ["content/content-script.js"],
25+
"run_at": "document_idle",
26+
"all_frames": true
27+
}
28+
],
29+
30+
"permissions": [
31+
"scripting",
32+
"activeTab"
33+
],
34+
35+
"host_permissions": [
36+
"<all_urls>"
37+
],
38+
39+
"web_accessible_resources": [
40+
{
41+
"resources": ["content/bridge.js"],
42+
"matches": ["<all_urls>"]
43+
}
44+
]
45+
}

tools/devtools/package.json

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
{
2+
"name": "@semantic-ui/devtools",
3+
"version": "1.0.0",
4+
"type": "module",
5+
"description": "Developer tools for debugging Semantic UI web components",
6+
"private": true,
7+
"scripts": {
8+
"build": "node scripts/build.js",
9+
"watch": "node scripts/watch.js",
10+
"clean": "rm -rf dist"
11+
}
12+
}

tools/devtools/scripts/build.js

Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,123 @@
1+
import * as esbuild from 'esbuild';
2+
import { copyFileSync, existsSync, mkdirSync, rmSync } from 'fs';
3+
import { dirname, join } from 'path';
4+
import { fileURLToPath } from 'url';
5+
6+
const __dirname = dirname(fileURLToPath(import.meta.url));
7+
const rootDir = join(__dirname, '..');
8+
const srcDir = join(rootDir, 'src');
9+
const distDir = join(rootDir, 'dist');
10+
11+
const isProd = process.env.NODE_ENV === 'production';
12+
13+
// Clean dist
14+
if (existsSync(distDir)) {
15+
rmSync(distDir, { recursive: true });
16+
}
17+
mkdirSync(distDir, { recursive: true });
18+
19+
// Build configurations
20+
const configs = [
21+
// Bridge script - IIFE for page context injection
22+
{
23+
entryPoints: [join(srcDir, 'content/bridge.js')],
24+
bundle: true,
25+
format: 'iife',
26+
outfile: join(distDir, 'content/bridge.js'),
27+
minify: isProd,
28+
sourcemap: !isProd,
29+
target: 'es2020',
30+
},
31+
32+
// Content script - IIFE (content scripts can't use ESM)
33+
{
34+
entryPoints: [join(srcDir, 'content/content-script.js')],
35+
bundle: true,
36+
format: 'iife',
37+
outfile: join(distDir, 'content/content-script.js'),
38+
minify: isProd,
39+
sourcemap: !isProd,
40+
target: 'es2020',
41+
},
42+
43+
// Service worker - ESM (supported in MV3)
44+
{
45+
entryPoints: [join(srcDir, 'background/service-worker.js')],
46+
bundle: true,
47+
format: 'esm',
48+
outfile: join(distDir, 'background/service-worker.js'),
49+
minify: isProd,
50+
sourcemap: !isProd,
51+
target: 'es2020',
52+
},
53+
54+
// Panel - ESM (loaded in panel.html as type="module")
55+
{
56+
entryPoints: [join(srcDir, 'panel/panel.js')],
57+
bundle: true,
58+
format: 'esm',
59+
outfile: join(distDir, 'panel/panel.js'),
60+
minify: isProd,
61+
sourcemap: !isProd,
62+
target: 'es2020',
63+
},
64+
65+
// DevTools entry - IIFE
66+
{
67+
entryPoints: [join(srcDir, 'devtools/devtools.js')],
68+
bundle: true,
69+
format: 'iife',
70+
outfile: join(distDir, 'devtools/devtools.js'),
71+
minify: isProd,
72+
sourcemap: !isProd,
73+
target: 'es2020',
74+
},
75+
];
76+
77+
// Build all
78+
console.log('Building extension...');
79+
80+
try {
81+
await Promise.all(configs.map(config => esbuild.build(config)));
82+
console.log('JavaScript bundles built.');
83+
}
84+
catch (err) {
85+
console.error('Build failed:', err);
86+
process.exit(1);
87+
}
88+
89+
// Copy static files
90+
const staticFiles = [
91+
[join(rootDir, 'manifest.json'), join(distDir, 'manifest.json')],
92+
[join(srcDir, 'devtools/devtools.html'), join(distDir, 'devtools/devtools.html')],
93+
[join(srcDir, 'panel/panel.html'), join(distDir, 'panel/panel.html')],
94+
[join(srcDir, 'panel/panel.css'), join(distDir, 'panel/panel.css')],
95+
];
96+
97+
// Copy icons if they exist
98+
const iconSizes = ['16', '32', '48', '128'];
99+
for (const size of iconSizes) {
100+
const iconSrc = join(rootDir, `icons/icon${size}.png`);
101+
const iconDest = join(distDir, `icons/icon${size}.png`);
102+
if (existsSync(iconSrc)) {
103+
staticFiles.push([iconSrc, iconDest]);
104+
}
105+
}
106+
107+
for (const [src, dest] of staticFiles) {
108+
try {
109+
mkdirSync(dirname(dest), { recursive: true });
110+
if (existsSync(src)) {
111+
copyFileSync(src, dest);
112+
}
113+
else {
114+
console.warn(`Warning: Source file not found: ${src}`);
115+
}
116+
}
117+
catch (err) {
118+
console.warn(`Warning: Could not copy ${src}: ${err.message}`);
119+
}
120+
}
121+
122+
console.log('Static files copied.');
123+
console.log(`Build complete! Output in ${distDir}`);

0 commit comments

Comments
 (0)