@epam/statgpt-sdmx-toolkit 0.1.0-rc.0
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/LICENSE +21 -0
- package/README.md +68 -0
- package/api/availability-api.d.ts +8 -0
- package/api/dataset-api.d.ts +13 -0
- package/api/index.d.ts +4 -0
- package/api/sdmx-api-client.d.ts +13 -0
- package/api/sdmx-config.d.ts +6 -0
- package/constants/attributes.d.ts +1 -0
- package/constants/dataset-data-url.d.ts +1 -0
- package/constants/filter-operators.d.ts +2 -0
- package/constants/frequency-dimension.d.ts +1 -0
- package/constants/index.d.ts +2 -0
- package/index.cjs +1 -0
- package/index.d.ts +6 -0
- package/index.mjs +1031 -0
- package/models/data/data-message.d.ts +9 -0
- package/models/data/dataset.d.ts +13 -0
- package/models/data/index.d.ts +4 -0
- package/models/data/structure.d.ts +29 -0
- package/models/data/time-series.d.ts +18 -0
- package/models/dataset-query-filters.d.ts +4 -0
- package/models/dimension-group.d.ts +11 -0
- package/models/index.d.ts +14 -0
- package/models/series-filter.d.ts +6 -0
- package/models/splitted-urn.d.ts +8 -0
- package/models/structural-metadata/codelist.d.ts +8 -0
- package/models/structural-metadata/common-artefact-properties.d.ts +9 -0
- package/models/structural-metadata/concept-scheme.d.ts +9 -0
- package/models/structural-metadata/constraints.d.ts +16 -0
- package/models/structural-metadata/data-structure.d.ts +89 -0
- package/models/structural-metadata/dataflow.d.ts +4 -0
- package/models/structural-metadata/representation.d.ts +8 -0
- package/models/structural-metadata-base.d.ts +26 -0
- package/models/structural-metadata.d.ts +16 -0
- package/package.json +21 -0
- package/parsers/index.d.ts +5 -0
- package/parsers/request-parser/data-response-parser.d.ts +12 -0
- package/parsers/time-period-parser/define-period.d.ts +18 -0
- package/parsers/time-period-parser/get-periodic-date.d.ts +7 -0
- package/parsers/time-period-parser/period-sorting.d.ts +1 -0
- package/parsers/time-period-parser/time-period.d.ts +2 -0
- package/types/annotations.d.ts +4 -0
- package/types/attribute-index-value.d.ts +1 -0
- package/types/data-query-params.d.ts +3 -0
- package/types/details.d.ts +4 -0
- package/types/files.d.ts +14 -0
- package/types/index.d.ts +9 -0
- package/types/logical-operator-type.d.ts +12 -0
- package/types/periods.d.ts +5 -0
- package/types/references.d.ts +9 -0
- package/types/representation-text-type.d.ts +11 -0
- package/types/series.d.ts +4 -0
- package/utils/annotations.d.ts +2 -0
- package/utils/constraint.d.ts +8 -0
- package/utils/create-readable-stream.d.ts +1 -0
- package/utils/download.d.ts +3 -0
- package/utils/find-codelist-by-dimension.d.ts +4 -0
- package/utils/get-attached-dimensions-series.d.ts +8 -0
- package/utils/get-attributes-value.d.ts +3 -0
- package/utils/get-available-codes.d.ts +4 -0
- package/utils/get-concept.d.ts +7 -0
- package/utils/get-converted-meta-attributes.d.ts +2 -0
- package/utils/get-dataset.d.ts +2 -0
- package/utils/get-dimension-title.d.ts +3 -0
- package/utils/get-dimensions.d.ts +8 -0
- package/utils/get-file-headers.d.ts +1 -0
- package/utils/get-filtered-items.d.ts +4 -0
- package/utils/get-localized-name.d.ts +2 -0
- package/utils/get-structure-components.d.ts +4 -0
- package/utils/index.d.ts +21 -0
- package/utils/query-filters.d.ts +7 -0
- package/utils/time-series-count.d.ts +2 -0
- package/utils/urn.d.ts +5 -0
- package/utils/weekly-periods.utils.d.ts +9 -0
- package/utils/wildcards.d.ts +6 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 EPAM Systems
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
# SDMX Toolkit
|
|
2
|
+
|
|
3
|
+
This is StatGpt portals library
|
|
4
|
+
offers tools and utilities for working with SDMX
|
|
5
|
+
(Statistical Data and Metadata eXchange) data formats and Api
|
|
6
|
+
in the StatGPT portal frontend.
|
|
7
|
+
It includes parsing, validation, and integration logic
|
|
8
|
+
for SDMX structures
|
|
9
|
+
and utilities and helpers for working with SDMX Api standard.
|
|
10
|
+
|
|
11
|
+
[](https://opensource.org/licenses/mit)
|
|
12
|
+
[](https://www.typescriptlang.org/)
|
|
13
|
+
|
|
14
|
+
## Table of Contents
|
|
15
|
+
|
|
16
|
+
- [Features](#features)
|
|
17
|
+
- [Installation](#installation)
|
|
18
|
+
- [Usage](#usage)
|
|
19
|
+
- [Contributing](#contributing)
|
|
20
|
+
- [Security](#security)
|
|
21
|
+
- [License](#license)
|
|
22
|
+
|
|
23
|
+
## Features
|
|
24
|
+
|
|
25
|
+
- Parse and handle SDMX structures
|
|
26
|
+
- Utilities for working with SDMX codes, dimensions, and structures
|
|
27
|
+
- Helpers for localization and formatting
|
|
28
|
+
- Pre-configured API client for easy access to SDMX Api
|
|
29
|
+
- Type definitions for SDMX concepts
|
|
30
|
+
- Lightweight and minimal dependencies
|
|
31
|
+
|
|
32
|
+
## Installation
|
|
33
|
+
|
|
34
|
+
```bash
|
|
35
|
+
npm install @epam/statgpt-sdmx-toolkit
|
|
36
|
+
```
|
|
37
|
+
|
|
38
|
+
## Usage
|
|
39
|
+
|
|
40
|
+
```typescript
|
|
41
|
+
import { DatasetApi, SdmxApiClient, } from '@epam/statgpt-sdmx-toolkit';
|
|
42
|
+
|
|
43
|
+
const sdmxApiClient = new SdmxApiClient({
|
|
44
|
+
apiUrl: apiUrl,
|
|
45
|
+
constrainsApiUrl: constrainsApiUrl,
|
|
46
|
+
apiKey: apiKey,
|
|
47
|
+
});
|
|
48
|
+
|
|
49
|
+
// Example usage
|
|
50
|
+
export const datasetApi = new DatasetApi(sdmxApiClient);
|
|
51
|
+
```
|
|
52
|
+
|
|
53
|
+
## Contributing
|
|
54
|
+
|
|
55
|
+
We welcome contributions! Please see our [Contributing Guide](https://github.com/epam/statgpt-portal-frontend/blob/development/CONTRIBUTING.md) for details on:
|
|
56
|
+
|
|
57
|
+
- Testing requirements
|
|
58
|
+
- Pull request process
|
|
59
|
+
|
|
60
|
+
|
|
61
|
+
## Security
|
|
62
|
+
|
|
63
|
+
If you discover a security vulnerability, please refer to our [Security Policy](https://github.com/epam/statgpt-portal-frontend/blob/development/SECURITY.md).
|
|
64
|
+
|
|
65
|
+
|
|
66
|
+
## License
|
|
67
|
+
|
|
68
|
+
[MIT](https://github.com/epam/statgpt-portal-frontend/blob/development/LICENSE) - see the [LICENSE](https://github.com/epam/statgpt-portal-frontend/blob/development/LICENSE) file for details.
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { SeriesFilterDto } from '../models/series-filter';
|
|
2
|
+
import { StructuralMetaData } from '../models/structural-metadata';
|
|
3
|
+
import { SdmxApiClient } from './sdmx-api-client';
|
|
4
|
+
export declare class AvailabilityApi {
|
|
5
|
+
private client;
|
|
6
|
+
constructor(client: SdmxApiClient);
|
|
7
|
+
getConstraints(urn: string, filters?: SeriesFilterDto[]): Promise<StructuralMetaData>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SdmxApiClient } from './sdmx-api-client';
|
|
2
|
+
import { StructuralMetaData } from '../models/structural-metadata';
|
|
3
|
+
import { DataMessage } from '../models/data/data-message';
|
|
4
|
+
import { SdmxReferences } from '../types/references';
|
|
5
|
+
import { DatasetQueryFilters } from '../models/dataset-query-filters';
|
|
6
|
+
import { FileColumnsAttribute, SdmxDataFormat } from '../types/files';
|
|
7
|
+
export declare class DatasetApi {
|
|
8
|
+
private client;
|
|
9
|
+
constructor(client: SdmxApiClient);
|
|
10
|
+
getDataSet(urn: string, references?: SdmxReferences): Promise<StructuralMetaData | null>;
|
|
11
|
+
getDatasetData(urn: string, filters: DatasetQueryFilters): Promise<DataMessage | null>;
|
|
12
|
+
downloadDataSet(urn: string, dataFormat: SdmxDataFormat, language: string, columnAttribute: FileColumnsAttribute, filters: DatasetQueryFilters, filename: string, isMetadata?: boolean): Promise<Response>;
|
|
13
|
+
}
|
package/api/index.d.ts
ADDED
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { SdmxApiConfig } from './sdmx-config';
|
|
2
|
+
import { RequestOptions } from '../../../shared-toolkit/src/models/request-options';
|
|
3
|
+
export declare class SdmxApiClient {
|
|
4
|
+
readonly config: SdmxApiConfig;
|
|
5
|
+
constructor(config: SdmxApiConfig);
|
|
6
|
+
getRequest<T>(endpoint: string, options?: RequestOptions): Promise<T>;
|
|
7
|
+
postRequest<T>(endpoint: string, options?: RequestOptions): Promise<T>;
|
|
8
|
+
streamRequest(endpoint: string, options: RequestOptions, filename: string): Promise<Response>;
|
|
9
|
+
request<T>(endpoint: string, options: RequestOptions): Promise<T>;
|
|
10
|
+
private addInfoRequestLog;
|
|
11
|
+
private addErrorRequestLog;
|
|
12
|
+
private addErrorRequestParsing;
|
|
13
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const ALL_ATTRIBUTES = "all";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const DATASET_DATA_URL = "sdmx/3.0/data/dataflow";
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
export declare const FREQUENCY_DIMENSION_ID: string[];
|
package/index.cjs
ADDED
|
@@ -0,0 +1 @@
|
|
|
1
|
+
"use strict";Object.defineProperty(exports,Symbol.toStringTag,{value:"Module"});const R=e=>{if(e!=null){const t=e.split("=");return t.length===1?e:t[1]}},S=e=>{var r;if(e==null)return{};const t=R(e),n={agency:"",id:"",version:""};return t&&(t.includes(":")&&(n.agency=t.split(":")[0],n.id=t.split(":")[1].split("(")[0]),t.includes("(")&&t.includes(")")&&(n.version=(r=t.split("(")[1])==null?void 0:r.split(")")[0])),n},he=e=>{const[t,n]=e.split(")."),{agency:r,id:s,version:o}=S(t+")");return{childId:n,agency:r,id:s,version:o}},lt=(e,t,n)=>{const r=t===""?"":`(${t})`;return`${n}:${e}${r}`};var N=(e=>(e.DESCENDANTS="descendants",e.NONE="none",e.ALL="all",e))(N||{}),z=(e=>(e.EXACT="exact",e.AVAILABLE="available",e))(z||{});const ut=(e="",t="",n="")=>`sdmx/3.0/availability/dataflow/${e}/${t}/${n}`;class dt{constructor(t){this.client=t}async getConstraints(t,n){const{agency:r,id:s,version:o}=S(t),i={filters:n||[],mode:z.AVAILABLE,references:N.NONE},a=ut(r,s,o);return await this.client.postRequest(a,{body:i})}}var m=(e=>(e.CSV="csv",e.JSON="json",e.XML="xml",e))(m||{}),Ae=(e=>(e.ID="id",e.NAME="name",e.ID_NAME="both",e))(Ae||{}),De=(e=>(e.FULL_DATASET="full",e.DATA_IN_TABLE="query",e))(De||{});const Ee=(e,t)=>{switch(e){case m.CSV:return v("application/vnd.sdmx.data+csv;version=2.0.0",t);case m.XML:return v("application/vnd.sdmx.data+xml;version=3.0.0",t);case m.JSON:return v(`application/${e}`,t);default:return v("application/vnd.sdmx.data+csv;version=2.0.0",t)}},v=(e,t)=>`${e}; labels=${t}`;var I=(e=>(e.REFERENCE_PARTIAL="referencepartial",e.FULL="full",e))(I||{});const gt="all",Te="sdmx/3.0/data/dataflow",Q=(e,t,n)=>{const{filterKey:r,timeFilter:s}=n,{agency:o,id:i,version:a}=S(e),c=[encodeURIComponent(s||""),t].filter(f=>!!f).join("&");return`${`${Te}/${o}/${i}/${a}`}/${r||"*"}?${c}`},ft=(e="",t="",n="",r=N.DESCENDANTS)=>`sdmx/3.0/structure/dataflow/${e}/${t}/${n}?references=${r}&detail=${I.REFERENCE_PARTIAL}&forceDataflowDynamicAnnotations=true`;class yt{constructor(t){this.client=t}async getDataSet(t,n){const{agency:r,id:s,version:o}=S(t);return await this.client.getRequest(ft(r,s,o,n))}async getDatasetData(t,n){const r=new URLSearchParams({includeHistory:"false",limit:"10000",attributes:gt,dimensionAtObservation:"TIME_PERIOD",detail:I.FULL}).toString(),s=Q(t,r,n);return await this.client.request(s,{method:"GET"})}async downloadDataSet(t,n,r,s,o,i,a=!1){const c=new URLSearchParams({format:n,compress:"false",attributes:a?"all":"none"}).toString(),l=Q(t,c,o);return this.client.streamRequest(l,{method:"GET",headers:{Accept:Ee(n,s),"Accept-language":r}},i)}}const se=async(e,t,n)=>await fetch(e,{method:n.method||"GET",headers:t,body:n.body?JSON.stringify(n.body):void 0}),ht="application/json",At="Content-Type",Y="Api-Key",Dt="X-CONVERSATION-ID",oe=(e,t,n)=>{const r={[At]:(t==null?void 0:t.contentType)||ht};return t!=null&&t.jwt&&(r.Authorization=`Bearer ${t.jwt}`),t!=null&&t.chatReference&&(r[Dt]=t.chatReference),{...r,...n}},Et=e=>{const t={...e};return t[Y]&&(t[Y]=t[Y].substring(0,8)+"...[REDACTED]"),t.Authorization&&(t.Authorization="Bearer [REDACTED]"),t},Tt=(e,t)=>e.error||e.message||`${t.status} ${t.statusText}`;class St{constructor(t){this.config=t,console.info("SdmxApiClient initialized",{apiUrl:t.apiUrl||"NOT SET"})}async getRequest(t,n){return this.request(t,{...n,method:"GET"})}async postRequest(t,n){return this.request(t,{...n,method:"POST"})}async streamRequest(t,n,r){const s=`${this.config.apiUrl}/${t}`,o={...oe(void 0,{jwt:this.config.jwt}),...n.headers};this.config.apiKey!=null&&(o["Ocp-Apim-Subscription-Key"]=this.config.apiKey);const i=new ReadableStream({async start(c){var l;try{const u=await se(s,o,n);if(!u.ok){const g=await u.text();throw console.error(`Fetch failed! Status: ${u.status}, Body: ${g}`),new Error(`Fetch failed with status ${u.status}`)}const f=(l=u.body)==null?void 0:l.getReader();if(!f)throw new Error("Failed to create stream reader");const y=new Uint8Array([239,187,191]);c.enqueue(y);const d=async()=>{const{done:g,value:A}=await f.read();g?c.close():(c.enqueue(A),await d())};d()}catch(u){c.error(u)}}}),a=new Headers({"Content-Disposition":`attachment; filename=${encodeURIComponent(r)}`});return new Response(i,{headers:a})}async request(t,n){const r=Date.now(),s=t.includes("availability")&&this.config.constrainsApiUrl?`${this.config.constrainsApiUrl}/${t}`:`${this.config.apiUrl}/${t}`,o={...oe(void 0,{jwt:this.config.jwt}),...n.headers};this.config.apiKey!=null&&(o["Ocp-Apim-Subscription-Key"]=this.config.apiKey),this.addInfoRequestLog("API Request",s,n,o);try{const i=await se(s,o,n),a=Date.now()-r;let c;const l=await i.text();try{c=l?JSON.parse(l):{}}catch{if(this.addErrorRequestParsing(s,n,i,a,l),!i.ok)throw new Error(`API request failed: ${i.status} ${i.statusText} - ${l.substring(0,100)}`);c={data:l}}if(!i.ok){this.addErrorRequestLog(s,n,i,a,c);const u=Tt(c,i);throw new Error(`API request failed: ${u}`)}return c}catch(i){const a=Date.now()-r;throw console.error("API Request Exception",{method:n.method,url:s,duration:`${a}ms`,error:i instanceof Error?i.message:String(i)}),i}}addInfoRequestLog(t,n,r,s){const o={method:r.method||"GET",url:n,headers:Et(s)};r.body&&(o.body=r.body),console.info(t,o)}addErrorRequestLog(t,n,r,s,o){console.error("API Request Failed",{method:n.method,url:t,status:r.status,statusText:r.statusText,duration:`${s}ms`,response:o})}addErrorRequestParsing(t,n,r,s,o){console.error("API Response Parse Error",{method:n.method,url:t,status:r.status,statusText:r.statusText,duration:`${s}ms`,responseText:o.substring(0,200),error:"Response is not valid JSON"})}}const H="+",pt=",";var Se=(e=>(e.CONDITIONAL="Conditional",e.MANDATORY="Mandatory",e))(Se||{}),_=(e=>(e.DIMENSION="Dimension",e.MEASURE_DIMENSION="MeasureDimension",e.TIME_DIMENSION="TimeDimension",e))(_||{}),pe=(e=>(e.UNBOUNDED="unbounded",e))(pe||{});const me=(e,t)=>{var a,c,l,u,f;const n=(c=(a=e==null?void 0:e.data)==null?void 0:a.dataSets)==null?void 0:c[0],r=(u=(l=e==null?void 0:e.data)==null?void 0:l.structures)==null?void 0:u[0],s=((f=r==null?void 0:r.attributes)==null?void 0:f.dimensionGroup)||[],o=n==null?void 0:n.dimensionGroupAttributes,i={};for(const y of s){const d=y.relationship.dimensions,{codedSeriesKey:g,decodedSeriesKey:A}=J(e,t,d);i[y.id]={values:(o==null?void 0:o[g])||[],decodedSeriesKey:A,codedSeriesKey:g}}return i},J=(e,t,n)=>{var a,c;const r=(c=(a=e==null?void 0:e.data)==null?void 0:a.structures)==null?void 0:c[0],s=[...(r==null?void 0:r.dimensions.series)||[],...(r==null?void 0:r.dimensions.observation)||[]],o=new Array(s==null?void 0:s.length),i=new Array(s==null?void 0:s.length);return n==null||n.forEach(l=>{const u=(s==null?void 0:s.findIndex(d=>d.id===l))||0,f=t[u],y=s[u].values.findIndex(d=>d.id===f||d.value===f)||0;o[u]=y>=0?y:f,i[u]=f}),{codedSeriesKey:o.join(":"),decodedSeriesKey:i.join(":")}},mt=(e,t,n)=>{var f,y,d,g,A;const r=(y=(f=e==null?void 0:e.data)==null?void 0:f.dataSets)==null?void 0:y[0],s=(g=(d=e==null?void 0:e.data)==null?void 0:d.structures)==null?void 0:g[0],o=(((A=s==null?void 0:s.attributes)==null?void 0:A.dimensionGroup)||[]).filter(h=>{var D;return((D=h.relationship.dimensions)==null?void 0:D.length)===1&&h.relationship.dimensions.includes(t||"")}),i=r==null?void 0:r.dimensionGroupAttributes,a=[...(s==null?void 0:s.dimensions.series)||[],...(s==null?void 0:s.dimensions.observation)||[]],c=a==null?void 0:a.findIndex(h=>h.id===t),l=new Array(a==null?void 0:a.length);l[c]=n||"";const u={};for(const h of o){const D=h.relationship.dimensions,{codedSeriesKey:E,decodedSeriesKey:p}=J(e,l,D);u[h.id]={values:(i==null?void 0:i[E])||[],decodedSeriesKey:p,codedSeriesKey:E}}return u},Re=(e,t)=>{var r;if(t==null)return;const n=(r=e.values)==null?void 0:r[t];return n??(t instanceof Array?{values:t}:{value:t.toString()})},ve="Observation",Rt=e=>{var l,u,f,y,d,g;const t=(l=e==null?void 0:e.data)==null?void 0:l.dataSets,n=(f=(u=e==null?void 0:e.data)==null?void 0:u.structures)==null?void 0:f[0];if(!t||!n)return[];const r=n.attributes,s=n.dimensions,o=(r==null?void 0:r.dimensionGroup)||[],i=t[0].series||t[0].observations,a=(y=s.series)!=null&&y.length?s.series:s.observation,c=[];for(const A in i){const h=[],{name:D,parsedTimeSeriesValue:E}=we(A,a),p=i[A],nt=p.attributes||[];if(Object.keys(p).length===0){c.push({name:D,parsedTimeSeriesValue:E,values:h,attributes:[],dataSetAttrs:[]});continue}h.push(...wt(p,n));const rt=w((r==null?void 0:r.series)||[],T=>nt[T]),st=Pt(((d=n.attributes)==null?void 0:d.dataSet)||[],((g=t[0].attributes)==null?void 0:g.filter(T=>T!=null))||[]),ot=me(e,E),it=o.map((T,at)=>{const re=ot[T.id],ct=Re(T,re.values[at]);return{attribute:T,dimensionGroupValue:ct,dimensionGroupData:re}});c.push({name:D,parsedTimeSeriesValue:E,values:h,attributes:rt,dataSetAttrs:st,dimensionGroupAttributes:it})}return c},we=(e,t)=>{const n=e.split(new RegExp("(?<!\\|):(?!\\||$)")),r=[];for(let s=0;s<n.length;s++){const o=t==null?void 0:t[s],i=Number(n[s]);if(i<0||o==null)continue;const a=o.values[i];if(a==null){r.push(n[s].replace("|:",":"));continue}r.push((a==null?void 0:a.id)||(a==null?void 0:a.value)||"")}return{name:Pe(r),parsedTimeSeriesValue:r}},w=(e,t)=>{const n=[];for(let r=0;r<e.length;r++){const s=e[r],o=t(r),i=o!=null&&s.values!=null?vt(o,s):void 0;n.push({name:s.id,value:i})}return n},vt=(e,t)=>{const n=t.values[e];return n==null?typeof e=="object"?e:e.toString():(n==null?void 0:n.id)||(n==null?void 0:n.value)||(n==null?void 0:n.ids)||(n==null?void 0:n.values)},Pe=e=>e.map(t=>t?$e(t):"").join("."),$e=e=>e.replace(/\./g,"|.").replace(/:/g,"|:"),wt=(e,t)=>{var i,a,c,l,u;const n=(a=(i=t.measures)==null?void 0:i.observation)==null?void 0:a.length;if(e.observations==null)return[{values:ie(e,t.measures),obsAttributes:w(((c=t.attributes)==null?void 0:c.observation)||[],f=>e[f+n]),dimensionAtObservation:ve}];const r=e.observations,s=(l=t.dimensions.observation)==null?void 0:l[0],o=[];for(const f in r){const y=s==null?void 0:s.values[f];o.push({dimensionAtObservation:(y==null?void 0:y.value)||(y==null?void 0:y.id),values:ie(r[f],t.measures),obsAttributes:w(((u=t.attributes)==null?void 0:u.observation)||[],d=>r[f][d+n])})}return o},ie=(e,t)=>{var n;return((n=t==null?void 0:t.observation)==null?void 0:n.map((r,s)=>({name:r.id,value:e[s]})))||[]},Pt=(e,t)=>e.reduce((n,r,s)=>{const o=t[s];return $t(n,r,o,""),n},[]),$t=(e,t,n,r)=>{var o,i,a;const s=n!=null?((o=t==null?void 0:t.values)==null?void 0:o.length)>0?((i=t.values[n])==null?void 0:i.id)||((a=t.values[n])==null?void 0:a.value):String(n):r;e.push({name:t.id,value:s||""})},Ne=/^[0-9][0-9][0-9][0-9]-Q[1-4]$/,Ie=/^[0-9][0-9][0-9][0-9]-W[0-9][0-9]?$/,_e=/^[0-9][0-9][0-9][0-9]-S[1-2]$/,Oe=/^[0-9][0-9][0-9][0-9]$/,be=/^[0-9][0-9][0-9][0-9]-(0[1-9]|1[0-2])-[0-9][0-9]$/,Le=/^[0-9][0-9][0-9][0-9]-M(0[1-9]|(1[0-2]))$/,O=e=>Oe.exec(e),b=e=>!!O(e),Ue=e=>_e.exec(e),L=e=>!!Ue(e),U=e=>Le.exec(e),W=e=>!!U(e),C=e=>Ne.exec(e),x=e=>!!C(e),We=e=>be.exec(e),Ce=e=>!!We(e),xe=e=>Ie.exec(e),B=e=>!!xe(e),X=1440*60*1e3,Z=7*X;function ee(e){const t=`${e}-01-01`,n=new Date(t);if(n.getDay()!==4){const s=1+(4-n.getDay()+7)%7;n.setMonth(0,s)}return n}function Nt(e){const t=new Date(e),r=-((t.getDay()+6)%7)+3;return t.setDate(t.getDate()+r),new Date(t.valueOf())}function It(e,t="W"){const n=`${e}-12-31`,r=F(new Date(n),t);if(r.weekYear===e)return r.weekNumber;const s=`${e}-12-24`;return F(new Date(s),t).weekNumber}function Be(e,t,n="W"){return`${e}-${n}${t<10?"0"+t:t}`}function F(e,t="W"){const n=Nt(e),r=n.getFullYear(),s=ee(r),o=1+Math.ceil((n.getTime()-s.getTime())/Z);return{code:Be(r,o,t),weekNumber:o,weekYear:r}}function qe(e){const[t,n]=e.split("-W"),s=ee(+t).getTime()+(+n-1)*Z-3*X;return new Date(s)}function Me(e){const[t,n]=e.split("-W"),s=ee(+t).getTime()+(+n-1)*Z+3*X;return new Date(s)}function te(e){return b(e)?_t(e):L(e)?bt(e):x(e)?Ut(e):W(e)?Ct(e):B(e)?qe(e):Bt(e)}function ne(e){return b(e)?Ot(e):L(e)?Lt(e):x(e)?Wt(e):W(e)?xt(e):B(e)?Me(e):qt(e)}function _t(e){const t=O(e);if(t)return new Date(Number(t[0]),0,1)}function Ot(e){const t=O(e);if(t)return new Date(Number(t[0])+1,0,1)}function bt(e){const[t,n]=e.split("-S");switch(+n){case 1:return new Date(+t,0,1);case 2:return new Date(+t,6,1)}}function Lt(e){const[t,n]=e.split("-S");switch(+n){case 1:return new Date(+t,6,1);case 2:return new Date(+t+1,0,1)}}function Ut(e){const t=C(e);if(!t)return;const[n,r]=t[0].split("-Q");switch(+r){case 1:return new Date(+n,0,1);case 2:return new Date(+n,3,1);case 3:return new Date(+n,6,1);case 4:return new Date(+n,9,1)}}function Wt(e){const t=C(e);if(!t)return;const[n,r]=t[0].split("-Q");switch(+r){case 1:return new Date(+n,3,1);case 2:return new Date(+n,6,1);case 3:return new Date(+n,9,1);case 4:return new Date(+n+1,0,1)}}function Ct(e){const t=U(e);if(!t)return;const[n,r]=t[0].split("-M");return new Date(+n,+r-1,1)}function xt(e){const t=U(e);if(!t)return;const[n,r]=t[0].split("-M");return new Date(+n,+r,1)}const Bt=e=>new Date(`${e}T00:00:00`),qt=e=>{const t=new Date(`${e}T23:59:00`);return t.setMinutes(t.getMinutes()+1),t},Mt=1,kt=(e,t,n,r=!0,s="Q")=>{const o=[],i=t&&t>3?Ht(t,r):1,a=n?Math.floor((n-1)/3):4;for(let c=i;c<=a;c++)o.push(`${e}-${s}${c}`);return o},Vt=(e,t,n,r="S")=>{const s=[];return(t||1)<7&&(n||12)>6&&s.push(`${e}-${r}1`),n==null&&s.push(`${e}-${r}2`),s},Yt=e=>Math.ceil(e/3),ke=(e,t,n="M")=>`${e}-${n}${t.toString().padStart(2,"0")}`,Qt=(e,t,n="M")=>{const r=[];for(let s=t;s<=12;s++)r.push(ke(e,s,n));return r},Ft=(e,t,n,r="M")=>{const s=[];for(let o=t;o<n;o++)s.push(ke(e,o,r));return s},Kt=(e,t,n,r="M")=>{const s=t||1,o=n==null,i=n||12;return o?Qt(e,s,r):Ft(e,s,i,r)},Gt=(e,t,n="M")=>{switch(t){case 0:return[`${e}-${n}01`,`${e}-${n}02`,`${e}-${n}03`];case 1:return[`${e}-${n}04`,`${e}-${n}05`,`${e}-${n}06`];case 2:return[`${e}-${n}07`,`${e}-${n}08`,`${e}-${n}09`];case 3:return[`${e}-${n}10`,`${e}-${n}11`,`${e}-${n}12`];default:return[]}},jt=(e,t)=>{const n=K(t,!0),r=K(e),s=n.getFullYear(),o=r.getFullYear(),i=n.getTime()<=r.getTime()?o+Mt-s:0;return Array.from({length:i},(c,l)=>s+l)},K=(e,t=!1)=>{const n=zt(e,t);return n?(n.getTimezoneOffset()>0&&n.setMinutes(n.getMinutes()+n.getTimezoneOffset()),n):new Date},zt=(e,t=!1)=>{const n=Number(e);return e.toString().length!==13?t?te(e):ne(e):isNaN(n)?new Date(`${e}T00:00:00.000Z`):new Date(n)},Ht=(e,t)=>t?Math.floor((e+1)/3):Math.ceil((e+1)/3),Jt=(e,t)=>{const n=ce(e)-ce(t);if(n===0&&e!==t){const r=ae(e),s=ae(t);return r-s}return n},ae=e=>b(e)?6:L(e)?5:x(e)?4:W(e)?3:B(e)?2:Ce(e)?1:0,ce=(e,t=!1)=>{const n=t?te(e):ne(e);return(n==null?void 0:n.getTime())||0};var q=(e=>(e.LAST_UPDATE_AT="lastUpdatedAt",e.SERIES_COUNT="series_count",e))(q||{}),Ve=(e=>(e.C="c",e))(Ve||{}),P=(e=>(e.EQUALS="eq",e.NOT_EQUALS="ne",e.LESS="lt",e.LESS_OR_EQUAL="le",e.GREATER="gt",e.GREATER_OR_EQUAL="ge",e.CONTAINS="co",e.NOT_CONTAINS="nc",e.STARTS="sw",e.ENDS="ew",e))(P||{}),Ye=(e=>(e.BOOLEAN="Boolean",e.DATE_TIME="DateTime",e.DECIMAL="Decimal",e.INTEGER="Integer",e.OBSERVATION_TIME_PERIOD="ObservationalTimePeriod",e.STRING="String",e.TIME="Time",e.TIME_RANGE="TimeRange",e.URI="URI",e))(Ye||{});function Xt(e){var t,n;return(n=(t=e==null?void 0:e.annotations)==null?void 0:t.find(r=>{if(r.id===q.LAST_UPDATE_AT)return r}))==null?void 0:n.value}const M=(e,t)=>(e==null?void 0:e.names)&&(e==null?void 0:e.names[t])||(e==null?void 0:e.name),Qe=(e,t,n)=>{if(!(!e||t!=null&&t.has(e==null?void 0:e.id))&&(t==null||t.set(e==null?void 0:e.id,e),e!=null&&e.parent)){const r=n==null?void 0:n.get(e==null?void 0:e.parent);Qe(r,t,n)}},Fe=(e,t)=>{const n=new Map,r=new Map(e==null?void 0:e.map(s=>[s.id,s]));return t==null||t.forEach(s=>{Qe(s,n,r)}),Array.from(n==null?void 0:n.values())},Ke="time_period_end",Ge="time_period_start",Zt=e=>{const t=e==null?void 0:e.find(o=>o.id===Ge),n=e==null?void 0:e.find(o=>o.id===Ke),r=n!=null&&n.title?new Date(n==null?void 0:n.title):null;return{startPeriod:t!=null&&t.title?new Date(t==null?void 0:t.title):null,endPeriod:r}},en=(e,t)=>e.id.localeCompare(t.id),tn=(e,t)=>e.memberValue.localeCompare(t.memberValue),nn=(e,t)=>{const n=new Array(e.length),r=e.map((i,a)=>[i,a]);r.sort((i,a)=>en(i[0],a[0]));const s=[...t];s.sort(tn);let o=0;for(const i of r){const a=i[0];for(;o<s.length&&s[o].memberValue.localeCompare(a.id)<0;)o+=1;o<s.length&&s[o].memberValue===a.id&&(n[i[1]]=i[0])}return n.filter(i=>i!=null)},rn=e=>!!(e!=null&&e.some(t=>t.parent)),sn=(e,t,n,r,s=[])=>{var i,a;let o=e||[];if(on(n||[],t||"")){const c=(i=(n||[])[0].cubeRegions)==null?void 0:i.find(({isIncluded:l})=>l);if(c){const l=(a=c.memberSelection)==null?void 0:a.find(({componentId:u})=>u===t);l?o=o.length===0?(l.selectionValues||[]).map(({memberValue:u})=>({id:u,name:u})):nn(o,l.selectionValues):o=[]}}else s.length!==0&&(o=o.filter(({id:c})=>s.includes(c)));return rn(e)&&(o=Fe(e,o)),o==null?void 0:o.map(c=>({...c,name:r?M(c,r):c==null?void 0:c.name}))},on=(e,t)=>e!=null&&e.length>0&&t!=null,an=/^[v^~<>=]*?(\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+)(?:\.([x*]|\d+))?(?:-([\da-z\-]+(?:\.[\da-z\-]+)*))?(?:\+[\da-z\-]+(?:\.[\da-z\-]+)*)?)?)?$/i,le=e=>{if(typeof e!="string")throw new TypeError("Invalid argument expected string");const t=e.match(an);if(!t)throw new Error(`Invalid argument not valid semver ('${e}' received)`);return t.shift(),t},ue=e=>e==="*"||e==="x"||e==="X",de=e=>{const t=parseInt(e,10);return isNaN(t)?e:t},cn=(e,t)=>typeof e!=typeof t?[String(e),String(t)]:[e,t],ln=(e,t)=>{if(ue(e)||ue(t))return 0;const[n,r]=cn(de(e),de(t));return n>r?1:n<r?-1:0},ge=(e,t)=>{for(let n=0;n<Math.max(e.length,t.length);n++){const r=ln(e[n]||"0",t[n]||"0");if(r!==0)return r}return 0},un=(e,t)=>{const n=le(e),r=le(t),s=n.pop(),o=r.pop(),i=ge(n,r);return i!==0?i:s&&o?ge(s.split("."),o.split(".")):s||o?s?-1:1:0},dn=(e,t,n)=>{gn(n);const r=un(e,t);return je[n].includes(r)},je={">":[1],">=":[0,1],"=":[0],"<=":[-1,0],"<":[-1],"!=":[-1,1]},fe=Object.keys(je),gn=e=>{if(fe.indexOf(e)===-1)throw new Error(`Invalid operator, expected one of ${fe.join("|")}`)},$="+",k=(e,t)=>{const{agency:n,id:r,version:s}=S(e),o=t.filter(c=>{var l;return c.agencyID===n&&c.id===r&&!((l=c==null?void 0:c.version)!=null&&l.includes($))});if(o.length===1)return o[0];if(!(s!=null&&s.includes($)))return o.find(c=>c.version===s);const i=o.map(c=>c.version),a=ze(s,i);return o.find(c=>c.version===a[0])},ze=(e,t)=>{const n=fn(e,t);return n.length>0?[n[0]]:[]},fn=(e,t)=>{const n=[];return t.forEach(r=>{Je(e,r)&&n.push(r)}),n},He=e=>{const t=e.trim().replace(/\d+\+/,"*"),[n]=t.split("*");return new RegExp(`^${n}`)},Je=(e,t)=>{const n=e.trim().replace(/\+/,"");return He(e).test(t)&&dn(t,n,">=")},V=(e,t)=>{const{concept:n}=Xe(e,t);return n},Xe=(e,t)=>{if(e==null)return{concept:void 0,scheme:void 0};const{childId:n,agency:r,id:s,version:o}=he(e);if(o!=null&&o.includes($)){const i=k(e,t);return{concept:G((i==null?void 0:i.concepts)||[],n),scheme:i}}for(const i of t)if(yn(i,s,r,o))return{concept:G((i==null?void 0:i.concepts)||[],n),scheme:i};return{concept:void 0,scheme:void 0}},G=(e,t)=>e==null?void 0:e.find(n=>n.id===t),yn=(e,t,n,r)=>e.id===t&&e.agencyID===n&&e.version===r,hn=(e=[],t=[],n)=>{var c,l;const r=(n==null?void 0:n.conceptIdentity)||"",s=V(r,t),o=R((c=n==null?void 0:n.localRepresentation)==null?void 0:c.enumeration),i=R((l=s==null?void 0:s.coreRepresentation)==null?void 0:l.enumeration),a=o||i;if(a!=null)return k(a,e)},An=(e,t,n,r)=>{var o,i;const s=(o=t==null?void 0:t.find(a=>(a==null?void 0:a.id)===(e==null?void 0:e.id)))==null?void 0:o.values;return((i=n==null?void 0:n.filter(a=>s==null?void 0:s.some(c=>c.id===a.id)))==null?void 0:i.map(a=>({...a,name:r?M(a,r):a==null?void 0:a.name})))||[]},Ze=(e,t)=>{var s,o,i;const n=(s=t==null?void 0:t.dataStructureComponents)==null?void 0:s.attributeList,r=(o=e==null?void 0:e.metadataStructureComponents)==null?void 0:o.metadataAttributeList;return(i=n==null?void 0:n.metadataAttributeUsages)==null?void 0:i.map(a=>{var l;const c=(l=r==null?void 0:r.metadataAttributes)==null?void 0:l.find(u=>(u==null?void 0:u.id)===(a==null?void 0:a.metadataAttributeReference));return{...c,attributeRelationship:a.attributeRelationship,isMandatory:Number(c==null?void 0:c.minOccurs)>0}})},Dn=(e=[],t,n)=>{const r=R(t==null?void 0:t.conceptIdentity)||"",s=V(r,e);return n?M(s,n):(s==null?void 0:s.name)??(s==null?void 0:s.id)??(t==null?void 0:t.id)};function j(e){var t,n,r;return(r=(n=(t=e==null?void 0:e.dataStructures)==null?void 0:t[0])==null?void 0:n.dataStructureComponents)==null?void 0:r.dimensionList}function En(e){var t,n,r,s;return((s=(r=(n=(t=e==null?void 0:e.data)==null?void 0:t.structures)==null?void 0:n[0])==null?void 0:r.dimensions)==null?void 0:s.series)||[]}function Tn(e){var t,n,r,s,o;return((o=(s=(r=(n=(t=e==null?void 0:e.data)==null?void 0:t.structures)==null?void 0:n[0])==null?void 0:r.dimensions)==null?void 0:s.observation)==null?void 0:o[0].values.map(i=>i.value).filter(i=>i!=null))||[]}function Sn(e){return e.find(t=>t.type===_.TIME_DIMENSION)}const pn=e=>{var i,a,c,l,u,f;const t=new Map,n=(i=e==null?void 0:e.dataStructures)==null?void 0:i[0],r=(a=e==null?void 0:e.metadataStructures)==null?void 0:a[0],s=(e==null?void 0:e.conceptSchemes)||[],o=(e==null?void 0:e.codelists)||[];return e&&[...((c=j(e))==null?void 0:c.dimensions)||[],...((l=j(e))==null?void 0:l.timeDimensions)||[],...Ze(r,n),...((f=(u=n==null?void 0:n.dataStructureComponents)==null?void 0:u.attributeList)==null?void 0:f.attributes)||[]].forEach(d=>{var D,E;const g=V(d==null?void 0:d.conceptIdentity,s),A=((D=d==null?void 0:d.localRepresentation)==null?void 0:D.enumeration)||((E=g==null?void 0:g.coreRepresentation)==null?void 0:E.enumeration),h=k(A,o);d!=null&&d.id&&(A?t.set(d==null?void 0:d.id,{...h,name:g==null?void 0:g.name,names:g==null?void 0:g.names}):t.set(d==null?void 0:d.id,{id:d==null?void 0:d.id,name:g==null?void 0:g.name,names:g==null?void 0:g.names}))}),t},mn=e=>{var t;return((t=e==null?void 0:e.find(n=>n.id===q.SERIES_COUNT))==null?void 0:t.title)||""},Rn="/api/download",vn=(e,t,n,r,s,o,i)=>{const a=new URLSearchParams({urn:e,format:t,compress:"false",filename:o,filters:JSON.stringify(s),attribute:r,language:n,isMetadata:i?"true":"none"}).toString();window.open(`${Rn}?${a}`,"_blank")},ye=e=>isNaN(Date.parse(e))?null:new Date(e),wn=(e,t)=>{var r,s;const n=[];for(const o of e){if(o.type!==_.DIMENSION)continue;const i=t.find(a=>a.componentCode===o.id);i!=null&&((r=i.values)==null?void 0:r.length)>0?n.push((s=i.values)==null?void 0:s.join(H)):n.push("*")}return n.join(".")},et=(e,t)=>{if(!e||!e.startPeriod&&!e.endPeriod)return null;const n=[],{startPeriod:r,endPeriod:s}=e;if(r&&n.push(`${P.GREATER_OR_EQUAL}:${r.toISOString().split("T")[0]}`),s&&n.push(`${P.LESS_OR_EQUAL}:${s.toISOString().split("T")[0]}`),n.length===0)return null;const o=n.join(H);return`c${encodeURIComponent(`[${t}]`)}=${o}`},Pn=(e,t)=>{const n=tt(e,t)||null;return n?et(n,t==null?void 0:t.id):null},tt=(e,t)=>{var a,c;const n=t.id,r=(a=e==null?void 0:e.filters)==null?void 0:a.find(l=>l.componentCode===n);if(!r||!r.values)return null;const s=(c=r.values)==null?void 0:c.filter(l=>!!l);if(!s.length)return null;const o=ye(s[0]),i=ye(s[1]);return{startPeriod:o,endPeriod:i}};exports.Annotations=q;exports.AssignmentStatus=Se;exports.AvailabilityApi=dt;exports.DATASET_DATA_URL=Te;exports.DatasetApi=yt;exports.DimensionType=_;exports.DownloadType=De;exports.FileColumnsAttribute=Ae;exports.GET_v3_FILTER_AND=pt;exports.GET_v3_FILTER_OR=H;exports.OBSERVATION_KEY=ve;exports.OccurrenceType=pe;exports.RepresentationTextType=Ye;exports.SDMX_DATA_QUERY_PARAMS=Ve;exports.SINGLE_WILDCARD_SYMBOL=$;exports.SdmxApiClient=St;exports.SdmxAvailabilityMode=z;exports.SdmxDataFormat=m;exports.SdmxDetails=I;exports.SdmxReferences=N;exports.SeriesFilterOperator=P;exports.TIME_PERIOD_END=Ke;exports.TIME_PERIOD_START=Ge;exports.dailyPattern=be;exports.decodeDimensionId=$e;exports.findCodelistByDimension=hn;exports.generateDatasetDataRequest=Q;exports.generateShortUrn=lt;exports.getAnnotationPeriod=Zt;exports.getArtifactByUrnWithWildCard=k;exports.getAttachedDimensionsSeriesByDimension=mt;exports.getAttachedDimensionsSeriesByTsId=me;exports.getAttachedDimensionsSeriesKey=J;exports.getAttributeValueFromDataQueryResponse=Re;exports.getAvailableCodes=An;exports.getAvailableCodesFromConstrains=sn;exports.getChildParsedUrn=he;exports.getConcept=V;exports.getConceptByUrn=G;exports.getConceptWithScheme=Xe;exports.getConvertedMetaAttributes=Ze;exports.getDailyRegExp=We;exports.getDimensionTitle=Dn;exports.getDimensions=j;exports.getFilteredItemsWithParents=Fe;exports.getISOWeek=F;exports.getKeyFromUrn=R;exports.getLastUpdatedTime=Xt;exports.getLastWeekNumberOfYear=It;exports.getLocalizedName=M;exports.getMonthlyData=Kt;exports.getMonthlyDataByQuarter=Gt;exports.getMonthlyRegExp=U;exports.getParsedEndPeriodDate=ne;exports.getParsedResponse=Rt;exports.getParsedStartPeriodDate=te;exports.getPeriodDate=K;exports.getQuarterByMonth=Yt;exports.getQuarterlyRegExp=C;exports.getQuartersData=kt;exports.getQueryTimePeriodFilters=et;exports.getRequestAcceptHeader=Ee;exports.getResolvedVersionBySingleWildcard=ze;exports.getSemiAnnualData=Vt;exports.getSemiAnnuallyRegExp=Ue;exports.getSeriesAttributes=w;exports.getSeriesName=we;exports.getStructureComponentsMap=pn;exports.getStructureDimensions=En;exports.getTimeDimension=Sn;exports.getTimePeriods=Tn;exports.getTimeQueryFilter=Pn;exports.getTimeRangeFromAttachment=tt;exports.getTimeSeriesCount=mn;exports.getTimeSeriesFilterKey=wn;exports.getTimeSeriesId=Pe;exports.getWeekCode=Be;exports.getWeeklyPeriodEndDate=Me;exports.getWeeklyPeriodStartDate=qe;exports.getWeeklyRegExp=xe;exports.getWildCardRegexp=He;exports.getYearlyRegExp=O;exports.getYears=jt;exports.isDaily=Ce;exports.isMonthly=W;exports.isQuarterly=x;exports.isSemiAnnually=L;exports.isWeekly=B;exports.isWildCardVersionCorrect=Je;exports.isYearly=b;exports.monthlyPattern=Le;exports.openDownloadWindow=vn;exports.quarterPattern=Ne;exports.semiAnnuallyPattern=_e;exports.sortPeriods=Jt;exports.splitUrn=S;exports.weeklyPattern=Ie;exports.yearlyPattern=Oe;
|