Skip to content

Commit 148b424

Browse files
committed
feat(cli-service): add declaration for PluginAPI
fix vuejs#5324
1 parent 4659869 commit 148b424

File tree

5 files changed

+296
-2
lines changed

5 files changed

+296
-2
lines changed

packages/@vue/cli-service/package.json

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -26,6 +26,8 @@
2626
"@intervolga/optimize-cssnano-plugin": "^1.0.5",
2727
"@soda/friendly-errors-webpack-plugin": "^1.7.1",
2828
"@soda/get-current-script": "^1.0.0",
29+
"@types/minimist": "^1.2.0",
30+
"@types/webpack-dev-server": "^3.10.1",
2931
"@vue/cli-overlay": "^4.3.0",
3032
"@vue/cli-plugin-router": "^4.3.0",
3133
"@vue/cli-plugin-vuex": "^4.3.0",
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
import { PluginAPI } from '@vue/cli-service'
2+
3+
export = (api: PluginAPI) => {
4+
const version = api.version
5+
api.assertVersion(4)
6+
api.assertVersion('^100')
7+
api.getCwd()
8+
api.resolve('src/main.js')
9+
api.hasPlugin('eslint')
10+
api.registerCommand(
11+
'lint',
12+
{
13+
description: 'lint and fix source files',
14+
usage: 'vue-cli-service lint [options] [...files]',
15+
options: {
16+
'--format [formatter]': 'specify formatter (default: codeframe)'
17+
},
18+
details: 'For more options, see https://eslint.org/docs/user-guide/command-line-interface#options'
19+
},
20+
args => {
21+
require('./lint')(args, api)
22+
}
23+
)
24+
api.registerCommand('lint', args => {})
25+
26+
api.chainWebpack(webpackConfig => {
27+
if (process.env.NODE_ENV !== 'production' && process.env.NODE_ENV !== 'test') {
28+
webpackConfig.devtool('cheap-module-eval-source-map')
29+
30+
webpackConfig.plugin('hmr').use(require('webpack/lib/HotModuleReplacementPlugin'))
31+
32+
webpackConfig.output.globalObject(`(typeof self !== 'undefined' ? self : this)`)
33+
}
34+
})
35+
36+
api.configureWebpack(config => {
37+
config.output = {
38+
path: 'test-dist-2'
39+
}
40+
})
41+
42+
api.configureWebpack(config => {
43+
return {
44+
devtool: config.devtool ? config.devtool : 'source-map'
45+
}
46+
})
47+
48+
api.resolveWebpackConfig()
49+
50+
api.resolveWebpackConfig(api.resolveChainableWebpackConfig())
51+
52+
const { cacheIdentifier, cacheDirectory } = api.genCacheConfig(
53+
'babel-loader',
54+
{
55+
'@babel/core': require('@babel/core/package.json').version,
56+
'@vue/babel-preset-app': require('@vue/babel-preset-app/package.json').version,
57+
'babel-loader': require('babel-loader/package.json').version,
58+
modern: !!process.env.VUE_CLI_MODERN_BUILD,
59+
browserslist: api.service.pkg.browserslist
60+
},
61+
['babel.config.js', '.browserslistrc']
62+
)
63+
}
Lines changed: 123 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1 +1,124 @@
1+
// Users who do not have --allowSyntheticDefaultExports or --esModuleInterop will get different behavior
2+
// https://github.com/Microsoft/dtslint/blob/master/docs/no-import-default-of-export-equals.md
3+
import minimist = require('minimist')
4+
import ChainableConfig = require('webpack-chain')
5+
import webpack = require('webpack')
6+
import WebpackDevServer = require('webpack-dev-server')
7+
import express = require('express') // @types/webpack-dev-server depends on @types/express
8+
9+
type RegisterCommandFn = (args: minimist.ParsedArgs, rawArgv: string[]) => any
10+
11+
type RegisterCommandOpts = Partial<{
12+
description: string
13+
usage: string
14+
options: {
15+
[flags: string]: string
16+
}
17+
details: string
18+
}>
19+
20+
type WebpackChainFn = (chainableConfig: ChainableConfig) => void
21+
22+
type webpackRawConfigFn = ((config: webpack.Configuration) => webpack.Configuration | void) | webpack.Configuration
23+
24+
type DevServerConfigFn = (app: express.Application, server: WebpackDevServer) => void
25+
26+
interface CacheConfig {
27+
cacheDirectory: string
28+
cacheIdentifier: string
29+
}
30+
export class PluginAPI {
31+
id: string
32+
33+
service: any
34+
35+
get version(): string
36+
37+
assertVersion(range: number | string): void
38+
39+
/**
40+
* Current working directory.
41+
*/
42+
getCwd(): string
43+
44+
/**
45+
* Resolve path for a project.
46+
*
47+
* @param _path - Relative path from project root
48+
* @return The resolved absolute path.
49+
*/
50+
resolve(_path: string): string
51+
52+
/**
53+
* Check if the project has a given plugin.
54+
*
55+
* @param id - Plugin id, can omit the (@vue/|vue-|@scope/vue)-cli-plugin- prefix
56+
* @return `boolean`
57+
*/
58+
hasPlugin(id: string): boolean
59+
60+
/**
61+
* Register a command that will become available as `vue-cli-service [name]`.
62+
*
63+
* @param name
64+
* @param [opts]
65+
* @param fn
66+
*/
67+
registerCommand(name: string, fn: RegisterCommandFn): void
68+
registerCommand(name: string, opts: RegisterCommandOpts, fn: RegisterCommandFn): void
69+
70+
/**
71+
* Register a function that will receive a chainable webpack config
72+
* the function is lazy and won't be called until `resolveWebpackConfig` is
73+
* called
74+
*
75+
* @param fn
76+
*/
77+
chainWebpack(fn: WebpackChainFn): void
78+
79+
/**
80+
* Register
81+
* - a webpack configuration object that will be merged into the config
82+
* OR
83+
* - a function that will receive the raw webpack config.
84+
* the function can either mutate the config directly or return an object
85+
* that will be merged into the config.
86+
*
87+
* @param fn
88+
*/
89+
configureWebpack(fn: webpackRawConfigFn): void
90+
91+
/**
92+
* Register a dev serve config function. It will receive the express `app`
93+
* instance of the dev server.
94+
*
95+
* @param fn
96+
*/
97+
configureDevServer(fn: DevServerConfigFn): void
98+
99+
/**
100+
* Resolve the final raw webpack config, that will be passed to webpack.
101+
*
102+
* @param [chainableConfig]
103+
* @return Raw webpack config.
104+
*/
105+
resolveWebpackConfig(chainableConfig?: ChainableConfig): webpack.Configuration
106+
107+
/**
108+
* Resolve an intermediate chainable webpack config instance, which can be
109+
* further tweaked before generating the final raw webpack config.
110+
* You can call this multiple times to generate different branches of the
111+
* base webpack config.
112+
* See https://github.com/mozilla-neutrino/webpack-chain
113+
*
114+
* @return ChainableWebpackConfig
115+
*/
116+
resolveChainableWebpackConfig(): ChainableConfig
117+
118+
/**
119+
* Generate a cache identifier from a number of variables
120+
*/
121+
genCacheConfig(id: string, partialIdentifier: any, configFiles?: object | object[]): CacheConfig
122+
}
123+
1124
export { ProjectOptions, ConfigFunction } from './ProjectOptions'
Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
2+
{
3+
"files": [
4+
"cli-service-test.ts",
5+
"index.d.ts"
6+
],
7+
"compilerOptions": {
8+
"module": "commonjs",
9+
"lib": [
10+
"es6"
11+
],
12+
"noImplicitAny": true,
13+
"noImplicitThis": true,
14+
"strictNullChecks": true,
15+
"esModuleInterop": true,
16+
"strictFunctionTypes": true,
17+
"types": [],
18+
"noEmit": true,
19+
"forceConsistentCasingInFileNames": true,
20+
"baseUrl": ".",
21+
"skipLibCheck": true
22+
}
23+
}

