// repeatable scan for single staticPath function scan(sp, cb) { cb = u.onceMaybe(cb); var timer = u.timer(); sp.route = sp.route || '/'; var src = sp.src; // only construct src, defaults, sendOpts etc. once if (!src) { sp.depth = sp.depth || 5; sp.maxAge = 'maxAge' in sp ? sp.maxAge : '10m'; sp.includeBinaries = true; src = sp.src = fsbase(sp); if (src.isfile()) { sp.depth = 1; } sp.sendOpts = u.assign( u.pick(sp, 'maxAge', 'lastModified', 'etag'), { dotfiles:'ignore', index:false, // handled at this level extensions:false, // ditto root:src.path } ); } src.listfiles(function(err, files) { if (err) return cb(log(err)); sp.files = files; self.scanCnt++; mapAllFiles(); debug('static scan %s-deep %sms %s', sp.depth, timer(), sp.path.replace(/.*\/node_modules\//g, '')); debug(files.length > 10 ? '[' + files.length + ' files]' : u.pluck(files, 'filepath')); cb(); }); }
// return serializable file object function serializeFile(file) { // preserve path, source, and file-save props var o = u.pick(file, 'path', '_oldtext', '_dirty'); // recreate file.text from serialized fragments // new or modifified fragments should delete file.text o.text = file.text || serializeTextFragments(file); return o; }