Skip to content

Commit 9d7fb34

Browse files
committed
feat(cli): generate index.js when --out-dir is used
Closes #189
1 parent dcd824c commit 9d7fb34

File tree

5 files changed

+67
-35
lines changed

5 files changed

+67
-35
lines changed

__fixtures__/nesting/a/c/three.svg

Lines changed: 24 additions & 0 deletions
Loading

packages/cli/package.json

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -35,8 +35,7 @@
3535
"commander": "^4.0.1",
3636
"dashify": "^2.0.0",
3737
"glob": "^7.1.4",
38-
"output-file-sync": "^2.0.1",
39-
"recursive-readdir": "^2.2.2"
38+
"output-file-sync": "^2.0.1"
4039
},
4140
"devDependencies": {
4241
"del": "^5.0.0"

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

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -80,6 +80,7 @@ export default SvgFile
8080
exports[`cli should support custom file extension 1`] = `
8181
Array [
8282
"File.ts",
83+
"index.ts",
8384
]
8485
`;
8586

@@ -89,12 +90,14 @@ Array [
8990
"KebabCase.js",
9091
"MultipleDashes.js",
9192
"PascalCase.js",
93+
"index.js",
9294
]
9395
`;
9496

9597
exports[`cli should support different filename cases with directory output: --filename-case=camel 1`] = `
9698
Array [
9799
"camelCase.js",
100+
"index.js",
98101
"kebabCase.js",
99102
"multipleDashes.js",
100103
"pascalCase.js",
@@ -104,6 +107,7 @@ Array [
104107
exports[`cli should support different filename cases with directory output: --filename-case=kebab 1`] = `
105108
Array [
106109
"camel-case.js",
110+
"index.js",
107111
"kebab-case.js",
108112
"multiple-dashes.js",
109113
"pascal-case.js",
@@ -116,6 +120,7 @@ Array [
116120
"KebabCase.js",
117121
"MultipleDashes.js",
118122
"PascalCase.js",
123+
"index.js",
119124
]
120125
`;
121126

@@ -383,6 +388,7 @@ exports[`cli should transform a whole directory and output relative destination
383388
__fixtures__/cased/multiple---dashes.svg -> __fixtures_build__/whole/cased/MultipleDashes.js
384389
__fixtures__/complex/skype.svg -> __fixtures_build__/whole/complex/Skype.js
385390
__fixtures__/complex/telegram.svg -> __fixtures_build__/whole/complex/Telegram.js
391+
__fixtures__/nesting/a/c/three.svg -> __fixtures_build__/whole/nesting/a/c/Three.js
386392
__fixtures__/nesting/a/two.svg -> __fixtures_build__/whole/nesting/a/Two.js
387393
__fixtures__/nesting/one.svg -> __fixtures_build__/whole/nesting/One.js
388394
__fixtures__/simple/file.svg -> __fixtures_build__/whole/simple/File.js

packages/cli/src/dirCommand.js

Lines changed: 35 additions & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -4,10 +4,10 @@ import { promisify } from 'util'
44
import path from 'path'
55
import chalk from 'chalk'
66
import outputFileSync from 'output-file-sync'
7-
import readdir from 'recursive-readdir'
87
import { convertFile, stat, transformFilename, CASE, politeWrite } from './util'
98

109
const access = promisify(fs.access)
10+
const readdir = promisify(fs.readdir)
1111

1212
async function exists(file) {
1313
try {
@@ -34,51 +34,61 @@ export function isCompilable(filename) {
3434
return COMPILABLE_EXTENSIONS.includes(ext)
3535
}
3636

37-
async function dirCommand(
37+
export default async function dirCommand(
3838
program,
3939
filenames,
4040
{ ext = 'js', filenameCase = CASE.PASCAL, ...options },
4141
) {
42-
async function write(src, relative) {
43-
if (!isCompilable(relative)) return
44-
relative = rename(relative, ext, filenameCase)
42+
async function write(src, dest) {
43+
if (!isCompilable(src)) return null
4544

46-
const dest = path.resolve(program.outDir, relative)
45+
dest = rename(dest, ext, filenameCase)
4746
const code = await convertFile(src, options)
47+
const cwdRelative = path.relative(process.cwd(), dest)
48+
const logOutput = `${src} -> ${cwdRelative}\n`
4849

4950
if (program.ignoreExisting && (await exists(dest))) {
50-
politeWrite(
51-
program,
52-
chalk.grey(`${src} -> ${path.relative(process.cwd(), dest)}\n`),
53-
)
54-
return
51+
politeWrite(program, chalk.grey(logOutput))
52+
return null
5553
}
5654

5755
outputFileSync(dest, code)
58-
politeWrite(
59-
program,
60-
chalk.white(`${src} -> ${path.relative(process.cwd(), dest)}\n`),
61-
)
56+
politeWrite(program, chalk.white(logOutput))
57+
return dest
58+
}
59+
60+
async function generateIndex(dest, files) {
61+
const indexFile = path.join(dest, `index.${ext}`)
62+
const exportEntries = files.map(file => {
63+
const basename = path.basename(file, path.extname(file))
64+
return `export { default as ${basename} } from './${basename}'`
65+
})
66+
fs.writeFileSync(indexFile, exportEntries.join('\n'))
6267
}
6368

64-
async function handle(filename) {
69+
async function handle(filename, root) {
6570
const stats = await stat(filename)
6671

6772
if (stats.isDirectory(filename)) {
6873
const dirname = filename
6974
const files = await readdir(dirname)
70-
await Promise.all(
71-
files.map(async _filename => {
72-
const relative = path.relative(dirname, _filename)
73-
return write(_filename, relative)
75+
const results = await Promise.all(
76+
files.map(async relativeFile => {
77+
const absFile = path.join(dirname, relativeFile)
78+
return handle(absFile, root)
7479
}),
7580
)
76-
} else {
77-
await write(filename, filename)
81+
const transformed = results.filter(Boolean)
82+
if (transformed.length) {
83+
const dest = path.resolve(program.outDir, path.relative(root, dirname))
84+
await generateIndex(dest, transformed)
85+
}
86+
return null
7887
}
88+
89+
const dest = path.resolve(program.outDir, path.relative(root, filename))
90+
return write(filename, dest)
7991
}
8092

81-
await Promise.all(filenames.map(handle))
93+
await Promise.all(filenames.map(file => handle(file, file)))
8294
}
83-
84-
export default dirCommand

yarn.lock

Lines changed: 1 addition & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -7182,7 +7182,7 @@ minimalistic-crypto-utils@^1.0.0, minimalistic-crypto-utils@^1.0.1:
71827182
resolved "https://registry.yarnpkg.com/minimalistic-crypto-utils/-/minimalistic-crypto-utils-1.0.1.tgz#f6c00c1c0b082246e5c4d99dfb8c7c083b2b582a"
71837183
integrity sha1-9sAMHAsIIkblxNmd+4x8CDsrWCo=
71847184

7185-
minimatch@3.0.4, minimatch@^3.0.2, minimatch@^3.0.4:
7185+
minimatch@^3.0.2, minimatch@^3.0.4:
71867186
version "3.0.4"
71877187
resolved "https://registry.yarnpkg.com/minimatch/-/minimatch-3.0.4.tgz#5166e286457f03306064be5497e8dbb0c3d32083"
71887188
integrity sha512-yJHVQEhyqPLUTgt9B83PXu6W3rx4MvvHvSUvToogpwoGDOUQ+yDrR0HRot+yOCdCO7u4hX3pWft6kWBBcqh0UA==
@@ -9012,13 +9012,6 @@ realpath-native@^1.1.0:
90129012
dependencies:
90139013
util.promisify "^1.0.0"
90149014

9015-
recursive-readdir@^2.2.2:
9016-
version "2.2.2"
9017-
resolved "https://registry.yarnpkg.com/recursive-readdir/-/recursive-readdir-2.2.2.tgz#9946fb3274e1628de6e36b2f6714953b4845094f"
9018-
integrity sha512-nRCcW9Sj7NuZwa2XvH9co8NPeXUBhZP7CRKJtU+cS6PW9FpCIFoI5ib0NT1ZrbNuPoRy0ylyCaUL8Gih4LSyFg==
9019-
dependencies:
9020-
minimatch "3.0.4"
9021-
90229015
redent@^1.0.0:
90239016
version "1.0.0"
90249017
resolved "https://registry.yarnpkg.com/redent/-/redent-1.0.0.tgz#cf916ab1fd5f1f16dfb20822dd6ec7f730c2afde"

0 commit comments

Comments
 (0)