uom-types 4.0.1 → 4.1.1

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/CHANGELOG.md CHANGED
@@ -1,6 +1,20 @@
1
1
  # Changelog
2
2
  All notable changes to this project will be documented in this file. Dates are displayed in UTC.
3
3
 
4
+ ## [4.1.1](https://github.com/RebeccaStevens/uom-types/compare/v4.1.0...v4.1.1) (2024-10-18)
5
+
6
+
7
+ ### Bug Fixes
8
+
9
+ * improve handling of unitless with pow/root functions ([ad44cf3](https://github.com/RebeccaStevens/uom-types/commit/ad44cf3accf48207391c2d55b7c10f723b0dad19))
10
+
11
+ # [4.1.0](https://github.com/RebeccaStevens/uom-types/compare/v4.0.1...v4.1.0) (2024-10-18)
12
+
13
+
14
+ ### Features
15
+
16
+ * add ability to make brands compatible with 3rd party brands ([9f7d4cd](https://github.com/RebeccaStevens/uom-types/commit/9f7d4cd4c85bd534db93d4f4457217a43511dc0f))
17
+
4
18
  ## [4.0.1](https://github.com/RebeccaStevens/uom-types/compare/v4.0.0...v4.0.1) (2024-10-14)
5
19
 
6
20
  # [4.0.0](https://github.com/RebeccaStevens/uom-types/compare/v3.1.1...v4.0.0) (2024-10-14)
package/README.md CHANGED
@@ -7,7 +7,8 @@ Typesafe units with no runtime overhead.
7
7
  [![npm version](https://img.shields.io/npm/v/uom-types.svg)](https://www.npmjs.com/package/uom-types)
8
8
  [![jsr Version](https://img.shields.io/jsr/v/@rebeccastevens/uom-types.svg)](https://jsr.io/@rebeccastevens/uom-types)
9
9
  [![CI](https://github.com/RebeccaStevens/template-typescript-node-package/actions/workflows/release.yml/badge.svg)](https://github.com/RebeccaStevens/template-typescript-node-package/actions/workflows/release.yml)
10
- [![Coverage Status](https://codecov.io/gh/RebeccaStevens/template-typescript-node-package/branch/main/graph/badge.svg?token=MVpR1oAbIT)](https://codecov.io/gh/RebeccaStevens/template-typescript-node-package)\
10
+ [![Coverage Status](https://codecov.io/gh/RebeccaStevens/template-typescript-node-package/branch/main/graph/badge.svg?token=MVpR1oAbIT)](https://codecov.io/gh/RebeccaStevens/template-typescript-node-package)
11
+ [![Documentation](./docs/coverage.svg)](https://RebeccaStevens.github.io/uom-types/)\
11
12
  [![code style: prettier](https://img.shields.io/badge/code_style-prettier-ff69b4.svg?style=flat-square)](https://github.com/prettier/prettier)
12
13
  [![GitHub Discussions](https://img.shields.io/github/discussions/RebeccaStevens/template-typescript-node-package?style=flat-square)](https://github.com/RebeccaStevens/template-typescript-node-package/discussions)
13
14
  [![BSD 3 Clause license](https://img.shields.io/github/license/RebeccaStevens/template-typescript-node-package.svg?style=flat-square)](https://opensource.org/licenses/BSD-3-Clause)
package/dist/index.d.cts CHANGED
@@ -1,4 +1,4 @@
1
- // Generated by dts-bundle-generator v9.2.1
1
+ // Generated by dts-bundle-generator v9.5.1
2
2
 
3
3
  /**
4
4
  * @file Autogenerated File - Don't manually edit.
@@ -41,6 +41,35 @@ export type MultiplyExponents<A extends Exponent, B extends Exponent> = A extend
41
41
  * @group Exponent Functions
42
42
  */
43
43
  export type DivideExponents<A extends Exponent, B extends Exponent> = B extends 0 ? never : B extends 1 ? A extends 0 ? 0 : A extends 1 ? 1 : A extends -1 ? -1 : A extends 2 ? 2 : A extends -2 ? -2 : A extends 3 ? 3 : A extends -3 ? -3 : A extends 4 ? 4 : A extends -4 ? -4 : A extends 5 ? 5 : A extends -5 ? -5 : A extends 6 ? 6 : A extends -6 ? -6 : A extends 7 ? 7 : A extends -7 ? -7 : A extends 8 ? 8 : A extends -8 ? -8 : A extends 9 ? 9 : A extends -9 ? -9 : A extends 10 ? 10 : A extends -10 ? -10 : A extends 11 ? 11 : A extends -11 ? -11 : A extends 12 ? 12 : A extends -12 ? -12 : never : B extends -1 ? A extends 0 ? 0 : A extends 1 ? -1 : A extends -1 ? 1 : A extends 2 ? -2 : A extends -2 ? 2 : A extends 3 ? -3 : A extends -3 ? 3 : A extends 4 ? -4 : A extends -4 ? 4 : A extends 5 ? -5 : A extends -5 ? 5 : A extends 6 ? -6 : A extends -6 ? 6 : A extends 7 ? -7 : A extends -7 ? 7 : A extends 8 ? -8 : A extends -8 ? 8 : A extends 9 ? -9 : A extends -9 ? 9 : A extends 10 ? -10 : A extends -10 ? 10 : A extends 11 ? -11 : A extends -11 ? 11 : A extends 12 ? -12 : A extends -12 ? 12 : never : B extends 2 ? A extends 0 ? 0 : A extends 2 ? 1 : A extends -2 ? -1 : A extends 4 ? 2 : A extends -4 ? -2 : A extends 6 ? 3 : A extends -6 ? -3 : A extends 8 ? 4 : A extends -8 ? -4 : A extends 10 ? 5 : A extends -10 ? -5 : A extends 12 ? 6 : A extends -12 ? -6 : never : B extends -2 ? A extends 0 ? 0 : A extends 2 ? -1 : A extends -2 ? 1 : A extends 4 ? -2 : A extends -4 ? 2 : A extends 6 ? -3 : A extends -6 ? 3 : A extends 8 ? -4 : A extends -8 ? 4 : A extends 10 ? -5 : A extends -10 ? 5 : A extends 12 ? -6 : A extends -12 ? 6 : never : B extends 3 ? A extends 0 ? 0 : A extends 3 ? 1 : A extends -3 ? -1 : A extends 6 ? 2 : A extends -6 ? -2 : A extends 9 ? 3 : A extends -9 ? -3 : A extends 12 ? 4 : A extends -12 ? -4 : never : B extends -3 ? A extends 0 ? 0 : A extends 3 ? -1 : A extends -3 ? 1 : A extends 6 ? -2 : A extends -6 ? 2 : A extends 9 ? -3 : A extends -9 ? 3 : A extends 12 ? -4 : A extends -12 ? 4 : never : B extends 4 ? A extends 0 ? 0 : A extends 4 ? 1 : A extends -4 ? -1 : A extends 8 ? 2 : A extends -8 ? -2 : A extends 12 ? 3 : A extends -12 ? -3 : never : B extends -4 ? A extends 0 ? 0 : A extends 4 ? -1 : A extends -4 ? 1 : A extends 8 ? -2 : A extends -8 ? 2 : A extends 12 ? -3 : A extends -12 ? 3 : never : B extends 5 ? A extends 0 ? 0 : A extends 5 ? 1 : A extends -5 ? -1 : A extends 10 ? 2 : A extends -10 ? -2 : never : B extends -5 ? A extends 0 ? 0 : A extends 5 ? -1 : A extends -5 ? 1 : A extends 10 ? -2 : A extends -10 ? 2 : never : B extends 6 ? A extends 0 ? 0 : A extends 6 ? 1 : A extends -6 ? -1 : A extends 12 ? 2 : A extends -12 ? -2 : never : B extends -6 ? A extends 0 ? 0 : A extends 6 ? -1 : A extends -6 ? 1 : A extends 12 ? -2 : A extends -12 ? 2 : never : B extends 7 ? A extends 0 ? 0 : A extends 7 ? 1 : A extends -7 ? -1 : never : B extends -7 ? A extends 0 ? 0 : A extends 7 ? -1 : A extends -7 ? 1 : never : B extends 8 ? A extends 0 ? 0 : A extends 8 ? 1 : A extends -8 ? -1 : never : B extends -8 ? A extends 0 ? 0 : A extends 8 ? -1 : A extends -8 ? 1 : never : B extends 9 ? A extends 0 ? 0 : A extends 9 ? 1 : A extends -9 ? -1 : never : B extends -9 ? A extends 0 ? 0 : A extends 9 ? -1 : A extends -9 ? 1 : never : B extends 10 ? A extends 0 ? 0 : A extends 10 ? 1 : A extends -10 ? -1 : never : B extends -10 ? A extends 0 ? 0 : A extends 10 ? -1 : A extends -10 ? 1 : never : B extends 11 ? A extends 0 ? 0 : A extends 11 ? 1 : A extends -11 ? -1 : never : B extends -11 ? A extends 0 ? 0 : A extends 11 ? -1 : A extends -11 ? 1 : never : B extends 12 ? A extends 0 ? 0 : A extends 12 ? 1 : A extends -12 ? -1 : never : B extends -12 ? A extends 0 ? 0 : A extends 12 ? -1 : A extends -12 ? 1 : never : never;
44
+ /**
45
+ * Available for providing custom branding.
46
+ */
47
+ export interface Brand {
48
+ }
49
+ /**
50
+ * Brand with the unit meta.
51
+ */
52
+ export type BrandUnitMeta<UM extends UnknownUnitMeta> = Brand & {
53
+ __uom_types: {
54
+ unitMeta: UM;
55
+ };
56
+ };
57
+ /**
58
+ * Brand with the unit class.
59
+ */
60
+ export type BrandUnitClass<UC extends UnknownUnitClass> = Brand & {
61
+ __uom_types: {
62
+ unitClass: UC;
63
+ };
64
+ };
65
+ /**
66
+ * Brand that it is a unit class.
67
+ */
68
+ export type BrandUnitClassType = Brand & {
69
+ __uom_types: {
70
+ unitClassType: true;
71
+ };
72
+ };
44
73
  /**
45
74
  * Remove all key from the object that are `never`.
46
75
  */
@@ -83,9 +112,7 @@ export type Exactify<T, U extends T> = T & {
83
112
  *
84
113
  * @group Abstract Unit Generators
85
114
  */
86
- export type AbstractUnit<C extends UnitSubvalues> = number & Readonly<{
87
- __uom_types__unit_class: UnitClass<C>;
88
- }>;
115
+ export type AbstractUnit<C extends UnitSubvalues> = number & BrandUnitClass<UnitClass<C>>;
89
116
  /**
90
117
  * Create a unit without meta data from an already existing {@link UnitClass}.
91
118
  *
@@ -97,10 +124,7 @@ export type AbstractUnitFrom<C extends UnknownUnitClass> = C extends UnitClass<i
97
124
  *
98
125
  * @group Unit Generators
99
126
  */
100
- export type Unit<C extends UnitSubvalues, M extends UnitSubvalues = {}> = number & Readonly<{
101
- __uom_types__unit_class: UnitClass<C>;
102
- __uom_types__unit_meta: UnitMeta<M>;
103
- }>;
127
+ export type Unit<C extends UnitSubvalues, M extends UnitSubvalues = {}> = number & BrandUnitClass<UnitClass<C>> & BrandUnitMeta<UnitMeta<M>>;
104
128
  /**
105
129
  * Create a {@link Unit} from already existing {@link UnitClass} and {@link UnitMeta}.
106
130
  *
@@ -114,9 +138,7 @@ export type UnitFrom<C extends UnknownUnitClass, M extends UnknownUnitMeta = Uni
114
138
  *
115
139
  * @group Unit Generators
116
140
  */
117
- export type UnitConversionRate<M extends UnitSubvalues> = number & Readonly<{
118
- __uom_types__unit_meta: UnitMeta<M>;
119
- }>;
141
+ export type UnitConversionRate<M extends UnitSubvalues> = number & BrandUnitMeta<UnitMeta<M>>;
120
142
  /**
121
143
  * Create a {@link UnitConversionRate} from already existing {@link UnitMeta}.
122
144
  *
@@ -128,9 +150,7 @@ export type UnitConversionRateFrom<M extends UnknownUnitMeta> = M extends UnitMe
128
150
  *
129
151
  * @group Unit Components
130
152
  */
131
- export type UnitClass<T extends UnitSubvalues> = UnitKeyValues<T> & Readonly<{
132
- __uno_types__unit_class_type: true;
133
- }>;
153
+ export type UnitClass<T extends UnitSubvalues> = UnitKeyValues<T> & BrandUnitClassType;
134
154
  /**
135
155
  * Used to state how units of the same {@link UnitClass} differ from one another.
136
156
  * For example, by a scale factor.
@@ -145,33 +165,25 @@ export type UnitMeta<T extends UnitSubvalues> = UnitKeyValues<T> & Readonly<{
145
165
  *
146
166
  * @group Unknown Units
147
167
  */
148
- export type UnknownUnit = UnknownAbstractUnit & Readonly<{
149
- __uom_types__unit_meta: UnknownUnitMeta;
150
- }>;
168
+ export type UnknownUnit = UnknownAbstractUnit & BrandUnitMeta<UnknownUnitMeta>;
151
169
  /**
152
170
  * An {@link AbstractUnit} that we don't know anything about.
153
171
  *
154
172
  * @group Unknown Units
155
173
  */
156
- export type UnknownAbstractUnit = number & Readonly<{
157
- __uom_types__unit_class: UnknownUnitClass;
158
- }>;
174
+ export type UnknownAbstractUnit = number & BrandUnitClass<UnknownUnitClass>;
159
175
  /**
160
176
  * An {@link UnitConversionRate} that we don't know anything about.
161
177
  *
162
178
  * @group Unknown Units
163
179
  */
164
- export type UnknownUnitConversionRate = number & Readonly<{
165
- __uom_types__unit_meta: UnknownUnitMeta;
166
- }>;
180
+ export type UnknownUnitConversionRate = number & BrandUnitMeta<UnknownUnitMeta>;
167
181
  /**
168
182
  * A {@link UnitClass} that we don't know anything about.
169
183
  *
170
184
  * @group Unknown Units
171
185
  */
172
- export type UnknownUnitClass = UnknownUnitKeyValues & Readonly<{
173
- __uno_types__unit_class_type: true;
174
- }>;
186
+ export type UnknownUnitClass = UnknownUnitKeyValues & BrandUnitClassType;
175
187
  /**
176
188
  * A {@link UnitMeta} that we don't know anything about.
177
189
  *
@@ -258,28 +270,28 @@ export type DivideUnitSubvalues<A extends UnitSubvalues, B extends UnitSubvalues
258
270
  *
259
271
  * @group Unit Functions
260
272
  */
261
- export type Pow<T extends number, N extends Exponent> = T extends Unit<infer Class, infer Meta> ? Unit<FlatternAlias<PowUnitSubvalues<Class, N>>, FlatternAlias<PowUnitSubvalues<Meta, N>>> : T extends AbstractUnit<infer Class> ? AbstractUnit<FlatternAlias<PowUnitSubvalues<Class, N>>> : T extends UnitConversionRate<infer Meta> ? UnitConversionRate<FlatternAlias<PowUnitSubvalues<Meta, N>>> : number;
273
+ export type Pow<B extends number, E extends Exponent> = B extends Unit<infer Class, infer Meta> ? Unit<FlatternAlias<PowUnitSubvalues<Class, E>>, FlatternAlias<PowUnitSubvalues<Meta, E>>> : B extends AbstractUnit<infer Class> ? AbstractUnit<FlatternAlias<PowUnitSubvalues<Class, E>>> : B extends UnitConversionRate<infer Meta> ? UnitConversionRate<FlatternAlias<PowUnitSubvalues<Meta, E>>> : number;
262
274
  /**
263
275
  * Put each subvalue of a unit to the power of an exponent.
264
276
  *
265
277
  * @group Unit Subvalue Functions
266
278
  */
267
- export type PowUnitSubvalues<T extends UnitSubvalues, E extends Exponent> = ExcludeUnitZeroSubvalues<{
268
- [S in keyof T]: MultiplyExponents<GetExponent<T, S>, E>;
279
+ export type PowUnitSubvalues<B extends UnitSubvalues, E extends Exponent> = ExcludeUnitZeroSubvalues<{
280
+ [S in keyof B]: MultiplyExponents<GetExponent<B, S>, E>;
269
281
  }>;
270
282
  /**
271
283
  * Take the nth root of a unit.
272
284
  *
273
285
  * @group Unit Functions
274
286
  */
275
- export type Root<T extends number, N extends Exponent> = T extends Unit<infer Class, infer Meta> ? Unit<FlatternAlias<RootUnitSubvalues<Class, N>>, FlatternAlias<RootUnitSubvalues<Meta, N>>> : T extends AbstractUnit<infer Class> ? AbstractUnit<FlatternAlias<RootUnitSubvalues<Class, N>>> : T extends UnitConversionRate<infer Meta> ? UnitConversionRate<FlatternAlias<RootUnitSubvalues<Meta, N>>> : number;
287
+ export type Root<B extends number, E extends Exponent> = B extends Unit<infer Class, infer Meta> ? Unit<FlatternAlias<RootUnitSubvalues<Class, E>>, FlatternAlias<RootUnitSubvalues<Meta, E>>> : B extends AbstractUnit<infer Class> ? AbstractUnit<FlatternAlias<RootUnitSubvalues<Class, E>>> : B extends UnitConversionRate<infer Meta> ? UnitConversionRate<FlatternAlias<RootUnitSubvalues<Meta, E>>> : number;
276
288
  /**
277
289
  * Take the nth root of each subvalue of a unit.
278
290
  *
279
291
  * @group Unit Subvalue Functions
280
292
  */
281
- export type RootUnitSubvalues<T extends UnitSubvalues, E extends Exponent> = ExcludeUnitZeroSubvalues<{
282
- [S in keyof T]: DivideExponents<GetExponent<T, S>, E>;
293
+ export type RootUnitSubvalues<B extends UnitSubvalues, E extends Exponent> = ExcludeUnitZeroSubvalues<{
294
+ [S in keyof B]: DivideExponents<GetExponent<B, S>, E>;
283
295
  }>;
284
296
  export type SiUnitKeys = "Second" | "Meter" | "Kilogram" | "Mole" | "Ampere" | "Candela" | "Kelvin" | "Radian";
285
297
  /**
@@ -4256,43 +4268,38 @@ export declare function modSafe<T extends number>(a: OperationIO<T>, b: Operatio
4256
4268
  * @returns A function that takes a integer and returns an integer between zero (inclusive) and `b` (exclusive).
4257
4269
  */
4258
4270
  export declare function modSafe<T extends number>(b: OperationIO<T>): (a: OperationIO<T>) => OperationIO<T>;
4259
- export type PowFunction<E extends number, B extends number> = E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E extends Exponent ? (b: B) => Pow<B, E> : E extends 0.5 ? (b: B) => Root<B, 2> : (b: B) => number;
4271
+ export type PowResult<B extends number, E extends number> = E extends Unitless ? PowResult<B, number> : E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E extends Exponent ? Pow<B, E> : E extends 0.5 ? Root<B, 2> : B extends Unitless ? B : number;
4272
+ export type PowFunction<B extends number, E extends number> = (b: B) => PowResult<B, E>;
4273
+ export type RootResult<B extends number, E extends number> = E extends Unitless ? RootResult<B, number> : E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E extends Exponent ? Root<B, E> : E extends 0.5 ? Pow<B, 2> : B extends Unitless ? B : number;
4274
+ export type RootFunction<B extends number, E extends number> = (b: B) => RootResult<B, E>;
4260
4275
  /**
4261
4276
  * Raise a number to the power of another.
4262
4277
  *
4263
4278
  * @category Math
4264
4279
  * @returns `base ** exponent`
4265
4280
  */
4266
- export declare function pow<B extends number, E extends number>(base: B, exponent: E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E): E extends Exponent ? Pow<B, E> : number;
4267
- /**
4268
- * Put a number to the power of 1/2.
4269
- *
4270
- * @category Math
4271
- * @returns `base ** 0.5`
4272
- */
4273
- export declare function pow<B extends number>(base: B, exponent: 0.5): Root<B, 2>;
4281
+ export declare function pow<B extends number, E extends number>(base: B, exponent: E): PowResult<B, E>;
4274
4282
  /**
4275
4283
  * Put a number to the power of the given value.
4276
4284
  *
4277
4285
  * @category Math
4278
4286
  * @returns `(base) => base ** exponent`
4279
4287
  */
4280
- export declare function pow<E extends number>(exponent: E): <B extends number>(base: Parameters<PowFunction<E, B>>[0]) => ReturnType<PowFunction<E, B>>;
4281
- export type RootFunction<E extends number, B extends number> = E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E extends PosExponent ? (b: B) => Root<B, E> : (b: B) => number;
4288
+ export declare function pow<E extends number>(exponent: E): <B extends number>(base: Parameters<PowFunction<B, E>>[0]) => ReturnType<PowFunction<B, E>>;
4282
4289
  /**
4283
4290
  * Take the nth root of a number.
4284
4291
  *
4285
4292
  * @category Math
4286
4293
  * @returns `base ** (1 / exponent)`
4287
4294
  */
4288
- export declare function root<B extends number, E extends number>(base: B, exponent: E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E): E extends PosExponent ? Root<B, E> : number;
4295
+ export declare function root<B extends number, E extends number>(base: B, exponent: E): RootResult<B, E>;
4289
4296
  /**
4290
4297
  * Take the nth root of a number.
4291
4298
  *
4292
4299
  * @category Math
4293
4300
  * @returns `(base) => base ** (1 / exponent)`
4294
4301
  */
4295
- export declare function root<E extends number>(exponent: E): <B extends number>(base: Parameters<RootFunction<E, B>>[0]) => ReturnType<RootFunction<E, B>>;
4302
+ export declare function root<E extends number>(exponent: E): <B extends number>(base: Parameters<RootFunction<B, E>>[0]) => ReturnType<RootFunction<B, E>>;
4296
4303
  /**
4297
4304
  * Take the square root of the given value.
4298
4305
  *
package/dist/index.d.mts CHANGED
@@ -1,4 +1,4 @@
1
- // Generated by dts-bundle-generator v9.2.1
1
+ // Generated by dts-bundle-generator v9.5.1
2
2
 
3
3
  /**
4
4
  * @file Autogenerated File - Don't manually edit.
@@ -41,6 +41,35 @@ export type MultiplyExponents<A extends Exponent, B extends Exponent> = A extend
41
41
  * @group Exponent Functions
42
42
  */
43
43
  export type DivideExponents<A extends Exponent, B extends Exponent> = B extends 0 ? never : B extends 1 ? A extends 0 ? 0 : A extends 1 ? 1 : A extends -1 ? -1 : A extends 2 ? 2 : A extends -2 ? -2 : A extends 3 ? 3 : A extends -3 ? -3 : A extends 4 ? 4 : A extends -4 ? -4 : A extends 5 ? 5 : A extends -5 ? -5 : A extends 6 ? 6 : A extends -6 ? -6 : A extends 7 ? 7 : A extends -7 ? -7 : A extends 8 ? 8 : A extends -8 ? -8 : A extends 9 ? 9 : A extends -9 ? -9 : A extends 10 ? 10 : A extends -10 ? -10 : A extends 11 ? 11 : A extends -11 ? -11 : A extends 12 ? 12 : A extends -12 ? -12 : never : B extends -1 ? A extends 0 ? 0 : A extends 1 ? -1 : A extends -1 ? 1 : A extends 2 ? -2 : A extends -2 ? 2 : A extends 3 ? -3 : A extends -3 ? 3 : A extends 4 ? -4 : A extends -4 ? 4 : A extends 5 ? -5 : A extends -5 ? 5 : A extends 6 ? -6 : A extends -6 ? 6 : A extends 7 ? -7 : A extends -7 ? 7 : A extends 8 ? -8 : A extends -8 ? 8 : A extends 9 ? -9 : A extends -9 ? 9 : A extends 10 ? -10 : A extends -10 ? 10 : A extends 11 ? -11 : A extends -11 ? 11 : A extends 12 ? -12 : A extends -12 ? 12 : never : B extends 2 ? A extends 0 ? 0 : A extends 2 ? 1 : A extends -2 ? -1 : A extends 4 ? 2 : A extends -4 ? -2 : A extends 6 ? 3 : A extends -6 ? -3 : A extends 8 ? 4 : A extends -8 ? -4 : A extends 10 ? 5 : A extends -10 ? -5 : A extends 12 ? 6 : A extends -12 ? -6 : never : B extends -2 ? A extends 0 ? 0 : A extends 2 ? -1 : A extends -2 ? 1 : A extends 4 ? -2 : A extends -4 ? 2 : A extends 6 ? -3 : A extends -6 ? 3 : A extends 8 ? -4 : A extends -8 ? 4 : A extends 10 ? -5 : A extends -10 ? 5 : A extends 12 ? -6 : A extends -12 ? 6 : never : B extends 3 ? A extends 0 ? 0 : A extends 3 ? 1 : A extends -3 ? -1 : A extends 6 ? 2 : A extends -6 ? -2 : A extends 9 ? 3 : A extends -9 ? -3 : A extends 12 ? 4 : A extends -12 ? -4 : never : B extends -3 ? A extends 0 ? 0 : A extends 3 ? -1 : A extends -3 ? 1 : A extends 6 ? -2 : A extends -6 ? 2 : A extends 9 ? -3 : A extends -9 ? 3 : A extends 12 ? -4 : A extends -12 ? 4 : never : B extends 4 ? A extends 0 ? 0 : A extends 4 ? 1 : A extends -4 ? -1 : A extends 8 ? 2 : A extends -8 ? -2 : A extends 12 ? 3 : A extends -12 ? -3 : never : B extends -4 ? A extends 0 ? 0 : A extends 4 ? -1 : A extends -4 ? 1 : A extends 8 ? -2 : A extends -8 ? 2 : A extends 12 ? -3 : A extends -12 ? 3 : never : B extends 5 ? A extends 0 ? 0 : A extends 5 ? 1 : A extends -5 ? -1 : A extends 10 ? 2 : A extends -10 ? -2 : never : B extends -5 ? A extends 0 ? 0 : A extends 5 ? -1 : A extends -5 ? 1 : A extends 10 ? -2 : A extends -10 ? 2 : never : B extends 6 ? A extends 0 ? 0 : A extends 6 ? 1 : A extends -6 ? -1 : A extends 12 ? 2 : A extends -12 ? -2 : never : B extends -6 ? A extends 0 ? 0 : A extends 6 ? -1 : A extends -6 ? 1 : A extends 12 ? -2 : A extends -12 ? 2 : never : B extends 7 ? A extends 0 ? 0 : A extends 7 ? 1 : A extends -7 ? -1 : never : B extends -7 ? A extends 0 ? 0 : A extends 7 ? -1 : A extends -7 ? 1 : never : B extends 8 ? A extends 0 ? 0 : A extends 8 ? 1 : A extends -8 ? -1 : never : B extends -8 ? A extends 0 ? 0 : A extends 8 ? -1 : A extends -8 ? 1 : never : B extends 9 ? A extends 0 ? 0 : A extends 9 ? 1 : A extends -9 ? -1 : never : B extends -9 ? A extends 0 ? 0 : A extends 9 ? -1 : A extends -9 ? 1 : never : B extends 10 ? A extends 0 ? 0 : A extends 10 ? 1 : A extends -10 ? -1 : never : B extends -10 ? A extends 0 ? 0 : A extends 10 ? -1 : A extends -10 ? 1 : never : B extends 11 ? A extends 0 ? 0 : A extends 11 ? 1 : A extends -11 ? -1 : never : B extends -11 ? A extends 0 ? 0 : A extends 11 ? -1 : A extends -11 ? 1 : never : B extends 12 ? A extends 0 ? 0 : A extends 12 ? 1 : A extends -12 ? -1 : never : B extends -12 ? A extends 0 ? 0 : A extends 12 ? -1 : A extends -12 ? 1 : never : never;
44
+ /**
45
+ * Available for providing custom branding.
46
+ */
47
+ export interface Brand {
48
+ }
49
+ /**
50
+ * Brand with the unit meta.
51
+ */
52
+ export type BrandUnitMeta<UM extends UnknownUnitMeta> = Brand & {
53
+ __uom_types: {
54
+ unitMeta: UM;
55
+ };
56
+ };
57
+ /**
58
+ * Brand with the unit class.
59
+ */
60
+ export type BrandUnitClass<UC extends UnknownUnitClass> = Brand & {
61
+ __uom_types: {
62
+ unitClass: UC;
63
+ };
64
+ };
65
+ /**
66
+ * Brand that it is a unit class.
67
+ */
68
+ export type BrandUnitClassType = Brand & {
69
+ __uom_types: {
70
+ unitClassType: true;
71
+ };
72
+ };
44
73
  /**
45
74
  * Remove all key from the object that are `never`.
46
75
  */
@@ -83,9 +112,7 @@ export type Exactify<T, U extends T> = T & {
83
112
  *
84
113
  * @group Abstract Unit Generators
85
114
  */
86
- export type AbstractUnit<C extends UnitSubvalues> = number & Readonly<{
87
- __uom_types__unit_class: UnitClass<C>;
88
- }>;
115
+ export type AbstractUnit<C extends UnitSubvalues> = number & BrandUnitClass<UnitClass<C>>;
89
116
  /**
90
117
  * Create a unit without meta data from an already existing {@link UnitClass}.
91
118
  *
@@ -97,10 +124,7 @@ export type AbstractUnitFrom<C extends UnknownUnitClass> = C extends UnitClass<i
97
124
  *
98
125
  * @group Unit Generators
99
126
  */
100
- export type Unit<C extends UnitSubvalues, M extends UnitSubvalues = {}> = number & Readonly<{
101
- __uom_types__unit_class: UnitClass<C>;
102
- __uom_types__unit_meta: UnitMeta<M>;
103
- }>;
127
+ export type Unit<C extends UnitSubvalues, M extends UnitSubvalues = {}> = number & BrandUnitClass<UnitClass<C>> & BrandUnitMeta<UnitMeta<M>>;
104
128
  /**
105
129
  * Create a {@link Unit} from already existing {@link UnitClass} and {@link UnitMeta}.
106
130
  *
@@ -114,9 +138,7 @@ export type UnitFrom<C extends UnknownUnitClass, M extends UnknownUnitMeta = Uni
114
138
  *
115
139
  * @group Unit Generators
116
140
  */
117
- export type UnitConversionRate<M extends UnitSubvalues> = number & Readonly<{
118
- __uom_types__unit_meta: UnitMeta<M>;
119
- }>;
141
+ export type UnitConversionRate<M extends UnitSubvalues> = number & BrandUnitMeta<UnitMeta<M>>;
120
142
  /**
121
143
  * Create a {@link UnitConversionRate} from already existing {@link UnitMeta}.
122
144
  *
@@ -128,9 +150,7 @@ export type UnitConversionRateFrom<M extends UnknownUnitMeta> = M extends UnitMe
128
150
  *
129
151
  * @group Unit Components
130
152
  */
131
- export type UnitClass<T extends UnitSubvalues> = UnitKeyValues<T> & Readonly<{
132
- __uno_types__unit_class_type: true;
133
- }>;
153
+ export type UnitClass<T extends UnitSubvalues> = UnitKeyValues<T> & BrandUnitClassType;
134
154
  /**
135
155
  * Used to state how units of the same {@link UnitClass} differ from one another.
136
156
  * For example, by a scale factor.
@@ -145,33 +165,25 @@ export type UnitMeta<T extends UnitSubvalues> = UnitKeyValues<T> & Readonly<{
145
165
  *
146
166
  * @group Unknown Units
147
167
  */
148
- export type UnknownUnit = UnknownAbstractUnit & Readonly<{
149
- __uom_types__unit_meta: UnknownUnitMeta;
150
- }>;
168
+ export type UnknownUnit = UnknownAbstractUnit & BrandUnitMeta<UnknownUnitMeta>;
151
169
  /**
152
170
  * An {@link AbstractUnit} that we don't know anything about.
153
171
  *
154
172
  * @group Unknown Units
155
173
  */
156
- export type UnknownAbstractUnit = number & Readonly<{
157
- __uom_types__unit_class: UnknownUnitClass;
158
- }>;
174
+ export type UnknownAbstractUnit = number & BrandUnitClass<UnknownUnitClass>;
159
175
  /**
160
176
  * An {@link UnitConversionRate} that we don't know anything about.
161
177
  *
162
178
  * @group Unknown Units
163
179
  */
164
- export type UnknownUnitConversionRate = number & Readonly<{
165
- __uom_types__unit_meta: UnknownUnitMeta;
166
- }>;
180
+ export type UnknownUnitConversionRate = number & BrandUnitMeta<UnknownUnitMeta>;
167
181
  /**
168
182
  * A {@link UnitClass} that we don't know anything about.
169
183
  *
170
184
  * @group Unknown Units
171
185
  */
172
- export type UnknownUnitClass = UnknownUnitKeyValues & Readonly<{
173
- __uno_types__unit_class_type: true;
174
- }>;
186
+ export type UnknownUnitClass = UnknownUnitKeyValues & BrandUnitClassType;
175
187
  /**
176
188
  * A {@link UnitMeta} that we don't know anything about.
177
189
  *
@@ -258,28 +270,28 @@ export type DivideUnitSubvalues<A extends UnitSubvalues, B extends UnitSubvalues
258
270
  *
259
271
  * @group Unit Functions
260
272
  */
261
- export type Pow<T extends number, N extends Exponent> = T extends Unit<infer Class, infer Meta> ? Unit<FlatternAlias<PowUnitSubvalues<Class, N>>, FlatternAlias<PowUnitSubvalues<Meta, N>>> : T extends AbstractUnit<infer Class> ? AbstractUnit<FlatternAlias<PowUnitSubvalues<Class, N>>> : T extends UnitConversionRate<infer Meta> ? UnitConversionRate<FlatternAlias<PowUnitSubvalues<Meta, N>>> : number;
273
+ export type Pow<B extends number, E extends Exponent> = B extends Unit<infer Class, infer Meta> ? Unit<FlatternAlias<PowUnitSubvalues<Class, E>>, FlatternAlias<PowUnitSubvalues<Meta, E>>> : B extends AbstractUnit<infer Class> ? AbstractUnit<FlatternAlias<PowUnitSubvalues<Class, E>>> : B extends UnitConversionRate<infer Meta> ? UnitConversionRate<FlatternAlias<PowUnitSubvalues<Meta, E>>> : number;
262
274
  /**
263
275
  * Put each subvalue of a unit to the power of an exponent.
264
276
  *
265
277
  * @group Unit Subvalue Functions
266
278
  */
267
- export type PowUnitSubvalues<T extends UnitSubvalues, E extends Exponent> = ExcludeUnitZeroSubvalues<{
268
- [S in keyof T]: MultiplyExponents<GetExponent<T, S>, E>;
279
+ export type PowUnitSubvalues<B extends UnitSubvalues, E extends Exponent> = ExcludeUnitZeroSubvalues<{
280
+ [S in keyof B]: MultiplyExponents<GetExponent<B, S>, E>;
269
281
  }>;
270
282
  /**
271
283
  * Take the nth root of a unit.
272
284
  *
273
285
  * @group Unit Functions
274
286
  */
275
- export type Root<T extends number, N extends Exponent> = T extends Unit<infer Class, infer Meta> ? Unit<FlatternAlias<RootUnitSubvalues<Class, N>>, FlatternAlias<RootUnitSubvalues<Meta, N>>> : T extends AbstractUnit<infer Class> ? AbstractUnit<FlatternAlias<RootUnitSubvalues<Class, N>>> : T extends UnitConversionRate<infer Meta> ? UnitConversionRate<FlatternAlias<RootUnitSubvalues<Meta, N>>> : number;
287
+ export type Root<B extends number, E extends Exponent> = B extends Unit<infer Class, infer Meta> ? Unit<FlatternAlias<RootUnitSubvalues<Class, E>>, FlatternAlias<RootUnitSubvalues<Meta, E>>> : B extends AbstractUnit<infer Class> ? AbstractUnit<FlatternAlias<RootUnitSubvalues<Class, E>>> : B extends UnitConversionRate<infer Meta> ? UnitConversionRate<FlatternAlias<RootUnitSubvalues<Meta, E>>> : number;
276
288
  /**
277
289
  * Take the nth root of each subvalue of a unit.
278
290
  *
279
291
  * @group Unit Subvalue Functions
280
292
  */
281
- export type RootUnitSubvalues<T extends UnitSubvalues, E extends Exponent> = ExcludeUnitZeroSubvalues<{
282
- [S in keyof T]: DivideExponents<GetExponent<T, S>, E>;
293
+ export type RootUnitSubvalues<B extends UnitSubvalues, E extends Exponent> = ExcludeUnitZeroSubvalues<{
294
+ [S in keyof B]: DivideExponents<GetExponent<B, S>, E>;
283
295
  }>;
284
296
  export type SiUnitKeys = "Second" | "Meter" | "Kilogram" | "Mole" | "Ampere" | "Candela" | "Kelvin" | "Radian";
285
297
  /**
@@ -4256,43 +4268,38 @@ export declare function modSafe<T extends number>(a: OperationIO<T>, b: Operatio
4256
4268
  * @returns A function that takes a integer and returns an integer between zero (inclusive) and `b` (exclusive).
4257
4269
  */
4258
4270
  export declare function modSafe<T extends number>(b: OperationIO<T>): (a: OperationIO<T>) => OperationIO<T>;
4259
- export type PowFunction<E extends number, B extends number> = E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E extends Exponent ? (b: B) => Pow<B, E> : E extends 0.5 ? (b: B) => Root<B, 2> : (b: B) => number;
4271
+ export type PowResult<B extends number, E extends number> = E extends Unitless ? PowResult<B, number> : E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E extends Exponent ? Pow<B, E> : E extends 0.5 ? Root<B, 2> : B extends Unitless ? B : number;
4272
+ export type PowFunction<B extends number, E extends number> = (b: B) => PowResult<B, E>;
4273
+ export type RootResult<B extends number, E extends number> = E extends Unitless ? RootResult<B, number> : E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E extends Exponent ? Root<B, E> : E extends 0.5 ? Pow<B, 2> : B extends Unitless ? B : number;
4274
+ export type RootFunction<B extends number, E extends number> = (b: B) => RootResult<B, E>;
4260
4275
  /**
4261
4276
  * Raise a number to the power of another.
4262
4277
  *
4263
4278
  * @category Math
4264
4279
  * @returns `base ** exponent`
4265
4280
  */
4266
- export declare function pow<B extends number, E extends number>(base: B, exponent: E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E): E extends Exponent ? Pow<B, E> : number;
4267
- /**
4268
- * Put a number to the power of 1/2.
4269
- *
4270
- * @category Math
4271
- * @returns `base ** 0.5`
4272
- */
4273
- export declare function pow<B extends number>(base: B, exponent: 0.5): Root<B, 2>;
4281
+ export declare function pow<B extends number, E extends number>(base: B, exponent: E): PowResult<B, E>;
4274
4282
  /**
4275
4283
  * Put a number to the power of the given value.
4276
4284
  *
4277
4285
  * @category Math
4278
4286
  * @returns `(base) => base ** exponent`
4279
4287
  */
4280
- export declare function pow<E extends number>(exponent: E): <B extends number>(base: Parameters<PowFunction<E, B>>[0]) => ReturnType<PowFunction<E, B>>;
4281
- export type RootFunction<E extends number, B extends number> = E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E extends PosExponent ? (b: B) => Root<B, E> : (b: B) => number;
4288
+ export declare function pow<E extends number>(exponent: E): <B extends number>(base: Parameters<PowFunction<B, E>>[0]) => ReturnType<PowFunction<B, E>>;
4282
4289
  /**
4283
4290
  * Take the nth root of a number.
4284
4291
  *
4285
4292
  * @category Math
4286
4293
  * @returns `base ** (1 / exponent)`
4287
4294
  */
4288
- export declare function root<B extends number, E extends number>(base: B, exponent: E extends UnknownUnit ? never : E extends UnknownAbstractUnit ? never : E): E extends PosExponent ? Root<B, E> : number;
4295
+ export declare function root<B extends number, E extends number>(base: B, exponent: E): RootResult<B, E>;
4289
4296
  /**
4290
4297
  * Take the nth root of a number.
4291
4298
  *
4292
4299
  * @category Math
4293
4300
  * @returns `(base) => base ** (1 / exponent)`
4294
4301
  */
4295
- export declare function root<E extends number>(exponent: E): <B extends number>(base: Parameters<RootFunction<E, B>>[0]) => ReturnType<RootFunction<E, B>>;
4302
+ export declare function root<E extends number>(exponent: E): <B extends number>(base: Parameters<RootFunction<B, E>>[0]) => ReturnType<RootFunction<B, E>>;
4296
4303
  /**
4297
4304
  * Take the square root of the given value.
4298
4305
  *
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "uom-types",
3
- "version": "4.0.1",
3
+ "version": "4.1.1",
4
4
  "description": "Typesafe units with no runtime overhead.",
5
5
  "keywords": [
6
6
  "uom",
@@ -82,7 +82,7 @@
82
82
  "typecheck": "tsc -p tsconfig.build.json --noEmit"
83
83
  },
84
84
  "resolutions": {
85
- "dts-bundle-generator": "9.2.1"
85
+ "dts-bundle-generator": "9.5.1"
86
86
  },
87
87
  "devDependencies": {
88
88
  "@commitlint/cli": "19.5.0",
@@ -101,12 +101,12 @@
101
101
  "@semantic-release/release-notes-generator": "14.0.1",
102
102
  "@stylistic/eslint-plugin": "2.9.0",
103
103
  "@types/node": "16.18.113",
104
- "@typescript-eslint/eslint-plugin": "8.8.1",
105
- "@typescript-eslint/parser": "8.8.1",
104
+ "@typescript-eslint/eslint-plugin": "8.9.0",
105
+ "@typescript-eslint/parser": "8.9.0",
106
106
  "@vitest/coverage-v8": "2.1.2",
107
107
  "@vitest/eslint-plugin": "1.1.7",
108
108
  "commitizen": "4.3.1",
109
- "cspell": "8.15.2",
109
+ "cspell": "8.15.3",
110
110
  "cz-conventional-changelog": "3.3.0",
111
111
  "eslint": "9.12.0",
112
112
  "eslint-config-prettier": "9.1.0",
@@ -117,7 +117,7 @@
117
117
  "eslint-plugin-format": "0.1.2",
118
118
  "eslint-plugin-functional": "7.0.2",
119
119
  "eslint-plugin-import-x": "4.3.1",
120
- "eslint-plugin-jsdoc": "50.3.2",
120
+ "eslint-plugin-jsdoc": "50.4.1",
121
121
  "eslint-plugin-jsonc": "2.16.0",
122
122
  "eslint-plugin-markdown": "5.1.0",
123
123
  "eslint-plugin-n": "17.11.1",