mirror of https://github.com/curbengh/hexo-yam
fix(js): compatibility with terser v5
- https://github.com/terser/terser/blob/master/CHANGELOG.md#v500-beta0
This commit is contained in:
parent
3de777904f
commit
16cdf467d9
|
@ -2,7 +2,7 @@
|
||||||
|
|
||||||
const Htmlminifier = require('html-minifier').minify
|
const Htmlminifier = require('html-minifier').minify
|
||||||
const CleanCSS = require('clean-css')
|
const CleanCSS = require('clean-css')
|
||||||
const Terser = require('terser')
|
const { minify: terserMinify } = require('terser')
|
||||||
const Svgo = require('svgo')
|
const Svgo = require('svgo')
|
||||||
const zlib = require('zlib')
|
const zlib = require('zlib')
|
||||||
const { promisify } = require('util')
|
const { promisify } = require('util')
|
||||||
|
@ -99,7 +99,7 @@ async function minifyCss (str, data) {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function minifyJs (str, data) {
|
async function minifyJs (str, data) {
|
||||||
const hexo = this
|
const hexo = this
|
||||||
const options = hexo.config.minify.js
|
const options = hexo.config.minify.js
|
||||||
if (options.enable === false || !str) return
|
if (options.enable === false || !str) return
|
||||||
|
@ -119,11 +119,13 @@ function minifyJs (str, data) {
|
||||||
delete jsOptions.exclude
|
delete jsOptions.exclude
|
||||||
delete jsOptions.globOptions
|
delete jsOptions.globOptions
|
||||||
|
|
||||||
const { code, error } = Terser.minify(str, jsOptions)
|
try {
|
||||||
if (error) throw new Error(error)
|
const { code } = await terserMinify(str, jsOptions)
|
||||||
if (verbose) logFn.call(this, str, code, path, 'js')
|
if (verbose) logFn.call(this, str, code, path, 'js')
|
||||||
|
|
||||||
return code
|
return code
|
||||||
|
} catch (err) {
|
||||||
|
throw new Error(err)
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function minifySvg () {
|
function minifySvg () {
|
||||||
|
|
|
@ -6,39 +6,44 @@ const hexo = new Hexo(__dirname)
|
||||||
global.hexo = hexo
|
global.hexo = hexo
|
||||||
const { jsDefault } = require('../index')
|
const { jsDefault } = require('../index')
|
||||||
const j = require('../lib/filter').minifyJs.bind(hexo)
|
const j = require('../lib/filter').minifyJs.bind(hexo)
|
||||||
const Terser = require('terser')
|
const { minify: terserMinify } = require('terser')
|
||||||
const input = 'var o = { "foo": 1, bar: 3 };'
|
const input = 'var o = { "foo": 1, bar: 3 };'
|
||||||
const path = 'foo.js'
|
const path = 'foo.js'
|
||||||
const expected = Terser.minify(input, { mangle: jsDefault.mangle }).code
|
let expected = ''
|
||||||
|
|
||||||
describe('js', () => {
|
describe('js', () => {
|
||||||
beforeEach(() => {
|
beforeAll(async () => {
|
||||||
|
const { code } = await terserMinify(input, { mangle: jsDefault.mangle })
|
||||||
|
expected = code
|
||||||
|
})
|
||||||
|
|
||||||
|
beforeEach(async () => {
|
||||||
hexo.config.minify.js = Object.assign({}, jsDefault)
|
hexo.config.minify.js = Object.assign({}, jsDefault)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('default', () => {
|
test('default', async () => {
|
||||||
const result = j(input, { path })
|
const result = await j(input, { path })
|
||||||
|
|
||||||
expect(result).toBeDefined()
|
expect(result).toBeDefined()
|
||||||
expect(expected).toBeDefined()
|
expect(expected).toBeDefined()
|
||||||
expect(result).toBe(expected)
|
expect(result).toBe(expected)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('disable', () => {
|
test('disable', async () => {
|
||||||
hexo.config.minify.js.enable = false
|
hexo.config.minify.js.enable = false
|
||||||
|
|
||||||
const result = j(input, { path })
|
const result = await j(input, { path })
|
||||||
|
|
||||||
expect(result).toBeUndefined()
|
expect(result).toBeUndefined()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('empty file', () => {
|
test('empty file', async () => {
|
||||||
const result = j('', { path })
|
const result = await j('', { path })
|
||||||
|
|
||||||
expect(result).toBeUndefined()
|
expect(result).toBeUndefined()
|
||||||
})
|
})
|
||||||
|
|
||||||
test('option', () => {
|
test('option', async () => {
|
||||||
const customOpt = {
|
const customOpt = {
|
||||||
mangle: {
|
mangle: {
|
||||||
properties: true
|
properties: true
|
||||||
|
@ -46,21 +51,21 @@ describe('js', () => {
|
||||||
}
|
}
|
||||||
hexo.config.minify.js = customOpt
|
hexo.config.minify.js = customOpt
|
||||||
|
|
||||||
const result = j(input, { path })
|
const result = await j(input, { path })
|
||||||
const expected = Terser.minify(input, customOpt).code
|
const { code: expected } = await terserMinify(input, customOpt)
|
||||||
|
|
||||||
expect(result).toBe(expected)
|
expect(result).toBe(expected)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('option - verbose', () => {
|
test('option - verbose', async () => {
|
||||||
hexo.config.minify.js.verbose = true
|
hexo.config.minify.js.verbose = true
|
||||||
hexo.log.log = jest.fn()
|
hexo.log.log = jest.fn()
|
||||||
j(input, { path })
|
await j(input, { path })
|
||||||
|
|
||||||
expect(hexo.log.log.mock.calls[0][0]).toContain(`js: ${path}`)
|
expect(hexo.log.log.mock.calls[0][0]).toContain(`js: ${path}`)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('option - invalid', () => {
|
test('option - invalid', async () => {
|
||||||
const customOpt = {
|
const customOpt = {
|
||||||
mangle: {
|
mangle: {
|
||||||
foo: 'bar'
|
foo: 'bar'
|
||||||
|
@ -68,41 +73,42 @@ describe('js', () => {
|
||||||
}
|
}
|
||||||
hexo.config.minify.js = customOpt
|
hexo.config.minify.js = customOpt
|
||||||
|
|
||||||
const { error } = Terser.minify(input, customOpt)
|
let error
|
||||||
|
try {
|
||||||
|
await terserMinify(input, customOpt)
|
||||||
|
} catch (err) {
|
||||||
|
error = err.message
|
||||||
|
}
|
||||||
|
|
||||||
expect(error.message).toBeDefined()
|
expect(error).toBeDefined()
|
||||||
expect(() => {
|
await expect(j(input, { path })).rejects.toThrow(error)
|
||||||
j(input, { path })
|
|
||||||
}).toThrow(error.message)
|
|
||||||
})
|
})
|
||||||
|
|
||||||
test('exclude - *.min.js', () => {
|
test('exclude - *.min.js', async () => {
|
||||||
const result = j(input, { path: 'foo/bar.min.js' })
|
const result = await j(input, { path: 'foo/bar.min.js' })
|
||||||
|
|
||||||
expect(result).toBe(input)
|
expect(result).toBe(input)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('exclude - basename', () => {
|
test('exclude - basename', async () => {
|
||||||
const exclude = '*baz.js'
|
const exclude = '*baz.js'
|
||||||
hexo.config.minify.js.exclude = exclude
|
hexo.config.minify.js.exclude = exclude
|
||||||
const result = j(input, { path: 'foo/barbaz.js' })
|
const result = await j(input, { path: 'foo/barbaz.js' })
|
||||||
|
|
||||||
expect(result).toBe(input)
|
expect(result).toBe(input)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('exclude - slash in pattern', () => {
|
test('exclude - slash in pattern', async () => {
|
||||||
const exclude = '**/lectus/**/*.js'
|
const exclude = '**/lectus/**/*.js'
|
||||||
hexo.config.minify.js.exclude = exclude
|
hexo.config.minify.js.exclude = exclude
|
||||||
const result = j(input, { path: 'eleifend/lectus/nullam/dapibus/netus.js' })
|
const result = await j(input, { path: 'eleifend/lectus/nullam/dapibus/netus.js' })
|
||||||
|
|
||||||
expect(result).toBe(input)
|
expect(result).toBe(input)
|
||||||
})
|
})
|
||||||
|
|
||||||
test('invalid string', () => {
|
test('invalid string', async () => {
|
||||||
const invalid = 'console.log("\\");'
|
const invalid = 'console.log("\\");'
|
||||||
|
|
||||||
expect(() => {
|
await expect(j(invalid, { path })).rejects.toThrow('SyntaxError')
|
||||||
j(invalid, { path })
|
|
||||||
}).toThrow('SyntaxError')
|
|
||||||
})
|
})
|
||||||
})
|
})
|
||||||
|
|
Loading…
Reference in New Issue