unacy 0.7.0 → 0.8.1

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 CHANGED
@@ -12,6 +12,7 @@ Type-safe unit and format conversion library with automatic multi-hop compositio
12
12
  - 📦 **Tree-shakeable** - Only bundle converters you use
13
13
  - ✨ **Fluent API** - Clean, readable conversion syntax
14
14
  - 🎯 **Typed Metadata** - Native support for `number`, `string`, `boolean`, and `bigint` units
15
+ - 🧩 **Non-Primitive Types** - First-class support for enums, classes, records, and tuples
15
16
 
16
17
  ## Installation
17
18
 
@@ -57,9 +58,6 @@ const fahrenheit2 = tempRegistry.Celsius.to.Fahrenheit(tempRegistry.Celsius(30))
57
58
 
58
59
  console.log(fahrenheit1); // 77
59
60
  console.log(fahrenheit2); // 86
60
-
61
- // Old way still works (manual casting)
62
- const tempOld: Celsius = 25 as Celsius;
63
61
  ```
64
62
 
65
63
  ## Usage Examples
@@ -76,9 +74,6 @@ const distance = registry.meters(100); // Returns WithTypedUnits<typeof Meter
76
74
  // Fluent workflow
77
75
  const fahrenheit = registry.Celsius.to.Fahrenheit(registry.Celsius(20));
78
76
 
79
- // Compare with old way (still works)
80
- const tempOld: Celsius = 25 as Celsius;
81
-
82
77
  // Benefits:
83
78
  // - Cleaner syntax
84
79
  // - Less verbose than manual casting
@@ -111,7 +106,7 @@ const FlagMetadata = {
111
106
 
112
107
  ```typescript
113
108
  // Same registry as above
114
- const distance: Meters = 10 as Meters;
109
+ const distance = distanceRegistry.meters(10);
115
110
 
116
111
  // Access units directly via property syntax
117
112
  const feet = distanceRegistry.meters.to.feet(distance);
@@ -121,7 +116,7 @@ console.log(feet); // 32.8084
121
116
  const feet2 = distanceRegistry.meters.to.feet(distanceRegistry.meters(10));
122
117
 
123
118
  // Works in both directions
124
- const meters = distanceRegistry.feet.to.meters(32.8084 as Feet) satisfies Meters;
119
+ const meters = distanceRegistry.feet.to.meters(distanceRegistry.feet(32.8084));
125
120
  console.log(meters); // 10
126
121
  ```
127
122
 
@@ -151,8 +146,8 @@ const registry = createRegistry()
151
146
  });
152
147
 
153
148
  // Both directions work automatically
154
- const km = registry.convert(5000 as Meters, 'meters').to('kilometers'); // 5
155
- const m = registry.convert(5 as Kilometers, 'kilometers').to('meters'); // 5000
149
+ const km = registry.convert(registry.meters(5000), 'meters').to('kilometers'); // 5
150
+ const m = registry.convert(registry.kilometers(5), 'kilometers').to('meters'); // 5000
156
151
  ```
157
152
 
158
153
  ### Multi-Hop Auto-Composition
@@ -180,8 +175,7 @@ const registry = createRegistry()
180
175
 
181
176
  // No direct meters→miles converter registered!
182
177
  // Registry auto-composes: meters → kilometers → miles
183
- const meters: Meters = 5000 as Meters;
184
- const miles = registry.convert(meters, 'meters').to('miles');
178
+ const miles = registry.convert(registry.meters(5000), 'meters').to('miles');
185
179
  console.log(miles); // 3.106855
186
180
  ```
187
181
 
@@ -213,6 +207,81 @@ const str = iso8601.format(now); // "2026-01-06T12:00:00.000Z"
213
207
  const date = iso8601.parse('2026-01-06T12:00:00.000Z');
214
208
  ```
215
209
 
210
+ ### Non-Primitive Types
211
+
212
+ Beyond primitives, the registry supports enums, classes, records, and tuples
213
+ as unit types. The `type` field in metadata IS the runtime value itself.
214
+
215
+ #### Enum Units
216
+
217
+ ```typescript
218
+ import { createRegistry } from '@unacy/core';
219
+ import type { WithTypedUnits, TypedMetadata } from '@unacy/core';
220
+
221
+ enum LogLevel { DEBUG = 0, INFO = 1, WARN = 2, ERROR = 3 }
222
+
223
+ const LogLevelMeta = { name: 'LogLevel', type: LogLevel } as const;
224
+ type LogLevelUnit = WithTypedUnits<typeof LogLevelMeta>;
225
+
226
+ const registry = createRegistry()
227
+ .register(LogLevelMeta, /* ... */);
228
+ ```
229
+
230
+ #### Class Units
231
+
232
+ ```typescript
233
+ class Temperature {
234
+ constructor(public value: number, public scale: string) {}
235
+ }
236
+
237
+ const TempMeta = { name: 'Temperature', type: Temperature } as const;
238
+ type TempUnit = WithTypedUnits<typeof TempMeta>;
239
+ ```
240
+
241
+ #### Record Units
242
+
243
+ ```typescript
244
+ const PointSchema = { x: 'number', y: 'number' } as const;
245
+ const PointMeta = { name: 'Point', type: PointSchema } as const;
246
+ type PointUnit = WithTypedUnits<typeof PointMeta>;
247
+
248
+ // Nested schemas
249
+ const LineMeta = {
250
+ name: 'Line',
251
+ type: { start: { x: 'number', y: 'number' }, end: { x: 'number', y: 'number' } }
252
+ } as const;
253
+ ```
254
+
255
+ #### Tuple Units
256
+
257
+ ```typescript
258
+ const RGBSchema = ['number', 'number', 'number'] as const;
259
+ const RGBMeta = { name: 'RGB', type: RGBSchema } as const;
260
+ type RGBUnit = WithTypedUnits<typeof RGBMeta>;
261
+
262
+ // Optional and rest elements
263
+ const HeaderSchema = ['string', 'number?', '...string'] as const;
264
+ ```
265
+
266
+ #### Runtime Type Guards
267
+
268
+ ```typescript
269
+ import {
270
+ isEnumMetadata, isClassMetadata,
271
+ isRecordMetadata, isTupleMetadata,
272
+ detectMetadataKind
273
+ } from '@unacy/core';
274
+
275
+ detectMetadataKind(LogLevelMeta); // 'enum'
276
+ detectMetadataKind(TempMeta); // 'class'
277
+ detectMetadataKind(PointMeta); // 'record'
278
+ detectMetadataKind(RGBMeta); // 'tuple'
279
+
280
+ if (isEnumMetadata(meta)) {
281
+ // meta.type is narrowed to EnumType
282
+ }
283
+ ```
284
+
216
285
  ## API Reference
217
286
 
218
287
  ### Types
@@ -243,8 +312,16 @@ type NumericMetadata = TypedMetadata<number>;
243
312
 
244
313
  type StringMetadata = TypedMetadata<string>;
245
314
  // { name: string; type: 'string' }
