1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980818283 |
- 'use strict';
- const fs = require('fs');
- const path = require('path');
- const crequire = require('crequire');
- const debug = require('debug')('resolve-files');
- const defaults = {
- cwd: process.cwd(),
- entry: [],
- ignoreModules: false,
- };
- module.exports = options => {
- options = Object.assign({}, defaults, options);
- const entries = new Set(options.entry || []);
- try {
- entries.add(require.resolve(options.cwd));
- } catch (err) {
- debug('require %s error: %s', options.cwd, err.message);
- }
- if (!entries.size) return [];
- const files = new Set();
- for (const entry of entries) {
- if (fs.existsSync(entry) && fs.statSync(entry).isFile()) {
- resolveFile(entry, files, options);
- }
- }
- return Array.from(files);
- };
- function resolveFile(entry, files, options) {
- if (files.has(entry)) return;
- files.add(entry);
- debug('resolve entry %s', entry);
- const body = fs.readFileSync(entry, 'utf8');
- const rfiles = crequire(body, true).map(o => o.path);
- for (let file of rfiles) {
- // only resolve relative path
- if (file[0] === '.') {
- // ./foo.js > foo.js
- file = path.join(path.dirname(entry), file);
- if (isFile(file)) {
- resolveFile(file, files, options);
- continue;
- }
- // ./foo > foo.js
- const filejs = file + '.js';
- if (isFile(filejs)) {
- resolveFile(filejs, files, options);
- continue;
- }
- // ./foo > foo/index.js
- const filedir = path.join(file, 'index.js');
- if (isFile(filedir)) {
- resolveFile(filedir, files, options);
- continue;
- }
- // otherwise ignore
- // should throw?
- debug('don\' find %s from %s', file, entry);
- continue;
- }
- // resolve modules
- if (options.ignoreModules) continue;
- files.add(file);
- }
- return files;
- }
- function isFile(file) {
- return fs.existsSync(file) && fs.statSync(file).isFile();
- }
|