zarr-metadata 0.7.0 → 0.9.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 +13 -6
- package/dist/chunk-grid/index.d.ts +27 -0
- package/dist/chunk-grid/index.d.ts.map +1 -0
- package/dist/chunk-grid/index.js +21 -0
- package/dist/chunk-grid/index.js.map +1 -0
- package/dist/chunk-grid/rectilinear.d.ts +14 -0
- package/dist/chunk-grid/rectilinear.d.ts.map +1 -0
- package/dist/chunk-grid/rectilinear.js +76 -0
- package/dist/chunk-grid/rectilinear.js.map +1 -0
- package/dist/chunk-grid/regular.d.ts +7 -0
- package/dist/chunk-grid/regular.d.ts.map +1 -0
- package/dist/chunk-grid/regular.js +36 -0
- package/dist/chunk-grid/regular.js.map +1 -0
- package/dist/codec/index.d.ts +34 -0
- package/dist/codec/index.d.ts.map +1 -0
- package/dist/codec/index.js +35 -0
- package/dist/codec/index.js.map +1 -0
- package/dist/codec/sharding-indexed.d.ts +26 -0
- package/dist/codec/sharding-indexed.d.ts.map +1 -0
- package/dist/codec/sharding-indexed.js +80 -0
- package/dist/codec/sharding-indexed.js.map +1 -0
- package/dist/codec/transpose.d.ts +19 -0
- package/dist/codec/transpose.d.ts.map +1 -0
- package/dist/codec/transpose.js +66 -0
- package/dist/codec/transpose.js.map +1 -0
- package/dist/data-type/bool.d.ts +4 -0
- package/dist/data-type/bool.d.ts.map +1 -0
- package/dist/data-type/bool.js +7 -0
- package/dist/data-type/bool.js.map +1 -0
- package/dist/data-type/bytes.d.ts +11 -0
- package/dist/data-type/bytes.d.ts.map +1 -0
- package/dist/data-type/bytes.js +18 -0
- package/dist/data-type/bytes.js.map +1 -0
- package/dist/data-type/complex128.d.ts +3 -0
- package/dist/data-type/complex128.d.ts.map +1 -0
- package/dist/data-type/complex128.js +4 -0
- package/dist/data-type/complex128.js.map +1 -0
- package/dist/data-type/complex64.d.ts +3 -0
- package/dist/data-type/complex64.d.ts.map +1 -0
- package/dist/data-type/complex64.js +4 -0
- package/dist/data-type/complex64.js.map +1 -0
- package/dist/data-type/descriptor.d.ts +44 -0
- package/dist/data-type/descriptor.d.ts.map +1 -0
- package/dist/data-type/descriptor.js +57 -0
- package/dist/data-type/descriptor.js.map +1 -0
- package/dist/data-type/float16.d.ts +3 -0
- package/dist/data-type/float16.d.ts.map +1 -0
- package/dist/data-type/float16.js +4 -0
- package/dist/data-type/float16.js.map +1 -0
- package/dist/data-type/float32.d.ts +3 -0
- package/dist/data-type/float32.d.ts.map +1 -0
- package/dist/data-type/float32.js +4 -0
- package/dist/data-type/float32.js.map +1 -0
- package/dist/data-type/float64.d.ts +3 -0
- package/dist/data-type/float64.d.ts.map +1 -0
- package/dist/data-type/float64.js +4 -0
- package/dist/data-type/float64.js.map +1 -0
- package/dist/data-type/index.d.ts +23 -0
- package/dist/data-type/index.d.ts.map +1 -0
- package/dist/data-type/index.js +92 -0
- package/dist/data-type/index.js.map +1 -0
- package/dist/data-type/int16.d.ts +3 -0
- package/dist/data-type/int16.d.ts.map +1 -0
- package/dist/data-type/int16.js +4 -0
- package/dist/data-type/int16.js.map +1 -0
- package/dist/data-type/int32.d.ts +3 -0
- package/dist/data-type/int32.d.ts.map +1 -0
- package/dist/data-type/int32.js +4 -0
- package/dist/data-type/int32.js.map +1 -0
- package/dist/data-type/int64.d.ts +3 -0
- package/dist/data-type/int64.d.ts.map +1 -0
- package/dist/data-type/int64.js +4 -0
- package/dist/data-type/int64.js.map +1 -0
- package/dist/data-type/int8.d.ts +3 -0
- package/dist/data-type/int8.d.ts.map +1 -0
- package/dist/data-type/int8.js +4 -0
- package/dist/data-type/int8.js.map +1 -0
- package/dist/data-type/numpy-datetime64.d.ts +18 -0
- package/dist/data-type/numpy-datetime64.d.ts.map +1 -0
- package/dist/data-type/numpy-datetime64.js +14 -0
- package/dist/data-type/numpy-datetime64.js.map +1 -0
- package/dist/data-type/numpy-timedelta64.d.ts +4 -0
- package/dist/data-type/numpy-timedelta64.d.ts.map +1 -0
- package/dist/data-type/numpy-timedelta64.js +4 -0
- package/dist/data-type/numpy-timedelta64.js.map +1 -0
- package/dist/data-type/raw.d.ts +10 -0
- package/dist/data-type/raw.d.ts.map +1 -0
- package/dist/data-type/raw.js +26 -0
- package/dist/data-type/raw.js.map +1 -0
- package/dist/data-type/string.d.ts +6 -0
- package/dist/data-type/string.d.ts.map +1 -0
- package/dist/data-type/string.js +7 -0
- package/dist/data-type/string.js.map +1 -0
- package/dist/data-type/struct.d.ts +17 -0
- package/dist/data-type/struct.d.ts.map +1 -0
- package/dist/data-type/struct.js +44 -0
- package/dist/data-type/struct.js.map +1 -0
- package/dist/data-type/uint16.d.ts +3 -0
- package/dist/data-type/uint16.d.ts.map +1 -0
- package/dist/data-type/uint16.js +4 -0
- package/dist/data-type/uint16.js.map +1 -0
- package/dist/data-type/uint32.d.ts +3 -0
- package/dist/data-type/uint32.d.ts.map +1 -0
- package/dist/data-type/uint32.js +4 -0
- package/dist/data-type/uint32.js.map +1 -0
- package/dist/data-type/uint64.d.ts +3 -0
- package/dist/data-type/uint64.d.ts.map +1 -0
- package/dist/data-type/uint64.js +4 -0
- package/dist/data-type/uint64.js.map +1 -0
- package/dist/data-type/uint8.d.ts +3 -0
- package/dist/data-type/uint8.d.ts.map +1 -0
- package/dist/data-type/uint8.js +4 -0
- package/dist/data-type/uint8.js.map +1 -0
- package/dist/guards.d.ts +21 -0
- package/dist/guards.d.ts.map +1 -0
- package/dist/guards.js +39 -0
- package/dist/guards.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js.map +1 -1
- package/dist/semantics.d.ts +14 -42
- package/dist/semantics.d.ts.map +1 -1
- package/dist/semantics.js +22 -416
- package/dist/semantics.js.map +1 -1
- package/package.json +4 -2
- package/src/chunk-grid/index.ts +40 -0
- package/src/chunk-grid/rectilinear.ts +88 -0
- package/src/chunk-grid/regular.ts +42 -0
- package/src/codec/index.ts +76 -0
- package/src/codec/sharding-indexed.ts +113 -0
- package/src/codec/transpose.ts +80 -0
- package/src/data-type/bool.ts +8 -0
- package/src/data-type/bytes.ts +26 -0
- package/src/data-type/complex128.ts +4 -0
- package/src/data-type/complex64.ts +4 -0
- package/src/data-type/descriptor.ts +115 -0
- package/src/data-type/float16.ts +4 -0
- package/src/data-type/float32.ts +4 -0
- package/src/data-type/float64.ts +4 -0
- package/src/data-type/index.ts +129 -0
- package/src/data-type/int16.ts +4 -0
- package/src/data-type/int32.ts +4 -0
- package/src/data-type/int64.ts +4 -0
- package/src/data-type/int8.ts +4 -0
- package/src/data-type/numpy-datetime64.ts +33 -0
- package/src/data-type/numpy-timedelta64.ts +9 -0
- package/src/data-type/raw.ts +31 -0
- package/src/data-type/string.ts +11 -0
- package/src/data-type/struct.ts +55 -0
- package/src/data-type/uint16.ts +4 -0
- package/src/data-type/uint32.ts +4 -0
- package/src/data-type/uint64.ts +4 -0
- package/src/data-type/uint8.ts +4 -0
- package/src/guards.ts +48 -0
- package/src/index.ts +22 -0
- package/src/semantics.ts +24 -444
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
import { numpyTemporalDataType } from "./numpy-datetime64.js";
|
|
2
|
+
|
|
3
|
+
export type {
|
|
4
|
+
NumpyDatetime64Configuration as NumpyTimedelta64Configuration,
|
|
5
|
+
NumpyDatetime64FillValue as NumpyTimedelta64FillValue,
|
|
6
|
+
} from "./numpy-datetime64.js";
|
|
7
|
+
|
|
8
|
+
/** The zarr-extensions `numpy.timedelta64` data type. */
|
|
9
|
+
export const numpyTimedelta64 = numpyTemporalDataType("numpy.timedelta64");
|
|
@@ -0,0 +1,31 @@
|
|
|
1
|
+
import { isByteArray, simple, type DataTypeDescriptor } from "./descriptor.js";
|
|
2
|
+
|
|
3
|
+
/** Fill value of the `r<N>` raw-bits data types: one integer per byte. */
|
|
4
|
+
export type RawBytesFillValue = number[];
|
|
5
|
+
|
|
6
|
+
const RAW = /^r([1-9][0-9]*)$/;
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The core `r<N>` raw-bits data type family. The name itself carries a
|
|
10
|
+
* rule — N must be a positive multiple of 8 — and the fill value must
|
|
11
|
+
* hold exactly N/8 bytes.
|
|
12
|
+
*/
|
|
13
|
+
export const raw: DataTypeDescriptor = {
|
|
14
|
+
matches: (name) => RAW.test(name),
|
|
15
|
+
nameIssue: (name) => {
|
|
16
|
+
const bits = Number((RAW.exec(name) as RegExpExecArray)[1]);
|
|
17
|
+
return bits % 8 === 0
|
|
18
|
+
? undefined
|
|
19
|
+
: `expected "r<N>" with N a positive multiple of 8, got ${JSON.stringify(name)}`;
|
|
20
|
+
},
|
|
21
|
+
fillIssues: (fill, name) => {
|
|
22
|
+
const bits = Number((RAW.exec(name) as RegExpExecArray)[1]);
|
|
23
|
+
if (bits % 8 !== 0) return []; // the name issue already covers this document
|
|
24
|
+
const expectedBytes = bits / 8;
|
|
25
|
+
return isByteArray(fill) && fill.length === expectedBytes
|
|
26
|
+
? []
|
|
27
|
+
: simple(
|
|
28
|
+
`expected an array of ${expectedBytes} integers in [0, 255] for data type ${JSON.stringify(name)}`,
|
|
29
|
+
);
|
|
30
|
+
},
|
|
31
|
+
};
|
|
@@ -0,0 +1,11 @@
|
|
|
1
|
+
import { named, simple, type DataTypeDescriptor } from "./descriptor.js";
|
|
2
|
+
|
|
3
|
+
/** Fill value of the `string` data type: a JSON unicode string. */
|
|
4
|
+
export type StringFillValue = string;
|
|
5
|
+
|
|
6
|
+
/** The zarr-extensions `string` data type (variable-length UTF-8). */
|
|
7
|
+
export const string: DataTypeDescriptor = {
|
|
8
|
+
matches: named("string"),
|
|
9
|
+
fillIssues: (fill) =>
|
|
10
|
+
typeof fill === "string" ? [] : simple('expected a string fill value for data type "string"'),
|
|
11
|
+
};
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
import { isPlainObject } from "../guards.js";
|
|
2
|
+
import { issue, named, simple, type DataTypeDescriptor } from "./descriptor.js";
|
|
3
|
+
|
|
4
|
+
/** One field of a `struct` data type; `data_type` recurses (structs may nest). */
|
|
5
|
+
export interface StructField {
|
|
6
|
+
name: string;
|
|
7
|
+
data_type: unknown;
|
|
8
|
+
}
|
|
9
|
+
|
|
10
|
+
/** Configuration of the `struct` data type. */
|
|
11
|
+
export interface StructConfiguration {
|
|
12
|
+
fields: StructField[];
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
/**
|
|
16
|
+
* The zarr-extensions `struct` data type (heterogeneous record). Its fill
|
|
17
|
+
* value is a JSON object mapping every field name to that field's fill
|
|
18
|
+
* value, each judged recursively against the field's own data type.
|
|
19
|
+
*/
|
|
20
|
+
export const struct: DataTypeDescriptor = {
|
|
21
|
+
matches: named("struct"),
|
|
22
|
+
requiredConfigKeys: ["fields"],
|
|
23
|
+
fillIssues: (fill, _name, context) => {
|
|
24
|
+
if (!isPlainObject(fill)) {
|
|
25
|
+
return simple('expected an object mapping field names to fill values for data type "struct"');
|
|
26
|
+
}
|
|
27
|
+
const fields = context.configuration?.["fields"];
|
|
28
|
+
if (!Array.isArray(fields)) return []; // config shape is the schema layer's problem
|
|
29
|
+
const declared = new Map<string, unknown>();
|
|
30
|
+
for (const field of fields) {
|
|
31
|
+
if (isPlainObject(field) && typeof field["name"] === "string") {
|
|
32
|
+
declared.set(field["name"], field["data_type"]);
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
if (declared.size !== fields.length) return []; // malformed fields: schema layer's problem
|
|
36
|
+
const issues = [];
|
|
37
|
+
for (const [fieldName, dataType] of declared) {
|
|
38
|
+
if (!Object.hasOwn(fill, fieldName)) {
|
|
39
|
+
issues.push(issue([fieldName], "missing required key", "missing_key"));
|
|
40
|
+
continue;
|
|
41
|
+
}
|
|
42
|
+
issues.push(
|
|
43
|
+
...context
|
|
44
|
+
.fillIssuesFor(dataType, fill[fieldName], context.depth + 1)
|
|
45
|
+
.map((inner) => ({ ...inner, path: [fieldName, ...inner.path] })),
|
|
46
|
+
);
|
|
47
|
+
}
|
|
48
|
+
for (const key of Object.keys(fill)) {
|
|
49
|
+
if (!declared.has(key)) {
|
|
50
|
+
issues.push(issue([key], "unexpected member (no such struct field)"));
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
return issues;
|
|
54
|
+
},
|
|
55
|
+
};
|
package/src/guards.ts
ADDED
|
@@ -0,0 +1,48 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Shared value guards for the content modules (chunk grids, codecs, data
|
|
3
|
+
* types) and the semantics orchestrator. The structural document layer
|
|
4
|
+
* (validation.ts) keeps its own copies deliberately: it is the
|
|
5
|
+
* corpus-governed layer and stays self-contained.
|
|
6
|
+
*/
|
|
7
|
+
|
|
8
|
+
export type Path = ReadonlyArray<string | number>;
|
|
9
|
+
|
|
10
|
+
export function isPlainObject(value: unknown): value is Record<string, unknown> {
|
|
11
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) return false;
|
|
12
|
+
const proto: unknown = Object.getPrototypeOf(value);
|
|
13
|
+
return proto === null || proto === Object.prototype;
|
|
14
|
+
}
|
|
15
|
+
|
|
16
|
+
export function isIntArray(value: unknown): value is number[] {
|
|
17
|
+
return (
|
|
18
|
+
Array.isArray(value) &&
|
|
19
|
+
Object.keys(value).length === value.length &&
|
|
20
|
+
value.every((item) => Number.isInteger(item))
|
|
21
|
+
);
|
|
22
|
+
}
|
|
23
|
+
|
|
24
|
+
/** The `{name, configuration}` of a metadata field, when extractable. */
|
|
25
|
+
export function fieldParts(
|
|
26
|
+
field: unknown,
|
|
27
|
+
): { name: string; configuration: Record<string, unknown> | undefined } | undefined {
|
|
28
|
+
if (typeof field === "string") return { name: field, configuration: undefined };
|
|
29
|
+
if (isPlainObject(field) && typeof field["name"] === "string") {
|
|
30
|
+
const configuration = field["configuration"];
|
|
31
|
+
return {
|
|
32
|
+
name: field["name"],
|
|
33
|
+
configuration: isPlainObject(configuration) ? configuration : undefined,
|
|
34
|
+
};
|
|
35
|
+
}
|
|
36
|
+
return undefined;
|
|
37
|
+
}
|
|
38
|
+
|
|
39
|
+
/**
|
|
40
|
+
* Whether a metadata field genuinely lacks a `configuration` member (a
|
|
41
|
+
* malformed one — `configuration: 5` — is the structural layer's
|
|
42
|
+
* complaint, not the semantic layer's).
|
|
43
|
+
*/
|
|
44
|
+
export function configurationMissing(field: unknown): boolean {
|
|
45
|
+
return (
|
|
46
|
+
typeof field === "string" || (isPlainObject(field) && !Object.hasOwn(field, "configuration"))
|
|
47
|
+
);
|
|
48
|
+
}
|
package/src/index.ts
CHANGED
|
@@ -20,6 +20,28 @@ export {
|
|
|
20
20
|
type ParseResult,
|
|
21
21
|
type PathedIssue,
|
|
22
22
|
} from "./errors.js";
|
|
23
|
+
export type {
|
|
24
|
+
ChunkGridVerdict,
|
|
25
|
+
RectilinearChunkGridConfiguration,
|
|
26
|
+
RectilinearDimSpec,
|
|
27
|
+
RegularChunkGridConfiguration,
|
|
28
|
+
} from "./chunk-grid/index.js";
|
|
29
|
+
export type {
|
|
30
|
+
ShardingIndexedCodecConfiguration,
|
|
31
|
+
TransposeCodecConfiguration,
|
|
32
|
+
} from "./codec/index.js";
|
|
33
|
+
export type {
|
|
34
|
+
BytesFillValue,
|
|
35
|
+
ComplexFillValue,
|
|
36
|
+
FloatFillValue,
|
|
37
|
+
NumpyDatetime64Configuration,
|
|
38
|
+
NumpyDatetime64FillValue,
|
|
39
|
+
NumpyTimeUnit,
|
|
40
|
+
RawBytesFillValue,
|
|
41
|
+
StringFillValue,
|
|
42
|
+
StructConfiguration,
|
|
43
|
+
StructField,
|
|
44
|
+
} from "./data-type/index.js";
|
|
23
45
|
export * from "./schemas.js";
|
|
24
46
|
export * from "./semantics.js";
|
|
25
47
|
export type { StandardSchemaV1 } from "./standard-schema.js";
|