From 9560bd57ed1a075d8b05e387da1ac3e96e7f1253 Mon Sep 17 00:00:00 2001 From: Arman Ozak Date: Mon, 23 Nov 2020 14:39:31 +0300 Subject: [PATCH] fix: use named imports and exports --- .../packages/schematics/src/utils/barrel.ts | 81 +++++++++++++++---- 1 file changed, 65 insertions(+), 16 deletions(-) diff --git a/npm/ng-packs/packages/schematics/src/utils/barrel.ts b/npm/ng-packs/packages/schematics/src/utils/barrel.ts index 1681362568..b5ac6a0cc3 100644 --- a/npm/ng-packs/packages/schematics/src/utils/barrel.ts +++ b/npm/ng-packs/packages/schematics/src/utils/barrel.ts @@ -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; }