yarn.lock

Lines changed: 85 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2677,6 +2677,11 @@
26772677
dependencies:
26782678
"@types/node" "*"
26792679

2680+
"@types/anymatch@*":
2681+
version "1.3.1"
2682+
resolved "https://registry.npmjs.org/@types/anymatch/-/anymatch-1.3.1.tgz#336badc1beecb9dacc38bea2cf32adf627a8421a"
2683+
integrity sha512-/+CRPXpBDpo2RK9C68N3b2cOvO0Cf5B9aPijHsoDQTHivnGSObdOF2BRQOYjojWTDy6nQvMjmqRXIxH55VjxxA==
2684+
26802685
"@types/babel__core@^7.1.0":
26812686
version "7.1.3"
26822687
resolved "https://registry.yarnpkg.com/@types/babel__core/-/babel__core-7.1.3.tgz#e441ea7df63cd080dfcd02ab199e6d16a735fc30"
@@ -2736,6 +2741,14 @@
27362741
resolved "https://registry.yarnpkg.com/@types/color-name/-/color-name-1.1.1.tgz#1c1261bbeaa10a8055bbc5d8ab84b7b2afc846a0"
27372742
integrity sha512-rr+OQyAjxze7GgWrSaJwydHStIhHq2lvY3BOC2Mj7KnzI7XK0Uw1TOOdI9lDoajEbSWLiYgoo4f1R51erQfhPQ==
27382743

