@genspectrum/dashboard-components 0.10.3 → 0.11.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.
Files changed (80) hide show
  1. package/custom-elements.json +384 -56
  2. package/dist/assets/mutationOverTimeWorker-BjjkMGzd.js.map +1 -0
  3. package/dist/components.d.ts +250 -31
  4. package/dist/components.js +1220 -198
  5. package/dist/components.js.map +1 -1
  6. package/dist/{dateRangeOption-DjtcAEWq.js → dateRangeOption-Bh2p78z0.js} +11 -5
  7. package/dist/dateRangeOption-Bh2p78z0.js.map +1 -0
  8. package/dist/style.css +5 -1
  9. package/dist/util.d.ts +626 -16
  10. package/dist/util.js +1 -1
  11. package/package.json +13 -7
  12. package/src/preact/aggregatedData/aggregate.stories.tsx +2 -2
  13. package/src/preact/aggregatedData/aggregate.tsx +11 -8
  14. package/src/preact/dateRangeSelector/date-range-selector.stories.tsx +4 -12
  15. package/src/preact/dateRangeSelector/date-range-selector.tsx +4 -4
  16. package/src/preact/lineageFilter/lineage-filter.stories.tsx +1 -1
  17. package/src/preact/locationFilter/location-filter.stories.tsx +1 -1
  18. package/src/preact/map/__mockData__/aggregatedGermany.json +83 -0
  19. package/src/preact/map/__mockData__/aggregatedWorld.json +259 -0
  20. package/src/preact/map/__mockData__/germanyMap.json +9083 -0
  21. package/src/preact/map/__mockData__/howToGenerateWorldMap.md +9 -0
  22. package/src/preact/map/__mockData__/worldAtlas.json +497127 -0
  23. package/src/preact/map/leafletStyleModifications.css +3 -0
  24. package/src/preact/map/sequences-by-location-map.tsx +202 -0
  25. package/src/preact/map/sequences-by-location-table.tsx +18 -0
  26. package/src/preact/map/sequences-by-location.stories.tsx +144 -0
  27. package/src/preact/map/sequences-by-location.tsx +151 -0
  28. package/src/preact/map/useGeoJsonMap.tsx +62 -0
  29. package/src/preact/mutationComparison/mutation-comparison.tsx +5 -7
  30. package/src/preact/mutationFilter/mutation-filter.tsx +4 -13
  31. package/src/preact/mutations/mutations.tsx +4 -4
  32. package/src/preact/mutationsOverTime/mutations-over-time.stories.tsx +1 -1
  33. package/src/preact/mutationsOverTime/mutations-over-time.tsx +4 -4
  34. package/src/preact/numberSequencesOverTime/number-sequences-over-time.stories.tsx +5 -14
  35. package/src/preact/numberSequencesOverTime/number-sequences-over-time.tsx +4 -4
  36. package/src/preact/prevalenceOverTime/prevalence-over-time.stories.tsx +15 -26
  37. package/src/preact/prevalenceOverTime/prevalence-over-time.tsx +8 -8
  38. package/src/preact/relativeGrowthAdvantage/relative-growth-advantage.stories.tsx +4 -15
  39. package/src/preact/relativeGrowthAdvantage/relative-growth-advantage.tsx +11 -7
  40. package/src/preact/shared/stories/expectErrorMessage.ts +21 -0
  41. package/src/preact/textInput/text-input.stories.tsx +1 -1
  42. package/src/preact/useQuery.ts +9 -1
  43. package/src/query/queryNumberOfSequencesOverTime.spec.ts +4 -4
  44. package/src/query/queryNumberOfSequencesOverTime.ts +1 -4
  45. package/src/query/queryPrevalenceOverTime.ts +1 -4
  46. package/src/styles/tailwind.css +1 -1
  47. package/src/types.ts +12 -4
  48. package/src/utilEntrypoint.ts +16 -4
  49. package/src/utils/utils.ts +0 -29
  50. package/src/web-components/app.ts +1 -1
  51. package/src/web-components/input/gs-date-range-selector.stories.ts +4 -4
  52. package/src/web-components/input/gs-date-range-selector.tsx +5 -5
  53. package/src/web-components/input/gs-lineage-filter.tsx +1 -1
  54. package/src/web-components/input/gs-location-filter.tsx +1 -1
  55. package/src/web-components/input/gs-mutation-filter.tsx +5 -8
  56. package/src/web-components/input/gs-text-input.tsx +1 -1
  57. package/src/web-components/visualization/gs-aggregate.stories.ts +3 -3
  58. package/src/web-components/visualization/gs-aggregate.tsx +10 -6
  59. package/src/web-components/visualization/gs-mutation-comparison.tsx +7 -2
  60. package/src/web-components/visualization/gs-mutations-over-time.tsx +7 -2
  61. package/src/web-components/visualization/gs-mutations.tsx +7 -2
  62. package/src/web-components/visualization/gs-number-sequences-over-time.stories.ts +5 -5
  63. package/src/web-components/visualization/gs-number-sequences-over-time.tsx +13 -15
  64. package/src/web-components/visualization/gs-prevalence-over-time.stories.ts +8 -8
  65. package/src/web-components/visualization/gs-prevalence-over-time.tsx +17 -14
  66. package/src/web-components/visualization/gs-relative-growth-advantage.stories.ts +4 -5
  67. package/src/web-components/visualization/gs-relative-growth-advantage.tsx +17 -15
  68. package/src/web-components/visualization/gs-sequences-by-location.stories.ts +234 -0
  69. package/src/web-components/visualization/gs-sequences-by-location.tsx +258 -0
  70. package/src/web-components/visualization/gs-statistics.tsx +12 -3
  71. package/src/web-components/visualization/index.ts +1 -0
  72. package/standalone-bundle/assets/mutationOverTimeWorker-DoUBht2e.js.map +1 -0
  73. package/standalone-bundle/dashboard-components.js +16208 -9408
  74. package/standalone-bundle/dashboard-components.js.map +1 -1
  75. package/standalone-bundle/style.css +1 -1
  76. package/dist/assets/mutationOverTimeWorker-CNg_ztNp.js.map +0 -1
  77. package/dist/dateRangeOption-DjtcAEWq.js.map +0 -1
  78. package/src/preact/shared/stories/expectInvalidAttributesErrorMessage.ts +0 -13
  79. package/src/utils/utils.spec.ts +0 -16
  80. package/standalone-bundle/assets/mutationOverTimeWorker-cIyshfj_.js.map +0 -1
