@genspectrum/dashboard-components 1.11.1 → 1.13.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/README.md +0 -7
- package/custom-elements.json +6 -25
- package/dist/components.d.ts +24 -30
- package/dist/components.js +929 -742
- package/dist/components.js.map +1 -1
- package/dist/util.d.ts +40 -24
- package/package.json +1 -5
- package/src/lapisApi/lapisApi.ts +21 -1
- package/src/lapisApi/lapisTypes.ts +37 -0
- package/src/preact/components/annotated-mutation.tsx +2 -2
- package/src/preact/{mutationsOverTime/mutations-over-time-grid.tsx → components/features-over-time-grid.tsx} +45 -52
- package/src/preact/genomeViewer/genome-data-viewer.tsx +2 -2
- package/src/preact/mutationsOverTime/MutationOverTimeData.ts +6 -4
- package/src/preact/mutationsOverTime/__mockData__/aminoAcidMutationsByDay/aminoAcidMutations.json +5482 -0
- package/src/preact/mutationsOverTime/__mockData__/aminoAcidMutationsByDay/aminoAcidMutationsOverTime.json +5496 -0
- package/src/preact/mutationsOverTime/__mockData__/byWeek/mutationsOverTime.json +7100 -0
- package/src/preact/mutationsOverTime/__mockData__/byWeek/nucleotideMutations.json +10122 -0
- package/src/preact/mutationsOverTime/__mockData__/defaultMockData/mutationsOverTime.json +12646 -0
- package/src/preact/mutationsOverTime/__mockData__/defaultMockData/nucleotideMutations.json +12632 -0
- package/src/preact/mutationsOverTime/__mockData__/request1800s/mutationsOverTime.json +16 -0
- package/src/preact/mutationsOverTime/__mockData__/request1800s/nucleotideMutations.json +11 -0
- package/src/preact/mutationsOverTime/__mockData__/withDisplayMutations/mutationsOverTime.json +52 -0
- package/src/preact/mutationsOverTime/getFilteredMutationsOverTime.spec.ts +3 -3
- package/src/preact/mutationsOverTime/mutations-over-time-grid-tooltip.tsx +3 -6
- package/src/preact/mutationsOverTime/mutations-over-time.stories.tsx +199 -12
- package/src/preact/mutationsOverTime/mutations-over-time.tsx +30 -35
- package/src/preact/wastewater/mutationsOverTime/wastewater-mutations-over-time.tsx +30 -3
- package/src/query/queryDatesInDataset.ts +89 -0
- package/src/query/queryMutationsOverTime.spec.ts +526 -548
- package/src/query/queryMutationsOverTime.ts +22 -245
- package/src/query/queryQueriesOverTime.spec.ts +432 -0
- package/src/query/queryQueriesOverTime.ts +125 -0
- package/src/utilEntrypoint.ts +3 -1
- package/src/utils/mutations.spec.ts +6 -0
- package/src/utils/mutations.ts +1 -1
- package/src/utils/temporalClass.ts +4 -0
- package/src/web-components/visualization/gs-mutation-comparison.tsx +2 -2
- package/src/web-components/visualization/gs-mutations-over-time.spec-d.ts +0 -3
- package/src/web-components/visualization/gs-mutations-over-time.stories.ts +283 -17
- package/src/web-components/visualization/gs-mutations-over-time.tsx +0 -9
- package/standalone-bundle/dashboard-components.js +8935 -8780
- package/standalone-bundle/dashboard-components.js.map +1 -1
- package/dist/assets/mutationOverTimeWorker-CQQFRoK4.js.map +0 -1
- package/src/preact/mutationsOverTime/__mockData__/aminoAcidMutationsByDay.ts +0 -47170
- package/src/preact/mutationsOverTime/__mockData__/byWeek.ts +0 -54026
- package/src/preact/mutationsOverTime/__mockData__/defaultMockData.ts +0 -108385
- package/src/preact/mutationsOverTime/__mockData__/mockConversion.ts +0 -54
- package/src/preact/mutationsOverTime/__mockData__/noDataWhenNoMutationsAreInFilter.ts +0 -23
- package/src/preact/mutationsOverTime/__mockData__/noDataWhenThereAreNoDatesInFilter.ts +0 -23
- package/src/preact/mutationsOverTime/__mockData__/showsMessageWhenTooManyMutations.ts +0 -65527
- package/src/preact/mutationsOverTime/__mockData__/withDisplayMutations.ts +0 -352
- package/src/preact/mutationsOverTime/__mockData__/withGaps.ts +0 -298
- package/src/preact/mutationsOverTime/mutationOverTimeWorker.mock.ts +0 -33
- package/src/preact/mutationsOverTime/mutationOverTimeWorker.ts +0 -29
- package/src/preact/webWorkers/useWebWorker.ts +0 -74
- package/src/preact/webWorkers/workerFunction.ts +0 -30
- package/src/query/queryMutationsOverTimeNewEndpoint.spec.ts +0 -1179
- package/standalone-bundle/assets/mutationOverTimeWorker-DIpJukJC.js.map +0 -1
package/dist/components.js
CHANGED
|
@@ -352,6 +352,11 @@ const mutationLinkTemplateContext = createContext(
|
|
|
352
352
|
Symbol("mutation-link-template-context")
|
|
353
353
|
);
|
|
354
354
|
const referenceGenomeContext = createContext("reference-genome-context");
|
|
355
|
+
const lineage = z$2.object({
|
|
356
|
+
parents: z$2.array(z$2.string()).optional(),
|
|
357
|
+
aliases: z$2.array(z$2.string()).optional()
|
|
358
|
+
});
|
|
359
|
+
const lineageDefinitionResponseSchema = z$2.record(lineage);
|
|
355
360
|
const referenceGenomeResponse = z$2.object({
|
|
356
361
|
nucleotideSequences: z$2.array(
|
|
357
362
|
z$2.object({
|
|
@@ -413,7 +418,7 @@ z$2.object({
|
|
|
413
418
|
dateRanges: z$2.array(dateRange).optional(),
|
|
414
419
|
dateField: z$2.string().optional()
|
|
415
420
|
});
|
|
416
|
-
makeLapisResponse(
|
|
421
|
+
const mutationsOverTimeResponse = makeLapisResponse(
|
|
417
422
|
z$2.object({
|
|
418
423
|
mutations: z$2.array(z$2.string()),
|
|
419
424
|
dateRanges: z$2.array(dateRange),
|
|
@@ -424,7 +429,37 @@ makeLapisResponse(
|
|
|
424
429
|
coverage: z$2.number()
|
|
425
430
|
})
|
|
426
431
|
)
|
|
427
|
-
)
|
|
432
|
+
),
|
|
433
|
+
totalCountsByDateRange: z$2.array(z$2.number())
|
|
434
|
+
})
|
|
435
|
+
);
|
|
436
|
+
const queryDefinition = z$2.object({
|
|
437
|
+
displayLabel: z$2.string().optional(),
|
|
438
|
+
countQuery: z$2.string(),
|
|
439
|
+
coverageQuery: z$2.string()
|
|
440
|
+
});
|
|
441
|
+
z$2.object({
|
|
442
|
+
filters: z$2.record(filterValue),
|
|
443
|
+
queries: z$2.array(queryDefinition),
|
|
444
|
+
dateRanges: z$2.array(dateRange),
|
|
445
|
+
dateField: z$2.string(),
|
|
446
|
+
downloadAsFile: z$2.boolean().optional(),
|
|
447
|
+
downloadFileBasename: z$2.string().optional(),
|
|
448
|
+
compression: z$2.enum(["gzip", "none"]).optional()
|
|
449
|
+
});
|
|
450
|
+
makeLapisResponse(
|
|
451
|
+
z$2.object({
|
|
452
|
+
queries: z$2.array(z$2.string()),
|
|
453
|
+
dateRanges: z$2.array(dateRange),
|
|
454
|
+
data: z$2.array(
|
|
455
|
+
z$2.array(
|
|
456
|
+
z$2.object({
|
|
457
|
+
count: z$2.number(),
|
|
458
|
+
coverage: z$2.number()
|
|
459
|
+
})
|
|
460
|
+
)
|
|
461
|
+
),
|
|
462
|
+
totalCountsByDateRange: z$2.array(z$2.number())
|
|
428
463
|
})
|
|
429
464
|
);
|
|
430
465
|
const insertionCount = z$2.object({
|
|
@@ -455,11 +490,6 @@ const problemDetail = z$2.object({
|
|
|
455
490
|
const lapisError = z$2.object({
|
|
456
491
|
error: problemDetail
|
|
457
492
|
});
|
|
458
|
-
const lineage = z$2.object({
|
|
459
|
-
parents: z$2.array(z$2.string()).optional(),
|
|
460
|
-
aliases: z$2.array(z$2.string()).optional()
|
|
461
|
-
});
|
|
462
|
-
const lineageDefinitionResponseSchema = z$2.record(lineage);
|
|
463
493
|
class UnknownLapisError extends Error {
|
|
464
494
|
constructor(message, status, requestedData) {
|
|
465
495
|
super(message);
|
|
@@ -534,6 +564,21 @@ async function fetchSubstitutionsOrDeletions(lapisUrl, body, sequenceType, signa
|
|
|
534
564
|
);
|
|
535
565
|
return mutationsResponse.parse(await response.json());
|
|
536
566
|
}
|
|
567
|
+
async function fetchMutationsOverTime(lapisUrl, body, sequenceType, signal) {
|
|
568
|
+
const response = await callLapis(
|
|
569
|
+
mutationsOverTimeEndpoint(lapisUrl, sequenceType),
|
|
570
|
+
{
|
|
571
|
+
method: "POST",
|
|
572
|
+
headers: {
|
|
573
|
+
"Content-Type": "application/json"
|
|
574
|
+
},
|
|
575
|
+
body: JSON.stringify(body),
|
|
576
|
+
signal
|
|
577
|
+
},
|
|
578
|
+
`${sequenceType} mutations over time`
|
|
579
|
+
);
|
|
580
|
+
return mutationsOverTimeResponse.parse(await response.json());
|
|
581
|
+
}
|
|
537
582
|
async function fetchReferenceGenome(lapisUrl, signal) {
|
|
538
583
|
const response = await callLapis(
|
|
539
584
|
referenceGenomeEndpoint(lapisUrl),
|
|
@@ -615,6 +660,9 @@ const insertionsEndpoint = (lapisUrl, sequenceType) => {
|
|
|
615
660
|
const substitutionsOrDeletionsEndpoint = (lapisUrl, sequenceType) => {
|
|
616
661
|
return sequenceType === "amino acid" ? `${lapisUrl}/sample/aminoAcidMutations` : `${lapisUrl}/sample/nucleotideMutations`;
|
|
617
662
|
};
|
|
663
|
+
const mutationsOverTimeEndpoint = (lapisUrl, sequenceType) => {
|
|
664
|
+
return sequenceType === "amino acid" ? `${lapisUrl}/component/aminoAcidMutationsOverTime` : `${lapisUrl}/component/nucleotideMutationsOverTime`;
|
|
665
|
+
};
|
|
618
666
|
const referenceGenomeEndpoint = (lapisUrl) => `${lapisUrl}/sample/referenceGenome`;
|
|
619
667
|
const lineageDefinitionEndpoint = (lapisUrl, lapisField) => `${lapisUrl}/sample/lineageDefinition/${lapisField}`;
|
|
620
668
|
const UNINITIALIZED_SEQUENCE = "__uninitialized__";
|
|
@@ -876,83 +924,396 @@ function C$1(n3, t2) {
|
|
|
876
924
|
function D$2(n3, t2) {
|
|
877
925
|
return "function" == typeof t2 ? t2(n3) : t2;
|
|
878
926
|
}
|
|
879
|
-
|
|
880
|
-
const
|
|
881
|
-
|
|
882
|
-
|
|
883
|
-
|
|
884
|
-
|
|
885
|
-
|
|
886
|
-
|
|
887
|
-
|
|
927
|
+
function useDispatchFinishedLoadingEvent() {
|
|
928
|
+
const ref = A$1(null);
|
|
929
|
+
y2(() => {
|
|
930
|
+
if (ref.current === null) {
|
|
931
|
+
return;
|
|
932
|
+
}
|
|
933
|
+
ref.current.dispatchEvent(
|
|
934
|
+
new CustomEvent(gsEventNames.componentFinishedLoading, { bubbles: true, composed: true })
|
|
935
|
+
);
|
|
936
|
+
}, [ref]);
|
|
937
|
+
return ref;
|
|
938
|
+
}
|
|
939
|
+
const MinMaxRangeSlider = ({
|
|
940
|
+
min,
|
|
941
|
+
max,
|
|
942
|
+
setMin,
|
|
943
|
+
setMax,
|
|
944
|
+
onDrop,
|
|
945
|
+
rangeMin = 0,
|
|
946
|
+
rangeMax = 100,
|
|
947
|
+
step = 0.1
|
|
888
948
|
}) => {
|
|
889
|
-
|
|
890
|
-
|
|
891
|
-
|
|
892
|
-
|
|
893
|
-
|
|
894
|
-
|
|
949
|
+
const sliderColor = "#C6C6C6";
|
|
950
|
+
const rangeColor = "#387bbe";
|
|
951
|
+
const [zIndexTo, setZIndexTo] = d(0);
|
|
952
|
+
const onMinChange = (event) => {
|
|
953
|
+
const input = event.target;
|
|
954
|
+
const minValue = Number(input.value);
|
|
955
|
+
if (minValue > max) {
|
|
956
|
+
setMax(minValue);
|
|
957
|
+
setMin(minValue);
|
|
958
|
+
} else {
|
|
959
|
+
setMin(minValue);
|
|
960
|
+
}
|
|
961
|
+
};
|
|
962
|
+
const onMaxChange = (event) => {
|
|
963
|
+
const input = event.target;
|
|
964
|
+
const maxValue = Number(input.value);
|
|
965
|
+
if (maxValue <= 0) {
|
|
966
|
+
setZIndexTo(2);
|
|
967
|
+
} else {
|
|
968
|
+
setZIndexTo(0);
|
|
969
|
+
}
|
|
970
|
+
if (maxValue < min) {
|
|
971
|
+
setMin(maxValue);
|
|
972
|
+
setMax(maxValue);
|
|
973
|
+
} else {
|
|
974
|
+
setMax(maxValue);
|
|
975
|
+
}
|
|
976
|
+
};
|
|
977
|
+
const lowerBoundary = getGradientBoundary(min, rangeMin, rangeMax);
|
|
978
|
+
const upperBoundary = getGradientBoundary(max, rangeMin, rangeMax);
|
|
979
|
+
const background = `
|
|
980
|
+
linear-gradient(
|
|
981
|
+
to right,
|
|
982
|
+
${sliderColor} 0%,
|
|
983
|
+
${sliderColor} ${lowerBoundary}%,
|
|
984
|
+
${rangeColor} ${lowerBoundary}%,
|
|
985
|
+
${rangeColor} ${upperBoundary}%,
|
|
986
|
+
${sliderColor} ${upperBoundary}%,
|
|
987
|
+
${sliderColor} 100%)
|
|
988
|
+
`;
|
|
989
|
+
return /* @__PURE__ */ u$1("div", { className: "my-4 relative w-full h-full", children: [
|
|
990
|
+
/* @__PURE__ */ u$1(
|
|
991
|
+
"input",
|
|
992
|
+
{
|
|
993
|
+
id: "fromSlider",
|
|
994
|
+
type: "range",
|
|
995
|
+
value: min,
|
|
996
|
+
onInput: onMinChange,
|
|
997
|
+
onMouseUp: () => onDrop == null ? void 0 : onDrop(),
|
|
998
|
+
onTouchEnd: () => onDrop == null ? void 0 : onDrop(),
|
|
999
|
+
min: `${rangeMin}`,
|
|
1000
|
+
max: `${rangeMax}`,
|
|
1001
|
+
step,
|
|
1002
|
+
style: { background, zIndex: 1, height: 0 }
|
|
1003
|
+
}
|
|
1004
|
+
),
|
|
1005
|
+
/* @__PURE__ */ u$1(
|
|
1006
|
+
"input",
|
|
1007
|
+
{
|
|
1008
|
+
id: "toSlider",
|
|
1009
|
+
type: "range",
|
|
1010
|
+
value: max,
|
|
1011
|
+
min: `${rangeMin}`,
|
|
1012
|
+
max: `${rangeMax}`,
|
|
1013
|
+
step,
|
|
1014
|
+
onInput: onMaxChange,
|
|
1015
|
+
onMouseUp: () => onDrop == null ? void 0 : onDrop(),
|
|
1016
|
+
onTouchEnd: () => onDrop == null ? void 0 : onDrop(),
|
|
1017
|
+
style: { background, zIndex: zIndexTo }
|
|
1018
|
+
}
|
|
1019
|
+
)
|
|
895
1020
|
] });
|
|
896
1021
|
};
|
|
897
|
-
function
|
|
898
|
-
return
|
|
1022
|
+
function getGradientBoundary(x2, lowerBound, upperBound) {
|
|
1023
|
+
return (x2 - lowerBound) / (upperBound - lowerBound) * 100;
|
|
899
1024
|
}
|
|
900
|
-
const
|
|
901
|
-
|
|
902
|
-
|
|
903
|
-
|
|
904
|
-
|
|
905
|
-
|
|
906
|
-
|
|
907
|
-
|
|
1025
|
+
const TOOLTIP_BASE_STYLES = "z-10 w-max bg-white p-4 border border-gray-200 rounded-md";
|
|
1026
|
+
const Tooltip = ({ children, content, position = "bottom", tooltipStyle }) => {
|
|
1027
|
+
return /* @__PURE__ */ u$1("div", { className: `relative group`, children: [
|
|
1028
|
+
/* @__PURE__ */ u$1("div", { children }),
|
|
1029
|
+
/* @__PURE__ */ u$1(
|
|
1030
|
+
"div",
|
|
1031
|
+
{
|
|
1032
|
+
className: `absolute ${TOOLTIP_BASE_STYLES} invisible group-hover:visible ${getPositionCss(position)}`,
|
|
1033
|
+
style: tooltipStyle,
|
|
1034
|
+
children: content
|
|
1035
|
+
}
|
|
1036
|
+
)
|
|
908
1037
|
] });
|
|
909
1038
|
};
|
|
910
|
-
|
|
911
|
-
|
|
912
|
-
|
|
913
|
-
|
|
914
|
-
|
|
915
|
-
|
|
916
|
-
|
|
917
|
-
|
|
1039
|
+
function getPositionCss(position) {
|
|
1040
|
+
switch (position) {
|
|
1041
|
+
case "top":
|
|
1042
|
+
return "bottom-full translate-x-[-50%] left-1/2 mb-1";
|
|
1043
|
+
case "top-start":
|
|
1044
|
+
return "bottom-full mr-1 mb-1";
|
|
1045
|
+
case "top-end":
|
|
1046
|
+
return "bottom-full right-0 ml-1 mb-1";
|
|
1047
|
+
case "bottom":
|
|
1048
|
+
return "top-full translate-x-[-50%] left-1/2 mt-1";
|
|
1049
|
+
case "bottom-start":
|
|
1050
|
+
return "mr-1 mt-1";
|
|
1051
|
+
case "bottom-end":
|
|
1052
|
+
return "right-0 ml-1 mt-1";
|
|
1053
|
+
case "left":
|
|
1054
|
+
return "right-full translate-y-[-50%] top-1/2 mr-1";
|
|
1055
|
+
case "right":
|
|
1056
|
+
return "left-full translate-y-[-50%] top-1/2 ml-1";
|
|
1057
|
+
case void 0:
|
|
1058
|
+
return "";
|
|
1059
|
+
}
|
|
1060
|
+
}
|
|
1061
|
+
const ColorsRGB = {
|
|
1062
|
+
indigo: [51, 34, 136],
|
|
1063
|
+
green: [17, 119, 51],
|
|
1064
|
+
cyan: [136, 204, 238],
|
|
1065
|
+
teal: [68, 170, 153],
|
|
1066
|
+
olive: [153, 153, 51],
|
|
1067
|
+
sand: [221, 204, 119],
|
|
1068
|
+
rose: [204, 102, 119],
|
|
1069
|
+
wine: [136, 34, 85],
|
|
1070
|
+
purple: [170, 68, 153]
|
|
918
1071
|
};
|
|
919
|
-
const
|
|
920
|
-
|
|
1072
|
+
const singleGraphColorRGBAById = (id, alpha = 1) => {
|
|
1073
|
+
const keys = Object.keys(ColorsRGB);
|
|
1074
|
+
const key = keys[id % keys.length];
|
|
1075
|
+
return singleGraphColorRGBByName(key, alpha);
|
|
921
1076
|
};
|
|
922
|
-
const
|
|
923
|
-
return
|
|
1077
|
+
const singleGraphColorRGBByName = (name, alpha = 1) => {
|
|
1078
|
+
return `rgba(${ColorsRGB[name].join(",")},${alpha})`;
|
|
924
1079
|
};
|
|
925
|
-
const
|
|
926
|
-
|
|
927
|
-
|
|
928
|
-
|
|
929
|
-
|
|
930
|
-
|
|
931
|
-
|
|
932
|
-
|
|
933
|
-
|
|
934
|
-
|
|
935
|
-
|
|
936
|
-
|
|
937
|
-
|
|
938
|
-
|
|
939
|
-
|
|
940
|
-
|
|
941
|
-
|
|
942
|
-
|
|
943
|
-
|
|
944
|
-
|
|
945
|
-
|
|
946
|
-
|
|
947
|
-
|
|
948
|
-
|
|
949
|
-
|
|
950
|
-
|
|
951
|
-
|
|
952
|
-
|
|
953
|
-
|
|
954
|
-
|
|
955
|
-
|
|
1080
|
+
const MAX_TICK_NUMBER = 20;
|
|
1081
|
+
const MIN_TICK_NUMBER = 2;
|
|
1082
|
+
function getMaxTickNumber(fullWidth) {
|
|
1083
|
+
const baseValue = 1e3;
|
|
1084
|
+
const normalizedRatio = fullWidth / baseValue;
|
|
1085
|
+
const ticks = Math.round(MAX_TICK_NUMBER * normalizedRatio);
|
|
1086
|
+
return Math.max(MIN_TICK_NUMBER, Math.min(MAX_TICK_NUMBER, ticks));
|
|
1087
|
+
}
|
|
1088
|
+
function getTicks(zoomStart, zoomEnd, fullWidth) {
|
|
1089
|
+
let maxTickNumber = getMaxTickNumber(fullWidth);
|
|
1090
|
+
const length = zoomEnd - zoomStart;
|
|
1091
|
+
let minTickSize = length / maxTickNumber;
|
|
1092
|
+
if (minTickSize <= 1) {
|
|
1093
|
+
maxTickNumber = MIN_TICK_NUMBER;
|
|
1094
|
+
minTickSize = length / maxTickNumber;
|
|
1095
|
+
}
|
|
1096
|
+
if (minTickSize <= 1) {
|
|
1097
|
+
return [];
|
|
1098
|
+
}
|
|
1099
|
+
let maxTickSize = 10 ** Math.round(Math.log(minTickSize) / Math.log(10));
|
|
1100
|
+
const numTicks = Math.round(length / maxTickSize);
|
|
1101
|
+
if (numTicks > maxTickNumber) {
|
|
1102
|
+
if (numTicks > 2 * maxTickNumber) {
|
|
1103
|
+
maxTickSize = maxTickSize * 5;
|
|
1104
|
+
} else {
|
|
1105
|
+
maxTickSize = maxTickSize * 2;
|
|
1106
|
+
}
|
|
1107
|
+
}
|
|
1108
|
+
const ticks = [];
|
|
1109
|
+
const offset2 = Math.ceil(zoomStart / maxTickSize);
|
|
1110
|
+
ticks.push({ start: zoomStart, end: zoomStart + maxTickSize - zoomStart % maxTickSize });
|
|
1111
|
+
for (let i2 = 0; i2 <= numTicks; i2++) {
|
|
1112
|
+
const start = i2 * maxTickSize + offset2 * maxTickSize;
|
|
1113
|
+
if (start >= zoomEnd) {
|
|
1114
|
+
break;
|
|
1115
|
+
}
|
|
1116
|
+
const end = (i2 + 1) * maxTickSize + offset2 * maxTickSize;
|
|
1117
|
+
if (end > zoomEnd) {
|
|
1118
|
+
ticks.push({ start, end: zoomEnd });
|
|
1119
|
+
break;
|
|
1120
|
+
}
|
|
1121
|
+
ticks.push({ start, end });
|
|
1122
|
+
}
|
|
1123
|
+
return ticks;
|
|
1124
|
+
}
|
|
1125
|
+
const XAxis = (componentProps) => {
|
|
1126
|
+
const { zoomStart, zoomEnd, fullWidth } = componentProps;
|
|
1127
|
+
const ticks = T$1(() => getTicks(zoomStart, zoomEnd, fullWidth), [zoomStart, zoomEnd, fullWidth]);
|
|
1128
|
+
const visibleRegionLength = zoomEnd - zoomStart;
|
|
1129
|
+
const averageWidth = visibleRegionLength / ticks.length;
|
|
1130
|
+
return /* @__PURE__ */ u$1("div", { className: "h-6 relative", children: ticks.map((tick, idx) => {
|
|
1131
|
+
const width = tick.end - tick.start;
|
|
1132
|
+
const widthPercent = width / visibleRegionLength * 100;
|
|
1133
|
+
const leftPercent = (tick.start - zoomStart) / visibleRegionLength * 100;
|
|
1134
|
+
return /* @__PURE__ */ u$1(
|
|
1135
|
+
"div",
|
|
1136
|
+
{
|
|
1137
|
+
className: "absolute text-xs text-black px-1 hover:opacity-80 border-l border-r border-gray-400 border-t",
|
|
1138
|
+
style: {
|
|
1139
|
+
left: `calc(${leftPercent}% - 1px)`,
|
|
1140
|
+
width: `calc(${widthPercent}% - 1px)`
|
|
1141
|
+
},
|
|
1142
|
+
children: width >= averageWidth ? tick.start : ""
|
|
1143
|
+
},
|
|
1144
|
+
idx
|
|
1145
|
+
);
|
|
1146
|
+
}) });
|
|
1147
|
+
};
|
|
1148
|
+
function getTooltipPosition$1(cds_start, cds_end, genomeLength) {
|
|
1149
|
+
const tooltipY = cds_start + (cds_end - cds_start) / 2 < genomeLength / 2 ? "start" : "end";
|
|
1150
|
+
return `bottom-${tooltipY}`;
|
|
1151
|
+
}
|
|
1152
|
+
const TooltipContent = (componentProps) => {
|
|
1153
|
+
const { cds } = componentProps;
|
|
1154
|
+
const cdsLength = cds.positions.reduce((acc, pos) => acc + pos.end - pos.start, 0);
|
|
1155
|
+
const cdsCoordinates = cds.positions.map((pos) => `${pos.start}-${pos.end}`).join(", ");
|
|
1156
|
+
return /* @__PURE__ */ u$1(Fragment, { children: [
|
|
1157
|
+
/* @__PURE__ */ u$1("p", { children: /* @__PURE__ */ u$1("span", { className: "font-bold", children: cds.label }) }),
|
|
1158
|
+
/* @__PURE__ */ u$1("table", { children: /* @__PURE__ */ u$1("tbody", { children: [
|
|
1159
|
+
/* @__PURE__ */ u$1("tr", { children: [
|
|
1160
|
+
/* @__PURE__ */ u$1("th", { className: "font-medium px-2 text-right", children: "CDS Length" }),
|
|
1161
|
+
/* @__PURE__ */ u$1("td", { children: cdsLength })
|
|
1162
|
+
] }),
|
|
1163
|
+
/* @__PURE__ */ u$1("tr", { children: [
|
|
1164
|
+
/* @__PURE__ */ u$1("th", { className: "font-medium px-2 text-right", children: "CDS Coordinates" }),
|
|
1165
|
+
/* @__PURE__ */ u$1("td", { children: cdsCoordinates })
|
|
1166
|
+
] })
|
|
1167
|
+
] }) })
|
|
1168
|
+
] });
|
|
1169
|
+
};
|
|
1170
|
+
const CDSBars = (componentProps) => {
|
|
1171
|
+
const { gffData, zoomStart, zoomEnd } = componentProps;
|
|
1172
|
+
const visibleRegionLength = zoomEnd - zoomStart;
|
|
1173
|
+
return /* @__PURE__ */ u$1(Fragment, { children: gffData.map((data, listId) => /* @__PURE__ */ u$1("div", { className: "w-full h-6 relative", children: data.map((cds, idx) => /* @__PURE__ */ u$1(Fragment, { children: cds.positions.map((position, posIdx) => {
|
|
1174
|
+
const start = Math.max(position.start, zoomStart);
|
|
1175
|
+
const end = Math.min(position.end, zoomEnd);
|
|
1176
|
+
if (start >= end) {
|
|
1177
|
+
return null;
|
|
1178
|
+
}
|
|
1179
|
+
if (zoomEnd - zoomStart <= 2) {
|
|
1180
|
+
return null;
|
|
1181
|
+
}
|
|
1182
|
+
const widthPercent = (end - start) / visibleRegionLength * 100;
|
|
1183
|
+
const leftPercent = (start - zoomStart) / visibleRegionLength * 100;
|
|
1184
|
+
const tooltipPosition = getTooltipPosition$1(start, end, visibleRegionLength);
|
|
1185
|
+
return /* @__PURE__ */ u$1(
|
|
1186
|
+
Tooltip,
|
|
1187
|
+
{
|
|
1188
|
+
content: /* @__PURE__ */ u$1(TooltipContent, { cds }),
|
|
1189
|
+
position: tooltipPosition,
|
|
1190
|
+
tooltipStyle: { left: `${leftPercent}%` },
|
|
1191
|
+
children: /* @__PURE__ */ u$1(
|
|
1192
|
+
"div",
|
|
1193
|
+
{
|
|
1194
|
+
className: "absolute text-xs text-white rounded px-1 py-0.5 cursor-pointer hover:opacity-80 shadow-md",
|
|
1195
|
+
style: {
|
|
1196
|
+
left: `${leftPercent}%`,
|
|
1197
|
+
width: `${widthPercent}%`,
|
|
1198
|
+
backgroundColor: singleGraphColorRGBByName(cds.color),
|
|
1199
|
+
whiteSpace: "nowrap",
|
|
1200
|
+
overflow: "hidden",
|
|
1201
|
+
textOverflow: "ellipsis"
|
|
1202
|
+
},
|
|
1203
|
+
children: cds.label
|
|
1204
|
+
}
|
|
1205
|
+
)
|
|
1206
|
+
},
|
|
1207
|
+
`${idx}-${posIdx}`
|
|
1208
|
+
);
|
|
1209
|
+
}) }, idx)) }, listId)) });
|
|
1210
|
+
};
|
|
1211
|
+
const CDSPlot = (componentProps) => {
|
|
1212
|
+
const ref = useDispatchFinishedLoadingEvent();
|
|
1213
|
+
const { gffData, genomeLength, width } = componentProps;
|
|
1214
|
+
const [zoomStart, setZoomStart] = d(0);
|
|
1215
|
+
const [zoomEnd, setZoomEnd] = d(genomeLength);
|
|
1216
|
+
const updateZoomStart = (newStart) => {
|
|
1217
|
+
setZoomStart(newStart);
|
|
1218
|
+
};
|
|
1219
|
+
const updateZoomEnd = (newEnd) => {
|
|
1220
|
+
setZoomEnd(newEnd);
|
|
1221
|
+
};
|
|
1222
|
+
return /* @__PURE__ */ u$1("div", { ref, className: "p-4", children: [
|
|
1223
|
+
/* @__PURE__ */ u$1(CDSBars, { gffData, zoomStart, zoomEnd }),
|
|
1224
|
+
/* @__PURE__ */ u$1(XAxis, { zoomStart, zoomEnd, fullWidth: width }),
|
|
1225
|
+
/* @__PURE__ */ u$1("div", { className: "relative w-full h-5", children: /* @__PURE__ */ u$1(
|
|
1226
|
+
MinMaxRangeSlider,
|
|
1227
|
+
{
|
|
1228
|
+
min: zoomStart,
|
|
1229
|
+
max: zoomEnd,
|
|
1230
|
+
setMin: updateZoomStart,
|
|
1231
|
+
setMax: updateZoomEnd,
|
|
1232
|
+
rangeMin: 0,
|
|
1233
|
+
rangeMax: genomeLength,
|
|
1234
|
+
step: 1
|
|
1235
|
+
}
|
|
1236
|
+
) }),
|
|
1237
|
+
/* @__PURE__ */ u$1(XAxis, { zoomStart: 0, zoomEnd: genomeLength, fullWidth: width })
|
|
1238
|
+
] });
|
|
1239
|
+
};
|
|
1240
|
+
const Modal = (props) => {
|
|
1241
|
+
const modalRef = useModalRef();
|
|
1242
|
+
return /* @__PURE__ */ u$1(ButtonWithModalDialog, { ...props, modalRef });
|
|
1243
|
+
};
|
|
1244
|
+
const ButtonWithModalDialog = ({
|
|
1245
|
+
children,
|
|
1246
|
+
buttonClassName,
|
|
1247
|
+
modalContent,
|
|
1248
|
+
modalRef
|
|
1249
|
+
}) => {
|
|
1250
|
+
return /* @__PURE__ */ u$1(Fragment, { children: [
|
|
1251
|
+
/* @__PURE__ */ u$1("button", { type: "button", className: buttonClassName, onClick: () => {
|
|
1252
|
+
var _a;
|
|
1253
|
+
return (_a = modalRef.current) == null ? void 0 : _a.showModal();
|
|
1254
|
+
}, children }),
|
|
1255
|
+
/* @__PURE__ */ u$1(ModalDialog, { modalRef, children: modalContent })
|
|
1256
|
+
] });
|
|
1257
|
+
};
|
|
1258
|
+
function useModalRef() {
|
|
1259
|
+
return A$1(null);
|
|
1260
|
+
}
|
|
1261
|
+
const ModalDialog = ({ children, modalRef }) => {
|
|
1262
|
+
return /* @__PURE__ */ u$1("dialog", { ref: modalRef, className: "modal modal-bottom sm:modal-middle", children: [
|
|
1263
|
+
/* @__PURE__ */ u$1("div", { className: "modal-box sm:max-w-5xl", children: [
|
|
1264
|
+
/* @__PURE__ */ u$1("form", { method: "dialog", children: /* @__PURE__ */ u$1("button", { className: "btn btn-sm btn-circle btn-ghost absolute right-2 top-2", children: "✕" }) }),
|
|
1265
|
+
/* @__PURE__ */ u$1("div", { className: "flex flex-col", children }),
|
|
1266
|
+
/* @__PURE__ */ u$1("div", { className: "modal-action", children: /* @__PURE__ */ u$1("form", { method: "dialog", children: /* @__PURE__ */ u$1("button", { className: "float-right underline text-sm hover:text-blue-700 mr-2", children: "Close" }) }) })
|
|
1267
|
+
] }),
|
|
1268
|
+
/* @__PURE__ */ u$1("form", { method: "dialog", className: "modal-backdrop", children: /* @__PURE__ */ u$1("button", { children: "Helper to close when clicked outside" }) })
|
|
1269
|
+
] });
|
|
1270
|
+
};
|
|
1271
|
+
const Info = ({ children }) => {
|
|
1272
|
+
return /* @__PURE__ */ u$1("div", { className: "relative inline-flex", children: /* @__PURE__ */ u$1(Modal, { buttonClassName: "btn btn-xs", modalContent: children, children: "?" }) });
|
|
1273
|
+
};
|
|
1274
|
+
const InfoHeadline1 = ({ children }) => {
|
|
1275
|
+
return /* @__PURE__ */ u$1("h1", { className: "text-justify text-lg font-bold", children });
|
|
1276
|
+
};
|
|
1277
|
+
const InfoHeadline2 = ({ children }) => {
|
|
1278
|
+
return /* @__PURE__ */ u$1("h2", { className: "text-justify text-base font-bold mt-4", children });
|
|
1279
|
+
};
|
|
1280
|
+
const InfoParagraph = ({ children }) => {
|
|
1281
|
+
return /* @__PURE__ */ u$1("p", { className: "text-justify text-base font-normal my-1 text-wrap", children });
|
|
1282
|
+
};
|
|
1283
|
+
const InfoLink = ({ children, href }) => {
|
|
1284
|
+
return /* @__PURE__ */ u$1("a", { className: "text-blue-600 hover:text-blue-800", href, target: "_blank", rel: "noopener noreferrer", children });
|
|
1285
|
+
};
|
|
1286
|
+
const InfoComponentCode = ({ componentName, params, lapisUrl }) => {
|
|
1287
|
+
const componentCode = componentParametersToCode(componentName, params, lapisUrl);
|
|
1288
|
+
const codePenData = {
|
|
1289
|
+
title: "GenSpectrum dashboard component",
|
|
1290
|
+
html: generateFullExampleCode(componentCode, componentName),
|
|
1291
|
+
layout: "left",
|
|
1292
|
+
editors: "100"
|
|
1293
|
+
};
|
|
1294
|
+
return /* @__PURE__ */ u$1(Fragment, { children: [
|
|
1295
|
+
/* @__PURE__ */ u$1(InfoHeadline2, { children: "Use this component yourself" }),
|
|
1296
|
+
/* @__PURE__ */ u$1(InfoParagraph, { children: [
|
|
1297
|
+
"This component was created using the following parameters:",
|
|
1298
|
+
/* @__PURE__ */ u$1("div", { className: "p-4 border border-gray-200 rounded-lg overflow-x-auto", children: /* @__PURE__ */ u$1("pre", { children: /* @__PURE__ */ u$1("code", { children: componentCode }) }) })
|
|
1299
|
+
] }),
|
|
1300
|
+
/* @__PURE__ */ u$1(InfoParagraph, { children: [
|
|
1301
|
+
"You can add this component to your own website using the",
|
|
1302
|
+
" ",
|
|
1303
|
+
/* @__PURE__ */ u$1(InfoLink, { href: "https://github.com/GenSpectrum/dashboard-components", children: "GenSpectrum dashboard components library" }),
|
|
1304
|
+
" ",
|
|
1305
|
+
"and the code from above."
|
|
1306
|
+
] }),
|
|
1307
|
+
/* @__PURE__ */ u$1(InfoParagraph, { children: /* @__PURE__ */ u$1("form", { action: "https://codepen.io/pen/define", method: "POST", target: "_blank", children: [
|
|
1308
|
+
/* @__PURE__ */ u$1(
|
|
1309
|
+
"input",
|
|
1310
|
+
{
|
|
1311
|
+
type: "hidden",
|
|
1312
|
+
name: "data",
|
|
1313
|
+
value: JSON.stringify(codePenData).replace(/"/g, """).replace(/'/g, "'")
|
|
1314
|
+
}
|
|
1315
|
+
),
|
|
1316
|
+
/* @__PURE__ */ u$1("button", { className: "text-blue-600 hover:text-blue-800", type: "submit", children: "Click here to try it out on CodePen." })
|
|
956
1317
|
] }) })
|
|
957
1318
|
] });
|
|
958
1319
|
};
|
|
@@ -1122,9 +1483,146 @@ function ZodErrorDetails({ error }) {
|
|
|
1122
1483
|
}) })
|
|
1123
1484
|
] });
|
|
1124
1485
|
}
|
|
1125
|
-
function
|
|
1126
|
-
|
|
1127
|
-
|
|
1486
|
+
async function loadGff3(gff3Source, genomeLength) {
|
|
1487
|
+
try {
|
|
1488
|
+
new URL(gff3Source);
|
|
1489
|
+
} catch (_error) {
|
|
1490
|
+
throw new UserFacingError("Invalid gff3 source", `Invalid URL passed to parseGFF3: "${gff3Source}"`);
|
|
1491
|
+
}
|
|
1492
|
+
const response = await fetch(gff3Source);
|
|
1493
|
+
if (!response.ok) {
|
|
1494
|
+
throw new UserFacingError(
|
|
1495
|
+
"GFF3 download failed",
|
|
1496
|
+
`Server returned ${response.status} ${response.statusText} for ${response.url}`
|
|
1497
|
+
);
|
|
1498
|
+
}
|
|
1499
|
+
const content = await response.text();
|
|
1500
|
+
genomeLength ?? (genomeLength = loadGenomeLength(content));
|
|
1501
|
+
return { features: parseGFF3(content), length: genomeLength };
|
|
1502
|
+
}
|
|
1503
|
+
function parseGFF3(content) {
|
|
1504
|
+
const lines = content.split("\n");
|
|
1505
|
+
const map2 = {};
|
|
1506
|
+
const geneFeatures = getCDSMap(lines, "gene", map2);
|
|
1507
|
+
const cdsFeatures = getCDSMap(lines, "CDS", geneFeatures);
|
|
1508
|
+
return getNonOverlappingCDSFeatures(getSortedCDSFeatures(cdsFeatures));
|
|
1509
|
+
}
|
|
1510
|
+
function getAttributes(attributes) {
|
|
1511
|
+
const attrPairs = attributes.split(";");
|
|
1512
|
+
const attrMap = /* @__PURE__ */ new Map();
|
|
1513
|
+
for (const pair of attrPairs) {
|
|
1514
|
+
const pairTrimmed = pair.trim();
|
|
1515
|
+
const [key, value] = pairTrimmed.split("=");
|
|
1516
|
+
attrMap.set(key, value);
|
|
1517
|
+
}
|
|
1518
|
+
return attrMap;
|
|
1519
|
+
}
|
|
1520
|
+
function removeQuotes(input) {
|
|
1521
|
+
return input.replace(/^['"](.*)['"]$/, "$1");
|
|
1522
|
+
}
|
|
1523
|
+
function getCDSMap(lines, genome_type, geneMap) {
|
|
1524
|
+
for (const line of lines) {
|
|
1525
|
+
if (line.startsWith("#") || line.trim() === "") {
|
|
1526
|
+
continue;
|
|
1527
|
+
}
|
|
1528
|
+
const fields = line.split(" ");
|
|
1529
|
+
if (fields.length < 9) {
|
|
1530
|
+
throw new UserFacingError("Invalid gff3 source", `Gff3 line has less than 9 fields: "${line}"`);
|
|
1531
|
+
}
|
|
1532
|
+
const [, , type, startStr, endStr, , , , attributes] = fields;
|
|
1533
|
+
if (removeQuotes(type.toLowerCase()) !== genome_type.toLowerCase()) {
|
|
1534
|
+
continue;
|
|
1535
|
+
}
|
|
1536
|
+
const start = parseInt(startStr, 10);
|
|
1537
|
+
const end = parseInt(endStr, 10);
|
|
1538
|
+
if (isNaN(start) || isNaN(end)) {
|
|
1539
|
+
throw new UserFacingError("Invalid gff3 source", `Invalid start or end position: "${line}"`);
|
|
1540
|
+
}
|
|
1541
|
+
const attrPairs = getAttributes(attributes);
|
|
1542
|
+
const labelAttribute = attrPairs.get("Name") ?? attrPairs.get("gene") ?? attrPairs.get("gene_name");
|
|
1543
|
+
if (!labelAttribute) {
|
|
1544
|
+
throw new UserFacingError(
|
|
1545
|
+
"Invalid gff3 source",
|
|
1546
|
+
`No label found for feature: "${line}", must contain label in Name, gene, or gene_name attribute`
|
|
1547
|
+
);
|
|
1548
|
+
}
|
|
1549
|
+
const label = removeQuotes(labelAttribute);
|
|
1550
|
+
const id = removeQuotes(attrPairs.get("ID") ?? labelAttribute);
|
|
1551
|
+
const parentAttribute = attrPairs.get("Parent");
|
|
1552
|
+
if (parentAttribute) {
|
|
1553
|
+
const parent = removeQuotes(parentAttribute);
|
|
1554
|
+
if (parent && parent in geneMap) {
|
|
1555
|
+
delete geneMap[parent];
|
|
1556
|
+
}
|
|
1557
|
+
}
|
|
1558
|
+
if (id in geneMap) {
|
|
1559
|
+
geneMap[id].positions.push({ start, end });
|
|
1560
|
+
} else {
|
|
1561
|
+
geneMap[id] = { positions: [{ start, end }], label };
|
|
1562
|
+
}
|
|
1563
|
+
}
|
|
1564
|
+
return geneMap;
|
|
1565
|
+
}
|
|
1566
|
+
function getSortedCDSFeatures(cdsMap) {
|
|
1567
|
+
const mapValues = Object.values(cdsMap);
|
|
1568
|
+
mapValues.forEach((feature) => {
|
|
1569
|
+
feature.positions.sort((a2, b2) => a2.start - b2.start);
|
|
1570
|
+
});
|
|
1571
|
+
mapValues.sort((a2, b2) => {
|
|
1572
|
+
return a2.positions[0].start - b2.positions[0].start;
|
|
1573
|
+
});
|
|
1574
|
+
const GraphColorList = Object.keys(ColorsRGB);
|
|
1575
|
+
const colorIndex = mapValues[0].label[0].toUpperCase().charCodeAt(0);
|
|
1576
|
+
const cdsFeatures = mapValues.map((value, index) => ({
|
|
1577
|
+
positions: value.positions,
|
|
1578
|
+
label: value.label,
|
|
1579
|
+
color: GraphColorList[(colorIndex + index) % GraphColorList.length]
|
|
1580
|
+
}));
|
|
1581
|
+
return cdsFeatures;
|
|
1582
|
+
}
|
|
1583
|
+
function getNonOverlappingCDSFeatures(cdsFeatures) {
|
|
1584
|
+
const nonOverlappingCDSFeatures = [];
|
|
1585
|
+
for (const cdsFeature of cdsFeatures) {
|
|
1586
|
+
let added = false;
|
|
1587
|
+
for (const cdsList of nonOverlappingCDSFeatures) {
|
|
1588
|
+
const lastCds = cdsList[cdsList.length - 1];
|
|
1589
|
+
if (cdsFeature.positions[0].start > lastCds.positions[lastCds.positions.length - 1].end) {
|
|
1590
|
+
cdsList.push(cdsFeature);
|
|
1591
|
+
added = true;
|
|
1592
|
+
break;
|
|
1593
|
+
}
|
|
1594
|
+
}
|
|
1595
|
+
if (!added) {
|
|
1596
|
+
nonOverlappingCDSFeatures.push([cdsFeature]);
|
|
1597
|
+
}
|
|
1598
|
+
}
|
|
1599
|
+
return nonOverlappingCDSFeatures;
|
|
1600
|
+
}
|
|
1601
|
+
function loadGenomeLength(content) {
|
|
1602
|
+
const lines = content.split("\n");
|
|
1603
|
+
for (const line of lines) {
|
|
1604
|
+
if (!line.startsWith("#")) {
|
|
1605
|
+
continue;
|
|
1606
|
+
}
|
|
1607
|
+
const fields = line.split(" ");
|
|
1608
|
+
if (fields[0] === "##sequence-region") {
|
|
1609
|
+
if (fields.length < 3) {
|
|
1610
|
+
throw new UserFacingError("Invalid gff3 source", `No length found in sequence-region: "${line}"`);
|
|
1611
|
+
}
|
|
1612
|
+
const start = fields.at(-2);
|
|
1613
|
+
const end = fields.at(-1);
|
|
1614
|
+
const length = parseInt(end, 10) - parseInt(start, 10) + 1;
|
|
1615
|
+
if (isNaN(length)) {
|
|
1616
|
+
throw new UserFacingError("Invalid gff3 source", `No length found in sequence-region: "${line}"`);
|
|
1617
|
+
}
|
|
1618
|
+
return length;
|
|
1619
|
+
}
|
|
1620
|
+
}
|
|
1621
|
+
throw new UserFacingError("Invalid gff3 source", `No length found in sequence-region`);
|
|
1622
|
+
}
|
|
1623
|
+
function g(n3, t2) {
|
|
1624
|
+
for (var e2 in t2) n3[e2] = t2[e2];
|
|
1625
|
+
return n3;
|
|
1128
1626
|
}
|
|
1129
1627
|
function E(n3, t2) {
|
|
1130
1628
|
for (var e2 in n3) if ("__source" !== e2 && !(e2 in t2)) return true;
|
|
@@ -1443,506 +1941,56 @@ const ErrorBoundary = ({
|
|
|
1443
1941
|
if (internalError) {
|
|
1444
1942
|
return /* @__PURE__ */ u$1(ResizeContainer, { size, children: /* @__PURE__ */ u$1(ErrorDisplay, { error: internalError, resetError, layout }) });
|
|
1445
1943
|
}
|
|
1446
|
-
if (componentPropsParseError !== void 0) {
|
|
1447
|
-
return /* @__PURE__ */ u$1(ResizeContainer, { size, children: /* @__PURE__ */ u$1(ErrorDisplay, { error: componentPropsParseError, layout }) });
|
|
1448
|
-
}
|
|
1449
|
-
return /* @__PURE__ */ u$1(Fragment, { children });
|
|
1450
|
-
};
|
|
1451
|
-
function useCheckComponentProps(schema, componentProps) {
|
|
1452
|
-
return T$1(() => {
|
|
1453
|
-
const parseResult = schema.safeParse(componentProps);
|
|
1454
|
-
if (parseResult.success) {
|
|
1455
|
-
return void 0;
|
|
1456
|
-
}
|
|
1457
|
-
return new InvalidPropsError(parseResult.error, componentProps);
|
|
1458
|
-
}, [componentProps, schema]);
|
|
1459
|
-
}
|
|
1460
|
-
const LoadingDisplay = () => {
|
|
1461
|
-
return /* @__PURE__ */ u$1(
|
|
1462
|
-
"div",
|
|
1463
|
-
{
|
|
1464
|
-
"aria-label": "Loading",
|
|
1465
|
-
className: "h-full w-full border-2 border-gray-100 rounded-md flex justify-center items-center",
|
|
1466
|
-
children: /* @__PURE__ */ u$1("div", { className: "loading loading-spinner loading-md text-neutral-500" })
|
|
1467
|
-
}
|
|
1468
|
-
);
|
|
1469
|
-
};
|
|
1470
|
-
function useQuery(fetchDataCallback, dependencies) {
|
|
1471
|
-
const [data, setData] = d(null);
|
|
1472
|
-
const [error, setError] = d(null);
|
|
1473
|
-
const [isLoading, setIsLoading] = d(true);
|
|
1474
|
-
y2(() => {
|
|
1475
|
-
const fetchData = async () => {
|
|
1476
|
-
setIsLoading(true);
|
|
1477
|
-
try {
|
|
1478
|
-
const result = await fetchDataCallback();
|
|
1479
|
-
setData(result);
|
|
1480
|
-
setError(null);
|
|
1481
|
-
} catch (error2) {
|
|
1482
|
-
setError(error2);
|
|
1483
|
-
} finally {
|
|
1484
|
-
setIsLoading(false);
|
|
1485
|
-
}
|
|
1486
|
-
};
|
|
1487
|
-
void fetchData();
|
|
1488
|
-
}, [JSON.stringify(dependencies)]);
|
|
1489
|
-
if (isLoading) {
|
|
1490
|
-
return { isLoading: true };
|
|
1491
|
-
}
|
|
1492
|
-
if (error !== null) {
|
|
1493
|
-
return { error, isLoading: false };
|
|
1494
|
-
}
|
|
1495
|
-
return { data, error: null, isLoading: false };
|
|
1496
|
-
}
|
|
1497
|
-
function useDispatchFinishedLoadingEvent() {
|
|
1498
|
-
const ref = A$1(null);
|
|
1499
|
-
y2(() => {
|
|
1500
|
-
if (ref.current === null) {
|
|
1501
|
-
return;
|
|
1502
|
-
}
|
|
1503
|
-
ref.current.dispatchEvent(
|
|
1504
|
-
new CustomEvent(gsEventNames.componentFinishedLoading, { bubbles: true, composed: true })
|
|
1505
|
-
);
|
|
1506
|
-
}, [ref]);
|
|
1507
|
-
return ref;
|
|
1508
|
-
}
|
|
1509
|
-
const MinMaxRangeSlider = ({
|
|
1510
|
-
min,
|
|
1511
|
-
max,
|
|
1512
|
-
setMin,
|
|
1513
|
-
setMax,
|
|
1514
|
-
onDrop,
|
|
1515
|
-
rangeMin = 0,
|
|
1516
|
-
rangeMax = 100,
|
|
1517
|
-
step = 0.1
|
|
1518
|
-
}) => {
|
|
1519
|
-
const sliderColor = "#C6C6C6";
|
|
1520
|
-
const rangeColor = "#387bbe";
|
|
1521
|
-
const [zIndexTo, setZIndexTo] = d(0);
|
|
1522
|
-
const onMinChange = (event) => {
|
|
1523
|
-
const input = event.target;
|
|
1524
|
-
const minValue = Number(input.value);
|
|
1525
|
-
if (minValue > max) {
|
|
1526
|
-
setMax(minValue);
|
|
1527
|
-
setMin(minValue);
|
|
1528
|
-
} else {
|
|
1529
|
-
setMin(minValue);
|
|
1530
|
-
}
|
|
1531
|
-
};
|
|
1532
|
-
const onMaxChange = (event) => {
|
|
1533
|
-
const input = event.target;
|
|
1534
|
-
const maxValue = Number(input.value);
|
|
1535
|
-
if (maxValue <= 0) {
|
|
1536
|
-
setZIndexTo(2);
|
|
1537
|
-
} else {
|
|
1538
|
-
setZIndexTo(0);
|
|
1539
|
-
}
|
|
1540
|
-
if (maxValue < min) {
|
|
1541
|
-
setMin(maxValue);
|
|
1542
|
-
setMax(maxValue);
|
|
1543
|
-
} else {
|
|
1544
|
-
setMax(maxValue);
|
|
1545
|
-
}
|
|
1546
|
-
};
|
|
1547
|
-
const lowerBoundary = getGradientBoundary(min, rangeMin, rangeMax);
|
|
1548
|
-
const upperBoundary = getGradientBoundary(max, rangeMin, rangeMax);
|
|
1549
|
-
const background = `
|
|
1550
|
-
linear-gradient(
|
|
1551
|
-
to right,
|
|
1552
|
-
${sliderColor} 0%,
|
|
1553
|
-
${sliderColor} ${lowerBoundary}%,
|
|
1554
|
-
${rangeColor} ${lowerBoundary}%,
|
|
1555
|
-
${rangeColor} ${upperBoundary}%,
|
|
1556
|
-
${sliderColor} ${upperBoundary}%,
|
|
1557
|
-
${sliderColor} 100%)
|
|
1558
|
-
`;
|
|
1559
|
-
return /* @__PURE__ */ u$1("div", { className: "my-4 relative w-full h-full", children: [
|
|
1560
|
-
/* @__PURE__ */ u$1(
|
|
1561
|
-
"input",
|
|
1562
|
-
{
|
|
1563
|
-
id: "fromSlider",
|
|
1564
|
-
type: "range",
|
|
1565
|
-
value: min,
|
|
1566
|
-
onInput: onMinChange,
|
|
1567
|
-
onMouseUp: () => onDrop == null ? void 0 : onDrop(),
|
|
1568
|
-
onTouchEnd: () => onDrop == null ? void 0 : onDrop(),
|
|
1569
|
-
min: `${rangeMin}`,
|
|
1570
|
-
max: `${rangeMax}`,
|
|
1571
|
-
step,
|
|
1572
|
-
style: { background, zIndex: 1, height: 0 }
|
|
1573
|
-
}
|
|
1574
|
-
),
|
|
1575
|
-
/* @__PURE__ */ u$1(
|
|
1576
|
-
"input",
|
|
1577
|
-
{
|
|
1578
|
-
id: "toSlider",
|
|
1579
|
-
type: "range",
|
|
1580
|
-
value: max,
|
|
1581
|
-
min: `${rangeMin}`,
|
|
1582
|
-
max: `${rangeMax}`,
|
|
1583
|
-
step,
|
|
1584
|
-
onInput: onMaxChange,
|
|
1585
|
-
onMouseUp: () => onDrop == null ? void 0 : onDrop(),
|
|
1586
|
-
onTouchEnd: () => onDrop == null ? void 0 : onDrop(),
|
|
1587
|
-
style: { background, zIndex: zIndexTo }
|
|
1588
|
-
}
|
|
1589
|
-
)
|
|
1590
|
-
] });
|
|
1591
|
-
};
|
|
1592
|
-
function getGradientBoundary(x2, lowerBound, upperBound) {
|
|
1593
|
-
return (x2 - lowerBound) / (upperBound - lowerBound) * 100;
|
|
1594
|
-
}
|
|
1595
|
-
const TOOLTIP_BASE_STYLES = "z-10 w-max bg-white p-4 border border-gray-200 rounded-md";
|
|
1596
|
-
const Tooltip = ({ children, content, position = "bottom", tooltipStyle }) => {
|
|
1597
|
-
return /* @__PURE__ */ u$1("div", { className: `relative group`, children: [
|
|
1598
|
-
/* @__PURE__ */ u$1("div", { children }),
|
|
1599
|
-
/* @__PURE__ */ u$1(
|
|
1600
|
-
"div",
|
|
1601
|
-
{
|
|
1602
|
-
className: `absolute ${TOOLTIP_BASE_STYLES} invisible group-hover:visible ${getPositionCss(position)}`,
|
|
1603
|
-
style: tooltipStyle,
|
|
1604
|
-
children: content
|
|
1605
|
-
}
|
|
1606
|
-
)
|
|
1607
|
-
] });
|
|
1608
|
-
};
|
|
1609
|
-
function getPositionCss(position) {
|
|
1610
|
-
switch (position) {
|
|
1611
|
-
case "top":
|
|
1612
|
-
return "bottom-full translate-x-[-50%] left-1/2 mb-1";
|
|
1613
|
-
case "top-start":
|
|
1614
|
-
return "bottom-full mr-1 mb-1";
|
|
1615
|
-
case "top-end":
|
|
1616
|
-
return "bottom-full right-0 ml-1 mb-1";
|
|
1617
|
-
case "bottom":
|
|
1618
|
-
return "top-full translate-x-[-50%] left-1/2 mt-1";
|
|
1619
|
-
case "bottom-start":
|
|
1620
|
-
return "mr-1 mt-1";
|
|
1621
|
-
case "bottom-end":
|
|
1622
|
-
return "right-0 ml-1 mt-1";
|
|
1623
|
-
case "left":
|
|
1624
|
-
return "right-full translate-y-[-50%] top-1/2 mr-1";
|
|
1625
|
-
case "right":
|
|
1626
|
-
return "left-full translate-y-[-50%] top-1/2 ml-1";
|
|
1627
|
-
case void 0:
|
|
1628
|
-
return "";
|
|
1629
|
-
}
|
|
1630
|
-
}
|
|
1631
|
-
const ColorsRGB = {
|
|
1632
|
-
indigo: [51, 34, 136],
|
|
1633
|
-
green: [17, 119, 51],
|
|
1634
|
-
cyan: [136, 204, 238],
|
|
1635
|
-
teal: [68, 170, 153],
|
|
1636
|
-
olive: [153, 153, 51],
|
|
1637
|
-
sand: [221, 204, 119],
|
|
1638
|
-
rose: [204, 102, 119],
|
|
1639
|
-
wine: [136, 34, 85],
|
|
1640
|
-
purple: [170, 68, 153]
|
|
1641
|
-
};
|
|
1642
|
-
const singleGraphColorRGBAById = (id, alpha = 1) => {
|
|
1643
|
-
const keys = Object.keys(ColorsRGB);
|
|
1644
|
-
const key = keys[id % keys.length];
|
|
1645
|
-
return singleGraphColorRGBByName(key, alpha);
|
|
1646
|
-
};
|
|
1647
|
-
const singleGraphColorRGBByName = (name, alpha = 1) => {
|
|
1648
|
-
return `rgba(${ColorsRGB[name].join(",")},${alpha})`;
|
|
1649
|
-
};
|
|
1650
|
-
const MAX_TICK_NUMBER = 20;
|
|
1651
|
-
const MIN_TICK_NUMBER = 2;
|
|
1652
|
-
function getMaxTickNumber(fullWidth) {
|
|
1653
|
-
const baseValue = 1e3;
|
|
1654
|
-
const normalizedRatio = fullWidth / baseValue;
|
|
1655
|
-
const ticks = Math.round(MAX_TICK_NUMBER * normalizedRatio);
|
|
1656
|
-
return Math.max(MIN_TICK_NUMBER, Math.min(MAX_TICK_NUMBER, ticks));
|
|
1657
|
-
}
|
|
1658
|
-
function getTicks(zoomStart, zoomEnd, fullWidth) {
|
|
1659
|
-
let maxTickNumber = getMaxTickNumber(fullWidth);
|
|
1660
|
-
const length = zoomEnd - zoomStart;
|
|
1661
|
-
let minTickSize = length / maxTickNumber;
|
|
1662
|
-
if (minTickSize <= 1) {
|
|
1663
|
-
maxTickNumber = MIN_TICK_NUMBER;
|
|
1664
|
-
minTickSize = length / maxTickNumber;
|
|
1665
|
-
}
|
|
1666
|
-
if (minTickSize <= 1) {
|
|
1667
|
-
return [];
|
|
1668
|
-
}
|
|
1669
|
-
let maxTickSize = 10 ** Math.round(Math.log(minTickSize) / Math.log(10));
|
|
1670
|
-
const numTicks = Math.round(length / maxTickSize);
|
|
1671
|
-
if (numTicks > maxTickNumber) {
|
|
1672
|
-
if (numTicks > 2 * maxTickNumber) {
|
|
1673
|
-
maxTickSize = maxTickSize * 5;
|
|
1674
|
-
} else {
|
|
1675
|
-
maxTickSize = maxTickSize * 2;
|
|
1676
|
-
}
|
|
1677
|
-
}
|
|
1678
|
-
const ticks = [];
|
|
1679
|
-
const offset2 = Math.ceil(zoomStart / maxTickSize);
|
|
1680
|
-
ticks.push({ start: zoomStart, end: zoomStart + maxTickSize - zoomStart % maxTickSize });
|
|
1681
|
-
for (let i2 = 0; i2 <= numTicks; i2++) {
|
|
1682
|
-
const start = i2 * maxTickSize + offset2 * maxTickSize;
|
|
1683
|
-
if (start >= zoomEnd) {
|
|
1684
|
-
break;
|
|
1685
|
-
}
|
|
1686
|
-
const end = (i2 + 1) * maxTickSize + offset2 * maxTickSize;
|
|
1687
|
-
if (end > zoomEnd) {
|
|
1688
|
-
ticks.push({ start, end: zoomEnd });
|
|
1689
|
-
break;
|
|
1690
|
-
}
|
|
1691
|
-
ticks.push({ start, end });
|
|
1692
|
-
}
|
|
1693
|
-
return ticks;
|
|
1694
|
-
}
|
|
1695
|
-
const XAxis = (componentProps) => {
|
|
1696
|
-
const { zoomStart, zoomEnd, fullWidth } = componentProps;
|
|
1697
|
-
const ticks = T$1(() => getTicks(zoomStart, zoomEnd, fullWidth), [zoomStart, zoomEnd, fullWidth]);
|
|
1698
|
-
const visibleRegionLength = zoomEnd - zoomStart;
|
|
1699
|
-
const averageWidth = visibleRegionLength / ticks.length;
|
|
1700
|
-
return /* @__PURE__ */ u$1("div", { className: "h-6 relative", children: ticks.map((tick, idx) => {
|
|
1701
|
-
const width = tick.end - tick.start;
|
|
1702
|
-
const widthPercent = width / visibleRegionLength * 100;
|
|
1703
|
-
const leftPercent = (tick.start - zoomStart) / visibleRegionLength * 100;
|
|
1704
|
-
return /* @__PURE__ */ u$1(
|
|
1705
|
-
"div",
|
|
1706
|
-
{
|
|
1707
|
-
className: "absolute text-xs text-black px-1 hover:opacity-80 border-l border-r border-gray-400 border-t",
|
|
1708
|
-
style: {
|
|
1709
|
-
left: `calc(${leftPercent}% - 1px)`,
|
|
1710
|
-
width: `calc(${widthPercent}% - 1px)`
|
|
1711
|
-
},
|
|
1712
|
-
children: width >= averageWidth ? tick.start : ""
|
|
1713
|
-
},
|
|
1714
|
-
idx
|
|
1715
|
-
);
|
|
1716
|
-
}) });
|
|
1717
|
-
};
|
|
1718
|
-
function getTooltipPosition$1(cds_start, cds_end, genomeLength) {
|
|
1719
|
-
const tooltipY = cds_start + (cds_end - cds_start) / 2 < genomeLength / 2 ? "start" : "end";
|
|
1720
|
-
return `bottom-${tooltipY}`;
|
|
1721
|
-
}
|
|
1722
|
-
const TooltipContent = (componentProps) => {
|
|
1723
|
-
const { cds } = componentProps;
|
|
1724
|
-
const cdsLength = cds.positions.reduce((acc, pos) => acc + pos.end - pos.start, 0);
|
|
1725
|
-
const cdsCoordinates = cds.positions.map((pos) => `${pos.start}-${pos.end}`).join(", ");
|
|
1726
|
-
return /* @__PURE__ */ u$1(Fragment, { children: [
|
|
1727
|
-
/* @__PURE__ */ u$1("p", { children: /* @__PURE__ */ u$1("span", { className: "font-bold", children: cds.label }) }),
|
|
1728
|
-
/* @__PURE__ */ u$1("table", { children: /* @__PURE__ */ u$1("tbody", { children: [
|
|
1729
|
-
/* @__PURE__ */ u$1("tr", { children: [
|
|
1730
|
-
/* @__PURE__ */ u$1("th", { className: "font-medium px-2 text-right", children: "CDS Length" }),
|
|
1731
|
-
/* @__PURE__ */ u$1("td", { children: cdsLength })
|
|
1732
|
-
] }),
|
|
1733
|
-
/* @__PURE__ */ u$1("tr", { children: [
|
|
1734
|
-
/* @__PURE__ */ u$1("th", { className: "font-medium px-2 text-right", children: "CDS Coordinates" }),
|
|
1735
|
-
/* @__PURE__ */ u$1("td", { children: cdsCoordinates })
|
|
1736
|
-
] })
|
|
1737
|
-
] }) })
|
|
1738
|
-
] });
|
|
1739
|
-
};
|
|
1740
|
-
const CDSBars = (componentProps) => {
|
|
1741
|
-
const { gffData, zoomStart, zoomEnd } = componentProps;
|
|
1742
|
-
const visibleRegionLength = zoomEnd - zoomStart;
|
|
1743
|
-
return /* @__PURE__ */ u$1(Fragment, { children: gffData.map((data, listId) => /* @__PURE__ */ u$1("div", { className: "w-full h-6 relative", children: data.map((cds, idx) => /* @__PURE__ */ u$1(Fragment, { children: cds.positions.map((position, posIdx) => {
|
|
1744
|
-
const start = Math.max(position.start, zoomStart);
|
|
1745
|
-
const end = Math.min(position.end, zoomEnd);
|
|
1746
|
-
if (start >= end) {
|
|
1747
|
-
return null;
|
|
1748
|
-
}
|
|
1749
|
-
if (zoomEnd - zoomStart <= 2) {
|
|
1750
|
-
return null;
|
|
1751
|
-
}
|
|
1752
|
-
const widthPercent = (end - start) / visibleRegionLength * 100;
|
|
1753
|
-
const leftPercent = (start - zoomStart) / visibleRegionLength * 100;
|
|
1754
|
-
const tooltipPosition = getTooltipPosition$1(start, end, visibleRegionLength);
|
|
1755
|
-
return /* @__PURE__ */ u$1(
|
|
1756
|
-
Tooltip,
|
|
1757
|
-
{
|
|
1758
|
-
content: /* @__PURE__ */ u$1(TooltipContent, { cds }),
|
|
1759
|
-
position: tooltipPosition,
|
|
1760
|
-
tooltipStyle: { left: `${leftPercent}%` },
|
|
1761
|
-
children: /* @__PURE__ */ u$1(
|
|
1762
|
-
"div",
|
|
1763
|
-
{
|
|
1764
|
-
className: "absolute text-xs text-white rounded px-1 py-0.5 cursor-pointer hover:opacity-80 shadow-md",
|
|
1765
|
-
style: {
|
|
1766
|
-
left: `${leftPercent}%`,
|
|
1767
|
-
width: `${widthPercent}%`,
|
|
1768
|
-
backgroundColor: singleGraphColorRGBByName(cds.color),
|
|
1769
|
-
whiteSpace: "nowrap",
|
|
1770
|
-
overflow: "hidden",
|
|
1771
|
-
textOverflow: "ellipsis"
|
|
1772
|
-
},
|
|
1773
|
-
children: cds.label
|
|
1774
|
-
}
|
|
1775
|
-
)
|
|
1776
|
-
},
|
|
1777
|
-
`${idx}-${posIdx}`
|
|
1778
|
-
);
|
|
1779
|
-
}) }, idx)) }, listId)) });
|
|
1780
|
-
};
|
|
1781
|
-
const CDSPlot = (componentProps) => {
|
|
1782
|
-
const ref = useDispatchFinishedLoadingEvent();
|
|
1783
|
-
const { gffData, genomeLength, width } = componentProps;
|
|
1784
|
-
const [zoomStart, setZoomStart] = d(0);
|
|
1785
|
-
const [zoomEnd, setZoomEnd] = d(genomeLength);
|
|
1786
|
-
const updateZoomStart = (newStart) => {
|
|
1787
|
-
setZoomStart(newStart);
|
|
1788
|
-
};
|
|
1789
|
-
const updateZoomEnd = (newEnd) => {
|
|
1790
|
-
setZoomEnd(newEnd);
|
|
1791
|
-
};
|
|
1792
|
-
return /* @__PURE__ */ u$1("div", { ref, className: "p-4", children: [
|
|
1793
|
-
/* @__PURE__ */ u$1(CDSBars, { gffData, zoomStart, zoomEnd }),
|
|
1794
|
-
/* @__PURE__ */ u$1(XAxis, { zoomStart, zoomEnd, fullWidth: width }),
|
|
1795
|
-
/* @__PURE__ */ u$1("div", { className: "relative w-full h-5", children: /* @__PURE__ */ u$1(
|
|
1796
|
-
MinMaxRangeSlider,
|
|
1797
|
-
{
|
|
1798
|
-
min: zoomStart,
|
|
1799
|
-
max: zoomEnd,
|
|
1800
|
-
setMin: updateZoomStart,
|
|
1801
|
-
setMax: updateZoomEnd,
|
|
1802
|
-
rangeMin: 0,
|
|
1803
|
-
rangeMax: genomeLength,
|
|
1804
|
-
step: 1
|
|
1805
|
-
}
|
|
1806
|
-
) }),
|
|
1807
|
-
/* @__PURE__ */ u$1(XAxis, { zoomStart: 0, zoomEnd: genomeLength, fullWidth: width })
|
|
1808
|
-
] });
|
|
1809
|
-
};
|
|
1810
|
-
async function loadGff3(gff3Source, genomeLength) {
|
|
1811
|
-
try {
|
|
1812
|
-
new URL(gff3Source);
|
|
1813
|
-
} catch (_error) {
|
|
1814
|
-
throw new UserFacingError("Invalid gff3 source", `Invalid URL passed to parseGFF3: "${gff3Source}"`);
|
|
1815
|
-
}
|
|
1816
|
-
const response = await fetch(gff3Source);
|
|
1817
|
-
if (!response.ok) {
|
|
1818
|
-
throw new UserFacingError(
|
|
1819
|
-
"GFF3 download failed",
|
|
1820
|
-
`Server returned ${response.status} ${response.statusText} for ${response.url}`
|
|
1821
|
-
);
|
|
1822
|
-
}
|
|
1823
|
-
const content = await response.text();
|
|
1824
|
-
genomeLength ?? (genomeLength = loadGenomeLength(content));
|
|
1825
|
-
return { features: parseGFF3(content), length: genomeLength };
|
|
1826
|
-
}
|
|
1827
|
-
function parseGFF3(content) {
|
|
1828
|
-
const lines = content.split("\n");
|
|
1829
|
-
const map2 = {};
|
|
1830
|
-
const geneFeatures = getCDSMap(lines, "gene", map2);
|
|
1831
|
-
const cdsFeatures = getCDSMap(lines, "CDS", geneFeatures);
|
|
1832
|
-
return getNonOverlappingCDSFeatures(getSortedCDSFeatures(cdsFeatures));
|
|
1833
|
-
}
|
|
1834
|
-
function getAttributes(attributes) {
|
|
1835
|
-
const attrPairs = attributes.split(";");
|
|
1836
|
-
const attrMap = /* @__PURE__ */ new Map();
|
|
1837
|
-
for (const pair of attrPairs) {
|
|
1838
|
-
const pairTrimmed = pair.trim();
|
|
1839
|
-
const [key, value] = pairTrimmed.split("=");
|
|
1840
|
-
attrMap.set(key, value);
|
|
1841
|
-
}
|
|
1842
|
-
return attrMap;
|
|
1843
|
-
}
|
|
1844
|
-
function removeQuotes(input) {
|
|
1845
|
-
return input.replace(/^['"](.*)['"]$/, "$1");
|
|
1846
|
-
}
|
|
1847
|
-
function getCDSMap(lines, genome_type, geneMap) {
|
|
1848
|
-
for (const line of lines) {
|
|
1849
|
-
if (line.startsWith("#") || line.trim() === "") {
|
|
1850
|
-
continue;
|
|
1851
|
-
}
|
|
1852
|
-
const fields = line.split(" ");
|
|
1853
|
-
if (fields.length < 9) {
|
|
1854
|
-
throw new UserFacingError("Invalid gff3 source", `Gff3 line has less than 9 fields: "${line}"`);
|
|
1855
|
-
}
|
|
1856
|
-
const [, , type, startStr, endStr, , , , attributes] = fields;
|
|
1857
|
-
if (removeQuotes(type.toLowerCase()) !== genome_type.toLowerCase()) {
|
|
1858
|
-
continue;
|
|
1859
|
-
}
|
|
1860
|
-
const start = parseInt(startStr, 10);
|
|
1861
|
-
const end = parseInt(endStr, 10);
|
|
1862
|
-
if (isNaN(start) || isNaN(end)) {
|
|
1863
|
-
throw new UserFacingError("Invalid gff3 source", `Invalid start or end position: "${line}"`);
|
|
1864
|
-
}
|
|
1865
|
-
const attrPairs = getAttributes(attributes);
|
|
1866
|
-
const labelAttribute = attrPairs.get("Name") ?? attrPairs.get("gene") ?? attrPairs.get("gene_name");
|
|
1867
|
-
if (!labelAttribute) {
|
|
1868
|
-
throw new UserFacingError(
|
|
1869
|
-
"Invalid gff3 source",
|
|
1870
|
-
`No label found for feature: "${line}", must contain label in Name, gene, or gene_name attribute`
|
|
1871
|
-
);
|
|
1872
|
-
}
|
|
1873
|
-
const label = removeQuotes(labelAttribute);
|
|
1874
|
-
const id = removeQuotes(attrPairs.get("ID") ?? labelAttribute);
|
|
1875
|
-
const parentAttribute = attrPairs.get("Parent");
|
|
1876
|
-
if (parentAttribute) {
|
|
1877
|
-
const parent = removeQuotes(parentAttribute);
|
|
1878
|
-
if (parent && parent in geneMap) {
|
|
1879
|
-
delete geneMap[parent];
|
|
1880
|
-
}
|
|
1881
|
-
}
|
|
1882
|
-
if (id in geneMap) {
|
|
1883
|
-
geneMap[id].positions.push({ start, end });
|
|
1884
|
-
} else {
|
|
1885
|
-
geneMap[id] = { positions: [{ start, end }], label };
|
|
1886
|
-
}
|
|
1887
|
-
}
|
|
1888
|
-
return geneMap;
|
|
1889
|
-
}
|
|
1890
|
-
function getSortedCDSFeatures(cdsMap) {
|
|
1891
|
-
const mapValues = Object.values(cdsMap);
|
|
1892
|
-
mapValues.forEach((feature) => {
|
|
1893
|
-
feature.positions.sort((a2, b2) => a2.start - b2.start);
|
|
1894
|
-
});
|
|
1895
|
-
mapValues.sort((a2, b2) => {
|
|
1896
|
-
return a2.positions[0].start - b2.positions[0].start;
|
|
1897
|
-
});
|
|
1898
|
-
const GraphColorList = Object.keys(ColorsRGB);
|
|
1899
|
-
const colorIndex = mapValues[0].label[0].toUpperCase().charCodeAt(0);
|
|
1900
|
-
const cdsFeatures = mapValues.map((value, index) => ({
|
|
1901
|
-
positions: value.positions,
|
|
1902
|
-
label: value.label,
|
|
1903
|
-
color: GraphColorList[(colorIndex + index) % GraphColorList.length]
|
|
1904
|
-
}));
|
|
1905
|
-
return cdsFeatures;
|
|
1906
|
-
}
|
|
1907
|
-
function getNonOverlappingCDSFeatures(cdsFeatures) {
|
|
1908
|
-
const nonOverlappingCDSFeatures = [];
|
|
1909
|
-
for (const cdsFeature of cdsFeatures) {
|
|
1910
|
-
let added = false;
|
|
1911
|
-
for (const cdsList of nonOverlappingCDSFeatures) {
|
|
1912
|
-
const lastCds = cdsList[cdsList.length - 1];
|
|
1913
|
-
if (cdsFeature.positions[0].start > lastCds.positions[lastCds.positions.length - 1].end) {
|
|
1914
|
-
cdsList.push(cdsFeature);
|
|
1915
|
-
added = true;
|
|
1916
|
-
break;
|
|
1917
|
-
}
|
|
1918
|
-
}
|
|
1919
|
-
if (!added) {
|
|
1920
|
-
nonOverlappingCDSFeatures.push([cdsFeature]);
|
|
1921
|
-
}
|
|
1922
|
-
}
|
|
1923
|
-
return nonOverlappingCDSFeatures;
|
|
1944
|
+
if (componentPropsParseError !== void 0) {
|
|
1945
|
+
return /* @__PURE__ */ u$1(ResizeContainer, { size, children: /* @__PURE__ */ u$1(ErrorDisplay, { error: componentPropsParseError, layout }) });
|
|
1946
|
+
}
|
|
1947
|
+
return /* @__PURE__ */ u$1(Fragment, { children });
|
|
1948
|
+
};
|
|
1949
|
+
function useCheckComponentProps(schema, componentProps) {
|
|
1950
|
+
return T$1(() => {
|
|
1951
|
+
const parseResult = schema.safeParse(componentProps);
|
|
1952
|
+
if (parseResult.success) {
|
|
1953
|
+
return void 0;
|
|
1954
|
+
}
|
|
1955
|
+
return new InvalidPropsError(parseResult.error, componentProps);
|
|
1956
|
+
}, [componentProps, schema]);
|
|
1924
1957
|
}
|
|
1925
|
-
|
|
1926
|
-
|
|
1927
|
-
|
|
1928
|
-
|
|
1929
|
-
|
|
1958
|
+
const LoadingDisplay = () => {
|
|
1959
|
+
return /* @__PURE__ */ u$1(
|
|
1960
|
+
"div",
|
|
1961
|
+
{
|
|
1962
|
+
"aria-label": "Loading",
|
|
1963
|
+
className: "h-full w-full border-2 border-gray-100 rounded-md flex justify-center items-center",
|
|
1964
|
+
children: /* @__PURE__ */ u$1("div", { className: "loading loading-spinner loading-md text-neutral-500" })
|
|
1930
1965
|
}
|
|
1931
|
-
|
|
1932
|
-
|
|
1933
|
-
|
|
1934
|
-
|
|
1935
|
-
|
|
1936
|
-
|
|
1937
|
-
|
|
1938
|
-
|
|
1939
|
-
|
|
1940
|
-
|
|
1966
|
+
);
|
|
1967
|
+
};
|
|
1968
|
+
function useQuery(fetchDataCallback, dependencies) {
|
|
1969
|
+
const [data, setData] = d(null);
|
|
1970
|
+
const [error, setError] = d(null);
|
|
1971
|
+
const [isLoading, setIsLoading] = d(true);
|
|
1972
|
+
y2(() => {
|
|
1973
|
+
const fetchData = async () => {
|
|
1974
|
+
setIsLoading(true);
|
|
1975
|
+
try {
|
|
1976
|
+
const result = await fetchDataCallback();
|
|
1977
|
+
setData(result);
|
|
1978
|
+
setError(null);
|
|
1979
|
+
} catch (error2) {
|
|
1980
|
+
setError(error2);
|
|
1981
|
+
} finally {
|
|
1982
|
+
setIsLoading(false);
|
|
1941
1983
|
}
|
|
1942
|
-
|
|
1943
|
-
|
|
1984
|
+
};
|
|
1985
|
+
void fetchData();
|
|
1986
|
+
}, [JSON.stringify(dependencies)]);
|
|
1987
|
+
if (isLoading) {
|
|
1988
|
+
return { isLoading: true };
|
|
1944
1989
|
}
|
|
1945
|
-
|
|
1990
|
+
if (error !== null) {
|
|
1991
|
+
return { error, isLoading: false };
|
|
1992
|
+
}
|
|
1993
|
+
return { data, error: null, isLoading: false };
|
|
1946
1994
|
}
|
|
1947
1995
|
const genomeDataViewerPropsSchema = z$2.object({
|
|
1948
1996
|
gff3Source: z$2.string().min(1, "gff3Source cannot be empty"),
|
|
@@ -2411,7 +2459,7 @@ const MutationComparisonTable = ({
|
|
|
2411
2459
|
return /* @__PURE__ */ u$1(Table, { data: tableData, columns: headers, pageSize });
|
|
2412
2460
|
};
|
|
2413
2461
|
const nucleotideChars = "ACGTRYKMSWBDHVN";
|
|
2414
|
-
const aminoAcidChars = "
|
|
2462
|
+
const aminoAcidChars = "ACDEFGHIKLMNPQRSTVWYX";
|
|
2415
2463
|
function segmentPart(isOptional) {
|
|
2416
2464
|
const segmentPart2 = `(?<segment>[A-Z0-9_-]+):`;
|
|
2417
2465
|
if (isOptional) {
|
|
@@ -2810,8 +2858,8 @@ const CsvDownloadButton = ({
|
|
|
2810
2858
|
}) => {
|
|
2811
2859
|
const download = () => {
|
|
2812
2860
|
const content = getDownloadContent();
|
|
2813
|
-
const
|
|
2814
|
-
const url = URL.createObjectURL(
|
|
2861
|
+
const blob = new Blob([content], { type: "text/csv" });
|
|
2862
|
+
const url = URL.createObjectURL(blob);
|
|
2815
2863
|
const a2 = document.createElement("a");
|
|
2816
2864
|
a2.href = url;
|
|
2817
2865
|
a2.download = filename;
|
|
@@ -7170,50 +7218,6 @@ __decorateClass$a([
|
|
|
7170
7218
|
NumberSequencesOverTimeComponent = __decorateClass$a([
|
|
7171
7219
|
t$3("gs-number-sequences-over-time")
|
|
7172
7220
|
], NumberSequencesOverTimeComponent);
|
|
7173
|
-
const jsContent = '(function() {\n "use strict";\n var util;\n (function(util2) {\n util2.assertEqual = (_) => {\n };\n function assertIs(_arg) {\n }\n util2.assertIs = assertIs;\n function assertNever(_x) {\n throw new Error();\n }\n util2.assertNever = assertNever;\n util2.arrayToEnum = (items) => {\n const obj = {};\n for (const item of items) {\n obj[item] = item;\n }\n return obj;\n };\n util2.getValidEnumValues = (obj) => {\n const validKeys = util2.objectKeys(obj).filter((k2) => typeof obj[obj[k2]] !== "number");\n const filtered = {};\n for (const k2 of validKeys) {\n filtered[k2] = obj[k2];\n }\n return util2.objectValues(filtered);\n };\n util2.objectValues = (obj) => {\n return util2.objectKeys(obj).map(function(e2) {\n return obj[e2];\n });\n };\n util2.objectKeys = typeof Object.keys === "function" ? (obj) => Object.keys(obj) : (object) => {\n const keys = [];\n for (const key in object) {\n if (Object.prototype.hasOwnProperty.call(object, key)) {\n keys.push(key);\n }\n }\n return keys;\n };\n util2.find = (arr, checker) => {\n for (const item of arr) {\n if (checker(item))\n return item;\n }\n return void 0;\n };\n util2.isInteger = typeof Number.isInteger === "function" ? (val) => Number.isInteger(val) : (val) => typeof val === "number" && Number.isFinite(val) && Math.floor(val) === val;\n function joinValues(array, separator = " | ") {\n return array.map((val) => typeof val === "string" ? `\'${val}\'` : val).join(separator);\n }\n util2.joinValues = joinValues;\n util2.jsonStringifyReplacer = (_, value) => {\n if (typeof value === "bigint") {\n return value.toString();\n }\n return value;\n };\n })(util || (util = {}));\n var objectUtil;\n (function(objectUtil2) {\n objectUtil2.mergeShapes = (first, second) => {\n return {\n ...first,\n ...second\n // second overwrites first\n };\n };\n })(objectUtil || (objectUtil = {}));\n const ZodParsedType = util.arrayToEnum([\n "string",\n "nan",\n "number",\n "integer",\n "float",\n "boolean",\n "date",\n "bigint",\n "symbol",\n "function",\n "undefined",\n "null",\n "array",\n "object",\n "unknown",\n "promise",\n "void",\n "never",\n "map",\n "set"\n ]);\n const getParsedType = (data) => {\n const t = typeof data;\n switch (t) {\n case "undefined":\n return ZodParsedType.undefined;\n case "string":\n return ZodParsedType.string;\n case "number":\n return Number.isNaN(data) ? ZodParsedType.nan : ZodParsedType.number;\n case "boolean":\n return ZodParsedType.boolean;\n case "function":\n return ZodParsedType.function;\n case "bigint":\n return ZodParsedType.bigint;\n case "symbol":\n return ZodParsedType.symbol;\n case "object":\n if (Array.isArray(data)) {\n return ZodParsedType.array;\n }\n if (data === null) {\n return ZodParsedType.null;\n }\n if (data.then && typeof data.then === "function" && data.catch && typeof data.catch === "function") {\n return ZodParsedType.promise;\n }\n if (typeof Map !== "undefined" && data instanceof Map) {\n return ZodParsedType.map;\n }\n if (typeof Set !== "undefined" && data instanceof Set) {\n return ZodParsedType.set;\n }\n if (typeof Date !== "undefined" && data instanceof Date) {\n return ZodParsedType.date;\n }\n return ZodParsedType.object;\n default:\n return ZodParsedType.unknown;\n }\n };\n const ZodIssueCode = util.arrayToEnum([\n "invalid_type",\n "invalid_literal",\n "custom",\n "invalid_union",\n "invalid_union_discriminator",\n "invalid_enum_value",\n "unrecognized_keys",\n "invalid_arguments",\n "invalid_return_type",\n "invalid_date",\n "invalid_string",\n "too_small",\n "too_big",\n "invalid_intersection_types",\n "not_multiple_of",\n "not_finite"\n ]);\n const quotelessJson = (obj) => {\n const json = JSON.stringify(obj, null, 2);\n return json.replace(/"([^"]+)":/g, "$1:");\n };\n class ZodError extends Error {\n get errors() {\n return this.issues;\n }\n constructor(issues) {\n super();\n this.issues = [];\n this.addIssue = (sub) => {\n this.issues = [...this.issues, sub];\n };\n this.addIssues = (subs = []) => {\n this.issues = [...this.issues, ...subs];\n };\n const actualProto = new.target.prototype;\n if (Object.setPrototypeOf) {\n Object.setPrototypeOf(this, actualProto);\n } else {\n this.__proto__ = actualProto;\n }\n this.name = "ZodError";\n this.issues = issues;\n }\n format(_mapper) {\n const mapper = _mapper || function(issue) {\n return issue.message;\n };\n const fieldErrors = { _errors: [] };\n const processError = (error) => {\n for (const issue of error.issues) {\n if (issue.code === "invalid_union") {\n issue.unionErrors.map(processError);\n } else if (issue.code === "invalid_return_type") {\n processError(issue.returnTypeError);\n } else if (issue.code === "invalid_arguments") {\n processError(issue.argumentsError);\n } else if (issue.path.length === 0) {\n fieldErrors._errors.push(mapper(issue));\n } else {\n let curr = fieldErrors;\n let i2 = 0;\n while (i2 < issue.path.length) {\n const el = issue.path[i2];\n const terminal = i2 === issue.path.length - 1;\n if (!terminal) {\n curr[el] = curr[el] || { _errors: [] };\n } else {\n curr[el] = curr[el] || { _errors: [] };\n curr[el]._errors.push(mapper(issue));\n }\n curr = curr[el];\n i2++;\n }\n }\n }\n };\n processError(this);\n return fieldErrors;\n }\n static assert(value) {\n if (!(value instanceof ZodError)) {\n throw new Error(`Not a ZodError: ${value}`);\n }\n }\n toString() {\n return this.message;\n }\n get message() {\n return JSON.stringify(this.issues, util.jsonStringifyReplacer, 2);\n }\n get isEmpty() {\n return this.issues.length === 0;\n }\n flatten(mapper = (issue) => issue.message) {\n const fieldErrors = {};\n const formErrors = [];\n for (const sub of this.issues) {\n if (sub.path.length > 0) {\n const firstEl = sub.path[0];\n fieldErrors[firstEl] = fieldErrors[firstEl] || [];\n fieldErrors[firstEl].push(mapper(sub));\n } else {\n formErrors.push(mapper(sub));\n }\n }\n return { formErrors, fieldErrors };\n }\n get formErrors() {\n return this.flatten();\n }\n }\n ZodError.create = (issues) => {\n const error = new ZodError(issues);\n return error;\n };\n const errorMap = (issue, _ctx) => {\n let message;\n switch (issue.code) {\n case ZodIssueCode.invalid_type:\n if (issue.received === ZodParsedType.undefined) {\n message = "Required";\n } else {\n message = `Expected ${issue.expected}, received ${issue.received}`;\n }\n break;\n case ZodIssueCode.invalid_literal:\n message = `Invalid literal value, expected ${JSON.stringify(issue.expected, util.jsonStringifyReplacer)}`;\n break;\n case ZodIssueCode.unrecognized_keys:\n message = `Unrecognized key(s) in object: ${util.joinValues(issue.keys, ", ")}`;\n break;\n case ZodIssueCode.invalid_union:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_union_discriminator:\n message = `Invalid discriminator value. Expected ${util.joinValues(issue.options)}`;\n break;\n case ZodIssueCode.invalid_enum_value:\n message = `Invalid enum value. Expected ${util.joinValues(issue.options)}, received \'${issue.received}\'`;\n break;\n case ZodIssueCode.invalid_arguments:\n message = `Invalid function arguments`;\n break;\n case ZodIssueCode.invalid_return_type:\n message = `Invalid function return type`;\n break;\n case ZodIssueCode.invalid_date:\n message = `Invalid date`;\n break;\n case ZodIssueCode.invalid_string:\n if (typeof issue.validation === "object") {\n if ("includes" in issue.validation) {\n message = `Invalid input: must include "${issue.validation.includes}"`;\n if (typeof issue.validation.position === "number") {\n message = `${message} at one or more positions greater than or equal to ${issue.validation.position}`;\n }\n } else if ("startsWith" in issue.validation) {\n message = `Invalid input: must start with "${issue.validation.startsWith}"`;\n } else if ("endsWith" in issue.validation) {\n message = `Invalid input: must end with "${issue.validation.endsWith}"`;\n } else {\n util.assertNever(issue.validation);\n }\n } else if (issue.validation !== "regex") {\n message = `Invalid ${issue.validation}`;\n } else {\n message = "Invalid";\n }\n break;\n case ZodIssueCode.too_small:\n if (issue.type === "array")\n message = `Array must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `more than`} ${issue.minimum} element(s)`;\n else if (issue.type === "string")\n message = `String must contain ${issue.exact ? "exactly" : issue.inclusive ? `at least` : `over`} ${issue.minimum} character(s)`;\n else if (issue.type === "number")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === "bigint")\n message = `Number must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${issue.minimum}`;\n else if (issue.type === "date")\n message = `Date must be ${issue.exact ? `exactly equal to ` : issue.inclusive ? `greater than or equal to ` : `greater than `}${new Date(Number(issue.minimum))}`;\n else\n message = "Invalid input";\n break;\n case ZodIssueCode.too_big:\n if (issue.type === "array")\n message = `Array must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `less than`} ${issue.maximum} element(s)`;\n else if (issue.type === "string")\n message = `String must contain ${issue.exact ? `exactly` : issue.inclusive ? `at most` : `under`} ${issue.maximum} character(s)`;\n else if (issue.type === "number")\n message = `Number must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === "bigint")\n message = `BigInt must be ${issue.exact ? `exactly` : issue.inclusive ? `less than or equal to` : `less than`} ${issue.maximum}`;\n else if (issue.type === "date")\n message = `Date must be ${issue.exact ? `exactly` : issue.inclusive ? `smaller than or equal to` : `smaller than`} ${new Date(Number(issue.maximum))}`;\n else\n message = "Invalid input";\n break;\n case ZodIssueCode.custom:\n message = `Invalid input`;\n break;\n case ZodIssueCode.invalid_intersection_types:\n message = `Intersection results could not be merged`;\n break;\n case ZodIssueCode.not_multiple_of:\n message = `Number must be a multiple of ${issue.multipleOf}`;\n break;\n case ZodIssueCode.not_finite:\n message = "Number must be finite";\n break;\n default:\n message = _ctx.defaultError;\n util.assertNever(issue);\n }\n return { message };\n };\n let overrideErrorMap = errorMap;\n function setErrorMap(map) {\n overrideErrorMap = map;\n }\n function getErrorMap() {\n return overrideErrorMap;\n }\n const makeIssue = (params) => {\n const { data, path, errorMaps, issueData } = params;\n const fullPath = [...path, ...issueData.path || []];\n const fullIssue = {\n ...issueData,\n path: fullPath\n };\n if (issueData.message !== void 0) {\n return {\n ...issueData,\n path: fullPath,\n message: issueData.message\n };\n }\n let errorMessage = "";\n const maps = errorMaps.filter((m2) => !!m2).slice().reverse();\n for (const map of maps) {\n errorMessage = map(fullIssue, { data, defaultError: errorMessage }).message;\n }\n return {\n ...issueData,\n path: fullPath,\n message: errorMessage\n };\n };\n const EMPTY_PATH = [];\n function addIssueToContext(ctx, issueData) {\n const overrideMap = getErrorMap();\n const issue = makeIssue({\n issueData,\n data: ctx.data,\n path: ctx.path,\n errorMaps: [\n ctx.common.contextualErrorMap,\n // contextual error map is first priority\n ctx.schemaErrorMap,\n // then schema-bound map if available\n overrideMap,\n // then global override map\n overrideMap === errorMap ? void 0 : errorMap\n // then global default map\n ].filter((x) => !!x)\n });\n ctx.common.issues.push(issue);\n }\n class ParseStatus {\n constructor() {\n this.value = "valid";\n }\n dirty() {\n if (this.value === "valid")\n this.value = "dirty";\n }\n abort() {\n if (this.value !== "aborted")\n this.value = "aborted";\n }\n static mergeArray(status, results) {\n const arrayValue = [];\n for (const s2 of results) {\n if (s2.status === "aborted")\n return INVALID;\n if (s2.status === "dirty")\n status.dirty();\n arrayValue.push(s2.value);\n }\n return { status: status.value, value: arrayValue };\n }\n static async mergeObjectAsync(status, pairs) {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value\n });\n }\n return ParseStatus.mergeObjectSync(status, syncPairs);\n }\n static mergeObjectSync(status, pairs) {\n const finalObject = {};\n for (const pair of pairs) {\n const { key, value } = pair;\n if (key.status === "aborted")\n return INVALID;\n if (value.status === "aborted")\n return INVALID;\n if (key.status === "dirty")\n status.dirty();\n if (value.status === "dirty")\n status.dirty();\n if (key.value !== "__proto__" && (typeof value.value !== "undefined" || pair.alwaysSet)) {\n finalObject[key.value] = value.value;\n }\n }\n return { status: status.value, value: finalObject };\n }\n }\n const INVALID = Object.freeze({\n status: "aborted"\n });\n const DIRTY = (value) => ({ status: "dirty", value });\n const OK = (value) => ({ status: "valid", value });\n const isAborted = (x) => x.status === "aborted";\n const isDirty = (x) => x.status === "dirty";\n const isValid = (x) => x.status === "valid";\n const isAsync = (x) => typeof Promise !== "undefined" && x instanceof Promise;\n var errorUtil;\n (function(errorUtil2) {\n errorUtil2.errToObj = (message) => typeof message === "string" ? { message } : message || {};\n errorUtil2.toString = (message) => typeof message === "string" ? message : message == null ? void 0 : message.message;\n })(errorUtil || (errorUtil = {}));\n class ParseInputLazyPath {\n constructor(parent, value, path, key) {\n this._cachedPath = [];\n this.parent = parent;\n this.data = value;\n this._path = path;\n this._key = key;\n }\n get path() {\n if (!this._cachedPath.length) {\n if (Array.isArray(this._key)) {\n this._cachedPath.push(...this._path, ...this._key);\n } else {\n this._cachedPath.push(...this._path, this._key);\n }\n }\n return this._cachedPath;\n }\n }\n const handleResult = (ctx, result) => {\n if (isValid(result)) {\n return { success: true, data: result.value };\n } else {\n if (!ctx.common.issues.length) {\n throw new Error("Validation failed but no issues detected.");\n }\n return {\n success: false,\n get error() {\n if (this._error)\n return this._error;\n const error = new ZodError(ctx.common.issues);\n this._error = error;\n return this._error;\n }\n };\n }\n };\n function processCreateParams(params) {\n if (!params)\n return {};\n const { errorMap: errorMap2, invalid_type_error, required_error, description } = params;\n if (errorMap2 && (invalid_type_error || required_error)) {\n throw new Error(`Can\'t use "invalid_type_error" or "required_error" in conjunction with custom error map.`);\n }\n if (errorMap2)\n return { errorMap: errorMap2, description };\n const customMap = (iss, ctx) => {\n const { message } = params;\n if (iss.code === "invalid_enum_value") {\n return { message: message ?? ctx.defaultError };\n }\n if (typeof ctx.data === "undefined") {\n return { message: message ?? required_error ?? ctx.defaultError };\n }\n if (iss.code !== "invalid_type")\n return { message: ctx.defaultError };\n return { message: message ?? invalid_type_error ?? ctx.defaultError };\n };\n return { errorMap: customMap, description };\n }\n class ZodType {\n get description() {\n return this._def.description;\n }\n _getType(input) {\n return getParsedType(input.data);\n }\n _getOrReturnCtx(input, ctx) {\n return ctx || {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent\n };\n }\n _processInputParams(input) {\n return {\n status: new ParseStatus(),\n ctx: {\n common: input.parent.common,\n data: input.data,\n parsedType: getParsedType(input.data),\n schemaErrorMap: this._def.errorMap,\n path: input.path,\n parent: input.parent\n }\n };\n }\n _parseSync(input) {\n const result = this._parse(input);\n if (isAsync(result)) {\n throw new Error("Synchronous parse encountered promise.");\n }\n return result;\n }\n _parseAsync(input) {\n const result = this._parse(input);\n return Promise.resolve(result);\n }\n parse(data, params) {\n const result = this.safeParse(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n safeParse(data, params) {\n const ctx = {\n common: {\n issues: [],\n async: (params == null ? void 0 : params.async) ?? false,\n contextualErrorMap: params == null ? void 0 : params.errorMap\n },\n path: (params == null ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data)\n };\n const result = this._parseSync({ data, path: ctx.path, parent: ctx });\n return handleResult(ctx, result);\n }\n "~validate"(data) {\n var _a, _b;\n const ctx = {\n common: {\n issues: [],\n async: !!this["~standard"].async\n },\n path: [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data)\n };\n if (!this["~standard"].async) {\n try {\n const result = this._parseSync({ data, path: [], parent: ctx });\n return isValid(result) ? {\n value: result.value\n } : {\n issues: ctx.common.issues\n };\n } catch (err) {\n if ((_b = (_a = err == null ? void 0 : err.message) == null ? void 0 : _a.toLowerCase()) == null ? void 0 : _b.includes("encountered")) {\n this["~standard"].async = true;\n }\n ctx.common = {\n issues: [],\n async: true\n };\n }\n }\n return this._parseAsync({ data, path: [], parent: ctx }).then((result) => isValid(result) ? {\n value: result.value\n } : {\n issues: ctx.common.issues\n });\n }\n async parseAsync(data, params) {\n const result = await this.safeParseAsync(data, params);\n if (result.success)\n return result.data;\n throw result.error;\n }\n async safeParseAsync(data, params) {\n const ctx = {\n common: {\n issues: [],\n contextualErrorMap: params == null ? void 0 : params.errorMap,\n async: true\n },\n path: (params == null ? void 0 : params.path) || [],\n schemaErrorMap: this._def.errorMap,\n parent: null,\n data,\n parsedType: getParsedType(data)\n };\n const maybeAsyncResult = this._parse({ data, path: ctx.path, parent: ctx });\n const result = await (isAsync(maybeAsyncResult) ? maybeAsyncResult : Promise.resolve(maybeAsyncResult));\n return handleResult(ctx, result);\n }\n refine(check, message) {\n const getIssueProperties = (val) => {\n if (typeof message === "string" || typeof message === "undefined") {\n return { message };\n } else if (typeof message === "function") {\n return message(val);\n } else {\n return message;\n }\n };\n return this._refinement((val, ctx) => {\n const result = check(val);\n const setError = () => ctx.addIssue({\n code: ZodIssueCode.custom,\n ...getIssueProperties(val)\n });\n if (typeof Promise !== "undefined" && result instanceof Promise) {\n return result.then((data) => {\n if (!data) {\n setError();\n return false;\n } else {\n return true;\n }\n });\n }\n if (!result) {\n setError();\n return false;\n } else {\n return true;\n }\n });\n }\n refinement(check, refinementData) {\n return this._refinement((val, ctx) => {\n if (!check(val)) {\n ctx.addIssue(typeof refinementData === "function" ? refinementData(val, ctx) : refinementData);\n return false;\n } else {\n return true;\n }\n });\n }\n _refinement(refinement) {\n return new ZodEffects({\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: "refinement", refinement }\n });\n }\n superRefine(refinement) {\n return this._refinement(refinement);\n }\n constructor(def) {\n this.spa = this.safeParseAsync;\n this._def = def;\n this.parse = this.parse.bind(this);\n this.safeParse = this.safeParse.bind(this);\n this.parseAsync = this.parseAsync.bind(this);\n this.safeParseAsync = this.safeParseAsync.bind(this);\n this.spa = this.spa.bind(this);\n this.refine = this.refine.bind(this);\n this.refinement = this.refinement.bind(this);\n this.superRefine = this.superRefine.bind(this);\n this.optional = this.optional.bind(this);\n this.nullable = this.nullable.bind(this);\n this.nullish = this.nullish.bind(this);\n this.array = this.array.bind(this);\n this.promise = this.promise.bind(this);\n this.or = this.or.bind(this);\n this.and = this.and.bind(this);\n this.transform = this.transform.bind(this);\n this.brand = this.brand.bind(this);\n this.default = this.default.bind(this);\n this.catch = this.catch.bind(this);\n this.describe = this.describe.bind(this);\n this.pipe = this.pipe.bind(this);\n this.readonly = this.readonly.bind(this);\n this.isNullable = this.isNullable.bind(this);\n this.isOptional = this.isOptional.bind(this);\n this["~standard"] = {\n version: 1,\n vendor: "zod",\n validate: (data) => this["~validate"](data)\n };\n }\n optional() {\n return ZodOptional.create(this, this._def);\n }\n nullable() {\n return ZodNullable.create(this, this._def);\n }\n nullish() {\n return this.nullable().optional();\n }\n array() {\n return ZodArray.create(this);\n }\n promise() {\n return ZodPromise.create(this, this._def);\n }\n or(option) {\n return ZodUnion.create([this, option], this._def);\n }\n and(incoming) {\n return ZodIntersection.create(this, incoming, this._def);\n }\n transform(transform) {\n return new ZodEffects({\n ...processCreateParams(this._def),\n schema: this,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect: { type: "transform", transform }\n });\n }\n default(def) {\n const defaultValueFunc = typeof def === "function" ? def : () => def;\n return new ZodDefault({\n ...processCreateParams(this._def),\n innerType: this,\n defaultValue: defaultValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodDefault\n });\n }\n brand() {\n return new ZodBranded({\n typeName: ZodFirstPartyTypeKind.ZodBranded,\n type: this,\n ...processCreateParams(this._def)\n });\n }\n catch(def) {\n const catchValueFunc = typeof def === "function" ? def : () => def;\n return new ZodCatch({\n ...processCreateParams(this._def),\n innerType: this,\n catchValue: catchValueFunc,\n typeName: ZodFirstPartyTypeKind.ZodCatch\n });\n }\n describe(description) {\n const This = this.constructor;\n return new This({\n ...this._def,\n description\n });\n }\n pipe(target) {\n return ZodPipeline.create(this, target);\n }\n readonly() {\n return ZodReadonly.create(this);\n }\n isOptional() {\n return this.safeParse(void 0).success;\n }\n isNullable() {\n return this.safeParse(null).success;\n }\n }\n const cuidRegex = /^c[^\\s-]{8,}$/i;\n const cuid2Regex = /^[0-9a-z]+$/;\n const ulidRegex = /^[0-9A-HJKMNP-TV-Z]{26}$/i;\n const uuidRegex = /^[0-9a-fA-F]{8}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{4}\\b-[0-9a-fA-F]{12}$/i;\n const nanoidRegex = /^[a-z0-9_-]{21}$/i;\n const jwtRegex = /^[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]+\\.[A-Za-z0-9-_]*$/;\n const durationRegex = /^[-+]?P(?!$)(?:(?:[-+]?\\d+Y)|(?:[-+]?\\d+[.,]\\d+Y$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:(?:[-+]?\\d+W)|(?:[-+]?\\d+[.,]\\d+W$))?(?:(?:[-+]?\\d+D)|(?:[-+]?\\d+[.,]\\d+D$))?(?:T(?=[\\d+-])(?:(?:[-+]?\\d+H)|(?:[-+]?\\d+[.,]\\d+H$))?(?:(?:[-+]?\\d+M)|(?:[-+]?\\d+[.,]\\d+M$))?(?:[-+]?\\d+(?:[.,]\\d+)?S)?)??$/;\n const emailRegex = /^(?!\\.)(?!.*\\.\\.)([A-Z0-9_\'+\\-\\.]*)[A-Z0-9_+-]@([A-Z0-9][A-Z0-9\\-]*\\.)+[A-Z]{2,}$/i;\n const _emojiRegex = `^(\\\\p{Extended_Pictographic}|\\\\p{Emoji_Component})+$`;\n let emojiRegex;\n const ipv4Regex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])$/;\n const ipv4CidrRegex = /^(?:(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\.){3}(?:25[0-5]|2[0-4][0-9]|1[0-9][0-9]|[1-9][0-9]|[0-9])\\/(3[0-2]|[12]?[0-9])$/;\n const ipv6Regex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))$/;\n const ipv6CidrRegex = /^(([0-9a-fA-F]{1,4}:){7,7}[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,7}:|([0-9a-fA-F]{1,4}:){1,6}:[0-9a-fA-F]{1,4}|([0-9a-fA-F]{1,4}:){1,5}(:[0-9a-fA-F]{1,4}){1,2}|([0-9a-fA-F]{1,4}:){1,4}(:[0-9a-fA-F]{1,4}){1,3}|([0-9a-fA-F]{1,4}:){1,3}(:[0-9a-fA-F]{1,4}){1,4}|([0-9a-fA-F]{1,4}:){1,2}(:[0-9a-fA-F]{1,4}){1,5}|[0-9a-fA-F]{1,4}:((:[0-9a-fA-F]{1,4}){1,6})|:((:[0-9a-fA-F]{1,4}){1,7}|:)|fe80:(:[0-9a-fA-F]{0,4}){0,4}%[0-9a-zA-Z]{1,}|::(ffff(:0{1,4}){0,1}:){0,1}((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])|([0-9a-fA-F]{1,4}:){1,4}:((25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9])\\.){3,3}(25[0-5]|(2[0-4]|1{0,1}[0-9]){0,1}[0-9]))\\/(12[0-8]|1[01][0-9]|[1-9]?[0-9])$/;\n const base64Regex = /^([0-9a-zA-Z+/]{4})*(([0-9a-zA-Z+/]{2}==)|([0-9a-zA-Z+/]{3}=))?$/;\n const base64urlRegex = /^([0-9a-zA-Z-_]{4})*(([0-9a-zA-Z-_]{2}(==)?)|([0-9a-zA-Z-_]{3}(=)?))?$/;\n const dateRegexSource = `((\\\\d\\\\d[2468][048]|\\\\d\\\\d[13579][26]|\\\\d\\\\d0[48]|[02468][048]00|[13579][26]00)-02-29|\\\\d{4}-((0[13578]|1[02])-(0[1-9]|[12]\\\\d|3[01])|(0[469]|11)-(0[1-9]|[12]\\\\d|30)|(02)-(0[1-9]|1\\\\d|2[0-8])))`;\n const dateRegex = new RegExp(`^${dateRegexSource}$`);\n function timeRegexSource(args) {\n let secondsRegexSource = `[0-5]\\\\d`;\n if (args.precision) {\n secondsRegexSource = `${secondsRegexSource}\\\\.\\\\d{${args.precision}}`;\n } else if (args.precision == null) {\n secondsRegexSource = `${secondsRegexSource}(\\\\.\\\\d+)?`;\n }\n const secondsQuantifier = args.precision ? "+" : "?";\n return `([01]\\\\d|2[0-3]):[0-5]\\\\d(:${secondsRegexSource})${secondsQuantifier}`;\n }\n function timeRegex(args) {\n return new RegExp(`^${timeRegexSource(args)}$`);\n }\n function datetimeRegex(args) {\n let regex = `${dateRegexSource}T${timeRegexSource(args)}`;\n const opts = [];\n opts.push(args.local ? `Z?` : `Z`);\n if (args.offset)\n opts.push(`([+-]\\\\d{2}:?\\\\d{2})`);\n regex = `${regex}(${opts.join("|")})`;\n return new RegExp(`^${regex}$`);\n }\n function isValidIP(ip, version) {\n if ((version === "v4" || !version) && ipv4Regex.test(ip)) {\n return true;\n }\n if ((version === "v6" || !version) && ipv6Regex.test(ip)) {\n return true;\n }\n return false;\n }\n function isValidJWT(jwt, alg) {\n if (!jwtRegex.test(jwt))\n return false;\n try {\n const [header] = jwt.split(".");\n if (!header)\n return false;\n const base64 = header.replace(/-/g, "+").replace(/_/g, "/").padEnd(header.length + (4 - header.length % 4) % 4, "=");\n const decoded = JSON.parse(atob(base64));\n if (typeof decoded !== "object" || decoded === null)\n return false;\n if ("typ" in decoded && (decoded == null ? void 0 : decoded.typ) !== "JWT")\n return false;\n if (!decoded.alg)\n return false;\n if (alg && decoded.alg !== alg)\n return false;\n return true;\n } catch {\n return false;\n }\n }\n function isValidCidr(ip, version) {\n if ((version === "v4" || !version) && ipv4CidrRegex.test(ip)) {\n return true;\n }\n if ((version === "v6" || !version) && ipv6CidrRegex.test(ip)) {\n return true;\n }\n return false;\n }\n class ZodString extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = String(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.string) {\n const ctx2 = this._getOrReturnCtx(input);\n addIssueToContext(ctx2, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.string,\n received: ctx2.parsedType\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = void 0;\n for (const check of this._def.checks) {\n if (check.kind === "min") {\n if (input.data.length < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: "string",\n inclusive: true,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "max") {\n if (input.data.length > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: "string",\n inclusive: true,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "length") {\n const tooBig = input.data.length > check.value;\n const tooSmall = input.data.length < check.value;\n if (tooBig || tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n if (tooBig) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: "string",\n inclusive: true,\n exact: true,\n message: check.message\n });\n } else if (tooSmall) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: "string",\n inclusive: true,\n exact: true,\n message: check.message\n });\n }\n status.dirty();\n }\n } else if (check.kind === "email") {\n if (!emailRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "email",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "emoji") {\n if (!emojiRegex) {\n emojiRegex = new RegExp(_emojiRegex, "u");\n }\n if (!emojiRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "emoji",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "uuid") {\n if (!uuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "uuid",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "nanoid") {\n if (!nanoidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "nanoid",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "cuid") {\n if (!cuidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "cuid",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "cuid2") {\n if (!cuid2Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "cuid2",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "ulid") {\n if (!ulidRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "ulid",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "url") {\n try {\n new URL(input.data);\n } catch {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "url",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "regex") {\n check.regex.lastIndex = 0;\n const testResult = check.regex.test(input.data);\n if (!testResult) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "regex",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "trim") {\n input.data = input.data.trim();\n } else if (check.kind === "includes") {\n if (!input.data.includes(check.value, check.position)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { includes: check.value, position: check.position },\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "toLowerCase") {\n input.data = input.data.toLowerCase();\n } else if (check.kind === "toUpperCase") {\n input.data = input.data.toUpperCase();\n } else if (check.kind === "startsWith") {\n if (!input.data.startsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { startsWith: check.value },\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "endsWith") {\n if (!input.data.endsWith(check.value)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: { endsWith: check.value },\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "datetime") {\n const regex = datetimeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: "datetime",\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "date") {\n const regex = dateRegex;\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: "date",\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "time") {\n const regex = timeRegex(check);\n if (!regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_string,\n validation: "time",\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "duration") {\n if (!durationRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "duration",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "ip") {\n if (!isValidIP(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "ip",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "jwt") {\n if (!isValidJWT(input.data, check.alg)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "jwt",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "cidr") {\n if (!isValidCidr(input.data, check.version)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "cidr",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "base64") {\n if (!base64Regex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "base64",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "base64url") {\n if (!base64urlRegex.test(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n validation: "base64url",\n code: ZodIssueCode.invalid_string,\n message: check.message\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _regex(regex, validation, message) {\n return this.refinement((data) => regex.test(data), {\n validation,\n code: ZodIssueCode.invalid_string,\n ...errorUtil.errToObj(message)\n });\n }\n _addCheck(check) {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, check]\n });\n }\n email(message) {\n return this._addCheck({ kind: "email", ...errorUtil.errToObj(message) });\n }\n url(message) {\n return this._addCheck({ kind: "url", ...errorUtil.errToObj(message) });\n }\n emoji(message) {\n return this._addCheck({ kind: "emoji", ...errorUtil.errToObj(message) });\n }\n uuid(message) {\n return this._addCheck({ kind: "uuid", ...errorUtil.errToObj(message) });\n }\n nanoid(message) {\n return this._addCheck({ kind: "nanoid", ...errorUtil.errToObj(message) });\n }\n cuid(message) {\n return this._addCheck({ kind: "cuid", ...errorUtil.errToObj(message) });\n }\n cuid2(message) {\n return this._addCheck({ kind: "cuid2", ...errorUtil.errToObj(message) });\n }\n ulid(message) {\n return this._addCheck({ kind: "ulid", ...errorUtil.errToObj(message) });\n }\n base64(message) {\n return this._addCheck({ kind: "base64", ...errorUtil.errToObj(message) });\n }\n base64url(message) {\n return this._addCheck({\n kind: "base64url",\n ...errorUtil.errToObj(message)\n });\n }\n jwt(options) {\n return this._addCheck({ kind: "jwt", ...errorUtil.errToObj(options) });\n }\n ip(options) {\n return this._addCheck({ kind: "ip", ...errorUtil.errToObj(options) });\n }\n cidr(options) {\n return this._addCheck({ kind: "cidr", ...errorUtil.errToObj(options) });\n }\n datetime(options) {\n if (typeof options === "string") {\n return this._addCheck({\n kind: "datetime",\n precision: null,\n offset: false,\n local: false,\n message: options\n });\n }\n return this._addCheck({\n kind: "datetime",\n precision: typeof (options == null ? void 0 : options.precision) === "undefined" ? null : options == null ? void 0 : options.precision,\n offset: (options == null ? void 0 : options.offset) ?? false,\n local: (options == null ? void 0 : options.local) ?? false,\n ...errorUtil.errToObj(options == null ? void 0 : options.message)\n });\n }\n date(message) {\n return this._addCheck({ kind: "date", message });\n }\n time(options) {\n if (typeof options === "string") {\n return this._addCheck({\n kind: "time",\n precision: null,\n message: options\n });\n }\n return this._addCheck({\n kind: "time",\n precision: typeof (options == null ? void 0 : options.precision) === "undefined" ? null : options == null ? void 0 : options.precision,\n ...errorUtil.errToObj(options == null ? void 0 : options.message)\n });\n }\n duration(message) {\n return this._addCheck({ kind: "duration", ...errorUtil.errToObj(message) });\n }\n regex(regex, message) {\n return this._addCheck({\n kind: "regex",\n regex,\n ...errorUtil.errToObj(message)\n });\n }\n includes(value, options) {\n return this._addCheck({\n kind: "includes",\n value,\n position: options == null ? void 0 : options.position,\n ...errorUtil.errToObj(options == null ? void 0 : options.message)\n });\n }\n startsWith(value, message) {\n return this._addCheck({\n kind: "startsWith",\n value,\n ...errorUtil.errToObj(message)\n });\n }\n endsWith(value, message) {\n return this._addCheck({\n kind: "endsWith",\n value,\n ...errorUtil.errToObj(message)\n });\n }\n min(minLength, message) {\n return this._addCheck({\n kind: "min",\n value: minLength,\n ...errorUtil.errToObj(message)\n });\n }\n max(maxLength, message) {\n return this._addCheck({\n kind: "max",\n value: maxLength,\n ...errorUtil.errToObj(message)\n });\n }\n length(len, message) {\n return this._addCheck({\n kind: "length",\n value: len,\n ...errorUtil.errToObj(message)\n });\n }\n /**\n * Equivalent to `.min(1)`\n */\n nonempty(message) {\n return this.min(1, errorUtil.errToObj(message));\n }\n trim() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: "trim" }]\n });\n }\n toLowerCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: "toLowerCase" }]\n });\n }\n toUpperCase() {\n return new ZodString({\n ...this._def,\n checks: [...this._def.checks, { kind: "toUpperCase" }]\n });\n }\n get isDatetime() {\n return !!this._def.checks.find((ch) => ch.kind === "datetime");\n }\n get isDate() {\n return !!this._def.checks.find((ch) => ch.kind === "date");\n }\n get isTime() {\n return !!this._def.checks.find((ch) => ch.kind === "time");\n }\n get isDuration() {\n return !!this._def.checks.find((ch) => ch.kind === "duration");\n }\n get isEmail() {\n return !!this._def.checks.find((ch) => ch.kind === "email");\n }\n get isURL() {\n return !!this._def.checks.find((ch) => ch.kind === "url");\n }\n get isEmoji() {\n return !!this._def.checks.find((ch) => ch.kind === "emoji");\n }\n get isUUID() {\n return !!this._def.checks.find((ch) => ch.kind === "uuid");\n }\n get isNANOID() {\n return !!this._def.checks.find((ch) => ch.kind === "nanoid");\n }\n get isCUID() {\n return !!this._def.checks.find((ch) => ch.kind === "cuid");\n }\n get isCUID2() {\n return !!this._def.checks.find((ch) => ch.kind === "cuid2");\n }\n get isULID() {\n return !!this._def.checks.find((ch) => ch.kind === "ulid");\n }\n get isIP() {\n return !!this._def.checks.find((ch) => ch.kind === "ip");\n }\n get isCIDR() {\n return !!this._def.checks.find((ch) => ch.kind === "cidr");\n }\n get isBase64() {\n return !!this._def.checks.find((ch) => ch.kind === "base64");\n }\n get isBase64url() {\n return !!this._def.checks.find((ch) => ch.kind === "base64url");\n }\n get minLength() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === "min") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxLength() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === "max") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n }\n ZodString.create = (params) => {\n return new ZodString({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodString,\n coerce: (params == null ? void 0 : params.coerce) ?? false,\n ...processCreateParams(params)\n });\n };\n function floatSafeRemainder(val, step) {\n const valDecCount = (val.toString().split(".")[1] || "").length;\n const stepDecCount = (step.toString().split(".")[1] || "").length;\n const decCount = valDecCount > stepDecCount ? valDecCount : stepDecCount;\n const valInt = Number.parseInt(val.toFixed(decCount).replace(".", ""));\n const stepInt = Number.parseInt(step.toFixed(decCount).replace(".", ""));\n return valInt % stepInt / 10 ** decCount;\n }\n class ZodNumber extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n this.step = this.multipleOf;\n }\n _parse(input) {\n if (this._def.coerce) {\n input.data = Number(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.number) {\n const ctx2 = this._getOrReturnCtx(input);\n addIssueToContext(ctx2, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.number,\n received: ctx2.parsedType\n });\n return INVALID;\n }\n let ctx = void 0;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === "int") {\n if (!util.isInteger(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: "integer",\n received: "float",\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "min") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: check.value,\n type: "number",\n inclusive: check.inclusive,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "max") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: check.value,\n type: "number",\n inclusive: check.inclusive,\n exact: false,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "multipleOf") {\n if (floatSafeRemainder(input.data, check.value) !== 0) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "finite") {\n if (!Number.isFinite(input.data)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_finite,\n message: check.message\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n gte(value, message) {\n return this.setLimit("min", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit("min", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit("max", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit("max", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodNumber({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message)\n }\n ]\n });\n }\n _addCheck(check) {\n return new ZodNumber({\n ...this._def,\n checks: [...this._def.checks, check]\n });\n }\n int(message) {\n return this._addCheck({\n kind: "int",\n message: errorUtil.toString(message)\n });\n }\n positive(message) {\n return this._addCheck({\n kind: "min",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n negative(message) {\n return this._addCheck({\n kind: "max",\n value: 0,\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: "max",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: "min",\n value: 0,\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: "multipleOf",\n value,\n message: errorUtil.toString(message)\n });\n }\n finite(message) {\n return this._addCheck({\n kind: "finite",\n message: errorUtil.toString(message)\n });\n }\n safe(message) {\n return this._addCheck({\n kind: "min",\n inclusive: true,\n value: Number.MIN_SAFE_INTEGER,\n message: errorUtil.toString(message)\n })._addCheck({\n kind: "max",\n inclusive: true,\n value: Number.MAX_SAFE_INTEGER,\n message: errorUtil.toString(message)\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === "min") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === "max") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n get isInt() {\n return !!this._def.checks.find((ch) => ch.kind === "int" || ch.kind === "multipleOf" && util.isInteger(ch.value));\n }\n get isFinite() {\n let max = null;\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === "finite" || ch.kind === "int" || ch.kind === "multipleOf") {\n return true;\n } else if (ch.kind === "min") {\n if (min === null || ch.value > min)\n min = ch.value;\n } else if (ch.kind === "max") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return Number.isFinite(min) && Number.isFinite(max);\n }\n }\n ZodNumber.create = (params) => {\n return new ZodNumber({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodNumber,\n coerce: (params == null ? void 0 : params.coerce) || false,\n ...processCreateParams(params)\n });\n };\n class ZodBigInt extends ZodType {\n constructor() {\n super(...arguments);\n this.min = this.gte;\n this.max = this.lte;\n }\n _parse(input) {\n if (this._def.coerce) {\n try {\n input.data = BigInt(input.data);\n } catch {\n return this._getInvalidInput(input);\n }\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.bigint) {\n return this._getInvalidInput(input);\n }\n let ctx = void 0;\n const status = new ParseStatus();\n for (const check of this._def.checks) {\n if (check.kind === "min") {\n const tooSmall = check.inclusive ? input.data < check.value : input.data <= check.value;\n if (tooSmall) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n type: "bigint",\n minimum: check.value,\n inclusive: check.inclusive,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "max") {\n const tooBig = check.inclusive ? input.data > check.value : input.data >= check.value;\n if (tooBig) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n type: "bigint",\n maximum: check.value,\n inclusive: check.inclusive,\n message: check.message\n });\n status.dirty();\n }\n } else if (check.kind === "multipleOf") {\n if (input.data % check.value !== BigInt(0)) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.not_multiple_of,\n multipleOf: check.value,\n message: check.message\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return { status: status.value, value: input.data };\n }\n _getInvalidInput(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.bigint,\n received: ctx.parsedType\n });\n return INVALID;\n }\n gte(value, message) {\n return this.setLimit("min", value, true, errorUtil.toString(message));\n }\n gt(value, message) {\n return this.setLimit("min", value, false, errorUtil.toString(message));\n }\n lte(value, message) {\n return this.setLimit("max", value, true, errorUtil.toString(message));\n }\n lt(value, message) {\n return this.setLimit("max", value, false, errorUtil.toString(message));\n }\n setLimit(kind, value, inclusive, message) {\n return new ZodBigInt({\n ...this._def,\n checks: [\n ...this._def.checks,\n {\n kind,\n value,\n inclusive,\n message: errorUtil.toString(message)\n }\n ]\n });\n }\n _addCheck(check) {\n return new ZodBigInt({\n ...this._def,\n checks: [...this._def.checks, check]\n });\n }\n positive(message) {\n return this._addCheck({\n kind: "min",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n negative(message) {\n return this._addCheck({\n kind: "max",\n value: BigInt(0),\n inclusive: false,\n message: errorUtil.toString(message)\n });\n }\n nonpositive(message) {\n return this._addCheck({\n kind: "max",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n nonnegative(message) {\n return this._addCheck({\n kind: "min",\n value: BigInt(0),\n inclusive: true,\n message: errorUtil.toString(message)\n });\n }\n multipleOf(value, message) {\n return this._addCheck({\n kind: "multipleOf",\n value,\n message: errorUtil.toString(message)\n });\n }\n get minValue() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === "min") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min;\n }\n get maxValue() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === "max") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max;\n }\n }\n ZodBigInt.create = (params) => {\n return new ZodBigInt({\n checks: [],\n typeName: ZodFirstPartyTypeKind.ZodBigInt,\n coerce: (params == null ? void 0 : params.coerce) ?? false,\n ...processCreateParams(params)\n });\n };\n class ZodBoolean extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = Boolean(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.boolean) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.boolean,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n }\n ZodBoolean.create = (params) => {\n return new ZodBoolean({\n typeName: ZodFirstPartyTypeKind.ZodBoolean,\n coerce: (params == null ? void 0 : params.coerce) || false,\n ...processCreateParams(params)\n });\n };\n class ZodDate extends ZodType {\n _parse(input) {\n if (this._def.coerce) {\n input.data = new Date(input.data);\n }\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.date) {\n const ctx2 = this._getOrReturnCtx(input);\n addIssueToContext(ctx2, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.date,\n received: ctx2.parsedType\n });\n return INVALID;\n }\n if (Number.isNaN(input.data.getTime())) {\n const ctx2 = this._getOrReturnCtx(input);\n addIssueToContext(ctx2, {\n code: ZodIssueCode.invalid_date\n });\n return INVALID;\n }\n const status = new ParseStatus();\n let ctx = void 0;\n for (const check of this._def.checks) {\n if (check.kind === "min") {\n if (input.data.getTime() < check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n message: check.message,\n inclusive: true,\n exact: false,\n minimum: check.value,\n type: "date"\n });\n status.dirty();\n }\n } else if (check.kind === "max") {\n if (input.data.getTime() > check.value) {\n ctx = this._getOrReturnCtx(input, ctx);\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n message: check.message,\n inclusive: true,\n exact: false,\n maximum: check.value,\n type: "date"\n });\n status.dirty();\n }\n } else {\n util.assertNever(check);\n }\n }\n return {\n status: status.value,\n value: new Date(input.data.getTime())\n };\n }\n _addCheck(check) {\n return new ZodDate({\n ...this._def,\n checks: [...this._def.checks, check]\n });\n }\n min(minDate, message) {\n return this._addCheck({\n kind: "min",\n value: minDate.getTime(),\n message: errorUtil.toString(message)\n });\n }\n max(maxDate, message) {\n return this._addCheck({\n kind: "max",\n value: maxDate.getTime(),\n message: errorUtil.toString(message)\n });\n }\n get minDate() {\n let min = null;\n for (const ch of this._def.checks) {\n if (ch.kind === "min") {\n if (min === null || ch.value > min)\n min = ch.value;\n }\n }\n return min != null ? new Date(min) : null;\n }\n get maxDate() {\n let max = null;\n for (const ch of this._def.checks) {\n if (ch.kind === "max") {\n if (max === null || ch.value < max)\n max = ch.value;\n }\n }\n return max != null ? new Date(max) : null;\n }\n }\n ZodDate.create = (params) => {\n return new ZodDate({\n checks: [],\n coerce: (params == null ? void 0 : params.coerce) || false,\n typeName: ZodFirstPartyTypeKind.ZodDate,\n ...processCreateParams(params)\n });\n };\n class ZodSymbol extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.symbol) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.symbol,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n }\n ZodSymbol.create = (params) => {\n return new ZodSymbol({\n typeName: ZodFirstPartyTypeKind.ZodSymbol,\n ...processCreateParams(params)\n });\n };\n class ZodUndefined extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.undefined,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n }\n ZodUndefined.create = (params) => {\n return new ZodUndefined({\n typeName: ZodFirstPartyTypeKind.ZodUndefined,\n ...processCreateParams(params)\n });\n };\n class ZodNull extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.null) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.null,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n }\n ZodNull.create = (params) => {\n return new ZodNull({\n typeName: ZodFirstPartyTypeKind.ZodNull,\n ...processCreateParams(params)\n });\n };\n class ZodAny extends ZodType {\n constructor() {\n super(...arguments);\n this._any = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n }\n ZodAny.create = (params) => {\n return new ZodAny({\n typeName: ZodFirstPartyTypeKind.ZodAny,\n ...processCreateParams(params)\n });\n };\n class ZodUnknown extends ZodType {\n constructor() {\n super(...arguments);\n this._unknown = true;\n }\n _parse(input) {\n return OK(input.data);\n }\n }\n ZodUnknown.create = (params) => {\n return new ZodUnknown({\n typeName: ZodFirstPartyTypeKind.ZodUnknown,\n ...processCreateParams(params)\n });\n };\n class ZodNever extends ZodType {\n _parse(input) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.never,\n received: ctx.parsedType\n });\n return INVALID;\n }\n }\n ZodNever.create = (params) => {\n return new ZodNever({\n typeName: ZodFirstPartyTypeKind.ZodNever,\n ...processCreateParams(params)\n });\n };\n class ZodVoid extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.undefined) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.void,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return OK(input.data);\n }\n }\n ZodVoid.create = (params) => {\n return new ZodVoid({\n typeName: ZodFirstPartyTypeKind.ZodVoid,\n ...processCreateParams(params)\n });\n };\n class ZodArray extends ZodType {\n _parse(input) {\n const { ctx, status } = this._processInputParams(input);\n const def = this._def;\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType\n });\n return INVALID;\n }\n if (def.exactLength !== null) {\n const tooBig = ctx.data.length > def.exactLength.value;\n const tooSmall = ctx.data.length < def.exactLength.value;\n if (tooBig || tooSmall) {\n addIssueToContext(ctx, {\n code: tooBig ? ZodIssueCode.too_big : ZodIssueCode.too_small,\n minimum: tooSmall ? def.exactLength.value : void 0,\n maximum: tooBig ? def.exactLength.value : void 0,\n type: "array",\n inclusive: true,\n exact: true,\n message: def.exactLength.message\n });\n status.dirty();\n }\n }\n if (def.minLength !== null) {\n if (ctx.data.length < def.minLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minLength.value,\n type: "array",\n inclusive: true,\n exact: false,\n message: def.minLength.message\n });\n status.dirty();\n }\n }\n if (def.maxLength !== null) {\n if (ctx.data.length > def.maxLength.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxLength.value,\n type: "array",\n inclusive: true,\n exact: false,\n message: def.maxLength.message\n });\n status.dirty();\n }\n }\n if (ctx.common.async) {\n return Promise.all([...ctx.data].map((item, i2) => {\n return def.type._parseAsync(new ParseInputLazyPath(ctx, item, ctx.path, i2));\n })).then((result2) => {\n return ParseStatus.mergeArray(status, result2);\n });\n }\n const result = [...ctx.data].map((item, i2) => {\n return def.type._parseSync(new ParseInputLazyPath(ctx, item, ctx.path, i2));\n });\n return ParseStatus.mergeArray(status, result);\n }\n get element() {\n return this._def.type;\n }\n min(minLength, message) {\n return new ZodArray({\n ...this._def,\n minLength: { value: minLength, message: errorUtil.toString(message) }\n });\n }\n max(maxLength, message) {\n return new ZodArray({\n ...this._def,\n maxLength: { value: maxLength, message: errorUtil.toString(message) }\n });\n }\n length(len, message) {\n return new ZodArray({\n ...this._def,\n exactLength: { value: len, message: errorUtil.toString(message) }\n });\n }\n nonempty(message) {\n return this.min(1, message);\n }\n }\n ZodArray.create = (schema, params) => {\n return new ZodArray({\n type: schema,\n minLength: null,\n maxLength: null,\n exactLength: null,\n typeName: ZodFirstPartyTypeKind.ZodArray,\n ...processCreateParams(params)\n });\n };\n function deepPartialify(schema) {\n if (schema instanceof ZodObject) {\n const newShape = {};\n for (const key in schema.shape) {\n const fieldSchema = schema.shape[key];\n newShape[key] = ZodOptional.create(deepPartialify(fieldSchema));\n }\n return new ZodObject({\n ...schema._def,\n shape: () => newShape\n });\n } else if (schema instanceof ZodArray) {\n return new ZodArray({\n ...schema._def,\n type: deepPartialify(schema.element)\n });\n } else if (schema instanceof ZodOptional) {\n return ZodOptional.create(deepPartialify(schema.unwrap()));\n } else if (schema instanceof ZodNullable) {\n return ZodNullable.create(deepPartialify(schema.unwrap()));\n } else if (schema instanceof ZodTuple) {\n return ZodTuple.create(schema.items.map((item) => deepPartialify(item)));\n } else {\n return schema;\n }\n }\n class ZodObject extends ZodType {\n constructor() {\n super(...arguments);\n this._cached = null;\n this.nonstrict = this.passthrough;\n this.augment = this.extend;\n }\n _getCached() {\n if (this._cached !== null)\n return this._cached;\n const shape = this._def.shape();\n const keys = util.objectKeys(shape);\n this._cached = { shape, keys };\n return this._cached;\n }\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.object) {\n const ctx2 = this._getOrReturnCtx(input);\n addIssueToContext(ctx2, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx2.parsedType\n });\n return INVALID;\n }\n const { status, ctx } = this._processInputParams(input);\n const { shape, keys: shapeKeys } = this._getCached();\n const extraKeys = [];\n if (!(this._def.catchall instanceof ZodNever && this._def.unknownKeys === "strip")) {\n for (const key in ctx.data) {\n if (!shapeKeys.includes(key)) {\n extraKeys.push(key);\n }\n }\n }\n const pairs = [];\n for (const key of shapeKeys) {\n const keyValidator = shape[key];\n const value = ctx.data[key];\n pairs.push({\n key: { status: "valid", value: key },\n value: keyValidator._parse(new ParseInputLazyPath(ctx, value, ctx.path, key)),\n alwaysSet: key in ctx.data\n });\n }\n if (this._def.catchall instanceof ZodNever) {\n const unknownKeys = this._def.unknownKeys;\n if (unknownKeys === "passthrough") {\n for (const key of extraKeys) {\n pairs.push({\n key: { status: "valid", value: key },\n value: { status: "valid", value: ctx.data[key] }\n });\n }\n } else if (unknownKeys === "strict") {\n if (extraKeys.length > 0) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.unrecognized_keys,\n keys: extraKeys\n });\n status.dirty();\n }\n } else if (unknownKeys === "strip") ;\n else {\n throw new Error(`Internal ZodObject error: invalid unknownKeys value.`);\n }\n } else {\n const catchall = this._def.catchall;\n for (const key of extraKeys) {\n const value = ctx.data[key];\n pairs.push({\n key: { status: "valid", value: key },\n value: catchall._parse(\n new ParseInputLazyPath(ctx, value, ctx.path, key)\n //, ctx.child(key), value, getParsedType(value)\n ),\n alwaysSet: key in ctx.data\n });\n }\n }\n if (ctx.common.async) {\n return Promise.resolve().then(async () => {\n const syncPairs = [];\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n syncPairs.push({\n key,\n value,\n alwaysSet: pair.alwaysSet\n });\n }\n return syncPairs;\n }).then((syncPairs) => {\n return ParseStatus.mergeObjectSync(status, syncPairs);\n });\n } else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get shape() {\n return this._def.shape();\n }\n strict(message) {\n errorUtil.errToObj;\n return new ZodObject({\n ...this._def,\n unknownKeys: "strict",\n ...message !== void 0 ? {\n errorMap: (issue, ctx) => {\n var _a, _b;\n const defaultError = ((_b = (_a = this._def).errorMap) == null ? void 0 : _b.call(_a, issue, ctx).message) ?? ctx.defaultError;\n if (issue.code === "unrecognized_keys")\n return {\n message: errorUtil.errToObj(message).message ?? defaultError\n };\n return {\n message: defaultError\n };\n }\n } : {}\n });\n }\n strip() {\n return new ZodObject({\n ...this._def,\n unknownKeys: "strip"\n });\n }\n passthrough() {\n return new ZodObject({\n ...this._def,\n unknownKeys: "passthrough"\n });\n }\n // const AugmentFactory =\n // <Def extends ZodObjectDef>(def: Def) =>\n // <Augmentation extends ZodRawShape>(\n // augmentation: Augmentation\n // ): ZodObject<\n // extendShape<ReturnType<Def["shape"]>, Augmentation>,\n // Def["unknownKeys"],\n // Def["catchall"]\n // > => {\n // return new ZodObject({\n // ...def,\n // shape: () => ({\n // ...def.shape(),\n // ...augmentation,\n // }),\n // }) as any;\n // };\n extend(augmentation) {\n return new ZodObject({\n ...this._def,\n shape: () => ({\n ...this._def.shape(),\n ...augmentation\n })\n });\n }\n /**\n * Prior to zod@1.0.12 there was a bug in the\n * inferred type of merged objects. Please\n * upgrade if you are experiencing issues.\n */\n merge(merging) {\n const merged = new ZodObject({\n unknownKeys: merging._def.unknownKeys,\n catchall: merging._def.catchall,\n shape: () => ({\n ...this._def.shape(),\n ...merging._def.shape()\n }),\n typeName: ZodFirstPartyTypeKind.ZodObject\n });\n return merged;\n }\n // merge<\n // Incoming extends AnyZodObject,\n // Augmentation extends Incoming["shape"],\n // NewOutput extends {\n // [k in keyof Augmentation | keyof Output]: k extends keyof Augmentation\n // ? Augmentation[k]["_output"]\n // : k extends keyof Output\n // ? Output[k]\n // : never;\n // },\n // NewInput extends {\n // [k in keyof Augmentation | keyof Input]: k extends keyof Augmentation\n // ? Augmentation[k]["_input"]\n // : k extends keyof Input\n // ? Input[k]\n // : never;\n // }\n // >(\n // merging: Incoming\n // ): ZodObject<\n // extendShape<T, ReturnType<Incoming["_def"]["shape"]>>,\n // Incoming["_def"]["unknownKeys"],\n // Incoming["_def"]["catchall"],\n // NewOutput,\n // NewInput\n // > {\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n setKey(key, schema) {\n return this.augment({ [key]: schema });\n }\n // merge<Incoming extends AnyZodObject>(\n // merging: Incoming\n // ): //ZodObject<T & Incoming["_shape"], UnknownKeys, Catchall> = (merging) => {\n // ZodObject<\n // extendShape<T, ReturnType<Incoming["_def"]["shape"]>>,\n // Incoming["_def"]["unknownKeys"],\n // Incoming["_def"]["catchall"]\n // > {\n // // const mergedShape = objectUtil.mergeShapes(\n // // this._def.shape(),\n // // merging._def.shape()\n // // );\n // const merged: any = new ZodObject({\n // unknownKeys: merging._def.unknownKeys,\n // catchall: merging._def.catchall,\n // shape: () =>\n // objectUtil.mergeShapes(this._def.shape(), merging._def.shape()),\n // typeName: ZodFirstPartyTypeKind.ZodObject,\n // }) as any;\n // return merged;\n // }\n catchall(index) {\n return new ZodObject({\n ...this._def,\n catchall: index\n });\n }\n pick(mask) {\n const shape = {};\n for (const key of util.objectKeys(mask)) {\n if (mask[key] && this.shape[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape\n });\n }\n omit(mask) {\n const shape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (!mask[key]) {\n shape[key] = this.shape[key];\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => shape\n });\n }\n /**\n * @deprecated\n */\n deepPartial() {\n return deepPartialify(this);\n }\n partial(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n const fieldSchema = this.shape[key];\n if (mask && !mask[key]) {\n newShape[key] = fieldSchema;\n } else {\n newShape[key] = fieldSchema.optional();\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape\n });\n }\n required(mask) {\n const newShape = {};\n for (const key of util.objectKeys(this.shape)) {\n if (mask && !mask[key]) {\n newShape[key] = this.shape[key];\n } else {\n const fieldSchema = this.shape[key];\n let newField = fieldSchema;\n while (newField instanceof ZodOptional) {\n newField = newField._def.innerType;\n }\n newShape[key] = newField;\n }\n }\n return new ZodObject({\n ...this._def,\n shape: () => newShape\n });\n }\n keyof() {\n return createZodEnum(util.objectKeys(this.shape));\n }\n }\n ZodObject.create = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: "strip",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params)\n });\n };\n ZodObject.strictCreate = (shape, params) => {\n return new ZodObject({\n shape: () => shape,\n unknownKeys: "strict",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params)\n });\n };\n ZodObject.lazycreate = (shape, params) => {\n return new ZodObject({\n shape,\n unknownKeys: "strip",\n catchall: ZodNever.create(),\n typeName: ZodFirstPartyTypeKind.ZodObject,\n ...processCreateParams(params)\n });\n };\n class ZodUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const options = this._def.options;\n function handleResults(results) {\n for (const result of results) {\n if (result.result.status === "valid") {\n return result.result;\n }\n }\n for (const result of results) {\n if (result.result.status === "dirty") {\n ctx.common.issues.push(...result.ctx.common.issues);\n return result.result;\n }\n }\n const unionErrors = results.map((result) => new ZodError(result.ctx.common.issues));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return Promise.all(options.map(async (option) => {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: []\n },\n parent: null\n };\n return {\n result: await option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx\n }),\n ctx: childCtx\n };\n })).then(handleResults);\n } else {\n let dirty = void 0;\n const issues = [];\n for (const option of options) {\n const childCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: []\n },\n parent: null\n };\n const result = option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: childCtx\n });\n if (result.status === "valid") {\n return result;\n } else if (result.status === "dirty" && !dirty) {\n dirty = { result, ctx: childCtx };\n }\n if (childCtx.common.issues.length) {\n issues.push(childCtx.common.issues);\n }\n }\n if (dirty) {\n ctx.common.issues.push(...dirty.ctx.common.issues);\n return dirty.result;\n }\n const unionErrors = issues.map((issues2) => new ZodError(issues2));\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union,\n unionErrors\n });\n return INVALID;\n }\n }\n get options() {\n return this._def.options;\n }\n }\n ZodUnion.create = (types, params) => {\n return new ZodUnion({\n options: types,\n typeName: ZodFirstPartyTypeKind.ZodUnion,\n ...processCreateParams(params)\n });\n };\n const getDiscriminator = (type) => {\n if (type instanceof ZodLazy) {\n return getDiscriminator(type.schema);\n } else if (type instanceof ZodEffects) {\n return getDiscriminator(type.innerType());\n } else if (type instanceof ZodLiteral) {\n return [type.value];\n } else if (type instanceof ZodEnum) {\n return type.options;\n } else if (type instanceof ZodNativeEnum) {\n return util.objectValues(type.enum);\n } else if (type instanceof ZodDefault) {\n return getDiscriminator(type._def.innerType);\n } else if (type instanceof ZodUndefined) {\n return [void 0];\n } else if (type instanceof ZodNull) {\n return [null];\n } else if (type instanceof ZodOptional) {\n return [void 0, ...getDiscriminator(type.unwrap())];\n } else if (type instanceof ZodNullable) {\n return [null, ...getDiscriminator(type.unwrap())];\n } else if (type instanceof ZodBranded) {\n return getDiscriminator(type.unwrap());\n } else if (type instanceof ZodReadonly) {\n return getDiscriminator(type.unwrap());\n } else if (type instanceof ZodCatch) {\n return getDiscriminator(type._def.innerType);\n } else {\n return [];\n }\n };\n class ZodDiscriminatedUnion extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const discriminator = this.discriminator;\n const discriminatorValue = ctx.data[discriminator];\n const option = this.optionsMap.get(discriminatorValue);\n if (!option) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_union_discriminator,\n options: Array.from(this.optionsMap.keys()),\n path: [discriminator]\n });\n return INVALID;\n }\n if (ctx.common.async) {\n return option._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n } else {\n return option._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n }\n }\n get discriminator() {\n return this._def.discriminator;\n }\n get options() {\n return this._def.options;\n }\n get optionsMap() {\n return this._def.optionsMap;\n }\n /**\n * The constructor of the discriminated union schema. Its behaviour is very similar to that of the normal z.union() constructor.\n * However, it only allows a union of objects, all of which need to share a discriminator property. This property must\n * have a different value for each object in the union.\n * @param discriminator the name of the discriminator property\n * @param types an array of object schemas\n * @param params\n */\n static create(discriminator, options, params) {\n const optionsMap = /* @__PURE__ */ new Map();\n for (const type of options) {\n const discriminatorValues = getDiscriminator(type.shape[discriminator]);\n if (!discriminatorValues.length) {\n throw new Error(`A discriminator value for key \\`${discriminator}\\` could not be extracted from all schema options`);\n }\n for (const value of discriminatorValues) {\n if (optionsMap.has(value)) {\n throw new Error(`Discriminator property ${String(discriminator)} has duplicate value ${String(value)}`);\n }\n optionsMap.set(value, type);\n }\n }\n return new ZodDiscriminatedUnion({\n typeName: ZodFirstPartyTypeKind.ZodDiscriminatedUnion,\n discriminator,\n options,\n optionsMap,\n ...processCreateParams(params)\n });\n }\n }\n function mergeValues(a2, b) {\n const aType = getParsedType(a2);\n const bType = getParsedType(b);\n if (a2 === b) {\n return { valid: true, data: a2 };\n } else if (aType === ZodParsedType.object && bType === ZodParsedType.object) {\n const bKeys = util.objectKeys(b);\n const sharedKeys = util.objectKeys(a2).filter((key) => bKeys.indexOf(key) !== -1);\n const newObj = { ...a2, ...b };\n for (const key of sharedKeys) {\n const sharedValue = mergeValues(a2[key], b[key]);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newObj[key] = sharedValue.data;\n }\n return { valid: true, data: newObj };\n } else if (aType === ZodParsedType.array && bType === ZodParsedType.array) {\n if (a2.length !== b.length) {\n return { valid: false };\n }\n const newArray = [];\n for (let index = 0; index < a2.length; index++) {\n const itemA = a2[index];\n const itemB = b[index];\n const sharedValue = mergeValues(itemA, itemB);\n if (!sharedValue.valid) {\n return { valid: false };\n }\n newArray.push(sharedValue.data);\n }\n return { valid: true, data: newArray };\n } else if (aType === ZodParsedType.date && bType === ZodParsedType.date && +a2 === +b) {\n return { valid: true, data: a2 };\n } else {\n return { valid: false };\n }\n }\n class ZodIntersection extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const handleParsed = (parsedLeft, parsedRight) => {\n if (isAborted(parsedLeft) || isAborted(parsedRight)) {\n return INVALID;\n }\n const merged = mergeValues(parsedLeft.value, parsedRight.value);\n if (!merged.valid) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_intersection_types\n });\n return INVALID;\n }\n if (isDirty(parsedLeft) || isDirty(parsedRight)) {\n status.dirty();\n }\n return { status: status.value, value: merged.data };\n };\n if (ctx.common.async) {\n return Promise.all([\n this._def.left._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }),\n this._def.right._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n })\n ]).then(([left, right]) => handleParsed(left, right));\n } else {\n return handleParsed(this._def.left._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }), this._def.right._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n }));\n }\n }\n }\n ZodIntersection.create = (left, right, params) => {\n return new ZodIntersection({\n left,\n right,\n typeName: ZodFirstPartyTypeKind.ZodIntersection,\n ...processCreateParams(params)\n });\n };\n class ZodTuple extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.array) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.array,\n received: ctx.parsedType\n });\n return INVALID;\n }\n if (ctx.data.length < this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: "array"\n });\n return INVALID;\n }\n const rest = this._def.rest;\n if (!rest && ctx.data.length > this._def.items.length) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: this._def.items.length,\n inclusive: true,\n exact: false,\n type: "array"\n });\n status.dirty();\n }\n const items = [...ctx.data].map((item, itemIndex) => {\n const schema = this._def.items[itemIndex] || this._def.rest;\n if (!schema)\n return null;\n return schema._parse(new ParseInputLazyPath(ctx, item, ctx.path, itemIndex));\n }).filter((x) => !!x);\n if (ctx.common.async) {\n return Promise.all(items).then((results) => {\n return ParseStatus.mergeArray(status, results);\n });\n } else {\n return ParseStatus.mergeArray(status, items);\n }\n }\n get items() {\n return this._def.items;\n }\n rest(rest) {\n return new ZodTuple({\n ...this._def,\n rest\n });\n }\n }\n ZodTuple.create = (schemas, params) => {\n if (!Array.isArray(schemas)) {\n throw new Error("You must pass an array of schemas to z.tuple([ ... ])");\n }\n return new ZodTuple({\n items: schemas,\n typeName: ZodFirstPartyTypeKind.ZodTuple,\n rest: null,\n ...processCreateParams(params)\n });\n };\n class ZodRecord extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.object) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.object,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const pairs = [];\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n for (const key in ctx.data) {\n pairs.push({\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, key)),\n value: valueType._parse(new ParseInputLazyPath(ctx, ctx.data[key], ctx.path, key)),\n alwaysSet: key in ctx.data\n });\n }\n if (ctx.common.async) {\n return ParseStatus.mergeObjectAsync(status, pairs);\n } else {\n return ParseStatus.mergeObjectSync(status, pairs);\n }\n }\n get element() {\n return this._def.valueType;\n }\n static create(first, second, third) {\n if (second instanceof ZodType) {\n return new ZodRecord({\n keyType: first,\n valueType: second,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(third)\n });\n }\n return new ZodRecord({\n keyType: ZodString.create(),\n valueType: first,\n typeName: ZodFirstPartyTypeKind.ZodRecord,\n ...processCreateParams(second)\n });\n }\n }\n class ZodMap extends ZodType {\n get keySchema() {\n return this._def.keyType;\n }\n get valueSchema() {\n return this._def.valueType;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.map) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.map,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const keyType = this._def.keyType;\n const valueType = this._def.valueType;\n const pairs = [...ctx.data.entries()].map(([key, value], index) => {\n return {\n key: keyType._parse(new ParseInputLazyPath(ctx, key, ctx.path, [index, "key"])),\n value: valueType._parse(new ParseInputLazyPath(ctx, value, ctx.path, [index, "value"]))\n };\n });\n if (ctx.common.async) {\n const finalMap = /* @__PURE__ */ new Map();\n return Promise.resolve().then(async () => {\n for (const pair of pairs) {\n const key = await pair.key;\n const value = await pair.value;\n if (key.status === "aborted" || value.status === "aborted") {\n return INVALID;\n }\n if (key.status === "dirty" || value.status === "dirty") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n });\n } else {\n const finalMap = /* @__PURE__ */ new Map();\n for (const pair of pairs) {\n const key = pair.key;\n const value = pair.value;\n if (key.status === "aborted" || value.status === "aborted") {\n return INVALID;\n }\n if (key.status === "dirty" || value.status === "dirty") {\n status.dirty();\n }\n finalMap.set(key.value, value.value);\n }\n return { status: status.value, value: finalMap };\n }\n }\n }\n ZodMap.create = (keyType, valueType, params) => {\n return new ZodMap({\n valueType,\n keyType,\n typeName: ZodFirstPartyTypeKind.ZodMap,\n ...processCreateParams(params)\n });\n };\n class ZodSet extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.set) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.set,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const def = this._def;\n if (def.minSize !== null) {\n if (ctx.data.size < def.minSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_small,\n minimum: def.minSize.value,\n type: "set",\n inclusive: true,\n exact: false,\n message: def.minSize.message\n });\n status.dirty();\n }\n }\n if (def.maxSize !== null) {\n if (ctx.data.size > def.maxSize.value) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.too_big,\n maximum: def.maxSize.value,\n type: "set",\n inclusive: true,\n exact: false,\n message: def.maxSize.message\n });\n status.dirty();\n }\n }\n const valueType = this._def.valueType;\n function finalizeSet(elements2) {\n const parsedSet = /* @__PURE__ */ new Set();\n for (const element of elements2) {\n if (element.status === "aborted")\n return INVALID;\n if (element.status === "dirty")\n status.dirty();\n parsedSet.add(element.value);\n }\n return { status: status.value, value: parsedSet };\n }\n const elements = [...ctx.data.values()].map((item, i2) => valueType._parse(new ParseInputLazyPath(ctx, item, ctx.path, i2)));\n if (ctx.common.async) {\n return Promise.all(elements).then((elements2) => finalizeSet(elements2));\n } else {\n return finalizeSet(elements);\n }\n }\n min(minSize, message) {\n return new ZodSet({\n ...this._def,\n minSize: { value: minSize, message: errorUtil.toString(message) }\n });\n }\n max(maxSize, message) {\n return new ZodSet({\n ...this._def,\n maxSize: { value: maxSize, message: errorUtil.toString(message) }\n });\n }\n size(size, message) {\n return this.min(size, message).max(size, message);\n }\n nonempty(message) {\n return this.min(1, message);\n }\n }\n ZodSet.create = (valueType, params) => {\n return new ZodSet({\n valueType,\n minSize: null,\n maxSize: null,\n typeName: ZodFirstPartyTypeKind.ZodSet,\n ...processCreateParams(params)\n });\n };\n class ZodFunction extends ZodType {\n constructor() {\n super(...arguments);\n this.validate = this.implement;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.function) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.function,\n received: ctx.parsedType\n });\n return INVALID;\n }\n function makeArgsIssue(args, error) {\n return makeIssue({\n data: args,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), errorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_arguments,\n argumentsError: error\n }\n });\n }\n function makeReturnsIssue(returns, error) {\n return makeIssue({\n data: returns,\n path: ctx.path,\n errorMaps: [ctx.common.contextualErrorMap, ctx.schemaErrorMap, getErrorMap(), errorMap].filter((x) => !!x),\n issueData: {\n code: ZodIssueCode.invalid_return_type,\n returnTypeError: error\n }\n });\n }\n const params = { errorMap: ctx.common.contextualErrorMap };\n const fn = ctx.data;\n if (this._def.returns instanceof ZodPromise) {\n const me = this;\n return OK(async function(...args) {\n const error = new ZodError([]);\n const parsedArgs = await me._def.args.parseAsync(args, params).catch((e2) => {\n error.addIssue(makeArgsIssue(args, e2));\n throw error;\n });\n const result = await Reflect.apply(fn, this, parsedArgs);\n const parsedReturns = await me._def.returns._def.type.parseAsync(result, params).catch((e2) => {\n error.addIssue(makeReturnsIssue(result, e2));\n throw error;\n });\n return parsedReturns;\n });\n } else {\n const me = this;\n return OK(function(...args) {\n const parsedArgs = me._def.args.safeParse(args, params);\n if (!parsedArgs.success) {\n throw new ZodError([makeArgsIssue(args, parsedArgs.error)]);\n }\n const result = Reflect.apply(fn, this, parsedArgs.data);\n const parsedReturns = me._def.returns.safeParse(result, params);\n if (!parsedReturns.success) {\n throw new ZodError([makeReturnsIssue(result, parsedReturns.error)]);\n }\n return parsedReturns.data;\n });\n }\n }\n parameters() {\n return this._def.args;\n }\n returnType() {\n return this._def.returns;\n }\n args(...items) {\n return new ZodFunction({\n ...this._def,\n args: ZodTuple.create(items).rest(ZodUnknown.create())\n });\n }\n returns(returnType) {\n return new ZodFunction({\n ...this._def,\n returns: returnType\n });\n }\n implement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n strictImplement(func) {\n const validatedFunc = this.parse(func);\n return validatedFunc;\n }\n static create(args, returns, params) {\n return new ZodFunction({\n args: args ? args : ZodTuple.create([]).rest(ZodUnknown.create()),\n returns: returns || ZodUnknown.create(),\n typeName: ZodFirstPartyTypeKind.ZodFunction,\n ...processCreateParams(params)\n });\n }\n }\n class ZodLazy extends ZodType {\n get schema() {\n return this._def.getter();\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const lazySchema = this._def.getter();\n return lazySchema._parse({ data: ctx.data, path: ctx.path, parent: ctx });\n }\n }\n ZodLazy.create = (getter, params) => {\n return new ZodLazy({\n getter,\n typeName: ZodFirstPartyTypeKind.ZodLazy,\n ...processCreateParams(params)\n });\n };\n class ZodLiteral extends ZodType {\n _parse(input) {\n if (input.data !== this._def.value) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_literal,\n expected: this._def.value\n });\n return INVALID;\n }\n return { status: "valid", value: input.data };\n }\n get value() {\n return this._def.value;\n }\n }\n ZodLiteral.create = (value, params) => {\n return new ZodLiteral({\n value,\n typeName: ZodFirstPartyTypeKind.ZodLiteral,\n ...processCreateParams(params)\n });\n };\n function createZodEnum(values, params) {\n return new ZodEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodEnum,\n ...processCreateParams(params)\n });\n }\n class ZodEnum extends ZodType {\n _parse(input) {\n if (typeof input.data !== "string") {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(this._def.values);\n }\n if (!this._cache.has(input.data)) {\n const ctx = this._getOrReturnCtx(input);\n const expectedValues = this._def.values;\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get options() {\n return this._def.values;\n }\n get enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Values() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n get Enum() {\n const enumValues = {};\n for (const val of this._def.values) {\n enumValues[val] = val;\n }\n return enumValues;\n }\n extract(values, newDef = this._def) {\n return ZodEnum.create(values, {\n ...this._def,\n ...newDef\n });\n }\n exclude(values, newDef = this._def) {\n return ZodEnum.create(this.options.filter((opt) => !values.includes(opt)), {\n ...this._def,\n ...newDef\n });\n }\n }\n ZodEnum.create = createZodEnum;\n class ZodNativeEnum extends ZodType {\n _parse(input) {\n const nativeEnumValues = util.getValidEnumValues(this._def.values);\n const ctx = this._getOrReturnCtx(input);\n if (ctx.parsedType !== ZodParsedType.string && ctx.parsedType !== ZodParsedType.number) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n expected: util.joinValues(expectedValues),\n received: ctx.parsedType,\n code: ZodIssueCode.invalid_type\n });\n return INVALID;\n }\n if (!this._cache) {\n this._cache = new Set(util.getValidEnumValues(this._def.values));\n }\n if (!this._cache.has(input.data)) {\n const expectedValues = util.objectValues(nativeEnumValues);\n addIssueToContext(ctx, {\n received: ctx.data,\n code: ZodIssueCode.invalid_enum_value,\n options: expectedValues\n });\n return INVALID;\n }\n return OK(input.data);\n }\n get enum() {\n return this._def.values;\n }\n }\n ZodNativeEnum.create = (values, params) => {\n return new ZodNativeEnum({\n values,\n typeName: ZodFirstPartyTypeKind.ZodNativeEnum,\n ...processCreateParams(params)\n });\n };\n class ZodPromise extends ZodType {\n unwrap() {\n return this._def.type;\n }\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n if (ctx.parsedType !== ZodParsedType.promise && ctx.common.async === false) {\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.promise,\n received: ctx.parsedType\n });\n return INVALID;\n }\n const promisified = ctx.parsedType === ZodParsedType.promise ? ctx.data : Promise.resolve(ctx.data);\n return OK(promisified.then((data) => {\n return this._def.type.parseAsync(data, {\n path: ctx.path,\n errorMap: ctx.common.contextualErrorMap\n });\n }));\n }\n }\n ZodPromise.create = (schema, params) => {\n return new ZodPromise({\n type: schema,\n typeName: ZodFirstPartyTypeKind.ZodPromise,\n ...processCreateParams(params)\n });\n };\n class ZodEffects extends ZodType {\n innerType() {\n return this._def.schema;\n }\n sourceType() {\n return this._def.schema._def.typeName === ZodFirstPartyTypeKind.ZodEffects ? this._def.schema.sourceType() : this._def.schema;\n }\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n const effect = this._def.effect || null;\n const checkCtx = {\n addIssue: (arg) => {\n addIssueToContext(ctx, arg);\n if (arg.fatal) {\n status.abort();\n } else {\n status.dirty();\n }\n },\n get path() {\n return ctx.path;\n }\n };\n checkCtx.addIssue = checkCtx.addIssue.bind(checkCtx);\n if (effect.type === "preprocess") {\n const processed = effect.transform(ctx.data, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(processed).then(async (processed2) => {\n if (status.value === "aborted")\n return INVALID;\n const result = await this._def.schema._parseAsync({\n data: processed2,\n path: ctx.path,\n parent: ctx\n });\n if (result.status === "aborted")\n return INVALID;\n if (result.status === "dirty")\n return DIRTY(result.value);\n if (status.value === "dirty")\n return DIRTY(result.value);\n return result;\n });\n } else {\n if (status.value === "aborted")\n return INVALID;\n const result = this._def.schema._parseSync({\n data: processed,\n path: ctx.path,\n parent: ctx\n });\n if (result.status === "aborted")\n return INVALID;\n if (result.status === "dirty")\n return DIRTY(result.value);\n if (status.value === "dirty")\n return DIRTY(result.value);\n return result;\n }\n }\n if (effect.type === "refinement") {\n const executeRefinement = (acc) => {\n const result = effect.refinement(acc, checkCtx);\n if (ctx.common.async) {\n return Promise.resolve(result);\n }\n if (result instanceof Promise) {\n throw new Error("Async refinement encountered during synchronous parse operation. Use .parseAsync instead.");\n }\n return acc;\n };\n if (ctx.common.async === false) {\n const inner = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (inner.status === "aborted")\n return INVALID;\n if (inner.status === "dirty")\n status.dirty();\n executeRefinement(inner.value);\n return { status: status.value, value: inner.value };\n } else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((inner) => {\n if (inner.status === "aborted")\n return INVALID;\n if (inner.status === "dirty")\n status.dirty();\n return executeRefinement(inner.value).then(() => {\n return { status: status.value, value: inner.value };\n });\n });\n }\n }\n if (effect.type === "transform") {\n if (ctx.common.async === false) {\n const base = this._def.schema._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (!isValid(base))\n return INVALID;\n const result = effect.transform(base.value, checkCtx);\n if (result instanceof Promise) {\n throw new Error(`Asynchronous transform encountered during synchronous parse operation. Use .parseAsync instead.`);\n }\n return { status: status.value, value: result };\n } else {\n return this._def.schema._parseAsync({ data: ctx.data, path: ctx.path, parent: ctx }).then((base) => {\n if (!isValid(base))\n return INVALID;\n return Promise.resolve(effect.transform(base.value, checkCtx)).then((result) => ({\n status: status.value,\n value: result\n }));\n });\n }\n }\n util.assertNever(effect);\n }\n }\n ZodEffects.create = (schema, effect, params) => {\n return new ZodEffects({\n schema,\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n effect,\n ...processCreateParams(params)\n });\n };\n ZodEffects.createWithPreprocess = (preprocess, schema, params) => {\n return new ZodEffects({\n schema,\n effect: { type: "preprocess", transform: preprocess },\n typeName: ZodFirstPartyTypeKind.ZodEffects,\n ...processCreateParams(params)\n });\n };\n class ZodOptional extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.undefined) {\n return OK(void 0);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n }\n ZodOptional.create = (type, params) => {\n return new ZodOptional({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodOptional,\n ...processCreateParams(params)\n });\n };\n class ZodNullable extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType === ZodParsedType.null) {\n return OK(null);\n }\n return this._def.innerType._parse(input);\n }\n unwrap() {\n return this._def.innerType;\n }\n }\n ZodNullable.create = (type, params) => {\n return new ZodNullable({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodNullable,\n ...processCreateParams(params)\n });\n };\n class ZodDefault extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n let data = ctx.data;\n if (ctx.parsedType === ZodParsedType.undefined) {\n data = this._def.defaultValue();\n }\n return this._def.innerType._parse({\n data,\n path: ctx.path,\n parent: ctx\n });\n }\n removeDefault() {\n return this._def.innerType;\n }\n }\n ZodDefault.create = (type, params) => {\n return new ZodDefault({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodDefault,\n defaultValue: typeof params.default === "function" ? params.default : () => params.default,\n ...processCreateParams(params)\n });\n };\n class ZodCatch extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const newCtx = {\n ...ctx,\n common: {\n ...ctx.common,\n issues: []\n }\n };\n const result = this._def.innerType._parse({\n data: newCtx.data,\n path: newCtx.path,\n parent: {\n ...newCtx\n }\n });\n if (isAsync(result)) {\n return result.then((result2) => {\n return {\n status: "valid",\n value: result2.status === "valid" ? result2.value : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data\n })\n };\n });\n } else {\n return {\n status: "valid",\n value: result.status === "valid" ? result.value : this._def.catchValue({\n get error() {\n return new ZodError(newCtx.common.issues);\n },\n input: newCtx.data\n })\n };\n }\n }\n removeCatch() {\n return this._def.innerType;\n }\n }\n ZodCatch.create = (type, params) => {\n return new ZodCatch({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodCatch,\n catchValue: typeof params.catch === "function" ? params.catch : () => params.catch,\n ...processCreateParams(params)\n });\n };\n class ZodNaN extends ZodType {\n _parse(input) {\n const parsedType = this._getType(input);\n if (parsedType !== ZodParsedType.nan) {\n const ctx = this._getOrReturnCtx(input);\n addIssueToContext(ctx, {\n code: ZodIssueCode.invalid_type,\n expected: ZodParsedType.nan,\n received: ctx.parsedType\n });\n return INVALID;\n }\n return { status: "valid", value: input.data };\n }\n }\n ZodNaN.create = (params) => {\n return new ZodNaN({\n typeName: ZodFirstPartyTypeKind.ZodNaN,\n ...processCreateParams(params)\n });\n };\n const BRAND = Symbol("zod_brand");\n class ZodBranded extends ZodType {\n _parse(input) {\n const { ctx } = this._processInputParams(input);\n const data = ctx.data;\n return this._def.type._parse({\n data,\n path: ctx.path,\n parent: ctx\n });\n }\n unwrap() {\n return this._def.type;\n }\n }\n class ZodPipeline extends ZodType {\n _parse(input) {\n const { status, ctx } = this._processInputParams(input);\n if (ctx.common.async) {\n const handleAsync = async () => {\n const inResult = await this._def.in._parseAsync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (inResult.status === "aborted")\n return INVALID;\n if (inResult.status === "dirty") {\n status.dirty();\n return DIRTY(inResult.value);\n } else {\n return this._def.out._parseAsync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx\n });\n }\n };\n return handleAsync();\n } else {\n const inResult = this._def.in._parseSync({\n data: ctx.data,\n path: ctx.path,\n parent: ctx\n });\n if (inResult.status === "aborted")\n return INVALID;\n if (inResult.status === "dirty") {\n status.dirty();\n return {\n status: "dirty",\n value: inResult.value\n };\n } else {\n return this._def.out._parseSync({\n data: inResult.value,\n path: ctx.path,\n parent: ctx\n });\n }\n }\n }\n static create(a2, b) {\n return new ZodPipeline({\n in: a2,\n out: b,\n typeName: ZodFirstPartyTypeKind.ZodPipeline\n });\n }\n }\n class ZodReadonly extends ZodType {\n _parse(input) {\n const result = this._def.innerType._parse(input);\n const freeze = (data) => {\n if (isValid(data)) {\n data.value = Object.freeze(data.value);\n }\n return data;\n };\n return isAsync(result) ? result.then((data) => freeze(data)) : freeze(result);\n }\n unwrap() {\n return this._def.innerType;\n }\n }\n ZodReadonly.create = (type, params) => {\n return new ZodReadonly({\n innerType: type,\n typeName: ZodFirstPartyTypeKind.ZodReadonly,\n ...processCreateParams(params)\n });\n };\n function cleanParams(params, data) {\n const p = typeof params === "function" ? params(data) : typeof params === "string" ? { message: params } : params;\n const p2 = typeof p === "string" ? { message: p } : p;\n return p2;\n }\n function custom(check, _params = {}, fatal) {\n if (check)\n return ZodAny.create().superRefine((data, ctx) => {\n const r2 = check(data);\n if (r2 instanceof Promise) {\n return r2.then((r3) => {\n if (!r3) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: "custom", ...params, fatal: _fatal });\n }\n });\n }\n if (!r2) {\n const params = cleanParams(_params, data);\n const _fatal = params.fatal ?? fatal ?? true;\n ctx.addIssue({ code: "custom", ...params, fatal: _fatal });\n }\n return;\n });\n return ZodAny.create();\n }\n const late = {\n object: ZodObject.lazycreate\n };\n var ZodFirstPartyTypeKind;\n (function(ZodFirstPartyTypeKind2) {\n ZodFirstPartyTypeKind2["ZodString"] = "ZodString";\n ZodFirstPartyTypeKind2["ZodNumber"] = "ZodNumber";\n ZodFirstPartyTypeKind2["ZodNaN"] = "ZodNaN";\n ZodFirstPartyTypeKind2["ZodBigInt"] = "ZodBigInt";\n ZodFirstPartyTypeKind2["ZodBoolean"] = "ZodBoolean";\n ZodFirstPartyTypeKind2["ZodDate"] = "ZodDate";\n ZodFirstPartyTypeKind2["ZodSymbol"] = "ZodSymbol";\n ZodFirstPartyTypeKind2["ZodUndefined"] = "ZodUndefined";\n ZodFirstPartyTypeKind2["ZodNull"] = "ZodNull";\n ZodFirstPartyTypeKind2["ZodAny"] = "ZodAny";\n ZodFirstPartyTypeKind2["ZodUnknown"] = "ZodUnknown";\n ZodFirstPartyTypeKind2["ZodNever"] = "ZodNever";\n ZodFirstPartyTypeKind2["ZodVoid"] = "ZodVoid";\n ZodFirstPartyTypeKind2["ZodArray"] = "ZodArray";\n ZodFirstPartyTypeKind2["ZodObject"] = "ZodObject";\n ZodFirstPartyTypeKind2["ZodUnion"] = "ZodUnion";\n ZodFirstPartyTypeKind2["ZodDiscriminatedUnion"] = "ZodDiscriminatedUnion";\n ZodFirstPartyTypeKind2["ZodIntersection"] = "ZodIntersection";\n ZodFirstPartyTypeKind2["ZodTuple"] = "ZodTuple";\n ZodFirstPartyTypeKind2["ZodRecord"] = "ZodRecord";\n ZodFirstPartyTypeKind2["ZodMap"] = "ZodMap";\n ZodFirstPartyTypeKind2["ZodSet"] = "ZodSet";\n ZodFirstPartyTypeKind2["ZodFunction"] = "ZodFunction";\n ZodFirstPartyTypeKind2["ZodLazy"] = "ZodLazy";\n ZodFirstPartyTypeKind2["ZodLiteral"] = "ZodLiteral";\n ZodFirstPartyTypeKind2["ZodEnum"] = "ZodEnum";\n ZodFirstPartyTypeKind2["ZodEffects"] = "ZodEffects";\n ZodFirstPartyTypeKind2["ZodNativeEnum"] = "ZodNativeEnum";\n ZodFirstPartyTypeKind2["ZodOptional"] = "ZodOptional";\n ZodFirstPartyTypeKind2["ZodNullable"] = "ZodNullable";\n ZodFirstPartyTypeKind2["ZodDefault"] = "ZodDefault";\n ZodFirstPartyTypeKind2["ZodCatch"] = "ZodCatch";\n ZodFirstPartyTypeKind2["ZodPromise"] = "ZodPromise";\n ZodFirstPartyTypeKind2["ZodBranded"] = "ZodBranded";\n ZodFirstPartyTypeKind2["ZodPipeline"] = "ZodPipeline";\n ZodFirstPartyTypeKind2["ZodReadonly"] = "ZodReadonly";\n })(ZodFirstPartyTypeKind || (ZodFirstPartyTypeKind = {}));\n const instanceOfType = (cls, params = {\n message: `Input not instance of ${cls.name}`\n }) => custom((data) => data instanceof cls, params);\n const stringType = ZodString.create;\n const numberType = ZodNumber.create;\n const nanType = ZodNaN.create;\n const bigIntType = ZodBigInt.create;\n const booleanType = ZodBoolean.create;\n const dateType = ZodDate.create;\n const symbolType = ZodSymbol.create;\n const undefinedType = ZodUndefined.create;\n const nullType = ZodNull.create;\n const anyType = ZodAny.create;\n const unknownType = ZodUnknown.create;\n const neverType = ZodNever.create;\n const voidType = ZodVoid.create;\n const arrayType = ZodArray.create;\n const objectType = ZodObject.create;\n const strictObjectType = ZodObject.strictCreate;\n const unionType = ZodUnion.create;\n const discriminatedUnionType = ZodDiscriminatedUnion.create;\n const intersectionType = ZodIntersection.create;\n const tupleType = ZodTuple.create;\n const recordType = ZodRecord.create;\n const mapType = ZodMap.create;\n const setType = ZodSet.create;\n const functionType = ZodFunction.create;\n const lazyType = ZodLazy.create;\n const literalType = ZodLiteral.create;\n const enumType = ZodEnum.create;\n const nativeEnumType = ZodNativeEnum.create;\n const promiseType = ZodPromise.create;\n const effectsType = ZodEffects.create;\n const optionalType = ZodOptional.create;\n const nullableType = ZodNullable.create;\n const preprocessType = ZodEffects.createWithPreprocess;\n const pipelineType = ZodPipeline.create;\n const ostring = () => stringType().optional();\n const onumber = () => numberType().optional();\n const oboolean = () => booleanType().optional();\n const coerce = {\n string: (arg) => ZodString.create({ ...arg, coerce: true }),\n number: (arg) => ZodNumber.create({ ...arg, coerce: true }),\n boolean: (arg) => ZodBoolean.create({\n ...arg,\n coerce: true\n }),\n bigint: (arg) => ZodBigInt.create({ ...arg, coerce: true }),\n date: (arg) => ZodDate.create({ ...arg, coerce: true })\n };\n const NEVER = INVALID;\n var z$1 = /* @__PURE__ */ Object.freeze({\n __proto__: null,\n BRAND,\n DIRTY,\n EMPTY_PATH,\n INVALID,\n NEVER,\n OK,\n ParseStatus,\n Schema: ZodType,\n ZodAny,\n ZodArray,\n ZodBigInt,\n ZodBoolean,\n ZodBranded,\n ZodCatch,\n ZodDate,\n ZodDefault,\n ZodDiscriminatedUnion,\n ZodEffects,\n ZodEnum,\n ZodError,\n get ZodFirstPartyTypeKind() {\n return ZodFirstPartyTypeKind;\n },\n ZodFunction,\n ZodIntersection,\n ZodIssueCode,\n ZodLazy,\n ZodLiteral,\n ZodMap,\n ZodNaN,\n ZodNativeEnum,\n ZodNever,\n ZodNull,\n ZodNullable,\n ZodNumber,\n ZodObject,\n ZodOptional,\n ZodParsedType,\n ZodPipeline,\n ZodPromise,\n ZodReadonly,\n ZodRecord,\n ZodSchema: ZodType,\n ZodSet,\n ZodString,\n ZodSymbol,\n ZodTransformer: ZodEffects,\n ZodTuple,\n ZodType,\n ZodUndefined,\n ZodUnion,\n ZodUnknown,\n ZodVoid,\n addIssueToContext,\n any: anyType,\n array: arrayType,\n bigint: bigIntType,\n boolean: booleanType,\n coerce,\n custom,\n date: dateType,\n datetimeRegex,\n defaultErrorMap: errorMap,\n discriminatedUnion: discriminatedUnionType,\n effect: effectsType,\n enum: enumType,\n function: functionType,\n getErrorMap,\n getParsedType,\n instanceof: instanceOfType,\n intersection: intersectionType,\n isAborted,\n isAsync,\n isDirty,\n isValid,\n late,\n lazy: lazyType,\n literal: literalType,\n makeIssue,\n map: mapType,\n nan: nanType,\n nativeEnum: nativeEnumType,\n never: neverType,\n null: nullType,\n nullable: nullableType,\n number: numberType,\n object: objectType,\n get objectUtil() {\n return objectUtil;\n },\n oboolean,\n onumber,\n optional: optionalType,\n ostring,\n pipeline: pipelineType,\n preprocess: preprocessType,\n promise: promiseType,\n quotelessJson,\n record: recordType,\n set: setType,\n setErrorMap,\n strictObject: strictObjectType,\n string: stringType,\n symbol: symbolType,\n transformer: effectsType,\n tuple: tupleType,\n undefined: undefinedType,\n union: unionType,\n unknown: unknownType,\n get util() {\n return util;\n },\n void: voidType\n });\n z$1.object({\n nucleotideSequences: z$1.array(\n z$1.object({\n name: z$1.string(),\n sequence: z$1.string()\n })\n ),\n genes: z$1.array(\n z$1.object({\n name: z$1.string(),\n sequence: z$1.string()\n })\n )\n });\n const orderByType = z$1.enum(["ascending", "descending"]);\n const orderBy = z$1.object({\n field: z$1.string(),\n type: orderByType\n });\n const filterValue = z$1.union([z$1.string(), z$1.number(), z$1.boolean(), z$1.null(), z$1.undefined(), z$1.array(z$1.string())]);\n const dateRange = z$1.object({\n dateFrom: z$1.string(),\n dateTo: z$1.string()\n });\n const lapisBaseRequest = z$1.object({\n limit: z$1.number().optional(),\n offset: z$1.number().optional(),\n fields: z$1.array(z$1.string()).optional(),\n orderBy: z$1.array(orderBy).optional()\n }).catchall(filterValue);\n lapisBaseRequest.extend({ minProportion: z$1.number().optional() });\n const mutationProportionCount = z$1.object({\n mutation: z$1.string(),\n proportion: z$1.number(),\n count: z$1.number(),\n sequenceName: z$1.union([z$1.string(), z$1.null()]),\n mutationFrom: z$1.string(),\n mutationTo: z$1.string(),\n position: z$1.number()\n });\n const mutationsResponse = makeLapisResponse(z$1.array(mutationProportionCount));\n z$1.object({\n filters: z$1.record(filterValue),\n downloadAsFile: z$1.boolean().optional(),\n downloadFileBasename: z$1.string().optional(),\n compression: z$1.enum(["gzip", "none"]).optional(),\n includeMutations: z$1.array(z$1.string()).optional(),\n dateRanges: z$1.array(dateRange).optional(),\n dateField: z$1.string().optional()\n });\n const mutationsOverTimeResponse = makeLapisResponse(\n z$1.object({\n mutations: z$1.array(z$1.string()),\n dateRanges: z$1.array(dateRange),\n data: z$1.array(\n z$1.array(\n z$1.object({\n count: z$1.number(),\n coverage: z$1.number()\n })\n )\n )\n })\n );\n const insertionCount = z$1.object({\n insertion: z$1.string(),\n count: z$1.number(),\n insertedSymbols: z$1.string(),\n position: z$1.number(),\n sequenceName: z$1.union([z$1.string(), z$1.null()])\n });\n makeLapisResponse(z$1.array(insertionCount));\n const baseResponseValueSchema = z$1.union([z$1.string(), z$1.number(), z$1.boolean(), z$1.null()]);\n const aggregatedItem = z$1.object({ count: z$1.number() }).catchall(baseResponseValueSchema);\n const aggregatedResponse = makeLapisResponse(z$1.array(aggregatedItem));\n const detailsItem = z$1.object({}).catchall(baseResponseValueSchema);\n makeLapisResponse(z$1.array(detailsItem));\n function makeLapisResponse(data) {\n return z$1.object({\n data\n });\n }\n const problemDetail = z$1.object({\n title: z$1.string().optional(),\n status: z$1.number(),\n detail: z$1.string().optional(),\n type: z$1.string(),\n instance: z$1.string().optional()\n });\n const lapisError = z$1.object({\n error: problemDetail\n });\n const lineage = z$1.object({\n parents: z$1.array(z$1.string()).optional(),\n aliases: z$1.array(z$1.string()).optional()\n });\n z$1.record(lineage);\n class UnknownLapisError extends Error {\n constructor(message, status, requestedData) {\n super(message);\n this.status = status;\n this.requestedData = requestedData;\n this.name = "UnknownLapisError";\n }\n }\n class LapisError extends Error {\n constructor(message, status, problemDetail2, requestedData) {\n super(message);\n this.status = status;\n this.problemDetail = problemDetail2;\n this.requestedData = requestedData;\n this.name = "LapisError";\n }\n }\n async function fetchAggregated(lapisUrl, body, signal) {\n const response = await callLapis(\n aggregatedEndpoint(lapisUrl),\n {\n method: "POST",\n headers: {\n "Content-Type": "application/json"\n },\n body: JSON.stringify(body),\n signal\n },\n "aggregated data"\n );\n return aggregatedResponse.parse(await response.json());\n }\n async function fetchSubstitutionsOrDeletions(lapisUrl, body, sequenceType, signal) {\n const response = await callLapis(\n substitutionsOrDeletionsEndpoint(lapisUrl, sequenceType),\n {\n method: "POST",\n headers: {\n "Content-Type": "application/json"\n },\n body: JSON.stringify(body),\n signal\n },\n `${sequenceType} mutations`\n );\n return mutationsResponse.parse(await response.json());\n }\n async function fetchMutationsOverTime(lapisUrl, body, sequenceType, signal) {\n const response = await callLapis(\n mutationsOverTimeEndpoint(lapisUrl, sequenceType),\n {\n method: "POST",\n headers: {\n "Content-Type": "application/json"\n },\n body: JSON.stringify(body),\n signal\n },\n `${sequenceType} mutations over time`\n );\n return mutationsOverTimeResponse.parse(await response.json());\n }\n async function callLapis(input, init, requestedDataName) {\n try {\n const response = await fetch(input, init);\n await handleErrors(response, requestedDataName);\n return response;\n } catch (error) {\n const message = error instanceof Error ? error.message : `${error}`;\n throw new UnknownLapisError(`Failed to connect to LAPIS: ${message}`, 500, requestedDataName);\n }\n }\n const handleErrors = async (response, requestedData) => {\n if (!response.ok) {\n if (response.status >= 400 && response.status < 500) {\n const json = await response.json();\n const lapisErrorResult = lapisError.safeParse(json);\n if (lapisErrorResult.success) {\n throw new LapisError(\n response.statusText + (lapisErrorResult.data.error.detail ?? ""),\n response.status,\n lapisErrorResult.data.error,\n requestedData\n );\n }\n const problemDetailResult = problemDetail.safeParse(json);\n if (problemDetailResult.success) {\n throw new LapisError(\n response.statusText + (problemDetailResult.data.detail ?? ""),\n response.status,\n problemDetailResult.data,\n requestedData\n );\n }\n throw new UnknownLapisError(\n `${response.statusText}: ${JSON.stringify(json)}`,\n response.status,\n requestedData\n );\n }\n throw new UnknownLapisError(`${response.statusText}: ${response.status}`, response.status, requestedData);\n }\n };\n const aggregatedEndpoint = (lapisUrl) => `${lapisUrl}/sample/aggregated`;\n const substitutionsOrDeletionsEndpoint = (lapisUrl, sequenceType) => {\n return sequenceType === "amino acid" ? `${lapisUrl}/sample/aminoAcidMutations` : `${lapisUrl}/sample/nucleotideMutations`;\n };\n const mutationsOverTimeEndpoint = (lapisUrl, sequenceType) => {\n return sequenceType === "amino acid" ? `${lapisUrl}/component/aminoAcidMutationsOverTime` : `${lapisUrl}/component/nucleotideMutationsOverTime`;\n };\n class FetchAggregatedOperator {\n constructor(filter, fields = []) {\n this.filter = filter;\n this.fields = fields;\n }\n async evaluate(lapisUrl, signal) {\n const aggregatedResponse2 = (await fetchAggregated(\n lapisUrl,\n {\n ...this.filter,\n fields: this.fields\n },\n signal\n )).data;\n if (isFieldsArrayWithCount(aggregatedResponse2)) {\n return {\n content: aggregatedResponse2\n };\n }\n throw new Error("Aggregated response does not have count");\n }\n }\n function isFieldsArrayWithCount(data) {\n return data.every((item) => typeof item === "object" && "count" in item && typeof item.count === "number");\n }\n class GroupByOperator {\n constructor(child, field, aggregate) {\n this.child = child;\n this.field = field;\n this.aggregate = aggregate;\n }\n async evaluate(lapis, signal) {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n const grouped = /* @__PURE__ */ new Map();\n for (const row of childEvaluated.content) {\n const key = row[this.field];\n if (!grouped.has(key)) {\n grouped.set(key, []);\n }\n grouped.get(key).push(row);\n }\n const result = new Array();\n for (const [, values] of grouped) {\n result.push(this.aggregate(values));\n }\n return {\n content: result\n };\n }\n }\n class GroupByAndSumOperator extends GroupByOperator {\n constructor(child, groupByField, sumField) {\n super(child, groupByField, (values) => {\n let n = 0;\n for (const value of values) {\n n += value[sumField];\n }\n return {\n [groupByField]: values[0][groupByField],\n [sumField]: n\n };\n });\n }\n }\n class MapOperator {\n constructor(child, func) {\n this.child = child;\n this.func = func;\n }\n async evaluate(lapis, signal) {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.map(this.func)\n };\n }\n }\n class RenameFieldOperator extends MapOperator {\n constructor(child, oldFieldName, newFieldName) {\n super(\n child,\n (value) => ({\n ...value,\n [newFieldName]: value[oldFieldName]\n })\n );\n }\n }\n class SortOperator {\n constructor(child, compareFn) {\n this.child = child;\n this.compareFn = compareFn;\n }\n async evaluate(lapis, signal) {\n const childEvaluated = await this.child.evaluate(lapis, signal);\n return {\n content: childEvaluated.content.sort(this.compareFn)\n };\n }\n }\n var SECONDS_A_MINUTE = 60;\n var SECONDS_A_HOUR = SECONDS_A_MINUTE * 60;\n var SECONDS_A_DAY = SECONDS_A_HOUR * 24;\n var SECONDS_A_WEEK = SECONDS_A_DAY * 7;\n var MILLISECONDS_A_SECOND = 1e3;\n var MILLISECONDS_A_MINUTE = SECONDS_A_MINUTE * MILLISECONDS_A_SECOND;\n var MILLISECONDS_A_HOUR = SECONDS_A_HOUR * MILLISECONDS_A_SECOND;\n var MILLISECONDS_A_DAY = SECONDS_A_DAY * MILLISECONDS_A_SECOND;\n var MILLISECONDS_A_WEEK = SECONDS_A_WEEK * MILLISECONDS_A_SECOND;\n var MS = "millisecond";\n var S = "second";\n var MIN = "minute";\n var H = "hour";\n var D = "day";\n var W = "week";\n var M = "month";\n var Q = "quarter";\n var Y = "year";\n var DATE = "date";\n var FORMAT_DEFAULT = "YYYY-MM-DDTHH:mm:ssZ";\n var INVALID_DATE_STRING = "Invalid Date";\n var REGEX_PARSE = /^(\\d{4})[-/]?(\\d{1,2})?[-/]?(\\d{0,2})[Tt\\s]*(\\d{1,2})?:?(\\d{1,2})?:?(\\d{1,2})?[.:]?(\\d+)?$/;\n var REGEX_FORMAT = /\\[([^\\]]+)]|Y{1,4}|M{1,4}|D{1,2}|d{1,4}|H{1,2}|h{1,2}|a|A|m{1,2}|s{1,2}|Z{1,2}|SSS/g;\n var en = {\n name: "en",\n weekdays: "Sunday_Monday_Tuesday_Wednesday_Thursday_Friday_Saturday".split("_"),\n months: "January_February_March_April_May_June_July_August_September_October_November_December".split("_"),\n ordinal: function ordinal(n) {\n var s2 = ["th", "st", "nd", "rd"];\n var v2 = n % 100;\n return "[" + n + (s2[(v2 - 20) % 10] || s2[v2] || s2[0]) + "]";\n }\n };\n var padStart = function padStart2(string, length, pad) {\n var s2 = String(string);\n if (!s2 || s2.length >= length) return string;\n return "" + Array(length + 1 - s2.length).join(pad) + string;\n };\n var padZoneStr = function padZoneStr2(instance) {\n var negMinutes = -instance.utcOffset();\n var minutes = Math.abs(negMinutes);\n var hourOffset = Math.floor(minutes / 60);\n var minuteOffset = minutes % 60;\n return (negMinutes <= 0 ? "+" : "-") + padStart(hourOffset, 2, "0") + ":" + padStart(minuteOffset, 2, "0");\n };\n var monthDiff = function monthDiff2(a2, b) {\n if (a2.date() < b.date()) return -monthDiff2(b, a2);\n var wholeMonthDiff = (b.year() - a2.year()) * 12 + (b.month() - a2.month());\n var anchor = a2.clone().add(wholeMonthDiff, M);\n var c2 = b - anchor < 0;\n var anchor2 = a2.clone().add(wholeMonthDiff + (c2 ? -1 : 1), M);\n return +(-(wholeMonthDiff + (b - anchor) / (c2 ? anchor - anchor2 : anchor2 - anchor)) || 0);\n };\n var absFloor = function absFloor2(n) {\n return n < 0 ? Math.ceil(n) || 0 : Math.floor(n);\n };\n var prettyUnit = function prettyUnit2(u2) {\n var special = {\n M,\n y: Y,\n w: W,\n d: D,\n D: DATE,\n h: H,\n m: MIN,\n s: S,\n ms: MS,\n Q\n };\n return special[u2] || String(u2 || "").toLowerCase().replace(/s$/, "");\n };\n var isUndefined = function isUndefined2(s2) {\n return s2 === void 0;\n };\n var U = {\n s: padStart,\n z: padZoneStr,\n m: monthDiff,\n a: absFloor,\n p: prettyUnit,\n u: isUndefined\n };\n var L = "en";\n var Ls = {};\n Ls[L] = en;\n var IS_DAYJS = "$isDayjsObject";\n var isDayjs = function isDayjs2(d) {\n return d instanceof Dayjs || !!(d && d[IS_DAYJS]);\n };\n var parseLocale = function parseLocale2(preset, object, isLocal) {\n var l2;\n if (!preset) return L;\n if (typeof preset === "string") {\n var presetLower = preset.toLowerCase();\n if (Ls[presetLower]) {\n l2 = presetLower;\n }\n if (object) {\n Ls[presetLower] = object;\n l2 = presetLower;\n }\n var presetSplit = preset.split("-");\n if (!l2 && presetSplit.length > 1) {\n return parseLocale2(presetSplit[0]);\n }\n } else {\n var name = preset.name;\n Ls[name] = preset;\n l2 = name;\n }\n if (!isLocal && l2) L = l2;\n return l2 || !isLocal && L;\n };\n var dayjs = function dayjs2(date, c2) {\n if (isDayjs(date)) {\n return date.clone();\n }\n var cfg = typeof c2 === "object" ? c2 : {};\n cfg.date = date;\n cfg.args = arguments;\n return new Dayjs(cfg);\n };\n var wrapper = function wrapper2(date, instance) {\n return dayjs(date, {\n locale: instance.$L,\n utc: instance.$u,\n x: instance.$x,\n $offset: instance.$offset\n // todo: refactor; do not use this.$offset in you code\n });\n };\n var Utils = U;\n Utils.l = parseLocale;\n Utils.i = isDayjs;\n Utils.w = wrapper;\n var parseDate = function parseDate2(cfg) {\n var date = cfg.date, utc = cfg.utc;\n if (date === null) return /* @__PURE__ */ new Date(NaN);\n if (Utils.u(date)) return /* @__PURE__ */ new Date();\n if (date instanceof Date) return new Date(date);\n if (typeof date === "string" && !/Z$/i.test(date)) {\n var d = date.match(REGEX_PARSE);\n if (d) {\n var m2 = d[2] - 1 || 0;\n var ms = (d[7] || "0").substring(0, 3);\n if (utc) {\n return new Date(Date.UTC(d[1], m2, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms));\n }\n return new Date(d[1], m2, d[3] || 1, d[4] || 0, d[5] || 0, d[6] || 0, ms);\n }\n }\n return new Date(date);\n };\n var Dayjs = /* @__PURE__ */ function() {\n function Dayjs2(cfg) {\n this.$L = parseLocale(cfg.locale, null, true);\n this.parse(cfg);\n this.$x = this.$x || cfg.x || {};\n this[IS_DAYJS] = true;\n }\n var _proto = Dayjs2.prototype;\n _proto.parse = function parse(cfg) {\n this.$d = parseDate(cfg);\n this.init();\n };\n _proto.init = function init() {\n var $d = this.$d;\n this.$y = $d.getFullYear();\n this.$M = $d.getMonth();\n this.$D = $d.getDate();\n this.$W = $d.getDay();\n this.$H = $d.getHours();\n this.$m = $d.getMinutes();\n this.$s = $d.getSeconds();\n this.$ms = $d.getMilliseconds();\n };\n _proto.$utils = function $utils() {\n return Utils;\n };\n _proto.isValid = function isValid2() {\n return !(this.$d.toString() === INVALID_DATE_STRING);\n };\n _proto.isSame = function isSame(that, units) {\n var other = dayjs(that);\n return this.startOf(units) <= other && other <= this.endOf(units);\n };\n _proto.isAfter = function isAfter(that, units) {\n return dayjs(that) < this.startOf(units);\n };\n _proto.isBefore = function isBefore(that, units) {\n return this.endOf(units) < dayjs(that);\n };\n _proto.$g = function $g(input, get, set) {\n if (Utils.u(input)) return this[get];\n return this.set(set, input);\n };\n _proto.unix = function unix() {\n return Math.floor(this.valueOf() / 1e3);\n };\n _proto.valueOf = function valueOf() {\n return this.$d.getTime();\n };\n _proto.startOf = function startOf(units, _startOf) {\n var _this = this;\n var isStartOf = !Utils.u(_startOf) ? _startOf : true;\n var unit = Utils.p(units);\n var instanceFactory = function instanceFactory2(d, m2) {\n var ins = Utils.w(_this.$u ? Date.UTC(_this.$y, m2, d) : new Date(_this.$y, m2, d), _this);\n return isStartOf ? ins : ins.endOf(D);\n };\n var instanceFactorySet = function instanceFactorySet2(method, slice) {\n var argumentStart = [0, 0, 0, 0];\n var argumentEnd = [23, 59, 59, 999];\n return Utils.w(_this.toDate()[method].apply(\n // eslint-disable-line prefer-spread\n _this.toDate("s"),\n (isStartOf ? argumentStart : argumentEnd).slice(slice)\n ), _this);\n };\n var $W = this.$W, $M = this.$M, $D = this.$D;\n var utcPad = "set" + (this.$u ? "UTC" : "");\n switch (unit) {\n case Y:\n return isStartOf ? instanceFactory(1, 0) : instanceFactory(31, 11);\n case M:\n return isStartOf ? instanceFactory(1, $M) : instanceFactory(0, $M + 1);\n case W: {\n var weekStart = this.$locale().weekStart || 0;\n var gap = ($W < weekStart ? $W + 7 : $W) - weekStart;\n return instanceFactory(isStartOf ? $D - gap : $D + (6 - gap), $M);\n }\n case D:\n case DATE:\n return instanceFactorySet(utcPad + "Hours", 0);\n case H:\n return instanceFactorySet(utcPad + "Minutes", 1);\n case MIN:\n return instanceFactorySet(utcPad + "Seconds", 2);\n case S:\n return instanceFactorySet(utcPad + "Milliseconds", 3);\n default:\n return this.clone();\n }\n };\n _proto.endOf = function endOf(arg) {\n return this.startOf(arg, false);\n };\n _proto.$set = function $set(units, _int) {\n var _C$D$C$DATE$C$M$C$Y$C;\n var unit = Utils.p(units);\n var utcPad = "set" + (this.$u ? "UTC" : "");\n var name = (_C$D$C$DATE$C$M$C$Y$C = {}, _C$D$C$DATE$C$M$C$Y$C[D] = utcPad + "Date", _C$D$C$DATE$C$M$C$Y$C[DATE] = utcPad + "Date", _C$D$C$DATE$C$M$C$Y$C[M] = utcPad + "Month", _C$D$C$DATE$C$M$C$Y$C[Y] = utcPad + "FullYear", _C$D$C$DATE$C$M$C$Y$C[H] = utcPad + "Hours", _C$D$C$DATE$C$M$C$Y$C[MIN] = utcPad + "Minutes", _C$D$C$DATE$C$M$C$Y$C[S] = utcPad + "Seconds", _C$D$C$DATE$C$M$C$Y$C[MS] = utcPad + "Milliseconds", _C$D$C$DATE$C$M$C$Y$C)[unit];\n var arg = unit === D ? this.$D + (_int - this.$W) : _int;\n if (unit === M || unit === Y) {\n var date = this.clone().set(DATE, 1);\n date.$d[name](arg);\n date.init();\n this.$d = date.set(DATE, Math.min(this.$D, date.daysInMonth())).$d;\n } else if (name) this.$d[name](arg);\n this.init();\n return this;\n };\n _proto.set = function set(string, _int2) {\n return this.clone().$set(string, _int2);\n };\n _proto.get = function get(unit) {\n return this[Utils.p(unit)]();\n };\n _proto.add = function add(number, units) {\n var _this2 = this, _C$MIN$C$H$C$S$unit;\n number = Number(number);\n var unit = Utils.p(units);\n var instanceFactorySet = function instanceFactorySet2(n) {\n var d = dayjs(_this2);\n return Utils.w(d.date(d.date() + Math.round(n * number)), _this2);\n };\n if (unit === M) {\n return this.set(M, this.$M + number);\n }\n if (unit === Y) {\n return this.set(Y, this.$y + number);\n }\n if (unit === D) {\n return instanceFactorySet(1);\n }\n if (unit === W) {\n return instanceFactorySet(7);\n }\n var step = (_C$MIN$C$H$C$S$unit = {}, _C$MIN$C$H$C$S$unit[MIN] = MILLISECONDS_A_MINUTE, _C$MIN$C$H$C$S$unit[H] = MILLISECONDS_A_HOUR, _C$MIN$C$H$C$S$unit[S] = MILLISECONDS_A_SECOND, _C$MIN$C$H$C$S$unit)[unit] || 1;\n var nextTimeStamp = this.$d.getTime() + number * step;\n return Utils.w(nextTimeStamp, this);\n };\n _proto.subtract = function subtract(number, string) {\n return this.add(number * -1, string);\n };\n _proto.format = function format(formatStr) {\n var _this3 = this;\n var locale = this.$locale();\n if (!this.isValid()) return locale.invalidDate || INVALID_DATE_STRING;\n var str = formatStr || FORMAT_DEFAULT;\n var zoneStr = Utils.z(this);\n var $H = this.$H, $m = this.$m, $M = this.$M;\n var weekdays = locale.weekdays, months = locale.months, meridiem = locale.meridiem;\n var getShort = function getShort2(arr, index, full, length) {\n return arr && (arr[index] || arr(_this3, str)) || full[index].slice(0, length);\n };\n var get$H = function get$H2(num) {\n return Utils.s($H % 12 || 12, num, "0");\n };\n var meridiemFunc = meridiem || function(hour, minute, isLowercase) {\n var m2 = hour < 12 ? "AM" : "PM";\n return isLowercase ? m2.toLowerCase() : m2;\n };\n var matches = function matches2(match) {\n switch (match) {\n case "YY":\n return String(_this3.$y).slice(-2);\n case "YYYY":\n return Utils.s(_this3.$y, 4, "0");\n case "M":\n return $M + 1;\n case "MM":\n return Utils.s($M + 1, 2, "0");\n case "MMM":\n return getShort(locale.monthsShort, $M, months, 3);\n case "MMMM":\n return getShort(months, $M);\n case "D":\n return _this3.$D;\n case "DD":\n return Utils.s(_this3.$D, 2, "0");\n case "d":\n return String(_this3.$W);\n case "dd":\n return getShort(locale.weekdaysMin, _this3.$W, weekdays, 2);\n case "ddd":\n return getShort(locale.weekdaysShort, _this3.$W, weekdays, 3);\n case "dddd":\n return weekdays[_this3.$W];\n case "H":\n return String($H);\n case "HH":\n return Utils.s($H, 2, "0");\n case "h":\n return get$H(1);\n case "hh":\n return get$H(2);\n case "a":\n return meridiemFunc($H, $m, true);\n case "A":\n return meridiemFunc($H, $m, false);\n case "m":\n return String($m);\n case "mm":\n return Utils.s($m, 2, "0");\n case "s":\n return String(_this3.$s);\n case "ss":\n return Utils.s(_this3.$s, 2, "0");\n case "SSS":\n return Utils.s(_this3.$ms, 3, "0");\n case "Z":\n return zoneStr;\n }\n return null;\n };\n return str.replace(REGEX_FORMAT, function(match, $1) {\n return $1 || matches(match) || zoneStr.replace(":", "");\n });\n };\n _proto.utcOffset = function utcOffset() {\n return -Math.round(this.$d.getTimezoneOffset() / 15) * 15;\n };\n _proto.diff = function diff(input, units, _float) {\n var _this4 = this;\n var unit = Utils.p(units);\n var that = dayjs(input);\n var zoneDelta = (that.utcOffset() - this.utcOffset()) * MILLISECONDS_A_MINUTE;\n var diff2 = this - that;\n var getMonth = function getMonth2() {\n return Utils.m(_this4, that);\n };\n var result;\n switch (unit) {\n case Y:\n result = getMonth() / 12;\n break;\n case M:\n result = getMonth();\n break;\n case Q:\n result = getMonth() / 3;\n break;\n case W:\n result = (diff2 - zoneDelta) / MILLISECONDS_A_WEEK;\n break;\n case D:\n result = (diff2 - zoneDelta) / MILLISECONDS_A_DAY;\n break;\n case H:\n result = diff2 / MILLISECONDS_A_HOUR;\n break;\n case MIN:\n result = diff2 / MILLISECONDS_A_MINUTE;\n break;\n case S:\n result = diff2 / MILLISECONDS_A_SECOND;\n break;\n default:\n result = diff2;\n break;\n }\n return _float ? result : Utils.a(result);\n };\n _proto.daysInMonth = function daysInMonth() {\n return this.endOf(M).$D;\n };\n _proto.$locale = function $locale() {\n return Ls[this.$L];\n };\n _proto.locale = function locale(preset, object) {\n if (!preset) return this.$L;\n var that = this.clone();\n var nextLocaleName = parseLocale(preset, object, true);\n if (nextLocaleName) that.$L = nextLocaleName;\n return that;\n };\n _proto.clone = function clone() {\n return Utils.w(this.$d, this);\n };\n _proto.toDate = function toDate() {\n return new Date(this.valueOf());\n };\n _proto.toJSON = function toJSON() {\n return this.isValid() ? this.toISOString() : null;\n };\n _proto.toISOString = function toISOString() {\n return this.$d.toISOString();\n };\n _proto.toString = function toString() {\n return this.$d.toUTCString();\n };\n return Dayjs2;\n }();\n var proto = Dayjs.prototype;\n dayjs.prototype = proto;\n [["$ms", MS], ["$s", S], ["$m", MIN], ["$H", H], ["$W", D], ["$M", M], ["$y", Y], ["$D", DATE]].forEach(function(g) {\n proto[g[1]] = function(input) {\n return this.$g(input, g[0], g[1]);\n };\n });\n dayjs.extend = function(plugin, option) {\n if (!plugin.$i) {\n plugin(option, Dayjs, dayjs);\n plugin.$i = true;\n }\n return dayjs;\n };\n dayjs.locale = parseLocale;\n dayjs.isDayjs = isDayjs;\n dayjs.unix = function(timestamp) {\n return dayjs(timestamp * 1e3);\n };\n dayjs.en = Ls[L];\n dayjs.Ls = Ls;\n dayjs.p = {};\n var advancedFormat = function(o, c2) {\n var proto2 = c2.prototype;\n var oldFormat = proto2.format;\n proto2.format = function(formatStr) {\n var _this = this;\n var locale = this.$locale();\n if (!this.isValid()) {\n return oldFormat.bind(this)(formatStr);\n }\n var utils = this.$utils();\n var str = formatStr || FORMAT_DEFAULT;\n var result = str.replace(/\\[([^\\]]+)]|Q|wo|ww|w|WW|W|zzz|z|gggg|GGGG|Do|X|x|k{1,2}|S/g, function(match) {\n switch (match) {\n case "Q":\n return Math.ceil((_this.$M + 1) / 3);\n case "Do":\n return locale.ordinal(_this.$D);\n case "gggg":\n return _this.weekYear();\n case "GGGG":\n return _this.isoWeekYear();\n case "wo":\n return locale.ordinal(_this.week(), "W");\n // W for week\n case "w":\n case "ww":\n return utils.s(_this.week(), match === "w" ? 1 : 2, "0");\n case "W":\n case "WW":\n return utils.s(_this.isoWeek(), match === "W" ? 1 : 2, "0");\n case "k":\n case "kk":\n return utils.s(String(_this.$H === 0 ? 24 : _this.$H), match === "k" ? 1 : 2, "0");\n case "X":\n return Math.floor(_this.$d.getTime() / 1e3);\n case "x":\n return _this.$d.getTime();\n case "z":\n return "[" + _this.offsetName() + "]";\n case "zzz":\n return "[" + _this.offsetName("long") + "]";\n default:\n return match;\n }\n });\n return oldFormat.bind(this)(result);\n };\n };\n var isoWeekPrettyUnit = "isoweek";\n var isoWeek = function(o, c2, d) {\n var getYearFirstThursday = function getYearFirstThursday2(year, isUtc) {\n var yearFirstDay = (isUtc ? d.utc : d)().year(year).startOf(Y);\n var addDiffDays = 4 - yearFirstDay.isoWeekday();\n if (yearFirstDay.isoWeekday() > 4) {\n addDiffDays += 7;\n }\n return yearFirstDay.add(addDiffDays, D);\n };\n var getCurrentWeekThursday = function getCurrentWeekThursday2(ins) {\n return ins.add(4 - ins.isoWeekday(), D);\n };\n var proto2 = c2.prototype;\n proto2.isoWeekYear = function() {\n var nowWeekThursday = getCurrentWeekThursday(this);\n return nowWeekThursday.year();\n };\n proto2.isoWeek = function(week) {\n if (!this.$utils().u(week)) {\n return this.add((week - this.isoWeek()) * 7, D);\n }\n var nowWeekThursday = getCurrentWeekThursday(this);\n var diffWeekThursday = getYearFirstThursday(this.isoWeekYear(), this.$u);\n return nowWeekThursday.diff(diffWeekThursday, W) + 1;\n };\n proto2.isoWeekday = function(week) {\n if (!this.$utils().u(week)) {\n return this.day(this.day() % 7 ? week : week - 7);\n }\n return this.day() || 7;\n };\n var oldStartOf = proto2.startOf;\n proto2.startOf = function(units, startOf) {\n var utils = this.$utils();\n var isStartOf = !utils.u(startOf) ? startOf : true;\n var unit = utils.p(units);\n if (unit === isoWeekPrettyUnit) {\n return isStartOf ? this.date(this.date() - (this.isoWeekday() - 1)).startOf("day") : this.date(this.date() - 1 - (this.isoWeekday() - 1) + 7).endOf("day");\n }\n return oldStartOf.bind(this)(units, startOf);\n };\n };\n dayjs.extend(isoWeek);\n dayjs.extend(advancedFormat);\n const FORMAT_ISO_WEEK_YEAR_WEEK = "GGGG-[W]WW";\n const _TemporalCache = class _TemporalCache {\n constructor() {\n this.yearMonthDayCache = /* @__PURE__ */ new Map();\n this.yearWeekCache = /* @__PURE__ */ new Map();\n this.yearMonthCache = /* @__PURE__ */ new Map();\n this.yearCache = /* @__PURE__ */ new Map();\n }\n getYearMonthDay(s2) {\n if (!this.yearMonthDayCache.has(s2)) {\n this.yearMonthDayCache.set(s2, YearMonthDayClass.parse(s2, this));\n }\n return this.yearMonthDayCache.get(s2);\n }\n getYearMonth(s2) {\n if (!this.yearMonthCache.has(s2)) {\n this.yearMonthCache.set(s2, YearMonthClass.parse(s2, this));\n }\n return this.yearMonthCache.get(s2);\n }\n getYearWeek(s2) {\n if (!this.yearWeekCache.has(s2)) {\n this.yearWeekCache.set(s2, YearWeekClass.parse(s2, this));\n }\n return this.yearWeekCache.get(s2);\n }\n getYear(s2) {\n if (!this.yearCache.has(s2)) {\n this.yearCache.set(s2, YearClass.parse(s2, this));\n }\n return this.yearCache.get(s2);\n }\n static getInstance() {\n return this.instance;\n }\n };\n _TemporalCache.instance = new _TemporalCache();\n let TemporalCache = _TemporalCache;\n class YearMonthDayClass {\n constructor(yearNumber, monthNumber, dayNumber, cache) {\n this.yearNumber = yearNumber;\n this.monthNumber = monthNumber;\n this.dayNumber = dayNumber;\n this.cache = cache;\n this.type = "YearMonthDay";\n this.date = new Date(this.yearNumber, this.monthNumber - 1, this.dayNumber);\n this.dayjs = dayjs(this.date);\n this.dateString = this.toString();\n }\n get text() {\n return this.dayjs.format("YYYY-MM-DD");\n }\n toString() {\n return this.text;\n }\n englishName() {\n return this.dayjs.format("dddd, MMMM D, YYYY");\n }\n get firstDay() {\n return this;\n }\n get lastDay() {\n return this;\n }\n get year() {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n get month() {\n return this.cache.getYearMonth(this.dayjs.format("YYYY-MM"));\n }\n get week() {\n return this.cache.getYearWeek(this.dayjs.format(FORMAT_ISO_WEEK_YEAR_WEEK));\n }\n addDays(days) {\n const date = this.dayjs.add(days, "day");\n const s2 = date.format("YYYY-MM-DD");\n return this.cache.getYearMonthDay(s2);\n }\n minus(other) {\n return this.dayjs.diff(other.dayjs, "day");\n }\n static parse(s2, cache) {\n const [year, month, day] = s2.split("-").map((s22) => parseInt(s22, 10));\n return new YearMonthDayClass(year, month, day, cache);\n }\n }\n class YearWeekClass {\n constructor(isoYearNumber, isoWeekNumber, cache) {\n this.isoYearNumber = isoYearNumber;\n this.isoWeekNumber = isoWeekNumber;\n this.cache = cache;\n this.type = "YearWeek";\n this.dateString = this.toString();\n }\n get text() {\n return this.firstDay.dayjs.format(FORMAT_ISO_WEEK_YEAR_WEEK);\n }\n toString() {\n return this.text;\n }\n englishName() {\n return `Week ${this.isoWeekNumber}, ${this.isoYearNumber}`;\n }\n get firstDay() {\n const firstDay = dayjs().year(this.isoYearNumber).month(1).date(4).isoWeek(this.isoWeekNumber).startOf("isoWeek");\n return this.cache.getYearMonthDay(firstDay.format("YYYY-MM-DD"));\n }\n get lastDay() {\n const lastDay = this.firstDay.dayjs.add(6, "days");\n return this.cache.getYearMonthDay(lastDay.format("YYYY-MM-DD"));\n }\n get year() {\n return this.cache.getYear(`${this.isoYearNumber}`);\n }\n addWeeks(weeks) {\n const date = this.firstDay.dayjs.add(weeks, "week");\n const s2 = date.format(FORMAT_ISO_WEEK_YEAR_WEEK);\n return this.cache.getYearWeek(s2);\n }\n minus(other) {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, "week");\n }\n static parse(s2, cache) {\n const [year, week] = s2.split("-W").map((s22) => parseInt(s22, 10));\n return new YearWeekClass(year, week, cache);\n }\n }\n class YearMonthClass {\n constructor(yearNumber, monthNumber, cache) {\n this.yearNumber = yearNumber;\n this.monthNumber = monthNumber;\n this.cache = cache;\n this.type = "YearMonth";\n this.dateString = this.toString();\n }\n get text() {\n return this.firstDay.dayjs.format("YYYY-MM");\n }\n toString() {\n return this.text;\n }\n englishName() {\n return `${monthName(this.monthNumber)} ${this.yearNumber}`;\n }\n get firstDay() {\n return this.cache.getYearMonthDay(dayjs(`${this.yearNumber}-${this.monthNumber}-01`).format("YYYY-MM-DD"));\n }\n get lastDay() {\n return this.cache.getYearMonthDay(\n dayjs(`${this.yearNumber}-${this.monthNumber}-01`).endOf("month").format("YYYY-MM-DD")\n );\n }\n get year() {\n return this.cache.getYear(`${this.yearNumber}`);\n }\n addMonths(months) {\n const date = this.firstDay.dayjs.add(months, "month");\n const s2 = date.format("YYYY-MM");\n return this.cache.getYearMonth(s2);\n }\n minus(other) {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, "month");\n }\n static parse(s2, cache) {\n const [year, month] = s2.split("-").map((s22) => parseInt(s22, 10));\n return new YearMonthClass(year, month, cache);\n }\n }\n class YearClass {\n constructor(year, cache) {\n this.year = year;\n this.cache = cache;\n this.type = "Year";\n this.dateString = this.toString();\n }\n get text() {\n return this.firstDay.dayjs.format("YYYY");\n }\n toString() {\n return this.text;\n }\n englishName() {\n return this.year.toString();\n }\n get firstMonth() {\n return this.cache.getYearMonth(`${this.year}-01`);\n }\n get lastMonth() {\n return this.cache.getYearMonth(`${this.year}-12`);\n }\n get firstDay() {\n return this.firstMonth.firstDay;\n }\n get lastDay() {\n return this.lastMonth.lastDay;\n }\n addYears(years) {\n const date = this.firstDay.dayjs.add(years, "year");\n const s2 = date.format("YYYY");\n return this.cache.getYear(s2);\n }\n minus(other) {\n return this.firstDay.dayjs.diff(other.firstDay.dayjs, "year");\n }\n static parse(s2, cache) {\n const year = parseInt(s2, 10);\n return new YearClass(year, cache);\n }\n }\n function monthName(month) {\n return dayjs().month(month - 1).format("MMMM");\n }\n function toTemporal(temporalClass) {\n switch (temporalClass.type) {\n case "YearMonthDay":\n return {\n type: "YearMonthDay",\n yearNumber: temporalClass.yearNumber,\n monthNumber: temporalClass.monthNumber,\n dayNumber: temporalClass.dayNumber,\n dateString: temporalClass.dateString\n };\n case "YearWeek":\n return {\n type: "YearWeek",\n isoYearNumber: temporalClass.isoYearNumber,\n isoWeekNumber: temporalClass.isoWeekNumber,\n dateString: temporalClass.dateString\n };\n case "YearMonth":\n return {\n type: "YearMonth",\n yearNumber: temporalClass.yearNumber,\n monthNumber: temporalClass.monthNumber,\n dateString: temporalClass.dateString\n };\n case "Year":\n return {\n type: "Year",\n year: temporalClass.year,\n dateString: temporalClass.dateString\n };\n }\n }\n function generateAllDaysInRange(start, end) {\n const days = [];\n const daysInBetween = end.minus(start);\n for (let i2 = 0; i2 <= daysInBetween; i2++) {\n days.push(start.addDays(i2));\n }\n return days;\n }\n function generateAllWeeksInRange(start, end) {\n const weeks = [];\n const weeksInBetween = end.minus(start);\n for (let i2 = 0; i2 <= weeksInBetween; i2++) {\n weeks.push(start.addWeeks(i2));\n }\n return weeks;\n }\n function generateAllMonthsInRange(start, end) {\n const months = [];\n const monthsInBetween = end.minus(start);\n for (let i2 = 0; i2 <= monthsInBetween; i2++) {\n months.push(start.addMonths(i2));\n }\n return months;\n }\n function generateAllYearsInRange(start, end) {\n const years = [];\n const yearsInBetween = end.minus(start);\n for (let i2 = 0; i2 <= yearsInBetween; i2++) {\n years.push(start.addYears(i2));\n }\n return years;\n }\n function generateAllInRange(start, end) {\n if (start === null || end === null) {\n return [];\n }\n if (start instanceof YearMonthDayClass && end instanceof YearMonthDayClass) {\n return generateAllDaysInRange(start, end);\n }\n if (start instanceof YearWeekClass && end instanceof YearWeekClass) {\n return generateAllWeeksInRange(start, end);\n }\n if (start instanceof YearMonthClass && end instanceof YearMonthClass) {\n return generateAllMonthsInRange(start, end);\n }\n if (start instanceof YearClass && end instanceof YearClass) {\n return generateAllYearsInRange(start, end);\n }\n throw new Error(`Invalid arguments: start and end must be of the same type: ${start}, ${end}`);\n }\n function minusTemporal(a2, b) {\n if (a2 instanceof YearMonthDayClass && b instanceof YearMonthDayClass) {\n return a2.minus(b);\n }\n if (a2 instanceof YearWeekClass && b instanceof YearWeekClass) {\n return a2.minus(b);\n }\n if (a2 instanceof YearMonthClass && b instanceof YearMonthClass) {\n return a2.minus(b);\n }\n if (a2 instanceof YearClass && b instanceof YearClass) {\n return a2.minus(b);\n }\n throw new Error(`Cannot compare ${a2} and ${b}`);\n }\n function compareTemporal(a2, b) {\n if (a2 === null) {\n return 1;\n }\n if (b === null) {\n return -1;\n }\n const diff = minusTemporal(a2, b);\n if (diff < 0) {\n return -1;\n }\n if (diff > 0) {\n return 1;\n }\n return 0;\n }\n function getMinMaxTemporal(values) {\n let min = null;\n let max = null;\n for (const value of values) {\n if (value === null) {\n continue;\n }\n if (min === null || compareTemporal(value, min) < 0) {\n min = value;\n }\n if (max === null || compareTemporal(value, max) > 0) {\n max = value;\n }\n }\n if (min === null || max === null) {\n return { min: null, max: null };\n }\n return { min, max };\n }\n function parseDateStringToTemporal(date, granularity) {\n const cache = TemporalCache.getInstance();\n const day = cache.getYearMonthDay(date);\n switch (granularity) {\n case "day":\n return day;\n case "week":\n return day.week;\n case "month":\n return day.month;\n case "year":\n return day.year;\n }\n }\n function dateRangeCompare(a2, b) {\n if (a2.dateRange === null) {\n return 1;\n }\n if (b.dateRange === null) {\n return -1;\n }\n return compareTemporal(a2.dateRange, b.dateRange);\n }\n function mapDateToGranularityRange(data, granularity) {\n return {\n dateRange: data.date === null ? null : parseDateStringToTemporal(data.date, granularity),\n count: data.count\n };\n }\n const nucleotideChars = "ACGTRYKMSWBDHVN";\n const aminoAcidChars = "ACDEFGHIKLMNPQRSTVWY";\n function segmentPart(isOptional) {\n const segmentPart2 = `(?<segment>[A-Z0-9_-]+):`;\n if (isOptional) {\n return `(${segmentPart2})?`;\n }\n return segmentPart2;\n }\n function buildSubstitutionRegex(type, segmentPartIsOptional) {\n const chars = type === "nucleotide" ? nucleotideChars : aminoAcidChars;\n return new RegExp(\n `^${segmentPart(segmentPartIsOptional)}(?<valueAtReference>[${chars}*])?(?<position>\\\\d+)(?<substitutionValue>[${chars}.*])?$`,\n "i"\n );\n }\n const nucleotideSubstitutionRegex = buildSubstitutionRegex("nucleotide", true);\n const aminoAcidSubstitutionRegex = buildSubstitutionRegex("aminoAcid", false);\n const aminoAcidSubstitutionWithoutSegmentRegex = buildSubstitutionRegex("aminoAcid", true);\n class SubstitutionClass {\n constructor(segment, valueAtReference, substitutionValue, position) {\n this.segment = segment;\n this.valueAtReference = valueAtReference;\n this.substitutionValue = substitutionValue;\n this.position = position;\n this.type = "substitution";\n const segmentString = this.segment ? `${this.segment}:` : "";\n const valueAtReferenceString = this.valueAtReference ?? "";\n const substitutionValueString = this.substitutionValue ?? "";\n this.code = `${segmentString}${valueAtReferenceString}${this.position}${substitutionValueString}`;\n }\n equals(other) {\n if (!(other instanceof SubstitutionClass)) {\n return false;\n }\n return this.segment === other.segment && this.valueAtReference === other.valueAtReference && this.substitutionValue === other.substitutionValue && this.position === other.position;\n }\n toString() {\n return this.code;\n }\n static parse(mutationStr, segmentIsOptional = false) {\n const matchNucleotide = nucleotideSubstitutionRegex.exec(mutationStr);\n const matchAminoAcid = aminoAcidSubstitutionRegex.exec(mutationStr);\n const matchAminAcidWithoutSegment = segmentIsOptional ? aminoAcidSubstitutionWithoutSegmentRegex.exec(mutationStr) : void 0;\n const match = matchNucleotide ?? matchAminoAcid ?? matchAminAcidWithoutSegment;\n if ((match == null ? void 0 : match.groups) === void 0) {\n return null;\n }\n return new SubstitutionClass(\n match.groups.segment,\n match.groups.valueAtReference,\n match.groups.substitutionValue,\n parseInt(match.groups.position, 10)\n );\n }\n }\n function buildDeletionRegex(type) {\n const chars = type === "nucleotide" ? nucleotideChars : aminoAcidChars;\n return new RegExp(\n `^${segmentPart(type === "nucleotide")}(?<valueAtReference>[${chars}*])?(?<position>\\\\d+)(-)$`,\n "i"\n );\n }\n const nucleotideDeletionRegex = buildDeletionRegex("nucleotide");\n const aminoAcidDeletionRegex = buildDeletionRegex("aminoAcid");\n class DeletionClass {\n constructor(segment, valueAtReference, position) {\n this.segment = segment;\n this.valueAtReference = valueAtReference;\n this.position = position;\n this.type = "deletion";\n const segmentString = this.segment ? `${this.segment}:` : "";\n const valueAtReferenceString = this.valueAtReference ?? "";\n this.code = `${segmentString}${valueAtReferenceString}${this.position}-`;\n }\n equals(other) {\n if (!(other instanceof DeletionClass)) {\n return false;\n }\n return this.segment === other.segment && this.valueAtReference === other.valueAtReference && this.position === other.position;\n }\n toString() {\n return this.code;\n }\n static parse(mutationStr) {\n const matchNucleotide = nucleotideDeletionRegex.exec(mutationStr);\n const matchAminoAcid = aminoAcidDeletionRegex.exec(mutationStr);\n const match = matchNucleotide ?? matchAminoAcid;\n if ((match == null ? void 0 : match.groups) === void 0) {\n return null;\n }\n return new DeletionClass(\n match.groups.segment,\n match.groups.valueAtReference,\n parseInt(match.groups.position, 10)\n );\n }\n }\n function toSubstitutionOrDeletion(mutation) {\n switch (mutation.type) {\n case "substitution":\n return {\n type: "substitution",\n code: mutation.code,\n segment: mutation.segment,\n position: mutation.position,\n valueAtReference: mutation.valueAtReference,\n substitutionValue: mutation.substitutionValue\n };\n case "deletion":\n return {\n type: "deletion",\n code: mutation.code,\n segment: mutation.segment,\n position: mutation.position,\n valueAtReference: mutation.valueAtReference\n };\n }\n }\n class FetchSubstitutionsOrDeletionsOperator {\n constructor(filter, sequenceType, minProportion) {\n this.filter = filter;\n this.sequenceType = sequenceType;\n this.minProportion = minProportion;\n }\n async evaluate(lapis, signal) {\n const mutations = await this.fetchMutations(lapis, signal);\n const content = mutations.map(\n ({ count, proportion, mutationFrom, mutationTo, position, sequenceName }) => {\n if (mutationTo === "-") {\n return {\n type: "deletion",\n mutation: new DeletionClass(sequenceName ?? void 0, mutationFrom, position),\n count,\n proportion\n };\n }\n return {\n type: "substitution",\n mutation: new SubstitutionClass(sequenceName ?? void 0, mutationFrom, mutationTo, position),\n count,\n proportion\n };\n }\n );\n return { content };\n }\n async fetchMutations(lapis, signal) {\n const filter = {\n ...this.filter,\n minProportion: this.minProportion\n };\n return fetchSubstitutionsOrDeletions(lapis, filter, this.sequenceType, signal).then(\n (response) => response.data\n );\n }\n }\n var l$1;\n l$1 = { __e: function(n, l2, u2, t) {\n for (var i2, r2, o; l2 = l2.__; ) if ((i2 = l2.__c) && !i2.__) try {\n if ((r2 = i2.constructor) && null != r2.getDerivedStateFromError && (i2.setState(r2.getDerivedStateFromError(n)), o = i2.__d), null != i2.componentDidCatch && (i2.componentDidCatch(n, t || {}), o = i2.__d), o) return i2.__E = i2;\n } catch (l3) {\n n = l3;\n }\n throw n;\n } }, "function" == typeof Promise ? Promise.prototype.then.bind(Promise.resolve()) : setTimeout;\n var r, u, i, f = [], c = l$1, e = c.__b, a = c.__r, v = c.diffed, l = c.__c, m = c.unmount, s = c.__;\n function j() {\n for (var n; n = f.shift(); ) if (n.__P && n.__H) try {\n n.__H.__h.forEach(z), n.__H.__h.forEach(B), n.__H.__h = [];\n } catch (t) {\n n.__H.__h = [], c.__e(t, n.__v);\n }\n }\n c.__b = function(n) {\n r = null, e && e(n);\n }, c.__ = function(n, t) {\n n && t.__k && t.__k.__m && (n.__m = t.__k.__m), s && s(n, t);\n }, c.__r = function(n) {\n a && a(n);\n var i2 = (r = n.__c).__H;\n i2 && (u === r ? (i2.__h = [], r.__h = [], i2.__.forEach(function(n2) {\n n2.__N && (n2.__ = n2.__N), n2.u = n2.__N = void 0;\n })) : (i2.__h.forEach(z), i2.__h.forEach(B), i2.__h = [], 0)), u = r;\n }, c.diffed = function(n) {\n v && v(n);\n var t = n.__c;\n t && t.__H && (t.__H.__h.length && (1 !== f.push(t) && i === c.requestAnimationFrame || ((i = c.requestAnimationFrame) || w)(j)), t.__H.__.forEach(function(n2) {\n n2.u && (n2.__H = n2.u), n2.u = void 0;\n })), u = r = null;\n }, c.__c = function(n, t) {\n t.some(function(n2) {\n try {\n n2.__h.forEach(z), n2.__h = n2.__h.filter(function(n3) {\n return !n3.__ || B(n3);\n });\n } catch (r2) {\n t.some(function(n3) {\n n3.__h && (n3.__h = []);\n }), t = [], c.__e(r2, n2.__v);\n }\n }), l && l(n, t);\n }, c.unmount = function(n) {\n m && m(n);\n var t, r2 = n.__c;\n r2 && r2.__H && (r2.__H.__.forEach(function(n2) {\n try {\n z(n2);\n } catch (n3) {\n t = n3;\n }\n }), r2.__H = void 0, t && c.__e(t, r2.__v));\n };\n var k = "function" == typeof requestAnimationFrame;\n function w(n) {\n var t, r2 = function() {\n clearTimeout(u2), k && cancelAnimationFrame(t), setTimeout(n);\n }, u2 = setTimeout(r2, 35);\n k && (t = requestAnimationFrame(r2));\n }\n function z(n) {\n var t = r, u2 = n.__c;\n "function" == typeof u2 && (n.__c = void 0, u2()), r = t;\n }\n function B(n) {\n var t = r;\n n.__c = n.__(), r = t;\n }\n class UserFacingError extends Error {\n constructor(headline, message) {\n super(message);\n this.headline = headline;\n this.name = "UserFacingError";\n }\n }\n class Map2dBase {\n constructor(serializeFirstAxis, serializeSecondAxis, initialContent) {\n this.serializeFirstAxis = serializeFirstAxis;\n this.serializeSecondAxis = serializeSecondAxis;\n this.data = /* @__PURE__ */ new Map();\n this.keysFirstAxis = /* @__PURE__ */ new Map();\n this.keysSecondAxis = /* @__PURE__ */ new Map();\n if (initialContent) {\n this.keysFirstAxis = new Map(initialContent.keysFirstAxis);\n this.keysSecondAxis = new Map(initialContent.keysSecondAxis);\n this.data = new Map(initialContent.data);\n }\n }\n get(keyFirstAxis, keySecondAxis) {\n var _a;\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n return (_a = this.data.get(serializedKeyFirstAxis)) == null ? void 0 : _a.get(serializedKeySecondAxis);\n }\n getRow(key) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n const row = this.data.get(serializedKeyFirstAxis);\n if (row === void 0) {\n return [];\n }\n return Array.from(this.keysSecondAxis.keys()).map((key2) => row.get(key2));\n }\n set(keyFirstAxis, keySecondAxis, value) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(keyFirstAxis);\n const serializedKeySecondAxis = this.serializeSecondAxis(keySecondAxis);\n if (!this.data.has(serializedKeyFirstAxis)) {\n this.data.set(serializedKeyFirstAxis, /* @__PURE__ */ new Map());\n }\n this.data.get(serializedKeyFirstAxis).set(serializedKeySecondAxis, value);\n this.keysFirstAxis.set(serializedKeyFirstAxis, keyFirstAxis);\n this.keysSecondAxis.set(serializedKeySecondAxis, keySecondAxis);\n }\n deleteRow(key) {\n const serializedKeyFirstAxis = this.serializeFirstAxis(key);\n this.data.delete(serializedKeyFirstAxis);\n this.keysFirstAxis.delete(serializedKeyFirstAxis);\n }\n getFirstAxisKeys() {\n return Array.from(this.keysFirstAxis.values());\n }\n getSecondAxisKeys() {\n return Array.from(this.keysSecondAxis.values());\n }\n getAsArray() {\n return this.getFirstAxisKeys().map((firstAxisKey) => {\n return this.getSecondAxisKeys().map((secondAxisKey) => {\n return this.get(firstAxisKey, secondAxisKey);\n });\n });\n }\n getContents() {\n return {\n keysFirstAxis: this.keysFirstAxis,\n keysSecondAxis: this.keysSecondAxis,\n data: this.data\n };\n }\n }\n class BaseMutationOverTimeDataMap extends Map2dBase {\n constructor(initialContent) {\n super(serializeSubstitutionOrDeletion, serializeTemporal, initialContent);\n }\n }\n const sortSubstitutionsAndDeletions = (a2, b) => {\n if (a2.segment !== b.segment) {\n return compareSegments(a2.segment, b.segment);\n }\n if (a2.position !== b.position) {\n return comparePositions(a2.position, b.position);\n }\n const aIsDeletion = a2.type === "deletion";\n const bIsDeletion = b.type === "deletion";\n if (aIsDeletion !== bIsDeletion) {\n return aIsDeletion ? 1 : -1;\n }\n if (!aIsDeletion && !bIsDeletion) {\n if (a2.substitutionValue !== b.substitutionValue) {\n return compareSubstitutionValues(a2.substitutionValue, b.substitutionValue);\n }\n }\n return 0;\n };\n const compareSegments = (a2, b) => {\n if (a2 === void 0) {\n return -1;\n }\n if (b === void 0) {\n return 1;\n }\n return a2.localeCompare(b);\n };\n const comparePositions = (a2, b) => {\n return a2 - b;\n };\n const compareSubstitutionValues = (a2, b) => {\n if (a2 === void 0) {\n return -1;\n }\n if (b === void 0) {\n return 1;\n }\n return a2.localeCompare(b);\n };\n const MAX_NUMBER_OF_GRID_COLUMNS = 200;\n const MUTATIONS_OVER_TIME_MIN_PROPORTION = 1e-3;\n function codeToEmptyEntry(code) {\n const maybeDeletion = DeletionClass.parse(code);\n if (maybeDeletion) {\n return {\n type: "deletion",\n mutation: maybeDeletion,\n count: 0,\n proportion: 0\n };\n }\n const maybeSubstitution = SubstitutionClass.parse(code);\n if (maybeSubstitution) {\n return {\n type: "substitution",\n mutation: maybeSubstitution,\n count: 0,\n proportion: 0\n };\n }\n return null;\n }\n async function queryOverallMutationData({\n lapisFilter,\n sequenceType,\n lapis,\n granularity,\n lapisDateField,\n includeMutations,\n signal\n }) {\n const requestedDateRanges = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n if (requestedDateRanges.length === 0) {\n if (includeMutations) {\n return {\n content: includeMutations.map(codeToEmptyEntry).filter((e2) => e2 !== null)\n };\n } else {\n return {\n content: []\n };\n }\n }\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: requestedDateRanges[0].firstDay.toString(),\n [`${lapisDateField}To`]: requestedDateRanges[requestedDateRanges.length - 1].lastDay.toString()\n };\n let dataPromise = fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);\n if (includeMutations) {\n dataPromise = dataPromise.then((data) => {\n return {\n content: includeMutations.map((code) => {\n const found = data.content.find((m2) => m2.mutation.code === code);\n return found ?? codeToEmptyEntry(code);\n }).filter((e2) => e2 !== null)\n };\n });\n }\n return dataPromise;\n }\n async function queryMutationsOverTimeData(query) {\n const { lapisFilter, displayMutations, sequenceType, lapis, lapisDateField, granularity, useNewEndpoint, signal } = query;\n const requestedDateRanges = await getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);\n if (requestedDateRanges.length > MAX_NUMBER_OF_GRID_COLUMNS) {\n throw new UserFacingError(\n "Too many dates",\n `The dataset would contain ${requestedDateRanges.length} date intervals. Please reduce the number to below ${MAX_NUMBER_OF_GRID_COLUMNS} to display the data. You can achieve this by either narrowing the date range in the provided LAPIS filter or by selecting a larger granularity.`\n );\n }\n const overallMutationData = queryOverallMutationData({\n lapisFilter,\n sequenceType,\n lapis,\n lapisDateField,\n includeMutations: displayMutations,\n granularity\n }).then((r2) => r2.content);\n return useNewEndpoint === true ? queryMutationsOverTimeDataDirectEndpoint(requestedDateRanges, overallMutationData, query) : queryMutationsOverTimeDataMultiQuery(requestedDateRanges, overallMutationData, query);\n }\n async function queryMutationsOverTimeDataMultiQuery(allDates, overallMutationDataPromise, { lapisFilter, sequenceType, lapis, lapisDateField, signal }) {\n const subQueries = allDates.map(async (date) => {\n const dateFrom = date.firstDay.toString();\n const dateTo = date.lastDay.toString();\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: dateFrom,\n [`${lapisDateField}To`]: dateTo\n };\n const [data2, totalCountQuery] = await Promise.all([\n fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal),\n getTotalNumberOfSequencesInDateRange(filter).evaluate(lapis, signal)\n ]);\n return {\n date,\n mutations: data2.content,\n totalCount: totalCountQuery.content[0].count\n };\n });\n const data = await Promise.all(subQueries);\n const overallMutationData = await overallMutationDataPromise;\n return {\n mutationOverTimeData: groupByMutation(data, overallMutationData),\n overallMutationData\n };\n }\n async function queryMutationsOverTimeDataDirectEndpoint(allDates, overallMutationDataPromise, { lapisFilter, sequenceType, lapis, lapisDateField, signal }) {\n const overallMutationData = await overallMutationDataPromise;\n overallMutationData.sort((a2, b) => sortSubstitutionsAndDeletions(a2.mutation, b.mutation));\n const totalCounts = await Promise.all(\n allDates.map(async (date) => {\n const filter = {\n ...lapisFilter,\n [`${lapisDateField}From`]: date.firstDay.toString(),\n [`${lapisDateField}To`]: date.lastDay.toString()\n };\n const totalCountQuery = await getTotalNumberOfSequencesInDateRange(filter).evaluate(lapis, signal);\n return totalCountQuery.content[0].count;\n })\n );\n const includeMutations = overallMutationData.map((value) => value.mutation.code);\n const apiResult = await fetchMutationsOverTime(\n lapis,\n {\n filters: lapisFilter,\n dateRanges: allDates.map((date) => ({\n dateFrom: date.firstDay.toString(),\n dateTo: date.lastDay.toString()\n })),\n includeMutations,\n dateField: lapisDateField\n },\n sequenceType,\n signal\n );\n const responseMutations = apiResult.data.mutations.map(parseMutationCode);\n const mutationEntries = responseMutations.map((mutation, i2) => {\n const numbers = {\n count: overallMutationData[i2].count,\n proportion: overallMutationData[i2].proportion\n };\n if (mutation.type === "deletion") {\n return {\n type: "deletion",\n mutation,\n ...numbers\n };\n } else {\n return {\n type: "substitution",\n mutation,\n ...numbers\n };\n }\n });\n const mutationOverTimeData = {\n keysFirstAxis: new Map(responseMutations.map((mutation) => [mutation.code, mutation])),\n keysSecondAxis: new Map(allDates.map((date) => [date.dateString, date])),\n data: new Map(\n responseMutations.map((mutation, i2) => [\n mutation.code,\n new Map(\n allDates.map((date, j2) => {\n if (totalCounts[j2] === 0) {\n return [date.dateString, null];\n }\n const count = apiResult.data.data[i2][j2].count;\n const coverage = apiResult.data.data[i2][j2].coverage;\n const totalCount = totalCounts[j2];\n if (coverage === 0) {\n return [\n date.dateString,\n {\n type: "belowThreshold",\n totalCount\n }\n ];\n }\n return [\n date.dateString,\n {\n type: "valueWithCoverage",\n count,\n coverage,\n totalCount\n }\n ];\n })\n )\n ])\n )\n };\n return {\n mutationOverTimeData: new BaseMutationOverTimeDataMap(mutationOverTimeData),\n overallMutationData: mutationEntries\n };\n }\n function parseMutationCode(code) {\n const maybeDeletion = DeletionClass.parse(code);\n if (maybeDeletion) {\n return maybeDeletion;\n }\n const maybeSubstitution = SubstitutionClass.parse(code);\n if (maybeSubstitution) {\n return maybeSubstitution;\n }\n throw Error(`Given code is not valid: ${code}`);\n }\n async function getDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal) {\n const { dateFrom, dateTo } = getDateRangeFromFilter(lapisFilter, lapisDateField, granularity);\n if (dateFrom !== null && dateTo !== null) {\n return generateAllInRange(dateFrom, dateTo);\n }\n const { content: availableDates } = await queryAvailableDates(\n lapisFilter,\n lapis,\n granularity,\n lapisDateField,\n signal\n );\n const { min, max } = getMinMaxTemporal(availableDates);\n return generateAllInRange(dateFrom ?? min, dateTo ?? max);\n }\n function getDateRangeFromFilter(lapisFilter, lapisDateField, granularity) {\n const valueFromFilter = lapisFilter[lapisDateField];\n if (valueFromFilter) {\n return {\n dateFrom: parseDateStringToTemporal(valueFromFilter, granularity),\n dateTo: parseDateStringToTemporal(valueFromFilter, granularity)\n };\n }\n const minFromFilter = lapisFilter[`${lapisDateField}From`];\n const maxFromFilter = lapisFilter[`${lapisDateField}To`];\n return {\n dateFrom: minFromFilter ? parseDateStringToTemporal(minFromFilter, granularity) : null,\n dateTo: maxFromFilter ? parseDateStringToTemporal(maxFromFilter, granularity) : null\n };\n }\n function queryAvailableDates(lapisFilter, lapis, granularity, lapisDateField, signal) {\n return fetchAndPrepareDates(lapisFilter, granularity, lapisDateField).evaluate(lapis, signal);\n }\n function fetchAndPrepareDates(filter, granularity, lapisDateField) {\n const fetchData = new FetchAggregatedOperator(filter, [lapisDateField]);\n const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, "date");\n const mapData = new MapOperator(dataWithFixedDateKey, (data) => mapDateToGranularityRange(data, granularity));\n const groupByData = new GroupByAndSumOperator(mapData, "dateRange", "count");\n const sortData = new SortOperator(groupByData, dateRangeCompare);\n return new MapOperator(sortData, (data) => data.dateRange);\n }\n function fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType) {\n return new FetchSubstitutionsOrDeletionsOperator(filter, sequenceType, MUTATIONS_OVER_TIME_MIN_PROPORTION);\n }\n function serializeSubstitutionOrDeletion(mutation) {\n return mutation.code;\n }\n function serializeTemporal(date) {\n return date.dateString;\n }\n function groupByMutation(data, overallMutationData) {\n const dataArray = new BaseMutationOverTimeDataMap();\n const allDates = data.map((mutationData) => mutationData.date);\n const sortedOverallMutationData = overallMutationData.sort((a2, b) => sortSubstitutionsAndDeletions(a2.mutation, b.mutation)).map((entry) => {\n return toSubstitutionOrDeletion(entry.mutation);\n });\n const sortedDates = allDates.sort((a2, b) => compareTemporal(a2, b)).map((date) => toTemporal(date));\n sortedOverallMutationData.forEach((mutationData) => {\n sortedDates.forEach((date) => {\n dataArray.set(mutationData, date, null);\n });\n });\n data.forEach((mutationData) => {\n if (mutationData.totalCount == 0) {\n return;\n }\n const date = toTemporal(mutationData.date);\n mutationData.mutations.forEach((mutationEntry) => {\n const mutation = toSubstitutionOrDeletion(mutationEntry.mutation);\n if (dataArray.get(mutation, date) !== void 0) {\n dataArray.set(mutation, date, {\n type: "value",\n count: mutationEntry.count,\n proportion: mutationEntry.proportion,\n totalCount: mutationData.totalCount\n });\n }\n });\n for (const firstAxisKey of dataArray.getFirstAxisKeys()) {\n if (dataArray.get(firstAxisKey, date) === null) {\n dataArray.set(firstAxisKey, date, {\n type: "belowThreshold",\n totalCount: mutationData.totalCount\n });\n }\n }\n });\n return dataArray;\n }\n function getTotalNumberOfSequencesInDateRange(filter) {\n return new FetchAggregatedOperator(filter);\n }\n async function workerFunction(queryFunction) {\n try {\n postMessage({ status: "loading" });\n const workerResponse = await queryFunction();\n postMessage({\n status: "success",\n data: workerResponse\n });\n } catch (error) {\n postMessage(\n error instanceof UserFacingError ? {\n status: "error",\n userFacing: true,\n headline: error.headline,\n error\n } : {\n status: "error",\n userFacing: false,\n error: error instanceof Error ? error : new Error(`${error}`)\n }\n );\n }\n }\n async function getMutationOverTimeWorkerFunction(event) {\n const mutationOverTimeData = await queryMutationsOverTimeData(event.data);\n const workerResponse = {\n overallMutationData: mutationOverTimeData.overallMutationData,\n mutationOverTimeSerialized: mutationOverTimeData.mutationOverTimeData.getContents()\n };\n return workerResponse;\n }\n self.onmessage = async function(event) {\n await workerFunction(() => getMutationOverTimeWorkerFunction(event));\n };\n})();\n//# sourceMappingURL=mutationOverTimeWorker-CQQFRoK4.js.map\n';
|
|
7174
|
-
const blob = typeof self !== "undefined" && self.Blob && new Blob([jsContent], { type: "text/javascript;charset=utf-8" });
|
|
7175
|
-
function WorkerWrapper(options2) {
|
|
7176
|
-
let objURL;
|
|
7177
|
-
try {
|
|
7178
|
-
objURL = blob && (self.URL || self.webkitURL).createObjectURL(blob);
|
|
7179
|
-
if (!objURL) throw "";
|
|
7180
|
-
const worker = new Worker(objURL, {
|
|
7181
|
-
name: options2 == null ? void 0 : options2.name
|
|
7182
|
-
});
|
|
7183
|
-
worker.addEventListener("error", () => {
|
|
7184
|
-
(self.URL || self.webkitURL).revokeObjectURL(objURL);
|
|
7185
|
-
});
|
|
7186
|
-
return worker;
|
|
7187
|
-
} catch (e2) {
|
|
7188
|
-
return new Worker(
|
|
7189
|
-
"data:text/javascript;charset=utf-8," + encodeURIComponent(jsContent),
|
|
7190
|
-
{
|
|
7191
|
-
name: options2 == null ? void 0 : options2.name
|
|
7192
|
-
}
|
|
7193
|
-
);
|
|
7194
|
-
} finally {
|
|
7195
|
-
objURL && (self.URL || self.webkitURL).revokeObjectURL(objURL);
|
|
7196
|
-
}
|
|
7197
|
-
}
|
|
7198
|
-
function getProportion(value) {
|
|
7199
|
-
switch (value == null ? void 0 : value.type) {
|
|
7200
|
-
case "value":
|
|
7201
|
-
case "wastewaterValue":
|
|
7202
|
-
return value.proportion;
|
|
7203
|
-
case "valueWithCoverage":
|
|
7204
|
-
return value.count / value.coverage;
|
|
7205
|
-
case "belowThreshold":
|
|
7206
|
-
return void 0;
|
|
7207
|
-
}
|
|
7208
|
-
return void 0;
|
|
7209
|
-
}
|
|
7210
|
-
const MUTATIONS_OVER_TIME_MIN_PROPORTION = 1e-3;
|
|
7211
|
-
function serializeSubstitutionOrDeletion(mutation) {
|
|
7212
|
-
return mutation.code;
|
|
7213
|
-
}
|
|
7214
|
-
function serializeTemporal(date) {
|
|
7215
|
-
return date.dateString;
|
|
7216
|
-
}
|
|
7217
7221
|
class Map2dBase {
|
|
7218
7222
|
constructor(serializeFirstAxis, serializeSecondAxis, initialContent) {
|
|
7219
7223
|
this.serializeFirstAxis = serializeFirstAxis;
|
|
@@ -7364,11 +7368,6 @@ class Map2dView {
|
|
|
7364
7368
|
};
|
|
7365
7369
|
}
|
|
7366
7370
|
}
|
|
7367
|
-
class BaseMutationOverTimeDataMap extends Map2dBase {
|
|
7368
|
-
constructor(initialContent) {
|
|
7369
|
-
super(serializeSubstitutionOrDeletion, serializeTemporal, initialContent);
|
|
7370
|
-
}
|
|
7371
|
-
}
|
|
7372
7371
|
const displayMutationsSchema = z$2.array(z$2.string());
|
|
7373
7372
|
function getFilteredMutationOverTimeData$1({
|
|
7374
7373
|
data,
|
|
@@ -7436,6 +7435,241 @@ function mutationMatchesAnnotationFilter(mutation, sequenceType, annotationNameF
|
|
|
7436
7435
|
}
|
|
7437
7436
|
return mutationAnnotations.some((annotation) => annotationNameFilter.has(annotation.name));
|
|
7438
7437
|
}
|
|
7438
|
+
async function queryDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal) {
|
|
7439
|
+
const { dateFrom, dateTo } = getDateRangeFromFilter(lapisFilter, lapisDateField, granularity);
|
|
7440
|
+
if (dateFrom !== null && dateTo !== null) {
|
|
7441
|
+
return generateAllInRange(dateFrom, dateTo);
|
|
7442
|
+
}
|
|
7443
|
+
const { content: availableDates } = await queryAvailableDates(
|
|
7444
|
+
lapisFilter,
|
|
7445
|
+
lapis,
|
|
7446
|
+
granularity,
|
|
7447
|
+
lapisDateField,
|
|
7448
|
+
signal
|
|
7449
|
+
);
|
|
7450
|
+
const { min, max } = getMinMaxTemporal(availableDates);
|
|
7451
|
+
return generateAllInRange(dateFrom ?? min, dateTo ?? max);
|
|
7452
|
+
}
|
|
7453
|
+
function getDateRangeFromFilter(lapisFilter, lapisDateField, granularity) {
|
|
7454
|
+
const valueFromFilter = lapisFilter[lapisDateField];
|
|
7455
|
+
if (valueFromFilter) {
|
|
7456
|
+
return {
|
|
7457
|
+
dateFrom: parseDateStringToTemporal(valueFromFilter, granularity),
|
|
7458
|
+
dateTo: parseDateStringToTemporal(valueFromFilter, granularity)
|
|
7459
|
+
};
|
|
7460
|
+
}
|
|
7461
|
+
const minFromFilter = lapisFilter[`${lapisDateField}From`];
|
|
7462
|
+
const maxFromFilter = lapisFilter[`${lapisDateField}To`];
|
|
7463
|
+
return {
|
|
7464
|
+
dateFrom: minFromFilter ? parseDateStringToTemporal(minFromFilter, granularity) : null,
|
|
7465
|
+
dateTo: maxFromFilter ? parseDateStringToTemporal(maxFromFilter, granularity) : null
|
|
7466
|
+
};
|
|
7467
|
+
}
|
|
7468
|
+
function queryAvailableDates(lapisFilter, lapis, granularity, lapisDateField, signal) {
|
|
7469
|
+
return fetchAndPrepareDates(lapisFilter, granularity, lapisDateField).evaluate(lapis, signal);
|
|
7470
|
+
}
|
|
7471
|
+
function fetchAndPrepareDates(filter, granularity, lapisDateField) {
|
|
7472
|
+
const fetchData = new FetchAggregatedOperator(filter, [lapisDateField]);
|
|
7473
|
+
const dataWithFixedDateKey = new RenameFieldOperator(fetchData, lapisDateField, "date");
|
|
7474
|
+
const mapData = new MapOperator(dataWithFixedDateKey, (data) => mapDateToGranularityRange(data, granularity));
|
|
7475
|
+
const groupByData = new GroupByAndSumOperator(mapData, "dateRange", "count");
|
|
7476
|
+
const sortData = new SortOperator(groupByData, dateRangeCompare);
|
|
7477
|
+
return new MapOperator(sortData, (data) => data.dateRange);
|
|
7478
|
+
}
|
|
7479
|
+
class BaseMutationOverTimeDataMap extends Map2dBase {
|
|
7480
|
+
constructor(initialContent) {
|
|
7481
|
+
super(serializeSubstitutionOrDeletion, serializeTemporal, initialContent);
|
|
7482
|
+
}
|
|
7483
|
+
}
|
|
7484
|
+
function getProportion(value) {
|
|
7485
|
+
switch (value == null ? void 0 : value.type) {
|
|
7486
|
+
case "value":
|
|
7487
|
+
case "wastewaterValue":
|
|
7488
|
+
return value.proportion;
|
|
7489
|
+
case "valueWithCoverage":
|
|
7490
|
+
return value.count / value.coverage;
|
|
7491
|
+
case "belowThreshold":
|
|
7492
|
+
return void 0;
|
|
7493
|
+
}
|
|
7494
|
+
return void 0;
|
|
7495
|
+
}
|
|
7496
|
+
const MAX_NUMBER_OF_GRID_COLUMNS = 200;
|
|
7497
|
+
const MUTATIONS_OVER_TIME_MIN_PROPORTION = 1e-3;
|
|
7498
|
+
function codeToEmptyEntry(code) {
|
|
7499
|
+
const maybeDeletion = DeletionClass.parse(code);
|
|
7500
|
+
if (maybeDeletion) {
|
|
7501
|
+
return {
|
|
7502
|
+
type: "deletion",
|
|
7503
|
+
mutation: maybeDeletion,
|
|
7504
|
+
count: 0,
|
|
7505
|
+
proportion: 0
|
|
7506
|
+
};
|
|
7507
|
+
}
|
|
7508
|
+
const maybeSubstitution = SubstitutionClass.parse(code);
|
|
7509
|
+
if (maybeSubstitution) {
|
|
7510
|
+
return {
|
|
7511
|
+
type: "substitution",
|
|
7512
|
+
mutation: maybeSubstitution,
|
|
7513
|
+
count: 0,
|
|
7514
|
+
proportion: 0
|
|
7515
|
+
};
|
|
7516
|
+
}
|
|
7517
|
+
return null;
|
|
7518
|
+
}
|
|
7519
|
+
async function queryOverallMutationData({
|
|
7520
|
+
lapisFilter,
|
|
7521
|
+
sequenceType,
|
|
7522
|
+
lapis,
|
|
7523
|
+
granularity,
|
|
7524
|
+
lapisDateField,
|
|
7525
|
+
includeMutations,
|
|
7526
|
+
signal
|
|
7527
|
+
}) {
|
|
7528
|
+
const requestedDateRanges = await queryDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);
|
|
7529
|
+
if (requestedDateRanges.length === 0) {
|
|
7530
|
+
if (includeMutations) {
|
|
7531
|
+
return {
|
|
7532
|
+
content: includeMutations.map(codeToEmptyEntry).filter((e2) => e2 !== null)
|
|
7533
|
+
};
|
|
7534
|
+
} else {
|
|
7535
|
+
return {
|
|
7536
|
+
content: []
|
|
7537
|
+
};
|
|
7538
|
+
}
|
|
7539
|
+
}
|
|
7540
|
+
const filter = {
|
|
7541
|
+
...lapisFilter,
|
|
7542
|
+
[`${lapisDateField}From`]: requestedDateRanges[0].firstDay.toString(),
|
|
7543
|
+
[`${lapisDateField}To`]: requestedDateRanges[requestedDateRanges.length - 1].lastDay.toString()
|
|
7544
|
+
};
|
|
7545
|
+
let dataPromise = fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType).evaluate(lapis, signal);
|
|
7546
|
+
if (includeMutations) {
|
|
7547
|
+
dataPromise = dataPromise.then((data) => {
|
|
7548
|
+
return {
|
|
7549
|
+
content: includeMutations.map((code) => {
|
|
7550
|
+
const found = data.content.find((m2) => m2.mutation.code === code);
|
|
7551
|
+
return found ?? codeToEmptyEntry(code);
|
|
7552
|
+
}).filter((e2) => e2 !== null)
|
|
7553
|
+
};
|
|
7554
|
+
});
|
|
7555
|
+
}
|
|
7556
|
+
return dataPromise;
|
|
7557
|
+
}
|
|
7558
|
+
async function queryMutationsOverTimeData(lapisFilter, sequenceType, lapis, lapisDateField, granularity, displayMutations, signal) {
|
|
7559
|
+
const requestedDateRanges = await queryDatesInDataset(lapisFilter, lapis, granularity, lapisDateField, signal);
|
|
7560
|
+
if (requestedDateRanges.length > MAX_NUMBER_OF_GRID_COLUMNS) {
|
|
7561
|
+
throw new UserFacingError(
|
|
7562
|
+
"Too many dates",
|
|
7563
|
+
`The dataset would contain ${requestedDateRanges.length} date intervals. Please reduce the number to below ${MAX_NUMBER_OF_GRID_COLUMNS} to display the data. You can achieve this by either narrowing the date range in the provided LAPIS filter or by selecting a larger granularity.`
|
|
7564
|
+
);
|
|
7565
|
+
}
|
|
7566
|
+
const overallMutationData = await queryOverallMutationData({
|
|
7567
|
+
lapisFilter,
|
|
7568
|
+
sequenceType,
|
|
7569
|
+
lapis,
|
|
7570
|
+
lapisDateField,
|
|
7571
|
+
includeMutations: displayMutations,
|
|
7572
|
+
granularity
|
|
7573
|
+
}).then((r2) => r2.content);
|
|
7574
|
+
overallMutationData.sort((a2, b2) => sortSubstitutionsAndDeletions(a2.mutation, b2.mutation));
|
|
7575
|
+
const includeMutations = overallMutationData.map((value) => value.mutation.code);
|
|
7576
|
+
const apiResult = await fetchMutationsOverTime(
|
|
7577
|
+
lapis,
|
|
7578
|
+
{
|
|
7579
|
+
filters: lapisFilter,
|
|
7580
|
+
dateRanges: requestedDateRanges.map((date) => ({
|
|
7581
|
+
dateFrom: date.firstDay.toString(),
|
|
7582
|
+
dateTo: date.lastDay.toString()
|
|
7583
|
+
})),
|
|
7584
|
+
includeMutations,
|
|
7585
|
+
dateField: lapisDateField
|
|
7586
|
+
},
|
|
7587
|
+
sequenceType,
|
|
7588
|
+
signal
|
|
7589
|
+
);
|
|
7590
|
+
const totalCounts = apiResult.data.totalCountsByDateRange;
|
|
7591
|
+
const responseMutations = apiResult.data.mutations.map(parseMutationCode);
|
|
7592
|
+
const mutationEntries = responseMutations.map((mutation, i2) => {
|
|
7593
|
+
const numbers = {
|
|
7594
|
+
count: overallMutationData[i2].count,
|
|
7595
|
+
proportion: overallMutationData[i2].proportion
|
|
7596
|
+
};
|
|
7597
|
+
if (mutation.type === "deletion") {
|
|
7598
|
+
return {
|
|
7599
|
+
type: "deletion",
|
|
7600
|
+
mutation,
|
|
7601
|
+
...numbers
|
|
7602
|
+
};
|
|
7603
|
+
} else {
|
|
7604
|
+
return {
|
|
7605
|
+
type: "substitution",
|
|
7606
|
+
mutation,
|
|
7607
|
+
...numbers
|
|
7608
|
+
};
|
|
7609
|
+
}
|
|
7610
|
+
});
|
|
7611
|
+
const mutationOverTimeData = {
|
|
7612
|
+
keysFirstAxis: new Map(responseMutations.map((mutation) => [mutation.code, mutation])),
|
|
7613
|
+
keysSecondAxis: new Map(requestedDateRanges.map((date) => [date.dateString, date])),
|
|
7614
|
+
data: new Map(
|
|
7615
|
+
responseMutations.map((mutation, i2) => [
|
|
7616
|
+
mutation.code,
|
|
7617
|
+
new Map(
|
|
7618
|
+
requestedDateRanges.map((date, j2) => {
|
|
7619
|
+
if (totalCounts[j2] === 0) {
|
|
7620
|
+
return [date.dateString, null];
|
|
7621
|
+
}
|
|
7622
|
+
const count = apiResult.data.data[i2][j2].count;
|
|
7623
|
+
const coverage = apiResult.data.data[i2][j2].coverage;
|
|
7624
|
+
const totalCount = totalCounts[j2];
|
|
7625
|
+
if (coverage === 0) {
|
|
7626
|
+
return [
|
|
7627
|
+
date.dateString,
|
|
7628
|
+
{
|
|
7629
|
+
type: "belowThreshold",
|
|
7630
|
+
totalCount
|
|
7631
|
+
}
|
|
7632
|
+
];
|
|
7633
|
+
}
|
|
7634
|
+
return [
|
|
7635
|
+
date.dateString,
|
|
7636
|
+
{
|
|
7637
|
+
type: "valueWithCoverage",
|
|
7638
|
+
count,
|
|
7639
|
+
coverage,
|
|
7640
|
+
totalCount
|
|
7641
|
+
}
|
|
7642
|
+
];
|
|
7643
|
+
})
|
|
7644
|
+
)
|
|
7645
|
+
])
|
|
7646
|
+
)
|
|
7647
|
+
};
|
|
7648
|
+
return {
|
|
7649
|
+
mutationOverTimeData: new BaseMutationOverTimeDataMap(mutationOverTimeData),
|
|
7650
|
+
overallMutationData: mutationEntries
|
|
7651
|
+
};
|
|
7652
|
+
}
|
|
7653
|
+
function parseMutationCode(code) {
|
|
7654
|
+
const maybeDeletion = DeletionClass.parse(code);
|
|
7655
|
+
if (maybeDeletion) {
|
|
7656
|
+
return maybeDeletion;
|
|
7657
|
+
}
|
|
7658
|
+
const maybeSubstitution = SubstitutionClass.parse(code);
|
|
7659
|
+
if (maybeSubstitution) {
|
|
7660
|
+
return maybeSubstitution;
|
|
7661
|
+
}
|
|
7662
|
+
throw Error(`Given code is not valid: ${code}`);
|
|
7663
|
+
}
|
|
7664
|
+
function fetchAndPrepareSubstitutionsOrDeletions(filter, sequenceType) {
|
|
7665
|
+
return new FetchSubstitutionsOrDeletionsOperator(filter, sequenceType, MUTATIONS_OVER_TIME_MIN_PROPORTION);
|
|
7666
|
+
}
|
|
7667
|
+
function serializeSubstitutionOrDeletion(mutation) {
|
|
7668
|
+
return mutation.code;
|
|
7669
|
+
}
|
|
7670
|
+
function serializeTemporal(date) {
|
|
7671
|
+
return date.dateString;
|
|
7672
|
+
}
|
|
7439
7673
|
const MutationsOverTimeGridTooltip = ({
|
|
7440
7674
|
mutation,
|
|
7441
7675
|
date,
|
|
@@ -7610,6 +7844,12 @@ const getTextColorForScale = (value, colorScale) => {
|
|
|
7610
7844
|
const alpha = (value - colorScale.min) / colorRange;
|
|
7611
7845
|
return alpha <= 0.5 ? "black" : "white";
|
|
7612
7846
|
};
|
|
7847
|
+
const ColorScaleSelectorDropdown = ({
|
|
7848
|
+
colorScale,
|
|
7849
|
+
setColorScale
|
|
7850
|
+
}) => {
|
|
7851
|
+
return /* @__PURE__ */ u$1("div", { className: "w-20 inline-flex", children: /* @__PURE__ */ u$1(Dropdown, { buttonTitle: `Color scale`, placement: "bottom-start", children: /* @__PURE__ */ u$1(ColorScaleSelector, { colorScale, setColorScale }) }) });
|
|
7852
|
+
};
|
|
7613
7853
|
const PortalTooltip = ({
|
|
7614
7854
|
children,
|
|
7615
7855
|
content,
|
|
@@ -7866,32 +8106,30 @@ const customColumnSchema = z$2.object({
|
|
|
7866
8106
|
values: z$2.record(z$2.string(), z$2.union([z$2.string(), z$2.number()]))
|
|
7867
8107
|
});
|
|
7868
8108
|
const EMPTY_COLUMNS = [];
|
|
7869
|
-
|
|
8109
|
+
function FeaturesOverTimeGrid({
|
|
8110
|
+
rowLabelHeader,
|
|
7870
8111
|
data,
|
|
7871
8112
|
colorScale,
|
|
7872
|
-
sequenceType,
|
|
7873
8113
|
pageSizes,
|
|
7874
8114
|
customColumns = EMPTY_COLUMNS,
|
|
8115
|
+
featureRenderer,
|
|
7875
8116
|
tooltipPortalTarget
|
|
7876
|
-
})
|
|
8117
|
+
}) {
|
|
7877
8118
|
const tableData = T$1(() => {
|
|
7878
|
-
const
|
|
8119
|
+
const firstAxisKeys = data.getFirstAxisKeys();
|
|
7879
8120
|
return data.getAsArray().map((row, index) => {
|
|
7880
|
-
const
|
|
7881
|
-
const customValues = customColumns.map((col) => col.values[
|
|
7882
|
-
return {
|
|
8121
|
+
const firstAxisKey = firstAxisKeys[index];
|
|
8122
|
+
const customValues = customColumns.map((col) => col.values[featureRenderer.asString(firstAxisKey)]);
|
|
8123
|
+
return { feature: firstAxisKey, values: [...row], customValues };
|
|
7883
8124
|
});
|
|
7884
|
-
}, [data, customColumns]);
|
|
8125
|
+
}, [data, customColumns, featureRenderer]);
|
|
7885
8126
|
const columns = T$1(() => {
|
|
7886
8127
|
const columnHelper = createColumnHelper();
|
|
7887
8128
|
const dates = data.getSecondAxisKeys();
|
|
7888
|
-
const
|
|
7889
|
-
id: "
|
|
7890
|
-
header: () => /* @__PURE__ */ u$1("span", { children:
|
|
7891
|
-
cell: ({ getValue }) =>
|
|
7892
|
-
const value = getValue();
|
|
7893
|
-
return /* @__PURE__ */ u$1("div", { className: "text-center", children: /* @__PURE__ */ u$1(AnnotatedMutation, { mutation: value, sequenceType }) });
|
|
7894
|
-
}
|
|
8129
|
+
const featureHeader = columnHelper.accessor((row) => row.feature, {
|
|
8130
|
+
id: "feature",
|
|
8131
|
+
header: () => /* @__PURE__ */ u$1("span", { children: rowLabelHeader }),
|
|
8132
|
+
cell: ({ getValue }) => featureRenderer.renderRowLabel(getValue())
|
|
7895
8133
|
});
|
|
7896
8134
|
const customColumnHeaders = customColumns.map((customCol, index) => {
|
|
7897
8135
|
return columnHelper.accessor((row) => row.customValues[index], {
|
|
@@ -7913,12 +8151,12 @@ const MutationsOverTimeGrid = ({
|
|
|
7913
8151
|
const columnIndex = column.getIndex();
|
|
7914
8152
|
const numberOfRows = table2.getRowModel().rows.length;
|
|
7915
8153
|
const numberOfColumns = table2.getAllColumns().length;
|
|
8154
|
+
const tooltip2 = featureRenderer.renderTooltip(row.original.feature, date, value);
|
|
7916
8155
|
return /* @__PURE__ */ u$1("div", { className: "text-center", children: /* @__PURE__ */ u$1(
|
|
7917
8156
|
ProportionCell,
|
|
7918
8157
|
{
|
|
7919
8158
|
value: value ?? null,
|
|
7920
|
-
|
|
7921
|
-
mutation: row.original.mutation,
|
|
8159
|
+
tooltip: tooltip2,
|
|
7922
8160
|
tooltipPosition: getTooltipPosition(
|
|
7923
8161
|
rowIndex - table2.getState().pagination.pageIndex * table2.getState().pagination.pageSize,
|
|
7924
8162
|
numberOfRows,
|
|
@@ -7932,8 +8170,8 @@ const MutationsOverTimeGrid = ({
|
|
|
7932
8170
|
}
|
|
7933
8171
|
});
|
|
7934
8172
|
});
|
|
7935
|
-
return [
|
|
7936
|
-
}, [colorScale, data,
|
|
8173
|
+
return [featureHeader, ...customColumnHeaders, ...dateHeaders];
|
|
8174
|
+
}, [colorScale, data, customColumns, tooltipPortalTarget, featureRenderer, rowLabelHeader]);
|
|
7937
8175
|
const { pageSize } = usePageSizeContext();
|
|
7938
8176
|
const table = usePreactTable({
|
|
7939
8177
|
data: tableData,
|
|
@@ -7957,7 +8195,7 @@ const MutationsOverTimeGrid = ({
|
|
|
7957
8195
|
] }),
|
|
7958
8196
|
/* @__PURE__ */ u$1("div", { className: "mt-2", children: /* @__PURE__ */ u$1(Pagination, { table, pageSizes }) })
|
|
7959
8197
|
] });
|
|
7960
|
-
}
|
|
8198
|
+
}
|
|
7961
8199
|
function styleGridHeader(columnIndex, numDateColumns) {
|
|
7962
8200
|
if (columnIndex === 0) {
|
|
7963
8201
|
return { className: "overflow-visible text-nowrap" };
|
|
@@ -7972,33 +8210,19 @@ function getTooltipPosition(rowIndex, rows, columnIndex, columns) {
|
|
|
7972
8210
|
const tooltipY = columnIndex < columns / 2 ? "start" : "end";
|
|
7973
8211
|
return `${tooltipX}-${tooltipY}`;
|
|
7974
8212
|
}
|
|
7975
|
-
const ProportionCell = ({ value,
|
|
8213
|
+
const ProportionCell = ({ value, tooltip: tooltip2, tooltipPosition, colorScale, tooltipPortalTarget }) => {
|
|
7976
8214
|
const proportion = getProportion(value);
|
|
7977
|
-
return /* @__PURE__ */ u$1("div", { className: "py-1 w-full h-full", children: /* @__PURE__ */ u$1(
|
|
7978
|
-
|
|
8215
|
+
return /* @__PURE__ */ u$1("div", { className: "py-1 w-full h-full", children: /* @__PURE__ */ u$1(PortalTooltip, { content: tooltip2, position: tooltipPosition, portalTarget: tooltipPortalTarget, children: /* @__PURE__ */ u$1(
|
|
8216
|
+
"div",
|
|
7979
8217
|
{
|
|
7980
|
-
|
|
7981
|
-
|
|
7982
|
-
|
|
7983
|
-
|
|
7984
|
-
|
|
7985
|
-
|
|
7986
|
-
style: {
|
|
7987
|
-
backgroundColor: getColorWithinScale(proportion, colorScale),
|
|
7988
|
-
color: getTextColorForScale(proportion, colorScale)
|
|
7989
|
-
},
|
|
7990
|
-
className: `w-full h-full hover:font-bold text-xs group @container text-nowrap`,
|
|
7991
|
-
children: value === null ? /* @__PURE__ */ u$1("span", { className: "invisible", children: "No data" }) : /* @__PURE__ */ u$1("span", { className: "invisible @[2rem]:visible", children: proportion !== void 0 ? formatProportion(proportion, 0) : NON_BREAKING_SPACE })
|
|
7992
|
-
}
|
|
7993
|
-
)
|
|
8218
|
+
style: {
|
|
8219
|
+
backgroundColor: getColorWithinScale(proportion, colorScale),
|
|
8220
|
+
color: getTextColorForScale(proportion, colorScale)
|
|
8221
|
+
},
|
|
8222
|
+
className: `w-full h-full hover:font-bold text-xs group @container text-nowrap`,
|
|
8223
|
+
children: value === null ? /* @__PURE__ */ u$1("span", { className: "invisible", children: "No data" }) : /* @__PURE__ */ u$1("span", { className: "invisible @[2rem]:visible", children: proportion !== void 0 ? formatProportion(proportion, 0) : NON_BREAKING_SPACE })
|
|
7994
8224
|
}
|
|
7995
|
-
) });
|
|
7996
|
-
};
|
|
7997
|
-
const ColorScaleSelectorDropdown = ({
|
|
7998
|
-
colorScale,
|
|
7999
|
-
setColorScale
|
|
8000
|
-
}) => {
|
|
8001
|
-
return /* @__PURE__ */ u$1("div", { className: "w-20 inline-flex", children: /* @__PURE__ */ u$1(Dropdown, { buttonTitle: `Color scale`, placement: "bottom-start", children: /* @__PURE__ */ u$1(ColorScaleSelector, { colorScale, setColorScale }) }) });
|
|
8225
|
+
) }) });
|
|
8002
8226
|
};
|
|
8003
8227
|
function DeleteIcon() {
|
|
8004
8228
|
return /* @__PURE__ */ u$1(Fragment, { children: "×" });
|
|
@@ -8097,45 +8321,6 @@ const AnnotationCheckboxes = ({ value, setFilterValue }) => {
|
|
|
8097
8321
|
] })
|
|
8098
8322
|
] });
|
|
8099
8323
|
};
|
|
8100
|
-
function useWebWorker(messageToWorker, WorkerConstructor) {
|
|
8101
|
-
const [data, setData] = d(void 0);
|
|
8102
|
-
const [error, setError] = d(void 0);
|
|
8103
|
-
const [isLoading, setIsLoading] = d(true);
|
|
8104
|
-
const worker = T$1(() => {
|
|
8105
|
-
const worker2 = new WorkerConstructor();
|
|
8106
|
-
worker2.onmessage = (event) => {
|
|
8107
|
-
const eventData = event.data;
|
|
8108
|
-
const status = eventData.status;
|
|
8109
|
-
switch (status) {
|
|
8110
|
-
case "loading":
|
|
8111
|
-
setIsLoading(true);
|
|
8112
|
-
break;
|
|
8113
|
-
case "success":
|
|
8114
|
-
setData(eventData.data);
|
|
8115
|
-
setError(void 0);
|
|
8116
|
-
setIsLoading(false);
|
|
8117
|
-
break;
|
|
8118
|
-
case "error":
|
|
8119
|
-
setError(
|
|
8120
|
-
eventData.userFacing ? new UserFacingError(eventData.headline, eventData.error.message) : eventData.error
|
|
8121
|
-
);
|
|
8122
|
-
setIsLoading(false);
|
|
8123
|
-
break;
|
|
8124
|
-
default:
|
|
8125
|
-
throw new Error(`Unknown status: ${status}`);
|
|
8126
|
-
}
|
|
8127
|
-
};
|
|
8128
|
-
worker2.onmessageerror = (event) => {
|
|
8129
|
-
setError(new Error(`Worker received a message that it cannot deserialize: ${event.data}`));
|
|
8130
|
-
setIsLoading(false);
|
|
8131
|
-
};
|
|
8132
|
-
return worker2;
|
|
8133
|
-
}, [WorkerConstructor]);
|
|
8134
|
-
y2(() => {
|
|
8135
|
-
worker.postMessage(messageToWorker);
|
|
8136
|
-
}, [messageToWorker, worker]);
|
|
8137
|
-
return { data, error, isLoading };
|
|
8138
|
-
}
|
|
8139
8324
|
const mutationsOverTimeViewSchema = z$2.literal(views.grid);
|
|
8140
8325
|
const meanProportionIntervalSchema = z$2.object({
|
|
8141
8326
|
min: z$2.number().min(0).max(1),
|
|
@@ -8147,7 +8332,6 @@ const mutationOverTimeSchema = z$2.object({
|
|
|
8147
8332
|
views: z$2.array(mutationsOverTimeViewSchema),
|
|
8148
8333
|
granularity: temporalGranularitySchema,
|
|
8149
8334
|
lapisDateField: z$2.string().min(1),
|
|
8150
|
-
useNewEndpoint: z$2.boolean().optional(),
|
|
8151
8335
|
displayMutations: displayMutationsSchema.optional(),
|
|
8152
8336
|
initialMeanProportionInterval: meanProportionIntervalSchema,
|
|
8153
8337
|
hideGaps: z$2.boolean().optional(),
|
|
@@ -8161,39 +8345,23 @@ const MutationsOverTime = (componentProps) => {
|
|
|
8161
8345
|
const size = { height, width };
|
|
8162
8346
|
return /* @__PURE__ */ u$1(ErrorBoundary, { size, schema: mutationOverTimeSchema, componentProps, children: /* @__PURE__ */ u$1(ResizeContainer, { size, children: /* @__PURE__ */ u$1(MutationsOverTimeInner, { ...componentProps }) }) });
|
|
8163
8347
|
};
|
|
8164
|
-
const MutationsOverTimeInner = ({
|
|
8165
|
-
useNewEndpoint = false,
|
|
8166
|
-
...componentProps
|
|
8167
|
-
}) => {
|
|
8348
|
+
const MutationsOverTimeInner = ({ ...componentProps }) => {
|
|
8168
8349
|
const lapis = useLapisUrl();
|
|
8169
8350
|
const { lapisFilter, sequenceType, granularity, lapisDateField, displayMutations } = componentProps;
|
|
8170
|
-
const
|
|
8171
|
-
|
|
8172
|
-
|
|
8173
|
-
sequenceType,
|
|
8174
|
-
granularity,
|
|
8175
|
-
lapisDateField,
|
|
8176
|
-
lapis,
|
|
8177
|
-
displayMutations,
|
|
8178
|
-
useNewEndpoint
|
|
8179
|
-
};
|
|
8180
|
-
}, [granularity, lapis, lapisDateField, lapisFilter, sequenceType, displayMutations, useNewEndpoint]);
|
|
8181
|
-
const { data, error, isLoading } = useWebWorker(
|
|
8182
|
-
messageToWorker,
|
|
8183
|
-
// eslint-disable-next-line @typescript-eslint/no-unsafe-argument
|
|
8184
|
-
WorkerWrapper
|
|
8351
|
+
const { data, error, isLoading } = useQuery(
|
|
8352
|
+
() => queryMutationsOverTimeData(lapisFilter, sequenceType, lapis, lapisDateField, granularity, displayMutations),
|
|
8353
|
+
[granularity, lapis, lapisDateField, lapisFilter, sequenceType, displayMutations]
|
|
8185
8354
|
);
|
|
8186
8355
|
if (isLoading) {
|
|
8187
8356
|
return /* @__PURE__ */ u$1(LoadingDisplay, {});
|
|
8188
8357
|
}
|
|
8189
|
-
if (error !==
|
|
8358
|
+
if (error !== null) {
|
|
8190
8359
|
throw error;
|
|
8191
8360
|
}
|
|
8192
|
-
if (data
|
|
8361
|
+
if (data.overallMutationData.length === 0) {
|
|
8193
8362
|
return /* @__PURE__ */ u$1(NoDataDisplay, {});
|
|
8194
8363
|
}
|
|
8195
|
-
const { overallMutationData,
|
|
8196
|
-
const mutationOverTimeData = new BaseMutationOverTimeDataMap(mutationOverTimeSerialized);
|
|
8364
|
+
const { overallMutationData, mutationOverTimeData } = data;
|
|
8197
8365
|
return /* @__PURE__ */ u$1(
|
|
8198
8366
|
MutationsOverTimeTabs$1,
|
|
8199
8367
|
{
|
|
@@ -8251,6 +8419,11 @@ const MutationsOverTimeTabs$1 = ({
|
|
|
8251
8419
|
mutationFilterValue,
|
|
8252
8420
|
annotationProvider
|
|
8253
8421
|
]);
|
|
8422
|
+
const mutationRenderer = {
|
|
8423
|
+
asString: (value) => value.code,
|
|
8424
|
+
renderRowLabel: (value) => /* @__PURE__ */ u$1("div", { className: "text-center", children: /* @__PURE__ */ u$1(AnnotatedMutation, { mutation: value, sequenceType: originalComponentProps.sequenceType }) }),
|
|
8425
|
+
renderTooltip: (value, temporal, proportionValue) => /* @__PURE__ */ u$1(MutationsOverTimeGridTooltip, { mutation: value, date: temporal, value: proportionValue })
|
|
8426
|
+
};
|
|
8254
8427
|
const getTab = (view) => {
|
|
8255
8428
|
switch (view) {
|
|
8256
8429
|
// eslint-disable-next-line @typescript-eslint/no-unnecessary-condition -- for extensibility
|
|
@@ -8258,13 +8431,14 @@ const MutationsOverTimeTabs$1 = ({
|
|
|
8258
8431
|
return {
|
|
8259
8432
|
title: "Grid",
|
|
8260
8433
|
content: /* @__PURE__ */ u$1(
|
|
8261
|
-
|
|
8434
|
+
FeaturesOverTimeGrid,
|
|
8262
8435
|
{
|
|
8436
|
+
rowLabelHeader: "Mutation",
|
|
8263
8437
|
data: filteredData,
|
|
8264
8438
|
colorScale,
|
|
8265
|
-
sequenceType: originalComponentProps.sequenceType,
|
|
8266
8439
|
pageSizes: originalComponentProps.pageSizes,
|
|
8267
8440
|
customColumns: originalComponentProps.customColumns,
|
|
8441
|
+
featureRenderer: mutationRenderer,
|
|
8268
8442
|
tooltipPortalTarget
|
|
8269
8443
|
}
|
|
8270
8444
|
)
|
|
@@ -8414,7 +8588,6 @@ let MutationsOverTimeComponent = class extends PreactLitAdapterWithGridJsStyles
|
|
|
8414
8588
|
this.displayMutations = void 0;
|
|
8415
8589
|
this.initialMeanProportionInterval = { min: 0.05, max: 0.9 };
|
|
8416
8590
|
this.hideGaps = false;
|
|
8417
|
-
this.useNewEndpoint = false;
|
|
8418
8591
|
this.pageSizes = [10, 20, 30, 40, 50];
|
|
8419
8592
|
this.customColumns = void 0;
|
|
8420
8593
|
this.mutationAnnotations = [];
|
|
@@ -8434,7 +8607,6 @@ let MutationsOverTimeComponent = class extends PreactLitAdapterWithGridJsStyles
|
|
|
8434
8607
|
displayMutations: this.displayMutations,
|
|
8435
8608
|
initialMeanProportionInterval: this.initialMeanProportionInterval,
|
|
8436
8609
|
hideGaps: this.hideGaps,
|
|
8437
|
-
useNewEndpoint: this.useNewEndpoint,
|
|
8438
8610
|
pageSizes: this.pageSizes,
|
|
8439
8611
|
customColumns: this.customColumns
|
|
8440
8612
|
}
|
|
@@ -8471,9 +8643,6 @@ __decorateClass$9([
|
|
|
8471
8643
|
__decorateClass$9([
|
|
8472
8644
|
n$1({ type: Boolean })
|
|
8473
8645
|
], MutationsOverTimeComponent.prototype, "hideGaps", 2);
|
|
8474
|
-
__decorateClass$9([
|
|
8475
|
-
n$1({ type: Boolean })
|
|
8476
|
-
], MutationsOverTimeComponent.prototype, "useNewEndpoint", 2);
|
|
8477
8646
|
__decorateClass$9([
|
|
8478
8647
|
n$1({ type: Array })
|
|
8479
8648
|
], MutationsOverTimeComponent.prototype, "pageSizes", 2);
|
|
@@ -9898,8 +10067,9 @@ const MutationsOverTimeTabs = ({
|
|
|
9898
10067
|
() => mutationOverTimeDataPerLocation.map(({ location, data }) => ({
|
|
9899
10068
|
title: location,
|
|
9900
10069
|
content: /* @__PURE__ */ u$1(
|
|
9901
|
-
|
|
10070
|
+
FeaturesOverTimeGrid,
|
|
9902
10071
|
{
|
|
10072
|
+
rowLabelHeader: "Mutation",
|
|
9903
10073
|
data: getFilteredMutationOverTimeData({
|
|
9904
10074
|
data,
|
|
9905
10075
|
displayedSegments,
|
|
@@ -9909,7 +10079,24 @@ const MutationsOverTimeTabs = ({
|
|
|
9909
10079
|
}),
|
|
9910
10080
|
colorScale,
|
|
9911
10081
|
pageSizes: originalComponentProps.pageSizes,
|
|
9912
|
-
|
|
10082
|
+
featureRenderer: {
|
|
10083
|
+
asString: (value) => value.code,
|
|
10084
|
+
renderRowLabel: (value) => /* @__PURE__ */ u$1("div", { className: "text-center", children: /* @__PURE__ */ u$1(
|
|
10085
|
+
AnnotatedMutation,
|
|
10086
|
+
{
|
|
10087
|
+
mutation: value,
|
|
10088
|
+
sequenceType: originalComponentProps.sequenceType
|
|
10089
|
+
}
|
|
10090
|
+
) }),
|
|
10091
|
+
renderTooltip: (value, temporal, proportionValue) => /* @__PURE__ */ u$1(
|
|
10092
|
+
MutationsOverTimeGridTooltip,
|
|
10093
|
+
{
|
|
10094
|
+
mutation: value,
|
|
10095
|
+
date: temporal,
|
|
10096
|
+
value: proportionValue
|
|
10097
|
+
}
|
|
10098
|
+
)
|
|
10099
|
+
},
|
|
9913
10100
|
tooltipPortalTarget: tooltipPortalTargetRef.current
|
|
9914
10101
|
}
|
|
9915
10102
|
)
|