315
+
316
+ // Non-primitive: type IS the value itself
317
+ type EnumMetadata = TypedMetadata<typeof LogLevel>;
318
+ // { name: string; type: typeof LogLevel }
246
319
  ```
247
320
 
321
+ #### `SupportedType`
322
+ Union of all types that can be used as a unit base:
323
+ `number | string | boolean | bigint | EnumType | ClassType | RecordSchema | TupleSchema`
324
+
248
325
  #### `WithFormat<T, F>`
249
326
  Brand a value with a format identifier for serialization safety.
250
327
 
@@ -2,7 +2,7 @@
2
2
  * Type-safe converter function signatures
3
3
  * @packageDocumentation
4
4
  */
5
- import type { PrimitiveType, Relax as BaseRelax } from './types.js';
5
+ import type { PrimitiveType, Relax as BaseRelax, Unwrap } from './types.js';
6
6
  /**
7
7
  * Unidirectional converter from one unit to another.
8
8
  *
@@ -59,4 +59,28 @@ export type RelaxBidirectionalConverter<ConverterType> = ConverterType extends B
59
59
  to: (input: PrimitiveType) => PrimitiveType;
60
60
  from: (input: PrimitiveType) => PrimitiveType;
61
61
  };
62
+ /**
63
+ * A converter that accepts the branded input type but returns
64
+ * unwrapped output. This eliminates the need to cast return values
65
+ * to branded types inside converter functions, while preserving
66
+ * full autocompletion on the input parameter.
67
+ *
68
+ * Since `Tagged<T, ...> extends T`, strict converters returning branded
69
+ * types are also assignable to this type.
70
+ *
71
+ * @template TInput - Source unit-tagged type
72
+ * @template TOutput - Destination unit-tagged type
73
+ */
74
+ export type RelaxedConverter<TInput, TOutput> = (input: TInput) => Unwrap<TOutput>;
75
+ /**
76
+ * A bidirectional converter with relaxed (unwrapped) output types.
77
+ * Input remains branded for full autocompletion.
78
+ *
79
+ * @template TInput - First unit-tagged type
80
+ * @template TOutput - Second unit-tagged type
81
+ */
82
+ export type RelaxedBidirectionalConverter<TInput, TOutput> = {
83
+ to: RelaxedConverter<TInput, TOutput>;
84
+ from: RelaxedConverter<TOutput, TInput>;
85
+ };
62
86
  //# sourceMappingURL=converters.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../src/converters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,YAAY,CAAC;AAEpE;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAEpE,MAAM,MAAM,cAAc,CAAC,aAAa,IACtC,aAAa,SAAS,SAAS,CAAC,MAAM,CAAC,SAAS,aAAa,EAAE,MAAM,CAAC,SAAS,aAAa,CAAC,GACzF,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GACrC,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,CAAC;AAE9C,MAAM,MAAM,KAAK,CACf,CAAC,SAAS,aAAa,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,IAC9E,CAAC,SAAS,aAAa,GACvB,SAAS,CAAC,CAAC,CAAC,GACZ,CAAC,SAAS,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,GACnC,cAAc,CAAC,CAAC,CAAC,GACjB,2BAA2B,CAAC,CAAC,CAAC,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,sBAAsB,CAAC,MAAM,EAAE,OAAO,IAAI;IACpD,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,2BAA2B,CAAC,aAAa,IACnD,aAAa,SAAS,sBAAsB,CAC1C,MAAM,CAAC,SAAS,aAAa,EAC7B,MAAM,CAAC,SAAS,aAAa,CAC9B,GACG;IACE,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;CAClC,GACD;IACE,EAAE,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,CAAC;IAC5C,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,CAAC;CAC/C,CAAC"}
1
+ {"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../src/converters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,aAAa,EAAE,KAAK,IAAI,SAAS,EAAE,MAAM,EAAE,MAAM,YAAY,CAAC;AAE5E;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,SAAS,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAEpE,MAAM,MAAM,cAAc,CAAC,aAAa,IACtC,aAAa,SAAS,SAAS,CAAC,MAAM,CAAC,SAAS,aAAa,EAAE,MAAM,CAAC,SAAS,aAAa,CAAC,GACzF,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,SAAS,CAAC,CAAC,CAAC,GACrC,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,CAAC;AAE9C,MAAM,MAAM,KAAK,CACf,CAAC,SAAS,aAAa,GAAG,SAAS,CAAC,GAAG,EAAE,GAAG,CAAC,GAAG,sBAAsB,CAAC,GAAG,EAAE,GAAG,CAAC,IAC9E,CAAC,SAAS,aAAa,GACvB,SAAS,CAAC,CAAC,CAAC,GACZ,CAAC,SAAS,SAAS,CAAC,OAAO,EAAE,OAAO,CAAC,GACnC,cAAc,CAAC,CAAC,CAAC,GACjB,2BAA2B,CAAC,CAAC,CAAC,CAAC;AAErC;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,sBAAsB,CAAC,MAAM,EAAE,OAAO,IAAI;IACpD,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC;AAEF,MAAM,MAAM,2BAA2B,CAAC,aAAa,IACnD,aAAa,SAAS,sBAAsB,CAC1C,MAAM,CAAC,SAAS,aAAa,EAC7B,MAAM,CAAC,SAAS,aAAa,CAC9B,GACG;IACE,EAAE,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;IAC/B,IAAI,EAAE,CAAC,KAAK,EAAE,SAAS,CAAC,CAAC,CAAC,KAAK,CAAC,CAAC;CAClC,GACD;IACE,EAAE,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,CAAC;IAC5C,IAAI,EAAE,CAAC,KAAK,EAAE,aAAa,KAAK,aAAa,CAAC;CAC/C,CAAC;AAER;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,gBAAgB,CAAC,MAAM,EAAE,OAAO,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC,OAAO,CAAC,CAAC;AAEnF;;;;;;GAMG;AACH,MAAM,MAAM,6BAA6B,CAAC,MAAM,EAAE,OAAO,IAAI;IAC3D,EAAE,EAAE,gBAAgB,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IACtC,IAAI,EAAE,gBAAgB,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CACzC,CAAC"}
@@ -1 +1 @@
1
- {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe,EAAE;QAC3B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QAEzB,wDAAwD;QACxD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;IAAA,CACnD;CACF;AAED;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,UAAU;IACxB,IAAI,CAAgB;IAEpC,YAAY,IAAmB,EAAE;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,OAAK,CAAC,CAAC;QAC7C,KAAK,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAAA,CAClB;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,UAAU;IAC3B,IAAI,CAAc;IAClB,EAAE,CAAc;IAChB,QAAQ,CAAS;IAEjC,YAAY,IAAiB,EAAE,EAAe,EAAE,QAAgB,EAAE;QAChE,KAAK,CACH,+BAA+B,QAAQ,kCAAkC,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC,EAAE,CACzG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAAA,CAC1B;CACF;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7B,IAAI,CAAc;IAClB,EAAE,CAAc;IAEhC,YAAY,IAAiB,EAAE,EAAe,EAAE,MAAe,EAAE;QAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,KAAK,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IAAA,CACd;CACF;AAED;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,UAAU;IACxB,MAAM,CAAS;IACf,KAAK,CAAS;IACd,MAAM,CAAS;IAE/B,YAAY,MAAc,EAAE,KAAa,EAAE,MAAc,EAAE;QACzD,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9E,MAAM,YAAY,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;QAE1D,KAAK,CAAC,iBAAiB,YAAY,QAAQ,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAAA,CACtB;CACF"}
1
+ {"version":3,"file":"errors.js","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAe,EAAE;QAC3B,KAAK,CAAC,OAAO,CAAC,CAAC;QACf,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QAEzB,wDAAwD;QACxD,MAAM,CAAC,cAAc,CAAC,IAAI,EAAE,IAAI,MAAM,CAAC,SAAS,CAAC,CAAC;IAAA,CACnD;CACF;AAED;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,UAAU;IACxB,IAAI,CAAgB;IAEpC,YAAY,IAAmB,EAAE;QAC/B,MAAM,OAAO,GAAG,IAAI,CAAC,GAAG,CAAC,MAAM,CAAC,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAC7C,KAAK,CAAC,sCAAsC,OAAO,EAAE,CAAC,CAAC;QACvD,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;IAAA,CAClB;CACF;AAED;;GAEG;AACH,MAAM,OAAO,aAAc,SAAQ,UAAU;IAC3B,IAAI,CAAc;IAClB,EAAE,CAAc;IAChB,QAAQ,CAAS;IAEjC,YAAY,IAAiB,EAAE,EAAe,EAAE,QAAgB,EAAE;QAChE,KAAK,CACH,+BAA+B,QAAQ,kCAAkC,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC,EAAE,CACzG,CAAC;QACF,IAAI,CAAC,IAAI,GAAG,eAAe,CAAC;QAC5B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;QACb,IAAI,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAAA,CAC1B;CACF;AAED;;GAEG;AACH,MAAM,OAAO,eAAgB,SAAQ,UAAU;IAC7B,IAAI,CAAc;IAClB,EAAE,CAAc;IAEhC,YAAY,IAAiB,EAAE,EAAe,EAAE,MAAe,EAAE;QAC/D,MAAM,SAAS,GAAG,MAAM,CAAC,CAAC,CAAC,KAAK,MAAM,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC;QAC9C,KAAK,CAAC,uBAAuB,MAAM,CAAC,IAAI,CAAC,OAAO,MAAM,CAAC,EAAE,CAAC,GAAG,SAAS,EAAE,CAAC,CAAC;QAC1E,IAAI,CAAC,IAAI,GAAG,iBAAiB,CAAC;QAC9B,IAAI,CAAC,IAAI,GAAG,IAAI,CAAC;QACjB,IAAI,CAAC,EAAE,GAAG,EAAE,CAAC;IAAA,CACd;CACF;AAED;;GAEG;AACH,MAAM,OAAO,UAAW,SAAQ,UAAU;IACxB,MAAM,CAAS;IACf,KAAK,CAAS;IACd,MAAM,CAAS;IAE/B,YAAY,MAAc,EAAE,KAAa,EAAE,MAAc,EAAE;QACzD,MAAM,cAAc,GAAG,KAAK,CAAC,MAAM,GAAG,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,CAAC,KAAK,CAAC,CAAC,EAAE,EAAE,CAAC,KAAK,CAAC,CAAC,CAAC,KAAK,CAAC;QAC9E,MAAM,YAAY,GAAG,KAAK,KAAK,EAAE,CAAC,CAAC,CAAC,IAAI,CAAC,CAAC,CAAC,cAAc,CAAC;QAE1D,KAAK,CAAC,iBAAiB,YAAY,QAAQ,MAAM,KAAK,MAAM,EAAE,CAAC,CAAC;QAChE,IAAI,CAAC,IAAI,GAAG,YAAY,CAAC;QACzB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;QACrB,IAAI,CAAC,KAAK,GAAG,KAAK,CAAC;QACnB,IAAI,CAAC,MAAM,GAAG,MAAM,CAAC;IAAA,CACtB;CACF"}
package/dist/index.d.ts CHANGED
@@ -2,11 +2,12 @@
2
2
  * Unacy Core - Type-safe unit and format conversion library
3
3
  * @packageDocumentation
4
4
  */
5
- export type { WithUnits, WithTypedUnits, WithFormat, BaseMetadata, TypedMetadata, UnitMetadata, Relax, PrimitiveType, ToPrimitiveType, ToPrimitiveTypeName } from './types.js';
6
- export type { Converter, BidirectionalConverter } from './converters.js';
5
+ export type { WithUnits, WithTypedUnits, WithFormat, BaseMetadata, TypedMetadata, UnitMetadata, Relax, PrimitiveType, SupportedType, EnumType, ClassType, RecordSchema, TupleSchema, ToPrimitiveTypeName } from './types.js';
6
+ export type { Converter, BidirectionalConverter, RelaxedConverter, RelaxedBidirectionalConverter } from './converters.js';
7
7
  export type { Formatter, Parser, FormatterParser } from './formatters.js';
8
8
  export type { UnitRegistry, UnitMap, UnitAccessor } from './registry.js';
9
9
  export { createRegistry } from './registry.js';
10
10
  export { UnacyError, CycleError, MaxDepthError, ConversionError, ParseError } from './errors.js';
11
- export { createParserWithSchema } from './utils/validation.js';
11
+ export { createParserWithSchema, validateEnum, validateClass, validateRecordSchema, validateTupleSchema, isEnumMetadata, isClassMetadata, isRecordMetadata, isTupleMetadata, detectMetadataKind } from './utils/validation.js';
12
+ export type { PrimitiveTypeFromName, InferFromRecordSchema, InferFromTupleSchema } from './types.js';
12
13
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,SAAS,EACT,cAAc,EACd,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,KAAK,EACL,aAAa,EACb,eAAe,EACf,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAGpB,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,iBAAiB,CAAC;AAGzE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG1E,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGjG,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EACV,SAAS,EACT,cAAc,EACd,UAAU,EACV,YAAY,EACZ,aAAa,EACb,YAAY,EACZ,KAAK,EACL,aAAa,EACb,aAAa,EACb,QAAQ,EACR,SAAS,EACT,YAAY,EACZ,WAAW,EACX,mBAAmB,EACpB,MAAM,YAAY,CAAC;AAGpB,YAAY,EACV,SAAS,EACT,sBAAsB,EACtB,gBAAgB,EAChB,6BAA6B,EAC9B,MAAM,iBAAiB,CAAC;AAGzB,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,iBAAiB,CAAC;AAG1E,YAAY,EAAE,YAAY,EAAE,OAAO,EAAE,YAAY,EAAE,MAAM,eAAe,CAAC;AACzE,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAG/C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAGjG,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EACnB,MAAM,uBAAuB,CAAC;AAG/B,YAAY,EACV,qBAAqB,EACrB,qBAAqB,EACrB,oBAAoB,EACrB,MAAM,YAAY,CAAC"}
package/dist/index.js CHANGED
@@ -6,5 +6,5 @@ export { createRegistry } from './registry.js';
6
6
  // Errors
7
7
  export { UnacyError, CycleError, MaxDepthError, ConversionError, ParseError } from './errors.js';
8
8
  // Utilities
9
- export { createParserWithSchema } from './utils/validation.js';
9
+ export { createParserWithSchema, validateEnum, validateClass, validateRecordSchema, validateTupleSchema, isEnumMetadata, isClassMetadata, isRecordMetadata, isTupleMetadata, detectMetadataKind } from './utils/validation.js';
10
10
  //# sourceMappingURL=index.js.map
package/dist/index.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAwBH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjG,YAAY;AACZ,OAAO,EAAE,sBAAsB,EAAE,MAAM,uBAAuB,CAAC"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAiCH,OAAO,EAAE,cAAc,EAAE,MAAM,eAAe,CAAC;AAE/C,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAEjG,YAAY;AACZ,OAAO,EACL,sBAAsB,EACtB,YAAY,EACZ,aAAa,EACb,oBAAoB,EACpB,mBAAmB,EACnB,cAAc,EACd,eAAe,EACf,gBAAgB,EAChB,eAAe,EACf,kBAAkB,EACnB,MAAM,uBAAuB,CAAC"}
@@ -2,14 +2,14 @@
2
2
  * Converter registry with auto-composition via BFS
3
3
  * @packageDocumentation
4
4
  */
5
- import type { Converter, BidirectionalConverter, Relax } from './converters.js';
6
- import type { UnitsFor, WithUnits, TypedMetadata, NameFor, WithTypedUnits, UnitsOf, BaseMetadata, PrimitiveType, Relax as RelaxUnits } from './types.js';
5
+ import type { Converter, RelaxedConverter, RelaxedBidirectionalConverter } from './converters.js';
6
+ import type { UnitsFor, WithUnits, TypedMetadata, NameFor, WithTypedUnits, UnitsOf, BaseMetadata, SupportedType, InferCallableArgs, Relax as RelaxUnits } from './types.js';
7
7
  /**
8
8
  * Represents a conversion edge from one unit to another
9
9
  * Edges store the unit names as strings, but the type system ensures
10
10
  * they correspond to valid WithUnits types
11
11
  */
12
- type Edge<From extends WithTypedUnits<any> = WithTypedUnits<TypedMetadata<PrimitiveType>>, To extends WithTypedUnits<any> = WithTypedUnits<TypedMetadata<PrimitiveType>>> = readonly [From, To];
12
+ type Edge<From extends WithTypedUnits<any> = WithTypedUnits<TypedMetadata<SupportedType>>, To extends WithTypedUnits<any> = WithTypedUnits<TypedMetadata<SupportedType>>> = readonly [From, To];
13
13
  /**
14
14
  * Extract all unique 'from' units from a list of edges
15
15
  */
@@ -25,13 +25,15 @@ type ToUnitsFor<Edges extends readonly Edge[], FromUnit extends WithTypedUnits<a
25
25
  * Type for unit accessor with metadata and conversion methods
26
26
  * Can be called as a function to create branded unit values
27
27
  */
28
- export type UnitAccessor<From extends WithTypedUnits<TypedMetadata>, Edges extends readonly Edge[]> = {
28
+ export type UnitAccessor<From extends WithTypedUnits<TypedMetadata<SupportedType>>, Edges extends readonly Edge[]> = {
29
29
  /**
30
- * Create a branded value with this unit
31
- * @param value - The numeric value to brand
30
+ * Create a branded value with this unit.
31
+ * For tuples, pass members as individual arguments.
32
+ * For classes, pass constructor parameters directly.
33
+ * @param args - The value(s) to brand
32
34
  * @returns The value branded with this unit type
33
35
  */
34
- (value: number): From;
36
+ (...args: InferCallableArgs<From>): From;
35
37
  to: {
36
38
  [To in ToUnitsFor<Edges, From> as UnitsFor<To>]: (value: RelaxUnits<From>) => To;
37
39
  };
@@ -42,8 +44,8 @@ export type UnitAccessor<From extends WithTypedUnits<TypedMetadata>, Edges exten
42
44
  /**
43
45
  * Register a converter from this unit to another unit
44
46
  */
45
- register<To extends WithTypedUnits<ToMeta>, ToMeta extends TypedMetadata<PrimitiveType>>(to: UnitsFor<To> | ToMeta, converter: Relax<Converter<From, To>>): UnitRegistry<[...Edges, Edge<From, To>]> & UnitMap<[...Edges, Edge<From, To>]>;
46
- register<To extends WithTypedUnits<ToMeta>, ToMeta extends TypedMetadata<PrimitiveType>>(to: UnitsFor<To> | ToMeta, converter: Relax<BidirectionalConverter<From, To>>): UnitRegistry<[...Edges, Edge<From, To>, Edge<To, From>]> & UnitMap<[...Edges, Edge<From, To>, Edge<To, From>]>;
47
+ register<To extends WithTypedUnits<ToMeta>, ToMeta extends TypedMetadata<SupportedType>>(to: UnitsFor<To> | ToMeta, converter: RelaxedConverter<From, To>): UnitRegistry<[...Edges, Edge<From, To>]> & UnitMap<[...Edges, Edge<From, To>]>;
48
+ register<To extends WithTypedUnits<ToMeta>, ToMeta extends TypedMetadata<SupportedType>>(to: UnitsFor<To> | ToMeta, converter: RelaxedBidirectionalConverter<From, To>): UnitRegistry<[...Edges, Edge<From, To>, Edge<To, From>]> & UnitMap<[...Edges, Edge<From, To>, Edge<To, From>]>;
47
49
  } & UnitsOf<From>;
48
50
  /**
49
51
  * Type for unit-based conversion accessors
@@ -57,7 +59,7 @@ export type UnitMap<Edges extends readonly Edge[]> = {
57
59
  * Registry for managing and composing unit converters
58
60
  */
59
61
  export interface UnitRegistry<Edges extends Edge[] = []> {
60
- register<From extends WithTypedUnits<FromMeta>, FromMeta extends TypedMetadata<PrimitiveType>>(unit: FromMeta): this & {
62
+ register<From extends WithTypedUnits<FromMeta>, FromMeta extends TypedMetadata<SupportedType>>(unit: FromMeta): this & {
61
63
  [K in NameFor<From>]: UnitAccessor<From, Edges>;
62
64
  };
63
65
  /**
@@ -65,19 +67,19 @@ export interface UnitRegistry<Edges extends Edge[] = []> {
65
67
  *
66
68
  * @param from - Source unit (string name or metadata object)
67
69
  * @param to - Destination unit (string name or metadata object)
68
- * @param converter - Converter function
70
+ * @param converter - Converter function (input is branded, output can be plain or branded)
69
71
  * @returns New registry instance with the converter registered
70
72
  */
71
- register<From extends WithTypedUnits<FromMeta>, To extends WithTypedUnits<ToMeta>, FromMeta extends TypedMetadata<PrimitiveType>, ToMeta extends TypedMetadata<PrimitiveType>>(from: UnitsFor<From> | FromMeta, to: UnitsFor<To> | ToMeta, converter: Converter<From, RelaxUnits<To>>): UnitRegistry<[...Edges, Edge<From, To>]> & UnitMap<[...Edges, Edge<From, To>]>;
73
+ register<From extends WithTypedUnits<FromMeta>, To extends WithTypedUnits<ToMeta>, FromMeta extends TypedMetadata<SupportedType>, ToMeta extends TypedMetadata<SupportedType>>(from: UnitsFor<From> | FromMeta, to: UnitsFor<To> | ToMeta, converter: RelaxedConverter<From, To>): UnitRegistry<[...Edges, Edge<From, To>]> & UnitMap<[...Edges, Edge<From, To>]>;
72
74
  /**
73
75
  * Register a bidirectional converter (both directions)
74
76
  *
75
77
  * @param from - First unit (string name or metadata object)
76
78
  * @param to - Second unit (string name or metadata object)
77
- * @param converter - Bidirectional converter object
79
+ * @param converter - Bidirectional converter object (input branded, output can be plain or branded)
78
80
  * @returns New registry instance with both converters registered
79
81
  */
80
- register<From extends WithTypedUnits<FromMeta>, To extends WithTypedUnits<ToMeta>, FromMeta extends TypedMetadata<PrimitiveType>, ToMeta extends TypedMetadata<PrimitiveType>>(from: UnitsFor<From> | FromMeta, to: UnitsFor<To> | ToMeta, converter: BidirectionalConverter<RelaxUnits<From>, RelaxUnits<To>>): UnitRegistry<[...Edges, Edge<From, To>, Edge<To, From>]> & UnitMap<[...Edges, Edge<From, To>, Edge<To, From>]>;
82
+ register<From extends WithTypedUnits<FromMeta>, To extends WithTypedUnits<ToMeta>, FromMeta extends TypedMetadata<SupportedType>, ToMeta extends TypedMetadata<SupportedType>>(from: UnitsFor<From> | FromMeta, to: UnitsFor<To> | ToMeta, converter: RelaxedBidirectionalConverter<From, To>): UnitRegistry<[...Edges, Edge<From, To>, Edge<To, From>]> & UnitMap<[...Edges, Edge<From, To>, Edge<To, From>]>;
81
83
  /**
82
84
  * Explicitly allow a conversion path in the type system (for multi-hop conversions)
83
85
  *
@@ -100,7 +102,7 @@ export interface UnitRegistry<Edges extends Edge[] = []> {
100
102
  * const f = registry.Celsius.to.Fahrenheit(temp);
101
103
  * ```
