build-public-api.js 1.7 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647
  1. // @ts-check
  2. const fs = require('fs');
  3. const path = require('path');
  4. // This script finds all app sources and then generates a "public-api.ts" file exporting their
  5. // contents. This is then used as the public API entrypoint for the Angular CLI's library
  6. // builder process.
  7. console.log('Generating public api...');
  8. const SOURCES_DIR = path.join(__dirname, '/../src/app');
  9. const APP_SOURCE_FILE_PATTERN = /\.(pipe|service|component|module|routes|directive|guard|config)\.ts$/;
  10. const files = [];
  11. const publicApiFilePath = path.join(__dirname, '/../src');
  12. forMatchingFiles(SOURCES_DIR, APP_SOURCE_FILE_PATTERN, filename => {
  13. const relativeFilename = '.' + filename.replace(publicApiFilePath, '')
  14. .replace(/\\/g, '/')
  15. .replace(/\.ts$/, '');
  16. files.push(relativeFilename);
  17. });
  18. const header = `// This file was generated by the build-public-api.ts script\n`;
  19. const fileContents = header + files.map(f => `export * from '${f}';`).join('\n') + '\n';
  20. fs.writeFileSync(path.join(publicApiFilePath, 'public-api.ts'), fileContents, 'utf8');
  21. console.log('Done!');
  22. /**
  23. *
  24. * @param startPath {string}
  25. * @param filter {RegExp}
  26. * @param callback {(filename: string) => void}
  27. */
  28. function forMatchingFiles(startPath, filter, callback) {
  29. if (!fs.existsSync(startPath)) {
  30. console.log('Starting path does not exist ', startPath);
  31. return;
  32. }
  33. const files = fs.readdirSync(startPath);
  34. for (let i = 0; i < files.length; i++) {
  35. const filename = path.join(startPath, files[i]);
  36. const stat = fs.lstatSync(filename);
  37. if (stat.isDirectory()) {
  38. forMatchingFiles(filename, filter, callback); // recurse
  39. } else if (filter.test(filename)) {
  40. callback(filename);
  41. }
  42. }
  43. }