Skip to content

Commit c648301

Browse files
elevatebartyyx990803
authored andcommitted
fix: vue invoke should delete renamed/removed files (#1049)
1 parent a705998 commit c648301

File tree

3 files changed

+28
-3
lines changed

3 files changed

+28
-3
lines changed

packages/@vue/cli/__tests__/invoke.spec.js

+9
Original file line numberDiff line numberDiff line change
@@ -128,3 +128,12 @@ extends:
128128
- '@vue/airbnb'
129129
`.trim())
130130
})
131+
132+
test('invoking a plugin that renames files', async () => {
133+
const project = await create(`invoke-rename`, { plugins: {}})
134+
const pkg = JSON.parse(await project.read('package.json'))
135+
pkg.devDependencies['@vue/cli-plugin-typescript'] = '*'
136+
await project.write('package.json', JSON.stringify(pkg, null, 2))
137+
await project.run(`${require.resolve('../bin/vue')} invoke typescript -d`)
138+
expect(project.has('src/main.js')).toBe(false)
139+
})

packages/@vue/cli/lib/Generator.js

+4-2
Original file line numberDiff line numberDiff line change
@@ -51,15 +51,17 @@ module.exports = class Generator {
5151
extractConfigFiles = false,
5252
checkExisting = false
5353
} = {}) {
54+
// save the file system before applying plugin for comparison
55+
const initialFiles = Object.assign({}, this.files)
5456
// extract configs from package.json into dedicated files.
5557
this.extractConfigFiles(extractConfigFiles, checkExisting)
5658
// wait for file resolve
5759
await this.resolveFiles()
5860
// set package.json
5961
this.sortPkg()
6062
this.files['package.json'] = JSON.stringify(this.pkg, null, 2)
61-
// write file tree to disk
62-
await writeFileTree(this.context, this.files)
63+
// write/update file tree to disk
64+
await writeFileTree(this.context, this.files, initialFiles)
6365
}
6466

6567
extractConfigFiles (extractAll, checkExisting) {

packages/@vue/cli/lib/util/writeFileTree.js

+15-1
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,27 @@
11
const fs = require('fs')
22
const path = require('path')
33
const { promisify } = require('util')
4+
const unlink = promisify(fs.unlink)
45
const mkdirp = promisify(require('mkdirp'))
56
const write = promisify(fs.writeFile)
67

7-
module.exports = function writeFileTree (dir, files) {
8+
async function deleteRemovedFiles (directory, newFiles, previousFiles) {
9+
// get all files that are not in the new filesystem and are still existing
10+
const filesToDelete = Object.keys(previousFiles)
11+
.filter(filename => !newFiles[filename])
12+
13+
// delete each of these files
14+
const unlinkPromises = filesToDelete.map(filename => unlink(path.join(directory, filename)))
15+
return Promise.all(unlinkPromises)
16+
}
17+
18+
module.exports = async function writeFileTree (dir, files, previousFiles) {
819
if (process.env.VUE_CLI_SKIP_WRITE) {
920
return
1021
}
22+
if (previousFiles) {
23+
await deleteRemovedFiles(dir, files, previousFiles)
24+
}
1125
return Promise.all(Object.keys(files).map(async (name) => {
1226
const filePath = path.join(dir, name)
1327
await mkdirp(path.dirname(filePath))

0 commit comments

Comments
 (0)