102
104
  */
103
- allow<From extends WithTypedUnits<FromMeta>, To extends WithTypedUnits<ToMeta>, FromMeta extends TypedMetadata<PrimitiveType>, ToMeta extends TypedMetadata<PrimitiveType>>(from: UnitsFor<From> | FromMeta, to: UnitsFor<To> | ToMeta): UnitRegistry<[...Edges, Edge<From, To>]> & UnitMap<[...Edges, Edge<From, To>]>;
105
+ allow<From extends WithTypedUnits<FromMeta>, To extends WithTypedUnits<ToMeta>, FromMeta extends TypedMetadata<SupportedType>, ToMeta extends TypedMetadata<SupportedType>>(from: UnitsFor<From> | FromMeta, to: UnitsFor<To> | ToMeta): UnitRegistry<[...Edges, Edge<From, To>]> & UnitMap<[...Edges, Edge<From, To>]>;
104
106
  /**
105
107
  * Get a converter (direct or composed via BFS)
106
108
  *
@@ -108,7 +110,7 @@ export interface UnitRegistry<Edges extends Edge[] = []> {
108
110
  * @param to - Destination unit
109
111
  * @returns Converter function, or undefined if no path exists
110
112
  */
111
- getConverter<From extends WithUnits<PrimitiveType, BaseMetadata>, To extends WithUnits<PrimitiveType, BaseMetadata>>(from: UnitsFor<From>, to: UnitsFor<To>): Converter<From, To> | undefined;
113
+ getConverter<From extends WithUnits<SupportedType, BaseMetadata>, To extends WithUnits<SupportedType, BaseMetadata>>(from: UnitsFor<From>, to: UnitsFor<To>): Converter<From, To> | undefined;
112
114
  /**
113
115
  * Convert a value using fluent API
114
116
  *
@@ -116,8 +118,8 @@ export interface UnitRegistry<Edges extends Edge[] = []> {
116
118
  * @param fromUnit - Source unit
117
119
  * @returns Object with to() method for conversion
118
120
  */
119
- convert<From extends WithUnits<PrimitiveType, BaseMetadata>>(value: From, fromUnit: UnitsFor<From>): {
120
- to<To extends WithUnits<PrimitiveType, BaseMetadata>>(unit: UnitsFor<To>): To;
121
+ convert<From extends WithUnits<SupportedType, BaseMetadata>>(value: From, fromUnit: UnitsFor<From>): {
122
+ to<To extends WithUnits<SupportedType, BaseMetadata>>(unit: UnitsFor<To>): To;
121
123
  };
122
124
  }
