jalla 1.0.0-4 → 1.0.0-40

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/lib/document.js CHANGED
@@ -3,15 +3,16 @@ var posthtmlify = require('posthtmlify')
3
3
  var documentify = require('documentify')
4
4
  var { Readable } = require('stream')
5
5
  var hyperstream = require('hstream')
6
+ var caniuse = require('caniuse-api')
7
+ var purgecss = require('purgecss')
6
8
  var through = require('through2')
7
9
  var resolve = require('resolve')
8
- var dropcss = require('dropcss')
9
- var dedent = require('dedent')
10
+ var jsesc = require('jsesc')
10
11
  var path = require('path')
11
12
 
12
13
  module.exports = document
13
14
 
14
- var TEMPLATE = dedent`
15
+ var TEMPLATE = `
15
16
  <!doctype html>
16
17
  <html>
17
18
  <head></head>
@@ -20,65 +21,80 @@ var TEMPLATE = dedent`
20
21
  `
21
22
 
22
23
  function document (body, state, app, cb) {
23
- var dir = path.join(path.dirname(app.entry), 'index')
24
-
25
- resolve('.', { basedir: dir, extensions: ['.html'] }, function (err, file) {
26
- if (err) cb(null, render(null, TEMPLATE))
27
- else cb(null, render(file, null))
24
+ resolve('./index', {
25
+ basedir: path.dirname(app.entry),
26
+ extensions: ['.html']
27
+ }, function (err, file) {
28
+ try {
29
+ if (err) cb(null, render(null, TEMPLATE))
30
+ else cb(null, render(file, null))
31
+ } catch (err) {
32
+ cb(err)
33
+ }
28
34
  })
29
35
 
30
36
  function render (template, html) {
31
- var selector = require(app.entry).selector || 'body'
37
+ var selector = require(app.entry).selector
32
38
  var d = documentify(template, html)
33
39
 
34
40
  d.transform(function () {
35
- return hyperstream({
36
- html: { lang: state.language || 'en' },
37
- [selector]: { _replaceHtml: body }
38
- })
41
+ var opts = { html: { lang: state.language || 'en' } }
42
+ if (selector && body) opts[selector] = { _replaceHtml: body }
43
+ return hyperstream(opts)
39
44
  })
40
45
 
41
46
  d.transform((str) => hyperstream({ body: { _appendHtml: str } }), `
42
- <script>window.initialState = ${stringify(state)}</script>
47
+ <script>window.initialState = JSON.parse(${stringify(state)})</script>
43
48
  `)
44
49
 
50
+ /**
51
+ * The following transforms are prepended in reverse order to ensure that
52
+ * they come _before_ possible custom html head elements
53
+ */
54
+
45
55
  if (app.env === 'development') {
46
56
  d.transform(prependToHead, `
47
- <script src="${app.context.assets.get('bundle.js').url}" defer></script>
48
- <link rel="stylesheet" href="${app.context.assets.get('bundle.css').url}">
57
+ <script src="${app.context.assets.get('bundle.js').url}" defer></script>
58
+ <link rel="stylesheet" href="${app.context.assets.get('bundle.css').url}">
49
59
  `)
50
60
  } else {
51
- let script = app.context.assets.get('bundle.js')
52
- let styles = app.context.assets.get('bundle.css')
53
- d.transform(inlineCriticalCSS(styles.read.bind(styles)))
61
+ const script = app.context.assets.get('bundle.js')
62
+ const styles = app.context.assets.get('bundle.css')
63
+ const features = process.env.POLYFILL_FEATURES
64
+
65
+ if (!caniuse.isSupported('link-rel-preload', app.browsers.join(','))) {
66
+ d.transform(prependToHead, `
67
+ <script>
68
+ (function (tokens) {
69
+ try {
70
+ var supports = tokens.supports('preload');
71
+ } catch (e) {}
72
+ if (supports) return;
73
+ var links = document.querySelectorAll('link[rel=preload][as=style]');
74
+ for (var i = 0, len = links.length; i < len; i++) {
75
+ var link = document.createElement('link');
76
+ link.rel = 'stylesheet';
77
+ link.href = links[i].href;
78
+ document.head.append(link);
79
+ }
80
+ }(document.createElement('link').relList))
81
+ </script>
82
+ `)
83
+ }
54
84
 
55
- let features = process.env.POLYFILL_FEATURES
56
85
  d.transform(prependToHead, `
57
86
  <link rel="preload" as="style" href="${styles.url}" onload="this.rel='stylesheet'">
58
87
  <script src="https://polyfill.io/v3/polyfill.min.js${features ? `?features=${features}` : ''}"></script>
59
88
  <script src="${script.url}" defer></script>
60
- <script>
61
- (function (tokens) {
62
- try {
63
- var supports = tokens.supports('preload');
64
- } catch (e) {}
65
- if (supports) return;
66
- var links = document.querySelectorAll('link[rel=preload][as=style]');
67
- for (var i = 0, len = links.length; i < len; i++) {
68
- var link = document.createElement('link');
69
- link.rel = 'stylesheet';
70
- link.href = links[i].href;
71
- document.head.append(link);
72
- }
73
- }(document.createElement('link').relList))
74
- </script>
75
89
  `)
90
+
91
+ d.transform(prependCriticalCSS(styles.read.bind(styles)))
76
92
  }
77
93
 
78
94
  if (state.meta) {
79
- let keys = Object.keys(state.meta)
95
+ const keys = Object.keys(state.meta)
80
96
  if (keys.length) {
81
- let tags = keys.map(function (key) {
97
+ const tags = keys.map(function (key) {
82
98
  if (key === 'title') return
83
99
  var type = key.indexOf('og:') !== -1 ? 'property' : 'name'
84
100
  var value = state.meta[key]
@@ -98,7 +114,7 @@ function document (body, state, app, cb) {
98
114
  `)
99
115
 
100
116
  if (state.title) {
101
- let title = state.title.trim().replace(/\n/g, '')
117
+ const title = state.title.trim().replace(/\n/g, '')
102
118
  d.transform(prependToHead, `<title>${title}</title>`)
103
119
  }
104
120
 
@@ -122,13 +138,13 @@ function document (body, state, app, cb) {
122
138
  }
123
139
  }
124
140
 
125
- // stringify with JSON encoded with JavaScript safe unicode characters
126
- // see: https://developer.mozilla.org/en-US/docs/Web/JavaScript/Reference/Global_Objects/JSON/stringify#Issue_with_plain_JSON.stringify_for_use_as_JavaScript
141
+ // stringify data as safely escaped JSON
127
142
  // obj -> str
128
- function stringify (obj) {
129
- return JSON.stringify(obj)
130
- .replace(/\u2028/g, '\\u2028')
131
- .replace(/\u2029/g, '\\u2029')
143
+ function stringify (data) {
144
+ return jsesc(JSON.stringify(data), {
145
+ json: true,
146
+ isScriptContext: true
147
+ })
132
148
  }
133
149
 
134
150
  // create documentify transform adding content to `head`
@@ -139,7 +155,7 @@ function prependToHead (str) {
139
155
 
140
156
  // create documentify transform inlining critical CSS
141
157
  // str -> Stream
142
- function inlineCriticalCSS (getStyles) {
158
+ function prependCriticalCSS (getStyles) {
143
159
  var html = ''
144
160
 
145
161
  return function () {
@@ -160,20 +176,31 @@ function inlineCriticalCSS (getStyles) {
160
176
  var self = this
161
177
 
162
178
  getStyles().then(function (css) {
163
- var critical = dropcss({ html: html, css: css.toString() })
164
- var append = hyperstream({
179
+ css = css.toString().replace(/\/\*#\s*sourceMappingURL=.+?\s*\*\//g, '')
180
+ return new purgecss.PurgeCSS().purge({
181
+ content: [{ raw: html, extension: 'html' }],
182
+ css: [{ raw: css }]
183
+ }).then(function (result) {
184
+ return result.reduce((acc, { css }) => acc + css, '')
185
+ })
186
+ }).then(function (css) {
187
+ var prepend = hyperstream({
165
188
  head: {
166
- _appendHtml: `<style>${critical.css}</style>`
189
+ _prependHtml: `<style>${css}</style>`
167
190
  }
168
191
  })
169
192
  var stream = new Readable()
170
193
  stream._read = Function.prototype
171
194
 
172
195
  // pipe the collected html through hyperstream forwarding to self
173
- stream.pipe(append).pipe(through(write, end))
196
+ stream.pipe(prepend).pipe(through(write, end))
174
197
  stream.push(html)
175
198
  stream.push(null)
176
- }, cb)
199
+ }).catch(function () {
200
+ // fail silently and skip inline styles
201
+ self.push(html)
202
+ return cb()
203
+ })
177
204
 
178
205
  // collect the resulting html with inlined CSS
179
206
  // (str, str, fn) -> void
package/lib/manifest.js CHANGED
@@ -10,14 +10,12 @@ function manifest (state, emit) {
10
10
  try {
11
11
  emit('progress', 'manifest.json', 0)
12
12
 
13
- var { pkg } = await readPkgUp(path.dirname(state.entry))
14
- var name = pkg.name.split('-').map(function (str) {
15
- return str[0].toUpperCase() + str.substr(1)
16
- }).join(' ')
13
+ var res = await readPkgUp({ cwd: path.dirname(state.entry) })
14
+ var { name } = res.packageJson
17
15
 
18
16
  var buff = Buffer.from(JSON.stringify({
19
17
  name: name,
20
- short_name: name.length > 12 ? name.replace(/[^A-Z]+/g, '') : name,
18
+ short_name: name.length > 12 ? name.substr(0, 12) + '' : name,
21
19
  start_url: '/',
22
20
  display: 'minimal-ui',
23
21
  background_color: '#fff',
package/lib/pipeline.js CHANGED
@@ -43,7 +43,7 @@ module.exports = class Pipeline extends Nanobus {
43
43
  state.deps.add(dep)
44
44
  })
45
45
  emitter.on('reset', function () {
46
- for (let dep of deps) state.deps.delete(dep)
46
+ for (const dep of deps) state.deps.delete(dep)
47
47
  })
48
48
  emitter.on('remove', function (id) {
49
49
  self.assets.delete(id)
@@ -57,15 +57,15 @@ module.exports = class Pipeline extends Nanobus {
57
57
 
58
58
  if (meta.map) {
59
59
  // create an asset for the source map
60
- let mapAsset = add(id + '.map', meta.map, {
60
+ const mapAsset = add(id + '.map', meta.map, {
61
61
  mime: 'application/json'
62
62
  })
63
63
 
64
64
  // add map comment to buffer
65
- let map = sourcemap.generateMapFileComment(mapAsset.url, {
65
+ const map = sourcemap.generateMapFileComment(mapAsset.url, {
66
66
  multiline: /\.css$/.test(id)
67
67
  })
68
- let src = buff.toString()
68
+ const src = buff.toString()
69
69
  buff = Buffer.from(src.replace(/\n?$/, '\n' + map))
70
70
  }
71
71
 
@@ -80,7 +80,7 @@ module.exports = class Pipeline extends Nanobus {
80
80
  }
81
81
 
82
82
  if (!meta.static && state.env !== 'development') {
83
- let hex = hash.toString('hex')
83
+ const hex = hash.toString('hex')
84
84
  asset.url = base + hex.slice(0, 16) + '.' + path.basename(id)
85
85
  } else {
86
86
  asset.url = base + id
@@ -129,8 +129,7 @@ module.exports = class Pipeline extends Nanobus {
129
129
  async function read () {
130
130
  if (busy.has(this.id)) {
131
131
  // wait for bundling to finish
132
- let defer = util.promisify(self.once.bind(self))
133
- await defer(`${this.label}:end`)
132
+ await new Promise((resolve) => self.once(`${this.label}:end`, resolve))
134
133
  }
135
134
 
136
135
  if (this.buffer) return this.buffer
@@ -144,16 +143,20 @@ module.exports = class Pipeline extends Nanobus {
144
143
  if (step) return step.hooks
145
144
  }
146
145
 
147
- middleware () {
146
+ middleware (state) {
148
147
  var self = this
149
148
 
150
149
  return async function (ctx, next) {
151
150
  if (ctx.body) return next()
152
151
 
153
- for (let asset of self.assets.values()) {
152
+ for (const asset of self.assets.values()) {
154
153
  if (asset.url === ctx.path) {
155
154
  ctx.body = await asset.read()
156
155
  ctx.type = asset.mime || mime.getType(asset.url)
156
+ const cache = state.env !== 'development' && !state.watch
157
+ const maxAge = cache ? 60 * 60 * 24 * 365 : 0
158
+ const value = `${cache ? 'public, ' : ''}max-age=${maxAge}`
159
+ ctx.set('Cache-Control', value)
157
160
  return
158
161
  }
159
162
  }
@@ -181,7 +184,7 @@ module.exports = class Pipeline extends Nanobus {
181
184
  }
182
185
 
183
186
  * [Symbol.iterator] () {
184
- for (let asset of this.assets.values()) {
187
+ for (const asset of this.assets.values()) {
185
188
  yield asset
186
189
  }
187
190
  }
package/lib/render.js CHANGED
@@ -1,50 +1,70 @@
1
1
  var path = require('path')
2
+ var concat = require('concat-stream')
2
3
  var document = require('./document')
3
4
 
5
+ var FONT = /\.(woff2?|eot|ttf)$/
6
+
4
7
  module.exports = render
5
8
 
6
9
  function render (app) {
7
10
  return async function render (ctx, next) {
8
11
  try {
9
12
  await next()
10
- if (!ctx.body && ctx.accepts('html') && !ctx.response.get('Location')) {
11
- let href = path.join(app.base, ctx.url).replace(/\/$/, '') || '/'
12
- let client = require(app.entry)
13
- let state = Object.assign({
14
- prefetch: [],
15
- req: ctx.req,
16
- res: ctx.res
17
- }, ctx.state)
18
-
19
- // first render pass, collect prefetch operations
20
- client.toString(href, state)
21
-
22
- await Promise.all(state.prefetch)
23
- delete state.prefetch
24
- delete state.req
25
- delete state.res
26
-
27
- // second render pass
28
- let html = client.toString(href, state)
29
-
30
- ctx.type = 'text/html'
31
- ctx.status = isNaN(+state.status) ? 200 : state.status
32
- ctx.body = await new Promise(function (resolve, reject) {
33
- document(html, state, app, function (err, stream) {
34
- if (err) return reject(err)
35
- resolve(stream)
36
- })
13
+
14
+ if (ctx.body || !ctx.accepts('html') || ctx.response.get('Location')) {
15
+ return
16
+ }
17
+
18
+ const href = path.join(app.base, ctx.url).replace(/\/$/, '') || '/'
19
+ const client = require(app.entry)
20
+ const state = Object.assign({
21
+ prefetch: [],
22
+ req: ctx.req,
23
+ res: ctx.res
24
+ }, ctx.state)
25
+
26
+ // first render pass, collect prefetch operations
27
+ client.toString(href, state)
28
+
29
+ await Promise.all(state.prefetch.map(function (p) {
30
+ return p.catch(function (err) {
31
+ if (err.status) state.status = err.status
37
32
  })
33
+ }))
34
+ delete state.prefetch
35
+ delete state.req
36
+ delete state.res
37
+
38
+ // second render pass
39
+ const html = client.toString(href, state)
38
40
 
39
- if (app.env !== 'development') {
40
- ctx.append('Link', [
41
- `<${ctx.assets.get('bundle.js').url}>; rel=preload; as=script`,
42
- `<${ctx.assets.get('bundle.css').url}>; rel=preload; as=style`
43
- ])
41
+ if (app.env !== 'development') {
42
+ const fonts = []
43
+ for (const [id, asset] of ctx.assets) {
44
+ if (FONT.test(id)) {
45
+ fonts.push(`<${asset.url}>; rel=preload; crossorigin=anonymous; as=font`)
46
+ }
44
47
  }
48
+
49
+ // push primary bundles and font files
50
+ ctx.append('Link', [
51
+ `<${ctx.assets.get('bundle.js').url}>; rel=preload; as=script`,
52
+ `<${ctx.assets.get('bundle.css').url}>; rel=preload; as=style`
53
+ ].concat(fonts))
45
54
  }
55
+
56
+ ctx.type = 'text/html'
57
+ ctx.status = isNaN(+state.status) ? 200 : state.status
58
+ ctx.body = await new Promise(function (resolve, reject) {
59
+ document(html, state, app, function (err, stream) {
60
+ if (err) return reject(err)
61
+ stream.pipe(concat({ encoding: 'buffer' }, function (buff) {
62
+ resolve(buff)
63
+ }))
64
+ })
65
+ })
46
66
  } catch (err) {
47
- ctx.throw(err.status || 404, err)
67
+ ctx.throw(err.status || 500, err)
48
68
  }
49
69
  }
50
70
  }
package/lib/script.js CHANGED
@@ -1,28 +1,20 @@
1
1
  var path = require('path')
2
2
  var brfs = require('brfs')
3
3
  var tinyify = require('tinyify')
4
+ var tfilter = require('tfilter')
4
5
  var through = require('through2')
5
6
  var nanohtml = require('nanohtml')
6
7
  var babelify = require('babelify')
7
8
  var watchify = require('watchify')
8
9
  var caniuse = require('caniuse-api')
9
- var envify = require('envify/custom')
10
10
  var concat = require('concat-stream')
11
11
  var browserify = require('browserify')
12
- var browserslist = require('browserslist')
13
12
  var splitRequire = require('split-require')
14
13
  var sourcemap = require('convert-source-map')
14
+ var envify = require('@goto-bus-stop/envify')
15
15
  var babelPresetEnv = require('@babel/preset-env')
16
16
  var inject = require('./inject')
17
17
 
18
- var DEFAULT_BROWSERS = [
19
- 'last 2 Chrome versions',
20
- 'last 2 Firefox versions',
21
- 'last 2 Safari versions',
22
- 'last 2 Edge versions',
23
- '> 1%'
24
- ]
25
-
26
18
  module.exports = script
27
19
 
28
20
  function script (state, emit) {
@@ -38,11 +30,12 @@ function script (state, emit) {
38
30
 
39
31
  b.plugin(splitRequire, {
40
32
  filename: function (record) {
41
- var basename = path.basename(record.sourceFile, '.js')
33
+ var extension = path.extname(record.sourceFile)
34
+ var basename = path.basename(record.sourceFile, extension)
42
35
  var isIndex = basename === 'index'
43
36
  var id = basename
44
37
  if (isIndex) id = path.dirname(record.sourceFile).split('/').slice(-1)[0]
45
- return `bundle-${record.index}-${id}.js`
38
+ return `bundle-${record.index}-${id}${extension}`
46
39
  },
47
40
  public: state.base + '/',
48
41
  output: bundleDynamicBundle
@@ -55,33 +48,55 @@ function script (state, emit) {
55
48
  var env = Object.assign({ NODE_ENV: state.env }, process.env)
56
49
 
57
50
  if (state.env === 'development') {
58
- b.transform(babelify, { plugins: ['dynamic-import-split-require'] })
51
+ b.transform(tfilter(babelify, { filter: include }), {
52
+ plugins: ['dynamic-import-split-require']
53
+ })
59
54
  b.transform(inject('source-map-support/register', state.entry))
60
- b.transform(brfs)
61
- b.transform(envify(env))
55
+ b.transform(tfilter(brfs, {
56
+ filter (file) {
57
+ return !file.includes('source-map-support') && include(file)
58
+ }
59
+ }), { global: true })
60
+ b.transform(tfilter(envify, { filter: include }), env)
62
61
  } else {
63
- let dir = path.dirname(state.entry)
64
- let browsers = browserslist.loadConfig({ path: dir, env: env.NODE_ENV })
65
- if (!browsers) browsers = DEFAULT_BROWSERS
66
-
67
62
  // compile dynamic imports but nothing else to preserve template literals
68
- b.transform(babelify, { plugins: ['dynamic-import-split-require'] })
63
+ b.transform(tfilter(babelify, { filter: include }), {
64
+ plugins: ['dynamic-import-split-require']
65
+ })
69
66
 
70
67
  // include regenerator runtime to support transpiled async/await
71
- if (!caniuse.isSupported('async-functions', browsers.join(','))) {
72
- let regenerator = require.resolve('regenerator-runtime/runtime')
68
+ if (!caniuse.isSupported('async-functions', state.browsers.join(','))) {
69
+ const regenerator = require.resolve('regenerator-runtime/runtime')
73
70
  b.transform(inject(regenerator, state.entry))
74
71
  }
75
72
 
76
- b.transform(nanohtml)
77
- b.transform(babelify, {
73
+ b.transform(tfilter(nanohtml, { filter: include }))
74
+ b.transform(tfilter(nanohtml, {
75
+ filter (file) {
76
+ return file.includes('node_modules') && include(file)
77
+ }
78
+ }), { global: true })
79
+ b.transform(tfilter(babelify, {
80
+ filter (file) {
81
+ return file.includes('node_modules') && include(file)
82
+ }
83
+ }), {
84
+ global: true,
85
+ babelrc: false,
78
86
  presets: [
79
87
  [babelPresetEnv, {
80
- targets: { browsers: browsers }
88
+ targets: { browsers: state.browsers }
81
89
  }]
82
90
  ]
83
91
  })
84
- b.transform(brfs)
92
+ b.transform(tfilter(babelify, { filter: include }), {
93
+ presets: [
94
+ [babelPresetEnv, {
95
+ targets: { browsers: state.browsers }
96
+ }]
97
+ ]
98
+ })
99
+ b.transform(tfilter(brfs, { filter: include }), { global: true })
85
100
  b.plugin(tinyify, { env })
86
101
  }
87
102
 
@@ -104,6 +119,12 @@ function script (state, emit) {
104
119
  }))
105
120
  }
106
121
 
122
+ // test if file should be included in transform
123
+ // str -> bool
124
+ function include (file) {
125
+ return !state.skip(file)
126
+ }
127
+
107
128
  // emit progress on pipeline reset/pending
108
129
  // () -> void
109
130
  function onreset () {
@@ -125,7 +146,7 @@ function script (state, emit) {
125
146
  // handle dynamic bundle
126
147
  // str -> stream.Writable
127
148
  function bundleDynamicBundle (name) {
128
- let stream = concat({ encoding: 'buffer' }, function (bundle) {
149
+ const stream = concat({ encoding: 'buffer' }, function (bundle) {
129
150
  onbundle(bundle, name)
130
151
  var asset = state.assets.get(name)
131
152
  stream.emit('name', asset.url)
@@ -141,9 +162,9 @@ function script (state, emit) {
141
162
  mime: 'application/javascript'
142
163
  })
143
164
  } else {
144
- let src = bundle.toString()
145
- let map = sourcemap.fromSource(src)
146
- let buff = Buffer.from(sourcemap.removeComments(src))
165
+ const src = bundle.toString()
166
+ const map = sourcemap.fromSource(src)
167
+ const buff = Buffer.from(sourcemap.removeComments(src))
147
168
  emit('asset', name, buff, {
148
169
  mime: 'application/javascript',
149
170
  map: Buffer.from(map.toJSON())
@@ -1,12 +1,13 @@
1
1
  var path = require('path')
2
2
  var brfs = require('brfs')
3
+ var tfilter = require('tfilter')
3
4
  var tinyify = require('tinyify')
4
5
  var through = require('through2')
5
6
  var watchify = require('watchify')
6
7
  var concat = require('concat-stream')
7
- var envify = require('envify/custom')
8
8
  var browserify = require('browserify')
9
9
  var sourcemap = require('convert-source-map')
10
+ var envify = require('@goto-bus-stop/envify')
10
11
  var inject = require('./inject')
11
12
 
12
13
  module.exports = serviceWorker
@@ -28,8 +29,8 @@ function serviceWorker (state, emit) {
28
29
  b.on('reset', capture)
29
30
 
30
31
  // run envify regardless due to tinyify loosing the reference to env
31
- b.transform(envify(env))
32
- b.transform(brfs)
32
+ b.transform(tfilter(envify, { filter: include }), env)
33
+ b.transform(tfilter(brfs, { filter: include }))
33
34
 
34
35
  if (state.env === 'development') {
35
36
  b.transform(inject('source-map-support/register', state.sw))
@@ -56,6 +57,12 @@ function serviceWorker (state, emit) {
56
57
  }))
57
58
  }
58
59
 
60
+ // test if file should be included in transform
61
+ // str -> bool
62
+ function include (file) {
63
+ return !state.skip(file)
64
+ }
65
+
59
66
  // emit progress on pipeline reset/pending
60
67
  // () -> void
61
68
  function onreset () {
@@ -83,9 +90,9 @@ function serviceWorker (state, emit) {
83
90
  mime: 'application/javascript'
84
91
  })
85
92
  } else {
86
- let src = bundle.toString()
87
- let map = sourcemap.fromSource(src)
88
- let buff = Buffer.from(sourcemap.removeComments(src))
93
+ const src = bundle.toString()
94
+ const map = sourcemap.fromSource(src)
95
+ const buff = Buffer.from(sourcemap.removeComments(src))
89
96
  emit('asset', id, buff, {
90
97
  static: true,
91
98
  mime: 'application/javascript',
@@ -99,7 +106,7 @@ function serviceWorker (state, emit) {
99
106
  function getEnv () {
100
107
  var env = { NODE_ENV: state.env }
101
108
  env.ASSET_LIST = []
102
- for (let [key, asset] of state.assets) {
109
+ for (const [key, asset] of state.assets) {
103
110
  if (key !== id) env.ASSET_LIST.push(asset.url)
104
111
  }
105
112
  return env
package/lib/style.js CHANGED
@@ -59,7 +59,7 @@ function style (state, emit) {
59
59
 
60
60
  var deps = []
61
61
  var reg = /\.js$/
62
- for (let dep of state.deps) {
62
+ for (const dep of state.deps) {
63
63
  if (reg.test(dep)) deps.push(dep)
64
64
  }
65
65
 
@@ -135,7 +135,12 @@ function style (state, emit) {
135
135
  })
136
136
  .then(function (result) {
137
137
  // add optimizations
138
- if (state.env !== 'development') result.plugins.push(autoprefixer, csso)
138
+ if (state.env !== 'development') {
139
+ result.plugins.push(
140
+ autoprefixer({ overrideBrowserslist: state.browsers }),
141
+ csso
142
+ )
143
+ }
139
144
  // hook up watcher plugin
140
145
  if (state.watch) result.plugins.push(watcher.plugin())
141
146
  return result