@itwin/core-frontend 5.0.0-dev.79 → 5.0.0-dev.82

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
package/CHANGELOG.md CHANGED
@@ -1,6 +1,20 @@
1
1
  # Change Log - @itwin/core-frontend
2
2
 
3
- This log was last generated on Thu, 06 Mar 2025 14:16:21 GMT and should not be manually modified.
3
+ This log was last generated on Tue, 11 Mar 2025 15:27:53 GMT and should not be manually modified.
4
+
5
+ ## 4.10.10
6
+ Tue, 11 Mar 2025 15:25:11 GMT
7
+
8
+ ### Updates
9
+
10
+ - Resolves CVE-2025-27152
11
+
12
+ ## 4.10.9
13
+ Tue, 11 Mar 2025 05:17:33 GMT
14
+
15
+ ### Updates
16
+
17
+ - Fix issue validating ArcGIS service urls
4
18
 
5
19
  ## 4.10.8
6
20
  Thu, 06 Mar 2025 14:13:37 GMT
@@ -1,7 +1,4 @@
1
1
  import { MapCartoRectangle, MapLayerAccessClient, MapLayerAccessToken, MapLayerAccessTokenParams, MapLayerSource, MapLayerSourceStatus, MapLayerSourceValidation, ValidateSourceArgs } from "../../../tile/internal";
2
- /** @packageDocumentation
3
- * @module Tiles
4
- */
5
2
  /**
6
3
  * Class representing an ArcGIS error code.
7
4
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"ArcGisUtilities.d.ts","sourceRoot":"","sources":["../../../../../src/internal/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,cAAc,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,kBAAkB,EAAC,MAAM,wBAAwB,CAAC;AAIpN;;GAEG;AAEH;;;GAGG;AACH,oBAAY,eAAe;IACzB,kBAAkB,MAAM;IACxB,kBAAkB,MAAM;IACxB,YAAY,MAAM;IAClB,aAAa,MAAM;IACnB,YAAY,OAAO;IACnB,cAAc,OAAO;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,OAAO,EAAE,GAAG,CAAC;IAEb,qEAAqE;IACrE,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;GACG;AACH,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE,kJAAkJ;IAClJ,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;GACG;AACH,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAC,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,MAAM,CAAC,aAAa;WAOR,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;WA4BlD,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA4BxG;;;;;OAKG;WACiB,mBAAmB,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAqD,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAqBvJ;;;;;OAKG;WACW,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,oBAAoB;IAcjF;;;;MAIE;WACkB,cAAc,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAoDrG,mGAAmG;WACrF,oBAAoB,CAAC,QAAQ,EAAE,GAAG;IAQhD,OAAO,CAAC,MAAM,CAAC,aAAa,CAAsD;IAElF;;;;;;;;;;;OAWG;WAEiB,cAAc,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,GAAC,SAAS,CAAC;IAoE5G,mFAAmF;WAC/D,yBAAyB,CAAC,QAAQ,EAAE,QAAQ;WAoB5C,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,GAAC,SAAS,CAAC;IAgB3K;;;;;;;;;;OAUG;WACW,uBAAuB,CAAC,SAAS,GAAE,MAAU,EAAE,OAAO,GAAE,MAAW,EAAE,QAAQ,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAY,EAAE,SAAS,SAAK,GAAG;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE;IAoBrM;;;;;;;OAOG;WACW,mBAAmB,CAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC;CA0B7K"}
1
+ {"version":3,"file":"ArcGisUtilities.d.ts","sourceRoot":"","sources":["../../../../../src/internal/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,cAAc,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,kBAAkB,EAAC,MAAM,wBAAwB,CAAC;AAWpN;;;GAGG;AACH,oBAAY,eAAe;IACzB,kBAAkB,MAAM;IACxB,kBAAkB,MAAM;IACxB,YAAY,MAAM;IAClB,aAAa,MAAM;IACnB,YAAY,OAAO;IACnB,cAAc,OAAO;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,OAAO,EAAE,GAAG,CAAC;IAEb,qEAAqE;IACrE,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;GACG;AACH,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE,kJAAkJ;IAClJ,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;GACG;AACH,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAC,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,MAAM,CAAC,aAAa;WAOR,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;WA4BlD,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA4BxG;;;;;OAKG;WACiB,mBAAmB,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAqD,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAqBvJ;;;;;OAKG;WACW,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,oBAAoB;IAejF;;;;MAIE;WACkB,cAAc,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAoDrG,mGAAmG;WACrF,oBAAoB,CAAC,QAAQ,EAAE,GAAG;IAQhD,OAAO,CAAC,MAAM,CAAC,aAAa,CAAsD;IAElF;;;;;;;;;;;OAWG;WAEiB,cAAc,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,GAAC,SAAS,CAAC;IAoE5G,mFAAmF;WAC/D,yBAAyB,CAAC,QAAQ,EAAE,QAAQ;WAoB5C,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,GAAC,SAAS,CAAC;IAgB3K;;;;;;;;;;OAUG;WACW,uBAAuB,CAAC,SAAS,GAAE,MAAU,EAAE,OAAO,GAAE,MAAW,EAAE,QAAQ,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAY,EAAE,SAAS,SAAK,GAAG;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE;IAoBrM;;;;;;;OAOG;WACW,mBAAmB,CAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC;CA0B7K"}
@@ -12,6 +12,7 @@ const utils_1 = require("../../../request/utils");
12
12
  /** @packageDocumentation
13
13
  * @module Tiles
14
14
  */
15
+ const restServicesSubPath = "/rest/services/";
15
16
  /**
16
17
  * Class representing an ArcGIS error code.
17
18
  * @internal
@@ -118,9 +119,10 @@ class ArcGisUtilities {
118
119
  */
