{"version":3,"sources":["jsdelivr-header.js","/npm/geostyler-wfs-parser@3.0.1/src/WfsDataParser.ts"],"names":[],"mappings":"AAAA;AACA;AACA;AACA;AACA;AACA;AACA,ACGA,MAAM,QAAW,GAAa,CAAC,OAAQ,OAAO,UAAU,GAAO,IAAI,eAAiB,OAAO,QAAS,GAAO,IAAK,cAG9G,cACK,yBAkDD,MAAO,cAKJ,aAAe,kBAEtB,MAAQ,kBAQR,0BAAA,CAA2B,GACzB,OAAO,OAAO,KAAK,GAChB,QAAO,IAAQ,QAAQ,EAAO,KAAS,OAAO,SAAS,EAAO,MAC9D,KAAI,GAAO,mBAAmB,GAAO,IAAM,mBAAmB,EAAO,MACrE,KAAK,IACV,CAQA,wBAAA,CAAyB,GAKvB,OAJoB,EAAqB,QAAQ,MAAQ,EACrD,EAAqB,MAAM,KAAK,GAChC,GAGF,IAAK,SAqBL,QACE,MAAO,SApBT,IAAK,UACH,MAAO,UACT,IAAK,QACL,IAAK,SACL,IAAK,OACL,IAAK,OACL,IAAK,UACL,IAAK,UACL,IAAK,MACL,IAAK,kBACL,IAAK,kBACL,IAAK,qBACL,IAAK,qBACL,IAAK,QACL,IAAK,eACL,IAAK,cACL,IAAK,gBACL,IAAK,eACH,MAAO,SAIb,CAWA,cAAM,EAAS,IACb,EAAG,cACH,EAAa,YACb,EAAc,KAGd,IAAI,EAuBA,EA8CA,EAnEC,EAAc,eACjB,EAAc,aAAe,oBAI7B,EAD4B,UAA1B,EAAc,QACS,CACvB,QAAS,EAAc,QACvB,YAAa,EAAc,YAC3B,SAAU,EAAc,SACxB,aAAc,EAAc,cAGL,CACvB,QAAS,EAAc,QACvB,MAAO,EAAc,MACrB,UAAW,EAAc,UACzB,aAAc,EAAc,cAMhC,IACE,MAKM,EAA6B,GAAG,KALT,KAAK,2BAA2B,IACxD,EACH,QAAS,MACT,QAAS,0BAGL,QAAoC,MAAM,EAA4B,GACtE,QAAiC,EAA4B,OAM7D,EALS,IAAI,UAAU,CAC3B,gBAAgB,EAChB,mBAAmB,EACnB,kBAAkB,IAEE,MAAM,GAE5B,IAAI,EAAa,GAAQ,QAAQ,aAAa,gBAAgB,WAAW,UAAU,QAEnF,MAAM,EAAiD,GACnD,IACG,MAAM,QAAQ,KACjB,EAAa,CAAC,IAEhB,EAAW,SAAS,IAClB,MAAM,EAAO,EAAK,UACZ,EAAO,EAAK,UAClB,IAAK,EAAW,GAAO,CACrB,MAAM,EAA+B,CAAC,KAAM,KAAK,yBAAyB,IAC1E,EAAW,GAAQ,CACrB,MAIJ,MAAM,EAAQ,GAAQ,QAAQ,UAAU,UAExC,EAAS,CACP,KAAM,SACN,QACA,aAEJ,CAAE,MAAO,GACP,KAAM,iCAAiC,GACzC,CAIA,IACE,MAAM,EAAoB,GAAG,KAAO,KAAK,2BAA2B,IAC/D,EACH,QAAS,MACT,QAAS,aACT,aAAc,uBAEV,QAA2B,MAAM,EAAmB,GAE1D,QAD+B,EAAmB,MAEpD,CAAE,MAAO,GACP,EAAkB,CAChB,KAAM,oBACN,SAAU,GAEd,CAEA,MAAO,CACL,SACA,kBAEJ,iBAIa","file":"/npm/geostyler-wfs-parser@3.0.1/dist/WfsDataParser.js","sourceRoot":"","sourcesContent":["/**\n * Minified by jsDelivr using Terser v5.39.0.\n * Original file: /npm/geostyler-wfs-parser@3.0.1/dist/WfsDataParser.js\n *\n * Do NOT use SRI with dynamically generated files! More information: https://www.jsdelivr.com/using-sri-with-dynamic-files\n */\n","import {\n  DataParser,\n  VectorData,\n  DataSchema,\n  SchemaProperty\n} from 'geostyler-data';\n\nimport { JSONSchema4TypeName } from 'json-schema';\n\nconst isEmpty = (obj: any) => [Object, Array].includes((obj || {}).constructor) && !Object.entries((obj || {})).length;\n\nimport {\n  XMLParser\n} from 'fast-xml-parser';\n\nimport {\n  FeatureCollection\n} from 'geojson';\n\nexport type RequestBaseParams = {\n  service: 'WFS';\n  request: 'GetFeature' | 'DescribeFeatureType';\n  exceptions?: string;\n};\n\nexport type GetFeatureOptionalParams = {\n  featureID?: string;\n  propertyName?: string;\n  sortBy?: string;\n  srsName?: string;\n};\n\nexport type RequestParams1_1_0 = {\n  version: '1.1.0';\n  typeName: string;\n  maxFeatures?: number;\n  outputFormat?: 'application/json' | 'application/geo+json';\n};\n\nexport type RequestParams2_0_0 = {\n  version: '2.0.0';\n  typeNames: string;\n  count?: number;\n  outputFormat?: 'application/json' | 'application/geo+json';\n};\n\nexport type RequestParams = GetFeatureOptionalParams & (RequestParams1_1_0 | RequestParams2_0_0);\nexport type DescribeFeatureTypeParams = RequestBaseParams & (RequestParams1_1_0 | RequestParams2_0_0);\nexport type GetFeatureParams = DescribeFeatureTypeParams & GetFeatureOptionalParams;\n\n/**\n * Interface representing the parameters to be send to WFS\n */\nexport interface ReadParams {\n  url: string;\n  requestParams: RequestParams;\n  fetchParams?: RequestInit;\n}\n\n/**\n * Class implementing DataParser to fetch schema and sample data\n * using WFS requests (DescribeFeatureType resp. GetFeature)\n */\nexport class WfsDataParser implements DataParser {\n\n  /**\n   * The name of the WfsDataParser.\n   */\n  public static title = 'WFS Data Parser';\n\n  title = 'WFS Data Parser';\n\n  /**\n   * Generate request parameter string for a passed object\n   *\n   * @param {Object} params Object holding request params\n   * @return {string} The URI encoded request parameter string joined with &\n   */\n  generateRequestParamString(params: any): string {\n    return Object.keys(params)\n      .filter(key => !isEmpty(params[key]) || Number.isFinite(params[key]))\n      .map(key => encodeURIComponent(key) + '=' + encodeURIComponent(params[key]))\n      .join('&');\n  }\n\n  /**\n   * Map XSD datatypes (SimpleType) to json schema data stypes\n   *\n   * @param qualifiedXsdDataType The XSD datatype as string (including namespace)\n   * @returns {JSONSchema4TypeName} The corresponding JSON schema type name\n   */\n  mapXsdTypeToJsonDataType(qualifiedXsdDataType: string): JSONSchema4TypeName {\n    const xsdDataType = qualifiedXsdDataType.indexOf(':') > -1\n      ? qualifiedXsdDataType.split(':')[1]\n      : qualifiedXsdDataType;\n\n    switch (xsdDataType) {\n      case 'string':\n        return 'string';\n      case 'boolean':\n        return 'boolean';\n      case 'float':\n      case 'double':\n      case 'long':\n      case 'byte':\n      case 'decimal':\n      case 'integer':\n      case 'int':\n      case 'positiveInteger':\n      case 'negativeInteger':\n      case 'nonPositiveInteger':\n      case 'nonNegativeInteger':\n      case 'short':\n      case 'unsignedLong':\n      case 'unsignedInt':\n      case 'unsignedShort':\n      case 'unsignedByte':\n        return 'number';\n      default:\n        return 'string';\n    }\n  }\n\n  /**\n   * Fetch schema and sample data and transforms it to the GeoStyler data model.\n   *\n   * Currently, WFS service must support application/json as outputFormat\n   * and needs CORS headers (only needed if WFS Service is not located on the same origin\n   * as the component using this parser) to be available in responses\n   *\n   * @param wfsConfig The parameters of the WFS\n   */\n  async readData({\n    url,\n    requestParams,\n    fetchParams = {}\n  }: ReadParams): Promise<VectorData> {\n\n    let desribeFeatureTypeOpts;\n\n    if (!requestParams.outputFormat) {\n      requestParams.outputFormat = 'application/json';\n    }\n\n    if (requestParams.version === '1.1.0') {\n      desribeFeatureTypeOpts = {\n        version: requestParams.version,\n        maxFeatures: requestParams.maxFeatures,\n        typeName: requestParams.typeName,\n        outputFormat: requestParams.outputFormat\n      };\n    } else {\n      desribeFeatureTypeOpts = {\n        version: requestParams.version,\n        count: requestParams.count,\n        typeNames: requestParams.typeNames,\n        outputFormat: requestParams.outputFormat\n      };\n    }\n\n    // Fetch data schema via describe feature type\n    let schema: DataSchema;\n    try {\n      const requestParamsString =  this.generateRequestParamString({\n        ...desribeFeatureTypeOpts,\n        service: 'WFS',\n        request: 'DescribeFeatureType',\n      });\n      const requestDescribeFeatureType = `${url}?${requestParamsString}`;\n      const describeFeatureTypeResponse = await fetch(requestDescribeFeatureType, fetchParams);\n      const describeFeatueTypeResult = await describeFeatureTypeResponse.text();\n      const parser = new XMLParser({\n        removeNSPrefix: true,\n        ignoreDeclaration: true,\n        ignoreAttributes: false\n      });\n      const result = parser.parse(describeFeatueTypeResult);\n\n      let attributes = result?.schema?.complexType?.complexContent?.extension?.sequence?.element\n\n      const properties: { [name: string]: SchemaProperty } = {};\n      if (attributes) {\n        if (!Array.isArray(attributes)) {\n          attributes = [attributes];\n        }\n        attributes.forEach((attr: any) => {\n          const name = attr['@_name'];\n          const type = attr['@_type'];\n          if (!properties[name]) {\n            const propertyType: SchemaProperty = {type: this.mapXsdTypeToJsonDataType(type)};\n            properties[name] = propertyType;\n          }\n        });\n      }\n\n      const title = result?.schema?.element?.['@_name'];\n\n      schema = {\n        type: 'object',\n        title,\n        properties\n      };\n    } catch (error) {\n      throw `Could not parse XML document: ${error}`;\n    }\n\n    // Fetch sample data via WFS GetFeature\n    let exampleFeatures: FeatureCollection;\n    try {\n      const requestGetFeature = `${url}?${this.generateRequestParamString({\n        ...requestParams,\n        service: 'WFS',\n        request: 'GetFeature',\n        outputFormat: 'application/json',\n      })}`;\n      const getFeatureResponse = await fetch(requestGetFeature, fetchParams);\n      const getFeatureResult = await getFeatureResponse.json();\n      exampleFeatures = getFeatureResult as FeatureCollection;\n    } catch (error) {\n      exampleFeatures = {\n        type: 'FeatureCollection',\n        features: []\n      };\n    }\n\n    return {\n      schema,\n      exampleFeatures\n    };\n  }\n\n}\n\nexport default WfsDataParser;\n"]}