common.ts 3.0 KB

1234567891011121314151617181920212223242526272829303132333435363738394041424344454647484950515253545556575859606162636465666768697071727374757677787980
  1. import { AdminUiExtension } from '@vendure/common/lib/shared-types';
  2. import * as fs from 'fs-extra';
  3. import * as path from 'path';
  4. const EXTENSIONS_DIR = path.join(__dirname, '../src/app/extensions');
  5. const EXTENSIONS_MODULES_DIR = 'modules';
  6. const originalExtensionsModuleFile = path.join(EXTENSIONS_DIR, 'extensions.module.ts');
  7. const tempExtensionsModuleFile = path.join(EXTENSIONS_DIR, 'extensions.module.ts.temp');
  8. /**
  9. * Returns true if currently being executed from inside the Vendure monorepo.
  10. */
  11. export function isInVendureMonorepo(): boolean {
  12. return fs.existsSync(path.join(__dirname, '../../dev-server'));
  13. }
  14. /**
  15. * Restores the placeholder ExtensionsModule file from a template.
  16. */
  17. export function restoreExtensionsModule() {
  18. fs.copyFileSync(path.join(__dirname, 'extensions.module.ts.template'), originalExtensionsModuleFile);
  19. }
  20. /**
  21. * Deletes the contents of the /modules directory, which contains the plugin
  22. * extension modules copied over during the last compilation.
  23. */
  24. export function deleteExistingExtensionModules() {
  25. fs.removeSync(path.join(EXTENSIONS_DIR, EXTENSIONS_MODULES_DIR));
  26. }
  27. /**
  28. * Copies all files from the ngModulePaths of the configured extensions into the
  29. * admin-ui source tree.
  30. */
  31. export function copyExtensionModules(extensions: Array<Required<AdminUiExtension>>) {
  32. for (const extension of extensions) {
  33. const dirName = path.basename(path.dirname(extension.ngModulePath));
  34. const dest = getModuleOutputDir(extension);
  35. fs.copySync(extension.ngModulePath, dest);
  36. }
  37. }
  38. export function getModuleOutputDir(extension: Required<AdminUiExtension>): string {
  39. return path.join(EXTENSIONS_DIR, EXTENSIONS_MODULES_DIR, extension.id);
  40. }
  41. export function createExtensionsModule(extensions: Array<Required<AdminUiExtension>>) {
  42. const removeTsExtension = (filename: string): string => filename.replace(/\.ts$/, '');
  43. const importPath = (e: Required<AdminUiExtension>): string =>
  44. `./${EXTENSIONS_MODULES_DIR}/${e.id}/${removeTsExtension(e.ngModuleFileName)}`;
  45. fs.renameSync(originalExtensionsModuleFile, tempExtensionsModuleFile);
  46. const source = generateExtensionModuleTsSource(
  47. extensions.map(e => ({ className: e.ngModuleName, path: importPath(e) })),
  48. );
  49. fs.writeFileSync(path.join(EXTENSIONS_DIR, 'extensions.module.ts'), source, 'utf-8');
  50. }
  51. export function restoreOriginalExtensionsModule() {
  52. fs.renameSync(originalExtensionsModuleFile, path.join(EXTENSIONS_DIR, 'extensions.module.ts.generated'));
  53. restoreExtensionsModule();
  54. }
  55. function generateExtensionModuleTsSource(modules: Array<{ className: string; path: string }>): string {
  56. return `/** This file is generated by the build() function. Do not edit. */
  57. import { CommonModule } from '@angular/common';
  58. import { NgModule } from '@angular/core';
  59. ${modules.map(e => `import { ${e.className} } from '${e.path}';`).join('\n')}
  60. @NgModule({
  61. imports: [
  62. CommonModule,
  63. ${modules.map(e => e.className + ',').join('\n')}
  64. ],
  65. })
  66. export class ExtensionsModule {}
  67. `;
  68. }