zarr-metadata 0.8.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.
Files changed (164) hide show
  1. package/README.md +11 -7
  2. package/dist/chunk-grid/index.d.ts +27 -0
  3. package/dist/chunk-grid/index.d.ts.map +1 -0
  4. package/dist/chunk-grid/index.js +21 -0
  5. package/dist/chunk-grid/index.js.map +1 -0
  6. package/dist/chunk-grid/rectilinear.d.ts +14 -0
  7. package/dist/chunk-grid/rectilinear.d.ts.map +1 -0
  8. package/dist/{chunk-grids.js → chunk-grid/rectilinear.js} +3 -60
  9. package/dist/chunk-grid/rectilinear.js.map +1 -0
  10. package/dist/chunk-grid/regular.d.ts +7 -0
  11. package/dist/chunk-grid/regular.d.ts.map +1 -0
  12. package/dist/chunk-grid/regular.js +36 -0
  13. package/dist/chunk-grid/regular.js.map +1 -0
  14. package/dist/codec/index.d.ts +34 -0
  15. package/dist/codec/index.d.ts.map +1 -0
  16. package/dist/codec/index.js +35 -0
  17. package/dist/codec/index.js.map +1 -0
  18. package/dist/codec/sharding-indexed.d.ts +26 -0
  19. package/dist/codec/sharding-indexed.d.ts.map +1 -0
  20. package/dist/codec/sharding-indexed.js +80 -0
  21. package/dist/codec/sharding-indexed.js.map +1 -0
  22. package/dist/codec/transpose.d.ts +19 -0
  23. package/dist/codec/transpose.d.ts.map +1 -0
  24. package/dist/codec/transpose.js +66 -0
  25. package/dist/codec/transpose.js.map +1 -0
  26. package/dist/data-type/bool.d.ts +4 -0
  27. package/dist/data-type/bool.d.ts.map +1 -0
  28. package/dist/data-type/bool.js +7 -0
  29. package/dist/data-type/bool.js.map +1 -0
  30. package/dist/data-type/bytes.d.ts +11 -0
  31. package/dist/data-type/bytes.d.ts.map +1 -0
  32. package/dist/data-type/bytes.js +18 -0
  33. package/dist/data-type/bytes.js.map +1 -0
  34. package/dist/data-type/complex128.d.ts +3 -0
  35. package/dist/data-type/complex128.d.ts.map +1 -0
  36. package/dist/data-type/complex128.js +4 -0
  37. package/dist/data-type/complex128.js.map +1 -0
  38. package/dist/data-type/complex64.d.ts +3 -0
  39. package/dist/data-type/complex64.d.ts.map +1 -0
  40. package/dist/data-type/complex64.js +4 -0
  41. package/dist/data-type/complex64.js.map +1 -0
  42. package/dist/data-type/descriptor.d.ts +44 -0
  43. package/dist/data-type/descriptor.d.ts.map +1 -0
  44. package/dist/data-type/descriptor.js +57 -0
  45. package/dist/data-type/descriptor.js.map +1 -0
  46. package/dist/data-type/float16.d.ts +3 -0
  47. package/dist/data-type/float16.d.ts.map +1 -0
  48. package/dist/data-type/float16.js +4 -0
  49. package/dist/data-type/float16.js.map +1 -0
  50. package/dist/data-type/float32.d.ts +3 -0
  51. package/dist/data-type/float32.d.ts.map +1 -0
  52. package/dist/data-type/float32.js +4 -0
  53. package/dist/data-type/float32.js.map +1 -0
  54. package/dist/data-type/float64.d.ts +3 -0
  55. package/dist/data-type/float64.d.ts.map +1 -0
  56. package/dist/data-type/float64.js +4 -0
  57. package/dist/data-type/float64.js.map +1 -0
  58. package/dist/data-type/index.d.ts +23 -0
  59. package/dist/data-type/index.d.ts.map +1 -0
  60. package/dist/data-type/index.js +92 -0
  61. package/dist/data-type/index.js.map +1 -0
  62. package/dist/data-type/int16.d.ts +3 -0
  63. package/dist/data-type/int16.d.ts.map +1 -0
  64. package/dist/data-type/int16.js +4 -0
  65. package/dist/data-type/int16.js.map +1 -0
  66. package/dist/data-type/int32.d.ts +3 -0
  67. package/dist/data-type/int32.d.ts.map +1 -0
  68. package/dist/data-type/int32.js +4 -0
  69. package/dist/data-type/int32.js.map +1 -0
  70. package/dist/data-type/int64.d.ts +3 -0
  71. package/dist/data-type/int64.d.ts.map +1 -0
  72. package/dist/data-type/int64.js +4 -0
  73. package/dist/data-type/int64.js.map +1 -0
  74. package/dist/data-type/int8.d.ts +3 -0
  75. package/dist/data-type/int8.d.ts.map +1 -0
  76. package/dist/data-type/int8.js +4 -0
  77. package/dist/data-type/int8.js.map +1 -0
  78. package/dist/data-type/numpy-datetime64.d.ts +18 -0
  79. package/dist/data-type/numpy-datetime64.d.ts.map +1 -0
  80. package/dist/data-type/numpy-datetime64.js +14 -0
  81. package/dist/data-type/numpy-datetime64.js.map +1 -0
  82. package/dist/data-type/numpy-timedelta64.d.ts +4 -0
  83. package/dist/data-type/numpy-timedelta64.d.ts.map +1 -0
  84. package/dist/data-type/numpy-timedelta64.js +4 -0
  85. package/dist/data-type/numpy-timedelta64.js.map +1 -0
  86. package/dist/data-type/raw.d.ts +10 -0
  87. package/dist/data-type/raw.d.ts.map +1 -0
  88. package/dist/data-type/raw.js +26 -0
  89. package/dist/data-type/raw.js.map +1 -0
  90. package/dist/data-type/string.d.ts +6 -0
  91. package/dist/data-type/string.d.ts.map +1 -0
  92. package/dist/data-type/string.js +7 -0
  93. package/dist/data-type/string.js.map +1 -0
  94. package/dist/data-type/struct.d.ts +17 -0
  95. package/dist/data-type/struct.d.ts.map +1 -0
  96. package/dist/data-type/struct.js +44 -0
  97. package/dist/data-type/struct.js.map +1 -0
  98. package/dist/data-type/uint16.d.ts +3 -0
  99. package/dist/data-type/uint16.d.ts.map +1 -0
  100. package/dist/data-type/uint16.js +4 -0
  101. package/dist/data-type/uint16.js.map +1 -0
  102. package/dist/data-type/uint32.d.ts +3 -0
  103. package/dist/data-type/uint32.d.ts.map +1 -0
  104. package/dist/data-type/uint32.js +4 -0
  105. package/dist/data-type/uint32.js.map +1 -0
  106. package/dist/data-type/uint64.d.ts +3 -0
  107. package/dist/data-type/uint64.d.ts.map +1 -0
  108. package/dist/data-type/uint64.js +4 -0
  109. package/dist/data-type/uint64.js.map +1 -0
  110. package/dist/data-type/uint8.d.ts +3 -0
  111. package/dist/data-type/uint8.d.ts.map +1 -0
  112. package/dist/data-type/uint8.js +4 -0
  113. package/dist/data-type/uint8.js.map +1 -0
  114. package/dist/index.d.ts +3 -3
  115. package/dist/index.d.ts.map +1 -1
  116. package/dist/index.js.map +1 -1
  117. package/dist/semantics.d.ts +4 -4
  118. package/dist/semantics.d.ts.map +1 -1
  119. package/dist/semantics.js +9 -15
  120. package/dist/semantics.js.map +1 -1
  121. package/package.json +4 -2
  122. package/src/chunk-grid/index.ts +40 -0
  123. package/src/{chunk-grids.ts → chunk-grid/rectilinear.ts} +5 -75
  124. package/src/chunk-grid/regular.ts +42 -0
  125. package/src/codec/index.ts +76 -0
  126. package/src/codec/sharding-indexed.ts +113 -0
  127. package/src/codec/transpose.ts +80 -0
  128. package/src/data-type/bool.ts +8 -0
  129. package/src/data-type/bytes.ts +26 -0
  130. package/src/data-type/complex128.ts +4 -0
  131. package/src/data-type/complex64.ts +4 -0
  132. package/src/data-type/descriptor.ts +115 -0
  133. package/src/data-type/float16.ts +4 -0
  134. package/src/data-type/float32.ts +4 -0
  135. package/src/data-type/float64.ts +4 -0
  136. package/src/data-type/index.ts +129 -0
  137. package/src/data-type/int16.ts +4 -0
  138. package/src/data-type/int32.ts +4 -0
  139. package/src/data-type/int64.ts +4 -0
  140. package/src/data-type/int8.ts +4 -0
  141. package/src/data-type/numpy-datetime64.ts +33 -0
  142. package/src/data-type/numpy-timedelta64.ts +9 -0
  143. package/src/data-type/raw.ts +31 -0
  144. package/src/data-type/string.ts +11 -0
  145. package/src/data-type/struct.ts +55 -0
  146. package/src/data-type/uint16.ts +4 -0
  147. package/src/data-type/uint32.ts +4 -0
  148. package/src/data-type/uint64.ts +4 -0
  149. package/src/data-type/uint8.ts +4 -0
  150. package/src/index.ts +14 -3
  151. package/src/semantics.ts +9 -15
  152. package/dist/chunk-grids.d.ts +0 -40
  153. package/dist/chunk-grids.d.ts.map +0 -1
  154. package/dist/chunk-grids.js.map +0 -1
  155. package/dist/codecs.d.ts +0 -37
  156. package/dist/codecs.d.ts.map +0 -1
  157. package/dist/codecs.js +0 -182
  158. package/dist/codecs.js.map +0 -1
  159. package/dist/data-types.d.ts +0 -12
  160. package/dist/data-types.d.ts.map +0 -1
  161. package/dist/data-types.js +0 -70
  162. package/dist/data-types.js.map +0 -1
  163. package/src/codecs.ts +0 -214
  164. package/src/data-types.ts +0 -81
