|
|
|
@ -16,15 +16,40 @@ export function createBarrelsGenerator(rootPath: string) { |
|
|
|
|
|
|
|
export function generateBarrelFromPath(tree: Tree, indexPath: string) { |
|
|
|
const saveFile = createFileSaver(tree); |
|
|
|
const dir = tree.getDir(indexPath); |
|
|
|
|
|
|
|
const _exports: string[] = []; |
|
|
|
const asterisk = collectAsteriskBarrel(tree, indexPath); |
|
|
|
const named = collectNamedBarrel(tree, indexPath); |
|
|
|
|
|
|
|
dir.subfiles.forEach(fragment => { |
|
|
|
if (!fragment.endsWith('.ts') || fragment === 'index.ts') return; |
|
|
|
if (asterisk.exports.length + named.exports.length) |
|
|
|
saveFile(indexPath + '/index.ts', generateBarrelContent(asterisk, named)); |
|
|
|
} |
|
|
|
|
|
|
|
_exports.push(`export * from './${fragment.replace(/\.ts$/, '')}';`); |
|
|
|
}); |
|
|
|
function generateBarrelContent(asterisk: AsteriskBarrel, named: NamedBarrel): string { |
|
|
|
const namedImports = !named.imports.length |
|
|
|
? '' |
|
|
|
: named.imports.join(` |
|
|
|
`) +
|
|
|
|
` |
|
|
|
`;
|
|
|
|
|
|
|
|
const namedExports = !named.exports.length |
|
|
|
? '' |
|
|
|
: `export { ${named.exports.join(', ')} };
|
|
|
|
`;
|
|
|
|
|
|
|
|
const asteriskExports = !asterisk.exports.length |
|
|
|
? '' |
|
|
|
: asterisk.exports.join(` |
|
|
|
`) +
|
|
|
|
` |
|
|
|
`;
|
|
|
|
|
|
|
|
return namedImports + asteriskExports + namedExports; |
|
|
|
} |
|
|
|
|
|
|
|
function collectNamedBarrel(tree: Tree, indexPath: string) { |
|
|
|
const dir = tree.getDir(indexPath); |
|
|
|
const barrel = new NamedBarrel(); |
|
|
|
|
|
|
|
dir.subdirs.forEach(fragment => { |
|
|
|
const subDirPath = indexPath + '/' + fragment; |
|
|
|
@ -33,18 +58,42 @@ export function generateBarrelFromPath(tree: Tree, indexPath: string) { |
|
|
|
subDir.visit(() => (hasFiles = true)); |
|
|
|
if (!hasFiles) return; |
|
|
|
|
|
|
|
_exports.push(`export * as ${strings.classify(fragment)} from './${fragment}';`); |
|
|
|
const namespaceFragment = strings.classify(fragment); |
|
|
|
barrel.imports.push(`import * as ${namespaceFragment} from './${fragment}';`); |
|
|
|
barrel.exports.push(namespaceFragment); |
|
|
|
generateBarrelFromPath(tree, subDirPath); |
|
|
|
}); |
|
|
|
|
|
|
|
_exports.sort(); |
|
|
|
barrel.imports.sort(); |
|
|
|
barrel.exports.sort(); |
|
|
|
|
|
|
|
if (_exports.length) |
|
|
|
saveFile( |
|
|
|
indexPath + '/index.ts', |
|
|
|
_exports.join(` |
|
|
|
`) +
|
|
|
|
` |
|
|
|
`,
|
|
|
|
); |
|
|
|
return barrel; |
|
|
|
} |
|
|
|
|
|
|
|
function collectAsteriskBarrel(tree: Tree, indexPath: string) { |
|
|
|
const dir = tree.getDir(indexPath); |
|
|
|
const barrel = new AsteriskBarrel(); |
|
|
|
|
|
|
|
dir.subfiles.forEach(fragment => { |
|
|
|
if (!fragment.endsWith('.ts') || fragment === 'index.ts') return; |
|
|
|
|
|
|
|
barrel.exports.push(`export * from './${fragment.replace(/\.ts$/, '')}';`); |
|
|
|
}); |
|
|
|
|
|
|
|
barrel.exports.sort(); |
|
|
|
|
|
|
|
return barrel; |
|
|
|
} |
|
|
|
|
|
|
|
abstract class Barrel { |
|
|
|
imports: string[] = []; |
|
|
|
exports: string[] = []; |
|
|
|
} |
|
|
|
|
|
|
|
class AsteriskBarrel extends Barrel { |
|
|
|
type = 'Asterisk' as const; |
|
|
|
} |
|
|
|
|
|
|
|
class NamedBarrel extends Barrel { |
|
|
|
type = 'Named' as const; |
|
|
|
} |
|
|
|
|