Skip to content

Commit dcd824c

Browse files
committed
feat(cli): add "--ignore-existing" option
Closes #182
1 parent 42599ee commit dcd824c

File tree

6 files changed

+55
-18
lines changed

6 files changed

+55
-18
lines changed
Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
// nothing

packages/cli/src/__snapshots__/index.test.js.snap

Lines changed: 13 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -377,19 +377,19 @@ export default SvgFile
377377
exports[`cli should suppress output when transforming a directory with a --silent option 1`] = `""`;
378378

379379
exports[`cli should transform a whole directory and output relative destination paths 1`] = `
380-
"
381-
__fixtures__/cased/PascalCase.svg -> __fixtures_build__/whole/cased/PascalCase.js
382-
__fixtures__/cased/camelCase.svg -> __fixtures_build__/whole/cased/CamelCase.js
383-
__fixtures__/cased/kebab-case.svg -> __fixtures_build__/whole/cased/KebabCase.js
384-
__fixtures__/cased/multiple---dashes.svg -> __fixtures_build__/whole/cased/MultipleDashes.js
385-
__fixtures__/complex/skype.svg -> __fixtures_build__/whole/complex/Skype.js
386-
__fixtures__/complex/telegram.svg -> __fixtures_build__/whole/complex/Telegram.js
387-
__fixtures__/nesting/a/two.svg -> __fixtures_build__/whole/nesting/a/Two.js
388-
__fixtures__/nesting/one.svg -> __fixtures_build__/whole/nesting/One.js
389-
__fixtures__/simple/file.svg -> __fixtures_build__/whole/simple/File.js
390-
__fixtures__/withPrettierRc/file.svg -> __fixtures_build__/whole/withPrettierRc/File.js
391-
__fixtures__/withSvgoYml/file.svg -> __fixtures_build__/whole/withSvgoYml/File.js
392-
__fixtures__/withSvgrRc/file.svg -> __fixtures_build__/whole/withSvgrRc/File.js"
380+
"[37m[39m
381+
[37m[39m[37m__fixtures__/cased/camelCase.svg -> __fixtures_build__/whole/cased/CamelCase.js[39m
382+
[37m[39m[37m__fixtures__/cased/kebab-case.svg -> __fixtures_build__/whole/cased/KebabCase.js[39m
383+
[37m[39m[37m__fixtures__/cased/multiple---dashes.svg -> __fixtures_build__/whole/cased/MultipleDashes.js[39m
384+
[37m[39m[37m__fixtures__/complex/skype.svg -> __fixtures_build__/whole/complex/Skype.js[39m
385+
[37m[39m[37m__fixtures__/complex/telegram.svg -> __fixtures_build__/whole/complex/Telegram.js[39m
386+
[37m[39m[37m__fixtures__/nesting/a/two.svg -> __fixtures_build__/whole/nesting/a/Two.js[39m
387+
[37m[39m[37m__fixtures__/nesting/one.svg -> __fixtures_build__/whole/nesting/One.js[39m
388+
[37m[39m[37m__fixtures__/simple/file.svg -> __fixtures_build__/whole/simple/File.js[39m
389+
[37m[39m[37m__fixtures__/withPrettierRc/file.svg -> __fixtures_build__/whole/withPrettierRc/File.js[39m
390+
[37m[39m[37m__fixtures__/withSvgoYml/file.svg -> __fixtures_build__/whole/withSvgoYml/File.js[39m
391+
[37m[39m[37m__fixtures__/withSvgrRc/file.svg -> __fixtures_build__/whole/withSvgrRc/File.js[39m
392+
[37m__fixtures__/cased/PascalCase.svg -> __fixtures_build__/whole/cased/PascalCase.js[39m"
393393
`;
394394

395395
exports[`cli should work with a simple file 1`] = `

packages/cli/src/dirCommand.js

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,23 @@
11
/* eslint-disable no-underscore-dangle, no-console */
2+
import fs from 'fs'
3+
import { promisify } from 'util'
24
import path from 'path'
5+
import chalk from 'chalk'
36
import outputFileSync from 'output-file-sync'
47
import readdir from 'recursive-readdir'
58
import { convertFile, stat, transformFilename, CASE, politeWrite } from './util'
69

10+
const access = promisify(fs.access)
11+
12+
async function exists(file) {
13+
try {
14+
await access(file)
15+
return true
16+
} catch (error) {
17+
return false
18+
}
19+
}
20+
721
function rename(relative, ext, filenameCase) {
822
const relativePath = path.parse(relative)
923
relativePath.ext = `.${ext}`
@@ -26,14 +40,25 @@ async function dirCommand(
2640
{ ext = 'js', filenameCase = CASE.PASCAL, ...options },
2741
) {
2842
async function write(src, relative) {
29-
if (!isCompilable(relative)) return false
43+
if (!isCompilable(relative)) return
3044
relative = rename(relative, ext, filenameCase)
3145

3246
const dest = path.resolve(program.outDir, relative)
3347
const code = await convertFile(src, options)
48+
49+
if (program.ignoreExisting && (await exists(dest))) {
50+
politeWrite(
51+
program,
52+
chalk.grey(`${src} -> ${path.relative(process.cwd(), dest)}\n`),
53+
)
54+
return
55+
}
56+
3457
outputFileSync(dest, code)
35-
politeWrite(program, `${src} -> ${path.relative(process.cwd(), dest)}\n`)
36-
return true
58+
politeWrite(
59+
program,
60+
chalk.white(`${src} -> ${path.relative(process.cwd(), dest)}\n`),
61+
)
3762
}
3863

3964
async function handle(filename) {

packages/cli/src/index.js

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -43,6 +43,7 @@ program
4343
'disable runtime config (".svgrrc", ".svgo.yml", ".prettierrc")',
4444
)
4545
.option('-d, --out-dir <dirname>', 'output files into a directory')
46+
.option('--ignore-existing', 'ignore existing files in output directory')
4647
.option('--ext <ext>', 'specify a custom file extension (default: "js")')
4748
.option(
4849
'--filename-case <case>',

packages/cli/src/index.test.js

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,9 @@ describe('cli', () => {
5858
}, 10000)
5959

6060
it('should suppress output when transforming a directory with a --silent option', async () => {
61-
const result = await cli('--silent --out-dir __fixtures_build__/whole __fixtures__')
61+
const result = await cli(
62+
'--silent --out-dir __fixtures_build__/whole __fixtures__',
63+
)
6264
const sorted = result
6365
.split(/\n/)
6466
.sort()
@@ -143,6 +145,14 @@ describe('cli', () => {
143145
expect(await readdir(outDir)).toMatchSnapshot()
144146
}, 10000)
145147

148+
it('should support "--ignore-existing"', async () => {
149+
const inDir = '__fixtures__/simple'
150+
const outDir = '__fixtures__/simple-existing'
151+
await cli(`${inDir} --out-dir=${outDir} --ignore-existing`)
152+
const content = fs.readFileSync(path.join(outDir, 'File.js'), 'utf-8')
153+
expect(content).toBe('// nothing')
154+
}, 10000)
155+
146156
it('should not override config with cli defaults', async () => {
147157
const result = await cli(
148158
'__fixtures__/simple/file.svg --config-file=__fixtures__/overrides.config.js',

packages/cli/src/util.js

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -53,6 +53,6 @@ export function exitError(error) {
5353

5454
export function politeWrite(program, data) {
5555
if (!program.silent) {
56-
process.stdout.write(data);
56+
process.stdout.write(data)
5757
}
5858
}

0 commit comments

Comments
 (0)