@fideus-labs/ngff-zarr 0.2.8 → 0.3.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (65) hide show
  1. package/esm/browser-mod.d.ts +3 -3
  2. package/esm/browser-mod.d.ts.map +1 -1
  3. package/esm/browser-mod.js +3 -4
  4. package/esm/browser-mod.js.map +1 -1
  5. package/esm/io/from_ngff_zarr.d.ts.map +1 -1
  6. package/esm/io/from_ngff_zarr.js +34 -116
  7. package/esm/io/from_ngff_zarr.js.map +1 -1
  8. package/esm/io/rfc9_zip.d.ts +80 -0
  9. package/esm/io/rfc9_zip.d.ts.map +1 -0
  10. package/esm/io/rfc9_zip.js +337 -0
  11. package/esm/io/rfc9_zip.js.map +1 -0
  12. package/esm/io/to_ngff_zarr-browser.d.ts +26 -0
  13. package/esm/io/to_ngff_zarr-browser.d.ts.map +1 -1
  14. package/esm/io/to_ngff_zarr-browser.js +37 -6
  15. package/esm/io/to_ngff_zarr-browser.js.map +1 -1
  16. package/esm/io/to_ngff_zarr.d.ts +76 -0
  17. package/esm/io/to_ngff_zarr.d.ts.map +1 -1
  18. package/esm/io/to_ngff_zarr.js +129 -7
  19. package/esm/io/to_ngff_zarr.js.map +1 -1
  20. package/esm/io/to_ngff_zarr_ozx_common.d.ts +51 -0
  21. package/esm/io/to_ngff_zarr_ozx_common.d.ts.map +1 -0
  22. package/esm/io/to_ngff_zarr_ozx_common.js +126 -0
  23. package/esm/io/to_ngff_zarr_ozx_common.js.map +1 -0
  24. package/esm/methods/itkwasm-browser.d.ts.map +1 -1
  25. package/esm/methods/itkwasm-browser.js +262 -4
  26. package/esm/methods/itkwasm-browser.js.map +1 -1
  27. package/esm/methods/itkwasm-node.d.ts.map +1 -1
  28. package/esm/methods/itkwasm-node.js +262 -4
  29. package/esm/methods/itkwasm-node.js.map +1 -1
  30. package/esm/methods/itkwasm-shared.d.ts +6 -0
  31. package/esm/methods/itkwasm-shared.d.ts.map +1 -1
  32. package/esm/methods/itkwasm-shared.js +6 -0
  33. package/esm/methods/itkwasm-shared.js.map +1 -1
  34. package/esm/mod.d.ts +5 -0
  35. package/esm/mod.d.ts.map +1 -1
  36. package/esm/mod.js +5 -0
  37. package/esm/mod.js.map +1 -1
  38. package/esm/process/to_multiscales-shared.d.ts.map +1 -1
  39. package/esm/process/to_multiscales-shared.js +3 -2
  40. package/esm/process/to_multiscales-shared.js.map +1 -1
  41. package/esm/types/supported_versions.d.ts +20 -0
  42. package/esm/types/supported_versions.d.ts.map +1 -0
  43. package/esm/types/supported_versions.js +31 -0
  44. package/esm/types/supported_versions.js.map +1 -0
  45. package/esm/types/zarr_metadata.d.ts +43 -1
  46. package/esm/types/zarr_metadata.d.ts.map +1 -1
  47. package/esm/types/zarr_metadata.js +40 -0
  48. package/esm/types/zarr_metadata.js.map +1 -1
  49. package/esm/utils/factory.d.ts +3 -2
  50. package/esm/utils/factory.d.ts.map +1 -1
  51. package/esm/utils/factory.js +6 -2
  52. package/esm/utils/factory.js.map +1 -1
  53. package/esm/utils/from_zarr_attrs.d.ts +21 -0
  54. package/esm/utils/from_zarr_attrs.d.ts.map +1 -0
  55. package/esm/utils/from_zarr_attrs.js +326 -0
  56. package/esm/utils/from_zarr_attrs.js.map +1 -0
  57. package/esm/utils/parse_metadata.d.ts +27 -0
  58. package/esm/utils/parse_metadata.d.ts.map +1 -0
  59. package/esm/utils/parse_metadata.js +138 -0
  60. package/esm/utils/parse_metadata.js.map +1 -0
  61. package/esm/utils/rfc4_validation.d.ts +20 -0
  62. package/esm/utils/rfc4_validation.d.ts.map +1 -0
  63. package/esm/utils/rfc4_validation.js +98 -0
  64. package/esm/utils/rfc4_validation.js.map +1 -0
  65. package/package.json +2 -2
