unacy 0.1.0 → 0.1.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/__tests__/converters.test.d.ts +2 -0
- package/dist/__tests__/converters.test.d.ts.map +1 -0
- package/dist/__tests__/converters.test.js +128 -0
- package/dist/__tests__/converters.test.js.map +1 -0
- package/dist/__tests__/errors.test.d.ts +2 -0
- package/dist/__tests__/errors.test.d.ts.map +1 -0
- package/dist/__tests__/errors.test.js +93 -0
- package/dist/__tests__/errors.test.js.map +1 -0
- package/dist/__tests__/formatters.test.d.ts +2 -0
- package/dist/__tests__/formatters.test.d.ts.map +1 -0
- package/dist/__tests__/formatters.test.js +244 -0
- package/dist/__tests__/formatters.test.js.map +1 -0
- package/dist/__tests__/registry.test.d.ts +2 -0
- package/dist/__tests__/registry.test.d.ts.map +1 -0
- package/dist/__tests__/registry.test.js +250 -0
- package/dist/__tests__/registry.test.js.map +1 -0
- package/dist/__tests__/types.test.d.ts +2 -0
- package/dist/__tests__/types.test.js.map +1 -1
- package/dist/converters.d.ts +53 -0
- package/dist/converters.d.ts.map +1 -0
- package/dist/converters.js +6 -0
- package/dist/converters.js.map +1 -0
- package/dist/errors.d.ts +40 -0
- package/dist/errors.d.ts.map +1 -0
- package/dist/errors.js +70 -0
- package/dist/errors.js.map +1 -0
- package/dist/formatters.d.ts +82 -0
- package/dist/formatters.d.ts.map +1 -0
- package/dist/formatters.js +6 -0
- package/dist/formatters.js.map +1 -0
- package/dist/index.d.ts +12 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +10 -0
- package/dist/index.js.map +1 -0
- package/dist/registry.d.ts +141 -0
- package/dist/registry.d.ts.map +1 -0
- package/dist/registry.js +212 -0
- package/dist/registry.js.map +1 -0
- package/dist/types.d.ts +36 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +6 -0
- package/dist/types.js.map +1 -0
- package/dist/utils/graph.d.ts +26 -0
- package/dist/utils/graph.d.ts.map +1 -0
- package/dist/utils/graph.js +91 -0
- package/dist/utils/graph.js.map +1 -0
- package/dist/utils/validation.d.ts +26 -0
- package/dist/utils/validation.d.ts.map +1 -0
- package/dist/utils/validation.js +35 -0
- package/dist/utils/validation.js.map +1 -0
- package/package.json +7 -7
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/converters.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,128 @@
|
|
|
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 a 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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.test.js","sourceRoot":"","sources":["../../src/__tests__/converters.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
import { describe, it, expect } from 'vitest';
|
|
2
|
+
import { UnacyError, CycleError, MaxDepthError, ConversionError, ParseError } from '../errors';
|
|
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
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.test.js","sourceRoot":"","sources":["../../src/__tests__/errors.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/formatters.test.ts"],"names":[],"mappings":""}
|
|
@@ -0,0 +1,244 @@
|
|
|
1
|
+
import { describe, it, expect, expectTypeOf } from 'vitest';
|
|
2
|
+
import { ParseError } from '../errors';
|
|
3
|
+
import { z } from 'zod';
|
|
4
|
+
describe('Formatter Type', () => {
|
|
5
|
+
it('formatter converts tagged value to string', () => {
|
|
6
|
+
const formatISO = (date) => date.toISOString();
|
|
7
|
+
const now = new Date('2026-01-06T12:00:00.000Z');
|
|
8
|
+
const str = formatISO(now);
|
|
9
|
+
expect(typeof str).toBe('string');
|
|
10
|
+
expect(str).toBe('2026-01-06T12:00:00.000Z');
|
|
11
|
+
});
|
|
12
|
+
it('formatter maintains format identity through transformation', () => {
|
|
13
|
+
const formatHex = (color) => color.toUpperCase();
|
|
14
|
+
const color = '#ff5733';
|
|
15
|
+
const formatted = formatHex(color);
|
|
16
|
+
expect(formatted).toBe('#FF5733');
|
|
17
|
+
expectTypeOf(formatted).toEqualTypeOf();
|
|
18
|
+
});
|
|
19
|
+
it('formatter works with different base types', () => {
|
|
20
|
+
const formatTimestamp = (ts) => String(ts);
|
|
21
|
+
const timestamp = Date.now();
|
|
22
|
+
const str = formatTimestamp(timestamp);
|
|
23
|
+
expect(typeof str).toBe('string');
|
|
24
|
+
expect(str).toMatch(/^\d+$/);
|
|
25
|
+
});
|
|
26
|
+
});
|
|
27
|
+
describe('Parser Type', () => {
|
|
28
|
+
it('parser converts string to tagged value with Zod validation', () => {
|
|
29
|
+
const parseISO = (input) => {
|
|
30
|
+
const schema = z.string().datetime();
|
|
31
|
+
const validated = schema.parse(input);
|
|
32
|
+
return new Date(validated);
|
|
33
|
+
};
|
|
34
|
+
const str = '2026-01-06T12:00:00.000Z';
|
|
35
|
+
const date = parseISO(str);
|
|
36
|
+
expectTypeOf(date).toEqualTypeOf();
|
|
37
|
+
expect(date).toBeInstanceOf(Date);
|
|
38
|
+
expect(date.toISOString()).toBe(str);
|
|
39
|
+
});
|
|
40
|
+
it('invalid string input throws ParseError with context', () => {
|
|
41
|
+
const parseHex = (input) => {
|
|
42
|
+
const schema = z.string().regex(/^#[0-9A-Fa-f]{6}$/);
|
|
43
|
+
try {
|
|
44
|
+
return schema.parse(input);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
47
|
+
throw new ParseError('HexColor', input, 'Expected #RRGGBB format');
|
|
48
|
+
}
|
|
49
|
+
};
|
|
50
|
+
expect(() => {
|
|
51
|
+
parseHex('not-a-color');
|
|
52
|
+
}).toThrow(ParseError);
|
|
53
|
+
try {
|
|
54
|
+
parseHex('invalid');
|
|
55
|
+
}
|
|
56
|
+
catch (err) {
|
|
57
|
+
expect(err).toBeInstanceOf(ParseError);
|
|
58
|
+
if (err instanceof ParseError) {
|
|
59
|
+
expect(err.format).toBe('HexColor');
|
|
60
|
+
expect(err.input).toBe('invalid');
|
|
61
|
+
expect(err.reason).toBe('Expected #RRGGBB format');
|
|
62
|
+
}
|
|
63
|
+
}
|
|
64
|
+
});
|
|
65
|
+
it('parser rejects input before tagging (no invalid tagged values)', () => {
|
|
66
|
+
const parsePositive = (input) => {
|
|
67
|
+
const schema = z
|
|
68
|
+
.string()
|
|
69
|
+
.transform((s) => parseFloat(s))
|
|
70
|
+
.refine((n) => n > 0);
|
|
71
|
+
try {
|
|
72
|
+
return schema.parse(input);
|
|
73
|
+
}
|
|
74
|
+
catch {
|
|
75
|
+
throw new ParseError('Positive', input, 'Must be a positive number');
|
|
76
|
+
}
|
|
77
|
+
};
|
|
78
|
+
expect(() => {
|
|
79
|
+
parsePositive('-5');
|
|
80
|
+
}).toThrow(ParseError);
|
|
81
|
+
expect(() => {
|
|
82
|
+
parsePositive('not-a-number');
|
|
83
|
+
}).toThrow(ParseError);
|
|
84
|
+
// Valid input should work
|
|
85
|
+
const result = parsePositive('10');
|
|
86
|
+
expect(result).toBe(10);
|
|
87
|
+
});
|
|
88
|
+
it('handles empty input', () => {
|
|
89
|
+
const parseNonEmpty = (input) => {
|
|
90
|
+
if (input === '') {
|
|
91
|
+
throw new ParseError('NonEmpty', input, 'Cannot be empty');
|
|
92
|
+
}
|
|
93
|
+
return input;
|
|
94
|
+
};
|
|
95
|
+
expect(() => {
|
|
96
|
+
parseNonEmpty('');
|
|
97
|
+
}).toThrow(ParseError);
|
|
98
|
+
try {
|
|
99
|
+
parseNonEmpty('');
|
|
100
|
+
}
|
|
101
|
+
catch (err) {
|
|
102
|
+
if (err instanceof ParseError) {
|
|
103
|
+
expect(err.message).toContain('""');
|
|
104
|
+
}
|
|
105
|
+
}
|
|
106
|
+
});
|
|
107
|
+
it('compile-time: wrong format type to parser causes error', () => {
|
|
108
|
+
const parseISO = (input) => {
|
|
109
|
+
return new Date(input);
|
|
110
|
+
};
|
|
111
|
+
const str = '2026-01-06T12:00:00.000Z';
|
|
112
|
+
const date = parseISO(str);
|
|
113
|
+
// @ts-expect-error - Cannot assign ISO8601 to HexColor
|
|
114
|
+
const color = date;
|
|
115
|
+
expect(color).toBeDefined();
|
|
116
|
+
});
|
|
117
|
+
});
|
|
118
|
+
describe('FormatterParser Type', () => {
|
|
119
|
+
it('round-trip (format then parse) produces equivalent value', () => {
|
|
120
|
+
const iso8601 = {
|
|
121
|
+
format: (date) => date.toISOString(),
|
|
122
|
+
parse: (input) => {
|
|
123
|
+
const schema = z.string().datetime();
|
|
124
|
+
const validated = schema.parse(input);
|
|
125
|
+
return new Date(validated);
|
|
126
|
+
}
|
|
127
|
+
};
|
|
128
|
+
const original = new Date('2026-01-06T12:00:00.000Z');
|
|
129
|
+
const formatted = iso8601.format(original);
|
|
130
|
+
const parsed = iso8601.parse(formatted);
|
|
131
|
+
expect(parsed.getTime()).toBe(original.getTime());
|
|
132
|
+
});
|
|
133
|
+
it('integration test: full formatter/parser pair for ISO8601 dates', () => {
|
|
134
|
+
const iso8601 = {
|
|
135
|
+
format: (date) => date.toISOString(),
|
|
136
|
+
parse: (input) => {
|
|
137
|
+
const schema = z.string().datetime();
|
|
138
|
+
try {
|
|
139
|
+
const validated = schema.parse(input);
|
|
140
|
+
return new Date(validated);
|
|
141
|
+
}
|
|
142
|
+
catch {
|
|
143
|
+
throw new ParseError('ISO8601', input, 'Invalid ISO8601 date format');
|
|
144
|
+
}
|
|
145
|
+
}
|
|
146
|
+
};
|
|
147
|
+
// Test formatting
|
|
148
|
+
const date = new Date('2026-01-06T12:34:56.789Z');
|
|
149
|
+
const str = iso8601.format(date);
|
|
150
|
+
expect(str).toBe('2026-01-06T12:34:56.789Z');
|
|
151
|
+
// Test parsing
|
|
152
|
+
const parsed = iso8601.parse('2026-12-31T23:59:59.999Z');
|
|
153
|
+
expect(parsed).toBeInstanceOf(Date);
|
|
154
|
+
expect(parsed.toISOString()).toBe('2026-12-31T23:59:59.999Z');
|
|
155
|
+
// Test round-trip
|
|
156
|
+
const roundTrip = iso8601.parse(iso8601.format(date));
|
|
157
|
+
expect(roundTrip.getTime()).toBe(date.getTime());
|
|
158
|
+
// Test error handling
|
|
159
|
+
expect(() => {
|
|
160
|
+
iso8601.parse('invalid-date');
|
|
161
|
+
}).toThrow(ParseError);
|
|
162
|
+
});
|
|
163
|
+
it('works with different format types', () => {
|
|
164
|
+
const hexColor = {
|
|
165
|
+
format: (color) => color.toLowerCase(),
|
|
166
|
+
parse: (input) => {
|
|
167
|
+
const schema = z.string().regex(/^#[0-9a-fA-F]{6}$/);
|
|
168
|
+
try {
|
|
169
|
+
return schema.parse(input);
|
|
170
|
+
}
|
|
171
|
+
catch {
|
|
172
|
+
throw new ParseError('HexColor', input, 'Expected #RRGGBB format');
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
};
|
|
176
|
+
const color = '#FF5733';
|
|
177
|
+
const formatted = hexColor.format(color);
|
|
178
|
+
expect(formatted).toBe('#ff5733');
|
|
179
|
+
const parsed = hexColor.parse('#00FF00');
|
|
180
|
+
expectTypeOf(parsed).toEqualTypeOf();
|
|
181
|
+
expect(parsed).toBe('#00FF00');
|
|
182
|
+
// Round-trip with case normalization
|
|
183
|
+
const original = '#ABCDEF';
|
|
184
|
+
const roundTrip = hexColor.parse(hexColor.format(original));
|
|
185
|
+
expect(roundTrip.toLowerCase()).toBe(original.toLowerCase());
|
|
186
|
+
});
|
|
187
|
+
it('timestamp formatter/parser preserves value', () => {
|
|
188
|
+
const unixTimestamp = {
|
|
189
|
+
format: (ts) => String(ts),
|
|
190
|
+
parse: (input) => {
|
|
191
|
+
const schema = z
|
|
192
|
+
.string()
|
|
193
|
+
.regex(/^\d+$/)
|
|
194
|
+
.transform((s) => parseInt(s, 10));
|
|
195
|
+
try {
|
|
196
|
+
return schema.parse(input);
|
|
197
|
+
}
|
|
198
|
+
catch {
|
|
199
|
+
throw new ParseError('UnixTimestamp', input, 'Expected Unix timestamp');
|
|
200
|
+
}
|
|
201
|
+
}
|
|
202
|
+
};
|
|
203
|
+
const timestamp = Date.now();
|
|
204
|
+
const str = unixTimestamp.format(timestamp);
|
|
205
|
+
const parsed = unixTimestamp.parse(str);
|
|
206
|
+
expect(parsed).toBe(timestamp);
|
|
207
|
+
});
|
|
208
|
+
});
|
|
209
|
+
describe('Formatter/Parser Examples', () => {
|
|
210
|
+
it('YYYY-MM-DD format with validation', () => {
|
|
211
|
+
const yyyymmdd = {
|
|
212
|
+
format: (dateStr) => dateStr,
|
|
213
|
+
parse: (input) => {
|
|
214
|
+
const schema = z.string().regex(/^\d{4}-\d{2}-\d{2}$/);
|
|
215
|
+
try {
|
|
216
|
+
const validated = schema.parse(input);
|
|
217
|
+
// Additional validation: check if it's a valid date
|
|
218
|
+
const parts = validated.split('-');
|
|
219
|
+
const year = parseInt(parts[0], 10);
|
|
220
|
+
const month = parseInt(parts[1], 10);
|
|
221
|
+
const day = parseInt(parts[2], 10);
|
|
222
|
+
const date = new Date(year, month - 1, day);
|
|
223
|
+
if (date.getFullYear() !== year ||
|
|
224
|
+
date.getMonth() !== month - 1 ||
|
|
225
|
+
date.getDate() !== day) {
|
|
226
|
+
throw new Error('Invalid date');
|
|
227
|
+
}
|
|
228
|
+
return validated;
|
|
229
|
+
}
|
|
230
|
+
catch {
|
|
231
|
+
throw new ParseError('YYYY-MM-DD', input, 'Invalid date format');
|
|
232
|
+
}
|
|
233
|
+
}
|
|
234
|
+
};
|
|
235
|
+
// Valid dates
|
|
236
|
+
expect(yyyymmdd.parse('2026-01-06')).toBe('2026-01-06');
|
|
237
|
+
expect(yyyymmdd.parse('2026-12-31')).toBe('2026-12-31');
|
|
238
|
+
// Invalid dates
|
|
239
|
+
expect(() => yyyymmdd.parse('2026-13-01')).toThrow(ParseError); // Invalid month
|
|
240
|
+
expect(() => yyyymmdd.parse('2026-02-30')).toThrow(ParseError); // Invalid day
|
|
241
|
+
expect(() => yyyymmdd.parse('not-a-date')).toThrow(ParseError);
|
|
242
|
+
});
|
|
243
|
+
});
|
|
244
|
+
//# sourceMappingURL=formatters.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.test.js","sourceRoot":"","sources":["../../src/__tests__/formatters.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.d.ts","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":""}
|