123
125
  /**
@@ -1 +1 @@
1
- {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.d.ts","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
package/dist/registry.js CHANGED
@@ -76,8 +76,15 @@ class ConverterRegistryImpl {
76
76
  });
77
77
  // Get metadata for this unit
78
78
  const unitMetadata = this.metadata.get(fromUnit) || {};
79
- // Create a callable function that brands a value with the unit
80
- const brandFunction = (value) => value;
79
+ // Create a callable function that brands a value with the unit.
80
+ // For tuples, collect spread args into an array.
81
+ // For classes, construct an instance from the spread args.
82
+ const metaType = unitMetadata?.type;
83
+ const brandFunction = metaType && typeof metaType === 'function' && /^[A-Z]/.test(metaType.name ?? '')
84
+ ? (...args) => new metaType(...args)
85
+ : metaType && Array.isArray(metaType)
86
+ ? (...args) => args
87
+ : (value) => value;
81
88
  // Create unit accessor object with to, addMetadata, register, and metadata properties
82
89
  const unitAccessor = Object.assign(brandFunction, {
83
90
  to: toProxy,
@@ -294,8 +301,15 @@ function createRegistryFromGraph(graph, pathCache, metadata) {
294
301
  });
295
302
  // Get metadata for this unit (may be empty)
296
303
  const unitMetadata = target.metadata.get(prop) || {};
297
- // Create a callable function that brands a value with the unit
298
- const brandFunction = (value) => value;
304
+ // Create a callable function that brands a value with the unit.
305
+ // For tuples, collect spread args into an array.
306
+ // For classes, construct an instance from the spread args.
307
+ const metaType = unitMetadata?.type;
308
+ const brandFunction = metaType && typeof metaType === 'function' && /^[A-Z]/.test(metaType.name ?? '')
309
+ ? (...args) => new metaType(...args)
310
+ : metaType && Array.isArray(metaType)
311
+ ? (...args) => args
312
+ : (value) => value;
299
313
  // Create unit accessor with all methods
300
314
  const dynamicAccessor = Object.assign(brandFunction, {
301
315
  to: toProxy,
@@ -1 +1 @@
1
- {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"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"}
1
+ {"version":3,"file":"registry.js","sourceRoot":"","sources":["../src/registry.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAqBH,OAAO,EAAE,eAAe,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,MAAM,kBAAkB,CAAC;AAyLvE;;GAEG;AACH,MAAM,qBAAqB;IACR,KAAK,CAA0D;IAC/D,SAAS,CAAmC;IAC5C,aAAa,CAAwB;IACrC,QAAQ,CAAiC;IAE1D,YACE,KAA+D,EAC/D,SAA4C,EAC5C,QAAyC,EACzC;QACA,IAAI,CAAC,KAAK,GAAG,KAAK,IAAI,IAAI,GAAG,EAAE,CAAC;QAChC,IAAI,CAAC,SAAS,GAAG,SAAS,IAAI,IAAI,GAAG,EAAE,CAAC;QACxC,IAAI,CAAC,QAAQ,GAAG,QAAQ,IAAI,IAAI,GAAG,EAAE,CAAC;QACtC,IAAI,CAAC,aAAa,GAAG,IAAI,GAAG,EAAE,CAAC;QAE/B,mCAAmC;QACnC,IAAI,CAAC,kBAAkB,EAAE,CAAC;IAAA,CAC3B;IAED;;OAEG;IACK,kBAAkB,GAAS;QACjC,yDAAyD;QACzD,MAAM,QAAQ,GAAG,IAAI,GAAG,EAAe,CAAC;QACxC,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;YACrC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnB,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACnC,IAAI,KAAK,EAAE,CAAC;gBACV,KAAK,MAAM,EAAE,IAAI,KAAK,CAAC,IAAI,EAAE,EAAE,CAAC;oBAC9B,QAAQ,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;gBACnB,CAAC;YACH,CAAC;QACH,CAAC;QAED,8DAA8D;QAC9D,KAAK,MAAM,IAAI,IAAI,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,CAAC;YACxC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrB,CAAC;QAED,+DAA+D;QAC/D,KAAK,MAAM,QAAQ,IAAI,QAAQ,EAAE,CAAC;YAChC,MAAM,WAAW,GAAQ,EAAE,CAAC;YAE5B,KAAK,MAAM,MAAM,IAAI,QAAQ,EAAE,CAAC;gBAC9B,IAAI,QAAQ,KAAK,MAAM,EAAE,CAAC;oBACxB,yEAAyE;oBACzE,WAAW,CAAC,MAAM,CAAC,GAAG,CAAC,KAAU,EAAE,EAAE,CAAC;wBACpC,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAe,EAAE,MAAa,CAAC,CAAC;wBACpE,IAAI,CAAC,SAAS,EAAE,CAAC;4BACf,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;wBACpE,CAAC;wBACD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;oBAAA,CACzB,CAAC;gBACJ,CAAC;YACH,CAAC;YAED,kEAAkE;YAClE,MAAM,OAAO,GAAG,IAAI,KAAK,CAAC,WAAW,EAAE;gBACrC,GAAG,EAAE,CAAC,MAAW,EAAE,MAAuB,EAAE,EAAE,CAAC;oBAC7C,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;wBAC/B,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;oBACxB,CAAC;oBACD,gCAAgC;oBAChC,IAAI,MAAM,IAAI,MAAM,EAAE,CAAC;wBACrB,OAAO,MAAM,CAAC,MAAM,CAAC,CAAC;oBACxB,CAAC;oBACD,iDAAiD;oBACjD,OAAO,CAAC,KAAU,EAAE,EAAE,CAAC;wBACrB,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAe,EAAE,MAAa,CAAC,CAAC;wBACpE,IAAI,CAAC,SAAS,EAAE,CAAC;4BACf,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;wBACpE,CAAC;wBACD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;oBAAA,CACzB,CAAC;gBAAA,CACH;aACF,CAAC,CAAC;YAEH,6BAA6B;YAC7B,MAAM,YAAY,GAAG,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAEvD,gEAAgE;YAChE,iDAAiD;YACjD,2DAA2D;YAC3D,MAAM,QAAQ,GAAI,YAAoB,EAAE,IAAI,CAAC;YAC7C,MAAM,aAAa,GACjB,QAAQ,IAAI,OAAO,QAAQ,KAAK,UAAU,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC9E,CAAC,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAkC;gBAChF,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACnC,CAAC,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,IAAgD;oBAC1E,CAAC,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,KAAsC,CAAC;YAEnE,sFAAsF;YACtF,MAAM,YAAY,GAAQ,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE;gBACrD,EAAE,EAAE,OAAO;gBACX,WAAW,EAAE,CAAC,QAAsB,EAAE,EAAE,CAAC;oBACvC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;oBAC3C,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;oBACzD,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,gBAAgB,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;oBAChE,OAAO,uBAAuB,CAAQ,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBAAA,CAChF;gBACD,QAAQ,EAAE,CACR,EAA6B,EAC7B,SAAiE,EACjE,EAAE,CAAC;oBACH,OAAO,IAAI,CAAC,QAAQ,CAAC,QAAe,EAAE,EAAS,EAAE,SAAgB,CAAC,CAAC;gBAAA,CACpE;aACF,CAAC,CAAC;YAEH,+DAA+D;YAC/D,wDAAwD;YACxD,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,YAAY,EAAE;gBAC5C,GAAG,EAAE,CAAC,MAAW,EAAE,IAAqB,EAAE,EAAE,CAAC;oBAC3C,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;wBAC7B,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;oBACtB,CAAC;oBACD,kEAAkE;oBAClE,IAAI,IAAI,IAAI,MAAM,EAAE,CAAC;wBACnB,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;oBACtB,CAAC;oBACD,+CAA+C;oBAC/C,IAAI,IAAI,IAAI,YAAY,EAAE,CAAC;wBACzB,OAAO,YAAY,CAAC,IAA0B,CAAC,CAAC;oBAClD,CAAC;oBACD,OAAO,SAAS,CAAC;gBAAA,CAClB;aACF,CAAC,CAAC;YAEH,IAAI,CAAC,aAAa,CAAC,GAAG,CAAC,QAAQ,EAAE,aAAa,CAAC,CAAC;QAClD,CAAC;IAAA,CACF;IA6BD,iBAAiB;IACjB,QAAQ,CAMN,IAA+B,EAC/B,EAA0B,EAC1B,SAAkE,EAC7D;QACL,+CAA+C;QAC/C,IAAI,EAAE,KAAK,SAAS,IAAI,SAAS,KAAK,SAAS,EAAE,CAAC;YAChD,MAAM,YAAY,GAAG,IAAgB,CAAC;YACtC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;YAC3C,MAAM,QAAQ,GAAG,YAAY,CAAC,IAAI,CAAC;YACnC,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YACzD,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,gBAAgB,EAAE,GAAG,YAAY,EAAE,CAAC,CAAC;YACpE,OAAO,uBAAuB,CAAQ,IAAI,CAAC,KAAK,EAAE,IAAI,CAAC,SAAS,EAAE,WAAW,CAAQ,CAAC;QACxF,CAAC;QAED,oDAAoD;QACpD,IAAI,QAAwB,CAAC;QAC7B,IAAI,MAAoB,CAAC;QACzB,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,QAAQ,CAAC,CAAC;QAE3C,IAAI,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,EAAE,CAAC;YAC/C,QAAQ,GAAG,IAAI,CAAC,IAAsB,CAAC;YACvC,mCAAmC;YACnC,MAAM,oBAAoB,GAAG,WAAW,CAAC,GAAG,CAAC,QAAQ,CAAC,IAAI,EAAE,CAAC;YAC7D,WAAW,CAAC,GAAG,CAAC,QAAQ,EAAE,EAAE,GAAG,oBAAoB,EAAE,GAAG,IAAI,EAAE,CAAC,CAAC;QAClE,CAAC;aAAM,CAAC;YACN,QAAQ,GAAG,IAAsB,CAAC;QACpC,CAAC;QAED,IAAI,OAAO,EAAE,KAAK,QAAQ,IAAI,MAAM,IAAI,EAAE,EAAE,CAAC;YAC3C,MAAM,GAAG,EAAE,CAAC,IAAoB,CAAC;YACjC,iCAAiC;YACjC,MAAM,kBAAkB,GAAG,WAAW,CAAC,GAAG,CAAC,MAAM,CAAC,IAAI,EAAE,CAAC;YACzD,WAAW,CAAC,GAAG,CAAC,MAAM,EAAE,EAAE,GAAG,kBAAkB,EAAE,GAAG,EAAE,EAAE,CAAC,CAAC;QAC5D,CAAC;aAAM,CAAC;YACN,MAAM,GAAG,EAAkB,CAAC;QAC9B,CAAC;QAED,0CAA0C;QAC1C,IAAI,OAAO,SAAS,KAAK,QAAQ,IAAI,IAAI,IAAI,SAAS,IAAI,MAAM,IAAI,SAAS,EAAE,CAAC;YAC9E,iCAAiC;YACjC,MAAM,WAAW,GAAG,SAA6C,CAAC;YAClE,2EAA2E;YAC3E,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAG,EAAE,WAAW,CAAC,EAAE,CAAC,CAAC,QAAQ,CACtD,EAAU,EACV,IAAW,EACX,WAAW,CAAC,IAAW,CACjB,CAAC;QACX,CAAC;QAED,kCAAkC;QAClC,MAAM,QAAQ,GAAG,IAAI,GAAG,CAAC,IAAI,CAAC,KAAK,CAAC,CAAC;QAErC,IAAI,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAC,EAAE,CAAC;YAC5B,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,IAAI,GAAG,EAAE,CAAC,CAAC;QACpC,CAAC;QAED,MAAM,OAAO,GAAG,IAAI,GAAG,CAAC,QAAQ,CAAC,GAAG,CAAC,QAAQ,CAAE,CAAC,CAAC;QACjD,OAAO,CAAC,GAAG,CAAC,MAAM,EAAE,SAAgC,CAAC,CAAC;QACtD,QAAQ,CAAC,GAAG,CAAC,QAAQ,EAAE,OAAO,CAAC,CAAC;QAEhC,sDAAsD;QACtD,OAAO,uBAAuB,CAC5B,QAAQ,EACR,IAAI,GAAG,EAAE,EACT,WAAW,CACL,CAAC;IAAA,CACV;IAED,qBAAqB,CAMnB,IAAoB,EACpB,EAAgB,EAChB,SAAkD,EAEE;QACpD,OAAO,IAAI,CAAC,QAAQ,CAAC,IAAI,EAAE,EAAE,EAAE,SAAS,CAAC,EAAS,CAAC,CAAC,QAAQ,CAC1D,EAAS,EACT,IAAW,EACX,SAAS,CAAC,IAAW,CACf,CAAC;IAAA,CACV;IAED,KAAK,CAMH,IAA+B,EAC/B,EAAyB,EACuD;QAChF,uDAAuD;QACvD,MAAM,QAAQ,GAAG,OAAO,IAAI,KAAK,QAAQ,IAAI,MAAM,IAAI,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,IAAI,CAAC;QAC/E,MAAM,MAAM,GAAG,OAAO,EAAE,KAAK,QAAQ,IAAI,MAAM,IAAI,EAAE,CAAC,CAAC,CAAC,EAAE,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC;QAErE,kDAAkD;QAClD,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAe,EAAE,MAAa,CAAC,CAAC;QACpE,IAAI,CAAC,SAAS,EAAE,CAAC;YACf,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,MAAM,EAAE,2BAA2B,CAAC,CAAC;QAC3E,CAAC;QAED,kEAAkE;QAClE,kFAAkF;QAClF,OAAO,IAAW,CAAC;IAAA,CACpB;IAED,YAAY,CAGV,IAAoB,EAAE,EAAgB,EAAmC;QACzE,oBAAoB;QACpB,MAAM,QAAQ,GAAG,GAAG,MAAM,CAAC,IAAI,CAAC,KAAK,MAAM,CAAC,EAAE,CAAC,EAAE,CAAC;QAClD,MAAM,MAAM,GAAG,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,CAAC,CAAC;QAC5C,IAAI,MAAM,EAAE,CAAC;YACX,OAAO,MAAM,CAAC;QAChB,CAAC;QAED,2BAA2B;QAC3B,MAAM,OAAO,GAAG,IAAI,CAAC,KAAK,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;QACrC,IAAI,OAAO,EAAE,CAAC;YACZ,MAAM,MAAM,GAAG,OAAO,CAAC,GAAG,CAAC,EAAE,CAAC,CAAC;YAC/B,IAAI,MAAM,EAAE,CAAC;gBACX,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,MAAM,CAAC,CAAC;gBACrC,OAAO,MAAM,CAAC;YAChB,CAAC;QACH,CAAC;QAED,qCAAqC;QACrC,IAAI,CAAC;YACH,MAAM,IAAI,GAAG,gBAAgB,CAAC,IAAI,EAAE,EAAE,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YAEpD,IAAI,CAAC,IAAI,EAAE,CAAC;gBACV,OAAO,SAAS,CAAC;YACnB,CAAC;YAED,MAAM,QAAQ,GAAG,iBAAiB,CAAC,IAAI,EAAE,IAAI,CAAC,KAAK,CAAC,CAAC;YACrD,IAAI,CAAC,SAAS,CAAC,GAAG,CAAC,QAAQ,EAAE,QAAQ,CAAC,CAAC;YACvC,OAAO,QAAQ,CAAC;QAClB,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,2DAA2D;YAC3D,qCAAqC;YACrC,IACE,KAAK,YAAY,KAAK;gBACtB,CAAC,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,YAAY,IAAI,KAAK,CAAC,WAAW,CAAC,IAAI,KAAK,eAAe,CAAC,EACvF,CAAC;gBACD,MAAM,KAAK,CAAC;YACd,CAAC;YACD,OAAO,SAAS,CAAC;QACnB,CAAC;IAAA,CACF;IAED,OAAO,CACL,KAAW,EACX,QAAmD,EAGnD;QACA,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,MAAM,IAAI,QAAQ,EAAE,CAAC;YACvD,QAAQ,GAAG,QAAQ,CAAC,IAAI,CAAC;QAC3B,CAAC;QACD,OAAO;YACL,EAAE,EAAE,CAAoD,IAAkB,EAAM,EAAE,CAAC;gBACjF,MAAM,SAAS,GAAG,IAAI,CAAC,YAAY,CAAC,QAAe,EAAE,IAAW,CAAC,CAAC;gBAClE,IAAI,CAAC,SAAS,EAAE,CAAC;oBACf,MAAM,IAAI,eAAe,CAAC,QAAQ,EAAE,IAAI,EAAE,oBAAoB,CAAC,CAAC;gBAClE,CAAC;gBACD,OAAO,SAAS,CAAC,KAAK,CAAO,CAAC;YAAA,CAC/B;SACF,CAAC;IAAA,CACH;CACF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;GAyBG;AACH,MAAM,UAAU,cAAc,GAGb;IACf,OAAO,uBAAuB,EAA2D,CAAC;AAAA,CAC3F;AAED;;GAEG;AACH,SAAS,uBAAuB,CAC9B,KAA+D,EAC/D,SAA4C,EAC5C,QAAyC,EACH;IACtC,MAAM,YAAY,GAAG,IAAI,qBAAqB,CAAQ,KAAK,EAAE,SAAS,EAAE,QAAQ,CAAC,CAAC;IAElF,iEAAiE;IACjE,OAAO,IAAI,KAAK,CAAC,YAAY,EAAE;QAC7B,GAAG,CAAC,MAAW,EAAE,IAAqB,EAAO;YAC3C,mEAAmE;YACnE,IAAI,IAAI,IAAI,MAAM,IAAI,OAAO,IAAI,KAAK,QAAQ,EAAE,CAAC;gBAC/C,OAAO,MAAM,CAAC,IAAI,CAAC,CAAC;YACtB,CAAC;YAED,oDAAoD;YACpD,MAAM,YAAY,GAAG,MAAM,CAAC,aAAa,CAAC,GAAG,CAAC,IAAI,CAAC,CAAC;YACpD,IAAI,YAAY,EAAE,CAAC;gBACjB,OAAO,YAAY,CAAC;YACtB,CAAC;YAED,0DAA0D;YAC1D,0EAA0E;YAC1E,MAAM,OAAO,GAAG,IAAI,KAAK,CACvB,EAAE,EACF;gBACE,GAAG,EAAE,CAAC,CAAM,EAAE,MAAuB,EAAE,EAAE,CAAC;oBACxC,IAAI,OAAO,MAAM,KAAK,QAAQ,EAAE,CAAC;wBAC/B,OAAO,SAAS,CAAC;oBACnB,CAAC;oBACD,OAAO,CAAC,KAAU,EAAE,EAAE,CAAC;wBACrB,MAAM,SAAS,GAAG,MAAM,CAAC,YAAY,CAAC,IAAW,EAAE,MAAa,CAAC,CAAC;wBAClE,IAAI,CAAC,SAAS,EAAE,CAAC;4BACf,MAAM,IAAI,eAAe,CAAC,IAAI,EAAE,MAAM,EAAE,oBAAoB,CAAC,CAAC;wBAChE,CAAC;wBACD,OAAO,SAAS,CAAC,KAAK,CAAC,CAAC;oBAAA,CACzB,CAAC;gBAAA,CACH;aACF,CACF,CAAC;YAEF,4CAA4C;YAC5C,MAAM,YAAY,GAAG,MAAM,CAAC,QAAQ,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;YAErD,gEAAgE;YAChE,iDAAiD;YACjD,2DAA2D;YAC3D,MAAM,QAAQ,GAAI,YAAoB,EAAE,IAAI,CAAC;YAC7C,MAAM,aAAa,GACjB,QAAQ,IAAI,OAAO,QAAQ,KAAK,UAAU,IAAI,QAAQ,CAAC,IAAI,CAAC,QAAQ,CAAC,IAAI,IAAI,EAAE,CAAC;gBAC9E,CAAC,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,IAAI,QAAQ,CAAC,GAAG,IAAI,CAAkC;gBAChF,CAAC,CAAC,QAAQ,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC;oBACnC,CAAC,CAAC,CAAC,GAAG,IAAe,EAAE,EAAE,CAAC,IAAgD;oBAC1E,CAAC,CAAC,CAAC,KAAc,EAAE,EAAE,CAAC,KAAsC,CAAC;YAEnE,wCAAwC;YACxC,MAAM,eAAe,GAAQ,MAAM,CAAC,MAAM,CAAC,aAAa,EAAE;gBACxD,EAAE,EAAE,OAAO;gBACX,WAAW,EAAE,CAAC,QAAsB,EAAE,EAAE,CAAC;oBACvC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC,MAAM,CAAC,QAAQ,CAAmC,CAAC;oBAC/E,MAAM,gBAAgB,GAAG,WAAW,CAAC,GAAG,CAAC,IAAI,CAAC,IAAI,EAAE,CAAC;oBACrD,WAAW,CAAC,GAAG,CAAC,IAAI,EAAE,EAAE,GAAG,gBAAgB,EAAE,GAAG,QAAQ,EAAE,CAAC,CAAC;oBAC5D,OAAO,uBAAuB,CAAM,MAAM,CAAC,KAAK,EAAE,MAAM,CAAC,SAAS,EAAE,WAAW,CAAC,CAAC;gBAAA,CAClF;gBACD,QAAQ,EAAE,CACR,EAA6B,EAC7B,SAAiE,EACjE,EAAE,CAAC;oBACH,OAAO,MAAM,CAAC,QAAQ,CAAC,IAAW,EAAE,EAAS,EAAE,SAAgB,CAAC,CAAC;gBAAA,CAClE;aACF,CAAC,CAAC;YAEH,sDAAsD;YACtD,MAAM,aAAa,GAAG,IAAI,KAAK,CAAC,eAAe,EAAE;gBAC/C,GAAG,EAAE,CAAC,cAAmB,EAAE,QAAyB,EAAE,EAAE,CAAC;oBACvD,IAAI,OAAO,QAAQ,KAAK,QAAQ,EAAE,CAAC;wBACjC,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;oBAClC,CAAC;oBACD,kEAAkE;oBAClE,IAAI,QAAQ,IAAI,cAAc,EAAE,CAAC;wBAC/B,OAAO,cAAc,CAAC,QAAQ,CAAC,CAAC;oBAClC,CAAC;oBACD,+CAA+C;oBAC/C,IAAI,QAAQ,IAAI,YAAY,EAAE,CAAC;wBAC7B,OAAO,YAAY,CAAC,QAA8B,CAAC,CAAC;oBACtD,CAAC;oBACD,OAAO,SAAS,CAAC;gBAAA,CAClB;aACF,CAAC,CAAC;YAEH,OAAO,aAAa,CAAC;QAAA,CACtB;KACF,CAAyC,CAAC;AAAA,CAC5C"}
package/dist/types.d.ts CHANGED
@@ -3,17 +3,49 @@
3
3
  * @packageDocumentation
4
4
  */