package/README.md CHANGED
@@ -80,19 +80,23 @@ The structural validators check key presence, value shapes, and fixed
80
80
  literals without interpreting extension points, matching the Python
81
81
  package's layering. The semantic layer (`validateSemanticsV3` /
82
82
  `validateArraySemanticsV3`) is TS-only and sits on top, organized by
83
- content: `chunk-grids.ts`, `codecs.ts`, and `data-types.ts` each hold the
84
- syntax (configuration types) and semantics (required members, cross-field
85
- prose rules — grid arity and sums, transpose permutations, sharding
86
- divisibility, fill_value vs data type) for the names the package
87
- interprets, with `semantics.ts` as the document-walking orchestrator.
88
- Unrecognized names are skipped — the extension name space is open.
83
+ content: `chunk-grid/`, `codec/`, and `data-type/` hold one module per
84
+ interpreted name, each with its syntax (configuration and fill-value
85
+ types) and semantics (required members, cross-field prose rules — grid
86
+ arity and sums, transpose permutations, sharding divisibility, fill_value
87
+ vs data type). Interpreted data types cover the core scalars, the `r<N>`
88
+ raw-bits family, and the established zarr-extensions conventions —
89
+ `string`, `bytes`, `numpy.datetime64`/`timedelta64`, and `struct` (whose
90
+ fill is judged per field, recursively). `semantics.ts` is the
91
+ document-walking orchestrator. Unrecognized names are skipped — the
92
+ extension name space is open.
89
93
 
90
94
  Consumers include the