2744+
"@types/connect-history-api-fallback@*":
2745+
version "1.3.3"
2746+
resolved "https://registry.npmjs.org/@types/connect-history-api-fallback/-/connect-history-api-fallback-1.3.3.tgz#4772b79b8b53185f0f4c9deab09236baf76ee3b4"
2747+
integrity sha512-7SxFCd+FLlxCfwVwbyPxbR4khL9aNikJhrorw8nUIOqeuooc9gifBuDQOJw5kzN7i6i3vLn9G8Wde/4QDihpYw==
2748+
dependencies:
2749+
"@types/express-serve-static-core" "*"
2750+
"@types/node" "*"
2751+
27392752
"@types/connect@*":
27402753
version "3.4.33"
27412754
resolved "https://registry.yarnpkg.com/@types/connect/-/connect-3.4.33.tgz#31610c901eca573b8713c3330abc6e6b9f588546"
@@ -2818,6 +2831,22 @@
28182831
resolved "https://registry.yarnpkg.com/@types/http-assert/-/http-assert-1.5.1.tgz#d775e93630c2469c2f980fc27e3143240335db3b"
28192832
integrity sha512-PGAK759pxyfXE78NbKxyfRcWYA/KwW17X290cNev/qAsn9eQIxkH4shoNBafH37wewhDG/0p1cHPbK6+SzZjWQ==
28202833

2834+
"@types/http-proxy-middleware@*":
2835+
version "0.19.3"
2836+
resolved "https://registry.npmjs.org/@types/http-proxy-middleware/-/http-proxy-middleware-0.19.3.tgz#b2eb96fbc0f9ac7250b5d9c4c53aade049497d03"
2837+
integrity sha512-lnBTx6HCOUeIJMLbI/LaL5EmdKLhczJY5oeXZpX/cXE4rRqb3RmV7VcMpiEfYkmTjipv3h7IAyIINe4plEv7cA==
2838+
dependencies:
2839+
"@types/connect" "*"
2840+
"@types/http-proxy" "*"
2841+
"@types/node" "*"
2842+
2843+
"@types/http-proxy@*":
2844+
version "1.17.4"
2845+
resolved "https://registry.npmjs.org/@types/http-proxy/-/http-proxy-1.17.4.tgz#e7c92e3dbe3e13aa799440ff42e6d3a17a9d045b"
2846+
integrity sha512-IrSHl2u6AWXduUaDLqYpt45tLVCtYv7o4Z0s1KghBCDgIIS9oW5K1H8mZG/A2CfeLdEa7rTd1ACOiHBc1EMT2Q==
2847+
dependencies:
2848+
"@types/node" "*"
2849+
28212850
"@types/istanbul-lib-coverage@*", "@types/istanbul-lib-coverage@^2.0.0":
28222851
version "2.0.1"
28232852
resolved "https://registry.yarnpkg.com/@types/istanbul-lib-coverage/-/istanbul-lib-coverage-2.0.1.tgz#42995b446db9a48a11a07ec083499a860e9138ff"
@@ -2889,6 +2918,11 @@
28892918
resolved "https://registry.yarnpkg.com/@types/minimatch/-/minimatch-3.0.3.tgz#3dca0e3f33b200fc7d1139c0cd96c1268cadfd9d"
28902919
integrity sha512-tHq6qdbT9U1IRSGf14CL0pUlULksvY9OZ+5eEgl1N7t+OA3tGvNpxJCzuKQlsNgCVwbAs670L1vcVQi8j9HjnA==
28912920

