40 lines
908 B
TypeScript
40 lines
908 B
TypeScript
|
|
import fs from 'fs';
|
||
|
|
import path from 'path';
|
||
|
|
import findIndexFile from './findIndexFile';
|
||
|
|
|
||
|
|
const componentRegex = /^(Unstable_)?([A-Z][a-z]*)+2?\.(js|tsx)/;
|
||
|
|
|
||
|
|
/**
|
||
|
|
* Returns the component source in a flat array.
|
||
|
|
* @param {string} directory
|
||
|
|
* @param {Array<{ filename: string, indexFilename: string }>} components
|
||
|
|
*/
|
||
|
|
export default function findComponents(
|
||
|
|
directory: string,
|
||
|
|
components: { filename: string; indexFilename: string | null }[] = [],
|
||
|
|
) {
|
||
|
|
const items = fs.readdirSync(directory);
|
||
|
|
|
||
|
|
items.forEach((item) => {
|
||
|
|
const itemPath = path.resolve(directory, item);
|
||
|
|
|
||
|
|
if (fs.statSync(itemPath).isDirectory()) {
|
||
|
|
findComponents(itemPath, components);
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
if (!componentRegex.test(item)) {
|
||
|
|
return;
|
||
|
|
}
|
||
|
|
|
||
|
|
const indexFile = findIndexFile(directory);
|
||
|
|
|
||
|
|
components.push({
|
||
|
|
filename: itemPath,
|
||
|
|
...indexFile,
|
||
|
|
});
|
||
|
|
});
|
||
|
|
|
||
|
|
return components;
|
||
|
|
}
|