@@ -0,0 +1,27 @@
1
+ /**
2
+ * Utilities for parsing OME-Zarr metadata from zarr attributes.
3
+ */
4
+ import { NgffVersion } from "../types/supported_versions.js";
5
+ import type { Methods } from "../types/methods.js";
6
+ import type { MethodMetadata, Omero } from "../types/zarr_metadata.js";
7
+ /**
8
+ * Result from extracting method metadata
9
+ */
10
+ export interface MethodMetadataResult {
11
+ method: Methods | undefined;
12
+ methodType: string | undefined;
13
+ methodMetadata: MethodMetadata | undefined;
14
+ }
15
+ /**
16
+ * Extract method type and convert to Methods enum.
17
+ */
18
+ export declare function extractMethodMetadata(metadataDict: Record<string, unknown>): MethodMetadataResult;
19
+ /**
20
+ * Parse OMERO metadata dictionary into Omero interface.
21
+ */
22
+ export declare function parseOmero(omeroData: Record<string, unknown> | undefined | null): Omero | undefined;
23
+ /**
24
+ * Detect NGFF version from root attributes.
25
+ */
26
+ export declare function detectVersion(rootAttrs: Record<string, unknown>): NgffVersion;
27
+ //# sourceMappingURL=parse_metadata.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse_metadata.d.ts","sourceRoot":"","sources":["../../src/utils/parse_metadata.ts"],"names":[],"mappings":"AAGA;;GAEG;AAEH,OAAO,EAEL,WAAW,EACZ,MAAM,gCAAgC,CAAC;AACxC,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,qBAAqB,CAAC;AAEnD,OAAO,KAAK,EACV,cAAc,EACd,KAAK,EAGN,MAAM,2BAA2B,CAAC;AAEnC;;GAEG;AACH,MAAM,WAAW,oBAAoB;IACnC,MAAM,EAAE,OAAO,GAAG,SAAS,CAAC;IAC5B,UAAU,EAAE,MAAM,GAAG,SAAS,CAAC;IAC/B,cAAc,EAAE,cAAc,GAAG,SAAS,CAAC;CAC5C;AAED;;GAEG;AACH,wBAAgB,qBAAqB,CACnC,YAAY,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACpC,oBAAoB,CA4BtB;AAED;;GAEG;AACH,wBAAgB,UAAU,CACxB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,GAAG,IAAI,GACpD,KAAK,GAAG,SAAS,CAmFnB;AAED;;GAEG;AACH,wBAAgB,aAAa,CAC3B,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GACjC,WAAW,CA0Bb"}
@@ -0,0 +1,138 @@
1
+ // SPDX-FileCopyrightText: Copyright (c) Fideus Labs LLC
2
+ // SPDX-License-Identifier: MIT
3
+ /**
4
+ * Utilities for parsing OME-Zarr metadata from zarr attributes.
5
+ */
6
+ import { isSupportedVersion, } from "../types/supported_versions.js";
7
+ import { methodsValues } from "../types/methods.js";
8
+ /**
9
+ * Extract method type and convert to Methods enum.
10
+ */
11
+ export function extractMethodMetadata(metadataDict) {
12
+ let method = undefined;
13
+ let methodType = undefined;
14
+ let methodMetadata = undefined;
15
+ if (metadataDict && typeof metadataDict === "object") {
16
+ if ("type" in metadataDict && metadataDict.type !== null) {
17
+ methodType = metadataDict.type;
18
+ // Find the corresponding Methods enum
19
+ if (methodsValues.includes(methodType)) {
20
+ method = methodType;
21
+ }
22
+ }
23
+ // Extract method metadata if present
24
+ if ("metadata" in metadataDict && metadataDict.metadata !== null) {
25
+ const metadata = metadataDict.metadata;
26
+ if (metadata && typeof metadata === "object") {
27
+ methodMetadata = {
28
+ description: String(metadata.description ?? ""),
29
+ method: String(metadata.method ?? ""),
30
+ version: String(metadata.version ?? ""),
31
+ };
32
+ }
33
+ }
34
+ }
35
+ return { method, methodType, methodMetadata };
36
+ }
37
+ /**
38
+ * Parse OMERO metadata dictionary into Omero interface.
39
+ */
40
+ export function parseOmero(omeroData) {
41
+ if (!omeroData || typeof omeroData !== "object") {
42
+ return undefined;
43
+ }
44
+ if (!("channels" in omeroData) || !Array.isArray(omeroData.channels)) {
45
+ return undefined;
46
+ }
47
+ const channels = [];
48
+ for (const channel of omeroData.channels) {
49
+ if (!channel ||
50
+ typeof channel !== "object" ||
51
+ !("window" in channel) ||
52
+ !channel.window) {
53
+ continue;
54
+ }
55
+ const windowData = channel.window;
56
+ if (typeof windowData !== "object") {
57
+ continue;
58
+ }
59
+ // Handle backward compatibility for OMERO window metadata
60
+ // Prefer start/end format, fall back to min/max, use one as the other if needed
61
+ let start;
62
+ let end;
63
+ let minVal;
64
+ let maxVal;
65
+ if ("start" in windowData && "end" in windowData) {
66
+ // New format with start/end
67
+ start = Number(windowData.start);
68
+ end = Number(windowData.end);
69
+ // Use start/end as min/max if not present
70
+ minVal = ("min" in windowData) ? Number(windowData.min) : start;
71
+ maxVal = ("max" in windowData) ? Number(windowData.max) : end;
72
+ }
73
+ else if ("min" in windowData && "max" in windowData) {
74
+ // Old format with min/max only
75
+ minVal = Number(windowData.min);
76
+ maxVal = Number(windowData.max);
77
+ // Use min/max as start/end for backward compatibility
78
+ start = minVal;
79
+ end = maxVal;
80
+ }
81
+ else {
82
+ // Invalid window data, skip this channel
83
+ continue;
84
+ }
85
+ const window = {
86
+ min: minVal,
87
+ max: maxVal,
88
+ start: start,
89
+ end: end,
90
+ };
91
+ const omeroChannel = {
92
+ color: String(channel.color),
93
+ window,
94
+ ...(channel.label !== undefined && channel.label !== null
95
+ ? { label: String(channel.label) }
96
+ : {}),
97
+ ...(typeof channel.active === "boolean"
98
+ ? { active: channel.active }
99
+ : {}),
100
+ };
101
+ channels.push(omeroChannel);
102
+ }
103
+ if (channels.length === 0) {
104
+ return undefined;
105
+ }
106
+ return {
107
+ channels,
108
+ ...(typeof omeroData.version === "string"
109
+ ? { version: omeroData.version }
110
+ : {}),
111
+ };
112
+ }
113
+ /**
114
+ * Detect NGFF version from root attributes.
115
+ */
116
+ export function detectVersion(rootAttrs) {
117
+ let versionStr = undefined;
118
+ if ("ome" in rootAttrs && rootAttrs.ome) {
119
+ const ome = rootAttrs.ome;
120
+ versionStr = ome.version;
121
+ }
122
+ // Fall back to multiscales if version not found in ome
123
+ if (versionStr === undefined) {
124
+ const multiscales = rootAttrs.multiscales;
125
+ if (multiscales && Array.isArray(multiscales) && multiscales.length > 0) {
126
+ const firstMultiscale = multiscales[0];
127
+ versionStr = firstMultiscale.version ?? "0.4";
128
+ }
129
+ }
130
+ if (versionStr === undefined) {
131
+ throw new Error("Could not detect NGFF version from root attributes.");
132
+ }
133
+ if (!isSupportedVersion(versionStr)) {
134
+ throw new Error(`Unsupported NGFF version: ${versionStr}`);
135
+ }
136
+ return versionStr;
137
+ }
138
+ //# sourceMappingURL=parse_metadata.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"parse_metadata.js","sourceRoot":"","sources":["../../src/utils/parse_metadata.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,20 @@
1
+ /**
2
+ * RFC 4 validation for anatomical orientation in OME-NGFF.
3
+ *
4
+ * This module provides validation for RFC 4 anatomical orientation metadata.
5
+ */
6
+ /**
7
+ * Check if the axes contain RFC 4 anatomical orientation metadata.
8
+ *
9
+ * @param axes - List of axis metadata objects
10
+ * @returns True if any spatial axis has orientation metadata
11
+ */
12
+ export declare function hasRfc4OrientationMetadata(axes: Array<Record<string, unknown>>): boolean;
13
+ /**
14
+ * Validate RFC 4 anatomical orientation metadata.
15
+ *
16
+ * @param axes - List of axis metadata dictionaries to validate
17
+ * @throws Error if the orientation metadata is invalid or inconsistent
18
+ */
19
+ export declare function validateRfc4Orientation(axes: Array<Record<string, unknown>>): void;
20
+ //# sourceMappingURL=rfc4_validation.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rfc4_validation.d.ts","sourceRoot":"","sources":["../../src/utils/rfc4_validation.ts"],"names":[],"mappings":"AAEA;;;;GAIG;AA0BH;;;;;GAKG;AACH,wBAAgB,0BAA0B,CACxC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACnC,OAAO,CAYT;AAED;;;;;GAKG;AACH,wBAAgB,uBAAuB,CACrC,IAAI,EAAE,KAAK,CAAC,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC,GACnC,IAAI,CA0DN"}
@@ -0,0 +1,98 @@
1
+ // SPDX-FileCopyrightText: Copyright (c) Fideus Labs LLC
2
+ // SPDX-License-Identifier: MIT
3
+ /**
4
+ * RFC 4 validation for anatomical orientation in OME-NGFF.
5
+ *
6
+ * This module provides validation for RFC 4 anatomical orientation metadata.
7
+ */
8
+ import { AnatomicalOrientationValuesSchema } from "../schemas/rfc4.js";
9
+ /** Valid anatomical orientation values */
10
+ const VALID_ORIENTATION_VALUES = new Set([
11
+ "left-to-right",
12
+ "right-to-left",
13
+ "anterior-to-posterior",
14
+ "posterior-to-anterior",
15
+ "inferior-to-superior",
16
+ "superior-to-inferior",
17
+ "dorsal-to-ventral",
18
+ "ventral-to-dorsal",
19
+ "dorsal-to-palmar",
20
+ "palmar-to-dorsal",
21
+ "dorsal-to-plantar",
22
+ "plantar-to-dorsal",
23
+ "rostral-to-caudal",
24
+ "caudal-to-rostral",
25
+ "cranial-to-caudal",
26
+ "caudal-to-cranial",
27
+ "proximal-to-distal",
28
+ "distal-to-proximal",
29
+ ]);
30
+ /**
31
+ * Check if the axes contain RFC 4 anatomical orientation metadata.
32
+ *
33
+ * @param axes - List of axis metadata objects
34
+ * @returns True if any spatial axis has orientation metadata
35
+ */
36
+ export function hasRfc4OrientationMetadata(axes) {
37
+ for (const axis of axes) {
38
+ if (typeof axis === "object" &&
39
+ axis !== null &&
40
+ axis.type === "space" &&
41
+ "orientation" in axis) {
42
+ return true;
43
+ }
44
+ }
45
+ return false;
46
+ }
47
+ /**
48
+ * Validate RFC 4 anatomical orientation metadata.
49
+ *
50
+ * @param axes - List of axis metadata dictionaries to validate
51
+ * @throws Error if the orientation metadata is invalid or inconsistent
52
+ */
53
+ export function validateRfc4Orientation(axes) {
54
+ let hasOrientation = false;
55
+ let orientationType = null;
56
+ const spatialAxesWithOrientation = [];
57
+ const spatialAxesWithoutOrientation = [];
58
+ for (const axis of axes) {
59
+ if (typeof axis === "object" && axis !== null && axis.type === "space") {
60
+ const axisName = String(axis.name ?? "unknown");
61
+ if ("orientation" in axis && axis.orientation !== null) {
62
+ hasOrientation = true;
63
+ spatialAxesWithOrientation.push(axisName);
64
+ const orientation = axis.orientation;
65
+ // Check that all orientations have the same type
66
+ const currentType = orientation.type;
67
+ if (orientationType === null) {
68
+ orientationType = currentType ?? null;
69
+ }
70
+ else if (currentType !== orientationType) {
71
+ throw new Error(`All spatial axis orientations must have the same type. ` +
72
+ `Found types: ${orientationType} and ${currentType}`);
73
+ }
74
+ // Validate the orientation value using the schema
75
+ const orientationValue = orientation.value;
76
+ if (orientationValue !== undefined) {
77
+ const result = AnatomicalOrientationValuesSchema.safeParse(orientationValue);
78
+ if (!result.success) {
79
+ throw new Error(`Invalid orientation value '${orientationValue}' for axis '${axisName}'. ` +
80
+ `Valid values are: ${[...VALID_ORIENTATION_VALUES].sort().join(", ")}`);
81
+ }
82
+ }
83
+ }
84
+ else {
85
+ spatialAxesWithoutOrientation.push(axisName);
86
+ }
87
+ }
88
+ }
89
+ // RFC 4 requirement: if orientation is defined for one spatial axis,
90
+ // it must be defined for all spatial axes
91
+ if (hasOrientation && spatialAxesWithoutOrientation.length > 0) {
92
+ throw new Error(`RFC 4 requires that if orientation is defined for one spatial axis, ` +
93
+ `it must be defined for all spatial axes. ` +
94
+ `Axes with orientation: ${spatialAxesWithOrientation.join(", ")}, ` +
95
+ `axes without orientation: ${spatialAxesWithoutOrientation.join(", ")}`);
96
+ }
97
+ }
98
+ //# sourceMappingURL=rfc4_validation.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rfc4_validation.js","sourceRoot":"","sources":["../../src/utils/rfc4_validation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@fideus-labs/ngff-zarr",
3
- "version": "0.2.8",
3
+ "version": "0.3.0",
4
4
  "description": "TypeScript implementation of ngff-zarr for reading and writing OME-Zarr files",
5
5
  "license": "MIT",
6
6
  "type": "module",
@@ -72,7 +72,7 @@
72
72
  "@itk-wasm/downsample": "^1.8.1",
73
73
  "itk-wasm": "^1.0.0-b.196",
74
74
  "p-queue": "^8.1.0",
75
- "@zarrita/storage": "^0.1.1",
75
+ "@zarrita/storage": "^0.1.4",
76
76
  "zod": "^4.0.2",
77
77
  "zarrita": "^0.5.2"
78
78
  },