5
5
  import type { GetTagMetadata, Simplify, Tagged, UnwrapTagged } from 'type-fest';
6
+ /**
7
+ * Constraint type for any tagged unit value.
8
+ * `Tagged<unknown, K, V>` resolves to `Tag<K, V>` (since `unknown & X = X`),
9
+ * giving us the `Tag` constraint without importing the internal `Tag` type.
10
+ */
11
+ type AnyTaggedUnit = Tagged<unknown, typeof UNITS, any>;
6
12
  export declare const UNITS: unique symbol;
7
13
  export declare const DEFINITION: unique symbol;
8
14
  /**
9
- * Extract the name property from a metadata type
10
- * @internal
11
- **/
12
- export type WithTypedUnits<M extends TypedMetadata<any>> = WithUnits<ToPrimitiveType<M['type']>, M>;
15
+ * Resolve a schema/constructor/enum type to its runtime value type.
16
+ *
17
+ * - **Tuple schemas** → `InferFromTupleSchema` (`['number', 'string']` → `[number, string]`)
18
+ * - **Class constructors** `InstanceType` (constructor → instance)
19
+ * - **Record schemas** → `InferFromRecordSchema` (`{ x: 'number' }` → `{ x: number }`)
20
+ * - **Enum objects** → `T[keyof T]` (enum value type)
21
+ * - **Primitives** → passed through unchanged
22
+ */
23
+ export type ResolveValueType<T> = T extends readonly string[] ? InferFromTupleSchema<T> : T extends ClassType ? InstanceType<T> : T extends RecordSchema ? T[keyof T] extends keyof PrimitiveTypeMap | RecordSchema ? InferFromRecordSchema<T> : T[keyof T] : T extends EnumType ? T[keyof T] : T;
24
+ /**
25
+ * Resolve a branded unit type from a `TypedMetadata` object.
26
+ *
27
+ * For primitive metadata (where `type` is a name string like `'number'`),
28
+ * maps back through `PrimitiveTypeMap` to recover the base primitive.
29
+ * For non-primitive metadata (enum, class, record, tuple), resolves to
30
+ * the actual runtime value type via `ResolveValueType`.
31
+ *
32
+ * @template M - A `TypedMetadata` instance (e.g., `typeof CelsiusMetadata`)
33
+ *
34
+ * @example
35
+ * ```typescript
36
+ * const CelsiusMeta = { name: 'Celsius', type: 'number' } as const;
37
+ * type Celsius = WithTypedUnits<typeof CelsiusMeta>;
38
+ * // Celsius = Tagged<number, UNITS, typeof CelsiusMeta>
39
+ * ```
40
+ */
41
+ export type WithTypedUnits<M extends TypedMetadata<any>> = unknown extends M ? WithUnits<any, any> : M extends {
42
+ name: string;
43
+ type: infer TypeField;
44
+ } ? TypeField extends keyof PrimitiveTypeMap ? WithUnits<PrimitiveTypeMap[TypeField], M> : TypeField extends SupportedType ? WithUnits<ResolveValueType<TypeField>, M> : never : never;
13
45
  /**
14
46
  * Brand a value with a unit identifier for compile-time unit safety.
15
47
  *
16
- * @template T - Base type (e.g., number, bigint)
48
+ * @template T - Base type (e.g., number, bigint, record, tuple, class instance)
17
49
  * @template M - Metadata type (must extend BaseMetadata with required name property)
18
50
  *
19
51
  * @example
@@ -23,18 +55,74 @@ export type WithTypedUnits<M extends TypedMetadata<any>> = WithUnits<ToPrimitive
23
55
  * const temp: Celsius = 25 as Celsius;
24
56
  * ```
25
57
  */
26
- export type WithUnits<T extends PrimitiveType, M extends BaseMetadata = TypedMetadata<T>> = Tagged<T, typeof UNITS, M>;
58
+ export type WithUnits<T, M extends BaseMetadata = BaseMetadata> = Tagged<T, typeof UNITS, M>;
59
+ /** Primitive JavaScript types that can be used as unit base types. */
27
60
  export type PrimitiveType = number | string | boolean | bigint;
