unacy 0.6.0 → 0.8.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +193 -47
- package/dist/converters.d.ts +28 -4
- package/dist/converters.d.ts.map +1 -1
- package/dist/errors.js.map +1 -1
- package/dist/index.d.ts +5 -4
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +1 -1
- package/dist/index.js.map +1 -1
- package/dist/registry.d.ts +39 -41
- package/dist/registry.d.ts.map +1 -1
- package/dist/registry.js +58 -14
- package/dist/registry.js.map +1 -1
- package/dist/types.d.ts +159 -18
- package/dist/types.d.ts.map +1 -1
- package/dist/types.js.map +1 -1
- package/dist/utils/validation.d.ts +106 -0
- package/dist/utils/validation.d.ts.map +1 -1
- package/dist/utils/validation.js +317 -0
- package/dist/utils/validation.js.map +1 -1
- package/package.json +16 -8
- package/dist/__tests__/converters.test.d.ts +0 -2
- package/dist/__tests__/converters.test.d.ts.map +0 -1
- package/dist/__tests__/converters.test.js +0 -128
- package/dist/__tests__/converters.test.js.map +0 -1
- package/dist/__tests__/errors.test.d.ts +0 -2
- package/dist/__tests__/errors.test.d.ts.map +0 -1
- package/dist/__tests__/errors.test.js +0 -93
- package/dist/__tests__/errors.test.js.map +0 -1
- package/dist/__tests__/formatters.test.d.ts +0 -2
- package/dist/__tests__/formatters.test.d.ts.map +0 -1
- package/dist/__tests__/formatters.test.js +0 -244
- package/dist/__tests__/formatters.test.js.map +0 -1
- package/dist/__tests__/registry.test.d.ts +0 -2
- package/dist/__tests__/registry.test.d.ts.map +0 -1
- package/dist/__tests__/registry.test.js +0 -403
- package/dist/__tests__/registry.test.js.map +0 -1
- package/dist/__tests__/types.test.d.ts +0 -2
- package/dist/__tests__/types.test.d.ts.map +0 -1
- package/dist/__tests__/types.test.js +0 -115
- package/dist/__tests__/types.test.js.map +0 -1
package/dist/utils/validation.js
CHANGED
|
@@ -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;AAKH,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.
|
|
3
|
+
"version": "0.8.0",
|
|
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,22 +28,22 @@
|
|
|
20
28
|
"README.md"
|
|
21
29
|
],
|
|
22
30
|
"dependencies": {
|
|
23
|
-
"type-fest": "^5.4.
|
|
31
|
+
"type-fest": "^5.4.4"
|
|
24
32
|
},
|
|
25
33
|
"devDependencies": {
|
|
26
|
-
"@types/node": "^25.
|
|
27
|
-
"@typescript/native-preview": "7.0.0-dev.
|
|
28
|
-
"vitest": "^4.0.
|
|
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.
|
|
42
|
+
"zod": "^4.3.6"
|
|
35
43
|
},
|
|
36
44
|
"scripts": {
|
|
37
|
-
"build": "tsgo",
|
|
38
|
-
"clean": "rm -rf dist",
|
|
45
|
+
"build": "tsgo -p tsconfig.json",
|
|
46
|
+
"clean": "rm -rf dist tsconfig.tsbuildinfo",
|
|
39
47
|
"type-check": "tsgo --noEmit",
|
|
40
48
|
"test": "vitest run",
|
|
41
49
|
"test:watch": "vitest"
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"converters.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/converters.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,128 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect, expectTypeOf } from 'vitest';
|
|
2
|
-
describe('Converter Type', () => {
|
|
3
|
-
it('unidirectional converter returns correct type', () => {
|
|
4
|
-
const celsiusToFahrenheit = (c) => ((c * 9) / 5 + 32);
|
|
5
|
-
const celsius = 25;
|
|
6
|
-
const fahrenheit = celsiusToFahrenheit(celsius);
|
|
7
|
-
expectTypeOf(fahrenheit).toEqualTypeOf();
|
|
8
|
-
expect(fahrenheit).toBe(77);
|
|
9
|
-
});
|
|
10
|
-
it('converter function is deterministic (same input → same output)', () => {
|
|
11
|
-
const celsiusToFahrenheit = (c) => ((c * 9) / 5 + 32);
|
|
12
|
-
const celsius = 100;
|
|
13
|
-
// Call multiple times with same input
|
|
14
|
-
const result1 = celsiusToFahrenheit(celsius);
|
|
15
|
-
const result2 = celsiusToFahrenheit(celsius);
|
|
16
|
-
const result3 = celsiusToFahrenheit(celsius);
|
|
17
|
-
expect(result1).toBe(result2);
|
|
18
|
-
expect(result2).toBe(result3);
|
|
19
|
-
expect(result1).toBe(212); // 100°C = 212°F
|
|
20
|
-
});
|
|
21
|
-
it('compile-time: wrong unit type to converter causes compile error', () => {
|
|
22
|
-
const celsiusToFahrenheit = (c) => ((c * 9) / 5 + 32);
|
|
23
|
-
const meters = 100;
|
|
24
|
-
// @ts-expect-error - Cannot pass Meters to Celsius→Fahrenheit converter
|
|
25
|
-
const result = celsiusToFahrenheit(meters);
|
|
26
|
-
expect(result).toBeDefined(); // Runtime still works but types don't match
|
|
27
|
-
});
|
|
28
|
-
it('maintains type safety through variables', () => {
|
|
29
|
-
const metersToFeet = (m) => (m * 3.28084);
|
|
30
|
-
const distance = 10;
|
|
31
|
-
const converted = metersToFeet(distance);
|
|
32
|
-
expectTypeOf(converted).toEqualTypeOf();
|
|
33
|
-
expect(converted).toBeCloseTo(32.8084, 4);
|
|
34
|
-
});
|
|
35
|
-
it('works with different conversion formulas', () => {
|
|
36
|
-
const celsiusToKelvin = (c) => (c + 273.15);
|
|
37
|
-
const celsius = 0;
|
|
38
|
-
const kelvin = celsiusToKelvin(celsius);
|
|
39
|
-
expect(kelvin).toBe(273.15);
|
|
40
|
-
expectTypeOf(kelvin).toEqualTypeOf();
|
|
41
|
-
});
|
|
42
|
-
});
|
|
43
|
-
describe('BidirectionalConverter Type', () => {
|
|
44
|
-
it('bidirectional converter round-trip preserves value within tolerance', () => {
|
|
45
|
-
const metersFeet = {
|
|
46
|
-
to: (m) => (m * 3.28084),
|
|
47
|
-
from: (f) => (f / 3.28084)
|
|
48
|
-
};
|
|
49
|
-
const original = 10;
|
|
50
|
-
const feet = metersFeet.to(original);
|
|
51
|
-
const backToMeters = metersFeet.from(feet);
|
|
52
|
-
expect(backToMeters).toBeCloseTo(original, 10);
|
|
53
|
-
expectTypeOf(backToMeters).toEqualTypeOf();
|
|
54
|
-
});
|
|
55
|
-
it('forward and reverse converters have correct types', () => {
|
|
56
|
-
const celsiusFahrenheit = {
|
|
57
|
-
to: (c) => ((c * 9) / 5 + 32),
|
|
58
|
-
from: (f) => (((f - 32) * 5) / 9)
|
|
59
|
-
};
|
|
60
|
-
const celsius = 20;
|
|
61
|
-
const fahrenheit = celsiusFahrenheit.to(celsius);
|
|
62
|
-
expectTypeOf(fahrenheit).toEqualTypeOf();
|
|
63
|
-
expectTypeOf(celsiusFahrenheit.to).toEqualTypeOf();
|
|
64
|
-
expectTypeOf(celsiusFahrenheit.from).toEqualTypeOf();
|
|
65
|
-
});
|
|
66
|
-
it('round-trip multiple conversions', () => {
|
|
67
|
-
const celsiusFahrenheit = {
|
|
68
|
-
to: (c) => ((c * 9) / 5 + 32),
|
|
69
|
-
from: (f) => (((f - 32) * 5) / 9)
|
|
70
|
-
};
|
|
71
|
-
const testValues = [-40, -20, 0, 25, 37, 100].map((v) => v);
|
|
72
|
-
testValues.forEach((original) => {
|
|
73
|
-
const fahrenheit = celsiusFahrenheit.to(original);
|
|
74
|
-
const backToCelsius = celsiusFahrenheit.from(fahrenheit);
|
|
75
|
-
expect(backToCelsius).toBeCloseTo(original, 10);
|
|
76
|
-
});
|
|
77
|
-
});
|
|
78
|
-
it('handles edge cases in conversion', () => {
|
|
79
|
-
const celsiusFahrenheit = {
|
|
80
|
-
to: (c) => ((c * 9) / 5 + 32),
|
|
81
|
-
from: (f) => (((f - 32) * 5) / 9)
|
|
82
|
-
};
|
|
83
|
-
// Absolute zero point where C and F scales intersect
|
|
84
|
-
const absoluteZero = -273.15;
|
|
85
|
-
const fahrenheit = celsiusFahrenheit.to(absoluteZero);
|
|
86
|
-
const backToCelsius = celsiusFahrenheit.from(fahrenheit);
|
|
87
|
-
expect(backToCelsius).toBeCloseTo(absoluteZero, 10);
|
|
88
|
-
});
|
|
89
|
-
it('both directions maintain type safety', () => {
|
|
90
|
-
const celsiusKelvin = {
|
|
91
|
-
to: (c) => (c + 273.15),
|
|
92
|
-
from: (k) => (k - 273.15)
|
|
93
|
-
};
|
|
94
|
-
const celsius = 100;
|
|
95
|
-
const kelvin = celsiusKelvin.to(celsius);
|
|
96
|
-
expectTypeOf(kelvin).toEqualTypeOf();
|
|
97
|
-
// @ts-expect-error - Cannot pass Fahrenheit to Kelvin→Celsius converter
|
|
98
|
-
const invalid = celsiusKelvin.from(77);
|
|
99
|
-
expect(invalid).toBeDefined();
|
|
100
|
-
});
|
|
101
|
-
it('precision loss is acceptable for approximate conversions', () => {
|
|
102
|
-
const metersFeet = {
|
|
103
|
-
to: (m) => (m * 3.28084),
|
|
104
|
-
from: (f) => (f / 3.28084)
|
|
105
|
-
};
|
|
106
|
-
// Test with value that may have floating point precision issues
|
|
107
|
-
const original = 1.23456789;
|
|
108
|
-
const feet = metersFeet.to(original);
|
|
109
|
-
const backToMeters = metersFeet.from(feet);
|
|
110
|
-
// Allow small precision loss
|
|
111
|
-
expect(Math.abs(backToMeters - original)).toBeLessThan(0.0000001);
|
|
112
|
-
});
|
|
113
|
-
});
|
|
114
|
-
describe('Converter Examples', () => {
|
|
115
|
-
it('temperature conversions match expected values', () => {
|
|
116
|
-
const celsiusToFahrenheit = (c) => ((c * 9) / 5 + 32);
|
|
117
|
-
expect(celsiusToFahrenheit(0)).toBe(32); // Freezing point
|
|
118
|
-
expect(celsiusToFahrenheit(100)).toBe(212); // Boiling point
|
|
119
|
-
expect(celsiusToFahrenheit(37)).toBeCloseTo(98.6, 1); // Body temp
|
|
120
|
-
});
|
|
121
|
-
it('distance conversions match expected values', () => {
|
|
122
|
-
const metersToFeet = (m) => (m * 3.28084);
|
|
123
|
-
expect(metersToFeet(1)).toBeCloseTo(3.28084, 4);
|
|
124
|
-
expect(metersToFeet(10)).toBeCloseTo(32.8084, 4);
|
|
125
|
-
expect(metersToFeet(100)).toBeCloseTo(328.084, 3);
|
|
126
|
-
});
|
|
127
|
-
});
|
|
128
|
-
//# sourceMappingURL=converters.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"converters.test.js","sourceRoot":"","sources":["../../src/__tests__/converters.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":""}
|
|
@@ -1,93 +0,0 @@
|
|
|
1
|
-
import { describe, it, expect } from 'vitest';
|
|
2
|
-
import { UnacyError, CycleError, MaxDepthError, ConversionError, ParseError } from '../errors.js';
|
|
3
|
-
describe('UnacyError', () => {
|
|
4
|
-
it('creates error with message', () => {
|
|
5
|
-
const error = new UnacyError('Test error message');
|
|
6
|
-
expect(error).toBeInstanceOf(Error);
|
|
7
|
-
expect(error).toBeInstanceOf(UnacyError);
|
|
8
|
-
expect(error.message).toBe('Test error message');
|
|
9
|
-
expect(error.name).toBe('UnacyError');
|
|
10
|
-
});
|
|
11
|
-
it('includes stack trace', () => {
|
|
12
|
-
const error = new UnacyError('Test error');
|
|
13
|
-
expect(error.stack).toBeDefined();
|
|
14
|
-
});
|
|
15
|
-
});
|
|
16
|
-
describe('CycleError', () => {
|
|
17
|
-
it('creates error with cycle path', () => {
|
|
18
|
-
const path = ['A', 'B', 'C', 'A'];
|
|
19
|
-
const error = new CycleError(path);
|
|
20
|
-
expect(error).toBeInstanceOf(UnacyError);
|
|
21
|
-
expect(error.message).toContain('Cycle detected');
|
|
22
|
-
expect(error.message).toContain('A → B → C → A');
|
|
23
|
-
expect(error.name).toBe('CycleError');
|
|
24
|
-
expect(error.path).toEqual(path);
|
|
25
|
-
});
|
|
26
|
-
it('formats path with different unit types', () => {
|
|
27
|
-
const path = ['meters', 'kilometers', 'miles', 'meters'];
|
|
28
|
-
const error = new CycleError(path);
|
|
29
|
-
expect(error.message).toContain('meters → kilometers → miles → meters');
|
|
30
|
-
});
|
|
31
|
-
});
|
|
32
|
-
describe('MaxDepthError', () => {
|
|
33
|
-
it('creates error with from, to, and max depth', () => {
|
|
34
|
-
const error = new MaxDepthError('meters', 'parsecs', 5);
|
|
35
|
-
expect(error).toBeInstanceOf(UnacyError);
|
|
36
|
-
expect(error.message).toContain('Maximum conversion depth');
|
|
37
|
-
expect(error.message).toContain('meters');
|
|
38
|
-
expect(error.message).toContain('parsecs');
|
|
39
|
-
expect(error.message).toContain('5');
|
|
40
|
-
expect(error.name).toBe('MaxDepthError');
|
|
41
|
-
expect(error.from).toBe('meters');
|
|
42
|
-
expect(error.to).toBe('parsecs');
|
|
43
|
-
expect(error.maxDepth).toBe(5);
|
|
44
|
-
});
|
|
45
|
-
it('provides helpful message', () => {
|
|
46
|
-
const error = new MaxDepthError('A', 'Z', 3);
|
|
47
|
-
expect(error.message).toContain('exceeded');
|
|
48
|
-
expect(error.message).toContain('A');
|
|
49
|
-
expect(error.message).toContain('Z');
|
|
50
|
-
});
|
|
51
|
-
});
|
|
52
|
-
describe('ConversionError', () => {
|
|
53
|
-
it('creates error with from and to units', () => {
|
|
54
|
-
const error = new ConversionError('Celsius', 'Kelvin');
|
|
55
|
-
expect(error).toBeInstanceOf(UnacyError);
|
|
56
|
-
expect(error.message).toContain('Cannot convert');
|
|
57
|
-
expect(error.message).toContain('Celsius');
|
|
58
|
-
expect(error.message).toContain('Kelvin');
|
|
59
|
-
expect(error.name).toBe('ConversionError');
|
|
60
|
-
expect(error.from).toBe('Celsius');
|
|
61
|
-
expect(error.to).toBe('Kelvin');
|
|
62
|
-
});
|
|
63
|
-
it('accepts optional reason', () => {
|
|
64
|
-
const error = new ConversionError('A', 'B', 'No path exists');
|
|
65
|
-
expect(error.message).toContain('Cannot convert');
|
|
66
|
-
expect(error.message).toContain('No path exists');
|
|
67
|
-
});
|
|
68
|
-
});
|
|
69
|
-
describe('ParseError', () => {
|
|
70
|
-
it('creates error with format, input, and reason', () => {
|
|
71
|
-
const error = new ParseError('ISO8601', 'invalid-date', 'Invalid format');
|
|
72
|
-
expect(error).toBeInstanceOf(UnacyError);
|
|
73
|
-
expect(error.message).toContain('Cannot parse');
|
|
74
|
-
expect(error.message).toContain('ISO8601');
|
|
75
|
-
expect(error.message).toContain('invalid-date');
|
|
76
|
-
expect(error.message).toContain('Invalid format');
|
|
77
|
-
expect(error.name).toBe('ParseError');
|
|
78
|
-
expect(error.format).toBe('ISO8601');
|
|
79
|
-
expect(error.input).toBe('invalid-date');
|
|
80
|
-
expect(error.reason).toBe('Invalid format');
|
|
81
|
-
});
|
|
82
|
-
it('truncates long input values', () => {
|
|
83
|
-
const longInput = 'a'.repeat(100);
|
|
84
|
-
const error = new ParseError('HexColor', longInput, 'Too long');
|
|
85
|
-
expect(error.message.length).toBeLessThan(200);
|
|
86
|
-
expect(error.message).toContain('...');
|
|
87
|
-
});
|
|
88
|
-
it('handles empty input', () => {
|
|
89
|
-
const error = new ParseError('Number', '', 'Empty string');
|
|
90
|
-
expect(error.message).toContain('""');
|
|
91
|
-
});
|
|
92
|
-
});
|
|
93
|
-
//# sourceMappingURL=errors.test.js.map
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
{"version":3,"file":"formatters.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/formatters.test.ts"],"names":[],"mappings":""}
|