Skip to content

Commit ac550db

Browse files
authored
Merge branch 'master' into add-manifest-transformer
2 parents 53c8c49 + 2f6e5e0 commit ac550db

File tree

15 files changed

+1781
-1040
lines changed

15 files changed

+1781
-1040
lines changed

.eslintignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
generator/template/background/src/background.js

.eslintrc.js

Lines changed: 2 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,12 +3,9 @@ module.exports = {
33
env: {
44
node: true
55
},
6-
'extends': [
7-
'plugin:vue/essential',
8-
'@vue/standard'
9-
],
6+
extends: ['plugin:vue/essential', '@vue/standard'],
107
rules: {
118
'no-console': process.env.NODE_ENV === 'production' ? 'error' : 'off',
129
'no-debugger': process.env.NODE_ENV === 'production' ? 'error' : 'off'
13-
},
10+
}
1411
}

README.md

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,15 @@ I hope to be able to scaffold an app so that identifying the below in unnecessar
3737
|- App.vue
3838
|- popup.html
3939
|- popup.js
40+
|- override/
41+
|- router/
42+
|- pages/
43+
|- Index.vue
44+
|- index.js
45+
|- routes.js
46+
|- App.vue
47+
|- override.html
48+
|- override.js
4049
|- standalone/
4150
|- router/
4251
|- pages/
@@ -102,6 +111,7 @@ module.exports = {
102111
- popup
103112
- options
104113
- contentScripts
114+
- override
105115
- standalone
106116

107117
```js

generator/index.js

Lines changed: 15 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -30,11 +30,11 @@ module.exports = (api, _options) => {
3030
const pkg = {
3131
private: true,
3232
scripts: {
33-
'serve': 'vue-cli-service build --mode development --watch'
33+
serve: 'vue-cli-service build --mode development --watch'
3434
},
3535
dependencies: {
3636
'vue-router': '^3.0.1',
37-
'vuex': '^3.0.1'
37+
vuex: '^3.0.1'
3838
},
3939
vue: {
4040
pages: {},
@@ -68,6 +68,7 @@ module.exports = (api, _options) => {
6868

6969
pkg.vue.pages['popup/popup'] = {
7070
entry: 'src/popup/popup.js',
71+
template: 'src/popup/popup.html',
7172
title: 'Popup'
7273
}
7374
}
@@ -77,16 +78,28 @@ module.exports = (api, _options) => {
7778

7879
pkg.vue.pages['options/options'] = {
7980
entry: 'src/options/options.js',
81+
template: 'src/options/options.html',
8082
title: 'Options'
8183
}
8284
}
8385

86+
if (options.components.override) {
87+
api.render('./template/override', { name, ...options })
88+
89+
pkg.vue.pages['override/override'] = {
90+
entry: 'src/override/override.js',
91+
template: 'src/override/override.html',
92+
title: 'Override'
93+
}
94+
}
95+
8496
if (options.components.standalone) {
8597
console.log('Generating standalone app')
8698
api.render('./template/standalone', { name, ...options })
8799

88100
pkg.vue.pages['standalone/standalone'] = {
89101
entry: 'src/standalone/standalone.js',
102+
template: 'src/standalone/standalone.html',
90103
filename: 'app.html',
91104
title: name
92105
}

generator/template/base-app/src/manifest.json

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -12,30 +12,42 @@
1212
"permissions": [
1313
<%_ if (options.components.contentScripts) { -%>
1414
"activeTab",
15-
<%_ } -%>
15+
<%_
16+
} -%>
1617
"<all_urls>",
1718
"*://*/*"
1819
],
1920
<%_ if (options.components.background) { -%>
2021
"background": {
21-
"scripts": ["background.js"],
22-
"persistent": false
23-
},
24-
<%_ } -%>
22+
"scripts": [
23+
"background.js"
24+
],
25+
"persistent": false
26+
},
27+
<%_
28+
} -%>
2529
"browser_action": {
2630
<%_ if (options.components.popup) { -%>
2731
"default_popup": "popup/popup.html",
28-
<%_ } -%>
32+
<%_
33+
} -%>
2934
"default_title": "__MSG_extName__",
3035
"default_icon": {
3136
"19": "icons/19.png",
3237
"38": "icons/38.png"
3338
}
3439
<%_ if (options.components.options) { -%>
35-
},
36-
"options_ui": {
37-
"page": "options/options.html",
38-
"<%- options.api %>_style": true
39-
<%_ } -%>
40+
},
41+
"options_ui": {
42+
"page": "options/options.html",
43+
"<%- options.api %>_style": true
44+
<%_
45+
} -%>
4046
}
47+
<%_ if (options.components.override) { -%>
48+
"chrome_url_overrides": {
49+
"<%- options.components.overrideOption || 'newtab' %>": "override/override.html"
50+
}
51+
<%_
52+
} -%>
4153
}
Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import * as types from './mutation-types'
22

3-
export const setFoo = ({commit}, payload) => {
3+
export const setFoo = ({ commit }, payload) => {
44
commit(types.UPDATE_FOO, payload)
55
}
Lines changed: 22 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,22 @@
1+
<template>
2+
<div>
3+
<p>{{ defaultText }}</p>
4+
</div>
5+
</template>
6+
7+
<script>
8+
export default {
9+
name: 'App',
10+
computed: {
11+
defaultText() {
12+
return <%- options.api %>.i18n.getMessage('extName');
13+
}
14+
}
15+
}
16+
</script>
17+
18+
<style scoped>
19+
p {
20+
font-size: 20px;
21+
}
22+
</style>
Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,12 @@
1+
<!DOCTYPE html>
2+
<html lang="en">
3+
<head>
4+
<meta charset="UTF-8">
5+
<meta http-equiv="X-UA-Compatible" content="IE=edge">
6+
<meta name="viewport" content="width=device-width,initial-scale=1.0">
7+
<title><%- '\<\%= htmlWebpackPlugin.options.title \%\>' %></title>
8+
</head>
9+
<body>
10+
<div id="app"></div>
11+
</body>
12+
</html>
Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,8 @@
1+
import Vue from 'vue'
2+
import App from './App'
3+
4+
/* eslint-disable no-new */
5+
new Vue({
6+
el: '#app',
7+
render: h => h(App)
8+
})

index.js

Lines changed: 71 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -13,9 +13,9 @@ const defaultOptions = {
1313
manifestTransformer: null
1414
}
1515
const performanceAssetFilterList = [
16-
(file) => !(/\.map$/.test(file)),
16+
(file) => !/\.map$/.test(file),
1717
(file) => !file.endsWith('.zip'),
18-
(file) => !(/^icons\//.test(file))
18+
(file) => !/^icons\//.test(file)
1919
]
2020

2121
function getManifestJsonString(pluginOptions, jsonContent) {
@@ -28,10 +28,11 @@ function getManifestJsonString(pluginOptions, jsonContent) {
2828

2929
module.exports = (api, options) => {
3030
const appRootPath = api.getCwd()
31-
const pluginOptions = options.pluginOptions.browserExtension ? Object.assign(defaultOptions, options.pluginOptions.browserExtension) : defaultOptions
31+
const pluginOptions = options.pluginOptions.browserExtension
32+
? Object.assign(defaultOptions, options.pluginOptions.browserExtension)
33+
: defaultOptions
3234
const componentOptions = pluginOptions.componentOptions
3335
const packageJson = require(path.join(appRootPath, 'package.json'))
34-
const isDevelopment = api.service.mode === 'development'
3536
const isProduction = api.service.mode === 'production'
3637
const keyFile = api.resolve('key.pem')
3738
const hasKeyFile = fs.existsSync(keyFile)
@@ -49,10 +50,10 @@ module.exports = (api, options) => {
4950
if (!Array.isArray(paths)) {
5051
paths = [paths]
5152
}
52-
entry[name] = paths.map(path => api.resolve(path))
53+
entry[name] = paths.map((path) => api.resolve(path))
5354
}
5455
}
55-
webpackConfig.merge({entry})
56+
webpackConfig.merge({ entry })
5657
webpackConfig.optimization.delete('splitChunks')
5758
})
5859

@@ -64,16 +65,19 @@ module.exports = (api, options) => {
6465
if (webpackConfig.performance === undefined) {
6566
webpackConfig.performance = {}
6667
}
67-
webpackConfig.performance.assetFilter = (assetFilename) => performanceAssetFilterList.every((filter) => filter(assetFilename))
68+
webpackConfig.performance.assetFilter = (assetFilename) =>
69+
performanceAssetFilterList.every((filter) => filter(assetFilename))
6870

6971
if (pluginOptions.autoImportPolyfill) {
70-
webpackConfig.plugins.push(new webpack.ProvidePlugin({
71-
'browser': 'webextension-polyfill'
72-
}))
72+
webpackConfig.plugins.push(
73+
new webpack.ProvidePlugin({
74+
browser: 'webextension-polyfill'
75+
})
76+
)
7377

7478
// Workaround for https://github.com/mozilla/webextension-polyfill/issues/68
7579
webpackConfig.module.rules.push({
76-
test: require.resolve('webextension-polyfill', {paths: [appRootPath]}),
80+
test: require.resolve('webextension-polyfill', { paths: [appRootPath] }),
7781
use: 'imports-loader?browser=>undefined'
7882
})
7983
}
@@ -86,64 +90,73 @@ module.exports = (api, options) => {
8690
}
8791
}
8892

89-
webpackConfig.plugins.push(new CopyWebpackPlugin([{
90-
from: './src/manifest.json',
91-
to: 'manifest.json',
92-
transform: (content) => {
93-
return new Promise((resolve, reject) => {
94-
const jsonContent = JSON.parse(content)
95-
if (pluginOptions.manifestSync.includes('version')) {
96-
jsonContent.version = packageJson.version
97-
}
98-
if (pluginOptions.manifestSync.includes('description')) {
99-
jsonContent.description = packageJson.description
100-
}
101-
102-
if (isProduction) {
103-
return resolve(getManifestJsonString(pluginOptions, jsonContent))
104-
}
105-
106-
jsonContent.content_security_policy = jsonContent.content_security_policy || "script-src 'self' 'unsafe-eval'; object-src 'self'"
107-
108-
try {
109-
fs.statSync(keyFile)
93+
webpackConfig.plugins.push(
94+
new CopyWebpackPlugin([
95+
{
96+
from: './src/manifest.json',
97+
to: 'manifest.json',
98+
transform: (content) => {
99+
return new Promise((resolve, reject) => {
100+
const jsonContent = JSON.parse(content)
101+
if (pluginOptions.manifestSync.includes('version')) {
102+
jsonContent.version = packageJson.version
103+
}
104+
if (pluginOptions.manifestSync.includes('description')) {
105+
jsonContent.description = packageJson.description
106+
}
110107

111-
return exec(`openssl rsa -in ${keyFile} -pubout -outform DER | openssl base64 -A`, (error, stdout) => {
112-
if (error) {
113-
// node couldn't execute the command
114-
reject(error)
108+
if (isProduction) {
109+
return resolve(getManifestJsonString(pluginOptions, jsonContent))
115110
}
116111

117-
jsonContent.key = stdout
118-
resolve(getManifestJsonString(pluginOptions, jsonContent))
112+
jsonContent.content_security_policy =
113+
jsonContent.content_security_policy || "script-src 'self' 'unsafe-eval'; object-src 'self'"
114+
115+
try {
116+
fs.statSync(keyFile)
117+
118+
return exec(`openssl rsa -in ${keyFile} -pubout -outform DER | openssl base64 -A`, (error, stdout) => {
119+
if (error) {
120+
// node couldn't execute the command
121+
reject(error)
122+
}
123+
124+
jsonContent.key = stdout
125+
resolve(getManifestJsonString(pluginOptions, jsonContent))
126+
})
127+
} catch (error) {
128+
logger.warn(
129+
'No key.pem file found. This is fine for dev, however you may have problems publishing without one'
130+
)
131+
resolve(getManifestJsonString(pluginOptions, jsonContent))
132+
}
119133
})
120-
} catch (error) {
121-
logger.warn('No key.pem file found. This is fine for dev, however you may have problems publishing without one')
122-
resolve(getManifestJsonString(pluginOptions, jsonContent))
123134
}
124-
})
125-
}
126-
}]))
135+
}
136+
])
137+
)
127138

128139
if (pluginOptions.modesToZip.includes(api.service.mode)) {
129-
webpackConfig.plugins.push(new ZipPlugin({
130-
path: api.resolve(`${options.outputDir || 'dist'}-zip`),
131-
filename: `${packageJson.name}-v${packageJson.version}-${api.service.mode}.zip`
132-
}))
140+
webpackConfig.plugins.push(
141+
new ZipPlugin({
142+
path: api.resolve(`${options.outputDir || 'dist'}-zip`),
143+
filename: `${packageJson.name}-v${packageJson.version}-${api.service.mode}.zip`
144+
})
145+
)
133146
}
134147

135-
if (options.api === 'chrome' && isDevelopment) {
136-
const entries = {}
148+
// configure webpack-extension-reloader for automatic reloading of extension when content and background scripts change (not HMR)
149+
// enabled only when webpack mode === 'development'
150+
const entries = {}
137151

138-
if (pluginOptions.components.background) {
139-
entries.background = 'background'
140-
}
152+
if (pluginOptions.components.background) {
153+
entries.background = 'background'
154+
}
141155

142-
if (pluginOptions.components.contentScripts) {
143-
entries.contentScript = Object.keys(componentOptions.contentScripts.entries)
144-
}
145-
const ChromeExtensionReloader = require('webpack-chrome-extension-reloader')
146-
webpackConfig.plugins.push(new ChromeExtensionReloader({ entries }))
156+
if (pluginOptions.components.contentScripts) {
157+
entries.contentScript = Object.keys(componentOptions.contentScripts.entries)
147158
}
159+
const ExtensionReloader = require('webpack-extension-reloader')
160+
webpackConfig.plugins.push(new ExtensionReloader({ entries }))
148161
})
149162
}

0 commit comments

Comments
 (0)