buildModuleUrl.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151
  1. import defined from "./defined.js";
  2. import DeveloperError from "./DeveloperError.js";
  3. import getAbsoluteUri from "./getAbsoluteUri.js";
  4. import Resource from "./Resource.js";
  5. /*global CESIUM_BASE_URL,define,require*/
  6. const cesiumScriptRegex = /((?:.*\/)|^)Cesium\.js(?:\?|\#|$)/;
  7. function getBaseUrlFromCesiumScript() {
  8. const scripts = document.getElementsByTagName("script");
  9. for (let i = 0, len = scripts.length; i < len; ++i) {
  10. const src = scripts[i].getAttribute("src");
  11. const result = cesiumScriptRegex.exec(src);
  12. if (result !== null) {
  13. return result[1];
  14. }
  15. }
  16. return undefined;
  17. }
  18. let a;
  19. function tryMakeAbsolute(url) {
  20. if (typeof document === "undefined") {
  21. //Node.js and Web Workers. In both cases, the URL will already be absolute.
  22. return url;
  23. }
  24. if (!defined(a)) {
  25. a = document.createElement("a");
  26. }
  27. a.href = url;
  28. // IE only absolutizes href on get, not set
  29. // eslint-disable-next-line no-self-assign
  30. a.href = a.href;
  31. return a.href;
  32. }
  33. let baseResource;
  34. function getCesiumBaseUrl() {
  35. if (defined(baseResource)) {
  36. return baseResource;
  37. }
  38. let baseUrlString;
  39. if (typeof CESIUM_BASE_URL !== "undefined") {
  40. baseUrlString = CESIUM_BASE_URL;
  41. } else if (
  42. typeof define === "object" &&
  43. defined(define.amd) &&
  44. !define.amd.toUrlUndefined &&
  45. defined(require.toUrl)
  46. ) {
  47. baseUrlString = getAbsoluteUri(
  48. "..",
  49. buildModuleUrl("Core/buildModuleUrl.js")
  50. );
  51. } else {
  52. baseUrlString = getBaseUrlFromCesiumScript();
  53. }
  54. //>>includeStart('debug', pragmas.debug);
  55. if (!defined(baseUrlString)) {
  56. throw new DeveloperError(
  57. "Unable to determine Cesium base URL automatically, try defining a global variable called CESIUM_BASE_URL."
  58. );
  59. }
  60. //>>includeEnd('debug');
  61. baseResource = new Resource({
  62. url: tryMakeAbsolute(baseUrlString),
  63. });
  64. baseResource.appendForwardSlash();
  65. return baseResource;
  66. }
  67. function buildModuleUrlFromRequireToUrl(moduleID) {
  68. //moduleID will be non-relative, so require it relative to this module, in Core.
  69. return tryMakeAbsolute(require.toUrl(`../${moduleID}`));
  70. }
  71. function buildModuleUrlFromBaseUrl(moduleID) {
  72. const resource = getCesiumBaseUrl().getDerivedResource({
  73. url: moduleID,
  74. });
  75. return resource.url;
  76. }
  77. let implementation;
  78. /**
  79. * Given a relative URL under the Cesium base URL, returns an absolute URL.
  80. * @function
  81. *
  82. * @param {String} relativeUrl The relative path.
  83. * @returns {String} The absolutely URL representation of the provided path.
  84. *
  85. * @example
  86. * const viewer = new Cesium.Viewer("cesiumContainer", {
  87. * imageryProvider: new Cesium.TileMapServiceImageryProvider({
  88. * url: Cesium.buildModuleUrl("Assets/Textures/NaturalEarthII"),
  89. * }),
  90. * baseLayerPicker: false,
  91. * });
  92. */
  93. function buildModuleUrl(relativeUrl) {
  94. if (!defined(implementation)) {
  95. //select implementation
  96. if (
  97. typeof define === "object" &&
  98. defined(define.amd) &&
  99. !define.amd.toUrlUndefined &&
  100. defined(require.toUrl)
  101. ) {
  102. implementation = buildModuleUrlFromRequireToUrl;
  103. } else {
  104. implementation = buildModuleUrlFromBaseUrl;
  105. }
  106. }
  107. const url = implementation(relativeUrl);
  108. return url;
  109. }
  110. // exposed for testing
  111. buildModuleUrl._cesiumScriptRegex = cesiumScriptRegex;
  112. buildModuleUrl._buildModuleUrlFromBaseUrl = buildModuleUrlFromBaseUrl;
  113. buildModuleUrl._clearBaseResource = function () {
  114. baseResource = undefined;
  115. };
  116. /**
  117. * Sets the base URL for resolving modules.
  118. * @param {String} value The new base URL.
  119. */
  120. buildModuleUrl.setBaseUrl = function (value) {
  121. baseResource = Resource.DEFAULT.getDerivedResource({
  122. url: value,
  123. });
  124. };
  125. /**
  126. * Gets the base URL for resolving modules.
  127. *
  128. * @function
  129. * @returns {String} The configured base URL
  130. */
  131. buildModuleUrl.getCesiumBaseUrl = getCesiumBaseUrl;
  132. export default buildModuleUrl;