91
95
  [Zarr Metadata VS Code extension](https://github.com/d-v-b/vscode-zarr).
92
96
 
93
97
  ## How correctness is maintained
94
98
 
95
- The [conformance corpus](conformance/) is the contract with the Python
99
+ The [conformance corpus](https://github.com/d-v-b/zarr-metadata.js/tree/main/conformance) is the contract with the Python
96
100
  reference implementation: shared JSON fixtures asserting the exact problem
97
101
  set (loc + kind) each document must produce. Both test suites run every
98
102
  case; a spec change updates the corpus first, turning both implementations
@@ -0,0 +1,27 @@
1
+ /**
2
+ * The chunk grids this package interprets, one module per grid, assembled
3
+ * into the dispatch the semantic layer uses. The structural document layer
4
+ * never reads these modules — extension points are uninterpreted there by
5
+ * spec design.
6
+ */
7
+ import type { PathedIssue } from "../errors.js";
8
+ export type { RegularChunkGridConfiguration } from "./regular.js";
9
+ export type { RectilinearChunkGridConfiguration, RectilinearDimSpec } from "./rectilinear.js";
10
+ /** What interpreting a chunk grid yields for the rest of the semantic layer. */
11
+ export interface ChunkGridVerdict {
12
+ /** Issues, pathed relative to the `chunk_grid` field. */
13
+ issues: PathedIssue[];
14
+ /**
15
+ * Distinct chunk lengths per dimension — the division context a
16
+ * sharding codec's inner chunks must satisfy — when derivable.
17
+ */
18
+ chunkSizes: number[][] | undefined;
19
+ }
20
+ /**
21
+ * Interpret a document's `chunk_grid` field: required members, cross-field
22
+ * rules against `shape`, and the division context for codec pipelines.
23
+ * Unrecognized grid names yield no issues and no context — the extension
24
+ * name space is open.
25
+ */
26
+ export declare function chunkGridVerdict(rawGrid: unknown, shape: number[] | undefined): ChunkGridVerdict;
27
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/chunk-grid/index.ts"],"names":[],"mappings":"AAAA;;;;;GAKG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAKhD,YAAY,EAAE,6BAA6B,EAAE,MAAM,cAAc,CAAC;AAClE,YAAY,EAAE,iCAAiC,EAAE,kBAAkB,EAAE,MAAM,kBAAkB,CAAC;AAE9F,gFAAgF;AAChF,MAAM,WAAW,gBAAgB;IAC/B,yDAAyD;IACzD,MAAM,EAAE,WAAW,EAAE,CAAC;IACtB;;;OAGG;IACH,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,CAAC;CACpC;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,gBAAgB,CAQhG"}
@@ -0,0 +1,21 @@
1
+ import { fieldParts, isPlainObject } from "../guards.js";
2
+ import { regularIssues } from "./regular.js";
3
+ import { rectilinearIssues } from "./rectilinear.js";
4
+ /**
5
+ * Interpret a document's `chunk_grid` field: required members, cross-field
6
+ * rules against `shape`, and the division context for codec pipelines.
7
+ * Unrecognized grid names yield no issues and no context — the extension
8
+ * name space is open.
9
+ */
10
+ export function chunkGridVerdict(rawGrid, shape) {
11
+ if (!isPlainObject(rawGrid) && typeof rawGrid !== "string") {
12
+ return { issues: [], chunkSizes: undefined }; // structural layer's problem
13
+ }
14
+ const name = fieldParts(rawGrid)?.name;
15
+ if (name === "regular")
16
+ return regularIssues(rawGrid, shape);
17
+ if (name === "rectilinear")
18
+ return rectilinearIssues(rawGrid, shape);
19
+ return { issues: [], chunkSizes: undefined };
20
+ }
21
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/chunk-grid/index.ts"],"names":[],"mappings":"AAOA,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AACzD,OAAO,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAC7C,OAAO,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAgBrD;;;;;GAKG;AACH,MAAM,UAAU,gBAAgB,CAAC,OAAgB,EAAE,KAA2B;IAC5E,IAAI,CAAC,aAAa,CAAC,OAAO,CAAC,IAAI,OAAO,OAAO,KAAK,QAAQ,EAAE,CAAC;QAC3D,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC,CAAC,6BAA6B;IAC7E,CAAC;IACD,MAAM,IAAI,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,IAAI,CAAC;IACvC,IAAI,IAAI,KAAK,SAAS;QAAE,OAAO,aAAa,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IAC7D,IAAI,IAAI,KAAK,aAAa;QAAE,OAAO,iBAAiB,CAAC,OAAO,EAAE,KAAK,CAAC,CAAC;IACrE,OAAO,EAAE,MAAM,EAAE,EAAE,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAC/C,CAAC"}
@@ -0,0 +1,14 @@
1
+ import type { ChunkGridVerdict } from "./index.js";
2
+ /**
3
+ * One dimension's spec in a rectilinear grid: a bare integer (uniform
4
+ * shorthand, no sum constraint) or a list of chunk sizes and
5
+ * `[size, count]` run-length pairs that must sum to the dimension length.
6
+ */
7
+ export type RectilinearDimSpec = number | Array<number | [number, number]>;
8
+ /** Configuration of the zarr-extensions `rectilinear` chunk grid. */
9
+ export interface RectilinearChunkGridConfiguration {
10
+ kind: "inline";
11
+ chunk_shapes: RectilinearDimSpec[];
12
+ }
13
+ export declare function rectilinearIssues(rawGrid: unknown, shape: number[] | undefined): ChunkGridVerdict;
14
+ //# sourceMappingURL=rectilinear.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rectilinear.d.ts","sourceRoot":"","sources":["../../src/chunk-grid/rectilinear.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD;;;;GAIG;AACH,MAAM,MAAM,kBAAkB,GAAG,MAAM,GAAG,KAAK,CAAC,MAAM,GAAG,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC,CAAC;AAE3E,qEAAqE;AACrE,MAAM,WAAW,iCAAiC;IAChD,IAAI,EAAE,QAAQ,CAAC;IACf,YAAY,EAAE,kBAAkB,EAAE,CAAC;CACpC;AAED,wBAAgB,iBAAiB,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,gBAAgB,CAqEjG"}
@@ -1,45 +1,5 @@
1
- /**
2
- * The chunk grids this package interprets: syntax (configuration types) and
3
- * semantics (the spec's prose rules) for `regular` and `rectilinear`, in
4
- * one place per grid. The structural document layer never reads this
5
- * module — extension points are uninterpreted there by spec design.
6
- */
7
- import { configurationMissing, fieldParts, isIntArray, isPlainObject } from "./guards.js";
8
- function regularIssues(rawGrid, shape) {
9
- const issues = [];
10
- let chunkSizes;
11
- const configuration = fieldParts(rawGrid)?.configuration;
12
- if (configurationMissing(rawGrid)) {
13
- issues.push({
14
- path: [],
15
- message: '"regular" requires a configuration with "chunk_shape"',
16
- kind: "missing_key",
17
- });
18
- }
19
- else if (configuration !== undefined && !Object.hasOwn(configuration, "chunk_shape")) {
20
- issues.push({
21
- path: ["configuration", "chunk_shape"],
22
- message: "missing required key",
23
- kind: "missing_key",
24
- });
25
- }
26
- const configured = configuration?.["chunk_shape"];
27
- if (isIntArray(configured)) {
28
- if (shape !== undefined && configured.length !== shape.length) {
29
- issues.push({
30
- path: ["configuration", "chunk_shape"],
31
- message: `expected one length per dimension of shape (${shape.length})`,
32
- kind: "invalid_value",
33
- });
34
- // wrong arity: unusable as division context
35
- }
36
- else {
37
- chunkSizes = configured.map((length) => [length]);
38
- }
39
- }
40
- return { issues, chunkSizes };
41
- }
42
- function rectilinearIssues(rawGrid, shape) {
1
+ import { configurationMissing, fieldParts } from "../guards.js";
2
+ export function rectilinearIssues(rawGrid, shape) {
43
3
  const issues = [];
44
4
  let chunkSizes;
45
5
  const configuration = fieldParts(rawGrid)?.configuration;
@@ -113,21 +73,4 @@ function rectilinearIssues(rawGrid, shape) {
113
73
  }
114
74
  return { issues, chunkSizes };
115
75
  }
116
- /**
117
- * Interpret a document's `chunk_grid` field: required members, cross-field
118
- * rules against `shape`, and the division context for codec pipelines.
119
- * Unrecognized grid names yield no issues and no context — the extension
120
- * name space is open.
121
- */
122
- export function chunkGridVerdict(rawGrid, shape) {
123
- if (!isPlainObject(rawGrid) && typeof rawGrid !== "string") {
124
- return { issues: [], chunkSizes: undefined }; // structural layer's problem
125
- }
126
- const name = fieldParts(rawGrid)?.name;
127
- if (name === "regular")
128
- return regularIssues(rawGrid, shape);
129
- if (name === "rectilinear")
130
- return rectilinearIssues(rawGrid, shape);
131
- return { issues: [], chunkSizes: undefined };
132
- }
133
- //# sourceMappingURL=chunk-grids.js.map
76
+ //# sourceMappingURL=rectilinear.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"rectilinear.js","sourceRoot":"","sources":["../../src/chunk-grid/rectilinear.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,7 @@
1
+ import type { ChunkGridVerdict } from "./index.js";
2
+ /** Configuration of the core `regular` chunk grid. */
3
+ export interface RegularChunkGridConfiguration {
4
+ chunk_shape: number[];
5
+ }
6
+ export declare function regularIssues(rawGrid: unknown, shape: number[] | undefined): ChunkGridVerdict;
7
+ //# sourceMappingURL=regular.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regular.d.ts","sourceRoot":"","sources":["../../src/chunk-grid/regular.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAEnD,sDAAsD;AACtD,MAAM,WAAW,6BAA6B;IAC5C,WAAW,EAAE,MAAM,EAAE,CAAC;CACvB;AAED,wBAAgB,aAAa,CAAC,OAAO,EAAE,OAAO,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,SAAS,GAAG,gBAAgB,CA+B7F"}
@@ -0,0 +1,36 @@
1
+ import { configurationMissing, fieldParts, isIntArray } from "../guards.js";
2
+ export function regularIssues(rawGrid, shape) {
3
+ const issues = [];
4
+ let chunkSizes;
5
+ const configuration = fieldParts(rawGrid)?.configuration;
6
+ if (configurationMissing(rawGrid)) {
7
+ issues.push({
8
+ path: [],
9
+ message: '"regular" requires a configuration with "chunk_shape"',
10
+ kind: "missing_key",
11
+ });
12
+ }
13
+ else if (configuration !== undefined && !Object.hasOwn(configuration, "chunk_shape")) {
14
+ issues.push({
15
+ path: ["configuration", "chunk_shape"],
16
+ message: "missing required key",
17
+ kind: "missing_key",
18
+ });
19
+ }
20
+ const configured = configuration?.["chunk_shape"];
21
+ if (isIntArray(configured)) {
22
+ if (shape !== undefined && configured.length !== shape.length) {
23
+ issues.push({
24
+ path: ["configuration", "chunk_shape"],
25
+ message: `expected one length per dimension of shape (${shape.length})`,
26
+ kind: "invalid_value",
27
+ });
28
+ // wrong arity: unusable as division context
29
+ }
30
+ else {
31
+ chunkSizes = configured.map((length) => [length]);
32
+ }
33
+ }
34
+ return { issues, chunkSizes };
35
+ }
36
+ //# sourceMappingURL=regular.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"regular.js","sourceRoot":"","sources":["../../src/chunk-grid/regular.ts"],"names":[],"mappings":"AAEA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAQ5E,MAAM,UAAU,aAAa,CAAC,OAAgB,EAAE,KAA2B;IACzE,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,UAAkC,CAAC;IACvC,MAAM,aAAa,GAAG,UAAU,CAAC,OAAO,CAAC,EAAE,aAAa,CAAC;IACzD,IAAI,oBAAoB,CAAC,OAAO,CAAC,EAAE,CAAC;QAClC,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,EAAE;YACR,OAAO,EAAE,uDAAuD;YAChE,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;IACL,CAAC;SAAM,IAAI,aAAa,KAAK,SAAS,IAAI,CAAC,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE,aAAa,CAAC,EAAE,CAAC;QACvF,MAAM,CAAC,IAAI,CAAC;YACV,IAAI,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC;YACtC,OAAO,EAAE,sBAAsB;YAC/B,IAAI,EAAE,aAAa;SACpB,CAAC,CAAC;IACL,CAAC;IACD,MAAM,UAAU,GAAG,aAAa,EAAE,CAAC,aAAa,CAAC,CAAC;IAClD,IAAI,UAAU,CAAC,UAAU,CAAC,EAAE,CAAC;QAC3B,IAAI,KAAK,KAAK,SAAS,IAAI,UAAU,CAAC,MAAM,KAAK,KAAK,CAAC,MAAM,EAAE,CAAC;YAC9D,MAAM,CAAC,IAAI,CAAC;gBACV,IAAI,EAAE,CAAC,eAAe,EAAE,aAAa,CAAC;gBACtC,OAAO,EAAE,+CAA+C,KAAK,CAAC,MAAM,GAAG;gBACvE,IAAI,EAAE,eAAe;aACtB,CAAC,CAAC;YACH,4CAA4C;QAC9C,CAAC;aAAM,CAAC;YACN,UAAU,GAAG,UAAU,CAAC,GAAG,CAAC,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC,MAAM,CAAC,CAAC,CAAC;QACpD,CAAC;IACH,CAAC;IACD,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,CAAC;AAChC,CAAC"}
@@ -0,0 +1,34 @@
1
+ /**
2
+ * The codecs this package interprets, one module per codec, plus the
3
+ * pipeline walker that threads dimensional context between codecs
4
+ * (mirroring zarr-python's chunk-spec threading): a valid transpose
5
+ * permutes the per-dimension chunk sizes for the codecs after it, and any
6
+ * codec this package cannot reason about — `reshape` may change a chunk's
7
+ * rank, and unknown codecs may do anything — invalidates the dimensional
8
+ * context for the rest of the pipeline instead of letting stale
9
+ * array-level facts produce false verdicts.
10
+ *
11
+ * Other codecs' required fields (blosc, gzip, zstd, ...) are deliberately
12
+ * NOT known here: they are registry-schema facts enforced by schema-driven
13
+ * tooling, and a second hardcoded source of truth would drift.
14
+ */
15
+ import type { PathedIssue } from "../errors.js";
16
+ import { type Path } from "../guards.js";
17
+ export type { ShardingIndexedCodecConfiguration } from "./sharding-indexed.js";
18
+ export type { TransposeCodecConfiguration } from "./transpose.js";
19
+ /** The dimensional facts threaded between the codecs of one pipeline. */
20
+ export interface PipelineContext {
21
+ /** Array dimensionality at this point; undefined when unknowable. */
22
+ dims: number | undefined;
23
+ /**
24
+ * Distinct chunk lengths per dimension this pipeline may encode — what a
25
+ * sharding codec's inner chunks must divide. A regular grid contributes
26
+ * one size per dimension; a rectilinear grid may contribute several.
27
+ */
28
+ chunkSizes: number[][] | undefined;
29
+ }
30
+ /** The spent/unknowable context. */
31
+ export declare const DROPPED: PipelineContext;
32
+ /** Walk one codec pipeline, threading the dimensional context. */
33
+ export declare function pipelineIssues(pipeline: unknown[], path: Path, initialDims: number | undefined, initialChunkSizes: number[][] | undefined): PathedIssue[];
34
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../src/codec/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;GAaG;AACH,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAoC,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AAI3E,YAAY,EAAE,iCAAiC,EAAE,MAAM,uBAAuB,CAAC;AAC/E,YAAY,EAAE,2BAA2B,EAAE,MAAM,gBAAgB,CAAC;AAElE,yEAAyE;AACzE,MAAM,WAAW,eAAe;IAC9B,qEAAqE;IACrE,IAAI,EAAE,MAAM,GAAG,SAAS,CAAC;IACzB;;;;OAIG;IACH,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,CAAC;CACpC;AAED,oCAAoC;AACpC,eAAO,MAAM,OAAO,EAAE,eAA4D,CAAC;AAEnF,kEAAkE;AAClE,wBAAgB,cAAc,CAC5B,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE,IAAI,EACV,WAAW,EAAE,MAAM,GAAG,SAAS,EAC/B,iBAAiB,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,GACxC,WAAW,EAAE,CAgCf"}
@@ -0,0 +1,35 @@
1
+ import { configurationMissing, fieldParts } from "../guards.js";
2
+ import { shardingIndexedIssues } from "./sharding-indexed.js";
3
+ import { transposeIssues } from "./transpose.js";
4
+ /** The spent/unknowable context. */
5
+ export const DROPPED = { dims: undefined, chunkSizes: undefined };
6
+ /** Walk one codec pipeline, threading the dimensional context. */
7
+ export function pipelineIssues(pipeline, path, initialDims, initialChunkSizes) {
8
+ const issues = [];
9
+ let context = { dims: initialDims, chunkSizes: initialChunkSizes };
10
+ pipeline.forEach((entry, index) => {
11
+ const parts = fieldParts(entry);
12
+ if (parts === undefined) {
13
+ context = DROPPED; // structurally invalid entry: no further reasoning
14
+ return;
15
+ }
16
+ const configMissing = configurationMissing(entry);
17
+ if (parts.name === "transpose") {
18
+ const result = transposeIssues(parts.configuration, configMissing, path, index, context);
19
+ issues.push(...result.issues);
20
+ context = result.context;
21
+ }
22
+ else if (parts.name === "sharding_indexed") {
23
+ const result = shardingIndexedIssues(parts.configuration, configMissing, path, index, context, pipelineIssues);
24
+ issues.push(...result.issues);
25
+ context = result.context;
26
+ }
27
+ else {
28
+ // A codec this package cannot reason about: stale array-level facts
29
+ // must not judge the codecs after it.
30
+ context = DROPPED;
31
+ }
32
+ });
33
+ return issues;
34
+ }
35
+ //# sourceMappingURL=index.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../src/codec/index.ts"],"names":[],"mappings":"AAeA,OAAO,EAAE,oBAAoB,EAAE,UAAU,EAAa,MAAM,cAAc,CAAC;AAC3E,OAAO,EAAE,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AAC9D,OAAO,EAAE,eAAe,EAAE,MAAM,gBAAgB,CAAC;AAiBjD,oCAAoC;AACpC,MAAM,CAAC,MAAM,OAAO,GAAoB,EAAE,IAAI,EAAE,SAAS,EAAE,UAAU,EAAE,SAAS,EAAE,CAAC;AAEnF,kEAAkE;AAClE,MAAM,UAAU,cAAc,CAC5B,QAAmB,EACnB,IAAU,EACV,WAA+B,EAC/B,iBAAyC;IAEzC,MAAM,MAAM,GAAkB,EAAE,CAAC;IACjC,IAAI,OAAO,GAAoB,EAAE,IAAI,EAAE,WAAW,EAAE,UAAU,EAAE,iBAAiB,EAAE,CAAC;IACpF,QAAQ,CAAC,OAAO,CAAC,CAAC,KAAK,EAAE,KAAK,EAAE,EAAE;QAChC,MAAM,KAAK,GAAG,UAAU,CAAC,KAAK,CAAC,CAAC;QAChC,IAAI,KAAK,KAAK,SAAS,EAAE,CAAC;YACxB,OAAO,GAAG,OAAO,CAAC,CAAC,mDAAmD;YACtE,OAAO;QACT,CAAC;QACD,MAAM,aAAa,GAAG,oBAAoB,CAAC,KAAK,CAAC,CAAC;QAClD,IAAI,KAAK,CAAC,IAAI,KAAK,WAAW,EAAE,CAAC;YAC/B,MAAM,MAAM,GAAG,eAAe,CAAC,KAAK,CAAC,aAAa,EAAE,aAAa,EAAE,IAAI,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;YACzF,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9B,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,CAAC;aAAM,IAAI,KAAK,CAAC,IAAI,KAAK,kBAAkB,EAAE,CAAC;YAC7C,MAAM,MAAM,GAAG,qBAAqB,CAClC,KAAK,CAAC,aAAa,EACnB,aAAa,EACb,IAAI,EACJ,KAAK,EACL,OAAO,EACP,cAAc,CACf,CAAC;YACF,MAAM,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,MAAM,CAAC,CAAC;YAC9B,OAAO,GAAG,MAAM,CAAC,OAAO,CAAC;QAC3B,CAAC;aAAM,CAAC;YACN,oEAAoE;YACpE,sCAAsC;YACtC,OAAO,GAAG,OAAO,CAAC;QACpB,CAAC;IACH,CAAC,CAAC,CAAC;IACH,OAAO,MAAM,CAAC;AAChB,CAAC"}
@@ -0,0 +1,26 @@
1
+ /** The core `sharding_indexed` codec: syntax and semantics. */
2
+ import type { PathedIssue } from "../errors.js";
3
+ import { type Path } from "../guards.js";
4
+ import { type PipelineContext } from "./index.js";
5
+ /** Configuration of the core `sharding_indexed` codec. */
6
+ export interface ShardingIndexedCodecConfiguration {
7
+ chunk_shape: number[];
8
+ codecs: unknown[];
9
+ index_codecs: unknown[];
10
+ index_location?: "start" | "end";
11
+ }
12
+ type Walk = (pipeline: unknown[], path: Path, dims: number | undefined, chunkSizes: number[][] | undefined) => PathedIssue[];
13
+ /**
14
+ * Judge one sharding entry: it requires `chunk_shape`, `codecs`, and
15
+ * `index_codecs`; its chunk_shape must match the array's dimensionality
16
+ * and evenly divide every chunk it shards. The inner pipeline is walked
17
+ * with the shard's own chunk context (`index_codecs` encode the shard
18
+ * index, whose shape differs — no dimensional context applies there), and
19
+ * the array -> bytes boundary spends the context for whatever follows.
20
+ */
21
+ export declare function shardingIndexedIssues(configuration: Record<string, unknown> | undefined, configMissing: boolean, path: Path, index: number, context: PipelineContext, walk: Walk): {
22
+ issues: PathedIssue[];
23
+ context: PipelineContext;
24
+ };
25
+ export {};
26
+ //# sourceMappingURL=sharding-indexed.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharding-indexed.d.ts","sourceRoot":"","sources":["../../src/codec/sharding-indexed.ts"],"names":[],"mappings":"AAAA,+DAA+D;AAC/D,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3D,0DAA0D;AAC1D,MAAM,WAAW,iCAAiC;IAChD,WAAW,EAAE,MAAM,EAAE,CAAC;IACtB,MAAM,EAAE,OAAO,EAAE,CAAC;IAClB,YAAY,EAAE,OAAO,EAAE,CAAC;IACxB,cAAc,CAAC,EAAE,OAAO,GAAG,KAAK,CAAC;CAClC;AAED,KAAK,IAAI,GAAG,CACV,QAAQ,EAAE,OAAO,EAAE,EACnB,IAAI,EAAE,IAAI,EACV,IAAI,EAAE,MAAM,GAAG,SAAS,EACxB,UAAU,EAAE,MAAM,EAAE,EAAE,GAAG,SAAS,KAC/B,WAAW,EAAE,CAAC;AAEnB;;;;;;;GAOG;AACH,wBAAgB,qBAAqB,CACnC,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAClD,aAAa,EAAE,OAAO,EACtB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,EACxB,IAAI,EAAE,IAAI,GACT;IAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CA6ErD"}
@@ -0,0 +1,80 @@
1
+ import { isIntArray } from "../guards.js";
2
+ import { DROPPED } from "./index.js";
3
+ /**
4
+ * Judge one sharding entry: it requires `chunk_shape`, `codecs`, and
5
+ * `index_codecs`; its chunk_shape must match the array's dimensionality
6
+ * and evenly divide every chunk it shards. The inner pipeline is walked
7
+ * with the shard's own chunk context (`index_codecs` encode the shard
8
+ * index, whose shape differs — no dimensional context applies there), and
9
+ * the array -> bytes boundary spends the context for whatever follows.
10
+ */
11
+ export function shardingIndexedIssues(configuration, configMissing, path, index, context, walk) {
12
+ const issues = [];
13
+ if (configMissing) {
14
+ issues.push({
15
+ path: [...path, index],
16
+ message: '"sharding_indexed" requires a configuration with "chunk_shape", "codecs", and "index_codecs"',
17
+ kind: "missing_key",
18
+ });
19
+ return { issues, context: DROPPED };
20
+ }
21
+ if (configuration !== undefined) {
22
+ for (const key of ["chunk_shape", "codecs", "index_codecs"]) {
23
+ if (!Object.hasOwn(configuration, key)) {
24
+ issues.push({
25
+ path: [...path, index, "configuration", key],
26
+ message: "missing required key",
27
+ kind: "missing_key",
28
+ });
29
+ }
30
+ }
31
+ }
32
+ const chunkShape = configuration?.["chunk_shape"];
33
+ if (!isIntArray(chunkShape)) {
34
+ // Still walk a present inner pipeline (entries deserve their own
35
+ // verdicts) before the context becomes unknowable.
36
+ const inner = configuration?.["codecs"];
37
+ if (Array.isArray(inner)) {
38
+ issues.push(...walk(inner, [...path, index, "configuration", "codecs"], undefined, undefined));
39
+ }
40
+ return { issues, context: DROPPED };
41
+ }
42
+ const chunkShapePath = [...path, index, "configuration", "chunk_shape"];
43
+ if (context.dims !== undefined && chunkShape.length !== context.dims) {
44
+ issues.push({
45
+ path: chunkShapePath,
46
+ message: `expected one length per array dimension (${context.dims})`,
47
+ kind: "invalid_value",
48
+ });
49
+ }
50
+ else if (context.chunkSizes !== undefined &&
51
+ chunkShape.length === context.chunkSizes.length &&
52
+ chunkShape.every((length) => length > 0)) {
53
+ let violation;
54
+ context.chunkSizes.forEach((sizes, axis) => {
55
+ if (violation !== undefined)
56
+ return;
57
+ const bad = sizes.find((size) => size % chunkShape[axis] !== 0);
58
+ if (bad !== undefined)
59
+ violation = { axis, size: bad };
60
+ });
61
+ if (violation !== undefined) {
62
+ const { axis, size } = violation;
63
+ const sizesNow = context.chunkSizes;
64
+ const uniform = sizesNow.every((sizes) => sizes.length === 1);
65
+ issues.push({
66
+ path: chunkShapePath,
67
+ message: uniform
68
+ ? `expected ${JSON.stringify(chunkShape)} to evenly divide the outer chunk shape ${JSON.stringify(sizesNow.map((sizes) => sizes[0]))}`
69
+ : `expected ${JSON.stringify(chunkShape)} to evenly divide every chunk size of the grid (dimension ${axis} has chunk size ${size})`,
70
+ kind: "invalid_value",
71
+ });
72
+ }
73
+ }
74
+ const inner = configuration?.["codecs"];
75
+ if (Array.isArray(inner)) {
76
+ issues.push(...walk(inner, [...path, index, "configuration", "codecs"], chunkShape.length, chunkShape.map((length) => [length])));
77
+ }
78
+ return { issues, context: DROPPED };
79
+ }
80
+ //# sourceMappingURL=sharding-indexed.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"sharding-indexed.js","sourceRoot":"","sources":["../../src/codec/sharding-indexed.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,19 @@
1
+ /** The core `transpose` codec: syntax and semantics. */
2
+ import type { PathedIssue } from "../errors.js";
3
+ import { type Path } from "../guards.js";
4
+ import { type PipelineContext } from "./index.js";
5
+ /** Configuration of the core `transpose` codec. */
6
+ export interface TransposeCodecConfiguration {
7
+ order: number[];
8
+ }
9
+ /**
10
+ * Judge one transpose entry: it requires a configuration with `order`,
11
+ * which must be a permutation with one entry per array dimension. A sound
12
+ * transpose permutes the context's chunk sizes; an unsound one makes the
13
+ * downstream context unknowable.
14
+ */
15
+ export declare function transposeIssues(configuration: Record<string, unknown> | undefined, configMissing: boolean, path: Path, index: number, context: PipelineContext): {
16
+ issues: PathedIssue[];
17
+ context: PipelineContext;
18
+ };
19
+ //# sourceMappingURL=transpose.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transpose.d.ts","sourceRoot":"","sources":["../../src/codec/transpose.ts"],"names":[],"mappings":"AAAA,wDAAwD;AACxD,OAAO,KAAK,EAAE,WAAW,EAAE,MAAM,cAAc,CAAC;AAChD,OAAO,EAAc,KAAK,IAAI,EAAE,MAAM,cAAc,CAAC;AACrD,OAAO,EAAW,KAAK,eAAe,EAAE,MAAM,YAAY,CAAC;AAE3D,mDAAmD;AACnD,MAAM,WAAW,2BAA2B;IAC1C,KAAK,EAAE,MAAM,EAAE,CAAC;CACjB;AAOD;;;;;GAKG;AACH,wBAAgB,eAAe,CAC7B,aAAa,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,SAAS,EAClD,aAAa,EAAE,OAAO,EACtB,IAAI,EAAE,IAAI,EACV,KAAK,EAAE,MAAM,EACb,OAAO,EAAE,eAAe,GACvB;IAAE,MAAM,EAAE,WAAW,EAAE,CAAC;IAAC,OAAO,EAAE,eAAe,CAAA;CAAE,CAoDrD"}
@@ -0,0 +1,66 @@
1
+ import { isIntArray } from "../guards.js";
2
+ import { DROPPED } from "./index.js";
3
+ function isPermutation(order) {
4
+ const seen = new Set(order);
5
+ return seen.size === order.length && order.every((entry) => entry >= 0 && entry < order.length);
6
+ }
7
+ /**
8
+ * Judge one transpose entry: it requires a configuration with `order`,
9
+ * which must be a permutation with one entry per array dimension. A sound
10
+ * transpose permutes the context's chunk sizes; an unsound one makes the
11
+ * downstream context unknowable.
12
+ */
13
+ export function transposeIssues(configuration, configMissing, path, index, context) {
14
+ const issues = [];
15
+ if (configMissing) {
16
+ issues.push({
17
+ path: [...path, index],
18
+ message: '"transpose" requires a configuration with "order"',
19
+ kind: "missing_key",
20
+ });
21
+ return { issues, context: DROPPED };
22
+ }
23
+ if (configuration !== undefined && !Object.hasOwn(configuration, "order")) {
24
+ issues.push({
25
+ path: [...path, index, "configuration", "order"],
26
+ message: "missing required key",
27
+ kind: "missing_key",
28
+ });
29
+ return { issues, context: DROPPED };
30
+ }
31
+ const order = configuration?.["order"];
32
+ if (!isIntArray(order)) {
33
+ return { issues, context: DROPPED }; // shape errors are the schema layer's
34
+ }
35
+ const orderPath = [...path, index, "configuration", "order"];
36
+ let sound = true;
37
+ if (!isPermutation(order)) {
38
+ sound = false;
39
+ issues.push({
40
+ path: orderPath,
41
+ message: `expected a permutation of the integers 0..${order.length - 1}`,
42
+ kind: "invalid_value",
43
+ });
44
+ }
45
+ if (context.dims !== undefined && order.length !== context.dims) {
46
+ sound = false;
47
+ issues.push({
48
+ path: orderPath,
49
+ message: `expected one entry per array dimension (${context.dims})`,
50
+ kind: "invalid_value",
51
+ });
52
+ }
53
+ if (!sound)
54
+ return { issues, context: DROPPED };
55
+ const sizes = context.chunkSizes;
56
+ return {
57
+ issues,
58
+ context: {
59
+ dims: context.dims,
60
+ chunkSizes: sizes !== undefined && order.length === sizes.length
61
+ ? order.map((axis) => sizes[axis])
62
+ : undefined,
63
+ },
64
+ };
65
+ }
66
+ //# sourceMappingURL=transpose.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"transpose.js","sourceRoot":"","sources":["../../src/codec/transpose.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,4 @@
1
+ import { type DataTypeDescriptor } from "./descriptor.js";
2
+ /** The core `bool` data type. */
3
+ export declare const bool: DataTypeDescriptor;
4
+ //# sourceMappingURL=bool.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bool.d.ts","sourceRoot":"","sources":["../../src/data-type/bool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAiB,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEzE,iCAAiC;AACjC,eAAO,MAAM,IAAI,EAAE,kBAIlB,CAAC"}
@@ -0,0 +1,7 @@
1
+ import { named, simple } from "./descriptor.js";
2
+ /** The core `bool` data type. */
3
+ export const bool = {
4
+ matches: named("bool"),
5
+ fillIssues: (fill) => typeof fill === "boolean" ? [] : simple('expected a boolean fill value for data type "bool"'),
6
+ };
7
+ //# sourceMappingURL=bool.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bool.js","sourceRoot":"","sources":["../../src/data-type/bool.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,EAA2B,MAAM,iBAAiB,CAAC;AAEzE,iCAAiC;AACjC,MAAM,CAAC,MAAM,IAAI,GAAuB;IACtC,OAAO,EAAE,KAAK,CAAC,MAAM,CAAC;IACtB,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE,CACnB,OAAO,IAAI,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,MAAM,CAAC,oDAAoD,CAAC;CAChG,CAAC"}
@@ -0,0 +1,11 @@
1
+ import { type DataTypeDescriptor } from "./descriptor.js";
2
+ /**
3
+ * Fill value of the `bytes` data type: an array of integers in `[0, 255]`
4
+ * (one per byte) or a standard-alphabet base64 string.
5
+ */
6
+ export type BytesFillValue = number[] | string;
7
+ /** Whether `value` is standard-alphabet base64 (padded length a multiple of 4). */
8
+ export declare function isBase64(value: string): boolean;
9
+ /** The zarr-extensions `bytes` data type (variable-length raw bytes). */
10
+ export declare const bytes: DataTypeDescriptor;
11
+ //# sourceMappingURL=bytes.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.d.ts","sourceRoot":"","sources":["../../src/data-type/bytes.ts"],"names":[],"mappings":"AAAA,OAAO,EAA8B,KAAK,kBAAkB,EAAE,MAAM,iBAAiB,CAAC;AAEtF;;;GAGG;AACH,MAAM,MAAM,cAAc,GAAG,MAAM,EAAE,GAAG,MAAM,CAAC;AAI/C,mFAAmF;AACnF,wBAAgB,QAAQ,CAAC,KAAK,EAAE,MAAM,GAAG,OAAO,CAE/C;AAED,yEAAyE;AACzE,eAAO,MAAM,KAAK,EAAE,kBASnB,CAAC"}
@@ -0,0 +1,18 @@
1
+ import { isByteArray, named, simple } from "./descriptor.js";
2
+ const BASE64 = /^[A-Za-z0-9+/]*={0,2}$/;
3
+ /** Whether `value` is standard-alphabet base64 (padded length a multiple of 4). */
4
+ export function isBase64(value) {
5
+ return value.length % 4 === 0 && BASE64.test(value);
6
+ }
7
+ /** The zarr-extensions `bytes` data type (variable-length raw bytes). */
8
+ export const bytes = {
9
+ matches: named("bytes"),
10
+ fillIssues: (fill) => {
11
+ if (isByteArray(fill))
12
+ return [];
13
+ if (typeof fill === "string" && isBase64(fill))
14
+ return [];
15
+ return simple('expected an array of integers in [0, 255] or a base64 string for data type "bytes"');
16
+ },
17
+ };
18
+ //# sourceMappingURL=bytes.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"bytes.js","sourceRoot":"","sources":["../../src/data-type/bytes.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,WAAW,EAAE,KAAK,EAAE,MAAM,EAA2B,MAAM,iBAAiB,CAAC;AAQtF,MAAM,MAAM,GAAG,wBAAwB,CAAC;AAExC,mFAAmF;AACnF,MAAM,UAAU,QAAQ,CAAC,KAAa;IACpC,OAAO,KAAK,CAAC,MAAM,GAAG,CAAC,KAAK,CAAC,IAAI,MAAM,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;AACtD,CAAC;AAED,yEAAyE;AACzE,MAAM,CAAC,MAAM,KAAK,GAAuB;IACvC,OAAO,EAAE,KAAK,CAAC,OAAO,CAAC;IACvB,UAAU,EAAE,CAAC,IAAI,EAAE,EAAE;QACnB,IAAI,WAAW,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QACjC,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,QAAQ,CAAC,IAAI,CAAC;YAAE,OAAO,EAAE,CAAC;QAC1D,OAAO,MAAM,CACX,oFAAoF,CACrF,CAAC;IACJ,CAAC;CACF,CAAC"}
@@ -0,0 +1,3 @@
1
+ /** The core `complex128` data type (components are float64). */
2
+ export declare const complex128: import("./descriptor.js").DataTypeDescriptor;
3
+ //# sourceMappingURL=complex128.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complex128.d.ts","sourceRoot":"","sources":["../../src/data-type/complex128.ts"],"names":[],"mappings":"AAEA,gEAAgE;AAChE,eAAO,MAAM,UAAU,8CAAoC,CAAC"}
@@ -0,0 +1,4 @@
1
+ import { complexDataType } from "./descriptor.js";
2
+ /** The core `complex128` data type (components are float64). */
3
+ export const complex128 = complexDataType("complex128", 16);
4
+ //# sourceMappingURL=complex128.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"complex128.js","sourceRoot":"","sources":["../../src/data-type/complex128.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAElD,gEAAgE;AAChE,MAAM,CAAC,MAAM,UAAU,GAAG,eAAe,CAAC,YAAY,EAAE,EAAE,CAAC,CAAC"}