61
+ /**
62
+ * A TypeScript enum object at runtime — an object whose values are all
63
+ * strings (string enum) or all numbers (numeric enum).
64
+ * Mixed enums (both string and number values) are rejected at validation.
65
+ */
66
+ export type EnumType = Record<string, string | number>;
67
+ /**
68
+ * A class constructor (including abstract classes) that can serve as a
69
+ * unit's type identity. At runtime, the constructor itself is stored
70
+ * in the metadata `type` field.
71
+ */
72
+ export type ClassType = abstract new (...args: any[]) => any;
73
+ /** A record schema value — either a primitive type name or a nested schema. */
74
+ export type RecordSchemaValue = string | RecordSchema;
75
+ /**
76
+ * A schema describing an object shape. Keys are property names;
77
+ * values are primitive type name strings (`'number'`, `'string'`, etc.)
78
+ * or nested `RecordSchema` objects.
79
+ *
80
+ * @example
81
+ * ```typescript
82
+ * const PointSchema = { x: 'number', y: 'number' } satisfies RecordSchema;
83
+ * ```
84
+ */
85
+ export type RecordSchema = {
86
+ [key: string]: RecordSchemaValue;
87
+ };
88
+ /**
89
+ * A schema describing a tuple as an array of primitive type name strings.
90
+ * Supports optional (`'number?'`) and rest (`'...number'`) modifiers.
91
+ *
92
+ * @example
93
+ * ```typescript
94
+ * const RGBSchema = ['number', 'number', 'number'] as const satisfies TupleSchema;
95
+ * ```
96
+ */
97
+ export type TupleSchema = readonly string[];
98
+ /**
99
+ * Union of all types that can be used as a unit's base type.
100
+ * Includes primitives and non-primitive categories (enum, class, record, tuple).
101
+ */
102
+ export type SupportedType = PrimitiveType | EnumType | ClassType | RecordSchema | TupleSchema;
28
103
  export type PrimitiveTypeMap = {
29
104
  string: string;
30
105
  number: number;
31
106
  boolean: boolean;
32
107
  bigint: bigint;
33
108
  };
34
- export type ToPrimitiveType<T extends keyof PrimitiveTypeMap> = PrimitiveTypeMap[T];
35
- export type ToPrimitiveTypeName<T extends PrimitiveType> = T extends ToPrimitiveType<infer U> ? U : never;
36
- export type OptionalWithUnits<T extends PrimitiveType, M extends BaseMetadata = BaseMetadata> = T | WithUnits<T, M>;
37
- export type Unwrap<T> = T extends WithUnits<PrimitiveType, any> ? UnwrapTagged<T> : T;
109
+ export type ToPrimitiveTypeName<T> = T extends PrimitiveTypeMap[infer U extends keyof PrimitiveTypeMap] ? U : never;
110
+ export type OptionalWithUnits<T, M extends BaseMetadata = BaseMetadata> = T | WithUnits<T, M>;
111
+ export type Unwrap<T> = T extends AnyTaggedUnit ? UnwrapTagged<T> : T;
112
+ /**
113
+ * Resolve the callable argument types from a branded unit type.
114
+ *
115
+ * Uses the metadata's `type` field (the original schema/constructor) to
116
+ * determine the kind, then produces the appropriate parameter tuple:
117
+ * - **Tuple schemas** → spread members: `['number', 'string']` → `[number, string]`
118
+ * - **Class constructors** → spread constructor params: `ConstructorParameters<C>`
119
+ * - **Record schemas** → single object arg: `[{ x: number; y: number }]`
120
+ * - **Enum objects** → single value arg: `[LogLevel.WARN]`
121
+ * - **Primitives** → single arg: `[number]`
122
+ */
123
+ export type InferCallableArgs<From> = From extends AnyTaggedUnit ? GetTagMetadata<From, typeof UNITS> extends {
124
+ type: infer TypeField;
125
+ } ? TypeField extends readonly string[] ? InferFromTupleSchema<TypeField> : TypeField extends ClassType ? ConstructorParameters<TypeField> : TypeField extends RecordSchema ? TypeField[keyof TypeField] extends keyof PrimitiveTypeMap | RecordSchema ? [InferFromRecordSchema<TypeField>] : [TypeField[keyof TypeField]] : TypeField extends EnumType ? [TypeField[keyof TypeField]] : [Unwrap<From>] : [Unwrap<From>] : [Unwrap<From>];
38
126
  export type Relax<T> = T | Unwrap<T>;
39
127
  /**
40
128
  * Brand a value with a format identifier for compile-time format safety.
@@ -49,20 +137,14 @@ export type Relax<T> = T | Unwrap<T>;
49
137
  * ```
50
138
  */
51
139
  export type WithFormat<T, F extends string> = Tagged<T, typeof UNITS, F>;
52
- export type UnitsOf<T extends WithUnits<PrimitiveType, BaseMetadata>> = GetTagMetadata<T, typeof UNITS>;
53
- export type NameFor<T extends WithUnits<PrimitiveType, BaseMetadata>> = GetTagMetadata<T, typeof UNITS> extends {
140
+ export type UnitsOf<T> = T extends AnyTaggedUnit ? GetTagMetadata<T, typeof UNITS> : never;
141
+ export type NameFor<T> = T extends AnyTaggedUnit ? GetTagMetadata<T, typeof UNITS> extends {
54
142
  name: infer N extends string;
55
- } ? N : string;
143
+ } ? N : string : string;
56
144
  /** Alias for NameFor - returns the unit name type */
57
- export type UnitsFor<T extends WithUnits<PrimitiveType, BaseMetadata>> = NameFor<T>;
145
+ export type UnitsFor<T> = NameFor<T>;
58
146
  /** Extract metadata from a WithUnits type */
59
- export type MetadataOf<T extends WithUnits<PrimitiveType, BaseMetadata>> = GetTagMetadata<T, typeof UNITS> extends infer M ? M : BaseMetadata;
60
- export type UnitDefinition<T extends PrimitiveType, U, A, F extends string = never> = {
61
- type: ToPrimitiveTypeName<T>;
62
- name: U;
63
- abbreviation?: A;
64
- format?: F;
65
- };
147
+ export type MetadataOf<T> = T extends AnyTaggedUnit ? GetTagMetadata<T, typeof UNITS> extends infer M ? M : BaseMetadata : BaseMetadata;
66
148
  /**
67
149
  * Base metadata type that all unit metadata must extend.
68
150
  * Requires a `name` property and allows arbitrary additional properties.
@@ -80,10 +162,19 @@ export type BaseMetadata = {
80
162
  /** Unique identifier for the unit (replaces tag) */
81
163
  name: string;
82
164
  };
83
- export type TypedMetadata<T extends PrimitiveType = number> = Simplify<{
165
+ /**
166
+ * Metadata type for units with type information.
167
+ *
168
+ * For primitive types, `type` is the type name string (e.g., `'number'`).
169
+ * For non-primitive types, `type` IS the actual value:
170
+ * - Enum: the enum object itself
171
+ * - Class: the class constructor
172
+ * - Record: the schema object `{ x: 'number', y: 'string' }`
173
+ * - Tuple: the tuple schema array `['number', 'string']`
174
+ */
175
+ export type TypedMetadata<T extends SupportedType> = Simplify<{
84
176
  name: string;
85
- /** Data type name (e.g., "number", "string") */
86
- type: ToPrimitiveTypeName<T>;
177
+ type: T extends PrimitiveType ? ToPrimitiveTypeName<T> : T;
87
178
  }>;
88
179
  /**
89
180
  * Metadata that can be attached to units in the registry
@@ -102,4 +193,21 @@ export interface UnitMetadata {
102
193
  /** Allow arbitrary custom metadata properties */
103
194
  [key: string]: unknown;
104
195
  }
196
+ /**
197
+ * Map type name strings to TypeScript primitive types.
198
+ */
199
+ export type PrimitiveTypeFromName<T extends string> = T extends 'number' ? number : T extends 'string' ? string : T extends 'boolean' ? boolean : T extends 'bigint' ? bigint : never;
200
+ /**
201
+ * Infer TypeScript type from a `RecordSchema`.
202
+ * Recursively processes nested schemas.
203
+ */
204
+ export type InferFromRecordSchema<S extends RecordSchema> = Simplify<{
205
+ [K in keyof S]: S[K] extends string ? PrimitiveTypeFromName<S[K]> : S[K] extends RecordSchema ? InferFromRecordSchema<S[K]> : never;
206
+ }>;
207
+ /**
208
+ * Infer TypeScript type from a `TupleSchema`.
209
+ * Handles optional (`?`) and rest (`...`) elements.
210
+ */
211
+ export type InferFromTupleSchema<T extends readonly string[]> = T extends readonly [] ? [] : T extends readonly [infer Head extends string, ...infer Rest extends readonly string[]] ? Head extends `...${infer Base}` ? Rest extends readonly [] ? [...Array<PrimitiveTypeFromName<Base>>] : never : Head extends `${infer Base}?` ? [PrimitiveTypeFromName<Base>?, ...InferFromTupleSchema<Rest>] : [PrimitiveTypeFromName<Head>, ...InferFromTupleSchema<Rest>] : never;
212
+ export {};
105
213
  //# sourceMappingURL=types.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,cAAc,EAAE,QAAQ,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,WAAW,CAAC;AAEhF,eAAO,MAAM,KAAK,EAAE,OAAO,MAAwB,CAAC;AAEpD,eAAO,MAAM,UAAU,EAAE,OAAO,MAA6B,CAAC;AAE9D;;;IAGI;AAEJ,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,aAAa,CAAC,GAAG,CAAC,IAAI,SAAS,CAAC,eAAe,CAAC,CAAC,CAAC,MAAM,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEpG;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,aAAa,EAAE,CAAC,SAAS,YAAY,GAAG,aAAa,CAAC,CAAC,CAAC,IAAI,MAAM,CAChG,CAAC,EACD,OAAO,KAAK,EACZ,CAAC,CACF,CAAC;AAEF,MAAM,MAAM,aAAa,GAAG,MAAM,GAAG,MAAM,GAAG,OAAO,GAAG,MAAM,CAAC;AAE/D,MAAM,MAAM,gBAAgB,GAAG;IAC7B,MAAM,EAAE,MAAM,CAAC;IACf,MAAM,EAAE,MAAM,CAAC;IACf,OAAO,EAAE,OAAO,CAAC;IACjB,MAAM,EAAE,MAAM,CAAC;CAChB,CAAC;AAEF,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,MAAM,gBAAgB,IAAI,gBAAgB,CAAC,CAAC,CAAC,CAAC;AAEpF,MAAM,MAAM,mBAAmB,CAAC,CAAC,SAAS,aAAa,IACrD,CAAC,SAAS,eAAe,CAAC,MAAM,CAAC,CAAC,GAAG,CAAC,GAAG,KAAK,CAAC;AAEjD,MAAM,MAAM,iBAAiB,CAAC,CAAC,SAAS,aAAa,EAAE,CAAC,SAAS,YAAY,GAAG,YAAY,IACxF,CAAC,GACD,SAAS,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC;AAEpB,MAAM,MAAM,MAAM,CAAC,CAAC,IAAI,CAAC,SAAS,SAAS,CAAC,aAAa,EAAE,GAAG,CAAC,GAAG,YAAY,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC;AAEtF,MAAM,MAAM,KAAK,CAAC,CAAC,IAAI,CAAC,GAAG,MAAM,CAAC,CAAC,CAAC,CAAC;AACrC;;;;;;;;;;;GAWG;AACH,MAAM,MAAM,UAAU,CAAC,CAAC,EAAE,CAAC,SAAS,MAAM,IAAI,MAAM,CAAC,CAAC,EAAE,OAAO,KAAK,EAAE,CAAC,CAAC,CAAC;AAEzE,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC,IAAI,cAAc,CACpF,CAAC,EACD,OAAO,KAAK,CACb,CAAC;AAEF,MAAM,MAAM,OAAO,CAAC,CAAC,SAAS,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC,IAAI,cAAc,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,SAAS;IAC9G,IAAI,EAAE,MAAM,CAAC,SAAS,MAAM,CAAC;CAC9B,GACG,CAAC,GACD,MAAM,CAAC;AAEX,qDAAqD;AACrD,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC,IAAI,OAAO,CAAC,CAAC,CAAC,CAAC;AAEpF,6CAA6C;AAC7C,MAAM,MAAM,UAAU,CAAC,CAAC,SAAS,SAAS,CAAC,aAAa,EAAE,YAAY,CAAC,IAAI,cAAc,CAAC,CAAC,EAAE,OAAO,KAAK,CAAC,SAAS,MAAM,CAAC,GAAG,CAAC,GAAG,YAAY,CAAC;AAC9I,MAAM,MAAM,cAAc,CAAC,CAAC,SAAS,aAAa,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,SAAS,MAAM,GAAG,KAAK,IAAI;IACpF,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;IAC7B,IAAI,EAAE,CAAC,CAAC;IACR,YAAY,CAAC,EAAE,CAAC,CAAC;IACjB,MAAM,CAAC,EAAE,CAAC,CAAC;CACZ,CAAC;AAEF;;;;;;;;;;;;GAYG;AACH,MAAM,MAAM,YAAY,GAAG;IACzB,oDAAoD;IACpD,IAAI,EAAE,MAAM,CAAC;CACd,CAAC;AAEF,MAAM,MAAM,aAAa,CAAC,CAAC,SAAS,aAAa,GAAG,MAAM,IAAI,QAAQ,CAAC;IACrE,IAAI,EAAE,MAAM,CAAC;IACb,gDAAgD;IAChD,IAAI,EAAE,mBAAmB,CAAC,CAAC,CAAC,CAAC;CAC9B,CAAC,CAAC;AACH;;;;GAIG;AACH,MAAM,WAAW,YAAY;IAC3B,+DAA8D;IAC9D,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,gEAA+D;IAC/D,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,6CAA6C;IAC7C,WAAW,CAAC,EAAE,MAAM,CAAC;IACrB,wCAAwC;IACxC,MAAM,CAAC,EAAE,MAAM,CAAC;IAChB,iDAAiD;IACjD,CAAC,GAAG,EAAE,MAAM,GAAG,OAAO,CAAC;CACxB"}
