project/lib/normalizer.js

  1. const log = require("@ui5/logger").getLogger("normalizer:normalizer");
  2. const projectPreprocessor = require("./projectPreprocessor");
  3. /**
  4. * Generate project and dependency trees via translators.
  5. * Optionally configure all projects with the projectPreprocessor.
  6. *
  7. * @public
  8. * @namespace
  9. * @alias module:@ui5/project.normalizer
  10. */
  11. const Normalizer = {
  12. /**
  13. * Generates a project and dependency tree via translators and configures all projects via the projectPreprocessor
  14. *
  15. * @public
  16. * @param {object} [options]
  17. * @param {string} [options.cwd] Current working directory
  18. * @param {string} [options.configPath] Path to configuration file
  19. * @param {string} [options.translatorName] Translator to use
  20. * @param {object} [options.translatorOptions] Options to pass to translator
  21. * @param {object} [options.frameworkOptions] Options to pass to the framework installer
  22. * @param {string} [options.frameworkOptions.versionOverride] Framework version to use instead of the root projects
  23. * framework
  24. * @returns {Promise<object>} Promise resolving to tree object
  25. */
  26. generateProjectTree: async function(options = {}) {
  27. let tree = await Normalizer.generateDependencyTree(options);
  28. if (options.configPath) {
  29. tree.configPath = options.configPath;
  30. }
  31. tree = await projectPreprocessor.processTree(tree);
  32. if (tree.framework) {
  33. const ui5Framework = require("./translators/ui5Framework");
  34. log.verbose(`Root project ${tree.metadata.name} defines framework ` +
  35. `configuration. Installing UI5 dependencies...`);
  36. let frameworkTree = await ui5Framework.generateDependencyTree(tree, options.frameworkOptions);
  37. if (frameworkTree) {
  38. frameworkTree = await projectPreprocessor.processTree(frameworkTree);
  39. ui5Framework.mergeTrees(tree, frameworkTree);
  40. }
  41. }
  42. return tree;
  43. },
  44. /**
  45. * Generates a project and dependency tree via translators
  46. *
  47. * @public
  48. * @param {object} [options]
  49. * @param {string} [options.cwd=.] Current working directory
  50. * @param {string} [options.translatorName=npm] Translator to use
  51. * @param {object} [options.translatorOptions] Options to pass to translator
  52. * @returns {Promise<object>} Promise resolving to tree object
  53. */
  54. generateDependencyTree: async function({cwd = ".", translatorName="npm", translatorOptions={}} = {}) {
  55. log.verbose("Building dependency tree...");
  56. let translatorParams = [];
  57. let translator = translatorName;
  58. if (translatorName.indexOf(":") !== -1) {
  59. translatorParams = translatorName.split(":");
  60. translator = translatorParams[0];
  61. translatorParams = translatorParams.slice(1);
  62. }
  63. let translatorModule;
  64. switch (translator) {
  65. case "static":
  66. translatorModule = require("./translators/static");
  67. break;
  68. case "npm":
  69. translatorModule = require("./translators/npm");
  70. break;
  71. default:
  72. return Promise.reject(new Error(`Unknown translator ${translator}`));
  73. }
  74. translatorOptions.parameters = translatorParams;
  75. return translatorModule.generateDependencyTree(cwd, translatorOptions);
  76. }
  77. };
  78. module.exports = Normalizer;