package/dist/util.js CHANGED
@@ -1,4 +1,4 @@
1
- import { D, d, v } from "./dateRangeOption-DjtcAEWq.js";
1
+ import { D, d, v } from "./dateRangeOption-Bh2p78z0.js";
2
2
  export {
3
3
  D as DateRangeOptionChangedEvent,
4
4
  d as dateRangeOptionPresets,
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@genspectrum/dashboard-components",
3
- "version": "0.10.3",
3
+ "version": "0.11.0",
4
4
  "description": "GenSpectrum web components for building dashboards",
5
5
  "type": "module",
6
6
  "license": "AGPL-3.0-only",
@@ -28,14 +28,14 @@
28
28
  },
29
29
  "exports": {
30
30
  "./components": {
31
+ "types": "./dist/components.d.ts",
31
32
  "import": "./dist/components.js",
32
- "require": "./dist/components.js",
33
- "types": "./dist/components.d.ts"
33
+ "require": "./dist/components.js"
34
34
  },
35
35
  "./util": {
36
+ "types": "./dist/util.d.ts",
36
37
  "import": "./dist/util.js",
37
- "require": "./dist/util.js",
38
- "types": "./dist/util.d.ts"
38
+ "require": "./dist/util.js"
39
39
  },
40
40
  "./custom-elements.json": "./custom-elements.json",
41
41
  "./package.json": "./package.json",
@@ -83,14 +83,16 @@
83
83
  "@lit/context": "^1.1.1",
84
84
  "@lit/reactive-element": "^2.0.4",
85
85
  "@lit/task": "^1.0.0",
86
- "chart.js": "^4.4.2",
86
+ "chart.js": "^4.4.6",
87
87
  "chartjs-chart-error-bars": "^4.4.0",
88
88
  "chartjs-chart-venn": "^4.3.0",
89
89
  "dayjs": "^1.11.10",
90
90
  "flatpickr": "^4.6.13",
91
91
  "gridjs": "^6.2.0",
92
+ "leaflet": "^1.9.4",
92
93
  "lit": "^3.1.3",
93
94
  "preact": "^10.20.1",
95
+ "topojson-client": "^3.1.0",
94
96
  "zod": "^3.23.0"
95
97
  },