119
120
  static validateUrl(url, serviceType) {
120
121
  const urlObj = new URL(url.toLowerCase());
121
- if (urlObj.pathname.includes("/rest/services/")) {
122
+ const restServicesPos = urlObj.pathname.search(restServicesSubPath);
123
+ if (restServicesPos !== -1) {
122
124
  // This seem to be an ArcGIS URL, lets check the service type
123
- if (urlObj.pathname.endsWith(`${serviceType.toLowerCase()}`)) {
125
+ if (urlObj.pathname.includes(serviceType.toLowerCase(), restServicesPos + restServicesSubPath.length)) {
124
126
  return internal_1.MapLayerSourceStatus.Valid;
125
127
  }
126
128
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"ArcGisUtilities.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { Angle, Constant } from \"@itwin/core-geometry\";\nimport { MapSubLayerProps } from \"@itwin/core-common\";\nimport { MapCartoRectangle, MapLayerAccessClient, MapLayerAccessToken, MapLayerAccessTokenParams, MapLayerSource, MapLayerSourceStatus, MapLayerSourceValidation, ValidateSourceArgs} from \"../../../tile/internal\";\nimport { IModelApp } from \"../../../IModelApp\";\nimport { headersIncludeAuthMethod } from \"../../../request/utils\";\n\n/** @packageDocumentation\n * @module Tiles\n */\n\n/**\n * Class representing an ArcGIS error code.\n * @internal\n */\nexport enum ArcGisErrorCode {\n InvalidCredentials = 401,\n MissingPermissions = 403,\n InvalidToken = 498,\n TokenRequired = 499,\n UnknownError = 1000,\n NoTokenService = 1001,\n}\n\n/**\n * Class representing an ArcGIS service metadata.\n * @internal\n */\nexport interface ArcGISServiceMetadata {\n /** JSON content from the service */\n content: any;\n\n /** Indicates if an access token is required to access the service */\n accessTokenRequired: boolean;\n}\n\n/** Arguments for validating ArcGIS sources * @internal\n */\nexport interface ArcGisValidateSourceArgs extends ValidateSourceArgs {\n /** List of capabilities 'keyword' that needs to be advertised in the service's metadata in order to be valid. For example: 'Map', 'Query', etc*/\n capabilitiesFilter: string[];\n}\n\n/** Arguments for fetching service metadata * @internal\n */\nexport interface ArcGisGetServiceJsonArgs {\n url: string;\n formatId: string;\n userName?: string;\n password?: string;\n queryParams?: {[key: string]: string};\n ignoreCache?: boolean;\n requireToken?: boolean;\n}\n\n/**\n * Class containing utilities relating to ArcGIS services and coordinate systems.\n * @internal\n */\nexport class ArcGisUtilities {\n\n private static getBBoxString(range?: MapCartoRectangle) {\n if (!range)\n range = MapCartoRectangle.createMaximum();\n\n return `${range.low.x * Angle.degreesPerRadian},${range.low.y * Angle.degreesPerRadian},${range.high.x * Angle.degreesPerRadian},${range.high.y * Angle.degreesPerRadian}`;\n }\n\n public static async getNationalMapSources(): Promise<MapLayerSource[]> {\n const sources = new Array<MapLayerSource>();\n const response = await fetch(\"https://viewer.nationalmap.gov/tnmaccess/api/getMapServiceList\", { method: \"GET\" });\n const services = await response.json();\n\n if (!Array.isArray(services))\n return sources;\n\n for (const service of services) {\n if (service.wmsUrl.length === 0) // Exclude Wfs..\n continue;\n switch (service.serviceType) {\n case \"ArcGIS\":\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url: service.serviceLink, formatId: \"ArcGIS\" })!);\n break;\n default: {\n const wmsIndex = service.wmsUrl.lastIndexOf(\"/wms\");\n if (wmsIndex > 0) {\n const url = service.wmsUrl.slice(0, wmsIndex + 4);\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url, formatId: \"WMS\" })!);\n }\n break;\n }\n }\n }\n return sources;\n }\n\n public static async getServiceDirectorySources(url: string, baseUrl?: string): Promise<MapLayerSource[]> {\n if (undefined === baseUrl)\n baseUrl = url;\n let sources = new Array<MapLayerSource>();\n const response = await fetch(`${url}?f=json`, { method: \"GET\" });\n const json = await response.json();\n if (json !== undefined) {\n if (Array.isArray(json.folders)) {\n for (const folder of json.folders) {\n sources = sources.concat(await ArcGisUtilities.getServiceDirectorySources(`${url}/${folder}`, url));\n }\n }\n if (Array.isArray(json.services)) {\n for (const service of json.services) {\n let source;\n if (service.type === \"MapServer\")\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/MapServer`, formatId: \"ArcGIS\" });\n else if (service.type === \"ImageServer\")\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/ImageServer`, formatId: \"ArcGIS\" });\n if (source)\n sources.push(source);\n }\n }\n }\n\n return sources;\n }\n\n /**\n * Get map layer sources from an ArcGIS query.\n * @param range Range for the query.\n * @param url URL for the query.\n * @returns List of map layer sources.\n */\n public static async getSourcesFromQuery(range?: MapCartoRectangle, url = \"https://usgs.maps.arcgis.com/sharing/rest/search\"): Promise<MapLayerSource[]> {\n const sources = new Array<MapLayerSource>();\n for (let start = 1; start > 0;) {\n const response = await fetch(`${url}?f=json&q=(group:9d1199a521334e77a7d15abbc29f8144) AND (type:\"Map Service\")&bbox=${ArcGisUtilities.getBBoxString(range)}&sortOrder=desc&start=${start}&num=100`, { method: \"GET\" });\n const json = await response.json();\n if (!json)\n break;\n\n start = json.nextStart ? json.nextStart : -1;\n if (json !== undefined && Array.isArray(json.results)) {\n for (const result of json.results) {\n const source = MapLayerSource.fromJSON({ name: result.name ? result.name : result.title, url: result.url, formatId: \"ArcGIS\" });\n if (source)\n sources.push(source);\n }\n }\n }\n\n return sources;\n }\n\n /**\n * Parse the URL to check if it represents a valid ArcGIS service\n * @param url URL to validate.\n * @param serviceType Service type to validate (i.e FeatureServer, MapServer)\n * @return Validation Status.\n */\n public static validateUrl(url: string, serviceType: string): MapLayerSourceStatus {\n const urlObj = new URL(url.toLowerCase());\n if (urlObj.pathname.includes(\"/rest/services/\")) {\n // This seem to be an ArcGIS URL, lets check the service type\n if (urlObj.pathname.endsWith(`${serviceType.toLowerCase()}`)) {\n return MapLayerSourceStatus.Valid;\n } else {\n return MapLayerSourceStatus.IncompatibleFormat;\n }\n } else {\n return MapLayerSourceStatus.InvalidUrl;\n }\n }\n\n /**\n * Attempt to access an ArcGIS service, and validate its service metadata.\n * @param source Source to validate.\n * @param opts Validation options\n */\n public static async validateSource(args: ArcGisValidateSourceArgs): Promise<MapLayerSourceValidation> {\n const {source, ignoreCache, capabilitiesFilter} = args;\n const metadata = await this.getServiceJson({url: source.url, formatId: source.formatId, userName: source.userName, password: source.password, queryParams: source.collectQueryParams(), ignoreCache});\n const json = metadata?.content;\n if (json === undefined) {\n return { status: MapLayerSourceStatus.InvalidUrl };\n } else if (json.error !== undefined) {\n\n // If we got a 'Token Required' error, lets check what authentification methods this ESRI service offers\n // and return information needed to initiate the authentification process... the end-user\n // will have to provide his credentials before we can fully validate this source.\n // Note: Some servers will throw a error 403 (You do not have permissions to access this resource or perform this operation),\n // instead of 499 (TokenRequired)\n if (json.error.code === ArcGisErrorCode.TokenRequired || json.error.code === ArcGisErrorCode.MissingPermissions) {\n return (source.userName || source.password) ? {status: MapLayerSourceStatus.InvalidCredentials} : {status: MapLayerSourceStatus.RequireAuth};\n } else if (json.error.code === ArcGisErrorCode.InvalidCredentials)\n return { status: MapLayerSourceStatus.InvalidCredentials};\n }\n\n // Check this service support the expected queries\n let hasCapabilities = false;\n let capsArray: string[] = [];\n if (json.capabilities && typeof json.capabilities === \"string\" ) {\n const capabilities: string = json.capabilities;\n capsArray = capabilities.split(\",\").map((entry) => entry.toLowerCase());\n\n const filtered = capsArray.filter((element, _index, _array) => capabilitiesFilter.includes(element));\n hasCapabilities = (filtered.length === capabilitiesFilter.length);\n }\n if (!hasCapabilities) {\n return { status: MapLayerSourceStatus.InvalidFormat};\n }\n\n // Only EPSG:3857 is supported with pre-rendered tiles.\n if (json.tileInfo && capsArray.includes(\"tilesonly\") && !ArcGisUtilities.isEpsg3857Compatible(json.tileInfo)) {\n return { status: MapLayerSourceStatus.InvalidCoordinateSystem};\n }\n\n let subLayers;\n if (json.layers) {\n\n subLayers = new Array<MapSubLayerProps>();\n\n for (const layer of json.layers) {\n const parent = layer.parentLayerId < 0 ? undefined : layer.parentLayerId;\n const children = Array.isArray(layer.subLayerIds) ? layer.subLayerIds : undefined;\n subLayers.push({ name: layer.name, visible: layer.defaultVisibility !== false, id: layer.id, parent, children });\n }\n }\n return { status: MapLayerSourceStatus.Valid, subLayers };\n }\n\n /** Validate MapService tiling metadata and checks if the tile tree is 'Google Maps' compatible. */\n public static isEpsg3857Compatible(tileInfo: any) {\n if (tileInfo.spatialReference?.latestWkid !== 3857 || !Array.isArray(tileInfo.lods))\n return false;\n\n const zeroLod = tileInfo.lods[0];\n return zeroLod.level === 0 && Math.abs(zeroLod.resolution - 156543.03392800014) < .001;\n }\n\n private static _serviceCache = new Map<string, ArcGISServiceMetadata|undefined>();\n\n /**\n * Fetches an ArcGIS service metadata, and returns its JSON representation.\n * If an access client has been configured for the specified formatId,\n * it will be used to apply required security token.\n * By default, response for each URL are cached.\n * @param url URL of the ArcGIS service\n * @param formatId Format ID of the service\n * @param userName Username to use for legacy token based security\n * @param password Password to use for legacy token based security\n * @param ignoreCache Flag to skip cache lookup (i.e. force a new server request)\n * @param requireToken Flag to indicate if a token is required\n */\n\n public static async getServiceJson(args: ArcGisGetServiceJsonArgs): Promise<ArcGISServiceMetadata|undefined> {\n const {url, formatId, userName, password, queryParams, ignoreCache, requireToken} = args;\n if (!ignoreCache) {\n const cached = ArcGisUtilities._serviceCache.get(url);\n if (cached !== undefined)\n return cached;\n }\n const appendParams = (urlObj: URL, params?: {[key: string]: string}) => {\n if (params) {\n Object.keys(params).forEach((paramKey) => {\n if (!urlObj.searchParams.has(paramKey))\n urlObj.searchParams.append(paramKey, params[paramKey]);\n });\n }\n };\n\n const createUrlObj = () => {\n const tmpUrl = new URL(url);\n tmpUrl.searchParams.append(\"f\", \"json\");\n appendParams(tmpUrl, queryParams);\n return tmpUrl;\n };\n\n let accessTokenRequired = false;\n try {\n let tmpUrl = createUrlObj();\n\n // In some cases, caller might already know token is required, so append it immediately\n if (requireToken) {\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\n if (accessClient) {\n accessTokenRequired = true;\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\n }\n }\n let response = await fetch(tmpUrl, { method: \"GET\" });\n if (response.status === 401 && !requireToken && headersIncludeAuthMethod(response.headers, [\"ntlm\", \"negotiate\"])) {\n // We got a http 401 challenge, lets try again with SSO enabled (i.e. Windows Authentication)\n response = await fetch(tmpUrl, {method: \"GET\", credentials: \"include\" });\n }\n\n // Append security token when corresponding error code is returned by ArcGIS service\n let errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\n if (!accessTokenRequired\n && (errorCode === ArcGisErrorCode.TokenRequired || errorCode === ArcGisErrorCode.MissingPermissions) ) {\n accessTokenRequired = true;\n // If token required\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\n if (accessClient) {\n tmpUrl = createUrlObj();\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\n response = await fetch(tmpUrl.toString(), { method: \"GET\" });\n errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\n }\n }\n\n const json = await response.json();\n const info = {content: json, accessTokenRequired};\n // Cache the response only if it doesn't contain any error.\n ArcGisUtilities._serviceCache.set(url, (errorCode === undefined ? info : undefined));\n return info; // Always return json, even though it contains an error code.\n\n } catch {\n ArcGisUtilities._serviceCache.set(url, undefined);\n return undefined;\n }\n }\n\n /** Read a response from ArcGIS server and check for error code in the response. */\n public static async checkForResponseErrorCode(response: Response) {\n const tmpResponse = response;\n if (response.headers && tmpResponse.headers.get(\"content-type\")?.toLowerCase().includes(\"json\")) {\n\n try {\n // Note:\n // Since response stream can only be read once (i.e. calls to .json() method)\n // we have to clone the response object in order to check for potential error code,\n // but still keep the response stream as unread.\n const clonedResponse = tmpResponse.clone();\n const json = await clonedResponse.json();\n if (json?.error?.code !== undefined)\n return json?.error?.code as number;\n } catch { }\n\n }\n return undefined;\n }\n\n // return the appended access token if available.\n public static async appendSecurityToken(url: URL, accessClient: MapLayerAccessClient, accessTokenParams: MapLayerAccessTokenParams): Promise<MapLayerAccessToken|undefined> {\n\n // Append security token if available\n let accessToken: MapLayerAccessToken|undefined;\n try {\n accessToken = await accessClient.getAccessToken(accessTokenParams);\n } catch {}\n\n if (accessToken?.token) {\n url.searchParams.append(\"token\", accessToken.token);\n return accessToken;\n }\n\n return undefined;\n }\n\n /**\n * Compute scale, resolution values for requested zoom levels (WSG 84)\n * Use a scale of 96 dpi for Google Maps scales\n * Based on this article: https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Resolution_and_Scale\n * @param startZoom Zoom level where scales begins to be computed\n * @param endZoom Zoom level where scales ends to be computed\n * @param latitude Latitude in degrees to use to compute scales (i.e 0 for Equator)\n * @param tileSize Size of a tile in pixels (i.e 256)\n * @param screenDpi Monitor resolution in dots per inch (i.e. typically 96dpi is used by Google Maps)\n * @returns An array containing resolution and scale values for each requested zoom level\n */\n public static computeZoomLevelsScales(startZoom: number = 0, endZoom: number = 20, latitude: number = 0, tileSize: number = 256, screenDpi = 96): {zoom: number, resolution: number, scale: number}[] {\n // Note: There is probably a more direct way to compute this, but I prefer to go for a simple and well documented approach.\n if (startZoom <0 || endZoom < startZoom || tileSize < 0 || screenDpi < 1 || latitude < -90 || latitude > 90)\n return [];\n\n const inchPerMeter = 1 / 0.0254;\n const results: {zoom: number, resolution: number, scale: number}[] = [];\n const equatorLength = Constant.earthRadiusWGS84.equator * 2 * Math.PI;\n const zoom0Resolution = equatorLength / tileSize; // in meters per pixel\n\n const cosLatitude = Math.cos(latitude);\n for (let zoom = startZoom; zoom<= endZoom; zoom++) {\n const resolution = zoom0Resolution * cosLatitude / Math.pow(2, zoom);\n const scale = screenDpi * inchPerMeter * resolution;\n results.push({zoom, resolution, scale});\n }\n\n return results;\n }\n\n /**\n * Match the provided minScale, maxScale values to corresponding wgs84 zoom levels\n * @param defaultMaxLod Value of the last LOD (i.e 22)\n * @param tileSize Size of a tile in pixels (i.e 256)\n * @param minScale Minimum scale value that needs to be matched to a LOD level\n * @param maxScale Maximum scale value that needs to be matched to a LOD level\n * @returns minLod: LOD value matching minScale, maxLod: LOD value matching maxScale\n */\n public static getZoomLevelsScales( defaultMaxLod: number, tileSize: number, minScale?: number, maxScale?: number, tolerance: number = 0): {minLod?: number, maxLod?: number} {\n\n let minLod: number|undefined, maxLod: number|undefined;\n\n const zoomScales = ArcGisUtilities.computeZoomLevelsScales(0, defaultMaxLod, 0 /* latitude 0 = Equator*/, tileSize);\n\n if (zoomScales.length > 0) {\n\n if (minScale) {\n minLod = 0;\n // We are looking for the largest scale value with a scale value smaller than minScale\n for (; minLod < zoomScales.length && (zoomScales[minLod].scale > minScale && Math.abs(zoomScales[minLod].scale - minScale) > tolerance); minLod++)\n ;\n\n }\n\n if (maxScale) {\n maxLod = defaultMaxLod;\n // We are looking for the smallest scale value with a value greater than maxScale\n for (; maxLod >= 0 && zoomScales[maxLod].scale < maxScale && Math.abs(zoomScales[maxLod].scale - maxScale) > tolerance; maxLod--)\n ;\n }\n }\n return {minLod, maxLod};\n }\n\n}\n"]}
1
+ {"version":3,"file":"ArcGisUtilities.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { Angle, Constant } from \"@itwin/core-geometry\";\nimport { MapSubLayerProps } from \"@itwin/core-common\";\nimport { MapCartoRectangle, MapLayerAccessClient, MapLayerAccessToken, MapLayerAccessTokenParams, MapLayerSource, MapLayerSourceStatus, MapLayerSourceValidation, ValidateSourceArgs} from \"../../../tile/internal\";\nimport { IModelApp } from \"../../../IModelApp\";\nimport { headersIncludeAuthMethod } from \"../../../request/utils\";\n\n/** @packageDocumentation\n * @module Tiles\n */\n\n\nconst restServicesSubPath = \"/rest/services/\";\n\n/**\n * Class representing an ArcGIS error code.\n * @internal\n */\nexport enum ArcGisErrorCode {\n InvalidCredentials = 401,\n MissingPermissions = 403,\n InvalidToken = 498,\n TokenRequired = 499,\n UnknownError = 1000,\n NoTokenService = 1001,\n}\n\n/**\n * Class representing an ArcGIS service metadata.\n * @internal\n */\nexport interface ArcGISServiceMetadata {\n /** JSON content from the service */\n content: any;\n\n /** Indicates if an access token is required to access the service */\n accessTokenRequired: boolean;\n}\n\n/** Arguments for validating ArcGIS sources * @internal\n */\nexport interface ArcGisValidateSourceArgs extends ValidateSourceArgs {\n /** List of capabilities 'keyword' that needs to be advertised in the service's metadata in order to be valid. For example: 'Map', 'Query', etc*/\n capabilitiesFilter: string[];\n}\n\n/** Arguments for fetching service metadata * @internal\n */\nexport interface ArcGisGetServiceJsonArgs {\n url: string;\n formatId: string;\n userName?: string;\n password?: string;\n queryParams?: {[key: string]: string};\n ignoreCache?: boolean;\n requireToken?: boolean;\n}\n\n/**\n * Class containing utilities relating to ArcGIS services and coordinate systems.\n * @internal\n */\nexport class ArcGisUtilities {\n\n private static getBBoxString(range?: MapCartoRectangle) {\n if (!range)\n range = MapCartoRectangle.createMaximum();\n\n return `${range.low.x * Angle.degreesPerRadian},${range.low.y * Angle.degreesPerRadian},${range.high.x * Angle.degreesPerRadian},${range.high.y * Angle.degreesPerRadian}`;\n }\n\n public static async getNationalMapSources(): Promise<MapLayerSource[]> {\n const sources = new Array<MapLayerSource>();\n const response = await fetch(\"https://viewer.nationalmap.gov/tnmaccess/api/getMapServiceList\", { method: \"GET\" });\n const services = await response.json();\n\n if (!Array.isArray(services))\n return sources;\n\n for (const service of services) {\n if (service.wmsUrl.length === 0) // Exclude Wfs..\n continue;\n switch (service.serviceType) {\n case \"ArcGIS\":\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url: service.serviceLink, formatId: \"ArcGIS\" })!);\n break;\n default: {\n const wmsIndex = service.wmsUrl.lastIndexOf(\"/wms\");\n if (wmsIndex > 0) {\n const url = service.wmsUrl.slice(0, wmsIndex + 4);\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url, formatId: \"WMS\" })!);\n }\n break;\n }\n }\n }\n return sources;\n }\n\n public static async getServiceDirectorySources(url: string, baseUrl?: string): Promise<MapLayerSource[]> {\n if (undefined === baseUrl)\n baseUrl = url;\n let sources = new Array<MapLayerSource>();\n const response = await fetch(`${url}?f=json`, { method: \"GET\" });\n const json = await response.json();\n if (json !== undefined) {\n if (Array.isArray(json.folders)) {\n for (const folder of json.folders) {\n sources = sources.concat(await ArcGisUtilities.getServiceDirectorySources(`${url}/${folder}`, url));\n }\n }\n if (Array.isArray(json.services)) {\n for (const service of json.services) {\n let source;\n if (service.type === \"MapServer\")\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/MapServer`, formatId: \"ArcGIS\" });\n else if (service.type === \"ImageServer\")\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/ImageServer`, formatId: \"ArcGIS\" });\n if (source)\n sources.push(source);\n }\n }\n }\n\n return sources;\n }\n\n /**\n * Get map layer sources from an ArcGIS query.\n * @param range Range for the query.\n * @param url URL for the query.\n * @returns List of map layer sources.\n */\n public static async getSourcesFromQuery(range?: MapCartoRectangle, url = \"https://usgs.maps.arcgis.com/sharing/rest/search\"): Promise<MapLayerSource[]> {\n const sources = new Array<MapLayerSource>();\n for (let start = 1; start > 0;) {\n const response = await fetch(`${url}?f=json&q=(group:9d1199a521334e77a7d15abbc29f8144) AND (type:\"Map Service\")&bbox=${ArcGisUtilities.getBBoxString(range)}&sortOrder=desc&start=${start}&num=100`, { method: \"GET\" });\n const json = await response.json();\n if (!json)\n break;\n\n start = json.nextStart ? json.nextStart : -1;\n if (json !== undefined && Array.isArray(json.results)) {\n for (const result of json.results) {\n const source = MapLayerSource.fromJSON({ name: result.name ? result.name : result.title, url: result.url, formatId: \"ArcGIS\" });\n if (source)\n sources.push(source);\n }\n }\n }\n\n return sources;\n }\n\n /**\n * Parse the URL to check if it represents a valid ArcGIS service\n * @param url URL to validate.\n * @param serviceType Service type to validate (i.e FeatureServer, MapServer)\n * @return Validation Status.\n */\n public static validateUrl(url: string, serviceType: string): MapLayerSourceStatus {\n const urlObj = new URL(url.toLowerCase());\n const restServicesPos = urlObj.pathname.search(restServicesSubPath);\n if (restServicesPos !== -1) {\n // This seem to be an ArcGIS URL, lets check the service type\n if (urlObj.pathname.includes(serviceType.toLowerCase(), restServicesPos + restServicesSubPath.length)) {\n return MapLayerSourceStatus.Valid;\n } else {\n return MapLayerSourceStatus.IncompatibleFormat;\n }\n } else {\n return MapLayerSourceStatus.InvalidUrl;\n }\n }\n\n /**\n * Attempt to access an ArcGIS service, and validate its service metadata.\n * @param source Source to validate.\n * @param opts Validation options\n */\n public static async validateSource(args: ArcGisValidateSourceArgs): Promise<MapLayerSourceValidation> {\n const {source, ignoreCache, capabilitiesFilter} = args;\n const metadata = await this.getServiceJson({url: source.url, formatId: source.formatId, userName: source.userName, password: source.password, queryParams: source.collectQueryParams(), ignoreCache});\n const json = metadata?.content;\n if (json === undefined) {\n return { status: MapLayerSourceStatus.InvalidUrl };\n } else if (json.error !== undefined) {\n\n // If we got a 'Token Required' error, lets check what authentification methods this ESRI service offers\n // and return information needed to initiate the authentification process... the end-user\n // will have to provide his credentials before we can fully validate this source.\n // Note: Some servers will throw a error 403 (You do not have permissions to access this resource or perform this operation),\n // instead of 499 (TokenRequired)\n if (json.error.code === ArcGisErrorCode.TokenRequired || json.error.code === ArcGisErrorCode.MissingPermissions) {\n return (source.userName || source.password) ? {status: MapLayerSourceStatus.InvalidCredentials} : {status: MapLayerSourceStatus.RequireAuth};\n } else if (json.error.code === ArcGisErrorCode.InvalidCredentials)\n return { status: MapLayerSourceStatus.InvalidCredentials};\n }\n\n // Check this service support the expected queries\n let hasCapabilities = false;\n let capsArray: string[] = [];\n if (json.capabilities && typeof json.capabilities === \"string\" ) {\n const capabilities: string = json.capabilities;\n capsArray = capabilities.split(\",\").map((entry) => entry.toLowerCase());\n\n const filtered = capsArray.filter((element, _index, _array) => capabilitiesFilter.includes(element));\n hasCapabilities = (filtered.length === capabilitiesFilter.length);\n }\n if (!hasCapabilities) {\n return { status: MapLayerSourceStatus.InvalidFormat};\n }\n\n // Only EPSG:3857 is supported with pre-rendered tiles.\n if (json.tileInfo && capsArray.includes(\"tilesonly\") && !ArcGisUtilities.isEpsg3857Compatible(json.tileInfo)) {\n return { status: MapLayerSourceStatus.InvalidCoordinateSystem};\n }\n\n let subLayers;\n if (json.layers) {\n\n subLayers = new Array<MapSubLayerProps>();\n\n for (const layer of json.layers) {\n const parent = layer.parentLayerId < 0 ? undefined : layer.parentLayerId;\n const children = Array.isArray(layer.subLayerIds) ? layer.subLayerIds : undefined;\n subLayers.push({ name: layer.name, visible: layer.defaultVisibility !== false, id: layer.id, parent, children });\n }\n }\n return { status: MapLayerSourceStatus.Valid, subLayers };\n }\n\n /** Validate MapService tiling metadata and checks if the tile tree is 'Google Maps' compatible. */\n public static isEpsg3857Compatible(tileInfo: any) {\n if (tileInfo.spatialReference?.latestWkid !== 3857 || !Array.isArray(tileInfo.lods))\n return false;\n\n const zeroLod = tileInfo.lods[0];\n return zeroLod.level === 0 && Math.abs(zeroLod.resolution - 156543.03392800014) < .001;\n }\n\n private static _serviceCache = new Map<string, ArcGISServiceMetadata|undefined>();\n\n /**\n * Fetches an ArcGIS service metadata, and returns its JSON representation.\n * If an access client has been configured for the specified formatId,\n * it will be used to apply required security token.\n * By default, response for each URL are cached.\n * @param url URL of the ArcGIS service\n * @param formatId Format ID of the service\n * @param userName Username to use for legacy token based security\n * @param password Password to use for legacy token based security\n * @param ignoreCache Flag to skip cache lookup (i.e. force a new server request)\n * @param requireToken Flag to indicate if a token is required\n */\n\n public static async getServiceJson(args: ArcGisGetServiceJsonArgs): Promise<ArcGISServiceMetadata|undefined> {\n const {url, formatId, userName, password, queryParams, ignoreCache, requireToken} = args;\n if (!ignoreCache) {\n const cached = ArcGisUtilities._serviceCache.get(url);\n if (cached !== undefined)\n return cached;\n }\n const appendParams = (urlObj: URL, params?: {[key: string]: string}) => {\n if (params) {\n Object.keys(params).forEach((paramKey) => {\n if (!urlObj.searchParams.has(paramKey))\n urlObj.searchParams.append(paramKey, params[paramKey]);\n });\n }\n };\n\n const createUrlObj = () => {\n const tmpUrl = new URL(url);\n tmpUrl.searchParams.append(\"f\", \"json\");\n appendParams(tmpUrl, queryParams);\n return tmpUrl;\n };\n\n let accessTokenRequired = false;\n try {\n let tmpUrl = createUrlObj();\n\n // In some cases, caller might already know token is required, so append it immediately\n if (requireToken) {\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\n if (accessClient) {\n accessTokenRequired = true;\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\n }\n }\n let response = await fetch(tmpUrl, { method: \"GET\" });\n if (response.status === 401 && !requireToken && headersIncludeAuthMethod(response.headers, [\"ntlm\", \"negotiate\"])) {\n // We got a http 401 challenge, lets try again with SSO enabled (i.e. Windows Authentication)\n response = await fetch(tmpUrl, {method: \"GET\", credentials: \"include\" });\n }\n\n // Append security token when corresponding error code is returned by ArcGIS service\n let errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\n if (!accessTokenRequired\n && (errorCode === ArcGisErrorCode.TokenRequired || errorCode === ArcGisErrorCode.MissingPermissions) ) {\n accessTokenRequired = true;\n // If token required\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\n if (accessClient) {\n tmpUrl = createUrlObj();\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\n response = await fetch(tmpUrl.toString(), { method: \"GET\" });\n errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\n }\n }\n\n const json = await response.json();\n const info = {content: json, accessTokenRequired};\n // Cache the response only if it doesn't contain any error.\n ArcGisUtilities._serviceCache.set(url, (errorCode === undefined ? info : undefined));\n return info; // Always return json, even though it contains an error code.\n\n } catch {\n ArcGisUtilities._serviceCache.set(url, undefined);\n return undefined;\n }\n }\n\n /** Read a response from ArcGIS server and check for error code in the response. */\n public static async checkForResponseErrorCode(response: Response) {\n const tmpResponse = response;\n if (response.headers && tmpResponse.headers.get(\"content-type\")?.toLowerCase().includes(\"json\")) {\n\n try {\n // Note:\n // Since response stream can only be read once (i.e. calls to .json() method)\n // we have to clone the response object in order to check for potential error code,\n // but still keep the response stream as unread.\n const clonedResponse = tmpResponse.clone();\n const json = await clonedResponse.json();\n if (json?.error?.code !== undefined)\n return json?.error?.code as number;\n } catch { }\n\n }\n return undefined;\n }\n\n // return the appended access token if available.\n public static async appendSecurityToken(url: URL, accessClient: MapLayerAccessClient, accessTokenParams: MapLayerAccessTokenParams): Promise<MapLayerAccessToken|undefined> {\n\n // Append security token if available\n let accessToken: MapLayerAccessToken|undefined;\n try {\n accessToken = await accessClient.getAccessToken(accessTokenParams);\n } catch {}\n\n if (accessToken?.token) {\n url.searchParams.append(\"token\", accessToken.token);\n return accessToken;\n }\n\n return undefined;\n }\n\n /**\n * Compute scale, resolution values for requested zoom levels (WSG 84)\n * Use a scale of 96 dpi for Google Maps scales\n * Based on this article: https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Resolution_and_Scale\n * @param startZoom Zoom level where scales begins to be computed\n * @param endZoom Zoom level where scales ends to be computed\n * @param latitude Latitude in degrees to use to compute scales (i.e 0 for Equator)\n * @param tileSize Size of a tile in pixels (i.e 256)\n * @param screenDpi Monitor resolution in dots per inch (i.e. typically 96dpi is used by Google Maps)\n * @returns An array containing resolution and scale values for each requested zoom level\n */\n public static computeZoomLevelsScales(startZoom: number = 0, endZoom: number = 20, latitude: number = 0, tileSize: number = 256, screenDpi = 96): {zoom: number, resolution: number, scale: number}[] {\n // Note: There is probably a more direct way to compute this, but I prefer to go for a simple and well documented approach.\n if (startZoom <0 || endZoom < startZoom || tileSize < 0 || screenDpi < 1 || latitude < -90 || latitude > 90)\n return [];\n\n const inchPerMeter = 1 / 0.0254;\n const results: {zoom: number, resolution: number, scale: number}[] = [];\n const equatorLength = Constant.earthRadiusWGS84.equator * 2 * Math.PI;\n const zoom0Resolution = equatorLength / tileSize; // in meters per pixel\n\n const cosLatitude = Math.cos(latitude);\n for (let zoom = startZoom; zoom<= endZoom; zoom++) {\n const resolution = zoom0Resolution * cosLatitude / Math.pow(2, zoom);\n const scale = screenDpi * inchPerMeter * resolution;\n results.push({zoom, resolution, scale});\n }\n\n return results;\n }\n\n /**\n * Match the provided minScale, maxScale values to corresponding wgs84 zoom levels\n * @param defaultMaxLod Value of the last LOD (i.e 22)\n * @param tileSize Size of a tile in pixels (i.e 256)\n * @param minScale Minimum scale value that needs to be matched to a LOD level\n * @param maxScale Maximum scale value that needs to be matched to a LOD level\n * @returns minLod: LOD value matching minScale, maxLod: LOD value matching maxScale\n */\n public static getZoomLevelsScales( defaultMaxLod: number, tileSize: number, minScale?: number, maxScale?: number, tolerance: number = 0): {minLod?: number, maxLod?: number} {\n\n let minLod: number|undefined, maxLod: number|undefined;\n\n const zoomScales = ArcGisUtilities.computeZoomLevelsScales(0, defaultMaxLod, 0 /* latitude 0 = Equator*/, tileSize);\n\n if (zoomScales.length > 0) {\n\n if (minScale) {\n minLod = 0;\n // We are looking for the largest scale value with a scale value smaller than minScale\n for (; minLod < zoomScales.length && (zoomScales[minLod].scale > minScale && Math.abs(zoomScales[minLod].scale - minScale) > tolerance); minLod++)\n ;\n\n }\n\n if (maxScale) {\n maxLod = defaultMaxLod;\n // We are looking for the smallest scale value with a value greater than maxScale\n for (; maxLod >= 0 && zoomScales[maxLod].scale < maxScale && Math.abs(zoomScales[maxLod].scale - maxScale) > tolerance; maxLod--)\n ;\n }\n }\n return {minLod, maxLod};\n }\n\n}\n"]}
@@ -1,7 +1,4 @@
1
1
  import { MapCartoRectangle, MapLayerAccessClient, MapLayerAccessToken, MapLayerAccessTokenParams, MapLayerSource, MapLayerSourceStatus, MapLayerSourceValidation, ValidateSourceArgs } from "../../../tile/internal";
2
- /** @packageDocumentation
3
- * @module Tiles
4
- */
5
2
  /**
6
3
  * Class representing an ArcGIS error code.
7
4
  * @internal
@@ -1 +1 @@
1
- {"version":3,"file":"ArcGisUtilities.d.ts","sourceRoot":"","sources":["../../../../../src/internal/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,cAAc,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,kBAAkB,EAAC,MAAM,wBAAwB,CAAC;AAIpN;;GAEG;AAEH;;;GAGG;AACH,oBAAY,eAAe;IACzB,kBAAkB,MAAM;IACxB,kBAAkB,MAAM;IACxB,YAAY,MAAM;IAClB,aAAa,MAAM;IACnB,YAAY,OAAO;IACnB,cAAc,OAAO;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,OAAO,EAAE,GAAG,CAAC;IAEb,qEAAqE;IACrE,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;GACG;AACH,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE,kJAAkJ;IAClJ,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;GACG;AACH,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAC,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,MAAM,CAAC,aAAa;WAOR,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;WA4BlD,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA4BxG;;;;;OAKG;WACiB,mBAAmB,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAqD,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAqBvJ;;;;;OAKG;WACW,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,oBAAoB;IAcjF;;;;MAIE;WACkB,cAAc,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAoDrG,mGAAmG;WACrF,oBAAoB,CAAC,QAAQ,EAAE,GAAG;IAQhD,OAAO,CAAC,MAAM,CAAC,aAAa,CAAsD;IAElF;;;;;;;;;;;OAWG;WAEiB,cAAc,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,GAAC,SAAS,CAAC;IAoE5G,mFAAmF;WAC/D,yBAAyB,CAAC,QAAQ,EAAE,QAAQ;WAoB5C,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,GAAC,SAAS,CAAC;IAgB3K;;;;;;;;;;OAUG;WACW,uBAAuB,CAAC,SAAS,GAAE,MAAU,EAAE,OAAO,GAAE,MAAW,EAAE,QAAQ,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAY,EAAE,SAAS,SAAK,GAAG;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE;IAoBrM;;;;;;;OAOG;WACW,mBAAmB,CAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC;CA0B7K"}
1
+ {"version":3,"file":"ArcGisUtilities.d.ts","sourceRoot":"","sources":["../../../../../src/internal/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"AAMA,OAAO,EAAE,iBAAiB,EAAE,oBAAoB,EAAE,mBAAmB,EAAE,yBAAyB,EAAE,cAAc,EAAE,oBAAoB,EAAE,wBAAwB,EAAE,kBAAkB,EAAC,MAAM,wBAAwB,CAAC;AAWpN;;;GAGG;AACH,oBAAY,eAAe;IACzB,kBAAkB,MAAM;IACxB,kBAAkB,MAAM;IACxB,YAAY,MAAM;IAClB,aAAa,MAAM;IACnB,YAAY,OAAO;IACnB,cAAc,OAAO;CACtB;AAED;;;GAGG;AACH,MAAM,WAAW,qBAAqB;IACpC,oCAAoC;IACpC,OAAO,EAAE,GAAG,CAAC;IAEb,qEAAqE;IACrE,mBAAmB,EAAE,OAAO,CAAC;CAC9B;AAED;GACG;AACH,MAAM,WAAW,wBAAyB,SAAQ,kBAAkB;IAClE,kJAAkJ;IAClJ,kBAAkB,EAAE,MAAM,EAAE,CAAC;CAC9B;AAED;GACG;AACH,MAAM,WAAW,wBAAwB;IACvC,GAAG,EAAE,MAAM,CAAC;IACZ,QAAQ,EAAE,MAAM,CAAC;IACjB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,QAAQ,CAAC,EAAE,MAAM,CAAC;IAClB,WAAW,CAAC,EAAE;QAAC,CAAC,GAAG,EAAE,MAAM,GAAG,MAAM,CAAA;KAAC,CAAC;IACtC,WAAW,CAAC,EAAE,OAAO,CAAC;IACtB,YAAY,CAAC,EAAE,OAAO,CAAC;CACxB;AAED;;;GAGG;AACH,qBAAa,eAAe;IAE1B,OAAO,CAAC,MAAM,CAAC,aAAa;WAOR,qBAAqB,IAAI,OAAO,CAAC,cAAc,EAAE,CAAC;WA4BlD,0BAA0B,CAAC,GAAG,EAAE,MAAM,EAAE,OAAO,CAAC,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IA4BxG;;;;;OAKG;WACiB,mBAAmB,CAAC,KAAK,CAAC,EAAE,iBAAiB,EAAE,GAAG,SAAqD,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC;IAqBvJ;;;;;OAKG;WACW,WAAW,CAAC,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,oBAAoB;IAejF;;;;MAIE;WACkB,cAAc,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,wBAAwB,CAAC;IAoDrG,mGAAmG;WACrF,oBAAoB,CAAC,QAAQ,EAAE,GAAG;IAQhD,OAAO,CAAC,MAAM,CAAC,aAAa,CAAsD;IAElF;;;;;;;;;;;OAWG;WAEiB,cAAc,CAAC,IAAI,EAAE,wBAAwB,GAAG,OAAO,CAAC,qBAAqB,GAAC,SAAS,CAAC;IAoE5G,mFAAmF;WAC/D,yBAAyB,CAAC,QAAQ,EAAE,QAAQ;WAoB5C,mBAAmB,CAAC,GAAG,EAAE,GAAG,EAAE,YAAY,EAAE,oBAAoB,EAAE,iBAAiB,EAAE,yBAAyB,GAAG,OAAO,CAAC,mBAAmB,GAAC,SAAS,CAAC;IAgB3K;;;;;;;;;;OAUG;WACW,uBAAuB,CAAC,SAAS,GAAE,MAAU,EAAE,OAAO,GAAE,MAAW,EAAE,QAAQ,GAAE,MAAU,EAAE,QAAQ,GAAE,MAAY,EAAE,SAAS,SAAK,GAAG;QAAC,IAAI,EAAE,MAAM,CAAC;QAAC,UAAU,EAAE,MAAM,CAAC;QAAC,KAAK,EAAE,MAAM,CAAA;KAAC,EAAE;IAoBrM;;;;;;;OAOG;WACW,mBAAmB,CAAE,aAAa,EAAE,MAAM,EAAE,QAAQ,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,QAAQ,CAAC,EAAE,MAAM,EAAE,SAAS,GAAE,MAAU,GAAG;QAAC,MAAM,CAAC,EAAE,MAAM,CAAC;QAAC,MAAM,CAAC,EAAE,MAAM,CAAA;KAAC;CA0B7K"}
@@ -9,6 +9,7 @@ import { headersIncludeAuthMethod } from "../../../request/utils";
9
9
  /** @packageDocumentation
10
10
  * @module Tiles
11
11
  */
12
+ const restServicesSubPath = "/rest/services/";
12
13
  /**
13
14
  * Class representing an ArcGIS error code.
14
15
  * @internal
@@ -115,9 +116,10 @@ export class ArcGisUtilities {
115
116
  */
116
117
  static validateUrl(url, serviceType) {
117
118
  const urlObj = new URL(url.toLowerCase());
118
- if (urlObj.pathname.includes("/rest/services/")) {
119
+ const restServicesPos = urlObj.pathname.search(restServicesSubPath);
120
+ if (restServicesPos !== -1) {
119
121
  // This seem to be an ArcGIS URL, lets check the service type
120
- if (urlObj.pathname.endsWith(`${serviceType.toLowerCase()}`)) {
122
+ if (urlObj.pathname.includes(serviceType.toLowerCase(), restServicesPos + restServicesSubPath.length)) {
121
123
  return MapLayerSourceStatus.Valid;
122
124
  }
123
125
  else {
@@ -1 +1 @@
1
- {"version":3,"file":"ArcGisUtilities.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { Angle, Constant } from \"@itwin/core-geometry\";\nimport { MapSubLayerProps } from \"@itwin/core-common\";\nimport { MapCartoRectangle, MapLayerAccessClient, MapLayerAccessToken, MapLayerAccessTokenParams, MapLayerSource, MapLayerSourceStatus, MapLayerSourceValidation, ValidateSourceArgs} from \"../../../tile/internal\";\nimport { IModelApp } from \"../../../IModelApp\";\nimport { headersIncludeAuthMethod } from \"../../../request/utils\";\n\n/** @packageDocumentation\n * @module Tiles\n */\n\n/**\n * Class representing an ArcGIS error code.\n * @internal\n */\nexport enum ArcGisErrorCode {\n InvalidCredentials = 401,\n MissingPermissions = 403,\n InvalidToken = 498,\n TokenRequired = 499,\n UnknownError = 1000,\n NoTokenService = 1001,\n}\n\n/**\n * Class representing an ArcGIS service metadata.\n * @internal\n */\nexport interface ArcGISServiceMetadata {\n /** JSON content from the service */\n content: any;\n\n /** Indicates if an access token is required to access the service */\n accessTokenRequired: boolean;\n}\n\n/** Arguments for validating ArcGIS sources * @internal\n */\nexport interface ArcGisValidateSourceArgs extends ValidateSourceArgs {\n /** List of capabilities 'keyword' that needs to be advertised in the service's metadata in order to be valid. For example: 'Map', 'Query', etc*/\n capabilitiesFilter: string[];\n}\n\n/** Arguments for fetching service metadata * @internal\n */\nexport interface ArcGisGetServiceJsonArgs {\n url: string;\n formatId: string;\n userName?: string;\n password?: string;\n queryParams?: {[key: string]: string};\n ignoreCache?: boolean;\n requireToken?: boolean;\n}\n\n/**\n * Class containing utilities relating to ArcGIS services and coordinate systems.\n * @internal\n */\nexport class ArcGisUtilities {\n\n private static getBBoxString(range?: MapCartoRectangle) {\n if (!range)\n range = MapCartoRectangle.createMaximum();\n\n return `${range.low.x * Angle.degreesPerRadian},${range.low.y * Angle.degreesPerRadian},${range.high.x * Angle.degreesPerRadian},${range.high.y * Angle.degreesPerRadian}`;\n }\n\n public static async getNationalMapSources(): Promise<MapLayerSource[]> {\n const sources = new Array<MapLayerSource>();\n const response = await fetch(\"https://viewer.nationalmap.gov/tnmaccess/api/getMapServiceList\", { method: \"GET\" });\n const services = await response.json();\n\n if (!Array.isArray(services))\n return sources;\n\n for (const service of services) {\n if (service.wmsUrl.length === 0) // Exclude Wfs..\n continue;\n switch (service.serviceType) {\n case \"ArcGIS\":\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url: service.serviceLink, formatId: \"ArcGIS\" })!);\n break;\n default: {\n const wmsIndex = service.wmsUrl.lastIndexOf(\"/wms\");\n if (wmsIndex > 0) {\n const url = service.wmsUrl.slice(0, wmsIndex + 4);\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url, formatId: \"WMS\" })!);\n }\n break;\n }\n }\n }\n return sources;\n }\n\n public static async getServiceDirectorySources(url: string, baseUrl?: string): Promise<MapLayerSource[]> {\n if (undefined === baseUrl)\n baseUrl = url;\n let sources = new Array<MapLayerSource>();\n const response = await fetch(`${url}?f=json`, { method: \"GET\" });\n const json = await response.json();\n if (json !== undefined) {\n if (Array.isArray(json.folders)) {\n for (const folder of json.folders) {\n sources = sources.concat(await ArcGisUtilities.getServiceDirectorySources(`${url}/${folder}`, url));\n }\n }\n if (Array.isArray(json.services)) {\n for (const service of json.services) {\n let source;\n if (service.type === \"MapServer\")\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/MapServer`, formatId: \"ArcGIS\" });\n else if (service.type === \"ImageServer\")\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/ImageServer`, formatId: \"ArcGIS\" });\n if (source)\n sources.push(source);\n }\n }\n }\n\n return sources;\n }\n\n /**\n * Get map layer sources from an ArcGIS query.\n * @param range Range for the query.\n * @param url URL for the query.\n * @returns List of map layer sources.\n */\n public static async getSourcesFromQuery(range?: MapCartoRectangle, url = \"https://usgs.maps.arcgis.com/sharing/rest/search\"): Promise<MapLayerSource[]> {\n const sources = new Array<MapLayerSource>();\n for (let start = 1; start > 0;) {\n const response = await fetch(`${url}?f=json&q=(group:9d1199a521334e77a7d15abbc29f8144) AND (type:\"Map Service\")&bbox=${ArcGisUtilities.getBBoxString(range)}&sortOrder=desc&start=${start}&num=100`, { method: \"GET\" });\n const json = await response.json();\n if (!json)\n break;\n\n start = json.nextStart ? json.nextStart : -1;\n if (json !== undefined && Array.isArray(json.results)) {\n for (const result of json.results) {\n const source = MapLayerSource.fromJSON({ name: result.name ? result.name : result.title, url: result.url, formatId: \"ArcGIS\" });\n if (source)\n sources.push(source);\n }\n }\n }\n\n return sources;\n }\n\n /**\n * Parse the URL to check if it represents a valid ArcGIS service\n * @param url URL to validate.\n * @param serviceType Service type to validate (i.e FeatureServer, MapServer)\n * @return Validation Status.\n */\n public static validateUrl(url: string, serviceType: string): MapLayerSourceStatus {\n const urlObj = new URL(url.toLowerCase());\n if (urlObj.pathname.includes(\"/rest/services/\")) {\n // This seem to be an ArcGIS URL, lets check the service type\n if (urlObj.pathname.endsWith(`${serviceType.toLowerCase()}`)) {\n return MapLayerSourceStatus.Valid;\n } else {\n return MapLayerSourceStatus.IncompatibleFormat;\n }\n } else {\n return MapLayerSourceStatus.InvalidUrl;\n }\n }\n\n /**\n * Attempt to access an ArcGIS service, and validate its service metadata.\n * @param source Source to validate.\n * @param opts Validation options\n */\n public static async validateSource(args: ArcGisValidateSourceArgs): Promise<MapLayerSourceValidation> {\n const {source, ignoreCache, capabilitiesFilter} = args;\n const metadata = await this.getServiceJson({url: source.url, formatId: source.formatId, userName: source.userName, password: source.password, queryParams: source.collectQueryParams(), ignoreCache});\n const json = metadata?.content;\n if (json === undefined) {\n return { status: MapLayerSourceStatus.InvalidUrl };\n } else if (json.error !== undefined) {\n\n // If we got a 'Token Required' error, lets check what authentification methods this ESRI service offers\n // and return information needed to initiate the authentification process... the end-user\n // will have to provide his credentials before we can fully validate this source.\n // Note: Some servers will throw a error 403 (You do not have permissions to access this resource or perform this operation),\n // instead of 499 (TokenRequired)\n if (json.error.code === ArcGisErrorCode.TokenRequired || json.error.code === ArcGisErrorCode.MissingPermissions) {\n return (source.userName || source.password) ? {status: MapLayerSourceStatus.InvalidCredentials} : {status: MapLayerSourceStatus.RequireAuth};\n } else if (json.error.code === ArcGisErrorCode.InvalidCredentials)\n return { status: MapLayerSourceStatus.InvalidCredentials};\n }\n\n // Check this service support the expected queries\n let hasCapabilities = false;\n let capsArray: string[] = [];\n if (json.capabilities && typeof json.capabilities === \"string\" ) {\n const capabilities: string = json.capabilities;\n capsArray = capabilities.split(\",\").map((entry) => entry.toLowerCase());\n\n const filtered = capsArray.filter((element, _index, _array) => capabilitiesFilter.includes(element));\n hasCapabilities = (filtered.length === capabilitiesFilter.length);\n }\n if (!hasCapabilities) {\n return { status: MapLayerSourceStatus.InvalidFormat};\n }\n\n // Only EPSG:3857 is supported with pre-rendered tiles.\n if (json.tileInfo && capsArray.includes(\"tilesonly\") && !ArcGisUtilities.isEpsg3857Compatible(json.tileInfo)) {\n return { status: MapLayerSourceStatus.InvalidCoordinateSystem};\n }\n\n let subLayers;\n if (json.layers) {\n\n subLayers = new Array<MapSubLayerProps>();\n\n for (const layer of json.layers) {\n const parent = layer.parentLayerId < 0 ? undefined : layer.parentLayerId;\n const children = Array.isArray(layer.subLayerIds) ? layer.subLayerIds : undefined;\n subLayers.push({ name: layer.name, visible: layer.defaultVisibility !== false, id: layer.id, parent, children });\n }\n }\n return { status: MapLayerSourceStatus.Valid, subLayers };\n }\n\n /** Validate MapService tiling metadata and checks if the tile tree is 'Google Maps' compatible. */\n public static isEpsg3857Compatible(tileInfo: any) {\n if (tileInfo.spatialReference?.latestWkid !== 3857 || !Array.isArray(tileInfo.lods))\n return false;\n\n const zeroLod = tileInfo.lods[0];\n return zeroLod.level === 0 && Math.abs(zeroLod.resolution - 156543.03392800014) < .001;\n }\n\n private static _serviceCache = new Map<string, ArcGISServiceMetadata|undefined>();\n\n /**\n * Fetches an ArcGIS service metadata, and returns its JSON representation.\n * If an access client has been configured for the specified formatId,\n * it will be used to apply required security token.\n * By default, response for each URL are cached.\n * @param url URL of the ArcGIS service\n * @param formatId Format ID of the service\n * @param userName Username to use for legacy token based security\n * @param password Password to use for legacy token based security\n * @param ignoreCache Flag to skip cache lookup (i.e. force a new server request)\n * @param requireToken Flag to indicate if a token is required\n */\n\n public static async getServiceJson(args: ArcGisGetServiceJsonArgs): Promise<ArcGISServiceMetadata|undefined> {\n const {url, formatId, userName, password, queryParams, ignoreCache, requireToken} = args;\n if (!ignoreCache) {\n const cached = ArcGisUtilities._serviceCache.get(url);\n if (cached !== undefined)\n return cached;\n }\n const appendParams = (urlObj: URL, params?: {[key: string]: string}) => {\n if (params) {\n Object.keys(params).forEach((paramKey) => {\n if (!urlObj.searchParams.has(paramKey))\n urlObj.searchParams.append(paramKey, params[paramKey]);\n });\n }\n };\n\n const createUrlObj = () => {\n const tmpUrl = new URL(url);\n tmpUrl.searchParams.append(\"f\", \"json\");\n appendParams(tmpUrl, queryParams);\n return tmpUrl;\n };\n\n let accessTokenRequired = false;\n try {\n let tmpUrl = createUrlObj();\n\n // In some cases, caller might already know token is required, so append it immediately\n if (requireToken) {\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\n if (accessClient) {\n accessTokenRequired = true;\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\n }\n }\n let response = await fetch(tmpUrl, { method: \"GET\" });\n if (response.status === 401 && !requireToken && headersIncludeAuthMethod(response.headers, [\"ntlm\", \"negotiate\"])) {\n // We got a http 401 challenge, lets try again with SSO enabled (i.e. Windows Authentication)\n response = await fetch(tmpUrl, {method: \"GET\", credentials: \"include\" });\n }\n\n // Append security token when corresponding error code is returned by ArcGIS service\n let errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\n if (!accessTokenRequired\n && (errorCode === ArcGisErrorCode.TokenRequired || errorCode === ArcGisErrorCode.MissingPermissions) ) {\n accessTokenRequired = true;\n // If token required\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\n if (accessClient) {\n tmpUrl = createUrlObj();\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\n response = await fetch(tmpUrl.toString(), { method: \"GET\" });\n errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\n }\n }\n\n const json = await response.json();\n const info = {content: json, accessTokenRequired};\n // Cache the response only if it doesn't contain any error.\n ArcGisUtilities._serviceCache.set(url, (errorCode === undefined ? info : undefined));\n return info; // Always return json, even though it contains an error code.\n\n } catch {\n ArcGisUtilities._serviceCache.set(url, undefined);\n return undefined;\n }\n }\n\n /** Read a response from ArcGIS server and check for error code in the response. */\n public static async checkForResponseErrorCode(response: Response) {\n const tmpResponse = response;\n if (response.headers && tmpResponse.headers.get(\"content-type\")?.toLowerCase().includes(\"json\")) {\n\n try {\n // Note:\n // Since response stream can only be read once (i.e. calls to .json() method)\n // we have to clone the response object in order to check for potential error code,\n // but still keep the response stream as unread.\n const clonedResponse = tmpResponse.clone();\n const json = await clonedResponse.json();\n if (json?.error?.code !== undefined)\n return json?.error?.code as number;\n } catch { }\n\n }\n return undefined;\n }\n\n // return the appended access token if available.\n public static async appendSecurityToken(url: URL, accessClient: MapLayerAccessClient, accessTokenParams: MapLayerAccessTokenParams): Promise<MapLayerAccessToken|undefined> {\n\n // Append security token if available\n let accessToken: MapLayerAccessToken|undefined;\n try {\n accessToken = await accessClient.getAccessToken(accessTokenParams);\n } catch {}\n\n if (accessToken?.token) {\n url.searchParams.append(\"token\", accessToken.token);\n return accessToken;\n }\n\n return undefined;\n }\n\n /**\n * Compute scale, resolution values for requested zoom levels (WSG 84)\n * Use a scale of 96 dpi for Google Maps scales\n * Based on this article: https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Resolution_and_Scale\n * @param startZoom Zoom level where scales begins to be computed\n * @param endZoom Zoom level where scales ends to be computed\n * @param latitude Latitude in degrees to use to compute scales (i.e 0 for Equator)\n * @param tileSize Size of a tile in pixels (i.e 256)\n * @param screenDpi Monitor resolution in dots per inch (i.e. typically 96dpi is used by Google Maps)\n * @returns An array containing resolution and scale values for each requested zoom level\n */\n public static computeZoomLevelsScales(startZoom: number = 0, endZoom: number = 20, latitude: number = 0, tileSize: number = 256, screenDpi = 96): {zoom: number, resolution: number, scale: number}[] {\n // Note: There is probably a more direct way to compute this, but I prefer to go for a simple and well documented approach.\n if (startZoom <0 || endZoom < startZoom || tileSize < 0 || screenDpi < 1 || latitude < -90 || latitude > 90)\n return [];\n\n const inchPerMeter = 1 / 0.0254;\n const results: {zoom: number, resolution: number, scale: number}[] = [];\n const equatorLength = Constant.earthRadiusWGS84.equator * 2 * Math.PI;\n const zoom0Resolution = equatorLength / tileSize; // in meters per pixel\n\n const cosLatitude = Math.cos(latitude);\n for (let zoom = startZoom; zoom<= endZoom; zoom++) {\n const resolution = zoom0Resolution * cosLatitude / Math.pow(2, zoom);\n const scale = screenDpi * inchPerMeter * resolution;\n results.push({zoom, resolution, scale});\n }\n\n return results;\n }\n\n /**\n * Match the provided minScale, maxScale values to corresponding wgs84 zoom levels\n * @param defaultMaxLod Value of the last LOD (i.e 22)\n * @param tileSize Size of a tile in pixels (i.e 256)\n * @param minScale Minimum scale value that needs to be matched to a LOD level\n * @param maxScale Maximum scale value that needs to be matched to a LOD level\n * @returns minLod: LOD value matching minScale, maxLod: LOD value matching maxScale\n */\n public static getZoomLevelsScales( defaultMaxLod: number, tileSize: number, minScale?: number, maxScale?: number, tolerance: number = 0): {minLod?: number, maxLod?: number} {\n\n let minLod: number|undefined, maxLod: number|undefined;\n\n const zoomScales = ArcGisUtilities.computeZoomLevelsScales(0, defaultMaxLod, 0 /* latitude 0 = Equator*/, tileSize);\n\n if (zoomScales.length > 0) {\n\n if (minScale) {\n minLod = 0;\n // We are looking for the largest scale value with a scale value smaller than minScale\n for (; minLod < zoomScales.length && (zoomScales[minLod].scale > minScale && Math.abs(zoomScales[minLod].scale - minScale) > tolerance); minLod++)\n ;\n\n }\n\n if (maxScale) {\n maxLod = defaultMaxLod;\n // We are looking for the smallest scale value with a value greater than maxScale\n for (; maxLod >= 0 && zoomScales[maxLod].scale < maxScale && Math.abs(zoomScales[maxLod].scale - maxScale) > tolerance; maxLod--)\n ;\n }\n }\n return {minLod, maxLod};\n }\n\n}\n"]}
1
+ {"version":3,"file":"ArcGisUtilities.js","sourceRoot":"","sources":["../../../../../src/internal/tile/map/ArcGisUtilities.ts"],"names":[],"mappings":"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","sourcesContent":["/*---------------------------------------------------------------------------------------------\n* Copyright (c) Bentley Systems, Incorporated. All rights reserved.\n* See LICENSE.md in the project root for license terms and full copyright notice.\n*--------------------------------------------------------------------------------------------*/\nimport { Angle, Constant } from \"@itwin/core-geometry\";\nimport { MapSubLayerProps } from \"@itwin/core-common\";\nimport { MapCartoRectangle, MapLayerAccessClient, MapLayerAccessToken, MapLayerAccessTokenParams, MapLayerSource, MapLayerSourceStatus, MapLayerSourceValidation, ValidateSourceArgs} from \"../../../tile/internal\";\nimport { IModelApp } from \"../../../IModelApp\";\nimport { headersIncludeAuthMethod } from \"../../../request/utils\";\n\n/** @packageDocumentation\n * @module Tiles\n */\n\n\nconst restServicesSubPath = \"/rest/services/\";\n\n/**\n * Class representing an ArcGIS error code.\n * @internal\n */\nexport enum ArcGisErrorCode {\n InvalidCredentials = 401,\n MissingPermissions = 403,\n InvalidToken = 498,\n TokenRequired = 499,\n UnknownError = 1000,\n NoTokenService = 1001,\n}\n\n/**\n * Class representing an ArcGIS service metadata.\n * @internal\n */\nexport interface ArcGISServiceMetadata {\n /** JSON content from the service */\n content: any;\n\n /** Indicates if an access token is required to access the service */\n accessTokenRequired: boolean;\n}\n\n/** Arguments for validating ArcGIS sources * @internal\n */\nexport interface ArcGisValidateSourceArgs extends ValidateSourceArgs {\n /** List of capabilities 'keyword' that needs to be advertised in the service's metadata in order to be valid. For example: 'Map', 'Query', etc*/\n capabilitiesFilter: string[];\n}\n\n/** Arguments for fetching service metadata * @internal\n */\nexport interface ArcGisGetServiceJsonArgs {\n url: string;\n formatId: string;\n userName?: string;\n password?: string;\n queryParams?: {[key: string]: string};\n ignoreCache?: boolean;\n requireToken?: boolean;\n}\n\n/**\n * Class containing utilities relating to ArcGIS services and coordinate systems.\n * @internal\n */\nexport class ArcGisUtilities {\n\n private static getBBoxString(range?: MapCartoRectangle) {\n if (!range)\n range = MapCartoRectangle.createMaximum();\n\n return `${range.low.x * Angle.degreesPerRadian},${range.low.y * Angle.degreesPerRadian},${range.high.x * Angle.degreesPerRadian},${range.high.y * Angle.degreesPerRadian}`;\n }\n\n public static async getNationalMapSources(): Promise<MapLayerSource[]> {\n const sources = new Array<MapLayerSource>();\n const response = await fetch(\"https://viewer.nationalmap.gov/tnmaccess/api/getMapServiceList\", { method: \"GET\" });\n const services = await response.json();\n\n if (!Array.isArray(services))\n return sources;\n\n for (const service of services) {\n if (service.wmsUrl.length === 0) // Exclude Wfs..\n continue;\n switch (service.serviceType) {\n case \"ArcGIS\":\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url: service.serviceLink, formatId: \"ArcGIS\" })!);\n break;\n default: {\n const wmsIndex = service.wmsUrl.lastIndexOf(\"/wms\");\n if (wmsIndex > 0) {\n const url = service.wmsUrl.slice(0, wmsIndex + 4);\n sources.push(MapLayerSource.fromJSON({ name: service.displayName, url, formatId: \"WMS\" })!);\n }\n break;\n }\n }\n }\n return sources;\n }\n\n public static async getServiceDirectorySources(url: string, baseUrl?: string): Promise<MapLayerSource[]> {\n if (undefined === baseUrl)\n baseUrl = url;\n let sources = new Array<MapLayerSource>();\n const response = await fetch(`${url}?f=json`, { method: \"GET\" });\n const json = await response.json();\n if (json !== undefined) {\n if (Array.isArray(json.folders)) {\n for (const folder of json.folders) {\n sources = sources.concat(await ArcGisUtilities.getServiceDirectorySources(`${url}/${folder}`, url));\n }\n }\n if (Array.isArray(json.services)) {\n for (const service of json.services) {\n let source;\n if (service.type === \"MapServer\")\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/MapServer`, formatId: \"ArcGIS\" });\n else if (service.type === \"ImageServer\")\n source = MapLayerSource.fromJSON({ name: service.name, url: `${baseUrl}/${service.name}/ImageServer`, formatId: \"ArcGIS\" });\n if (source)\n sources.push(source);\n }\n }\n }\n\n return sources;\n }\n\n /**\n * Get map layer sources from an ArcGIS query.\n * @param range Range for the query.\n * @param url URL for the query.\n * @returns List of map layer sources.\n */\n public static async getSourcesFromQuery(range?: MapCartoRectangle, url = \"https://usgs.maps.arcgis.com/sharing/rest/search\"): Promise<MapLayerSource[]> {\n const sources = new Array<MapLayerSource>();\n for (let start = 1; start > 0;) {\n const response = await fetch(`${url}?f=json&q=(group:9d1199a521334e77a7d15abbc29f8144) AND (type:\"Map Service\")&bbox=${ArcGisUtilities.getBBoxString(range)}&sortOrder=desc&start=${start}&num=100`, { method: \"GET\" });\n const json = await response.json();\n if (!json)\n break;\n\n start = json.nextStart ? json.nextStart : -1;\n if (json !== undefined && Array.isArray(json.results)) {\n for (const result of json.results) {\n const source = MapLayerSource.fromJSON({ name: result.name ? result.name : result.title, url: result.url, formatId: \"ArcGIS\" });\n if (source)\n sources.push(source);\n }\n }\n }\n\n return sources;\n }\n\n /**\n * Parse the URL to check if it represents a valid ArcGIS service\n * @param url URL to validate.\n * @param serviceType Service type to validate (i.e FeatureServer, MapServer)\n * @return Validation Status.\n */\n public static validateUrl(url: string, serviceType: string): MapLayerSourceStatus {\n const urlObj = new URL(url.toLowerCase());\n const restServicesPos = urlObj.pathname.search(restServicesSubPath);\n if (restServicesPos !== -1) {\n // This seem to be an ArcGIS URL, lets check the service type\n if (urlObj.pathname.includes(serviceType.toLowerCase(), restServicesPos + restServicesSubPath.length)) {\n return MapLayerSourceStatus.Valid;\n } else {\n return MapLayerSourceStatus.IncompatibleFormat;\n }\n } else {\n return MapLayerSourceStatus.InvalidUrl;\n }\n }\n\n /**\n * Attempt to access an ArcGIS service, and validate its service metadata.\n * @param source Source to validate.\n * @param opts Validation options\n */\n public static async validateSource(args: ArcGisValidateSourceArgs): Promise<MapLayerSourceValidation> {\n const {source, ignoreCache, capabilitiesFilter} = args;\n const metadata = await this.getServiceJson({url: source.url, formatId: source.formatId, userName: source.userName, password: source.password, queryParams: source.collectQueryParams(), ignoreCache});\n const json = metadata?.content;\n if (json === undefined) {\n return { status: MapLayerSourceStatus.InvalidUrl };\n } else if (json.error !== undefined) {\n\n // If we got a 'Token Required' error, lets check what authentification methods this ESRI service offers\n // and return information needed to initiate the authentification process... the end-user\n // will have to provide his credentials before we can fully validate this source.\n // Note: Some servers will throw a error 403 (You do not have permissions to access this resource or perform this operation),\n // instead of 499 (TokenRequired)\n if (json.error.code === ArcGisErrorCode.TokenRequired || json.error.code === ArcGisErrorCode.MissingPermissions) {\n return (source.userName || source.password) ? {status: MapLayerSourceStatus.InvalidCredentials} : {status: MapLayerSourceStatus.RequireAuth};\n } else if (json.error.code === ArcGisErrorCode.InvalidCredentials)\n return { status: MapLayerSourceStatus.InvalidCredentials};\n }\n\n // Check this service support the expected queries\n let hasCapabilities = false;\n let capsArray: string[] = [];\n if (json.capabilities && typeof json.capabilities === \"string\" ) {\n const capabilities: string = json.capabilities;\n capsArray = capabilities.split(\",\").map((entry) => entry.toLowerCase());\n\n const filtered = capsArray.filter((element, _index, _array) => capabilitiesFilter.includes(element));\n hasCapabilities = (filtered.length === capabilitiesFilter.length);\n }\n if (!hasCapabilities) {\n return { status: MapLayerSourceStatus.InvalidFormat};\n }\n\n // Only EPSG:3857 is supported with pre-rendered tiles.\n if (json.tileInfo && capsArray.includes(\"tilesonly\") && !ArcGisUtilities.isEpsg3857Compatible(json.tileInfo)) {\n return { status: MapLayerSourceStatus.InvalidCoordinateSystem};\n }\n\n let subLayers;\n if (json.layers) {\n\n subLayers = new Array<MapSubLayerProps>();\n\n for (const layer of json.layers) {\n const parent = layer.parentLayerId < 0 ? undefined : layer.parentLayerId;\n const children = Array.isArray(layer.subLayerIds) ? layer.subLayerIds : undefined;\n subLayers.push({ name: layer.name, visible: layer.defaultVisibility !== false, id: layer.id, parent, children });\n }\n }\n return { status: MapLayerSourceStatus.Valid, subLayers };\n }\n\n /** Validate MapService tiling metadata and checks if the tile tree is 'Google Maps' compatible. */\n public static isEpsg3857Compatible(tileInfo: any) {\n if (tileInfo.spatialReference?.latestWkid !== 3857 || !Array.isArray(tileInfo.lods))\n return false;\n\n const zeroLod = tileInfo.lods[0];\n return zeroLod.level === 0 && Math.abs(zeroLod.resolution - 156543.03392800014) < .001;\n }\n\n private static _serviceCache = new Map<string, ArcGISServiceMetadata|undefined>();\n\n /**\n * Fetches an ArcGIS service metadata, and returns its JSON representation.\n * If an access client has been configured for the specified formatId,\n * it will be used to apply required security token.\n * By default, response for each URL are cached.\n * @param url URL of the ArcGIS service\n * @param formatId Format ID of the service\n * @param userName Username to use for legacy token based security\n * @param password Password to use for legacy token based security\n * @param ignoreCache Flag to skip cache lookup (i.e. force a new server request)\n * @param requireToken Flag to indicate if a token is required\n */\n\n public static async getServiceJson(args: ArcGisGetServiceJsonArgs): Promise<ArcGISServiceMetadata|undefined> {\n const {url, formatId, userName, password, queryParams, ignoreCache, requireToken} = args;\n if (!ignoreCache) {\n const cached = ArcGisUtilities._serviceCache.get(url);\n if (cached !== undefined)\n return cached;\n }\n const appendParams = (urlObj: URL, params?: {[key: string]: string}) => {\n if (params) {\n Object.keys(params).forEach((paramKey) => {\n if (!urlObj.searchParams.has(paramKey))\n urlObj.searchParams.append(paramKey, params[paramKey]);\n });\n }\n };\n\n const createUrlObj = () => {\n const tmpUrl = new URL(url);\n tmpUrl.searchParams.append(\"f\", \"json\");\n appendParams(tmpUrl, queryParams);\n return tmpUrl;\n };\n\n let accessTokenRequired = false;\n try {\n let tmpUrl = createUrlObj();\n\n // In some cases, caller might already know token is required, so append it immediately\n if (requireToken) {\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\n if (accessClient) {\n accessTokenRequired = true;\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\n }\n }\n let response = await fetch(tmpUrl, { method: \"GET\" });\n if (response.status === 401 && !requireToken && headersIncludeAuthMethod(response.headers, [\"ntlm\", \"negotiate\"])) {\n // We got a http 401 challenge, lets try again with SSO enabled (i.e. Windows Authentication)\n response = await fetch(tmpUrl, {method: \"GET\", credentials: \"include\" });\n }\n\n // Append security token when corresponding error code is returned by ArcGIS service\n let errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\n if (!accessTokenRequired\n && (errorCode === ArcGisErrorCode.TokenRequired || errorCode === ArcGisErrorCode.MissingPermissions) ) {\n accessTokenRequired = true;\n // If token required\n const accessClient = IModelApp.mapLayerFormatRegistry.getAccessClient(formatId);\n if (accessClient) {\n tmpUrl = createUrlObj();\n await ArcGisUtilities.appendSecurityToken(tmpUrl, accessClient, {mapLayerUrl: new URL(url), userName, password});\n response = await fetch(tmpUrl.toString(), { method: \"GET\" });\n errorCode = await ArcGisUtilities.checkForResponseErrorCode(response);\n }\n }\n\n const json = await response.json();\n const info = {content: json, accessTokenRequired};\n // Cache the response only if it doesn't contain any error.\n ArcGisUtilities._serviceCache.set(url, (errorCode === undefined ? info : undefined));\n return info; // Always return json, even though it contains an error code.\n\n } catch {\n ArcGisUtilities._serviceCache.set(url, undefined);\n return undefined;\n }\n }\n\n /** Read a response from ArcGIS server and check for error code in the response. */\n public static async checkForResponseErrorCode(response: Response) {\n const tmpResponse = response;\n if (response.headers && tmpResponse.headers.get(\"content-type\")?.toLowerCase().includes(\"json\")) {\n\n try {\n // Note:\n // Since response stream can only be read once (i.e. calls to .json() method)\n // we have to clone the response object in order to check for potential error code,\n // but still keep the response stream as unread.\n const clonedResponse = tmpResponse.clone();\n const json = await clonedResponse.json();\n if (json?.error?.code !== undefined)\n return json?.error?.code as number;\n } catch { }\n\n }\n return undefined;\n }\n\n // return the appended access token if available.\n public static async appendSecurityToken(url: URL, accessClient: MapLayerAccessClient, accessTokenParams: MapLayerAccessTokenParams): Promise<MapLayerAccessToken|undefined> {\n\n // Append security token if available\n let accessToken: MapLayerAccessToken|undefined;\n try {\n accessToken = await accessClient.getAccessToken(accessTokenParams);\n } catch {}\n\n if (accessToken?.token) {\n url.searchParams.append(\"token\", accessToken.token);\n return accessToken;\n }\n\n return undefined;\n }\n\n /**\n * Compute scale, resolution values for requested zoom levels (WSG 84)\n * Use a scale of 96 dpi for Google Maps scales\n * Based on this article: https://wiki.openstreetmap.org/wiki/Slippy_map_tilenames#Resolution_and_Scale\n * @param startZoom Zoom level where scales begins to be computed\n * @param endZoom Zoom level where scales ends to be computed\n * @param latitude Latitude in degrees to use to compute scales (i.e 0 for Equator)\n * @param tileSize Size of a tile in pixels (i.e 256)\n * @param screenDpi Monitor resolution in dots per inch (i.e. typically 96dpi is used by Google Maps)\n * @returns An array containing resolution and scale values for each requested zoom level\n */\n public static computeZoomLevelsScales(startZoom: number = 0, endZoom: number = 20, latitude: number = 0, tileSize: number = 256, screenDpi = 96): {zoom: number, resolution: number, scale: number}[] {\n // Note: There is probably a more direct way to compute this, but I prefer to go for a simple and well documented approach.\n if (startZoom <0 || endZoom < startZoom || tileSize < 0 || screenDpi < 1 || latitude < -90 || latitude > 90)\n return [];\n\n const inchPerMeter = 1 / 0.0254;\n const results: {zoom: number, resolution: number, scale: number}[] = [];\n const equatorLength = Constant.earthRadiusWGS84.equator * 2 * Math.PI;\n const zoom0Resolution = equatorLength / tileSize; // in meters per pixel\n\n const cosLatitude = Math.cos(latitude);\n for (let zoom = startZoom; zoom<= endZoom; zoom++) {\n const resolution = zoom0Resolution * cosLatitude / Math.pow(2, zoom);\n const scale = screenDpi * inchPerMeter * resolution;\n results.push({zoom, resolution, scale});\n }\n\n return results;\n }\n\n /**\n * Match the provided minScale, maxScale values to corresponding wgs84 zoom levels\n * @param defaultMaxLod Value of the last LOD (i.e 22)\n * @param tileSize Size of a tile in pixels (i.e 256)\n * @param minScale Minimum scale value that needs to be matched to a LOD level\n * @param maxScale Maximum scale value that needs to be matched to a LOD level\n * @returns minLod: LOD value matching minScale, maxLod: LOD value matching maxScale\n */\n public static getZoomLevelsScales( defaultMaxLod: number, tileSize: number, minScale?: number, maxScale?: number, tolerance: number = 0): {minLod?: number, maxLod?: number} {\n\n let minLod: number|undefined, maxLod: number|undefined;\n\n const zoomScales = ArcGisUtilities.computeZoomLevelsScales(0, defaultMaxLod, 0 /* latitude 0 = Equator*/, tileSize);\n\n if (zoomScales.length > 0) {\n\n if (minScale) {\n minLod = 0;\n // We are looking for the largest scale value with a scale value smaller than minScale\n for (; minLod < zoomScales.length && (zoomScales[minLod].scale > minScale && Math.abs(zoomScales[minLod].scale - minScale) > tolerance); minLod++)\n ;\n\n }\n\n if (maxScale) {\n maxLod = defaultMaxLod;\n // We are looking for the smallest scale value with a value greater than maxScale\n for (; maxLod >= 0 && zoomScales[maxLod].scale < maxScale && Math.abs(zoomScales[maxLod].scale - maxScale) > tolerance; maxLod--)\n ;\n }\n }\n return {minLod, maxLod};\n }\n\n}\n"]}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@itwin/core-frontend",
3
- "version": "5.0.0-dev.79",
3
+ "version": "5.0.0-dev.82",
4
4
  "description": "iTwin.js frontend components",
5
5
  "main": "lib/cjs/core-frontend.js",
6
6
  "module": "lib/esm/core-frontend.js",
@@ -23,12 +23,12 @@
23
23
  "url": "http://www.bentley.com"
24
24
  },
25
25
  "peerDependencies": {
26
- "@itwin/appui-abstract": "5.0.0-dev.79",
27
- "@itwin/core-geometry": "5.0.0-dev.79",
28
- "@itwin/core-quantity": "5.0.0-dev.79",
29
- "@itwin/core-common": "5.0.0-dev.79",
30
- "@itwin/core-orbitgt": "5.0.0-dev.79",
31
- "@itwin/core-bentley": "5.0.0-dev.79"
26
+ "@itwin/appui-abstract": "5.0.0-dev.82",
27
+ "@itwin/core-bentley": "5.0.0-dev.82",
28
+ "@itwin/core-orbitgt": "5.0.0-dev.82",
29
+ "@itwin/core-geometry": "5.0.0-dev.82",
30
+ "@itwin/core-quantity": "5.0.0-dev.82",
31
+ "@itwin/core-common": "5.0.0-dev.82"
32
32
  },
33
33
  "//devDependencies": [
34
34
  "NOTE: All peerDependencies should also be listed as devDependencies since peerDependencies are not considered by npm install",
@@ -39,25 +39,25 @@
39
39
  "@types/chai-as-promised": "^7",
40
40
  "@vitest/browser": "^3.0.6",
41
41
  "@vitest/coverage-v8": "^3.0.6",
42
- "cpx2": "^3.0.0",
42
+ "cpx2": "^8.0.0",
43
43
  "eslint": "^9.13.0",
44
44
  "glob": "^10.3.12",
45
45
  "playwright": "~1.47.1",
46
- "rimraf": "^3.0.2",
47
- "source-map-loader": "^4.0.0",
46
+ "rimraf": "^6.0.1",
47
+ "source-map-loader": "^5.0.0",
48
48
  "typescript": "~5.6.2",
49
49
  "typemoq": "^2.1.0",
50
50
  "vitest": "^3.0.6",
51
51
  "vite-multiple-assets": "^1.3.1",
52
- "vite-plugin-static-copy": "1.0.6",
52
+ "vite-plugin-static-copy": "2.2.0",
53
53
  "webpack": "^5.97.1",
54
- "@itwin/core-common": "5.0.0-dev.79",
55
- "@itwin/core-geometry": "5.0.0-dev.79",
56
- "@itwin/appui-abstract": "5.0.0-dev.79",
57
- "@itwin/core-bentley": "5.0.0-dev.79",
58
- "@itwin/build-tools": "5.0.0-dev.79",
59
- "@itwin/core-quantity": "5.0.0-dev.79",
60
- "@itwin/core-orbitgt": "5.0.0-dev.79"
54
+ "@itwin/core-bentley": "5.0.0-dev.82",
55
+ "@itwin/build-tools": "5.0.0-dev.82",
56
+ "@itwin/core-common": "5.0.0-dev.82",
57
+ "@itwin/appui-abstract": "5.0.0-dev.82",
58
+ "@itwin/core-geometry": "5.0.0-dev.82",
59
+ "@itwin/core-orbitgt": "5.0.0-dev.82",
60
+ "@itwin/core-quantity": "5.0.0-dev.82"
61
61
  },
62
62
  "//dependencies": [
63
63
  "NOTE: these dependencies should be only for things that DO NOT APPEAR IN THE API",
@@ -65,19 +65,19 @@
65
65
  ],
66
66
  "dependencies": {
67
67
  "@itwin/cloud-agnostic-core": "^2.2.4",
68
- "@itwin/object-storage-core": "^2.2.5",
68
+ "@itwin/object-storage-core": "^2.3.0",
69
69
  "@loaders.gl/core": "^3.1.6",
70
70
  "@loaders.gl/draco": "^3.1.6",
71
71
  "fuse.js": "^3.3.0",
72
72
  "wms-capabilities": "0.4.0",
73
- "@itwin/core-i18n": "5.0.0-dev.79",
74
- "@itwin/webgl-compatibility": "5.0.0-dev.79"
73
+ "@itwin/core-i18n": "5.0.0-dev.82",
74
+ "@itwin/webgl-compatibility": "5.0.0-dev.82"
75
75
  },
76
76
  "scripts": {
77
77
  "build": "npm run -s copy:public && npm run -s build:cjs && npm run -s build:esm && npm run -s webpackWorkers && npm run -s copy:workers",
78
78
  "build:cjs": "npm run -s copy:js:cjs && tsc 1>&2 --outDir lib/cjs",
79
79
  "build:esm": "npm run -s copy:js:esm && tsc 1>&2 --module ES2022 --outDir lib/esm",
80
- "clean": "rimraf lib .rush/temp/package-deps*.json",
80
+ "clean": "rimraf -g lib .rush/temp/package-deps*.json",
81
81
  "copy:public": "cpx \"./src/public/**/*\" ./lib/public",
82
82
  "copy:js:cjs": "cpx \"./src/**/*.js\" ./lib/cjs",
83
83
  "copy:js:esm": "cpx \"./src/**/*.js\" ./lib/esm",