2921+
"@types/minimist@^1.2.0":
2922+
version "1.2.0"
2923+
resolved "https://registry.npmjs.org/@types/minimist/-/minimist-1.2.0.tgz#69a23a3ad29caf0097f06eda59b361ee2f0639f6"
2924+
integrity sha1-aaI6OtKcrwCX8G7aWbNh7i8GOfY=
2925+
28922926
"@types/mocha@^5.2.6":
28932927
version "5.2.7"
28942928
resolved "https://registry.yarnpkg.com/@types/mocha/-/mocha-5.2.7.tgz#315d570ccb56c53452ff8638738df60726d5b6ea"
@@ -2939,6 +2973,11 @@
29392973
resolved "https://registry.yarnpkg.com/@types/sizzle/-/sizzle-2.3.2.tgz#a811b8c18e2babab7d542b3365887ae2e4d9de47"
29402974
integrity sha512-7EJYyKTL7tFR8+gDbB6Wwz/arpGa0Mywk1TJbNzKzHtzbwVmY4HR9WqS5VV7dsBUKQmPNr192jHr/VpBluj/hg==
29412975

2976+
"@types/source-list-map@*":
2977+
version "0.1.2"
2978+
resolved "https://registry.npmjs.org/@types/source-list-map/-/source-list-map-0.1.2.tgz#0078836063ffaf17412349bba364087e0ac02ec9"
2979+
integrity sha512-K5K+yml8LTo9bWJI/rECfIPrGgxdpeNbj+d53lwN4QjW1MCwlkhUms+gtdzigTeUyBr09+u8BwOIY3MXvHdcsA==
2980+
29422981
"@types/stack-utils@^1.0.1":
29432982
version "1.0.1"
29442983
resolved "https://registry.yarnpkg.com/@types/stack-utils/-/stack-utils-1.0.1.tgz#0a851d3bd96498fa25c33ab7278ed3bd65f06c3e"
@@ -2954,11 +2993,55 @@
29542993
resolved "https://registry.yarnpkg.com/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz#9aa30c04db212a9a0649d6ae6fd50accc40748a1"
29552994
integrity sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==
29562995

2996+
"@types/tapable@*":
2997+
version "1.0.5"
2998+
resolved "https://registry.npmjs.org/@types/tapable/-/tapable-1.0.5.tgz#9adbc12950582aa65ead76bffdf39fe0c27a3c02"
2999+
integrity sha512-/gG2M/Imw7cQFp8PGvz/SwocNrmKFjFsm5Pb8HdbHkZ1K8pmuPzOX4VeVoiEecFCVf4CsN1r3/BRvx+6sNqwtQ==
3000+
3001+
"@types/uglify-js@*":
3002+
version "3.0.5"
3003+
resolved "https://registry.npmjs.org/@types/uglify-js/-/uglify-js-3.0.5.tgz#2c70d5c68f6e002e3b2e4f849adc5f162546f633"
3004+
integrity sha512-L7EbSkhSaWBpkl+PZAEAqZTqtTeIsq7s/oX/q0LNnxxJoRVKQE0T81XDVyaxjiiKQwiV2vhVeYRqxdRNqGOGJw==
3005+
dependencies:
3006+
source-map "^0.6.1"
3007+
3008+
"@types/webpack-dev-server@^3.10.1":
3009+
version "3.10.1"
3010+
resolved "https://registry.npmjs.org/@types/webpack-dev-server/-/webpack-dev-server-3.10.1.tgz#93b7133cc9dab1ca1b76659f5ef8b763ad54c28a"
3011+
integrity sha512-2nwwQ/qHRghUirvG/gEDkOQDa+d881UTJM7EG9ok5KNaYCjYVvy7fdaO528Lcym9OQDn75SvruPYVVvMJxqO0g==
3012+
dependencies:
3013+
"@types/connect-history-api-fallback" "*"
3014+
"@types/express" "*"
3015+
"@types/http-proxy-middleware" "*"
3016+
"@types/serve-static" "*"
3017+
"@types/webpack" "*"
3018+
29573019
"@types/webpack-env@^1.15.1":
29583020
version "1.15.1"
29593021
resolved "https://registry.yarnpkg.com/@types/webpack-env/-/webpack-env-1.15.1.tgz#c8e84705e08eed430b5e15b39c65b0944e4d1422"
29603022
integrity sha512-eWN5ElDTeBc5lRDh95SqA8x18D0ll2pWudU3uWiyfsRmIZcmUXpEsxPU+7+BsdCrO2vfLRC629u/MmjbmF+2tA==
29613023

