buildModuleUrl.js 3.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152
  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. * baseLayer: Cesium.ImageryLayer.fromProviderAsync(
  88. * Cesium.TileMapServiceImageryProvider.fromUrl(
  89. * Cesium.buildModuleUrl("Assets/Textures/NaturalEarthII"),
  90. * )),
  91. * baseLayerPicker: false,
  92. * });
  93. */
  94. function buildModuleUrl(relativeUrl) {
  95. if (!defined(implementation)) {
  96. //select implementation
  97. if (
  98. typeof define === "object" &&
  99. defined(define.amd) &&
  100. !define.amd.toUrlUndefined &&
  101. defined(require.toUrl)
  102. ) {
  103. implementation = buildModuleUrlFromRequireToUrl;
  104. } else {
  105. implementation = buildModuleUrlFromBaseUrl;
  106. }
  107. }
  108. const url = implementation(relativeUrl);
  109. return url;
  110. }
  111. // exposed for testing
  112. buildModuleUrl._cesiumScriptRegex = cesiumScriptRegex;
  113. buildModuleUrl._buildModuleUrlFromBaseUrl = buildModuleUrlFromBaseUrl;
  114. buildModuleUrl._clearBaseResource = function () {
  115. baseResource = undefined;
  116. };
  117. /**
  118. * Sets the base URL for resolving modules.
  119. * @param {string} value The new base URL.
  120. */
  121. buildModuleUrl.setBaseUrl = function (value) {
  122. baseResource = Resource.DEFAULT.getDerivedResource({
  123. url: value,
  124. });
  125. };
  126. /**
  127. * Gets the base URL for resolving modules.
  128. *
  129. * @function
  130. * @returns {string} The configured base URL
  131. */
  132. buildModuleUrl.getCesiumBaseUrl = getCesiumBaseUrl;
  133. export default buildModuleUrl;