11#!./node_modules/.bin/vite-node --script
22
3+
34import { JSDOM } from 'jsdom'
45
56// faking browser support, so that OpenLayers has what it requires to parse XMLs
@@ -10,10 +11,9 @@ global.Node = dom.window.Node
1011import { LV95 } from '@swissgeo/coordinates'
1112import {
1213 EXTERNAL_SERVER_TIMEOUT ,
13- parseWmsCapabilities ,
14- parseWmtsCapabilities ,
1514 setWmsGetMapParams ,
1615} from '@swissgeo/layers/api'
16+ import { wmsCapabilitiesParser , wmtsCapabilitiesParser } from '@swissgeo/layers/parsers'
1717import axios , { AxiosError } from 'axios'
1818import axiosRetry from 'axios-retry'
1919import { promises as fs } from 'fs'
@@ -108,18 +108,16 @@ async function checkProviderGetMapTile(provider: string, capabilitiesResponse: a
108108
109109async function handleWms ( provider : string , content : string , result : any ) : Promise < boolean > {
110110 let isProviderMapValid = true
111- const capabilities = parseWmsCapabilities ( content ) as any
112- const layers = capabilities . getAllExternalLayerObjects (
113- LV95 ,
114- 1 , // opacity
115- true , // visible
116- false // throw error in case of an error
117- )
111+ const capabilities = wmsCapabilitiesParser . parse ( content , new URL ( provider ) ) as any
112+ const layers = wmsCapabilitiesParser . getAllExternalLayers ( capabilities , {
113+ outputProjection : LV95 ,
114+ initialValues : { opacity : 1 , isVisible : true } ,
115+ } )
118116
119117 const firstLeaf = findFirstLeaf ( layers )
120- const finding = capabilities . findLayer ( firstLeaf . id )
118+ const capabilitiesLayer = wmsCapabilitiesParser . getCapabilitiesLayer ( capabilities , firstLeaf . id )
121119 const crs = capabilities . Capability . Layer . CRS [ 0 ]
122- const style = finding . layer ?. Style ? finding . layer ?. Style [ 0 ] ?. Name : 'default'
120+ const style = capabilitiesLayer ?. Style ? capabilitiesLayer ?. Style [ 0 ] ?. Identifier : 'default'
123121 const getCapabilitiesUrl =
124122 capabilities . Capability . Request . GetCapabilities . DCPType [ 0 ] . HTTP . Get . OnlineResource
125123
@@ -131,16 +129,16 @@ async function handleWms(provider: string, content: string, result: any): Promis
131129 . filter ( ( url : string ) => getCapabilitiesUrl !== url )
132130
133131 for ( const getMapUrl of getMapUrls ) {
134- const url = setWmsGetMapParams ( new URL ( getMapUrl ) , firstLeaf . id , crs , style ) . toString ( )
132+ const url = setWmsGetMapParams ( new URL ( getMapUrl ) , firstLeaf . id , crs , style ! ) . toString ( )
135133
136134 try {
137- const { responseGetMap , redirectHeaders } = await fetchMapTile ( url , provider )
135+ const { response , redirectHeaders } = await fetchMapTile ( url , provider )
138136 isProviderMapValid =
139137 isProviderMapValid &&
140138 ( await checkProviderResponse (
141139 provider ,
142140 url ,
143- responseGetMap ,
141+ response ,
144142 result ,
145143 redirectHeaders ,
146144 checkProviderResponseContentGetMap
@@ -156,13 +154,11 @@ async function handleWms(provider: string, content: string, result: any): Promis
156154
157155async function handleWmts ( provider : string , content : string , result : any ) : Promise < boolean > {
158156 let isProviderGetTileValid = true
159- const capabilities = parseWmtsCapabilities ( content , new URL ( provider ) ) as any
160- const layers = capabilities . getAllExternalLayerObjects (
161- LV95 ,
162- 1 , // opacity
163- true , // visible
164- false // throw error in case of an error
165- )
157+ const capabilities = wmtsCapabilitiesParser . parse ( content , new URL ( provider ) ) as any
158+ const layers = wmtsCapabilitiesParser . getAllExternalLayers ( capabilities , {
159+ outputProjection : LV95 ,
160+ initialValues : { opacity : 1 , isVisible : true } ,
161+ } )
166162
167163 const exampleLayer = findFirstLeaf ( layers )
168164 const getTileUrlWithPlaceholders = exampleLayer . urlTemplate
@@ -233,7 +229,7 @@ async function fetchMapTile(url: string, provider: string): Promise<any> {
233229 )
234230 }
235231
236- return { response, responseGetMap : response , redirectHeaders }
232+ return { response, redirectHeaders }
237233}
238234
239235function createErrorEntry ( provider : string , url : string , error : Error , content : string ) : any {
@@ -346,7 +342,7 @@ async function checkProviderResponse(
346342 url : url ,
347343 status : response . status ,
348344 } )
349- } else if ( ! response . headers . hasOwnProperty ( 'access-control-allow-origin' ) ) {
345+ } else if ( ! response . headers . has ( 'access-control-allow-origin' ) ) {
350346 console . error (
351347 `Provider ${ provider } does not support CORS: status=${ response . status } , ` +
352348 `missing access-control-allow-origin header`
@@ -355,7 +351,7 @@ async function checkProviderResponse(
355351 provider : provider ,
356352 url : url ,
357353 status : response . status ,
358- headers : response . headers ,
354+ headers : response . headers . toJSON ( ) ,
359355 } )
360356 } else if ( redirectHeaders . some ( ( header ) => ! header [ 'access-control-allow-origin' ] ) ) {
361357 console . error (
@@ -371,19 +367,19 @@ async function checkProviderResponse(
371367 } )
372368 } else if (
373369 ! [ '*' , 'https://map.geo.admin.ch' ] . includes (
374- response . headers [ 'access-control-allow-origin' ] ? .toString ( ) ?. trim ( )
370+ response . headers . get ( 'access-control-allow-origin' ) . toString ( ) ?. trim ( )
375371 )
376372 ) {
377373 console . error (
378374 `Provider ${ provider } does not have geoadmin in its CORS: status=${
379375 response . status
380- } , Access-Control-Allow-Origin=${ response . headers [ 'access-control-allow-origin' ] } `
376+ } , Access-Control-Allow-Origin=${ response . headers . get ( 'access-control-allow-origin' ) } `
381377 )
382378 result . invalid_cors . push ( {
383379 provider : provider ,
384380 url : url ,
385381 status : response . status ,
386- headers : response . headers ,
382+ headers : response . headers . toJSON ( ) ,
387383 } )
388384 } else if ( await checkContentFnc ( provider , url , response , result ) ) {
389385 console . log ( `Provider ${ provider } is OK` )
@@ -394,19 +390,17 @@ async function checkProviderResponse(
394390
395391function checkProviderResponseContent ( provider : string , url : string , response : any , result : any ) : boolean {
396392 const content = response . data
397- const parseCapabilities = ( isCapFn : any , parseFn : any , type : string , result : any , resultArray : string ) : boolean => {
393+ const parseCapabilities = ( isCapFn : any , parser : any , type : string , result : any , resultArray : string ) : boolean => {
398394 if ( ! isCapFn ( content ) ) {
399395 return false
400396 }
401397
402398 try {
403- const capabilities = parseFn ( content , new URL ( url ) )
404- const layers = capabilities . getAllExternalLayerObjects (
405- LV95 ,
406- 1 , // opacity
407- true , // visible
408- false // throw Error in case of error
409- )
399+ const capabilities = parser . parse ( content , new URL ( url ) )
400+ const layers = parser . getAllExternalLayers ( capabilities , {
401+ outputProjection : LV95 ,
402+ initialValues : { opacity : 1 , isVisible : true } ,
403+ } )
410404
411405 if ( layers . length === 0 ) {
412406 throw new Error ( `No valid ${ type } layers found` )
@@ -424,8 +418,8 @@ function checkProviderResponseContent(provider: string, url: string, response: a
424418 return true
425419 }
426420 if (
427- parseCapabilities ( isWmsGetCap , parseWmsCapabilities , 'WMS' , result , 'invalid_wms' ) ||
428- parseCapabilities ( isWmtsGetCap , parseWmtsCapabilities , 'WMTS' , result , 'invalid_wmts' )
421+ parseCapabilities ( isWmsGetCap , wmsCapabilitiesParser , 'WMS' , result , 'invalid_wms' ) ||
422+ parseCapabilities ( isWmtsGetCap , wmtsCapabilitiesParser , 'WMTS' , result , 'invalid_wmts' )
429423 ) {
430424 return true
431425 }
@@ -434,7 +428,6 @@ function checkProviderResponseContent(provider: string, url: string, response: a
434428 result . invalid_content . push ( {
435429 provider,
436430 url,
437- error : 'file type not recognized' ,
438431 content : content . slice ( 0 , SIZE_OF_CONTENT_DISPLAY ) ,
439432 } )
440433 return false
@@ -546,4 +539,4 @@ async function main(): Promise<void> {
546539 }
547540}
548541
549- void main ( ) . then ( ( ) => exit ( ) )
542+ void main ( ) . then ( ( ) => exit ( ) )
0 commit comments