3024+
"@types/webpack-sources@*":
3025+
version "0.1.7"
3026+
resolved "https://registry.npmjs.org/@types/webpack-sources/-/webpack-sources-0.1.7.tgz#0a330a9456113410c74a5d64180af0cbca007141"
3027+
integrity sha512-XyaHrJILjK1VHVC4aVlKsdNN5KBTwufMb43cQs+flGxtPAf/1Qwl8+Q0tp5BwEGaI8D6XT1L+9bSWXckgkjTLw==
3028+
dependencies:
3029+
"@types/node" "*"
3030+
"@types/source-list-map" "*"
3031+
source-map "^0.6.1"
3032+
3033+
"@types/webpack@*":
3034+
version "4.41.10"
3035+
resolved "https://registry.npmjs.org/@types/webpack/-/webpack-4.41.10.tgz#2e1f6b3508a249854efe3dcc7690905ac5ee10be"
3036+
integrity sha512-vIy0qaq8AjOjZLuFPqpo7nAJzcoVXMdw3mvpNN07Uvdy0p1IpJeLNBe3obdRP7FX2jIusDE7z1pZa0A6qYUgnA==
3037+
dependencies:
3038+
"@types/anymatch" "*"
3039+
"@types/node" "*"
3040+
"@types/tapable" "*"
3041+
"@types/uglify-js" "*"
3042+
"@types/webpack-sources" "*"
3043+
source-map "^0.6.0"
3044+
29623045
"@types/ws@^6.0.0":
29633046
version "6.0.4"
29643047
resolved "https://registry.yarnpkg.com/@types/ws/-/ws-6.0.4.tgz#7797707c8acce8f76d8c34b370d4645b70421ff1"
@@ -15448,7 +15531,7 @@ punycode@^2.1.0, punycode@^2.1.1:
1544815531
resolved "https://registry.yarnpkg.com/punycode/-/punycode-2.1.1.tgz#b58b010ac40c22c5657616c8d2c2c02c7bf479ec"
1544915532
integrity sha512-XRsRjdf+j5ml+y/6GKHPZbrF/8p2Yga0JPtdqTIY2Xe5ohJPD9saDJJLPvp9+NSBprVvevdXZybnj2cv8OEd0A==
1545015533

15451-
puppeteer@1.11.0, puppeteer@^1.11.0:
15534+
puppeteer@^1.11.0:
1545215535
version "1.11.0"
1545315536
resolved "https://registry.yarnpkg.com/puppeteer/-/puppeteer-1.11.0.tgz#63cdbe12b07275cd6e0b94bce41f3fcb20305770"
1545415537
integrity sha512-iG4iMOHixc2EpzqRV+pv7o3GgmU2dNYEMkvKwSaQO/vMZURakwSOn/EYJ6OIRFYOque1qorzIBvrytPIQB3YzQ==
@@ -18823,7 +18906,7 @@ vue-router@^3.1.6:
1882318906
resolved "https://registry.yarnpkg.com/vue-router/-/vue-router-3.1.6.tgz#45f5a3a3843e31702c061dd829393554e4328f89"
1882418907
integrity sha512-GYhn2ynaZlysZMkFE5oCHRUTqE8BWs/a9YbKpNLi0i7xD6KG1EzDqpHQmv1F5gXjr8kL5iIVS8EOtRaVUEXTqA==
1882518908

18826-
vue-server-renderer@^2.6.10, vue-server-renderer@^2.6.11:
18909+
vue-server-renderer@^2.6.10:
1882718910
version "2.6.11"
1882818911
resolved "https://registry.yarnpkg.com/vue-server-renderer/-/vue-server-renderer-2.6.11.tgz#be8c9abc6aacc309828a755c021a05fc474b4bc3"
1882918912
integrity sha512-V3faFJHr2KYfdSIalL+JjinZSHYUhlrvJ9pzCIjjwSh77+pkrsXpK4PucdPcng57+N77pd1LrKqwbqjQdktU1A==

0 commit comments

Comments
 (0)