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.
- package/README.md +93 -0
- package/bin/index.js +42 -3
- package/package.json +24 -2
- package/src/commands/init.js +31 -31
- package/src/commands/update.js +67 -0
- package/src/index.js +1 -0
- package/template/config/chrome.js +13 -5
- package/template/config/edge.js +14 -6
- package/template/config/firefox.js +2 -2
- package/template/config/naver.js +14 -6
- package/template/config/opera.js +14 -6
- package/template/config/thunderbird.js +2 -2
- package/template/package.json.tpl +38 -23
- package/template/platform/chrome/platform.js +13 -0
- package/template/platform/edge/platform.js +14 -0
- package/template/platform/naver/platform.js +28 -0
- package/template/platform/opera/platform.js +14 -0
- package/template/src/_locales/en.i18n +3 -2
- package/template/src/assets/icons/128.png +0 -0
- package/template/src/assets/icons/32.png +0 -0
- package/template/src/assets/icons/48.png +0 -0
- package/template/src/assets/icons/64.png +0 -0
- package/template/src/js/background.js +6 -1
- package/template/src/js/lib/browser.js +263 -0
- package/template/src/js/lib/common.js +14 -0
- package/template/src/js/lib/config.js +21 -0
- package/template/src/js/lib/runtime.js +83 -0
- package/template/src/manifest/manifest-firefox.json +10 -7
- package/template/src/manifest/manifest.json +10 -7
- package/{template → workspace}/tasks/build.js +18 -10
- package/{template → workspace}/tasks/bundle-css.js +27 -34
- package/{template → workspace}/tasks/bundle-js.js +0 -1
- package/{template → workspace}/tasks/cli.js +12 -6
- package/{template → workspace}/tasks/copy.js +1 -2
- package/{template → workspace}/tasks/paths.js +2 -3
- package/{template → workspace}/tasks/zip.js +1 -1
- package/{template → workspace}/tools/json2i18n.js +7 -3
- package/template/tasks/translate.js +0 -255
- /package/template/src/{scss/popup.scss → css/popup.css} +0 -0
- /package/{template → workspace}/tasks/bundle-html.js +0 -0
- /package/{template → workspace}/tasks/bundle-locales.js +0 -0
- /package/{template → workspace}/tasks/bundle-manifest.js +0 -0
- /package/{template → workspace}/tasks/folder.js +0 -0
- /package/{template → workspace}/tasks/task.js +0 -0
- /package/{template → workspace}/tasks/utils.js +0 -0
- /package/{template → workspace}/tasks/watch.js +0 -0
- /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
|
-
|
|
47
|
+
Addonova — browser extension toolkit
|
|
16
48
|
|
|
17
49
|
Usage:
|
|
18
|
-
npx addonova init <
|
|
19
|
-
npx addonova
|
|
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.
|
|
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
|
-
"
|
|
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",
|
package/src/commands/init.js
CHANGED
|
@@ -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
|
|
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('
|
|
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(
|
|
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
|
|
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
|
|
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('
|
|
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
|
-
│
|
|
96
|
-
│
|
|
94
|
+
┌──────────────────────────────────────────────
|
|
95
|
+
│ [+] "${projectName}" is ready!
|
|
96
|
+
│
|
|
97
97
|
│ ${projectDir} │
|
|
98
|
-
│
|
|
99
|
-
│ Next steps:
|
|
100
|
-
│ cd ${projectName}
|
|
101
|
-
│ npm run
|
|
102
|
-
│ npm run
|
|
103
|
-
│ npm run
|
|
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,15 +1,23 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
js: {
|
|
3
3
|
entry: {
|
|
4
|
-
'': ['src/js/background.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
|
-
|
|
18
|
+
css: {
|
|
11
19
|
entry: {
|
|
12
|
-
'': ['src/
|
|
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
|
};
|
package/template/config/edge.js
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
js: {
|
|
3
3
|
entry: {
|
|
4
|
-
'': ['src/js/background.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
|
-
|
|
18
|
+
css: {
|
|
11
19
|
entry: {
|
|
12
|
-
'': ['src/
|
|
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
|
+
};
|
package/template/config/naver.js
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
js: {
|
|
3
3
|
entry: {
|
|
4
|
-
'': ['src/js/background.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
|
-
|
|
18
|
+
css: {
|
|
11
19
|
entry: {
|
|
12
|
-
'': ['src/
|
|
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
|
+
};
|
package/template/config/opera.js
CHANGED
|
@@ -1,15 +1,23 @@
|
|
|
1
1
|
export default {
|
|
2
2
|
js: {
|
|
3
3
|
entry: {
|
|
4
|
-
'': ['src/js/background.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
|
-
|
|
18
|
+
css: {
|
|
11
19
|
entry: {
|
|
12
|
-
'': ['src/
|
|
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
|
+
};
|