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,250 @@
|
|
|
1
|
+
import { describe, it, expect, expectTypeOf } from 'vitest';
|
|
2
|
+
import { createRegistry } from '../registry';
|
|
3
|
+
import { CycleError, MaxDepthError, ConversionError } from '../errors';
|
|
4
|
+
const getConverter = (registry, from, to) => registry.getConverter(from, to);
|
|
5
|
+
const convert = (registry, value, from) => registry.convert(value, from);
|
|
6
|
+
describe('Registry - Basic Operations', () => {
|
|
7
|
+
it('register and retrieve direct converter', () => {
|
|
8
|
+
const registry = createRegistry().register('Celsius', 'Fahrenheit', (c) => ((c * 9) / 5 + 32));
|
|
9
|
+
const converter = getConverter(registry, 'Celsius', 'Fahrenheit');
|
|
10
|
+
expect(converter).toBeDefined();
|
|
11
|
+
if (converter) {
|
|
12
|
+
const result = converter(0);
|
|
13
|
+
expect(result).toBe(32);
|
|
14
|
+
}
|
|
15
|
+
});
|
|
16
|
+
it('registerBidirectional registers both directions', () => {
|
|
17
|
+
const registry = createRegistry().registerBidirectional('meters', 'kilometers', {
|
|
18
|
+
to: (m) => (m / 1000),
|
|
19
|
+
from: (km) => (km * 1000)
|
|
20
|
+
});
|
|
21
|
+
const m2km = getConverter(registry, 'meters', 'kilometers');
|
|
22
|
+
const km2m = getConverter(registry, 'kilometers', 'meters');
|
|
23
|
+
expect(m2km).toBeDefined();
|
|
24
|
+
expect(km2m).toBeDefined();
|
|
25
|
+
if (m2km && km2m) {
|
|
26
|
+
expect(m2km(1000)).toBe(1);
|
|
27
|
+
expect(km2m(1)).toBe(1000);
|
|
28
|
+
}
|
|
29
|
+
});
|
|
30
|
+
it('getConverter finds direct converter in O(1)', () => {
|
|
31
|
+
const registry = createRegistry()
|
|
32
|
+
.register('A', 'B', (a) => (a * 2))
|
|
33
|
+
.register('B', 'C', (b) => (b * 3));
|
|
34
|
+
const startTime = performance.now();
|
|
35
|
+
const converter = getConverter(registry, 'A', 'B');
|
|
36
|
+
const endTime = performance.now();
|
|
37
|
+
expect(converter).toBeDefined();
|
|
38
|
+
// O(1) lookup should be fast (< 1ms even in slow environments)
|
|
39
|
+
expect(endTime - startTime).toBeLessThan(5);
|
|
40
|
+
});
|
|
41
|
+
});
|
|
42
|
+
describe('Registry - Multi-Hop Composition', () => {
|
|
43
|
+
it('auto-compose 2-hop conversion (A→B→C)', () => {
|
|
44
|
+
const registry = createRegistry()
|
|
45
|
+
.register('A', 'B', (a) => (a * 2))
|
|
46
|
+
.register('B', 'C', (b) => (b * 3));
|
|
47
|
+
const converter = getConverter(registry, 'A', 'C');
|
|
48
|
+
expect(converter).toBeDefined();
|
|
49
|
+
if (converter) {
|
|
50
|
+
// A→B→C: 10 * 2 = 20, 20 * 3 = 60
|
|
51
|
+
expect(converter(10)).toBe(60);
|
|
52
|
+
}
|
|
53
|
+
});
|
|
54
|
+
it('auto-compose 3-hop conversion (A→B→C→D)', () => {
|
|
55
|
+
const registry = createRegistry()
|
|
56
|
+
.register('A', 'B', (a) => (a * 2))
|
|
57
|
+
.register('B', 'C', (b) => (b * 3))
|
|
58
|
+
.register('C', 'D', (c) => (c * 5));
|
|
59
|
+
const converter = getConverter(registry, 'A', 'D');
|
|
60
|
+
expect(converter).toBeDefined();
|
|
61
|
+
if (converter) {
|
|
62
|
+
// A→B→C→D: 10 * 2 * 3 * 5 = 300
|
|
63
|
+
expect(converter(10)).toBe(300);
|
|
64
|
+
}
|
|
65
|
+
});
|
|
66
|
+
it('integration test: 3-unit distance conversion (m→km→mi)', () => {
|
|
67
|
+
const registry = createRegistry()
|
|
68
|
+
.registerBidirectional('meters', 'kilometers', {
|
|
69
|
+
to: (m) => (m / 1000),
|
|
70
|
+
from: (km) => (km * 1000)
|
|
71
|
+
})
|
|
72
|
+
.registerBidirectional('kilometers', 'miles', {
|
|
73
|
+
to: (km) => (km * 0.621371),
|
|
74
|
+
from: (mi) => (mi / 0.621371)
|
|
75
|
+
});
|
|
76
|
+
const converter = getConverter(registry, 'meters', 'miles');
|
|
77
|
+
expect(converter).toBeDefined();
|
|
78
|
+
if (converter) {
|
|
79
|
+
const meters = 5000;
|
|
80
|
+
const miles = converter(meters);
|
|
81
|
+
// 5000m → 5km → 3.106855mi
|
|
82
|
+
expect(miles).toBeCloseTo(3.106855, 5);
|
|
83
|
+
}
|
|
84
|
+
});
|
|
85
|
+
it('chooses shortest path when multiple paths exist', () => {
|
|
86
|
+
// Create diamond shape: A→B→D and A→C→D
|
|
87
|
+
// But also add direct A→D
|
|
88
|
+
const registry = createRegistry()
|
|
89
|
+
.register('A', 'B', (a) => (a + 100)) // Long path
|
|
90
|
+
.register('B', 'D', (b) => (b + 100))
|
|
91
|
+
.register('A', 'C', (a) => (a + 200)) // Long path
|
|
92
|
+
.register('C', 'D', (c) => (c + 200))
|
|
93
|
+
.register('A', 'D', (a) => (a * 10)); // Direct (shortest)
|
|
94
|
+
const converter = getConverter(registry, 'A', 'D');
|
|
95
|
+
if (converter) {
|
|
96
|
+
// Should use direct path: 5 * 10 = 50
|
|
97
|
+
expect(converter(5)).toBe(50);
|
|
98
|
+
}
|
|
99
|
+
});
|
|
100
|
+
});
|
|
101
|
+
describe('Registry - Error Handling', () => {
|
|
102
|
+
it('cycle detection throws CycleError with path', () => {
|
|
103
|
+
// Create cycle: A→B→C→A
|
|
104
|
+
const registry = createRegistry()
|
|
105
|
+
.register('A', 'B', (a) => (a * 2))
|
|
106
|
+
.register('B', 'C', (b) => (b * 3))
|
|
107
|
+
.register('C', 'A', (c) => (c * 5));
|
|
108
|
+
// Trying to convert from C to A would complete a cycle
|
|
109
|
+
// But the actual cycle is detected when finding a path
|
|
110
|
+
// Let me test a different scenario: trying to get a converter that would require going in a circle
|
|
111
|
+
// Since we register C→A, we can actually get A to C via A→B→C
|
|
112
|
+
// But trying to get C to C should trigger cycle detection
|
|
113
|
+
expect(() => {
|
|
114
|
+
getConverter(registry, 'C', 'C'); // Cast needed due to type constraint
|
|
115
|
+
}).toThrow(CycleError);
|
|
116
|
+
});
|
|
117
|
+
it('max depth (>5 hops) throws MaxDepthError', () => {
|
|
118
|
+
// Create chain: A→B→C→D→E→F→G (6 hops)
|
|
119
|
+
const registry = createRegistry()
|
|
120
|
+
.register('A', 'B', (a) => (a * 2))
|
|
121
|
+
.register('B', 'C', (b) => (b * 2))
|
|
122
|
+
.register('C', 'D', (c) => (c * 2))
|
|
123
|
+
.register('D', 'E', (d) => (d * 2))
|
|
124
|
+
.register('E', 'F', (e) => (e * 2))
|
|
125
|
+
.register('F', 'G', (f) => (f * 2));
|
|
126
|
+
expect(() => {
|
|
127
|
+
getConverter(registry, 'A', 'G');
|
|
128
|
+
}).toThrow(MaxDepthError);
|
|
129
|
+
});
|
|
130
|
+
it('missing converter path throws ConversionError', () => {
|
|
131
|
+
const registry = createRegistry().register('A', 'B', (a) => (a * 2));
|
|
132
|
+
// No path from A to C
|
|
133
|
+
const result = getConverter(registry, 'A', 'C');
|
|
134
|
+
expect(result).toBeUndefined();
|
|
135
|
+
});
|
|
136
|
+
});
|
|
137
|
+
describe('Registry - Fluent API', () => {
|
|
138
|
+
it('compile-time: wrong unit to convert() causes error', () => {
|
|
139
|
+
const registry = createRegistry().register('Celsius', 'Fahrenheit', (c) => ((c * 9) / 5 + 32));
|
|
140
|
+
const temp = 25;
|
|
141
|
+
// Valid conversion
|
|
142
|
+
const fahrenheit = convert(registry, temp, 'Celsius').to('Fahrenheit');
|
|
143
|
+
expect(fahrenheit).toBe(77);
|
|
144
|
+
// Type safety test: This tests that wrong units are caught at compile-time
|
|
145
|
+
// We can't easily test this at runtime, so we document the expected behavior
|
|
146
|
+
});
|
|
147
|
+
it('fluent API performs direct conversion', () => {
|
|
148
|
+
const registry = createRegistry().register('Celsius', 'Fahrenheit', (c) => ((c * 9) / 5 + 32));
|
|
149
|
+
const temp = 0;
|
|
150
|
+
const result = convert(registry, temp, 'Celsius').to('Fahrenheit');
|
|
151
|
+
expect(result).toBe(32);
|
|
152
|
+
// Type is WithUnits<any, 'Fahrenheit'> which is compatible with Fahrenheit
|
|
153
|
+
});
|
|
154
|
+
it('fluent API performs multi-hop conversion', () => {
|
|
155
|
+
const registry = createRegistry()
|
|
156
|
+
.register('Celsius', 'Kelvin', (c) => (c + 273.15))
|
|
157
|
+
.register('Kelvin', 'Fahrenheit', (k) => (((k - 273.15) * 9) / 5 + 32));
|
|
158
|
+
const temp = 0;
|
|
159
|
+
const fahrenheit = convert(registry, temp, 'Celsius').to('Fahrenheit');
|
|
160
|
+
expect(fahrenheit).toBeCloseTo(32, 5);
|
|
161
|
+
});
|
|
162
|
+
it('fluent API throws error for missing path', () => {
|
|
163
|
+
const registry = createRegistry().register('A', 'B', (a) => (a * 2));
|
|
164
|
+
expect(() => {
|
|
165
|
+
convert(registry, 10, 'A').to('C');
|
|
166
|
+
}).toThrow(ConversionError);
|
|
167
|
+
});
|
|
168
|
+
});
|
|
169
|
+
describe('Registry - Immutability', () => {
|
|
170
|
+
it('register returns new registry instance', () => {
|
|
171
|
+
const registry1 = createRegistry();
|
|
172
|
+
const registry2 = registry1.register('A', 'B', (a) => (a * 2));
|
|
173
|
+
expect(registry1).not.toBe(registry2);
|
|
174
|
+
});
|
|
175
|
+
it('original registry unchanged after register', () => {
|
|
176
|
+
const registry1 = createRegistry();
|
|
177
|
+
const registry2 = registry1.register('A', 'B', (a) => (a * 2));
|
|
178
|
+
// registry1 should not have the converter
|
|
179
|
+
expect(getConverter(registry1, 'A', 'B')).toBeUndefined();
|
|
180
|
+
// registry2 should have the converter
|
|
181
|
+
expect(getConverter(registry2, 'A', 'B')).toBeDefined();
|
|
182
|
+
});
|
|
183
|
+
});
|
|
184
|
+
describe('Registry - Performance', () => {
|
|
185
|
+
it('caches composed paths for repeated conversions', () => {
|
|
186
|
+
const registry = createRegistry()
|
|
187
|
+
.register('A', 'B', (a) => (a * 2))
|
|
188
|
+
.register('B', 'C', (b) => (b * 3));
|
|
189
|
+
// First call - may be slower due to BFS
|
|
190
|
+
const start1 = performance.now();
|
|
191
|
+
const converter1 = getConverter(registry, 'A', 'C');
|
|
192
|
+
const end1 = performance.now();
|
|
193
|
+
const time1 = end1 - start1;
|
|
194
|
+
// Second call - should be faster (cached)
|
|
195
|
+
const start2 = performance.now();
|
|
196
|
+
const converter2 = getConverter(registry, 'A', 'C');
|
|
197
|
+
const end2 = performance.now();
|
|
198
|
+
const time2 = end2 - start2;
|
|
199
|
+
expect(converter1).toBeDefined();
|
|
200
|
+
expect(converter2).toBeDefined();
|
|
201
|
+
// Second call should be as fast or faster (cached)
|
|
202
|
+
expect(time2).toBeLessThanOrEqual(time1 * 2); // Allow some variance
|
|
203
|
+
});
|
|
204
|
+
});
|
|
205
|
+
describe('Registry - Unit Accessor API', () => {
|
|
206
|
+
it('provides unit-based accessor API', () => {
|
|
207
|
+
const registry = createRegistry().register('Celsius', 'Fahrenheit', (c) => ((c * 9) / 5 + 32));
|
|
208
|
+
const temp = 0;
|
|
209
|
+
// Use the unit accessor API: registry.celsius.to.fahrenheit(value)
|
|
210
|
+
const result = registry.Celsius.to.Fahrenheit(temp);
|
|
211
|
+
expect(result).toBe(32);
|
|
212
|
+
// Type checking note: result is 'any' due to registry cast, but runtime value is correct
|
|
213
|
+
});
|
|
214
|
+
it('unit accessor API works with bidirectional converters', () => {
|
|
215
|
+
const registry = createRegistry().registerBidirectional('meters', 'kilometers', {
|
|
216
|
+
to: (m) => (m / 1000),
|
|
217
|
+
from: (km) => (km * 1000)
|
|
218
|
+
});
|
|
219
|
+
const meters = 5000;
|
|
220
|
+
const km = 5;
|
|
221
|
+
// Both directions should work
|
|
222
|
+
const toKm = registry.meters.to.kilometers(meters);
|
|
223
|
+
const toM = registry.kilometers.to.meters(km);
|
|
224
|
+
expect(toKm).toBe(5);
|
|
225
|
+
expect(toM).toBe(5000);
|
|
226
|
+
});
|
|
227
|
+
it('unit accessor API works with multi-hop conversions', () => {
|
|
228
|
+
const registry = createRegistry()
|
|
229
|
+
.registerBidirectional('meters', 'kilometers', {
|
|
230
|
+
to: (m) => (m / 1000),
|
|
231
|
+
from: (km) => (km * 1000)
|
|
232
|
+
})
|
|
233
|
+
.registerBidirectional('kilometers', 'miles', {
|
|
234
|
+
to: (km) => (km * 0.621371),
|
|
235
|
+
from: (mi) => (mi / 0.621371)
|
|
236
|
+
});
|
|
237
|
+
const meters = 5000;
|
|
238
|
+
// Should auto-compose: meters → kilometers → miles
|
|
239
|
+
const miles = registry.meters.to.miles(meters);
|
|
240
|
+
expect(miles).toBeCloseTo(3.106855, 5);
|
|
241
|
+
});
|
|
242
|
+
it('unit accessor API throws error when no converter exists', () => {
|
|
243
|
+
const registry = createRegistry().register('A', 'B', (a) => (a * 2));
|
|
244
|
+
// Try to convert from A to C (C not in registry at all)
|
|
245
|
+
expect(() => {
|
|
246
|
+
registry.A.to.C(10);
|
|
247
|
+
}).toThrow(ConversionError);
|
|
248
|
+
});
|
|
249
|
+
});
|
|
250
|
+
//# sourceMappingURL=registry.test.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"registry.test.js","sourceRoot":"","sources":["../../src/__tests__/registry.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,EAAE,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,QAAQ,CAAC;AAG5D,QAAQ,CAAC,uBAAuB,EAAE,GAAG,EAAE;
|
|
1
|
+
{"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Type-safe converter function signatures
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
import type { WithUnits } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Unidirectional converter from one unit to another.
|
|
8
|
+
*
|
|
9
|
+
* @template TInput - Source unit-tagged type
|
|
10
|
+
* @template TOutput - Destination unit-tagged type
|
|
11
|
+
*
|
|
12
|
+
* @param input - Value tagged with source unit
|
|
13
|
+
* @returns Value tagged with destination unit
|
|
14
|
+
*
|
|
15
|
+
* @remarks
|
|
16
|
+
* - Must be a pure function (no side effects)
|
|
17
|
+
* - Should be deterministic (same input → same output)
|
|
18
|
+
* - Document precision loss if applicable
|
|
19
|
+
*
|
|
20
|
+
* @example
|
|
21
|
+
* ```typescript
|
|
22
|
+
* const c2f: Converter<Celsius, Fahrenheit> = (c) =>
|
|
23
|
+
* ((c * 9/5) + 32) as Fahrenheit;
|
|
24
|
+
* ```
|
|
25
|
+
*/
|
|
26
|
+
export type Converter<TInput extends WithUnits<unknown, string>, TOutput extends WithUnits<unknown, string>> = (input: TInput) => TOutput;
|
|
27
|
+
/**
|
|
28
|
+
* Bidirectional converter with forward and reverse transformations.
|
|
29
|
+
*
|
|
30
|
+
* @template TInput - First unit type
|
|
31
|
+
* @template TOutput - Second unit type
|
|
32
|
+
*
|
|
33
|
+
* @property to - Forward converter (TInput → TOutput)
|
|
34
|
+
* @property from - Reverse converter (TOutput → TInput)
|
|
35
|
+
*
|
|
36
|
+
* @remarks
|
|
37
|
+
* - Round-trip conversions should preserve value within acceptable tolerance
|
|
38
|
+
* - Both converters must be deterministic
|
|
39
|
+
* - Use when both conversion directions are commonly needed
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const meterKilometer: BidirectionalConverter<Meters, Kilometers> = {
|
|
44
|
+
* to: (m) => (m / 1000) as Kilometers,
|
|
45
|
+
* from: (km) => (km * 1000) as Meters
|
|
46
|
+
* };
|
|
47
|
+
* ```
|
|
48
|
+
*/
|
|
49
|
+
export type BidirectionalConverter<TInput extends WithUnits<unknown, string>, TOutput extends WithUnits<unknown, string>> = {
|
|
50
|
+
to: Converter<TInput, TOutput>;
|
|
51
|
+
from: Converter<TOutput, TInput>;
|
|
52
|
+
};
|
|
53
|
+
//# sourceMappingURL=converters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.d.ts","sourceRoot":"","sources":["../src/converters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,SAAS,CAAC;AAEzC;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,SAAS,CACnB,MAAM,SAAS,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,EACzC,OAAO,SAAS,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,IACxC,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAE/B;;;;;;;;;;;;;;;;;;;;;GAqBG;AACH,MAAM,MAAM,sBAAsB,CAChC,MAAM,SAAS,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,EACzC,OAAO,SAAS,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,IACxC;IACF,EAAE,EAAE,SAAS,CAAC,MAAM,EAAE,OAAO,CAAC,CAAC;IAC/B,IAAI,EAAE,SAAS,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;CAClC,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"converters.js","sourceRoot":"","sources":["../src/converters.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/dist/errors.d.ts
ADDED
|
@@ -0,0 +1,40 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all Unacy errors
|
|
3
|
+
*/
|
|
4
|
+
export declare class UnacyError extends Error {
|
|
5
|
+
constructor(message: string);
|
|
6
|
+
}
|
|
7
|
+
/**
|
|
8
|
+
* Error thrown when a cycle is detected in the conversion graph
|
|
9
|
+
*/
|
|
10
|
+
export declare class CycleError extends UnacyError {
|
|
11
|
+
readonly path: PropertyKey[];
|
|
12
|
+
constructor(path: PropertyKey[]);
|
|
13
|
+
}
|
|
14
|
+
/**
|
|
15
|
+
* Error thrown when maximum conversion depth is exceeded
|
|
16
|
+
*/
|
|
17
|
+
export declare class MaxDepthError extends UnacyError {
|
|
18
|
+
readonly from: PropertyKey;
|
|
19
|
+
readonly to: PropertyKey;
|
|
20
|
+
readonly maxDepth: number;
|
|
21
|
+
constructor(from: PropertyKey, to: PropertyKey, maxDepth: number);
|
|
22
|
+
}
|
|
23
|
+
/**
|
|
24
|
+
* Error thrown when a conversion cannot be performed
|
|
25
|
+
*/
|
|
26
|
+
export declare class ConversionError extends UnacyError {
|
|
27
|
+
readonly from: PropertyKey;
|
|
28
|
+
readonly to: PropertyKey;
|
|
29
|
+
constructor(from: PropertyKey, to: PropertyKey, reason?: string);
|
|
30
|
+
}
|
|
31
|
+
/**
|
|
32
|
+
* Error thrown when parsing a string into a tagged format fails
|
|
33
|
+
*/
|
|
34
|
+
export declare class ParseError extends UnacyError {
|
|
35
|
+
readonly format: string;
|
|
36
|
+
readonly input: string;
|
|
37
|
+
readonly reason: string;
|
|
38
|
+
constructor(format: string, input: string, reason: string);
|
|
39
|
+
}
|
|
40
|
+
//# sourceMappingURL=errors.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"errors.d.ts","sourceRoot":"","sources":["../src/errors.ts"],"names":[],"mappings":"AAAA;;GAEG;AACH,qBAAa,UAAW,SAAQ,KAAK;IACnC,YAAY,OAAO,EAAE,MAAM,EAM1B;CACF;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,SAAgB,IAAI,EAAE,WAAW,EAAE,CAAC;IAEpC,YAAY,IAAI,EAAE,WAAW,EAAE,EAK9B;CACF;AAED;;GAEG;AACH,qBAAa,aAAc,SAAQ,UAAU;IAC3C,SAAgB,IAAI,EAAE,WAAW,CAAC;IAClC,SAAgB,EAAE,EAAE,WAAW,CAAC;IAChC,SAAgB,QAAQ,EAAE,MAAM,CAAC;IAEjC,YAAY,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,QAAQ,EAAE,MAAM,EAQ/D;CACF;AAED;;GAEG;AACH,qBAAa,eAAgB,SAAQ,UAAU;IAC7C,SAAgB,IAAI,EAAE,WAAW,CAAC;IAClC,SAAgB,EAAE,EAAE,WAAW,CAAC;IAEhC,YAAY,IAAI,EAAE,WAAW,EAAE,EAAE,EAAE,WAAW,EAAE,MAAM,CAAC,EAAE,MAAM,EAM9D;CACF;AAED;;GAEG;AACH,qBAAa,UAAW,SAAQ,UAAU;IACxC,SAAgB,MAAM,EAAE,MAAM,CAAC;IAC/B,SAAgB,KAAK,EAAE,MAAM,CAAC;IAC9B,SAAgB,MAAM,EAAE,MAAM,CAAC;IAE/B,YAAY,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EASxD;CACF"}
|
package/dist/errors.js
ADDED
|
@@ -0,0 +1,70 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Base error class for all Unacy errors
|
|
3
|
+
*/
|
|
4
|
+
export class UnacyError extends Error {
|
|
5
|
+
constructor(message) {
|
|
6
|
+
super(message);
|
|
7
|
+
this.name = 'UnacyError';
|
|
8
|
+
// Maintain proper prototype chain for instanceof checks
|
|
9
|
+
Object.setPrototypeOf(this, new.target.prototype);
|
|
10
|
+
}
|
|
11
|
+
}
|
|
12
|
+
/**
|
|
13
|
+
* Error thrown when a cycle is detected in the conversion graph
|
|
14
|
+
*/
|
|
15
|
+
export class CycleError extends UnacyError {
|
|
16
|
+
path;
|
|
17
|
+
constructor(path) {
|
|
18
|
+
const pathStr = path.map(String).join(' → ');
|
|
19
|
+
super(`Cycle detected in conversion path: ${pathStr}`);
|
|
20
|
+
this.name = 'CycleError';
|
|
21
|
+
this.path = path;
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
/**
|
|
25
|
+
* Error thrown when maximum conversion depth is exceeded
|
|
26
|
+
*/
|
|
27
|
+
export class MaxDepthError extends UnacyError {
|
|
28
|
+
from;
|
|
29
|
+
to;
|
|
30
|
+
maxDepth;
|
|
31
|
+
constructor(from, to, maxDepth) {
|
|
32
|
+
super(`Maximum conversion depth of ${maxDepth} exceeded when converting from ${String(from)} to ${String(to)}`);
|
|
33
|
+
this.name = 'MaxDepthError';
|
|
34
|
+
this.from = from;
|
|
35
|
+
this.to = to;
|
|
36
|
+
this.maxDepth = maxDepth;
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
/**
|
|
40
|
+
* Error thrown when a conversion cannot be performed
|
|
41
|
+
*/
|
|
42
|
+
export class ConversionError extends UnacyError {
|
|
43
|
+
from;
|
|
44
|
+
to;
|
|
45
|
+
constructor(from, to, reason) {
|
|
46
|
+
const reasonStr = reason ? `: ${reason}` : '';
|
|
47
|
+
super(`Cannot convert from ${String(from)} to ${String(to)}${reasonStr}`);
|
|
48
|
+
this.name = 'ConversionError';
|
|
49
|
+
this.from = from;
|
|
50
|
+
this.to = to;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/**
|
|
54
|
+
* Error thrown when parsing a string into a tagged format fails
|
|
55
|
+
*/
|
|
56
|
+
export class ParseError extends UnacyError {
|
|
57
|
+
format;
|
|
58
|
+
input;
|
|
59
|
+
reason;
|
|
60
|
+
constructor(format, input, reason) {
|
|
61
|
+
const truncatedInput = input.length > 50 ? `${input.slice(0, 50)}...` : input;
|
|
62
|
+
const displayInput = input === '' ? '""' : truncatedInput;
|
|
63
|
+
super(`Cannot parse "${displayInput}" as ${format}: ${reason}`);
|
|
64
|
+
this.name = 'ParseError';
|
|
65
|
+
this.format = format;
|
|
66
|
+
this.input = input;
|
|
67
|
+
this.reason = reason;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
//# sourceMappingURL=errors.js.map
|
|
@@ -0,0 +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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Formatter and parser types for format-tagged values
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
import type { WithFormat } from './types';
|
|
6
|
+
/**
|
|
7
|
+
* Formatter converts a format-tagged value to a string representation.
|
|
8
|
+
*
|
|
9
|
+
* @template TInput - Format-tagged type to format
|
|
10
|
+
*
|
|
11
|
+
* @param input - Value tagged with format
|
|
12
|
+
* @returns Plain string representation
|
|
13
|
+
*
|
|
14
|
+
* @remarks
|
|
15
|
+
* - Output string must be parseable by corresponding `Parser`
|
|
16
|
+
* - Should produce human-readable or machine-parseable output
|
|
17
|
+
* - Format tag is lost in the output
|
|
18
|
+
*
|
|
19
|
+
* @example
|
|
20
|
+
* ```typescript
|
|
21
|
+
* const formatISO: Formatter<ISO8601> = (date) => date.toISOString();
|
|
22
|
+
* ```
|
|
23
|
+
*/
|
|
24
|
+
export type Formatter<TInput extends WithFormat<unknown, string>> = (input: TInput) => string;
|
|
25
|
+
/**
|
|
26
|
+
* Parser converts a string into a format-tagged value with validation.
|
|
27
|
+
*
|
|
28
|
+
* @template TOutput - Format-tagged type to produce
|
|
29
|
+
*
|
|
30
|
+
* @param input - Plain string to parse
|
|
31
|
+
* @returns Value tagged with format
|
|
32
|
+
*
|
|
33
|
+
* @throws {ParseError} When input string is invalid
|
|
34
|
+
*
|
|
35
|
+
* @remarks
|
|
36
|
+
* - Must validate input before tagging
|
|
37
|
+
* - Must throw clear errors (not return invalid tagged values)
|
|
38
|
+
* - Should use Zod or similar for schema validation
|
|
39
|
+
* - Never produces invalid tagged values
|
|
40
|
+
*
|
|
41
|
+
* @example
|
|
42
|
+
* ```typescript
|
|
43
|
+
* const parseISO: Parser<ISO8601> = (input) => {
|
|
44
|
+
* const schema = z.string().datetime();
|
|
45
|
+
* const validated = schema.parse(input);
|
|
46
|
+
* return new Date(validated) as ISO8601;
|
|
47
|
+
* };
|
|
48
|
+
* ```
|
|
49
|
+
*/
|
|
50
|
+
export type Parser<TOutput extends WithFormat<unknown, string>> = (input: string) => TOutput;
|
|
51
|
+
/**
|
|
52
|
+
* Paired formatter/parser for round-trip format transformations.
|
|
53
|
+
*
|
|
54
|
+
* @template T - Format-tagged type
|
|
55
|
+
*
|
|
56
|
+
* @property format - Converts tagged value → string
|
|
57
|
+
* @property parse - Converts string → tagged value
|
|
58
|
+
*
|
|
59
|
+
* @remarks
|
|
60
|
+
* - Round-trip must succeed for valid values: `parse(format(x)) ≡ x`
|
|
61
|
+
* - Parser must reject invalid strings with clear errors
|
|
62
|
+
* - Use when both formatting and parsing are needed
|
|
63
|
+
*
|
|
64
|
+
* @example
|
|
65
|
+
* ```typescript
|
|
66
|
+
* const iso8601: FormatterParser<ISO8601> = {
|
|
67
|
+
* format: (date) => date.toISOString(),
|
|
68
|
+
* parse: (str) => {
|
|
69
|
+
* const date = new Date(str);
|
|
70
|
+
* if (isNaN(date.getTime())) {
|
|
71
|
+
* throw new ParseError('ISO8601', str, 'Invalid date');
|
|
72
|
+
* }
|
|
73
|
+
* return date as ISO8601;
|
|
74
|
+
* }
|
|
75
|
+
* };
|
|
76
|
+
* ```
|
|
77
|
+
*/
|
|
78
|
+
export type FormatterParser<T extends WithFormat<unknown, string>> = {
|
|
79
|
+
format: Formatter<T>;
|
|
80
|
+
parse: Parser<T>;
|
|
81
|
+
};
|
|
82
|
+
//# sourceMappingURL=formatters.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.d.ts","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAEH,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAE1C;;;;;;;;;;;;;;;;;GAiBG;AACH,MAAM,MAAM,SAAS,CAAC,MAAM,SAAS,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,MAAM,CAAC;AAE9F;;;;;;;;;;;;;;;;;;;;;;;;GAwBG;AACH,MAAM,MAAM,MAAM,CAAC,OAAO,SAAS,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI,CAAC,KAAK,EAAE,MAAM,KAAK,OAAO,CAAC;AAE7F;;;;;;;;;;;;;;;;;;;;;;;;;;GA0BG;AACH,MAAM,MAAM,eAAe,CAAC,CAAC,SAAS,UAAU,CAAC,OAAO,EAAE,MAAM,CAAC,IAAI;IACnE,MAAM,EAAE,SAAS,CAAC,CAAC,CAAC,CAAC;IACrB,KAAK,EAAE,MAAM,CAAC,CAAC,CAAC,CAAC;CAClB,CAAC"}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
|
package/dist/index.d.ts
ADDED
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unacy Core - Type-safe unit and format conversion library
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
export type { WithUnits, WithFormat } from './types';
|
|
6
|
+
export type { Converter, BidirectionalConverter } from './converters';
|
|
7
|
+
export type { Formatter, Parser, FormatterParser } from './formatters';
|
|
8
|
+
export type { ConverterRegistry } from './registry';
|
|
9
|
+
export { createRegistry } from './registry';
|
|
10
|
+
export { UnacyError, CycleError, MaxDepthError, ConversionError, ParseError } from './errors';
|
|
11
|
+
export { createParserWithSchema } from './utils/validation';
|
|
12
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAGH,YAAY,EAAE,SAAS,EAAE,UAAU,EAAE,MAAM,SAAS,CAAC;AAGrD,YAAY,EAAE,SAAS,EAAE,sBAAsB,EAAE,MAAM,cAAc,CAAC;AAGtE,YAAY,EAAE,SAAS,EAAE,MAAM,EAAE,eAAe,EAAE,MAAM,cAAc,CAAC;AAGvE,YAAY,EAAE,iBAAiB,EAAE,MAAM,YAAY,CAAC;AACpD,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAG5C,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAG9F,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC"}
|
package/dist/index.js
ADDED
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Unacy Core - Type-safe unit and format conversion library
|
|
3
|
+
* @packageDocumentation
|
|
4
|
+
*/
|
|
5
|
+
export { createRegistry } from './registry';
|
|
6
|
+
// Errors
|
|
7
|
+
export { UnacyError, CycleError, MaxDepthError, ConversionError, ParseError } from './errors';
|
|
8
|
+
// Utilities
|
|
9
|
+
export { createParserWithSchema } from './utils/validation';
|
|
10
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA;;;GAGG;AAaH,OAAO,EAAE,cAAc,EAAE,MAAM,YAAY,CAAC;AAE5C,SAAS;AACT,OAAO,EAAE,UAAU,EAAE,UAAU,EAAE,aAAa,EAAE,eAAe,EAAE,UAAU,EAAE,MAAM,UAAU,CAAC;AAE9F,YAAY;AACZ,OAAO,EAAE,sBAAsB,EAAE,MAAM,oBAAoB,CAAC"}
|