1
+ {"version":3,"file":"types.d.ts","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"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"}
package/dist/types.js.map CHANGED
@@ -1 +1 @@
1
- {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,MAAM,CAAC,MAAM,KAAK,GAAkB,MAAM,CAAC,OAAO,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,UAAU,GAAkB,MAAM,CAAC,YAAY,CAAC,CAAC"}
1
+ {"version":3,"file":"types.js","sourceRoot":"","sources":["../src/types.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAWH,MAAM,CAAC,MAAM,KAAK,GAAkB,MAAM,CAAC,OAAO,CAAC,CAAC;AAEpD,MAAM,CAAC,MAAM,UAAU,GAAkB,MAAM,CAAC,YAAY,CAAC,CAAC"}
@@ -4,6 +4,7 @@
4
4
  */
5
5
  import type { Parser } from '../formatters.js';
6
6
  import type { WithFormat } from '../types.js';
7
+ import type { EnumType, ClassType, RecordSchema, TupleSchema, TypedMetadata } from '../types.js';
7
8
  /**
8
9
  * Create a parser with Zod schema validation.
9
10
  *
@@ -22,4 +23,109 @@ import type { WithFormat } from '../types.js';
22
23
  * ```
23
24
  */
24
25
  export declare function createParserWithSchema<F extends string, T>(schema: any, format: F): Parser<WithFormat<T, F>>;
26
+ /**
27
+ * Validate that a runtime value is a valid TypeScript enum object.
28
+ *
29
+ * Accepts numeric enums (with reverse-mapped keys filtered out) and
30
+ * string enums. Rejects empty objects and mixed enums whose forward
31
+ * entries contain both string and number values.
32
+ *
33
+ * @param value - The value to validate
34
+ * @returns `true` if `value` is a valid `EnumType`
35
+ * @throws {Error} If the enum contains both numeric and string members
36
+ *
37
+ * @example
38
+ * ```typescript
39
+ * enum LogLevel { DEBUG = 0, INFO = 1 }
40
+ * validateEnum(LogLevel); // true
41
+ * validateEnum({}); // false
42
+ * ```
43
+ */
44
+ export declare function validateEnum(value: unknown): value is EnumType;
45
+ /**
46
+ * Validate that a runtime value is a valid class constructor.
47
+ *
48
+ * Checks that the value is a function with a `prototype` property.
49
+ * Arrow functions and bound functions without prototypes are rejected.
50
+ *
51
+ * @param value - The value to validate
52
+ * @returns `true` if `value` is a valid `ClassType` constructor
53
+ */
54
+ export declare function validateClass(value: unknown): value is ClassType;
55
+ /**
56
+ * Validate that a runtime value is a valid record schema.
57
+ *
58
+ * A valid record schema is a plain object whose leaf values are primitive
59
+ * type name strings (`'number'`, `'string'`, `'boolean'`, `'bigint'`) or
60
+ * nested record schema objects. Empty objects are accepted.
61
+ *
62
+ * @param value - The value to validate
63
+ * @param visited - Internal set for circular reference detection
64
+ * @returns `true` if `value` is a valid `RecordSchema`
65
+ * @throws {Error} If circular references or invalid type names are found
66
+ *
67
+ * @example
68
+ * ```typescript
69
+ * validateRecordSchema({ x: 'number', y: 'number' }); // true
70
+ * validateRecordSchema({ pos: { x: 'number' } }); // true (nested)
71
+ * ```
72
+ */
73
+ export declare function validateRecordSchema(value: unknown, visited?: Set<unknown>): value is RecordSchema;
74
+ /**
75
+ * Validate that a runtime value is a valid tuple schema.
76
+ *
77
+ * A valid tuple schema is an array of primitive type name strings,
78
+ * optionally annotated with `?` (optional) or `...` (rest) modifiers.
79
+ * Empty arrays are accepted.
80
+ *
81
+ * @param value - The value to validate
82
+ * @returns `true` if `value` is a valid `TupleSchema`
83
+ * @throws {Error} If elements are not strings or contain invalid type names
84
+ *
85
+ * @example
86
+ * ```typescript
87
+ * validateTupleSchema(['number', 'number', 'number']); // true
88
+ * validateTupleSchema(['string', 'number?']); // true (optional)
89
+ * validateTupleSchema(['number', '...string']); // true (rest)
90
+ * ```
91
+ */
92
+ export declare function validateTupleSchema(value: unknown): value is TupleSchema;
93
+ /**
94
+ * Type guard: returns `true` when `meta.type` is an enum object.
95
+ *
96
+ * Distinguishes enums from record schemas by first checking whether the
97
+ * value passes `validateRecordSchema`; if it does, the metadata is
98
+ * classified as a record, not an enum.
99
+ *
100
+ * @param meta - Metadata object to inspect
101
+ */
102
+ export declare function isEnumMetadata(meta: unknown): meta is TypedMetadata<EnumType>;
103
+ /**
104
+ * Type guard: returns `true` when `meta.type` is a class constructor.
105
+ *
106
+ * @param meta - Metadata object to inspect
107
+ */
108
+ export declare function isClassMetadata(meta: unknown): meta is TypedMetadata<ClassType>;
109
+ /**
110
+ * Type guard: returns `true` when `meta.type` is a record schema object.
111
+ *
112
+ * @param meta - Metadata object to inspect
113
+ */
114
+ export declare function isRecordMetadata(meta: unknown): meta is TypedMetadata<RecordSchema>;
115
+ /**
116
+ * Type guard: returns `true` when `meta.type` is a tuple schema array.
117
+ *
118
+ * @param meta - Metadata object to inspect
119
+ */
120
+ export declare function isTupleMetadata(meta: unknown): meta is TypedMetadata<TupleSchema>;
121
+ /**
122
+ * Detect the kind of a metadata object by inspecting its `type` field.
123
+ *
124
+ * Resolution priority: `primitive` → `class` → `tuple` → `record` → `enum`.
125
+ * Returns `'unknown'` when the value is not a recognised metadata shape.
126
+ *
127
+ * @param meta - Metadata object to categorise
128
+ * @returns The detected kind string
129
+ */
130
+ export declare function detectMetadataKind(meta: unknown): 'primitive' | 'enum' | 'class' | 'tuple' | 'record' | 'unknown';
25
131
  //# sourceMappingURL=validation.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAG9C;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EACxD,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,CAAC,GACR,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAU1B"}
1
+ {"version":3,"file":"validation.d.ts","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,MAAM,EAAE,MAAM,kBAAkB,CAAC;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjG;;;;;;;;;;;;;;;;GAgBG;AACH,wBAAgB,sBAAsB,CAAC,CAAC,SAAS,MAAM,EAAE,CAAC,EACxD,MAAM,EAAE,GAAG,EACX,MAAM,EAAE,CAAC,GACR,MAAM,CAAC,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,CAU1B;AAMD;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CA0C9D;AAED;;;;;;;;GAQG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAWhE;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,GAAG,CAAC,OAAO,CAAa,GAChC,KAAK,IAAI,YAAY,CA8CvB;AAED;;;;;;;;;;;;;;;;;GAiBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAoCxE;AAMD;;;;;;;;GAQG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAAC,QAAQ,CAAC,CA6B7E;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAAC,SAAS,CAAC,CAO/E;AAED;;;;GAIG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAAC,YAAY,CAAC,CAkBnF;AAED;;;;GAIG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAAC,WAAW,CAAC,CAajF;AAED;;;;;;;;GAQG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,GACZ,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CA4CjE"}
@@ -32,4 +32,321 @@ export function createParserWithSchema(schema, format) {
32
32
  }
33
33
  };
34
34
  }
35
+ // ============================================================================
36
+ // Non-Primitive Type Validation
37
+ // ============================================================================
38
+ /**
39
+ * Validate that a runtime value is a valid TypeScript enum object.
40
+ *
41
+ * Accepts numeric enums (with reverse-mapped keys filtered out) and
42
+ * string enums. Rejects empty objects and mixed enums whose forward
43
+ * entries contain both string and number values.
44
+ *
45
+ * @param value - The value to validate
46
+ * @returns `true` if `value` is a valid `EnumType`
47
+ * @throws {Error} If the enum contains both numeric and string members
48
+ *
49
+ * @example
50
+ * ```typescript
51
+ * enum LogLevel { DEBUG = 0, INFO = 1 }
52
+ * validateEnum(LogLevel); // true
53
+ * validateEnum({}); // false
54
+ * ```
55
+ */
56
+ export function validateEnum(value) {
57
+ if (typeof value !== 'object' || value === null) {
58
+ return false;
59
+ }
60
+ const enumObj = value;
61
+ const entries = Object.entries(enumObj);
62
+ // Reject empty objects that aren't real enums
63
+ if (entries.length === 0) {
64
+ return false;
65
+ }
66
+ // For numeric enums, TypeScript creates reverse mappings:
67
+ // enum LogLevel { DEBUG = 0 } becomes { DEBUG: 0, 0: 'DEBUG' }
68
+ // We need to filter out the reverse mappings to detect actual mixed enums
69
+ // Separate forward and reverse mappings
70
+ const forwardEntries = entries.filter(([key, _val]) => {
71
+ // Forward mapping: string key -> number/string value
72
+ return isNaN(Number(key));
73
+ });
74
+ // If no forward entries, this isn't a valid enum
75
+ if (forwardEntries.length === 0) {
76
+ return false;
77
+ }
78
+ // Check if all forward values are numbers or all are strings
79
+ const values = forwardEntries.map(([, val]) => val);
80
+ const numericValues = values.filter((v) => typeof v === 'number');
81
+ const stringValues = values.filter((v) => typeof v === 'string');
82
+ // Reject true mixed enums (not counting reverse mappings)
83
+ if (numericValues.length > 0 && stringValues.length > 0) {
84
+ throw new Error('Mixed enums (with both numeric and string members) are not supported. ' +
85
+ 'Please use either numeric or string values consistently.');
86
+ }
87
+ return numericValues.length > 0 || stringValues.length > 0;
88
+ }
89
+ /**
90
+ * Validate that a runtime value is a valid class constructor.
91
+ *
92
+ * Checks that the value is a function with a `prototype` property.
93
+ * Arrow functions and bound functions without prototypes are rejected.
94
+ *
95
+ * @param value - The value to validate
96
+ * @returns `true` if `value` is a valid `ClassType` constructor
97
+ */
98
+ export function validateClass(value) {
99
+ if (typeof value !== 'function') {
100
+ return false;
101
+ }
102
+ // Check for prototype
103
+ if (!('prototype' in value)) {
104
+ return false;
105
+ }
106
+ return true;
107
+ }
108
+ /**
109
+ * Validate that a runtime value is a valid record schema.
110
+ *
111
+ * A valid record schema is a plain object whose leaf values are primitive
112
+ * type name strings (`'number'`, `'string'`, `'boolean'`, `'bigint'`) or
113
+ * nested record schema objects. Empty objects are accepted.
114
+ *
115
+ * @param value - The value to validate
116
+ * @param visited - Internal set for circular reference detection
117
+ * @returns `true` if `value` is a valid `RecordSchema`
118
+ * @throws {Error} If circular references or invalid type names are found
119
+ *
120
+ * @example
121
+ * ```typescript
122
+ * validateRecordSchema({ x: 'number', y: 'number' }); // true
123
+ * validateRecordSchema({ pos: { x: 'number' } }); // true (nested)
124
+ * ```
125
+ */
126
+ export function validateRecordSchema(value, visited = new Set()) {
127
+ if (typeof value !== 'object' || value === null || Array.isArray(value)) {
128
+ return false;
129
+ }
130
+ // Detect circular references
131
+ if (visited.has(value)) {
132
+ throw new Error('Circular references in record schemas are not supported. ' +
133
+ 'Please restructure your schema to avoid self-referential structures.');
134
+ }
135
+ visited.add(value);
136
+ const schema = value;
137
+ // Allow empty records
138
+ if (Object.keys(schema).length === 0) {
139
+ return true;
140
+ }
141
+ // Validate all property values
142
+ for (const [key, propValue] of Object.entries(schema)) {
143
+ if (typeof propValue === 'string') {
144
+ // Must be a valid primitive type name
145
+ if (!['number', 'string', 'boolean', 'bigint'].includes(propValue)) {
146
+ throw new Error(`Invalid type name "${propValue}" for property "${key}". ` +
147
+ 'Expected: "number", "string", "boolean", or "bigint".');
148
+ }
149
+ }
150
+ else if (typeof propValue === 'object' && propValue !== null) {
151
+ // Recursively validate nested schema
152
+ if (!validateRecordSchema(propValue, new Set(visited))) {
153
+ return false;
154
+ }
155
+ }
156
+ else {
157
+ throw new Error(`Invalid schema value for property "${key}". ` +
158
+ 'Expected a type name string or nested schema object.');
159
+ }
160
+ }
161
+ return true;
162
+ }
163
+ /**
164
+ * Validate that a runtime value is a valid tuple schema.
165
+ *
166
+ * A valid tuple schema is an array of primitive type name strings,
167
+ * optionally annotated with `?` (optional) or `...` (rest) modifiers.
168
+ * Empty arrays are accepted.
169
+ *
170
+ * @param value - The value to validate
171
+ * @returns `true` if `value` is a valid `TupleSchema`
172
+ * @throws {Error} If elements are not strings or contain invalid type names
173
+ *
174
+ * @example
175
+ * ```typescript
176
+ * validateTupleSchema(['number', 'number', 'number']); // true
177
+ * validateTupleSchema(['string', 'number?']); // true (optional)
178
+ * validateTupleSchema(['number', '...string']); // true (rest)
179
+ * ```
180
+ */
181
+ export function validateTupleSchema(value) {
182
+ if (!Array.isArray(value)) {
183
+ return false;
184
+ }
185
+ // Allow empty tuples
186
+ if (value.length === 0) {
187
+ return true;
188
+ }
189
+ // Validate each element
190
+ for (let i = 0; i < value.length; i++) {
191
+ const element = value[i];
192
+ if (typeof element !== 'string') {
193
+ throw new Error(`Tuple element at index ${i} must be a string, got ${typeof element}.`);
194
+ }
195
+ // Parse optional (?) and rest (...) modifiers
196
+ let typeName = element;
197
+ if (element.endsWith('?')) {
198
+ typeName = element.slice(0, -1);
199
+ }
200
+ else if (element.startsWith('...')) {
201
+ typeName = element.slice(3);
202
+ }
203
+ // Validate base type name
204
+ if (!['number', 'string', 'boolean', 'bigint'].includes(typeName)) {
205
+ throw new Error(`Invalid type name "${typeName}" at tuple index ${i}. ` +
206
+ 'Expected: "number", "string", "boolean", or "bigint".');
207
+ }
208
+ }
209
+ return true;
210
+ }
211
+ // ============================================================================
212
+ // Type Guards for Metadata
213
+ // ============================================================================
214
+ /**
215
+ * Type guard: returns `true` when `meta.type` is an enum object.
216
+ *
217
+ * Distinguishes enums from record schemas by first checking whether the
218
+ * value passes `validateRecordSchema`; if it does, the metadata is
219
+ * classified as a record, not an enum.
220
+ *
221
+ * @param meta - Metadata object to inspect
222
+ */
223
+ export function isEnumMetadata(meta) {
224
+ if (typeof meta !== 'object' || meta === null || !('type' in meta)) {
225
+ return false;
226
+ }
227
+ const { type } = meta;
228
+ // Enum type is an object (not array, not null) that passes validateEnum
229
+ if (typeof type !== 'object' || type === null || Array.isArray(type)) {
230
+ return false;
231
+ }
232
+ // If the object is a valid record schema, it's NOT an enum.
233
+ // Record schemas have values from {'number','string','boolean','bigint'} or nested objects,
234
+ // which would also pass validateEnum (looks like a string enum). Disambiguate here.
235
+ try {
236
+ if (validateRecordSchema(type)) {
237
+ return false;
238
+ }
239
+ }
240
+ catch {
241
+ // Circular ref or invalid record schema — not a record, continue to enum check
242
+ }
243
+ // Use validateEnum but catch errors (mixed enums throw)
244
+ try {
245
+ return validateEnum(type);
246
+ }
247
+ catch {
248
+ return false;
249
+ }
250
+ }
251
+ /**
252
+ * Type guard: returns `true` when `meta.type` is a class constructor.
253
+ *
254
+ * @param meta - Metadata object to inspect
255
+ */
256
+ export function isClassMetadata(meta) {
257
+ if (typeof meta !== 'object' || meta === null || !('type' in meta)) {
258
+ return false;
259
+ }
260
+ const { type } = meta;
261
+ return validateClass(type);
262
+ }
263
+ /**
264
+ * Type guard: returns `true` when `meta.type` is a record schema object.
265
+ *
266
+ * @param meta - Metadata object to inspect
267
+ */
268
+ export function isRecordMetadata(meta) {
269
+ if (typeof meta !== 'object' || meta === null || !('type' in meta)) {
270
+ return false;
271
+ }
272
+ const { type } = meta;
273
+ // Must be a non-null object (not array)
274
+ if (typeof type !== 'object' || type === null || Array.isArray(type)) {
275
+ return false;
276
+ }
277
+ // Use validateRecordSchema but catch errors
278
+ try {
279
+ return validateRecordSchema(type);
280
+ }
281
+ catch {
282
+ return false;
283
+ }
284
+ }
285
+ /**
286
+ * Type guard: returns `true` when `meta.type` is a tuple schema array.
287
+ *
288
+ * @param meta - Metadata object to inspect
289
+ */
290
+ export function isTupleMetadata(meta) {
291
+ if (typeof meta !== 'object' || meta === null || !('type' in meta)) {
292
+ return false;
293
+ }
294
+ const { type } = meta;
295
+ // Use validateTupleSchema but catch errors
296
+ try {
297
+ return validateTupleSchema(type);
298
+ }
299
+ catch {
300
+ return false;
301
+ }
302
+ }
303
+ /**
304
+ * Detect the kind of a metadata object by inspecting its `type` field.
305
+ *
306
+ * Resolution priority: `primitive` → `class` → `tuple` → `record` → `enum`.
307
+ * Returns `'unknown'` when the value is not a recognised metadata shape.
308
+ *
309
+ * @param meta - Metadata object to categorise
310
+ * @returns The detected kind string
311
+ */
312
+ export function detectMetadataKind(meta) {
313
+ if (typeof meta !== 'object' || meta === null || !('type' in meta)) {
314
+ return 'unknown';
315
+ }
316
+ const { type } = meta;
317
+ // Primitive: type is a string like 'number', 'string', 'boolean', 'bigint'
318
+ if (typeof type === 'string') {
319
+ return 'primitive';
320
+ }
321
+ // Class: type is a function (constructor)
322
+ if (typeof type === 'function') {
323
+ return 'class';
324
+ }
325
+ // Tuple: type is an array
326
+ if (Array.isArray(type)) {
327
+ return 'tuple';
328
+ }
329
+ // Object: could be enum or record
330
+ if (typeof type === 'object' && type !== null) {
331
+ // Try record first (stricter: values must be type-name strings or nested objects)
332
+ try {
333
+ if (validateRecordSchema(type)) {
334
+ return 'record';
335
+ }
336
+ }
337
+ catch {
338
+ // Not a valid record schema
339
+ }
340
+ // Try enum
341
+ try {
342
+ if (validateEnum(type)) {
343
+ return 'enum';
344
+ }
345
+ }
346
+ catch {
347
+ // Not a valid enum either
348
+ }
349
+ }
350
+ return 'unknown';
351
+ }
35
352
  //# sourceMappingURL=validation.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAIH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C;;;;;;;;;;;;;;;;GAgBG;AACH,MAAM,UAAU,sBAAsB,CACpC,MAAW,EACX,MAAS,EACiB;IAC1B,OAAO,CAAC,KAAa,EAAoB,EAAE,CAAC;QAC1C,IAAI,CAAC;YACH,MAAM,SAAS,GAAG,MAAM,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YACtC,OAAO,SAA6B,CAAC;QACvC,CAAC;QAAC,OAAO,GAAG,EAAE,CAAC;YACb,MAAM,OAAO,GAAG,GAAG,YAAY,KAAK,CAAC,CAAC,CAAC,GAAG,CAAC,OAAO,CAAC,CAAC,CAAC,MAAM,CAAC,GAAG,CAAC,CAAC;YACjE,MAAM,IAAI,UAAU,CAAC,MAAM,EAAE,KAAK,EAAE,OAAO,CAAC,CAAC;QAC/C,CAAC;IAAA,CACF,CAAC;AAAA,CACH"}
1
+ {"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
package/package.json CHANGED
@@ -1,11 +1,19 @@
1
1
  {
2
2
  "name": "unacy",
3
- "version": "0.7.0",
3
+ "version": "0.8.1",
4
4
  "description": "Type-safe unit and format conversion library",
5
5
  "type": "module",
6
6
  "private": false,
7
7
  "author": "Pradeep Mouli",
8
8
  "license": "MIT",
9
+ "repository": {
10
+ "type": "git",
11
+ "url": "https://github.com/pradeepmouli/unacy.git"
12
+ },
13
+ "homepage": "https://github.com/pradeepmouli/unacy#readme",
14
+ "bugs": {
15
+ "url": "https://github.com/pradeepmouli/unacy/issues"
16
+ },
9
17
  "main": "./dist/index.js",
10
18
  "module": "./dist/index.js",
11
19
  "types": "./dist/index.d.ts",
@@ -20,23 +28,23 @@
20
28
  "README.md"
21
29
  ],
22
30
  "dependencies": {
23
- "type-fest": "^5.4.1"
31
+ "type-fest": "^5.4.4"
24
32
  },
25
33
  "devDependencies": {
26
- "@types/node": "^25.0.9",
27
- "@typescript/native-preview": "7.0.0-dev.20260120.1",
28
- "vitest": "^4.0.17"
34
+ "@types/node": "^25.3.1",
35
+ "@typescript/native-preview": "7.0.0-dev.20260225.1",
36
+ "vitest": "^4.0.18"
29
37
  },
30
38
  "engines": {
31
39
  "node": ">=20.0.0"
32
40
  },
33
41
  "optionalDependencies": {
34
- "zod": "^4.3.5"
42
+ "zod": "^4.3.6"
35
43
  },
36
44
  "scripts": {
37
45
  "build": "tsgo -p tsconfig.json",
38
- "clean": "rm -rf dist",
39
- "type-check": "tsc --noEmit",
46
+ "clean": "rm -rf dist tsconfig.tsbuildinfo",
47
+ "type-check": "tsgo --noEmit",
40
48
  "test": "vitest run",
41
49
  "test:watch": "vitest"
42
50
  }