Skip to content

Commit e2f2279

Browse files
committed
make relative paths lazy
this also ensures that the relative path is set before any user functions are called, but no sooner.
1 parent 6ddca72 commit e2f2279

File tree

5 files changed

+36
-6
lines changed

5 files changed

+36
-6
lines changed

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -485,4 +485,4 @@ Released under the [MIT License](LICENSE).
485485

486486
***
487487

488-
_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 19, 2021._
488+
_This file was generated by [verb-generate-readme](https://github.com/verbose/verb-generate-readme), v0.8.0, on April 19, 2021._

bench/index.js

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,13 +50,14 @@ composer.task('recursive-large', () => {
5050

5151
composer.task('recursive-mid', async () => {
5252
const dir = path.join(__dirname, '..');
53+
const files = await readdir(dir, { recursive: true });
5354

5455
if (shouldDelete || fs.existsSync(fixtures)) {
5556
await rimraf(fixtures, { glob: false });
5657
await pause(1000);
5758
}
5859

59-
return bench('recursive ~2,700 files')
60+
return bench(`recursive ~${files.length} files`)
6061
.add('fdir', () => fdirRecursive(dir))
6162
.add('@folder/readdir', () => readdir(dir, { recursive: true }))
6263
.add('readdir-enhanced', () => enhanced.async(dir, { deep: true, basePath: dir }))

lib/async.js

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -154,16 +154,28 @@ const readdir = async (basedir, options = {}) => {
154154
file.dirname = dirent.path;
155155
file.path = file[kPath] = `${dirent.path}${sep}${file.name}`;
156156

157-
if (absolute !== true || objects === true || isMatch) {
157+
let updatedRelative = false;
158+
159+
// lazily decorate relative path if or when a user supplied function is called
160+
// if no function is passed, we can avoid calling this function
161+
const updateRelative = () => {
162+
if (updatedRelative) return;
163+
updatedRelative = true;
164+
158165
if (file[kPath] === file.path && file.base === file.cwd) {
159166
file.relative = dirent.relative ? `${dirent.relative}${sep}${file.name}` : file.name;
160167
} else {
161168
file.relative = path.relative(file.base, file.path);
162169
}
170+
};
171+
172+
if (absolute !== true || objects === true || isMatch) {
173+
updateRelative();
163174
}
164175

165176
if (onEach) {
166177
try {
178+
updateRelative();
167179
await onEach(file, dirent);
168180
} catch (err) {
169181
next(err);
@@ -172,8 +184,10 @@ const readdir = async (basedir, options = {}) => {
172184
}
173185

174186
if (file.isSymbolicLink()) {
187+
175188
try {
176189
if (typeof onSymbolicLink === 'function') {
190+
updateRelative();
177191
await onSymbolicLink(file, dirent);
178192
}
179193

@@ -219,6 +233,7 @@ const readdir = async (basedir, options = {}) => {
219233

220234
if (typeof onFile === 'function') {
221235
try {
236+
updateRelative();
222237
await onFile(file, dirent);
223238
} catch (err) {
224239
next(err);

lib/sync.js

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -131,21 +131,34 @@ const readdirSync = (basedir, options = {}) => {
131131
file.dirname = dirent.path;
132132
file.path = file[kPath] = `${dirent.path}${sep}${file.name}`;
133133

134-
if (absolute !== true || objects === true || isMatch) {
134+
let updatedRelative = false;
135+
136+
// lazily decorate relative path if or when a user supplied function is called
137+
// if no function is passed, we can avoid calling this function
138+
const updateRelative = () => {
139+
if (updatedRelative) return;
140+
updatedRelative = true;
141+
135142
if (file[kPath] === file.path && file.base === file.cwd) {
136-
file.relative = dirent.relative ? `${dirent.relative}${path.sep}${file.name}` : file.name;
143+
file.relative = dirent.relative ? `${dirent.relative}${sep}${file.name}` : file.name;
137144
} else {
138145
file.relative = path.relative(file.base, file.path);
139146
}
147+
};
148+
149+
if (absolute !== true || objects === true || isMatch) {
150+
updateRelative();
140151
}
141152

142153
if (onEach) {
154+
updateRelative();
143155
onEach(file, dirent);
144156
}
145157

146158
if (file.isSymbolicLink()) {
147159
try {
148160
if (typeof onSymbolicLink === 'function') {
161+
updateRelative();
149162
onSymbolicLink(file, dirent);
150163
}
151164

@@ -178,6 +191,7 @@ const readdirSync = (basedir, options = {}) => {
178191
}
179192

180193
if (typeof onFile === 'function') {
194+
updateRelative();
181195
onFile(file, dirent);
182196
}
183197

package.json

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -99,4 +99,4 @@
9999
"reflinks": true
100100
}
101101
}
102-
}
102+
}

0 commit comments

Comments
 (0)