unacy 0.8.1 → 0.8.2
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/dist/converters.d.ts +106 -17
- package/dist/converters.d.ts.map +1 -1
- package/dist/errors.d.ts +132 -5
- package/dist/errors.d.ts.map +1 -1
- package/dist/errors.js +132 -5
- package/dist/errors.js.map +1 -1
- package/dist/formatters.d.ts +96 -32
- package/dist/formatters.d.ts.map +1 -1
- package/dist/registry.d.ts +151 -21
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +52 -15
- package/dist/registry.js.map +1 -1
- package/dist/types.d.ts +275 -12
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -1
- package/dist/utils/graph.d.ts +72 -10
- package/dist/utils/graph.d.ts.map +1 -1
- package/dist/utils/graph.js +72 -10
- package/dist/utils/graph.js.map +1 -1
- package/dist/utils/validation.d.ts +73 -7
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +73 -7
- package/dist/utils/validation.js.map +1 -1
- package/package.json +7 -7
package/dist/utils/graph.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/utils/graph.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,EAAE,UAAU,EAAE,aAAa,EAAE,MAAM,cAAc,CAAC;AAGzD;;GAEG;AACH,MAAM,SAAS,GAAG,CAAC,CAAC;AAEpB
|
|
1
|
+
{"version":3,"file":"graph.js","sourceRoot":"","sources":["../../src/utils/graph.ts"],"names":[],"mappings":"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"}
|
|
@@ -6,21 +6,48 @@ import type { Parser } from '../formatters.js';
|
|
|
6
6
|
import type { WithFormat } from '../types.js';
|
|
7
7
|
import type { EnumType, ClassType, RecordSchema, TupleSchema, TypedMetadata } from '../types.js';
|
|
8
8
|
/**
|
|
9
|
-
* Create a
|
|
9
|
+
* Create a `Parser<WithFormat<T, F>>` backed by a Zod-compatible schema.
|
|
10
10
|
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
*
|
|
14
|
-
*
|
|
15
|
-
* @
|
|
11
|
+
* Wraps a Zod (or Zod-compatible) schema's `.parse()` method to produce a
|
|
12
|
+
* typed `Parser`. On schema rejection, the Zod error message is re-thrown
|
|
13
|
+
* as a `ParseError` so callers always receive a consistent error type.
|
|
14
|
+
*
|
|
15
|
+
* @template F - Format identifier string literal (e.g., `'HexColor'`)
|
|
16
|
+
* @template T - Base runtime type that the schema validates into
|
|
17
|
+
* @param schema - Any object with a `.parse(input: string)` method (Zod schema)
|
|
18
|
+
* @param format - Format identifier used in thrown `ParseError` instances
|
|
19
|
+
* @returns Parser function that validates and tags values as `WithFormat<T, F>`
|
|
20
|
+
*
|
|
21
|
+
* @throws {ParseError} When `schema.parse` rejects the input
|
|
16
22
|
*
|
|
17
23
|
* @example
|
|
18
24
|
* ```typescript
|
|
19
|
-
*
|
|
25
|
+
* import { z } from 'zod';
|
|
26
|
+
* import { createParserWithSchema } from 'unacy';
|
|
27
|
+
*
|
|
28
|
+
* type HexColor = WithFormat<string, 'HexColor'>;
|
|
29
|
+
* const parseHex = createParserWithSchema<'HexColor', string>(
|
|
20
30
|
* z.string().regex(/^#[0-9A-Fa-f]{6}$/),
|
|
21
31
|
* 'HexColor'
|
|
22
32
|
* );
|
|
33
|
+
*
|
|
34
|
+
* parseHex('#ff0000'); // OK → tagged as HexColor
|
|
35
|
+
* parseHex('red'); // throws ParseError
|
|
23
36
|
* ```
|
|
37
|
+
*
|
|
38
|
+
* @useWhen You already have a Zod schema for a format and want to produce a
|
|
39
|
+
* typed `Parser` with minimal boilerplate.
|
|
40
|
+
*
|
|
41
|
+
* @avoidWhen Your validation logic cannot be expressed as a Zod schema — write
|
|
42
|
+
* a custom `Parser<T>` instead, throwing `ParseError` on failure.
|
|
43
|
+
*
|
|
44
|
+
* @pitfalls
|
|
45
|
+
* NEVER pass a schema whose `.parse()` does not throw on invalid input — the
|
|
46
|
+
* returned parser relies on schema rejection to trigger `ParseError`.
|
|
47
|
+
*
|
|
48
|
+
* @category Validation
|
|
49
|
+
* @see Parser
|
|
50
|
+
* @see ParseError
|
|
24
51
|
*/
|
|
25
52
|
export declare function createParserWithSchema<F extends string, T>(schema: any, format: F): Parser<WithFormat<T, F>>;
|
|
26
53
|
/**
|
|
@@ -40,6 +67,16 @@ export declare function createParserWithSchema<F extends string, T>(schema: any,
|
|
|
40
67
|
* validateEnum(LogLevel); // true
|
|
41
68
|
* validateEnum({}); // false
|
|
42
69
|
* ```
|
|
70
|
+
*
|
|
71
|
+
* @useWhen You are receiving a runtime value and need to confirm it is a valid
|
|
72
|
+
* TypeScript enum before using it as a `TypedMetadata<EnumType>.type` field.
|
|
73
|
+
*
|
|
74
|
+
* @pitfalls
|
|
75
|
+
* NEVER use `validateEnum` to check plain objects that happen to have string
|
|
76
|
+
* values — they may look like string enums but carry no semantic meaning.
|
|
77
|
+
* Use `validateRecordSchema` for plain data objects.
|
|
78
|
+
*
|
|
79
|
+
* @category Validation
|
|
43
80
|
*/
|
|
44
81
|
export declare function validateEnum(value: unknown): value is EnumType;
|
|
45
82
|
/**
|
|
@@ -50,6 +87,8 @@ export declare function validateEnum(value: unknown): value is EnumType;
|
|
|
50
87
|
*
|
|
51
88
|
* @param value - The value to validate
|
|
52
89
|
* @returns `true` if `value` is a valid `ClassType` constructor
|
|
90
|
+
*
|
|
91
|
+
* @category Validation
|
|
53
92
|
*/
|
|
54
93
|
export declare function validateClass(value: unknown): value is ClassType;
|
|
55
94
|
/**
|
|
@@ -69,6 +108,8 @@ export declare function validateClass(value: unknown): value is ClassType;
|
|
|
69
108
|
* validateRecordSchema({ x: 'number', y: 'number' }); // true
|
|
70
109
|
* validateRecordSchema({ pos: { x: 'number' } }); // true (nested)
|
|
71
110
|
* ```
|
|
111
|
+
*
|
|
112
|
+
* @category Validation
|
|
72
113
|
*/
|
|
73
114
|
export declare function validateRecordSchema(value: unknown, visited?: Set<unknown>): value is RecordSchema;
|
|
74
115
|
/**
|
|
@@ -88,6 +129,8 @@ export declare function validateRecordSchema(value: unknown, visited?: Set<unkno
|
|
|
88
129
|
* validateTupleSchema(['string', 'number?']); // true (optional)
|
|
89
130
|
* validateTupleSchema(['number', '...string']); // true (rest)
|
|
90
131
|
* ```
|
|
132
|
+
*
|
|
133
|
+
* @category Validation
|
|
91
134
|
*/
|
|
92
135
|
export declare function validateTupleSchema(value: unknown): value is TupleSchema;
|
|
93
136
|
/**
|
|
@@ -98,24 +141,28 @@ export declare function validateTupleSchema(value: unknown): value is TupleSchem
|
|
|
98
141
|
* classified as a record, not an enum.
|
|
99
142
|
*
|
|
100
143
|
* @param meta - Metadata object to inspect
|
|
144
|
+
* @category Validation
|
|
101
145
|
*/
|
|
102
146
|
export declare function isEnumMetadata(meta: unknown): meta is TypedMetadata<EnumType>;
|
|
103
147
|
/**
|
|
104
148
|
* Type guard: returns `true` when `meta.type` is a class constructor.
|
|
105
149
|
*
|
|
106
150
|
* @param meta - Metadata object to inspect
|
|
151
|
+
* @category Validation
|
|
107
152
|
*/
|
|
108
153
|
export declare function isClassMetadata(meta: unknown): meta is TypedMetadata<ClassType>;
|
|
109
154
|
/**
|
|
110
155
|
* Type guard: returns `true` when `meta.type` is a record schema object.
|
|
111
156
|
*
|
|
112
157
|
* @param meta - Metadata object to inspect
|
|
158
|
+
* @category Validation
|
|
113
159
|
*/
|
|
114
160
|
export declare function isRecordMetadata(meta: unknown): meta is TypedMetadata<RecordSchema>;
|
|
115
161
|
/**
|
|
116
162
|
* Type guard: returns `true` when `meta.type` is a tuple schema array.
|
|
117
163
|
*
|
|
118
164
|
* @param meta - Metadata object to inspect
|
|
165
|
+
* @category Validation
|
|
119
166
|
*/
|
|
120
167
|
export declare function isTupleMetadata(meta: unknown): meta is TypedMetadata<TupleSchema>;
|
|
121
168
|
/**
|
|
@@ -126,6 +173,25 @@ export declare function isTupleMetadata(meta: unknown): meta is TypedMetadata<Tu
|
|
|
126
173
|
*
|
|
127
174
|
* @param meta - Metadata object to categorise
|
|
128
175
|
* @returns The detected kind string
|
|
176
|
+
*
|
|
177
|
+
* @remarks
|
|
178
|
+
* Resolution priority order: `primitive` → `class` → `tuple` → `record` → `enum` → `unknown`.
|
|
179
|
+
* This ordering is important: a class constructor would otherwise match the object check,
|
|
180
|
+
* and a tuple schema (array) would match the record check, so the dispatcher checks
|
|
181
|
+
* the more specific types first.
|
|
182
|
+
*
|
|
183
|
+
* @example
|
|
184
|
+
* ```typescript
|
|
185
|
+
* detectMetadataKind({ name: 'Celsius', type: 'number' }); // 'primitive'
|
|
186
|
+
* detectMetadataKind({ name: 'Point', type: { x: 'number', y: 'number' } }); // 'record'
|
|
187
|
+
* detectMetadataKind({ name: 'RGB', type: ['number', 'number', 'number'] }); // 'tuple'
|
|
188
|
+
* detectMetadataKind({ name: 'Direction', type: Direction }); // 'enum' (if Direction is an enum)
|
|
189
|
+
* ```
|
|
190
|
+
*
|
|
191
|
+
* @useWhen You need to dynamically dispatch on the kind of a metadata object
|
|
192
|
+
* at runtime (e.g., in serialisers or schema generators built on top of unacy).
|
|
193
|
+
*
|
|
194
|
+
* @category Validation
|
|
129
195
|
*/
|
|
130
196
|
export declare function detectMetadataKind(meta: unknown): 'primitive' | 'enum' | 'class' | 'tuple' | 'record' | 'unknown';
|
|
131
197
|
//# 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;AAC9C,OAAO,KAAK,EAAE,QAAQ,EAAE,SAAS,EAAE,YAAY,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,aAAa,CAAC;AAGjG
|
|
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;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2CG;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;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,YAAY,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,QAAQ,CA0C9D;AAED;;;;;;;;;;GAUG;AACH,wBAAgB,aAAa,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,SAAS,CAWhE;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,oBAAoB,CAClC,KAAK,EAAE,OAAO,EACd,OAAO,GAAE,GAAG,CAAC,OAAO,CAAa,GAChC,KAAK,IAAI,YAAY,CA8CvB;AAED;;;;;;;;;;;;;;;;;;;GAmBG;AACH,wBAAgB,mBAAmB,CAAC,KAAK,EAAE,OAAO,GAAG,KAAK,IAAI,WAAW,CAoCxE;AAMD;;;;;;;;;GASG;AACH,wBAAgB,cAAc,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAAC,QAAQ,CAAC,CA6B7E;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAAC,SAAS,CAAC,CAO/E;AAED;;;;;GAKG;AACH,wBAAgB,gBAAgB,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAAC,YAAY,CAAC,CAkBnF;AAED;;;;;GAKG;AACH,wBAAgB,eAAe,CAAC,IAAI,EAAE,OAAO,GAAG,IAAI,IAAI,aAAa,CAAC,WAAW,CAAC,CAajF;AAED;;;;;;;;;;;;;;;;;;;;;;;;;;;GA2BG;AACH,wBAAgB,kBAAkB,CAChC,IAAI,EAAE,OAAO,GACZ,WAAW,GAAG,MAAM,GAAG,OAAO,GAAG,OAAO,GAAG,QAAQ,GAAG,SAAS,CA4CjE"}
|
package/dist/utils/validation.js
CHANGED
|
@@ -4,21 +4,48 @@
|
|
|
4
4
|
*/
|
|
5
5
|
import { ParseError } from '../errors.js';
|
|
6
6
|
/**
|
|
7
|
-
* Create a
|
|
7
|
+
* Create a `Parser<WithFormat<T, F>>` backed by a Zod-compatible schema.
|
|
8
8
|
*
|
|
9
|
-
*
|
|
10
|
-
*
|
|
11
|
-
*
|
|
12
|
-
*
|
|
13
|
-
* @
|
|
9
|
+
* Wraps a Zod (or Zod-compatible) schema's `.parse()` method to produce a
|
|
10
|
+
* typed `Parser`. On schema rejection, the Zod error message is re-thrown
|
|
11
|
+
* as a `ParseError` so callers always receive a consistent error type.
|
|
12
|
+
*
|
|
13
|
+
* @template F - Format identifier string literal (e.g., `'HexColor'`)
|
|
14
|
+
* @template T - Base runtime type that the schema validates into
|
|
15
|
+
* @param schema - Any object with a `.parse(input: string)` method (Zod schema)
|
|
16
|
+
* @param format - Format identifier used in thrown `ParseError` instances
|
|
17
|
+
* @returns Parser function that validates and tags values as `WithFormat<T, F>`
|
|
18
|
+
*
|
|
19
|
+
* @throws {ParseError} When `schema.parse` rejects the input
|
|
14
20
|
*
|
|
15
21
|
* @example
|
|
16
22
|
* ```typescript
|
|
17
|
-
*
|
|
23
|
+
* import { z } from 'zod';
|
|
24
|
+
* import { createParserWithSchema } from 'unacy';
|
|
25
|
+
*
|
|
26
|
+
* type HexColor = WithFormat<string, 'HexColor'>;
|
|
27
|
+
* const parseHex = createParserWithSchema<'HexColor', string>(
|
|
18
28
|
* z.string().regex(/^#[0-9A-Fa-f]{6}$/),
|
|
19
29
|
* 'HexColor'
|
|
20
30
|
* );
|
|
31
|
+
*
|
|
32
|
+
* parseHex('#ff0000'); // OK → tagged as HexColor
|
|
33
|
+
* parseHex('red'); // throws ParseError
|
|
21
34
|
* ```
|
|
35
|
+
*
|
|
36
|
+
* @useWhen You already have a Zod schema for a format and want to produce a
|
|
37
|
+
* typed `Parser` with minimal boilerplate.
|
|
38
|
+
*
|
|
39
|
+
* @avoidWhen Your validation logic cannot be expressed as a Zod schema — write
|
|
40
|
+
* a custom `Parser<T>` instead, throwing `ParseError` on failure.
|
|
41
|
+
*
|
|
42
|
+
* @pitfalls
|
|
43
|
+
* NEVER pass a schema whose `.parse()` does not throw on invalid input — the
|
|
44
|
+
* returned parser relies on schema rejection to trigger `ParseError`.
|
|
45
|
+
*
|
|
46
|
+
* @category Validation
|
|
47
|
+
* @see Parser
|
|
48
|
+
* @see ParseError
|
|
22
49
|
*/
|
|
23
50
|
export function createParserWithSchema(schema, format) {
|
|
24
51
|
return (input) => {
|
|
@@ -52,6 +79,16 @@ export function createParserWithSchema(schema, format) {
|
|
|
52
79
|
* validateEnum(LogLevel); // true
|
|
53
80
|
* validateEnum({}); // false
|
|
54
81
|
* ```
|
|
82
|
+
*
|
|
83
|
+
* @useWhen You are receiving a runtime value and need to confirm it is a valid
|
|
84
|
+
* TypeScript enum before using it as a `TypedMetadata<EnumType>.type` field.
|
|
85
|
+
*
|
|
86
|
+
* @pitfalls
|
|
87
|
+
* NEVER use `validateEnum` to check plain objects that happen to have string
|
|
88
|
+
* values — they may look like string enums but carry no semantic meaning.
|
|
89
|
+
* Use `validateRecordSchema` for plain data objects.
|
|
90
|
+
*
|
|
91
|
+
* @category Validation
|
|
55
92
|
*/
|
|
56
93
|
export function validateEnum(value) {
|
|
57
94
|
if (typeof value !== 'object' || value === null) {
|
|
@@ -94,6 +131,8 @@ export function validateEnum(value) {
|
|
|
94
131
|
*
|
|
95
132
|
* @param value - The value to validate
|
|
96
133
|
* @returns `true` if `value` is a valid `ClassType` constructor
|
|
134
|
+
*
|
|
135
|
+
* @category Validation
|
|
97
136
|
*/
|
|
98
137
|
export function validateClass(value) {
|
|
99
138
|
if (typeof value !== 'function') {
|
|
@@ -122,6 +161,8 @@ export function validateClass(value) {
|
|
|
122
161
|
* validateRecordSchema({ x: 'number', y: 'number' }); // true
|
|
123
162
|
* validateRecordSchema({ pos: { x: 'number' } }); // true (nested)
|
|
124
163
|
* ```
|
|
164
|
+
*
|
|
165
|
+
* @category Validation
|
|
125
166
|
*/
|
|
126
167
|
export function validateRecordSchema(value, visited = new Set()) {
|
|
127
168
|
if (typeof value !== 'object' || value === null || Array.isArray(value)) {
|
|
@@ -177,6 +218,8 @@ export function validateRecordSchema(value, visited = new Set()) {
|
|
|
177
218
|
* validateTupleSchema(['string', 'number?']); // true (optional)
|
|
178
219
|
* validateTupleSchema(['number', '...string']); // true (rest)
|
|
179
220
|
* ```
|
|
221
|
+
*
|
|
222
|
+
* @category Validation
|
|
180
223
|
*/
|
|
181
224
|
export function validateTupleSchema(value) {
|
|
182
225
|
if (!Array.isArray(value)) {
|
|
@@ -219,6 +262,7 @@ export function validateTupleSchema(value) {
|
|
|
219
262
|
* classified as a record, not an enum.
|
|
220
263
|
*
|
|
221
264
|
* @param meta - Metadata object to inspect
|
|
265
|
+
* @category Validation
|
|
222
266
|
*/
|
|
223
267
|
export function isEnumMetadata(meta) {
|
|
224
268
|
if (typeof meta !== 'object' || meta === null || !('type' in meta)) {
|
|
@@ -252,6 +296,7 @@ export function isEnumMetadata(meta) {
|
|
|
252
296
|
* Type guard: returns `true` when `meta.type` is a class constructor.
|
|
253
297
|
*
|
|
254
298
|
* @param meta - Metadata object to inspect
|
|
299
|
+
* @category Validation
|
|
255
300
|
*/
|
|
256
301
|
export function isClassMetadata(meta) {
|
|
257
302
|
if (typeof meta !== 'object' || meta === null || !('type' in meta)) {
|
|
@@ -264,6 +309,7 @@ export function isClassMetadata(meta) {
|
|
|
264
309
|
* Type guard: returns `true` when `meta.type` is a record schema object.
|
|
265
310
|
*
|
|
266
311
|
* @param meta - Metadata object to inspect
|
|
312
|
+
* @category Validation
|
|
267
313
|
*/
|
|
268
314
|
export function isRecordMetadata(meta) {
|
|
269
315
|
if (typeof meta !== 'object' || meta === null || !('type' in meta)) {
|
|
@@ -286,6 +332,7 @@ export function isRecordMetadata(meta) {
|
|
|
286
332
|
* Type guard: returns `true` when `meta.type` is a tuple schema array.
|
|
287
333
|
*
|
|
288
334
|
* @param meta - Metadata object to inspect
|
|
335
|
+
* @category Validation
|
|
289
336
|
*/
|
|
290
337
|
export function isTupleMetadata(meta) {
|
|
291
338
|
if (typeof meta !== 'object' || meta === null || !('type' in meta)) {
|
|
@@ -308,6 +355,25 @@ export function isTupleMetadata(meta) {
|
|
|
308
355
|
*
|
|
309
356
|
* @param meta - Metadata object to categorise
|
|
310
357
|
* @returns The detected kind string
|
|
358
|
+
*
|
|
359
|
+
* @remarks
|
|
360
|
+
* Resolution priority order: `primitive` → `class` → `tuple` → `record` → `enum` → `unknown`.
|
|
361
|
+
* This ordering is important: a class constructor would otherwise match the object check,
|
|
362
|
+
* and a tuple schema (array) would match the record check, so the dispatcher checks
|
|
363
|
+
* the more specific types first.
|
|
364
|
+
*
|
|
365
|
+
* @example
|
|
366
|
+
* ```typescript
|
|
367
|
+
* detectMetadataKind({ name: 'Celsius', type: 'number' }); // 'primitive'
|
|
368
|
+
* detectMetadataKind({ name: 'Point', type: { x: 'number', y: 'number' } }); // 'record'
|
|
369
|
+
* detectMetadataKind({ name: 'RGB', type: ['number', 'number', 'number'] }); // 'tuple'
|
|
370
|
+
* detectMetadataKind({ name: 'Direction', type: Direction }); // 'enum' (if Direction is an enum)
|
|
371
|
+
* ```
|
|
372
|
+
*
|
|
373
|
+
* @useWhen You need to dynamically dispatch on the kind of a metadata object
|
|
374
|
+
* at runtime (e.g., in serialisers or schema generators built on top of unacy).
|
|
375
|
+
*
|
|
376
|
+
* @category Validation
|
|
311
377
|
*/
|
|
312
378
|
export function detectMetadataKind(meta) {
|
|
313
379
|
if (typeof meta !== 'object' || meta === null || !('type' in meta)) {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAKH,OAAO,EAAE,UAAU,EAAE,MAAM,cAAc,CAAC;AAE1C
|
|
1
|
+
{"version":3,"file":"validation.js","sourceRoot":"","sources":["../../src/utils/validation.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "unacy",
|
|
3
|
-
"version": "0.8.
|
|
3
|
+
"version": "0.8.2",
|
|
4
4
|
"description": "Type-safe unit and format conversion library",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"private": false,
|
|
7
|
-
"author": "Pradeep Mouli",
|
|
7
|
+
"author": "Pradeep Mouli <pmouli@mac.com> (https://github.com/pradeepmouli)",
|
|
8
8
|
"license": "MIT",
|
|
9
9
|
"repository": {
|
|
10
10
|
"type": "git",
|
|
@@ -28,18 +28,18 @@
|
|
|
28
28
|
"README.md"
|
|
29
29
|
],
|
|
30
30
|
"dependencies": {
|
|
31
|
-
"type-fest": "^5.
|
|
31
|
+
"type-fest": "^5.7.0"
|
|
32
32
|
},
|
|
33
33
|
"devDependencies": {
|
|
34
|
-
"@types/node": "^25.
|
|
35
|
-
"@typescript/native-preview": "
|
|
36
|
-
"vitest": "^4.
|
|
34
|
+
"@types/node": "^25.9.1",
|
|
35
|
+
"@typescript/native-preview": "beta",
|
|
36
|
+
"vitest": "^4.1.8"
|
|
37
37
|
},
|
|
38
38
|
"engines": {
|
|
39
39
|
"node": ">=20.0.0"
|
|
40
40
|
},
|
|
41
41
|
"optionalDependencies": {
|
|
42
|
-
"zod": "^4.3
|
|
42
|
+
"zod": "^4.4.3"
|
|
43
43
|
},
|
|
44
44
|
"scripts": {
|
|
45
45
|
"build": "tsgo -p tsconfig.json",
|