ipsos-components
Version:
Material Design components for Angular
123 lines (101 loc) • 5.66 kB
text/typescript
import {appendFileSync} from 'fs';
import {mkdirpSync} from 'fs-extra';
import {join} from 'path';
import {buildConfig} from './build-config';
import {BuildPackage} from './build-package';
import {copyFiles} from './copy-files';
import {createEntryPointPackageJson} from './entry-point-package-json';
import {inlinePackageMetadataFiles} from './metadata-inlining';
import {createMetadataReexportFile} from './metadata-reexport';
import {createTypingsReexportFile} from './typings-reexport';
import {replaceVersionPlaceholders} from './version-placeholders';
const {packagesDir, outputDir, projectDir} = buildConfig;
/** Directory where all bundles will be created in. */
const bundlesDir = join(outputDir, 'bundles');
/**
* Copies different output files into a folder structure that follows the `angular/angular`
* release folder structure. The output will also contain a README and the according package.json
* file. Additionally the package will be Closure Compiler and AOT compatible.
*/
export function composeRelease(buildPackage: BuildPackage) {
const {name, sourceDir} = buildPackage;
const packageOut = buildPackage.outputDir;
const releasePath = join(outputDir, 'releases', name);
const importAsName = `@angular/${name}`;
inlinePackageMetadataFiles(packageOut);
console.log("inline:"+packageOut);
// Copy all d.ts and metadata files to the `typings/` directory
copyFiles(packageOut, '**/*.+(d.ts|metadata.json)', join(releasePath, 'typings'));
// Copy UMD bundles.
copyFiles(bundlesDir, `${name}?(-*).umd?(.min).js?(.map)`, join(releasePath, 'bundles'));
// Copy ES5 bundles.
copyFiles(bundlesDir, `${name}.es5.js?(.map)`, join(releasePath, 'esm5'));
copyFiles(join(bundlesDir, name), `*.es5.js?(.map)`, join(releasePath, 'esm5'));
// Copy ES2015 bundles
copyFiles(bundlesDir, `${name}.js?(.map)`, join(releasePath, 'esm2015'));
copyFiles(join(bundlesDir, name), `!(*.es5|*.umd).js?(.map)`, join(releasePath, 'esm2015'));
// Copy any additional files that belong in the package.
copyFiles(projectDir, 'LICENSE', releasePath);
copyFiles(packagesDir, 'README.md', releasePath);
copyFiles(sourceDir, 'package.json', releasePath);
replaceVersionPlaceholders(releasePath);
createTypingsReexportFile(releasePath, './typings/index', name);
createMetadataReexportFile(releasePath, './typings/index', name, importAsName);
if (buildPackage.secondaryEntryPoints.length) {
createFilesForSecondaryEntryPoint(buildPackage, releasePath);
}
if (buildPackage.copySecondaryEntryPointStylesToRoot) {
copySecondaryEntryPointStylesheets(buildPackage, releasePath);
}
if (buildPackage.exportsSecondaryEntryPointsAtRoot) {
// Add re-exports to the root d.ts file to prevent errors of the form
// "@angular/material/material has no exported member 'MATERIAL_SANITY_CHECKS."
const es2015Exports = buildPackage.secondaryEntryPoints
.map(p => `export * from './${p}';`).join('\n');
appendFileSync(join(releasePath, `${name}.d.ts`), es2015Exports, 'utf-8');
// When re-exporting secondary entry-points, we need to manually create a metadata file that
// re-exports everything.
createMetadataReexportFile(
releasePath,
buildPackage.secondaryEntryPoints.concat(['typings/index']).map(p => `./${p}`),
name,
importAsName);
}
}
/** Creates files necessary for a secondary entry-point. */
function createFilesForSecondaryEntryPoint(buildPackage: BuildPackage, releasePath: string) {
const {name} = buildPackage;
const packageOut = buildPackage.outputDir;
buildPackage.secondaryEntryPoints.forEach(entryPointName => {
// Create a directory in the root of the package for this entry point that contains
// * A package.json that lists the different bundle locations
// * An index.d.ts file that re-exports the index.d.ts from the typings/ directory
// * A metadata.json re-export for this entry-point's metadata.
const entryPointDir = join(releasePath, entryPointName);
const importAsName = `@angular/${name}/${entryPointName}`;
mkdirpSync(entryPointDir);
createEntryPointPackageJson(entryPointDir, name, entryPointName);
// Copy typings and metadata from tsc output location into the entry-point.
copyFiles(
join(packageOut, entryPointName),
'**/*.+(d.ts|metadata.json)',
join(entryPointDir, 'typings'));
// Create a typings and a metadata re-export within the entry-point to point to the
// typings we just copied.
createTypingsReexportFile(entryPointDir, `./typings/index`, 'index');
createMetadataReexportFile(entryPointDir, `./typings/index`, 'index', importAsName);
// Finally, create both a d.ts and metadata file for this entry-point in the root of
// the package that re-exports from the entry-point's directory.
createTypingsReexportFile(releasePath, `./${entryPointName}/index`, entryPointName);
createMetadataReexportFile(releasePath, `./${entryPointName}/index`, entryPointName,
importAsName);
});
}
/** Copies the stylesheets for secondary entry-points that generate one to the release output. */
function copySecondaryEntryPointStylesheets(buildPackage: BuildPackage, releasePath: string) {
buildPackage.secondaryEntryPoints.forEach(entryPointName => {
const entryPointDir = join(buildPackage.outputDir, entryPointName);
copyFiles(entryPointDir, `_${entryPointName}.scss`, releasePath);
copyFiles(entryPointDir, `${entryPointName}-prebuilt.css`, releasePath);
});
}