addonova 1.0.0 → 1.0.2

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.
Files changed (47) hide show
  1. package/README.md +93 -0
  2. package/bin/index.js +42 -3
  3. package/package.json +24 -2
  4. package/src/commands/init.js +31 -31
  5. package/src/commands/update.js +67 -0
  6. package/src/index.js +1 -0
  7. package/template/config/chrome.js +13 -5
  8. package/template/config/edge.js +14 -6
  9. package/template/config/firefox.js +2 -2
  10. package/template/config/naver.js +14 -6
  11. package/template/config/opera.js +14 -6
  12. package/template/config/thunderbird.js +2 -2
  13. package/template/package.json.tpl +38 -23
  14. package/template/platform/chrome/platform.js +13 -0
  15. package/template/platform/edge/platform.js +14 -0
  16. package/template/platform/naver/platform.js +28 -0
  17. package/template/platform/opera/platform.js +14 -0
  18. package/template/src/_locales/en.i18n +3 -2
  19. package/template/src/assets/icons/128.png +0 -0
  20. package/template/src/assets/icons/32.png +0 -0
  21. package/template/src/assets/icons/48.png +0 -0
  22. package/template/src/assets/icons/64.png +0 -0
  23. package/template/src/js/background.js +6 -1
  24. package/template/src/js/lib/browser.js +263 -0
  25. package/template/src/js/lib/common.js +14 -0
  26. package/template/src/js/lib/config.js +21 -0
  27. package/template/src/js/lib/runtime.js +83 -0
  28. package/template/src/manifest/manifest-firefox.json +10 -7
  29. package/template/src/manifest/manifest.json +10 -7
  30. package/{template → workspace}/tasks/build.js +18 -10
  31. package/{template → workspace}/tasks/bundle-css.js +27 -34
  32. package/{template → workspace}/tasks/bundle-js.js +0 -1
  33. package/{template → workspace}/tasks/cli.js +12 -6
  34. package/{template → workspace}/tasks/copy.js +1 -2
  35. package/{template → workspace}/tasks/paths.js +2 -3
  36. package/{template → workspace}/tasks/zip.js +1 -1
  37. package/{template → workspace}/tools/json2i18n.js +7 -3
  38. package/template/tasks/translate.js +0 -255
  39. /package/template/src/{scss/popup.scss → css/popup.css} +0 -0
  40. /package/{template → workspace}/tasks/bundle-html.js +0 -0
  41. /package/{template → workspace}/tasks/bundle-locales.js +0 -0
  42. /package/{template → workspace}/tasks/bundle-manifest.js +0 -0
  43. /package/{template → workspace}/tasks/folder.js +0 -0
  44. /package/{template → workspace}/tasks/task.js +0 -0
  45. /package/{template → workspace}/tasks/utils.js +0 -0
  46. /package/{template → workspace}/tasks/watch.js +0 -0
  47. /package/{template → workspace}/tools/translate.js +0 -0
package/README.md CHANGED
@@ -1,2 +1,95 @@
1
1
  # addonova
2
+
2
3
  Next-Generation Web Extension Framework
