project/lib/ui5Framework/Openui5Resolver.js

  1. const path = require("path");
  2. const AbstractResolver = require("./AbstractResolver");
  3. const Installer = require("./npm/Installer");
  4. const OPENUI5_CORE_PACKAGE = "@openui5/sap.ui.core";
  5. /**
  6. * Resolver for the OpenUI5 framework
  7. *
  8. * @public
  9. * @memberof module:@ui5/project.ui5Framework
  10. * @augments module:@ui5/project.ui5Framework.AbstractResolver
  11. */
  12. class Openui5Resolver extends AbstractResolver {
  13. /**
  14. * @param {*} options options
  15. * @param {string} options.version OpenUI5 version to use
  16. * @param {string} [options.cwd=process.cwd()] Working directory to resolve configurations like .npmrc
  17. * @param {string} [options.ui5HomeDir="~/.ui5"] UI5 home directory location. This will be used to store packages,
  18. * metadata and configuration used by the resolvers. Relative to `process.cwd()`
  19. */
  20. constructor(options) {
  21. super(options);
  22. this._installer = new Installer({
  23. cwd: this._cwd,
  24. ui5HomeDir: this._ui5HomeDir
  25. });
  26. this._loadLibraryMetadata = {};
  27. }
  28. static _getNpmPackageName(libraryName) {
  29. return "@openui5/" + libraryName;
  30. }
  31. static _getLibaryName(pkgName) {
  32. return pkgName.replace(/^@openui5\//, "");
  33. }
  34. getLibraryMetadata(libraryName) {
  35. if (!this._loadLibraryMetadata[libraryName]) {
  36. this._loadLibraryMetadata[libraryName] = Promise.resolve().then(async () => {
  37. // Trigger manifest request to gather transitive dependencies
  38. const pkgName = Openui5Resolver._getNpmPackageName(libraryName);
  39. const libraryManifest = await this._installer.fetchPackageManifest({pkgName, version: this._version});
  40. let dependencies = [];
  41. if (libraryManifest.dependencies) {
  42. const depNames = Object.keys(libraryManifest.dependencies);
  43. dependencies = depNames.map(Openui5Resolver._getLibaryName);
  44. }
  45. // npm devDependencies are handled as "optionalDependencies"
  46. // in terms of the UI5 framework metadata structure
  47. let optionalDependencies = [];
  48. if (libraryManifest.devDependencies) {
  49. const devDepNames = Object.keys(libraryManifest.devDependencies);
  50. optionalDependencies = devDepNames.map(Openui5Resolver._getLibaryName);
  51. }
  52. return {
  53. id: pkgName,
  54. version: this._version,
  55. dependencies,
  56. optionalDependencies
  57. };
  58. });
  59. }
  60. return this._loadLibraryMetadata[libraryName];
  61. }
  62. async handleLibrary(libraryName) {
  63. const pkgName = Openui5Resolver._getNpmPackageName(libraryName);
  64. return {
  65. // Trigger metadata request
  66. metadata: this.getLibraryMetadata(libraryName),
  67. // Also trigger installation of package
  68. install: this._installer.installPackage({
  69. pkgName,
  70. version: this._version
  71. })
  72. };
  73. }
  74. static async fetchAllVersions({ui5HomeDir, cwd} = {}) {
  75. const installer = new Installer({
  76. cwd: cwd ? path.resolve(cwd) : process.cwd(),
  77. ui5HomeDir:
  78. ui5HomeDir ? path.resolve(ui5HomeDir) :
  79. path.join(require("os").homedir(), ".ui5")
  80. });
  81. return await installer.fetchPackageVersions({pkgName: OPENUI5_CORE_PACKAGE});
  82. }
  83. }
  84. module.exports = Openui5Resolver;