96
98
  "devDependencies": {
@@ -112,7 +114,11 @@
112
114
  "@storybook/web-components": "^8.0.9",
113
115
  "@storybook/web-components-vite": "^8.0.9",
114
116
  "@tailwindcss/container-queries": "^0.1.1",
117
+ "@types/geojson": "^7946.0.15",
118
+ "@types/leaflet": "^1.9.15",
115
119
  "@types/node": "^22.0.0",
120
+ "@types/topojson-client": "^3.1.5",
121
+ "@types/topojson-specification": "^1.0.5",
116
122
  "@typescript-eslint/eslint-plugin": "^8.2.0",
117
123
  "@typescript-eslint/parser": "^8.2.0",
118
124
  "autoprefixer": "^10.4.19",
@@ -133,7 +139,7 @@
133
139
  "storybook-addon-fetch-mock": "^2.0.0",
134
140
  "tailwindcss": "^3.4.3",
135
141
  "typescript": "~5.7.2",
136
- "vite": "^5.2.10",
142
+ "vite": "^6.0.3",
137
143
  "vite-plugin-dts": "^4.0.3",
138
144
  "vitest": "^2.0.1"
139
145
  }
@@ -5,7 +5,7 @@ import aggregatedData from './__mockData__/aggregated.json';
5
5
  import { Aggregate, type AggregateProps } from './aggregate';
6
6
  import { AGGREGATED_ENDPOINT, LAPIS_URL } from '../../constants';
7
7
  import { LapisUrlContext } from '../LapisUrlContext';
8
- import { expectInvalidAttributesErrorMessage } from '../shared/stories/expectInvalidAttributesErrorMessage';
8
+ import { expectInvalidAttributesErrorMessage } from '../shared/stories/expectErrorMessage';
9
9
 