4
+
5
+ Scaffold and build cross-browser WebExtensions with a modern toolchain.
6
+
7
+ ## Usage
8
+
9
+ ```bash
10
+ npx addonova init my-extension
11
+ cd my-extension
12
+ npm run release
13
+ ```
14
+
15
+ ## Supported Browsers
16
+
17
+ - Chrome (MV3)
18
+ - Firefox
19
+ - Microsoft Edge
20
+ - Opera
21
+ - Naver Whale
22
+ - Thunderbird
23
+
24
+ ## Commands
25
+
26
+ | Command | Description |
27
+ |---------|-------------|
28
+ | `init <name>` | Scaffold a new extension project |
29
+ | `update` | Update workspace/build files to latest template |
30
+ | `build [options]` | Build the extension |
31
+ | `zip` | Create zip bundles |
32
+ | `--help` | Show help |
33
+
34
+ ## Build Targets
35
+
36
+ ```bash
37
+ npm run release # Release build (all)
38
+ npm run release:chrome # Release (Chrome)
39
+ npm run release:firefox # Release (Firefox)
40
+ npm run debug # Debug build (all)
41
+ npm run debug:chrome # Debug (Chrome)
42
+ npm run watch # Watch mode
43
+ npm run zip # Create zip bundles
44
+ npx addonova build --all --release # Build via CLI
45
+ npx addonova --help # Show help
46
+ ```
47
+
48
+ ## Project Structure
49
+
50
+ ```
51
+ my-extension/
52
+ ├── config/ # Build config per browser
53
+ │ ├── chrome.js
54
+ │ ├── firefox.js
55
+ │ └── ...
56
+ ├── platform/ # Platform-specific polyfills
57
+ │ ├── chrome/platform.js
58
+ │ ├── firefox/platform.js
59
+ │ └── ...
60
+ ├── src/
61
+ │ ├── _locales/ # i18n locale files (.i18n)
62
+ │ ├── assets/ # Static assets (icons, etc.)
63
+ │ ├── css/ # Stylesheets
64
+ │ ├── html/ # HTML pages
65
+ │ ├── js/ # JavaScript source
66
+ │ │ ├── background.js
67
+ │ │ ├── popup.js
68
+ │ │ └── lib/ # Shared runtime libs
69
+ │ └── manifest/ # Manifest JSON templates
70
+ ├── .output/ # Build output
71
+ │ ├── release/ # Release builds
72
+ │ └── debug/ # Debug builds
73
+ └── package.json
74
+ ```
75
+
76
+ ## Locales / i18n
77
+
78
+ Locale files use the `.i18n` format:
79
+
80
+ ```
81
+ @extensionName
82
+ My Extension
83
+ @extensionDescription
84
+ This is my extension description.
85
+ ```
86
+
87
+ Run the interactive message manager:
88
+
89
+ ```bash
90
+ node node_modules/addonova/workspace/tools/translate.js
91
+ ```
92
+
93
+ ## Requirements
94
+
95
+ - Node.js >= 18
package/bin/index.js CHANGED
@@ -1,6 +1,13 @@
1
1
  #!/usr/bin/env node
2
+ import { fork } from 'node:child_process';
2
3
  import process from 'node:process';
4
+ import { dirname, resolve } from 'node:path';
5
+ import { fileURLToPath } from 'node:url';
6
+ import { existsSync } from 'node:fs';
7
+
8
+ const __dirname = dirname(fileURLToPath(import.meta.url));
3
9
  import { init } from '../src/commands/init.js';
10
+ import { update } from '../src/commands/update.js';
4
11
 
5
12
  const [command, ...args] = process.argv.slice(2);
6
13
 
@@ -8,15 +15,47 @@ switch (command) {
8
15
  case 'init':
9
16
  await init(args);
10
17
  break;
18
+ case 'update':
19
+ await update();
20
+ break;
21
+ case 'build':
22
+ case 'zip': {
23
+ const cliPath = resolve(__dirname, '../workspace/tasks/cli.js');
24
+ if (!existsSync(cliPath)) {
25
+ console.error('[*] Addonova workspace not found. Reinstall the package.');
26
+ process.exit(1);
27
+ }
28
+ const child = fork(cliPath, [command, ...args], {
29
+ execArgv: ['--max-old-space-size=3072']
30
+ });
31
+ process.on('SIGINT', () => {
32
+ child.kill('SIGKILL');
33
+ process.exit(130);
34
+ });
35
+ await new Promise((resolve, reject) =>
36
+ child.on('error', reject).on('close', (code) => {
37
+ if (code !== 0) process.exit(code);
38
+ resolve();
39
+ })
40
+ );
41
+ break;
42
+ }
11
43
  case '--help':
12
44
  case '-h':
13
45
  default:
14
46
  console.log(`
15
- addonovaCross-browser WebExtension toolkit
47
+ Addonova — browser extension toolkit
16
48
 
17
49
  Usage:
18
- npx addonova init <project-name> Scaffold a new extension project
19
- npx addonova --help Show this help
50
+ npx addonova init <my-extension> Scaffold a new extension project
51
+ npx addonova update Update workspace/build files in existing project
52
+ npx addonova build [options] Build the extension
53
+ npx addonova zip Create zip bundles
54
+ npx addonova --help Show this help
55
+
56
+ Build options:
57
+ --all, --chrome, --firefox, --edge, --opera, --naver, --thunderbird
58
+ --release, --debug, --watch, --test, --version=x.x.x
20
59
  `);
21
60
  break;
22
61
  }
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "addonova",
3
- "version": "1.0.0",
3
+ "version": "1.0.2",
4
4
  "description": "Web Extension Framework",
5
5
  "type": "module",
