build-public-api.js 2.1 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667
  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 apis...');
  8. const SOURCES_DIR = path.join(__dirname, '/../src/lib');
  9. const APP_SOURCE_FILE_PATTERN = /\.ts$/;
  10. const EXCLUDED_PATTERNS = [/(public_api|spec|mock)\.ts$/];
  11. const MODULES = [
  12. 'catalog',
  13. 'core',
  14. 'customer',
  15. 'dashboard',
  16. 'login',
  17. 'marketing',
  18. 'order',
  19. 'settings',
  20. 'system',
  21. 'react',
  22. ];
  23. for (const moduleDir of MODULES) {
  24. const modulePath = path.join(SOURCES_DIR, moduleDir, 'src');
  25. const files = [];
  26. forMatchingFiles(modulePath, APP_SOURCE_FILE_PATTERN, filename => {
  27. const excluded = EXCLUDED_PATTERNS.reduce((result, re) => result || re.test(filename), false);
  28. if (!excluded) {
  29. const relativeFilename =
  30. '.' + filename.replace(modulePath, '').replace(/\\/g, '/').replace(/\.ts$/, '');
  31. files.push(relativeFilename);
  32. }
  33. });
  34. const header = `// This file was generated by the build-public-api.ts script\n`;
  35. const fileContents = header + files.map(f => `export * from '${f}';`).join('\n') + '\n';
  36. const publicApiFile = path.join(modulePath, 'public_api.ts');
  37. fs.writeFileSync(publicApiFile, fileContents, 'utf8');
  38. console.log(`Created ${publicApiFile}`);
  39. }
  40. /**
  41. *
  42. * @param startPath {string}
  43. * @param filter {RegExp}
  44. * @param callback {(filename: string) => void}
  45. */
  46. function forMatchingFiles(startPath, filter, callback) {
  47. if (!fs.existsSync(startPath)) {
  48. console.log('Starting path does not exist ', startPath);
  49. return;
  50. }
  51. const files = fs.readdirSync(startPath);
  52. for (let i = 0; i < files.length; i++) {
  53. const filename = path.join(startPath, files[i]);
  54. const stat = fs.lstatSync(filename);
  55. if (stat.isDirectory()) {
  56. forMatchingFiles(filename, filter, callback); // recurse
  57. } else if (filter.test(filename)) {
  58. callback(filename);
  59. }
  60. }
  61. }