mirror of
https://github.com/vuejs/vue-cli.git
synced 2026-02-04 22:18:31 -06:00
style: replace eslint-plugin-vue-libs with standard config (#6148)
This commit is contained in:
19
.eslintrc.js
19
.eslintrc.js
@@ -1,23 +1,19 @@
|
||||
module.exports = {
|
||||
extends: [
|
||||
'plugin:vue-libs/recommended'
|
||||
'@vue/standard'
|
||||
],
|
||||
plugins: [
|
||||
'node'
|
||||
],
|
||||
env: {
|
||||
'jest': true
|
||||
},
|
||||
globals: {
|
||||
name: 'off'
|
||||
},
|
||||
rules: {
|
||||
'indent': ['error', 2, {
|
||||
'MemberExpression': 'off'
|
||||
indent: ['error', 2, {
|
||||
MemberExpression: 'off'
|
||||
}],
|
||||
quotes: [2, 'single', { avoidEscape: true, allowTemplateLiterals: true }],
|
||||
'quote-props': 'off',
|
||||
'no-shadow': ['error'],
|
||||
'node/no-extraneous-require': ['error', {
|
||||
'allowModules': [
|
||||
allowModules: [
|
||||
'@vue/cli-service',
|
||||
'@vue/cli-test-utils'
|
||||
]
|
||||
@@ -26,6 +22,9 @@ module.exports = {
|
||||
overrides: [
|
||||
{
|
||||
files: ['**/__tests__/**/*.js', '**/cli-test-utils/**/*.js'],
|
||||
env: {
|
||||
jest: true
|
||||
},
|
||||
rules: {
|
||||
'node/no-extraneous-require': 'off'
|
||||
}
|
||||
|
||||
@@ -259,13 +259,13 @@ module.exports = (context, options = {}) => {
|
||||
return {
|
||||
sourceType: 'unambiguous',
|
||||
overrides: [{
|
||||
exclude: [/@babel[\/|\\\\]runtime/, /core-js/],
|
||||
exclude: [/@babel[/|\\\\]runtime/, /core-js/],
|
||||
presets,
|
||||
plugins
|
||||
}, {
|
||||
// there are some untranspiled code in @babel/runtime
|
||||
// https://github.com/babel/babel/issues/9903
|
||||
include: [/@babel[\/|\\\\]runtime/],
|
||||
include: [/@babel[/|\\\\]runtime/],
|
||||
presets: [
|
||||
[require('@babel/preset-env'), envOptions]
|
||||
]
|
||||
|
||||
@@ -6,4 +6,3 @@ defineTest(__dirname, 'usePluginPreset', null, 'default')
|
||||
defineTest(__dirname, 'usePluginPreset', null, 'customConfig')
|
||||
defineTest(__dirname, 'usePluginPreset', null, 'require')
|
||||
defineTest(__dirname, 'usePluginPreset', null, 'templateLiteral')
|
||||
|
||||
|
||||
@@ -12,6 +12,8 @@ function genTranspileDepRegex (transpileDependencies) {
|
||||
} else if (dep instanceof RegExp) {
|
||||
return dep.source
|
||||
}
|
||||
|
||||
throw new Error('transpileDependencies only accepts an array of string or regular expressions')
|
||||
})
|
||||
return deps.length ? new RegExp(deps.join('|')) : null
|
||||
}
|
||||
|
||||
@@ -33,7 +33,7 @@ const defaultSettings = {
|
||||
test_settings: {
|
||||
default: {
|
||||
detailed_output: !concurrentMode,
|
||||
launch_url: '${VUE_DEV_SERVER_URL}'
|
||||
launch_url: '${VUE_DEV_SERVER_URL}' // eslint-disable-line no-template-curly-in-string
|
||||
},
|
||||
|
||||
chrome: {
|
||||
@@ -56,10 +56,12 @@ const defaultSettings = {
|
||||
}
|
||||
}
|
||||
},
|
||||
webdriver: useSelenium ? {} : {
|
||||
server_path: geckodriver.path,
|
||||
port: 4444
|
||||
}
|
||||
webdriver: useSelenium
|
||||
? {}
|
||||
: {
|
||||
server_path: geckodriver.path,
|
||||
port: 4444
|
||||
}
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -11,13 +11,13 @@ test('should add types to existing tsconfig.json', async () => {
|
||||
}
|
||||
}
|
||||
})
|
||||
await write('tsconfig.json', JSON.stringify({ compilerOptions: { types: ['some-type'] }}))
|
||||
await write('tsconfig.json', JSON.stringify({ compilerOptions: { types: ['some-type'] } }))
|
||||
|
||||
const invoke = require('@vue/cli/lib/invoke')
|
||||
await invoke('e2e-webdriverio', { webdrivers: ['chrome'] }, dir)
|
||||
|
||||
const tsconfig = await read('tsconfig.json')
|
||||
expect(tsconfig).toMatch(/\r?\n$/)
|
||||
expect(JSON.parse(tsconfig)['compilerOptions']['types'])
|
||||
expect(JSON.parse(tsconfig).compilerOptions.types)
|
||||
.toEqual(['some-type', 'mocha', '@wdio/mocha-framework', '@wdio/sync'])
|
||||
})
|
||||
|
||||
@@ -44,7 +44,7 @@ module.exports = (api, { config, lintOn = [] }, rootOptions, invoking) => {
|
||||
'pre-commit': 'lint-staged'
|
||||
}
|
||||
const extensions = require('../eslintOptions').extensions(api)
|
||||
.map(ext => ext.replace(/^\./, '')) // remove the leading `.`
|
||||
.map(ext => ext.replace(/^\./, '')) // remove the leading `.`
|
||||
pkg['lint-staged'] = {
|
||||
[`*.{${extensions.join(',')}}`]: 'vue-cli-service lint'
|
||||
}
|
||||
|
||||
@@ -59,7 +59,7 @@ test('pwa', async () => {
|
||||
browser = launched.browser
|
||||
|
||||
// workbox plugin fetches scripts from CDN so it takes a while...
|
||||
await new Promise(r => setTimeout(r, process.env.CI ? 5000 : 2000))
|
||||
await new Promise(resolve => setTimeout(resolve, process.env.CI ? 5000 : 2000))
|
||||
const logs = launched.logs
|
||||
expect(logs.some(msg => msg.match(/Content has been cached for offline use/))).toBe(true)
|
||||
expect(logs.some(msg => msg.match(/App is being served from cache by a service worker/))).toBe(true)
|
||||
|
||||
@@ -54,9 +54,9 @@ module.exports = (api, options) => {
|
||||
]
|
||||
}
|
||||
|
||||
const defaultGenerateSWOptions = workboxPluginMode === 'GenerateSW' ? {
|
||||
cacheId: name
|
||||
} : {}
|
||||
const defaultGenerateSWOptions = workboxPluginMode === 'GenerateSW'
|
||||
? { cacheId: name }
|
||||
: {}
|
||||
|
||||
const workBoxConfig = Object.assign(defaultOptions, defaultGenerateSWOptions, userOptions.workboxOptions)
|
||||
|
||||
|
||||
@@ -129,7 +129,7 @@ module.exports = api => {
|
||||
// Update app manifest (only when there's a manifest.json file,
|
||||
// otherwise it will be inferred from options in vue.config.js)
|
||||
if (data.manifest) {
|
||||
const name = result['name']
|
||||
const name = result.name
|
||||
if (name) {
|
||||
onWriteApi.setData('manifest', {
|
||||
name,
|
||||
@@ -137,7 +137,7 @@ module.exports = api => {
|
||||
})
|
||||
}
|
||||
|
||||
const themeColor = result['themeColor']
|
||||
const themeColor = result.themeColor
|
||||
if (themeColor) {
|
||||
onWriteApi.setData('manifest', {
|
||||
theme_color: themeColor
|
||||
|
||||
@@ -18,7 +18,7 @@ test('generate files', async () => {
|
||||
expect(files['src/main.js']).toBeFalsy()
|
||||
expect(files['src/App.vue']).toMatch('<script lang="ts">')
|
||||
// checks that the Home.vue file has not been created, even empty
|
||||
expect(files.hasOwnProperty('src/views/Home.vue')).toBeFalsy()
|
||||
expect(Object.prototype.hasOwnProperty.call(files, 'src/views/Home.vue')).toBeFalsy()
|
||||
})
|
||||
|
||||
test('classComponent', async () => {
|
||||
@@ -77,7 +77,7 @@ test('use with router', async () => {
|
||||
options: {}
|
||||
}
|
||||
])
|
||||
expect(files['src/views/Home.vue']).toMatch('<div class=\"home\">')
|
||||
expect(files['src/views/Home.vue']).toMatch('<div class="home">')
|
||||
})
|
||||
|
||||
test('tsconfig.json should be valid json', async () => {
|
||||
|
||||
@@ -80,6 +80,8 @@ module.exports = function migrateComponentType (file, api) {
|
||||
) {
|
||||
return false
|
||||
}
|
||||
|
||||
return true
|
||||
})
|
||||
if (defineComponentUsages.length === 0) {
|
||||
tsmodule
|
||||
|
||||
@@ -150,12 +150,12 @@ test('add types to existing tsconfig.json', async () => {
|
||||
'@vue/cli-plugin-unit-jest': {}
|
||||
}
|
||||
})
|
||||
await write('tsconfig.json', JSON.stringify({ compilerOptions: { types: ['some-type'] }}))
|
||||
await write('tsconfig.json', JSON.stringify({ compilerOptions: { types: ['some-type'] } }))
|
||||
|
||||
const invoke = require('@vue/cli/lib/invoke')
|
||||
await invoke('unit-jest', {}, dir)
|
||||
|
||||
const tsconfig = await read('tsconfig.json')
|
||||
expect(tsconfig).toMatch(/\r?\n$/)
|
||||
expect(JSON.parse(tsconfig)['compilerOptions']['types']).toEqual(['some-type', 'jest'])
|
||||
expect(JSON.parse(tsconfig).compilerOptions.types).toEqual(['some-type', 'jest'])
|
||||
}, 30000)
|
||||
|
||||
@@ -147,12 +147,12 @@ test('add types to existing tsconfig.json', async () => {
|
||||
'@vue/cli-plugin-unit-mocha': {}
|
||||
}
|
||||
})
|
||||
await write('tsconfig.json', JSON.stringify({ compilerOptions: { types: ['some-type'] }}))
|
||||
await write('tsconfig.json', JSON.stringify({ compilerOptions: { types: ['some-type'] } }))
|
||||
|
||||
const invoke = require('@vue/cli/lib/invoke')
|
||||
await invoke('unit-mocha', {}, dir)
|
||||
|
||||
const tsconfig = await read('tsconfig.json')
|
||||
expect(tsconfig).toMatch(/\r?\n$/)
|
||||
expect(JSON.parse(tsconfig)['compilerOptions']['types']).toEqual(['some-type', 'mocha', 'chai'])
|
||||
expect(JSON.parse(tsconfig).compilerOptions.types).toEqual(['some-type', 'mocha', 'chai'])
|
||||
}, 30000)
|
||||
|
||||
@@ -67,11 +67,13 @@ module.exports = api => {
|
||||
'--webpack-config',
|
||||
require.resolve('@vue/cli-service/webpack.config.js'),
|
||||
...rawArgv,
|
||||
...(hasInlineFilesGlob ? [] : [
|
||||
api.hasPlugin('typescript')
|
||||
? `tests/unit/**/*.spec.ts`
|
||||
: `tests/unit/**/*.spec.js`
|
||||
])
|
||||
...(hasInlineFilesGlob
|
||||
? []
|
||||
: [
|
||||
api.hasPlugin('typescript')
|
||||
? `tests/unit/**/*.spec.ts`
|
||||
: `tests/unit/**/*.spec.js`
|
||||
])
|
||||
]
|
||||
|
||||
return new Promise((resolve, reject) => {
|
||||
@@ -79,7 +81,7 @@ module.exports = api => {
|
||||
child.on('error', reject)
|
||||
child.on('exit', code => {
|
||||
if (code !== 0) {
|
||||
reject(`mochapack exited with code ${code}.`)
|
||||
reject(new Error(`mochapack exited with code ${code}.`))
|
||||
} else {
|
||||
resolve()
|
||||
}
|
||||
|
||||
@@ -131,7 +131,7 @@ test('keep publicPath when empty', () => {
|
||||
})
|
||||
|
||||
test('load project options from vue.config.js', () => {
|
||||
fs.writeFileSync(path.resolve('/', 'vue.config.js'), '') // only to ensure fs.existsSync returns true
|
||||
fs.writeFileSync(path.resolve('/', 'vue.config.js'), '') // only to ensure fs.existsSync returns true
|
||||
jest.mock(path.resolve('/', 'vue.config.js'), () => ({ lintOnSave: false }), { virtual: true })
|
||||
mockPkg({
|
||||
vue: {
|
||||
|
||||
@@ -92,7 +92,7 @@ test('production defaults', () => {
|
||||
})
|
||||
|
||||
test('override postcss config', () => {
|
||||
const config = genConfig({ postcss: {}})
|
||||
const config = genConfig({ postcss: {} })
|
||||
LANGS.forEach(lang => {
|
||||
const loader = lang === 'css' ? [] : LOADERS[lang]
|
||||
expect(findLoaders(config, lang)).toEqual(['vue-style', 'css', 'postcss'].concat(loader))
|
||||
@@ -393,4 +393,3 @@ test('should use dart sass implementation whenever possible', () => {
|
||||
expect(findOptions(config, 'scss', 'sass')).toMatchObject({ implementation: require('sass') })
|
||||
expect(findOptions(config, 'sass', 'sass')).toMatchObject({ implementation: require('sass') })
|
||||
})
|
||||
|
||||
|
||||
@@ -192,4 +192,3 @@ test('use a single websocket connection for HMR', async () => {
|
||||
}
|
||||
)
|
||||
})
|
||||
|
||||
|
||||
@@ -84,7 +84,7 @@ class PluginAPI {
|
||||
fn = opts
|
||||
opts = null
|
||||
}
|
||||
this.service.commands[name] = { fn, opts: opts || {}}
|
||||
this.service.commands[name] = { fn, opts: opts || {} }
|
||||
}
|
||||
|
||||
/**
|
||||
|
||||
@@ -38,7 +38,7 @@ module.exports = class Service {
|
||||
// resolve the default mode to use for each command
|
||||
// this is provided by plugins as module.exports.defaultModes
|
||||
// so we can get the information without actually applying the plugin.
|
||||
this.modes = this.plugins.reduce((modes, { apply: { defaultModes }}) => {
|
||||
this.modes = this.plugins.reduce((modes, { apply: { defaultModes } }) => {
|
||||
return Object.assign(modes, defaultModes)
|
||||
}, {})
|
||||
}
|
||||
|
||||
@@ -204,7 +204,7 @@ async function build (args, api, options) {
|
||||
}
|
||||
|
||||
if (stats.hasErrors()) {
|
||||
return reject(`Build failed with errors.`)
|
||||
return reject(new Error('Build failed with errors.'))
|
||||
}
|
||||
|
||||
if (!args.silent) {
|
||||
|
||||
@@ -1,3 +1,4 @@
|
||||
/* eslint-disable no-var */
|
||||
// This file is imported into lib/wc client bundles.
|
||||
|
||||
if (typeof window !== 'undefined') {
|
||||
|
||||
@@ -65,8 +65,8 @@ module.exports = (api, rootOptions) => {
|
||||
? './'
|
||||
: '../'.repeat(
|
||||
extractOptions.filename
|
||||
.replace(/^\.[\/\\]/, '')
|
||||
.split(/[\/\\]/g)
|
||||
.replace(/^\.[/\\]/, '')
|
||||
.split(/[/\\]/g)
|
||||
.length - 1
|
||||
)
|
||||
|
||||
|
||||
@@ -1,4 +1,4 @@
|
||||
module.exports = function isAbsoluteUrl (url) {
|
||||
// A URL is considered absolute if it begins with "<scheme>://" or "//"
|
||||
return /^([a-z][a-z\d\+\-\.]*:)?\/\//i.test(url)
|
||||
return /^([a-z][a-z\d+\-.]*:)?\/\//i.test(url)
|
||||
}
|
||||
|
||||
@@ -120,7 +120,7 @@ module.exports = function prepareProxy (proxy, appPublicFolder) {
|
||||
// Otherwise, proxy is an object so create an array of proxies to pass to webpackDevServer
|
||||
return Object.keys(proxy).map(context => {
|
||||
const config = proxy[context]
|
||||
if (!config.hasOwnProperty('target')) {
|
||||
if (!Object.prototype.hasOwnProperty.call(config, 'target')) {
|
||||
console.log(
|
||||
chalk.red(
|
||||
'When `proxy` in package.json is an object, each `context` object must have a ' +
|
||||
@@ -135,7 +135,7 @@ module.exports = function prepareProxy (proxy, appPublicFolder) {
|
||||
}
|
||||
|
||||
function resolveLoopback (proxy) {
|
||||
const o = url.parse(proxy)
|
||||
const o = new url.URL(proxy)
|
||||
o.host = undefined
|
||||
if (o.hostname !== 'localhost') {
|
||||
return proxy
|
||||
@@ -148,7 +148,7 @@ function resolveLoopback (proxy) {
|
||||
o.hostname = address.ipv6() ? '::1' : '127.0.0.1';
|
||||
} catch (_ignored) {
|
||||
o.hostname = '127.0.0.1';
|
||||
}*/
|
||||
} */
|
||||
|
||||
try {
|
||||
// Check if we're on a network; if we are, chances are we can resolve
|
||||
|
||||
@@ -81,7 +81,7 @@ class ModernModePlugin {
|
||||
const fullSafariFixPath = path.join(compilation.options.output.publicPath, safariFixPath)
|
||||
compilation.assets[safariFixPath] = {
|
||||
source: function () {
|
||||
return new Buffer(safariFix)
|
||||
return Buffer.from(safariFix)
|
||||
},
|
||||
size: function () {
|
||||
return Buffer.byteLength(safariFix)
|
||||
|
||||
@@ -7,6 +7,7 @@ const semver = require('semver')
|
||||
// https://github.com/benmosher/eslint-plugin-import/pull/1602
|
||||
// Polyfill Node's `Module.createRequireFromPath` if not present (added in Node v10.12.0)
|
||||
// Use `Module.createRequire` if available (added in Node v12.2.0)
|
||||
// eslint-disable-next-line node/no-deprecated-api
|
||||
const createRequire = Module.createRequire || Module.createRequireFromPath || function (filename) {
|
||||
const mod = new Module(filename, null)
|
||||
mod.filename = filename
|
||||
|
||||
@@ -54,7 +54,6 @@ function executeNodeScript (scriptPath, url) {
|
||||
)
|
||||
console.log(chalk.cyan(scriptPath) + ' exited with code ' + code + '.')
|
||||
console.log()
|
||||
return
|
||||
}
|
||||
})
|
||||
return true
|
||||
@@ -95,7 +94,7 @@ function startBrowserProcess (browser, url) {
|
||||
// Fallback to open
|
||||
// (It will always open new tab)
|
||||
try {
|
||||
var options = { app: browser, url: true }
|
||||
const options = { app: browser, url: true }
|
||||
open(url, options).catch(() => {}) // Prevent `unhandledRejection` error.
|
||||
return true
|
||||
} catch (err) {
|
||||
|
||||
@@ -150,24 +150,26 @@ test('api: extendPackage function', async () => {
|
||||
})
|
||||
|
||||
test('api: extendPackage allow git, github, http, file version ranges', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: 'git+ssh://git@github.com:npm/npm.git#v1.0.27',
|
||||
baz: 'git://github.com/npm/npm.git#v1.0.27',
|
||||
bar: 'expressjs/express',
|
||||
bad: 'mochajs/mocha#4727d357ea',
|
||||
bac: 'http://asdf.com/asdf.tar.gz',
|
||||
bae: 'file:../dyl',
|
||||
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:^1.0.0'
|
||||
}
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: 'git+ssh://git@github.com:npm/npm.git#v1.0.27',
|
||||
baz: 'git://github.com/npm/npm.git#v1.0.27',
|
||||
bar: 'expressjs/express',
|
||||
bad: 'mochajs/mocha#4727d357ea',
|
||||
bac: 'http://asdf.com/asdf.tar.gz',
|
||||
bae: 'file:../dyl',
|
||||
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:^1.0.0'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
|
||||
@@ -186,30 +188,32 @@ test('api: extendPackage allow git, github, http, file version ranges', async ()
|
||||
})
|
||||
|
||||
test('api: extendPackage merge nonstrictly semver deps', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:1.0.0',
|
||||
bar: 'expressjs/express'
|
||||
}
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:1.0.0',
|
||||
bar: 'expressjs/express'
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'test2',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:1.2.0',
|
||||
bar: 'expressjs/express'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'test2',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
'my-lib': 'https://bitbucket.org/user/my-lib.git#semver:1.2.0',
|
||||
bar: 'expressjs/express'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
|
||||
@@ -223,30 +227,32 @@ test('api: extendPackage merge nonstrictly semver deps', async () => {
|
||||
})
|
||||
|
||||
test('api: extendPackage merge dependencies', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: '^1.1.0',
|
||||
bar: '^1.0.0'
|
||||
}
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: '^1.1.0',
|
||||
bar: '^1.0.0'
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'test2',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: '^1.0.0',
|
||||
baz: '^1.0.0'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'test2',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: '^1.0.0',
|
||||
baz: '^1.0.0'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
|
||||
@@ -261,18 +267,20 @@ test('api: extendPackage merge dependencies', async () => {
|
||||
})
|
||||
|
||||
test('api: warn invalid dep range', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: 'foo'
|
||||
}
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: 'foo'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
|
||||
@@ -285,18 +293,20 @@ test('api: warn invalid dep range', async () => {
|
||||
})
|
||||
|
||||
test('api: warn invalid dep range when non-string', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: null
|
||||
}
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: null
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
|
||||
@@ -309,28 +319,30 @@ test('api: warn invalid dep range when non-string', async () => {
|
||||
})
|
||||
|
||||
test('api: extendPackage dependencies conflict', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: '^1.0.0'
|
||||
}
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: '^1.0.0'
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'test2',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: '^2.0.0'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'test2',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
foo: '^2.0.0'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
|
||||
@@ -345,28 +357,30 @@ test('api: extendPackage dependencies conflict', async () => {
|
||||
})
|
||||
|
||||
test('api: extendPackage merge warn nonstrictly semver deps', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test3',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
bar: 'expressjs/express'
|
||||
}
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test3',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
bar: 'expressjs/express'
|
||||
}
|
||||
})
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'test4',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
bar: 'expressjs/express#1234'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'test4',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
dependencies: {
|
||||
bar: 'expressjs/express#1234'
|
||||
}
|
||||
})
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
|
||||
@@ -508,17 +522,19 @@ test('api: extendPackage + { warnIncompatibleVersions: false }', async () => {
|
||||
})
|
||||
|
||||
test('api: render fs directory', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.render('./template', { m: 2 })
|
||||
},
|
||||
options: {
|
||||
n: 1
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.render('./template', { m: 2 })
|
||||
},
|
||||
options: {
|
||||
n: 1
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
|
||||
@@ -533,39 +549,43 @@ test('api: render fs directory', async () => {
|
||||
|
||||
// #4774
|
||||
test('api: call render inside an anonymous function', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
(() => {
|
||||
api.render('./template', { m: 2 })
|
||||
})()
|
||||
},
|
||||
options: {
|
||||
n: 1
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
(() => {
|
||||
api.render('./template', { m: 2 })
|
||||
})()
|
||||
},
|
||||
options: {
|
||||
n: 1
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
expect(fs.readFileSync('/foo.js', 'utf-8')).toMatch('foo(1)')
|
||||
})
|
||||
|
||||
test('api: render object', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.render({
|
||||
'foo1.js': path.join(templateDir, 'foo.js'),
|
||||
'bar/bar1.js': path.join(templateDir, 'bar/bar.js')
|
||||
}, { m: 3 })
|
||||
},
|
||||
options: {
|
||||
n: 2
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: api => {
|
||||
api.render({
|
||||
'foo1.js': path.join(templateDir, 'foo.js'),
|
||||
'bar/bar1.js': path.join(templateDir, 'bar/bar.js')
|
||||
}, { m: 3 })
|
||||
},
|
||||
options: {
|
||||
n: 2
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
|
||||
@@ -574,20 +594,22 @@ test('api: render object', async () => {
|
||||
})
|
||||
|
||||
test('api: render middleware', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: (api, options) => {
|
||||
api.render((files, render) => {
|
||||
files['foo2.js'] = render('foo(<%- n %>)', options)
|
||||
files['bar/bar2.js'] = render('bar(<%- n %>)', options)
|
||||
})
|
||||
},
|
||||
options: {
|
||||
n: 3
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test1',
|
||||
apply: (api, options) => {
|
||||
api.render((files, render) => {
|
||||
files['foo2.js'] = render('foo(<%- n %>)', options)
|
||||
files['bar/bar2.js'] = render('bar(<%- n %>)', options)
|
||||
})
|
||||
},
|
||||
options: {
|
||||
n: 3
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
|
||||
@@ -596,26 +618,29 @@ test('api: render middleware', async () => {
|
||||
})
|
||||
|
||||
test('api: hasPlugin', () => {
|
||||
new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'foo',
|
||||
apply: api => {
|
||||
expect(api.hasPlugin('foo')).toBe(true)
|
||||
expect(api.hasPlugin('bar')).toBe(true)
|
||||
expect(api.hasPlugin('baz')).toBe(true)
|
||||
expect(api.hasPlugin('vue-cli-plugin-bar')).toBe(true)
|
||||
expect(api.hasPlugin('@vue/cli-plugin-baz')).toBe(true)
|
||||
// eslint-disable-next-line no-new
|
||||
new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'foo',
|
||||
apply: api => {
|
||||
expect(api.hasPlugin('foo')).toBe(true)
|
||||
expect(api.hasPlugin('bar')).toBe(true)
|
||||
expect(api.hasPlugin('baz')).toBe(true)
|
||||
expect(api.hasPlugin('vue-cli-plugin-bar')).toBe(true)
|
||||
expect(api.hasPlugin('@vue/cli-plugin-baz')).toBe(true)
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'vue-cli-plugin-bar',
|
||||
apply: () => {}
|
||||
},
|
||||
{
|
||||
id: '@vue/cli-plugin-baz',
|
||||
apply: () => {}
|
||||
}
|
||||
},
|
||||
{
|
||||
id: 'vue-cli-plugin-bar',
|
||||
apply: () => {}
|
||||
},
|
||||
{
|
||||
id: '@vue/cli-plugin-baz',
|
||||
apply: () => {}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
})
|
||||
|
||||
test('api: onCreateComplete', async () => {
|
||||
@@ -707,29 +732,34 @@ test('api: afterAnyInvoke and afterInvoke in hooks', async () => {
|
||||
})
|
||||
|
||||
test('api: resolve', () => {
|
||||
new Generator('/foo/bar', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
expect(api.resolve('baz')).toBe(path.resolve('/foo/bar', 'baz'))
|
||||
// eslint-disable-next-line no-new
|
||||
new Generator('/foo/bar', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
expect(api.resolve('baz')).toBe(path.resolve('/foo/bar', 'baz'))
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
})
|
||||
|
||||
test('api: addEntryImport & addEntryInjection', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectImports('main.js', `import bar from 'bar'`)
|
||||
api.injectRootOptions('main.js', ['foo', 'bar'])
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'entry.js')
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectImports('main.js', `import bar from 'bar'`)
|
||||
api.injectRootOptions('main.js', ['foo', 'bar'])
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'entry.js')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
expect(fs.readFileSync('/main.js', 'utf-8')).toMatch(/import foo from 'foo'\r?\nimport bar from 'bar'/)
|
||||
@@ -737,69 +767,77 @@ test('api: addEntryImport & addEntryInjection', async () => {
|
||||
})
|
||||
|
||||
test('api: injectImports to empty file', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectImports('main.js', `import foo from 'foo'`)
|
||||
api.injectImports('main.js', `import bar from 'bar'`)
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'empty-entry.js')
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectImports('main.js', `import foo from 'foo'`)
|
||||
api.injectImports('main.js', `import bar from 'bar'`)
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'empty-entry.js')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
expect(fs.readFileSync('/main.js', 'utf-8')).toMatch(/import foo from 'foo'\r?\nimport bar from 'bar'/)
|
||||
})
|
||||
|
||||
test('api: injectImports to typescript file', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectImports('main.ts', `import foo from 'foo'`)
|
||||
api.render({
|
||||
'main.ts': path.join(templateDir, 'main.ts')
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectImports('main.ts', `import foo from 'foo'`)
|
||||
api.render({
|
||||
'main.ts': path.join(templateDir, 'main.ts')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
expect(fs.readFileSync('/main.ts', 'utf-8')).toMatch(/import foo from 'foo'/)
|
||||
})
|
||||
|
||||
test('api: addEntryDuplicateImport', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectImports('main.js', `import foo from 'foo'`)
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'entry.js')
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectImports('main.js', `import foo from 'foo'`)
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'entry.js')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
expect(fs.readFileSync('/main.js', 'utf-8')).toMatch(/^import foo from 'foo'\s+new Vue/)
|
||||
})
|
||||
|
||||
test('api: injectImport for .vue files', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectImports('hello.vue', `import foo from 'foo'`)
|
||||
api.render({
|
||||
'hello.vue': path.join(templateDir, 'hello.vue')
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectImports('hello.vue', `import foo from 'foo'`)
|
||||
api.render({
|
||||
'hello.vue': path.join(templateDir, 'hello.vue')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
const content = fs.readFileSync('/hello.vue', 'utf-8')
|
||||
@@ -808,34 +846,38 @@ test('api: injectImport for .vue files', async () => {
|
||||
})
|
||||
|
||||
test('api: addEntryDuplicateInjection', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectRootOptions('main.js', 'baz')
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'entry.js')
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectRootOptions('main.js', 'baz')
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'entry.js')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
expect(fs.readFileSync('/main.js', 'utf-8')).toMatch(/{\s+p: p\(\),\s+baz,\s+render/)
|
||||
})
|
||||
|
||||
test('api: addEntryDuplicateNonIdentifierInjection', async () => {
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectRootOptions('main.js', 'p: p()')
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'entry.js')
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.injectRootOptions('main.js', 'p: p()')
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'entry.js')
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
expect(fs.readFileSync('/main.js', 'utf-8')).toMatch(/{\s+p: p\(\),\s+baz,\s+render/)
|
||||
@@ -848,19 +890,21 @@ test('api: addConfigTransform', async () => {
|
||||
}
|
||||
}
|
||||
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.addConfigTransform('fooConfig', {
|
||||
file: {
|
||||
json: ['foo.config.json']
|
||||
}
|
||||
})
|
||||
api.extendPackage(configs)
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.addConfigTransform('fooConfig', {
|
||||
file: {
|
||||
json: ['foo.config.json']
|
||||
}
|
||||
})
|
||||
api.extendPackage(configs)
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate({
|
||||
extractConfigFiles: true
|
||||
@@ -878,20 +922,22 @@ test('api: addConfigTransform (multiple)', async () => {
|
||||
}
|
||||
}
|
||||
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.addConfigTransform('bazConfig', {
|
||||
file: {
|
||||
js: ['.bazrc.js'],
|
||||
json: ['.bazrc', 'baz.config.json']
|
||||
}
|
||||
})
|
||||
api.extendPackage(configs)
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.addConfigTransform('bazConfig', {
|
||||
file: {
|
||||
js: ['.bazrc.js'],
|
||||
json: ['.bazrc', 'baz.config.json']
|
||||
}
|
||||
})
|
||||
api.extendPackage(configs)
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate({
|
||||
extractConfigFiles: true
|
||||
@@ -909,19 +955,21 @@ test('api: addConfigTransform transform vue warn', async () => {
|
||||
}
|
||||
}
|
||||
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.addConfigTransform('vue', {
|
||||
file: {
|
||||
js: ['vue.config.js']
|
||||
}
|
||||
})
|
||||
api.extendPackage(configs)
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.addConfigTransform('vue', {
|
||||
file: {
|
||||
js: ['vue.config.js']
|
||||
}
|
||||
})
|
||||
api.extendPackage(configs)
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate({
|
||||
extractConfigFiles: true
|
||||
@@ -1002,14 +1050,16 @@ test('extract config files', async () => {
|
||||
]
|
||||
}
|
||||
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.extendPackage(configs)
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.extendPackage(configs)
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate({
|
||||
extractConfigFiles: true
|
||||
@@ -1027,16 +1077,18 @@ test('extract config files', async () => {
|
||||
test('generate a JS-Only value from a string', async () => {
|
||||
const jsAsString = 'true ? "alice" : "bob"'
|
||||
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
testScript: api.makeJSOnlyValue(jsAsString)
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.extendPackage({
|
||||
testScript: api.makeJSOnlyValue(jsAsString)
|
||||
})
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate({})
|
||||
|
||||
@@ -1060,18 +1112,20 @@ test('run a codemod on the entry file', async () => {
|
||||
.toSource()
|
||||
}
|
||||
|
||||
const generator = new Generator('/', { plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'entry.js')
|
||||
})
|
||||
const generator = new Generator('/', {
|
||||
plugins: [
|
||||
{
|
||||
id: 'test',
|
||||
apply: api => {
|
||||
api.render({
|
||||
'main.js': path.join(templateDir, 'entry.js')
|
||||
})
|
||||
|
||||
api.transformScript('main.js', codemod)
|
||||
api.transformScript('main.js', codemod)
|
||||
}
|
||||
}
|
||||
}
|
||||
] })
|
||||
]
|
||||
})
|
||||
|
||||
await generator.generate()
|
||||
expect(fs.readFileSync('/main.js', 'utf-8')).toMatch(/new TestVue/)
|
||||
|
||||
@@ -7,7 +7,7 @@ const create = require('@vue/cli-test-utils/createTestProject')
|
||||
|
||||
const parseJS = file => {
|
||||
const res = {}
|
||||
;(new Function('module', file))(res)
|
||||
;(new Function('module', file))(res) // eslint-disable-line no-new-func
|
||||
return res.exports
|
||||
}
|
||||
|
||||
@@ -150,7 +150,7 @@ extends:
|
||||
})
|
||||
|
||||
test('invoking a plugin that renames files', async () => {
|
||||
const project = await create(`invoke-rename`, { plugins: {}})
|
||||
const project = await create(`invoke-rename`, { plugins: {} })
|
||||
const pkg = JSON.parse(await project.read('package.json'))
|
||||
pkg.devDependencies['@vue/cli-plugin-typescript'] = '*'
|
||||
await project.write('package.json', JSON.stringify(pkg, null, 2))
|
||||
|
||||
@@ -17,7 +17,7 @@ const mergeArrayWithDedupe = (a, b) => Array.from(new Set([...a, ...b]))
|
||||
function pruneObject (obj) {
|
||||
if (typeof obj === 'object') {
|
||||
for (const k in obj) {
|
||||
if (!obj.hasOwnProperty(k)) {
|
||||
if (!Object.prototype.hasOwnProperty.call(obj, k)) {
|
||||
continue
|
||||
}
|
||||
|
||||
|
||||
@@ -88,7 +88,7 @@ function stripVersion (packageName) {
|
||||
// extract the package scope from the full package name
|
||||
// the result includes the initial @ character
|
||||
function extractPackageScope (packageName) {
|
||||
const scopedNameRegExp = /^(@[^\/]+)\/.*$/
|
||||
const scopedNameRegExp = /^(@[^/]+)\/.*$/
|
||||
const result = packageName.match(scopedNameRegExp)
|
||||
|
||||
if (!result) {
|
||||
@@ -222,8 +222,8 @@ class PackageManager {
|
||||
|
||||
const registry = await this.getRegistry(scope)
|
||||
const registryWithoutProtocol = registry
|
||||
.replace(/https?:/, '') // remove leading protocol
|
||||
.replace(/([^/])$/, '$1/') // ensure ending with slash
|
||||
.replace(/https?:/, '') // remove leading protocol
|
||||
.replace(/([^/])$/, '$1/') // ensure ending with slash
|
||||
const authTokenKey = `${registryWithoutProtocol}:_authToken`
|
||||
|
||||
return npmConfig[authTokenKey]
|
||||
|
||||
@@ -135,7 +135,7 @@ exports.executeCommand = function executeCommand (command, args, cwd) {
|
||||
|
||||
child.on('close', code => {
|
||||
if (code !== 0) {
|
||||
reject(`command failed: ${command} ${args.join(' ')}`)
|
||||
reject(new Error(`command failed: ${command} ${args.join(' ')}`))
|
||||
return
|
||||
}
|
||||
resolve()
|
||||
|
||||
@@ -12,7 +12,7 @@ module.exports = async function loadPresetFromDir (dir) {
|
||||
// plugin so it will be invoked by the generator.
|
||||
const hasGenerator = fs.existsSync(path.join(dir, 'generator.js')) || fs.existsSync(path.join(dir, 'generator/index.js'))
|
||||
if (hasGenerator) {
|
||||
(preset.plugins || (preset.plugins = {}))[dir.replace(/[\/]$/, '')] = {
|
||||
(preset.plugins || (preset.plugins = {}))[dir.replace(/[/]$/, '')] = {
|
||||
_isPreset: true,
|
||||
prompts: true
|
||||
}
|
||||
|
||||
@@ -4,7 +4,7 @@ module.exports = function sortObject (obj, keyOrder, dontSortByUnicode) {
|
||||
|
||||
if (keyOrder) {
|
||||
keyOrder.forEach(key => {
|
||||
if (obj.hasOwnProperty(key)) {
|
||||
if (Object.prototype.hasOwnProperty.call(obj, key)) {
|
||||
res[key] = obj[key]
|
||||
delete obj[key]
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user