6
6
  "bin": {
@@ -13,10 +13,32 @@
13
13
  "files": [
14
14
  "bin/",
15
15
  "src/",
16
+ "workspace/",
16
17
  "template/"
17
18
  ],
18
19
  "scripts": {
19
- "test": "echo \"Error: no test specified\" && exit 1"
20
+ "addonova-release": "node --max-old-space-size=3072 workspace/tasks/cli.js build --all --release",
21
+ "addonova-release:chrome": "node --max-old-space-size=3072 workspace/tasks/cli.js build --chrome --release",
22
+ "addonova-release:edge": "node --max-old-space-size=3072 workspace/tasks/cli.js build --edge --release",
23
+ "addonova-release:opera": "node --max-old-space-size=3072 workspace/tasks/cli.js build --opera --release",
24
+ "addonova-release:firefox": "node --max-old-space-size=3072 workspace/tasks/cli.js build --firefox --release",
25
+ "addonova-release:thunderbird": "node --max-old-space-size=3072 workspace/tasks/cli.js build --thunderbird --release",
26
+ "addonova-release:naver": "node --max-old-space-size=3072 workspace/tasks/cli.js build --naver --release",
27
+ "addonova-debug": "node --max-old-space-size=3072 workspace/tasks/cli.js build --all --debug",
28
+ "addonova-debug:chrome": "node --max-old-space-size=3072 workspace/tasks/cli.js build --chrome --debug",
29
+ "addonova-debug:edge": "node --max-old-space-size=3072 workspace/tasks/cli.js build --edge --debug",
30
+ "addonova-debug:opera": "node --max-old-space-size=3072 workspace/tasks/cli.js build --opera --debug",
31
+ "addonova-debug:firefox": "node --max-old-space-size=3072 workspace/tasks/cli.js build --firefox --debug",
32
+ "addonova-debug:thunderbird": "node --max-old-space-size=3072 workspace/tasks/cli.js build --thunderbird --debug",
33
+ "addonova-debug:naver": "node --max-old-space-size=3072 workspace/tasks/cli.js build --naver --debug",
34
+ "addonova-watch": "node --max-old-space-size=3072 workspace/tasks/cli.js build --all --debug --watch"
35
+ },
36
+ "dependencies": {
37
+ "@craftamap/esbuild-plugin-html": "^0.9.0",
38
+ "chokidar": "^5.0.0",
39
+ "esbuild": "^0.27.3",
40
+ "globby": "^16.1.0",
41
+ "yazl": "^3.3.1"
20
42
  },
21
43
  "keywords": [
22
44
  "webextension",
@@ -9,21 +9,31 @@ const __dirname = path.dirname(fileURLToPath(import.meta.url));
9
9
  const TEMPLATE_DIR = path.resolve(__dirname, '../../template');
10
10
 
11
11
  const VARIABLE_RE = /\{\{\s*(\w+)\s*\}\}/g;
12
+ const SKIP_DIRS = new Set(['workspace']);
12
13
 
13
14
  function render(template, vars) {
14
15
  return template.replace(VARIABLE_RE, (_, key) => vars[key] ?? `{{${key}}}`);
15
16
  }
16
17
 
17
- async function copyDir(src, dest, vars) {
18
+ async function copyDir(src, dest, vars, selected = []) {
18
19
  await fs.mkdir(dest, { recursive: true });
19
20
  const entries = await fs.readdir(src, { withFileTypes: true });
21
+ const dirName = path.basename(src);
20
22
 
21
23
  for (const entry of entries) {
24
+ const entryName = path.basename(entry.name, path.extname(entry.name));
25
+
26
+ if (entry.isDirectory() && SKIP_DIRS.has(entry.name)) continue;
27
+
28
+ if ((dirName === 'config' || dirName === 'platform') && selected.length > 0 && !selected.includes(entryName)) {
29
+ continue;
30
+ }
31
+
22
32
  const srcPath = path.join(src, entry.name);
23
33
  const destPath = path.join(dest, entry.name.replace(/\.tpl$/, ''));
24
34
 
25
35
  if (entry.isDirectory()) {
26
- await copyDir(srcPath, destPath, vars);
36
+ await copyDir(srcPath, destPath, vars, selected);
27
37
  } else if (entry.name.endsWith('.tpl')) {
28
38
  const content = await fs.readFile(srcPath, 'utf-8');
29
39
  await fs.writeFile(destPath, render(content, vars), 'utf-8');
@@ -34,20 +44,11 @@ async function copyDir(src, dest, vars) {
34
44
  }
35
45
 
36
46
  async function installDependencies(projectDir) {
37
- console.log('\n Installing dependencies...');
47
+ console.log('\n[+] Installing dependencies...');
38
48
  const { execSync } = await import('node:child_process');
39
49
  execSync('npm install', { cwd: projectDir, stdio: 'inherit' });
40
50
  }
41
51
 
42
- async function detectPackageManager() {
43
- const hasLock = f => existsSync(path.join(process.cwd(), f));
44
-
45
- if (hasLock('pnpm-lock.yaml')) return 'pnpm';
46
- if (hasLock('yarn.lock')) return 'yarn';
47
- if (hasLock('package-lock.json') || hasLock('bun.lock')) return 'npm';
48
- return 'npm';
49
- }
50
-
51
52
  export async function init(args) {
52
53
  let projectName = args[0];
53
54
 
@@ -56,14 +57,14 @@ export async function init(args) {
56
57
  }
57
58
 
58
59
  if (!projectName) {
59
- console.error(' Project name is required.');
60
+ console.error('[*] Project name is required.');
60
61
  process.exit(1);
61
62
  }
62
63
 
63
64
  const projectDir = path.resolve(process.cwd(), projectName);
64
65
 
65
66
  if (existsSync(projectDir)) {
66
- console.error(`❌ Directory "${projectName}" already exists.`);
67
+ console.error(`[*] Directory "${projectName}" already exists.`);
67
68
  process.exit(1);
68
69
  }
69
70
 
@@ -72,37 +73,36 @@ export async function init(args) {
72
73
 
73
74
  const vars = {
74
75
  name: projectName,
75
- description: 'A cross-browser WebExtension',
76
+ description: 'A Browser Extension',
76
77
  version: '1.0.0',
77
78
  browsers: JSON.stringify(selected),
78
79
  browsersList: selected.join(', '),
79
80
  year: new Date().getFullYear().toString(),
80
81
  };
81
82
 
82
- console.log(`\n📁 Scaffolding "${projectName}" for: ${selected.join(', ')}`);
83
- await copyDir(TEMPLATE_DIR, projectDir, vars);
83
+ console.log(`\n[+] Scaffolding "${projectName}" for: ${selected.join(', ')}`);
84
+ await copyDir(TEMPLATE_DIR, projectDir, vars, selected);
84
85
 
85
- console.log(' Template files created.');
86
+ console.log('[+] Template files created.');
86
87
 
87
- const pm = detectPackageManager();
88
88
  const shouldInstall = await askQuestion('\nRun npm install now? (Y/n): ');
89
89
  if (shouldInstall.toLowerCase() !== 'n') {
90
90
  await installDependencies(projectDir);
91
91
  }
92
92
 
93
93
  console.log(`
94
- ┌──────────────────────────────────────────────┐
95
- "${projectName}" is ready!
96
-
94
+ ┌──────────────────────────────────────────────
95
+ [+] "${projectName}" is ready!
96
+
97
97
  │ ${projectDir} │
98
-
99
- │ Next steps:
100
- │ cd ${projectName}
101
- │ npm run build -- --all │
102
- │ npm run build -- --chrome --debug │
103
- │ npm run build -- --firefox --watch
104
-
105
- │ Targets: ${selected.join(', ').padEnd(30)}
106
- └──────────────────────────────────────────────┘
98
+
99
+ │ Next steps:
100
+ │ cd ${projectName}
101
+ │ npm run release
102
+ │ npm run debug:chrome
103
+ │ npm run watch
104
+
105
+ │ Targets: ${selected.join(', ').padEnd(30)}
106
+ └──────────────────────────────────────────────
107
107
  `);
108
108
  }
@@ -0,0 +1,67 @@
1
+ import { existsSync } from 'node:fs';
2
+ import fs from 'node:fs/promises';
3
+ import path from 'node:path';
4
+ import { fileURLToPath } from 'node:url';
5
+ import process from 'node:process';
6
+
7
+ const __dirname = path.dirname(fileURLToPath(import.meta.url));
8
+ const TEMPLATE_DIR = path.resolve(__dirname, '../../template');
9
+ const VARIABLE_RE = /\{\{\s*(\w+)\s*\}\}/g;
10
+ const SKIP_DIRS = new Set(['config', 'src', 'platform', 'workspace']);
11
+
12
+ function render(template, vars) {
13
+ return template.replace(VARIABLE_RE, (_, key) => vars[key] ?? `{{${key}}}`);
14
+ }
15
+
16
+ async function copyDir(src, dest, vars) {
17
+ await fs.mkdir(dest, { recursive: true });
18
+ const entries = await fs.readdir(src, { withFileTypes: true });
19
+
20
+ for (const entry of entries) {
21
+ if (entry.isDirectory() && SKIP_DIRS.has(entry.name)) continue;
22
+
23
+ const srcPath = path.join(src, entry.name);
24
+ const destPath = path.join(dest, entry.name.replace(/\.tpl$/, ''));
25
+
26
+ if (entry.isDirectory()) {
27
+ await copyDir(srcPath, destPath, vars);
28
+ } else if (entry.name.endsWith('.tpl')) {
29
+ const content = await fs.readFile(srcPath, 'utf-8');
30
+ await fs.writeFile(destPath, render(content, vars), 'utf-8');
31
+ } else {
32
+ await fs.copyFile(srcPath, destPath);
33
+ }
34
+ }
35
+ }
36
+
37
+ export async function update() {
38
+ const cwd = process.cwd();
39
+ const pkgPath = path.join(cwd, 'package.json');
40
+
41
+ if (!existsSync(pkgPath)) {
42
+ console.error('[*] No package.json found. Run this command inside an addonova project.');
43
+ process.exit(1);
44
+ }
45
+
46
+ let pkg;
47
+ try {
48
+ pkg = JSON.parse(await fs.readFile(pkgPath, 'utf-8'));
49
+ } catch {
50
+ console.error('[*] Invalid package.json.');
51
+ process.exit(1);
52
+ }
53
+
54
+ const vars = {
55
+ name: pkg.name || 'extension',
56
+ description: pkg.description || 'A cross-browser WebExtension',
57
+ version: pkg.version || '1.0.0',
58
+ browsers: JSON.stringify([]),
59
+ browsersList: '',
60
+ year: new Date().getFullYear().toString(),
61
+ };
62
+
63
+ console.log(`[+] Updating "${pkg.name}" (keeping config/, src/, platform/)`);
64
+ await copyDir(TEMPLATE_DIR, cwd, vars);
65
+
66
+ console.log('[+] Update complete.');
67
+ }
package/src/index.js CHANGED
@@ -1 +1,2 @@
1
1
  export { init } from './commands/init.js';
2
+ export { update } from './commands/update.js';
@@ -1,15 +1,23 @@
1
1
  export default {
2
2
  js: {
3
3
  entry: {
4
- '': ['src/js/background.js', 'src/js/popup.js'],
4
+ '': ['src/js/background.js'],
5
+ 'lib': [
6
+ 'platform/chrome/platform.js',
7
+ 'src/js/lib/browser.js',
8
+ 'src/js/lib/runtime.js',
9
+ 'src/js/lib/config.js',
10
+ 'src/js/lib/common.js'
11
+ ],
12
+ 'data/interface': ['src/js/popup.js'],
5
13
  },
6
14
  filename: '[name]',
7
15
  minify: true,
8
16
  sourcemap: false,
9
17
  },
10
- scss: {
18
+ css: {
11
19
  entry: {
12
- '': ['src/scss/popup.scss'],
20
+ 'data/interface': ['src/css/popup.css'],
13
21
  },
14
22
  filename: '[name]',
15
23
  minify: true,
@@ -17,13 +25,13 @@ export default {
17
25
  },
18
26
  html: {
19
27
  entry: {
20
- '': ['src/html/popup.html'],
28
+ 'data/interface': ['src/html/popup.html'],
21
29
  },
22
30
  filename: '[name]',
23
31
  },
24
32
  assets: {
25
33
  entry: {
26
- '': ['src/assets/**/*'],
34
+ 'data/icons': ['src/assets/icons'],
27
35
  },
28
36
  },
29
37
  };
@@ -1,15 +1,23 @@
1
1
  export default {
2
2
  js: {
3
3
  entry: {
4
- '': ['src/js/background.js', 'src/js/popup.js'],
4
+ '': ['src/js/background.js'],
5
+ 'lib': [
6
+ 'platform/edge/platform.js',
7
+ 'src/js/lib/browser.js',
8
+ 'src/js/lib/runtime.js',
9
+ 'src/js/lib/config.js',
10
+ 'src/js/lib/common.js'
11
+ ],
12
+ 'data/interface': ['src/js/popup.js'],
5
13
  },
6
14
  filename: '[name]',
7
15
  minify: true,
8
16
  sourcemap: false,
9
17
  },
10
- scss: {
18
+ css: {
11
19
  entry: {
12
- '': ['src/scss/popup.scss'],
20
+ 'data/interface': ['src/css/popup.css'],
13
21
  },
14
22
  filename: '[name]',
15
23
  minify: true,
@@ -17,13 +25,13 @@ export default {
17
25
  },
18
26
  html: {
19
27
  entry: {
20
- '': ['src/html/popup.html'],
28
+ 'data/interface': ['src/html/popup.html'],
21
29
  },
22
30
  filename: '[name]',
23
31
  },
24
32
  assets: {
25
33
  entry: {
26
- '': ['src/assets/**/*'],
34
+ 'data/icons': ['src/assets/icons'],
27
35
  },
28
36
  },
29
- };
37
+ };
@@ -7,9 +7,9 @@ export default {
7
7
  minify: true,
8
8
  sourcemap: false,
9
9
  },
10
- scss: {
10
+ css: {
11
11
  entry: {
12
- '': ['src/scss/popup.scss'],
12
+ '': ['src/css/popup.css'],
13
13
  },
14
14
  filename: '[name]',
15
15
  minify: true,
@@ -1,15 +1,23 @@
1
1
  export default {
2
2
  js: {
3
3
  entry: {
4
- '': ['src/js/background.js', 'src/js/popup.js'],
4
+ '': ['src/js/background.js'],
5
+ 'lib': [
6
+ 'platform/naver/platform.js',
7
+ 'src/js/lib/browser.js',
8
+ 'src/js/lib/runtime.js',
9
+ 'src/js/lib/config.js',
10
+ 'src/js/lib/common.js'
11
+ ],
12
+ 'data/interface': ['src/js/popup.js'],
5
13
  },
6
14
  filename: '[name]',
7
15
  minify: true,
8
16
  sourcemap: false,
9
17
  },
10
- scss: {
18
+ css: {
11
19
  entry: {
12
- '': ['src/scss/popup.scss'],
20
+ 'data/interface': ['src/css/popup.css'],
13
21
  },
14
22
  filename: '[name]',
15
23
  minify: true,
@@ -17,13 +25,13 @@ export default {
17
25
  },
18
26
  html: {
19
27
  entry: {
20
- '': ['src/html/popup.html'],
28
+ 'data/interface': ['src/html/popup.html'],
21
29
  },
22
30
  filename: '[name]',
23
31
  },
24
32
  assets: {
25
33
  entry: {
26
- '': ['src/assets/**/*'],
34
+ 'data/icons': ['src/assets/icons'],
27
35
  },
28
36
  },
29
- };
37
+ };
@@ -1,15 +1,23 @@
1
1
  export default {
2
2
  js: {
3
3
  entry: {
4
- '': ['src/js/background.js', 'src/js/popup.js'],
4
+ '': ['src/js/background.js'],
5
+ 'lib': [
6
+ 'platform/opera/platform.js',
7
+ 'src/js/lib/browser.js',
8
+ 'src/js/lib/runtime.js',
9
+ 'src/js/lib/config.js',
10
+ 'src/js/lib/common.js'
11
+ ],
12
+ 'data/interface': ['src/js/popup.js'],
5
13
  },
6
14
  filename: '[name]',
7
15
  minify: true,
8
16
  sourcemap: false,
9
17
  },
10
- scss: {
18
+ css: {
11
19
  entry: {
12
- '': ['src/scss/popup.scss'],
20
+ 'data/interface': ['src/css/popup.css'],
13
21
  },
14
22
  filename: '[name]',
15
23
  minify: true,
@@ -17,13 +25,13 @@ export default {
17
25
  },
18
26
  html: {
19
27
  entry: {
20
- '': ['src/html/popup.html'],
28
+ 'data/interface': ['src/html/popup.html'],
21
29
  },
22
30
  filename: '[name]',
23
31
  },
24
32
  assets: {
25
33
  entry: {
26
- '': ['src/assets/**/*'],
34
+ 'data/icons': ['src/assets/icons'],
27
35
  },
28
36
  },
29
- };
37
+ };
@@ -7,9 +7,9 @@ export default {
7
7
  minify: true,
8
8
  sourcemap: false,
9
9
  },
10
- scss: {
10
+ css: {
11
11
  entry: {
12
- '': ['src/scss/popup.scss'],
12
+ '': ['src/css/popup.css'],
13
13
  },
14
14
  filename: '[name]',
15
15
  minify: true,