10
10
  const meta: Meta<AggregateProps> = {
11
11
  title: 'Visualization/Aggregate',
@@ -51,7 +51,7 @@ export const Default: StoryObj<AggregateProps> = {
51
51
  args: {
52
52
  fields: ['division', 'host'],
53
53
  views: ['table'],
54
- filter: {
54
+ lapisFilter: {
55
55
  country: 'USA',
56
56
  },
57
57
  width: '100%',
@@ -16,13 +16,13 @@ import { ResizeContainer } from '../components/resize-container';
16
16
  import Tabs from '../components/tabs';
17
17
  import { useQuery } from '../useQuery';
18
18
 
19
- const viewSchema = z.literal(views.table);
20
- export type View = z.infer<typeof viewSchema>;
19
+ const aggregateViewSchema = z.literal(views.table);
20
+ export type AggregateView = z.infer<typeof aggregateViewSchema>;
21
21
 
22
22
  const aggregatePropsSchema = z.object({
23
- filter: lapisFilterSchema,
23
+ lapisFilter: lapisFilterSchema,
24
24
  fields: z.array(z.string().min(1)),
25
- views: z.array(viewSchema),
25
+ views: z.array(aggregateViewSchema),
26
26
  initialSortField: z.string(),
27
27
  initialSortDirection: z.union([z.literal('ascending'), z.literal('descending')]),
28
28
  pageSize: z.union([z.boolean(), z.number()]),
@@ -45,12 +45,15 @@ export const Aggregate: FunctionComponent<AggregateProps> = (componentProps) =>
45
45
  };
46
46
 
47
47
  export const AggregateInner: FunctionComponent<AggregateProps> = (componentProps) => {
48
- const { fields, filter, initialSortField, initialSortDirection } = componentProps;
48
+ const { fields, lapisFilter, initialSortField, initialSortDirection } = componentProps;
49
49
  const lapis = useContext(LapisUrlContext);
50
50
 
51
51
  const { data, error, isLoading } = useQuery(async () => {
52
- return queryAggregateData(filter, fields, lapis, { field: initialSortField, direction: initialSortDirection });
53
- }, [filter, fields, lapis]);
52
+ return queryAggregateData(lapisFilter, fields, lapis, {
53
+ field: initialSortField,
54
+ direction: initialSortDirection,
55
+ });
56
+ }, [lapisFilter, fields, lapis]);
54
57
 
55
58
  if (isLoading) {
56
59
  return <LoadingDisplay />;
@@ -73,7 +76,7 @@ type AggregatedDataTabsProps = {
73
76
  };
74
77
 
75
78
  const AggregatedDataTabs: FunctionComponent<AggregatedDataTabsProps> = ({ data, originalComponentProps }) => {
76
- const getTab = (view: View) => {
79
+ const getTab = (view: AggregateView) => {
77
80
  switch (view) {
78
81
  case 'table':
79
82
  return {
@@ -8,7 +8,7 @@ import { previewHandles } from '../../../.storybook/preview';
8
8
  import { LAPIS_URL } from '../../constants';
9
9
  import { LapisUrlContext } from '../LapisUrlContext';
10
10
  import { dateRangeOptionPresets } from './dateRangeOption';
11
- import { expectInvalidAttributesErrorMessage } from '../shared/stories/expectInvalidAttributesErrorMessage';
11
+ import { expectInvalidAttributesErrorMessage } from '../shared/stories/expectErrorMessage';
12
12
 
13
13
  const earliestDate = '1970-01-01';
14
14
 
@@ -54,7 +54,7 @@ const meta: Meta<DateRangeSelectorProps> = {
54
54
  dateRangeOptions: [dateRangeOptionPresets.lastMonth, dateRangeOptionPresets.allTimes, customDateRange],
55
55
  earliestDate,
56
56
  initialValue: dateRangeOptionPresets.lastMonth.label,
57
- dateColumn: 'aDateColumn',
57
+ lapisDateField: 'aDateColumn',
58
58
  width: '100%',
59
59
  initialDateFrom: undefined,
60
60
  initialDateTo: undefined,
@@ -66,15 +66,7 @@ export default meta;
66
66
  export const Primary: StoryObj<DateRangeSelectorProps> = {
67
67
  render: (args) => (
68
68
  <LapisUrlContext.Provider value={LAPIS_URL}>
69
- <DateRangeSelector
70
- dateRangeOptions={args.dateRangeOptions}
71
- earliestDate={args.earliestDate}
72
- initialValue={args.initialValue}
73
- initialDateFrom={args.initialDateFrom}
74
- initialDateTo={args.initialDateTo}
75
- width={args.width}
76
- dateColumn={args.dateColumn}
77
- />
69
+ <DateRangeSelector {...args} />
78
70
  </LapisUrlContext.Provider>
79
71
  ),
80
72
  };
@@ -226,7 +218,7 @@ export const WithNoDateColumn: StoryObj<DateRangeSelectorProps> = {
226
218
  ...Primary,
227
219
  args: {
228
220
  ...Primary.args,
229
- dateColumn: '',
221
+ lapisDateField: '',
230
222
  },
231
223
  play: async ({ canvasElement, step }) => {
232
224
  step('expect error message', async () => {
@@ -19,7 +19,7 @@ const dateRangeSelectorInnerPropsSchema = z.object({
19
19
  initialValue: z.string().optional(),
20
20
  initialDateFrom: z.string().date().optional(),
21
21
  initialDateTo: z.string().date().optional(),
22
- dateColumn: z.string().min(1),
22
+ lapisDateField: z.string().min(1),
23
23
  });
24
24
 
25
25
  const dateRangeSelectorPropsSchema = dateRangeSelectorInnerPropsSchema.extend({
@@ -46,7 +46,7 @@ export const DateRangeSelectorInner = ({
46
46
  dateRangeOptions,
47
47
  earliestDate = '1900-01-01',
48
48
  initialValue,
49
- dateColumn,
49
+ lapisDateField,
50
50
  initialDateFrom,
51
51
  initialDateTo,
52
52
  }: DateRangeSelectorInnerProps) => {
@@ -171,8 +171,8 @@ export const DateRangeSelectorInner = ({
171
171
  const dateTo = dateToPicker?.selectedDates[0];
172
172
 
173
173
  const detail = {
174
- ...(dateFrom !== undefined && { [`${dateColumn}From`]: toYYYYMMDD(dateFrom) }),
175
- ...(dateTo !== undefined && { [`${dateColumn}To`]: toYYYYMMDD(dateTo) }),
174
+ ...(dateFrom !== undefined && { [`${lapisDateField}From`]: toYYYYMMDD(dateFrom) }),
175
+ ...(dateTo !== undefined && { [`${lapisDateField}To`]: toYYYYMMDD(dateTo) }),
176
176
  };
177
177
 
178
178
  divRef.current?.dispatchEvent(
@@ -5,7 +5,7 @@ import { previewHandles } from '../../../.storybook/preview';
5
5
  import { AGGREGATED_ENDPOINT, LAPIS_URL } from '../../constants';
6
6
  import aggregatedData from '../../preact/lineageFilter/__mockData__/aggregated.json';
7
7
  import { LapisUrlContext } from '../LapisUrlContext';
8
- import { expectInvalidAttributesErrorMessage } from '../shared/stories/expectInvalidAttributesErrorMessage';
8
+ import { expectInvalidAttributesErrorMessage } from '../shared/stories/expectErrorMessage';
9
9
 
10
10
  const meta: Meta = {
11
11
  title: 'Input/LineageFilter',
@@ -5,7 +5,7 @@ import { LocationFilter, type LocationFilterProps } from './location-filter';
5
5
  import { previewHandles } from '../../../.storybook/preview';
6
6
  import { AGGREGATED_ENDPOINT, LAPIS_URL } from '../../constants';
7
7
  import { LapisUrlContext } from '../LapisUrlContext';
8
- import { expectInvalidAttributesErrorMessage } from '../shared/stories/expectInvalidAttributesErrorMessage';
8
+ import { expectInvalidAttributesErrorMessage } from '../shared/stories/expectErrorMessage';
9
9
 
10
10
  const meta: Meta<LocationFilterProps> = {
11
11
  title: 'Input/LocationFilter',
@@ -0,0 +1,83 @@
1
+ {
2
+ "data": [
3
+ {
4
+ "count": 1748,
5
+ "division": "Mecklenburg-Vorpommern"
6
+ },
7
+ {
8
+ "count": 10343,
9
+ "division": "Rheinland-Pfalz"
10
+ },
11
+ {
12
+ "count": 25459,
13
+ "division": "Saxony"
14
+ },
15
+ {
16
+ "count": 6198,
17
+ "division": "Niedersachsen"
18
+ },
19
+ {
20
+ "count": 3846,
21
+ "division": "Berlin"
22
+ },
23
+ {
24
+ "count": 7,
25
+ "division": "Germany"
26
+ },
27
+ {
28
+ "count": 3778,
29
+ "division": "Brandenburg"
30
+ },
31
+ {
32
+ "count": 1672,
33
+ "division": "Bremen"
34
+ },
35
+ {
36
+ "count": 4969,
37
+ "division": "Hesse"
38
+ },
39
+ {
40
+ "count": 3238,
41
+ "division": "Thuringia"
42
+ },
43
+ {
44
+ "count": 4747,
45
+ "division": "Saxony-Anhalt"
46
+ },
47
+ {
48
+ "count": 109800,
49
+ "division": null
50
+ },
51
+ {
52
+ "count": 4911,
53
+ "division": "Saarland"
54
+ },
55
+ {
56
+ "count": 50650,
57
+ "division": "Baden-Wuerttemberg"
58
+ },
59
+ {
60
+ "count": 50102,
61
+ "division": "North Rhine Westphalia"
62
+ },
63
+ {
64
+ "count": 9832,
65
+ "division": "Schleswig-Holstein"
66
+ },
67
+ {
68
+ "count": 28546,
69
+ "division": "Bavaria"
70
+ },
71
+ {
72
+ "count": 9633,
73
+ "division": "Hamburg"
74
+ }
75
+ ],
76
+ "info": {
77
+ "dataVersion": "1733676577",
78
+ "requestId": "7517dbd2-10ed-4a5a-8b2b-a6e08de55982",
79
+ "requestInfo": "sars_cov-2_nextstrain_open on lapis.cov-spectrum.org at 2024-12-09T16:14:08.190102574",
80
+ "reportTo": "Please report to https://github.com/GenSpectrum/LAPIS/issues in case you encounter any unexpected issues. Please include the request ID and the requestInfo in your report.",
81
+ "lapisVersion": "0.3.10"
82
+ }
83
+ }
@@ -0,0 +1,259 @@
1
+ {
2
+ "data": [
3
+ {
4
+ "count": 3,
5
+ "country": "Turkey"
6
+ },
7
+ {
8
+ "count": 966167,
9
+ "country": "United Kingdom"
10
+ },
11
+ {
12
+ "count": 1,
13
+ "country": "Netherlands"
14
+ },
15
+ {
16
+ "count": 138004,
17
+ "country": "Denmark"
18
+ },
19
+ {
20
+ "count": 2611,
21
+ "country": "Brazil"
22
+ },
23
+ {
24
+ "count": 4,
25
+ "country": "Côte d'Ivoire"
26
+ },
27
+ {
28
+ "count": 4,
29
+ "country": "Finland"
30
+ },
31
+ {
32
+ "count": 204,
33
+ "country": "Djibouti"
34
+ },
35
+ {
36
+ "count": 138,
37
+ "country": "China"
38
+ },
39
+ {
40
+ "count": 5904,
41
+ "country": "Iceland"
42
+ },
43
+ {
44
+ "count": 8,
45
+ "country": "Ireland"
46
+ },
47
+ {
48
+ "count": 180,
49
+ "country": "Malaysia"
50
+ },
51
+ {
52
+ "count": 855,
53
+ "country": "Kenya"
54
+ },
55
+ {
56
+ "count": 868,
57
+ "country": "South Africa"
58
+ },
59
+ {
60
+ "count": 329479,
61
+ "country": "Germany"
62
+ },
63
+ {
64
+ "count": 5,
65
+ "country": "Spain"
66
+ },
67
+ {
68
+ "count": 664,
69
+ "country": "Liechtenstein"
70
+ },
71
+ {
72
+ "count": 2,
73
+ "country": "Chile"
74
+ },
75
+ {
76
+ "count": 2,
77
+ "country": "Mali"
78
+ },
79
+ {
80
+ "count": 31,
81
+ "country": "South Korea"
82
+ },
83
+ {
84
+ "count": 13540,
85
+ "country": "Slovakia"
86
+ },
87
+ {
88
+ "count": 1,
89
+ "country": "Norway"
90
+ },
91
+ {
92
+ "count": 4949,
93
+ "country": "New Zealand"
94
+ },
95
+ {
96
+ "count": 354,
97
+ "country": "Laos"
98
+ },
99
+ {
100
+ "count": 5,
101
+ "country": "Saudi Arabia"
102
+ },
103
+ {
104
+ "count": 566,
105
+ "country": "Vietnam"
106
+ },
107
+ {
108
+ "count": 37,
109
+ "country": "Australia"
110
+ },
111
+ {
112
+ "count": 25,
113
+ "country": "Cameroon"
114
+ },
115
+ {
116
+ "count": 54,
117
+ "country": "Gambia"
118
+ },
119
+ {
120
+ "count": 1310,
121
+ "country": "Argentina"
122
+ },
123
+ {
124
+ "count": 548918,
125
+ "country": "USA"
126
+ },
127
+ {
128
+ "count": 4562,
129
+ "country": "Mexico"
130
+ },
131
+ {
132
+ "count": 28636,
133
+ "country": "Switzerland"
134
+ },
135
+ {
136
+ "count": 9,
137
+ "country": "Palau"
138
+ },
139
+ {
140
+ "count": 6,
141
+ "country": "Taiwan"
142
+ },
143
+ {
144
+ "count": 181,
145
+ "country": "Iraq"
146
+ },
147
+ {
148
+ "count": 7547,
149
+ "country": "France"
150
+ },
151
+ {
152
+ "count": 4536,
153
+ "country": "Japan"
154
+ },
155
+ {
156
+ "count": 1640,
157
+ "country": "Thailand"
158
+ },
159
+ {
160
+ "count": 59,
161
+ "country": "Colombia"
162
+ },
163
+ {
164
+ "count": 243,
165
+ "country": "India"
166
+ },
167
+ {
168
+ "count": 132,
169
+ "country": "Italy"
170
+ },
171
+ {
172
+ "count": 92,
173
+ "country": "Mongolia"
174
+ },
175
+ {
176
+ "count": 2,
177
+ "country": "Libya"
178
+ },
179
+ {
180
+ "count": 216,
181
+ "country": "Peru"
182
+ },
183
+ {
184
+ "count": 4,
185
+ "country": "Singapore"
186
+ },
187
+ {
188
+ "count": 25,
189
+ "country": "Myanmar"
190
+ },
191
+ {
192
+ "count": 395,
193
+ "country": "Bangladesh"
194
+ },
195
+ {
196
+ "count": 37,
197
+ "country": "Malawi"
198
+ },
199
+ {
200
+ "count": 3669,
201
+ "country": "Bahrain"
202
+ },
203
+ {
204
+ "count": 171,
205
+ "country": "Haiti"
206
+ },
207
+ {
208
+ "count": 40,
209
+ "country": "Palestine"
210
+ },
211
+ {
212
+ "count": 499,
213
+ "country": "Hong Kong"
214
+ },
215
+ {
216
+ "count": 19,
217
+ "country": "Austria"
218
+ },
219
+ {
220
+ "count": 9,
221
+ "country": "Jamaica"
222
+ },
223
+ {
224
+ "count": 83,
225
+ "country": "Russia"
226
+ },
227
+ {
228
+ "count": 197,
229
+ "country": "Seychelles"
230
+ },
231
+ {
232
+ "count": 20,
233
+ "country": "Nigeria"
234
+ },
235
+ {
236
+ "count": 6,
237
+ "country": "Canada"
238
+ },
239
+ {
240
+ "count": 208,
241
+ "country": "Kazakhstan"
242
+ },
243
+ {
244
+ "count": 34,
245
+ "country": "Benin"
246
+ },
247
+ {
248
+ "count": 113,
249
+ "country": "Pakistan"
250
+ }
251
+ ],
252
+ "info": {
253
+ "dataVersion": "1733676577",
254
+ "requestId": "91268a09-b192-42da-b7c6-bcfc72bba982",
255
+ "requestInfo": "sars_cov-2_nextstrain_open on lapis.cov-spectrum.org at 2024-12-09T15:45:35.460317204",
256
+ "reportTo": "Please report to https://github.com/GenSpectrum/LAPIS/issues in case you encounter any unexpected issues. Please include the request ID and the requestInfo in your report.",
257
+ "lapisVersion": "0.3.10"
258
+ }
259
+ }