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.
Files changed (51) hide show
  1. package/dist/__tests__/converters.test.d.ts +2 -0
  2. package/dist/__tests__/converters.test.d.ts.map +1 -0
  3. package/dist/__tests__/converters.test.js +128 -0
  4. package/dist/__tests__/converters.test.js.map +1 -0
  5. package/dist/__tests__/errors.test.d.ts +2 -0
  6. package/dist/__tests__/errors.test.d.ts.map +1 -0
  7. package/dist/__tests__/errors.test.js +93 -0
  8. package/dist/__tests__/errors.test.js.map +1 -0
  9. package/dist/__tests__/formatters.test.d.ts +2 -0
  10. package/dist/__tests__/formatters.test.d.ts.map +1 -0
  11. package/dist/__tests__/formatters.test.js +244 -0
  12. package/dist/__tests__/formatters.test.js.map +1 -0
  13. package/dist/__tests__/registry.test.d.ts +2 -0
  14. package/dist/__tests__/registry.test.d.ts.map +1 -0
  15. package/dist/__tests__/registry.test.js +250 -0
  16. package/dist/__tests__/registry.test.js.map +1 -0
  17. package/dist/__tests__/types.test.d.ts +2 -0
  18. package/dist/__tests__/types.test.js.map +1 -1
  19. package/dist/converters.d.ts +53 -0
  20. package/dist/converters.d.ts.map +1 -0
  21. package/dist/converters.js +6 -0
  22. package/dist/converters.js.map +1 -0
  23. package/dist/errors.d.ts +40 -0
  24. package/dist/errors.d.ts.map +1 -0
  25. package/dist/errors.js +70 -0
  26. package/dist/errors.js.map +1 -0
  27. package/dist/formatters.d.ts +82 -0
  28. package/dist/formatters.d.ts.map +1 -0
  29. package/dist/formatters.js +6 -0
  30. package/dist/formatters.js.map +1 -0
  31. package/dist/index.d.ts +12 -0
  32. package/dist/index.d.ts.map +1 -0
  33. package/dist/index.js +10 -0
  34. package/dist/index.js.map +1 -0
  35. package/dist/registry.d.ts +141 -0
  36. package/dist/registry.d.ts.map +1 -0
  37. package/dist/registry.js +212 -0
  38. package/dist/registry.js.map +1 -0
  39. package/dist/types.d.ts +36 -0
  40. package/dist/types.d.ts.map +1 -0
  41. package/dist/types.js +6 -0
  42. package/dist/types.js.map +1 -0
  43. package/dist/utils/graph.d.ts +26 -0
  44. package/dist/utils/graph.d.ts.map +1 -0
  45. package/dist/utils/graph.js +91 -0
  46. package/dist/utils/graph.js.map +1 -0
  47. package/dist/utils/validation.d.ts +26 -0
  48. package/dist/utils/validation.d.ts.map +1 -0
  49. package/dist/utils/validation.js +35 -0
  50. package/dist/utils/validation.js.map +1 -0
  51. 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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"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=types.test.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"types.test.js","sourceRoot":"","sources":["../../src/__tests__/types.test.ts"],"names":[],"mappings":"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"}
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,6 @@
1
+ /**
2
+ * Type-safe converter function signatures
3
+ * @packageDocumentation
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=converters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"converters.js","sourceRoot":"","sources":["../src/converters.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -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,6 @@
1
+ /**
2
+ * Formatter and parser types for format-tagged values
3
+ * @packageDocumentation
4
+ */
5
+ export {};
6
+ //# sourceMappingURL=formatters.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"formatters.js","sourceRoot":"","sources":["../src/formatters.ts"],"names":[],"mappings":"AAAA;;;GAGG"}
@@ -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"}