inferred-types 0.15.0 → 0.18.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (179) hide show
  1. package/.tsbuildinfo +1 -0
  2. package/devops/build.js +1 -3
  3. package/dist/{types/utility/state/KeyStorage.d.ts → index.d.ts} +9767 -8195
  4. package/dist/index.js +659 -0
  5. package/dist/index.mjs +577 -0
  6. package/on-hold/tests/api-spec.ts +9 -15
  7. package/package.json +27 -37
  8. package/pnpm-lock.yaml +2385 -2117
  9. package/src/errors/InferenceError.ts +1 -1
  10. package/src/shared/randomString.ts +1 -1
  11. package/src/types/Constructor.ts +5 -0
  12. package/src/types/Not.ts +3 -1
  13. package/src/types/Transformer.ts +1 -2
  14. package/src/types/Where.ts +36 -0
  15. package/src/types/alphabetic/PascalCase.ts +5 -4
  16. package/src/types/alphabetic/index.ts +9 -5
  17. package/src/types/{fluent.ts → fluent/fluent.ts} +8 -9
  18. package/src/types/fluent/index.ts +42 -0
  19. package/src/types/index.ts +13 -7
  20. package/src/types/lists/UniqueForProp.ts +13 -3
  21. package/src/types/ruleset-types.ts +1 -1
  22. package/src/types/{SameKeys.ts → type-conversion/SameKeys.ts} +0 -0
  23. package/src/types/type-conversion/WrapValue.ts +15 -0
  24. package/src/types/type-conversion/index.ts +11 -4
  25. package/src/utility/dictionary/arrayToKeyLookup.ts +3 -4
  26. package/src/utility/dictionary/dictionaryTransform.ts +6 -7
  27. package/src/utility/index.ts +3 -2
  28. package/src/utility/lists/groupBy.ts +22 -0
  29. package/src/utility/lists/index.ts +38 -0
  30. package/tests/Where.spec.ts +39 -0
  31. package/tests/constructor.spec.ts +40 -0
  32. package/tests/data/index.ts +8 -3
  33. package/tests/kv/dict-to-kv-and-back.spec.ts +2 -6
  34. package/tsconfig.json +4 -3
  35. package/dist/cjs/index.js +0 -21
  36. package/dist/es/index.js +0 -17
  37. package/dist/tsconfig.tsbuildinfo +0 -1
  38. package/dist/types/Mutation/MutationFunction.d.ts +0 -16
  39. package/dist/types/Mutation/MutationIdentity.d.ts +0 -30
  40. package/dist/types/Mutation/index.d.ts +0 -2
  41. package/dist/types/errors/InferenceError.d.ts +0 -1
  42. package/dist/types/errors/index.d.ts +0 -1
  43. package/dist/types/index.d.ts +0 -4
  44. package/dist/types/shared/index.d.ts +0 -3
  45. package/dist/types/shared/randomString.d.ts +0 -1
  46. package/dist/types/shared/uuid.d.ts +0 -1
  47. package/dist/types/shared/valueTypes.d.ts +0 -27
  48. package/dist/types/types/Api.d.ts +0 -10
  49. package/dist/types/types/EnumValues.d.ts +0 -14
  50. package/dist/types/types/ExpandRecursively.d.ts +0 -3
  51. package/dist/types/types/First.d.ts +0 -4
  52. package/dist/types/types/FunctionType.d.ts +0 -9
  53. package/dist/types/types/If.d.ts +0 -10
  54. package/dist/types/types/Include.d.ts +0 -16
  55. package/dist/types/types/Includes.d.ts +0 -5
  56. package/dist/types/types/KeyedRecord.d.ts +0 -22
  57. package/dist/types/types/Keys.d.ts +0 -17
  58. package/dist/types/types/Length.d.ts +0 -8
  59. package/dist/types/types/Mutable.d.ts +0 -6
  60. package/dist/types/types/Narrowable.d.ts +0 -5
  61. package/dist/types/types/Not.d.ts +0 -11
  62. package/dist/types/types/Numeric.d.ts +0 -14
  63. package/dist/types/types/Opaque.d.ts +0 -12
  64. package/dist/types/types/Retain.d.ts +0 -16
  65. package/dist/types/types/SameKeys.d.ts +0 -11
  66. package/dist/types/types/Transformer.d.ts +0 -11
  67. package/dist/types/types/TypeGuard.d.ts +0 -7
  68. package/dist/types/types/alphabetic/AllCaps.d.ts +0 -12
  69. package/dist/types/types/alphabetic/CamelCase.d.ts +0 -2
  70. package/dist/types/types/alphabetic/CapFirstAlpha.d.ts +0 -13
  71. package/dist/types/types/alphabetic/CapitalizeWords.d.ts +0 -4
  72. package/dist/types/types/alphabetic/DashToSnake.d.ts +0 -1
  73. package/dist/types/types/alphabetic/DashUppercase.d.ts +0 -14
  74. package/dist/types/types/alphabetic/Dasherize.d.ts +0 -15
  75. package/dist/types/types/alphabetic/HasUppercase.d.ts +0 -13
  76. package/dist/types/types/alphabetic/Intrinsic.d.ts +0 -4
  77. package/dist/types/types/alphabetic/IsCapitalized.d.ts +0 -15
  78. package/dist/types/types/alphabetic/KebabCase.d.ts +0 -12
  79. package/dist/types/types/alphabetic/LowerAllCaps.d.ts +0 -4
  80. package/dist/types/types/alphabetic/PascalCase.d.ts +0 -16
  81. package/dist/types/types/alphabetic/Pluralize.d.ts +0 -36
  82. package/dist/types/types/alphabetic/SnakeCase.d.ts +0 -14
  83. package/dist/types/types/alphabetic/alpha-characters.d.ts +0 -36
  84. package/dist/types/types/alphabetic/index.d.ts +0 -16
  85. package/dist/types/types/append-types.d.ts +0 -9
  86. package/dist/types/types/dictionary/Get.d.ts +0 -7
  87. package/dist/types/types/dictionary/index.d.ts +0 -1
  88. package/dist/types/types/fluent.d.ts +0 -51
  89. package/dist/types/types/index.d.ts +0 -34
  90. package/dist/types/types/kv/DictFromKv.d.ts +0 -6
  91. package/dist/types/types/kv/KeyValue.d.ts +0 -11
  92. package/dist/types/types/kv/KvFrom.d.ts +0 -13
  93. package/dist/types/types/kv/KvTuple.d.ts +0 -14
  94. package/dist/types/types/kv/index.d.ts +0 -4
  95. package/dist/types/types/lists/UniqueForProp.d.ts +0 -5
  96. package/dist/types/types/lists/index.d.ts +0 -1
  97. package/dist/types/types/maybe.d.ts +0 -8
  98. package/dist/types/types/props.d.ts +0 -100
  99. package/dist/types/types/ruleset-types.d.ts +0 -59
  100. package/dist/types/types/runtime.d.ts +0 -33
  101. package/dist/types/types/string-literals/Break.d.ts +0 -12
  102. package/dist/types/types/string-literals/Concat.d.ts +0 -8
  103. package/dist/types/types/string-literals/LeftWhitespace.d.ts +0 -9
  104. package/dist/types/types/string-literals/Replace.d.ts +0 -11
  105. package/dist/types/types/string-literals/RightWhitespace.d.ts +0 -9
  106. package/dist/types/types/string-literals/StringLength.d.ts +0 -10
  107. package/dist/types/types/string-literals/Trim.d.ts +0 -11
  108. package/dist/types/types/string-literals/TrimLeft.d.ts +0 -11
  109. package/dist/types/types/string-literals/TrimRight.d.ts +0 -11
  110. package/dist/types/types/string-literals/form-fields.d.ts +0 -12
  111. package/dist/types/types/string-literals/index.d.ts +0 -10
  112. package/dist/types/types/tuples/DictArray.d.ts +0 -19
  113. package/dist/types/types/tuples/FirstKey.d.ts +0 -8
  114. package/dist/types/types/tuples/FirstKeyValue.d.ts +0 -8
  115. package/dist/types/types/tuples/FirstOfEach.d.ts +0 -11
  116. package/dist/types/types/tuples/FromDictArray.d.ts +0 -10
  117. package/dist/types/types/tuples/SecondOfEach.d.ts +0 -10
  118. package/dist/types/types/tuples/index.d.ts +0 -6
  119. package/dist/types/types/type-conversion/TupleToUnion.d.ts +0 -10
  120. package/dist/types/types/type-conversion/UnionToIntersection.d.ts +0 -5
  121. package/dist/types/types/type-conversion/UnionToTuple.d.ts +0 -9
  122. package/dist/types/types/type-conversion/index.d.ts +0 -3
  123. package/dist/types/types/type-testing.d.ts +0 -13
  124. package/dist/types/utility/api/api.d.ts +0 -2
  125. package/dist/types/utility/api/index.d.ts +0 -1
  126. package/dist/types/utility/createFnWithProps.d.ts +0 -1
  127. package/dist/types/utility/dictionary/arrayToKeyLookup.d.ts +0 -10
  128. package/dist/types/utility/dictionary/dictFilter.d.ts +0 -8
  129. package/dist/types/utility/dictionary/dictionaryTransform.d.ts +0 -9
  130. package/dist/types/utility/dictionary/entries.d.ts +0 -17
  131. package/dist/types/utility/dictionary/index.d.ts +0 -8
  132. package/dist/types/utility/dictionary/kv/dictToKv.d.ts +0 -16
  133. package/dist/types/utility/dictionary/kv/filterDictArray.d.ts +0 -9
  134. package/dist/types/utility/dictionary/kv/index.d.ts +0 -4
  135. package/dist/types/utility/dictionary/kv/kv.d.ts +0 -10
  136. package/dist/types/utility/dictionary/kv/kvToDict.d.ts +0 -15
  137. package/dist/types/utility/dictionary/mapValues.d.ts +0 -13
  138. package/dist/types/utility/dictionary/strArrayToDict.d.ts +0 -6
  139. package/dist/types/utility/dictionary/valuesOfProp.d.ts +0 -1
  140. package/dist/types/utility/index.d.ts +0 -10
  141. package/dist/types/utility/keys.d.ts +0 -5
  142. package/dist/types/utility/literals/ExplicitFunction.d.ts +0 -6
  143. package/dist/types/utility/literals/arrayToObject.d.ts +0 -41
  144. package/dist/types/utility/literals/defineType.d.ts +0 -8
  145. package/dist/types/utility/literals/identity.d.ts +0 -6
  146. package/dist/types/utility/literals/index.d.ts +0 -5
  147. package/dist/types/utility/literals/literal.d.ts +0 -41
  148. package/dist/types/utility/map-reduce/filter.d.ts +0 -26
  149. package/dist/types/utility/map-reduce/index.d.ts +0 -1
  150. package/dist/types/utility/modelling/IoModel.d.ts +0 -26
  151. package/dist/types/utility/modelling/Model.d.ts +0 -22
  152. package/dist/types/utility/modelling/index.d.ts +0 -1
  153. package/dist/types/utility/ruleset.d.ts +0 -18
  154. package/dist/types/utility/runtime/condition.d.ts +0 -3
  155. package/dist/types/utility/runtime/conditions/index.d.ts +0 -12
  156. package/dist/types/utility/runtime/conditions/isArray.d.ts +0 -2
  157. package/dist/types/utility/runtime/conditions/isBoolean.d.ts +0 -5
  158. package/dist/types/utility/runtime/conditions/isFalse.d.ts +0 -4
  159. package/dist/types/utility/runtime/conditions/isFunction.d.ts +0 -15
  160. package/dist/types/utility/runtime/conditions/isLiteral.d.ts +0 -2
  161. package/dist/types/utility/runtime/conditions/isNull.d.ts +0 -1
  162. package/dist/types/utility/runtime/conditions/isNumber.d.ts +0 -1
  163. package/dist/types/utility/runtime/conditions/isObject.d.ts +0 -10
  164. package/dist/types/utility/runtime/conditions/isString.d.ts +0 -2
  165. package/dist/types/utility/runtime/conditions/isSymbol.d.ts +0 -1
  166. package/dist/types/utility/runtime/conditions/isTrue.d.ts +0 -20
  167. package/dist/types/utility/runtime/conditions/isUndefined.d.ts +0 -1
  168. package/dist/types/utility/runtime/ifTypeOf.d.ts +0 -23
  169. package/dist/types/utility/runtime/index.d.ts +0 -5
  170. package/dist/types/utility/runtime/type.d.ts +0 -27
  171. package/dist/types/utility/runtime/withValue.d.ts +0 -19
  172. package/dist/types/utility/state/Configurator.d.ts +0 -36
  173. package/dist/types/utility/state/FluentConfigurator.d.ts +0 -27
  174. package/dist/types/utility/state/index.d.ts +0 -3
  175. package/src/types/alphabetic/Intrinsic.ts +0 -6
  176. package/src/utility/modelling/IoModel.ts +0 -38
  177. package/tests/FluentApi-spec.ts +0 -90
  178. package/tests/FluentConfigurator-spec.hold +0 -88
  179. package/tests/IoModel-spec.hold +0 -209
@@ -1,5 +0,0 @@
1
- import { Keys, Length } from "../types/index";
2
- /**
3
- * Provides the _keys_ of an object with the `keyof T` made explicit.
4
- */
5
- export declare function keys<T extends {}, W extends readonly string[]>(obj: T, ...without: W): Length<W> extends 0 ? (keyof T)[] : Exclude<keyof T, Keys<W, undefined>>[];
@@ -1,6 +0,0 @@
1
- export declare type ExplicitFunction<P extends any[], R extends any> = (...args: P) => R;
2
- /**
3
- * Takes a given function and converts it to an explicit representation
4
- * where the generics represent the _parameter_ and _return_ typings.
5
- */
6
- export declare function ExplicitFunction<T extends (...args: any[]) => any>(fn: T): ExplicitFunction<Parameters<T>, ReturnType<T>>;
@@ -1,41 +0,0 @@
1
- import { Narrowable } from "../../types/Narrowable";
2
- /**
3
- * **UniqueDictionary**
4
- *
5
- * A dictionary converted by `arrayToObject()` which expects each key `S` to have a only a
6
- * single/unique value.
7
- */
8
- export declare type UniqueDictionary<S extends PropertyKey, N extends Narrowable, T extends Record<keyof T, N> & Record<S, any>> = {
9
- [V in T as V[S]]: V;
10
- };
11
- /**
12
- * **GeneralDictionary**
13
- *
14
- * A dictionary converted by `arrayToObject()` which expects each key `S` to have an
15
- * array of values.
16
- */
17
- export declare type GeneralDictionary<S extends PropertyKey, N extends Narrowable, T extends Record<keyof T, N> & Record<S, any>> = {
18
- [V in T as V[S]]: V[];
19
- };
20
- export declare type ArrayConverter<S extends PropertyKey, U extends boolean> =
21
- /**
22
- * An `ArrayConverter` is the partial application of the `arrayToObject()`
23
- * utility. At this point, the configuration is setup already and all that's
24
- * left is to pass in an array of objects.
25
- */
26
- <N extends Narrowable, T extends Record<keyof T, N> & Record<S, any>>(arr: readonly T[]) => true extends U ? UniqueDictionary<S, N, T> : GeneralDictionary<S, N, T>;
27
- /**
28
- * Converts an array of objects into a dictionary by picking a property name contained
29
- * by all objects and using that as the key to the dictionary.
30
- *
31
- * ```ts
32
- * const arr = [
33
- * { kind: "color", favorite: "blue", likes: 100 },
34
- * { kind: "song", favorite: "some song", likes: 25 }
35
- * ];
36
- * const dict = arrayToObject("kind")(arr);
37
- * ```
38
- *
39
- * This will produce a dictionary with keys of `color` and `song`.
40
- */
41
- export declare function arrayToObject<S extends PropertyKey, U extends boolean>(prop: S, unique?: U): ArrayConverter<S, true extends U ? true : false>;
@@ -1,8 +0,0 @@
1
- import { ExpandRecursively, Narrowable } from "../../types/index";
2
- /**
3
- * Build a _type_ from two run-time dictionaries.
4
- *
5
- * 1. The _first_ -- which is optional -- is interpreted as a _literal_ type definition
6
- * 2. The _second_ dictionary is interpreted as a "wide" definition of prop types
7
- */
8
- export declare function defineType<N extends Narrowable, TLiteral extends Record<string, N>>(literal?: TLiteral): <TWide extends object>(wide?: TWide) => ExpandRecursively<TWide & TLiteral>;
@@ -1,6 +0,0 @@
1
- import { Narrowable } from "../../types/Narrowable";
2
- /**
3
- * An identity function for any type, with the goal of preserving literal type information
4
- * whereever possible.
5
- */
6
- export declare const identity: <N extends Narrowable, T extends string | number | boolean | symbol | Record<any, N> | null | undefined>(v: T) => T;
@@ -1,5 +0,0 @@
1
- export * from "./ExplicitFunction";
2
- export * from "./arrayToObject";
3
- export * from "./defineType";
4
- export * from "./identity";
5
- export * from "./literal";
@@ -1,41 +0,0 @@
1
- import { Narrowable } from "../../types/index";
2
- /**
3
- * Takes an object as input --which has an `id` property and returns it as the same
4
- * run-time content but with the _type_ of the `id` property being forced to a literal type
5
- */
6
- export declare function idLiteral<T extends {
7
- id: I;
8
- }, I extends PropertyKey>(o: T): T & {
9
- id: T["id"];
10
- };
11
- /**
12
- * Takes an object as input --which has an `name` property and returns it as the same
13
- * run-time content but with the _type_ of the `name` property being forced to a literal type
14
- */
15
- export declare function nameLiteral<T extends {
16
- name: I;
17
- }, I extends PropertyKey>(o: T): T & {
18
- name: T["name"];
19
- };
20
- /**
21
- * Takes an object as input --which has an `kind` property and returns it as the same
22
- * run-time content but with the _type_ of the `kind` property being forced to a literal type
23
- */
24
- export declare function kindLiteral<T extends {
25
- kind: I;
26
- }, I extends PropertyKey>(o: T): T & {
27
- kind: T["kind"];
28
- };
29
- export declare function idTypeGuard<T extends {
30
- id: I;
31
- }, I extends PropertyKey>(_o: T): _o is T & {
32
- id: I;
33
- };
34
- /**
35
- * Takes an object as input and infers the narrow literal types of the property
36
- * values on the object.
37
- *
38
- * > Note: this addresses this [a known TS gap](https://github.com/microsoft/TypeScript/issues/30680).
39
- * > Hopefully at some point this will be addressed in the language.
40
- */
41
- export declare function literal<N extends Narrowable, T extends Record<keyof T, N>>(obj: T): T;
@@ -1,26 +0,0 @@
1
- export declare type Filter<A> = {
2
- kind: "Equals";
3
- field: keyof A;
4
- val: A[keyof A];
5
- } | {
6
- kind: "Greater";
7
- field: keyof A;
8
- val: A[keyof A];
9
- } | {
10
- kind: "Less";
11
- field: keyof A;
12
- val: A[keyof A];
13
- } | {
14
- kind: "And";
15
- a: Filter<A>;
16
- b: Filter<A>;
17
- } | {
18
- kind: "Or";
19
- a: Filter<A>;
20
- b: Filter<A>;
21
- };
22
- export declare const equals: <A, K extends keyof A>(field: K, val: A[K]) => Filter<A>;
23
- export declare const greater: <A, K extends keyof A>(field: K, val: A[K]) => Filter<A>;
24
- export declare const less: <A, K extends keyof A>(field: K, val: A[K]) => Filter<A>;
25
- export declare const and: <A>(a: Filter<A>, b: Filter<A>) => Filter<A>;
26
- export declare const or: <A>(a: Filter<A>, b: Filter<A>) => Filter<A>;
@@ -1 +0,0 @@
1
- export * from "./filter";
@@ -1,26 +0,0 @@
1
- import * as t from "io-ts";
2
- import type { PascalCase } from "../../types/index";
3
- /**
4
- * Defines an `io-ts` based **model**.
5
- *
6
- * - `<T>` represents type of the model
7
- * - `<S>` is the model's literal type
8
- *
9
- * Note: unlink the default `io-ts` model/codec, the
10
- * `name` variable is an explicit type alias and not a string
11
- * type. This helps to preserve it's type inference even though
12
- * the model itself does have a runtime definition of it's type.
13
- */
14
- export declare type IoModel<M, N extends string> = Omit<t.Type<M>, "name"> & {
15
- name: N;
16
- };
17
- /**
18
- * **Model**
19
- *
20
- * A function which returns a `io-ts` based model/codec but with a _literal_ name
21
- * property, and a `kind` which uniquely distinguishes itself as a "model".
22
- *
23
- * **Note:** the name of a model is expected to be in _PascalCase_ and will be converted
24
- * to it if not passed in correctly.
25
- */
26
- export declare function IoModel<RP extends t.Props, OP extends t.Props | {}, N extends string>(name: N, req: RP, optional?: OP): IoModel<{ [K in keyof RP]: t.TypeOf<RP[K]>; } & { [K_1 in keyof OP]?: t.TypeOf<OP[K_1]> | undefined; }, PascalCase<N>>;
@@ -1,22 +0,0 @@
1
- export declare function Model<N extends string, _R extends {} = {}, _O extends {} = {}>(name: N): {
2
- required<P extends string>(_prop: P): {
3
- required<P_1 extends string>(_prop: P_1): any;
4
- optional<P_2 extends string>(_prop: P_2): any;
5
- done(): {
6
- __model__: N;
7
- __kind__: "model";
8
- };
9
- };
10
- optional<P_3 extends string>(_prop: P_3): {
11
- required<P_1 extends string>(_prop: P_1): any;
12
- optional<P_2 extends string>(_prop: P_2): any;
13
- done(): {
14
- __model__: N;
15
- __kind__: "model";
16
- };
17
- };
18
- done(): {
19
- __model__: N;
20
- __kind__: "model";
21
- };
22
- };
@@ -1 +0,0 @@
1
- export * from "./Model";
@@ -1,18 +0,0 @@
1
- import type { Narrowable } from "../types/index";
2
- /**
3
- * **ruleSet**
4
- *
5
- * Defines a ruleset composed of _dynamic_ and _static_ boolean operators.
6
- *
7
- * - the first function call defines _dynamic_ props (_optional_)
8
- * - the second function call defines static values
9
- *
10
- * ```ts
11
- * const rs = ruleSet(
12
- * r => r.state()( { maybe: r => r.extends({ foo: 1 }) })
13
- * )(
14
- * { color: true, age: false }
15
- * );
16
- * ```
17
- */
18
- export declare function ruleSet<N extends Narrowable, TState extends Record<keyof TState, N>>(defn?: TState): TState | undefined;
@@ -1,3 +0,0 @@
1
- import { Narrowable } from "../../types/index";
2
- export declare type Condition<TInput extends Narrowable, TResult extends boolean> = (input: TInput) => TResult;
3
- export declare const condition: <TInput extends Narrowable, C extends Condition<Narrowable, boolean>>(c: C, input: TInput) => boolean;
@@ -1,12 +0,0 @@
1
- export * from "./isArray";
2
- export * from "./isBoolean";
3
- export * from "./isFalse";
4
- export * from "./isFunction";
5
- export * from "./isLiteral";
6
- export * from "./isNull";
7
- export * from "./isNumber";
8
- export * from "./isObject";
9
- export * from "./isString";
10
- export * from "./isSymbol";
11
- export * from "./isTrue";
12
- export * from "./isUndefined";
@@ -1,2 +0,0 @@
1
- export declare type IsArray<T> = T extends any[] ? true : false;
2
- export declare function isArray<T>(i: T): IsArray<T>;
@@ -1,5 +0,0 @@
1
- export declare type IsBoolean<T> = T extends boolean ? true : false;
2
- /**
3
- * Runtime and type checks whether a variable is a boolean value.
4
- */
5
- export declare function isBoolean<T extends any>(i: T): IsBoolean<T>;
@@ -1,4 +0,0 @@
1
- import { Narrowable } from "../../../types/index";
2
- import { IsBoolean } from "../../index";
3
- export declare type IsFalse<T extends Narrowable> = IsBoolean<T> extends true ? T extends false ? true : true extends T ? false : unknown : false;
4
- export declare function isFalse<T>(i: T): IsFalse<T>;
@@ -1,15 +0,0 @@
1
- import { FunctionType } from "../../../types/index";
2
- export declare type IsFunction<T> = T extends FunctionType ? true : false;
3
- /**
4
- * Checks whether a passed in value is a function and ensures run-time and types
5
- * are consistent.
6
- * ```ts
7
- * // true
8
- * const yup = isFunction(() => "hello world");
9
- * ```
10
- *
11
- * Note: the runtime `typeof [variable]` will correctly say "function" when a function is
12
- * encounted but if that function also has object types defined then the type will be a big
13
- * and ugly union type. This function will give you a proper boolean value in both cases.
14
- */
15
- export declare function isFunction<T extends unknown>(input: T): IsFunction<T>;
@@ -1,2 +0,0 @@
1
- export declare type IsLiteral<L extends string | number, T extends any> = T extends L ? true : false;
2
- export declare function isLiteral<L extends Readonly<string>>(...allowed: L[]): <T extends unknown>(i: T) => IsLiteral<L, T>;
@@ -1 +0,0 @@
1
- export declare function isNull<T>(i: T): T extends null ? true : false;
@@ -1 +0,0 @@
1
- export declare function isNumber<T>(i: T): T extends number ? true : false;
@@ -1,10 +0,0 @@
1
- import { FunctionType, Mutable, Narrowable, Not } from "../../../types/index";
2
- export declare type IsObject<T> = Mutable<T> extends Record<string, any> ? T extends FunctionType ? false : Mutable<T> extends any[] ? false : true : false;
3
- export declare type ObjectType = Not<Record<string, Narrowable>, FunctionType>;
4
- /**
5
- * Detects whether the passed in `v` is of type "object" where an object
6
- * is defined to be a string keyed dictionary style object. This means that
7
- * arrays are excluded, as well as functions which also have properties hanging
8
- * off of them.
9
- */
10
- export declare function isObject<T extends unknown>(i: T): IsObject<T>;
@@ -1,2 +0,0 @@
1
- export declare type IsString<T> = T extends string ? true : false;
2
- export declare function isString<T>(i: T): IsString<T>;
@@ -1 +0,0 @@
1
- export declare function isSymbol<T>(i: T): T extends symbol ? true : false;
@@ -1,20 +0,0 @@
1
- import { Narrowable } from "../../../types/index";
2
- import type { IsBoolean } from "./isBoolean";
3
- /**
4
- * Type utility which returns `true` or `false` based on
5
- * whether the type holds the narrow "true" type.
6
- * ```ts
7
- * // true
8
- * type T = IsTrue<true>;
9
- * // unknown
10
- * type U = IsTrue<boolean>;
11
- * // false
12
- * type F = IsTrue<false>;
13
- * type F2 = IsTrue<"false">;
14
- * ```
15
- */
16
- export declare type IsTrue<T> = IsBoolean<T> extends true ? T extends true ? true : T extends false ? false : unknown : false;
17
- /**
18
- * Run-time and type checking of whether a variable is `true`.
19
- */
20
- export declare function isTrue<T extends Narrowable>(i: T): IsTrue<T>;
@@ -1 +0,0 @@
1
- export declare function isUndefined<T>(i: T): undefined extends T ? true : false;
@@ -1,23 +0,0 @@
1
- import { Narrowable } from "../../types/Narrowable";
2
- /**
3
- * A conditional clause used in the application of the `ifTypeOf` utility
4
- */
5
- export declare type ExtendsClause<N extends Narrowable, TValue extends Record<keyof TValue, N> | number | string | boolean | symbol> = <TBase extends any>(base: TBase) => TValue extends TBase ? true : false;
6
- /**
7
- * A conditional clause used in the application of the `ifTypeOf` utility
8
- */
9
- export declare type ExtendsNarrowlyClause<N extends Narrowable, TValue extends Record<keyof TValue, N> | number | string | boolean | symbol> = <NB extends Narrowable, TBase extends Record<keyof TBase, NB> | number | string | boolean | symbol>(base: TBase) => TValue extends TBase ? true : false;
10
- /**
11
- * **TypeCondition**
12
- *
13
- * A partially applied type from the `ifTypeOf` utility where the base type has been
14
- * defined and we now need to express the type which is intended to extend it.
15
- *
16
- * - `extends` - compares with _wide_ types
17
- * - `narrowlyExtends` - compares with _narrow_ / _literal_ types
18
- */
19
- export declare type TypeCondition<N extends Narrowable, TValue extends Record<keyof TValue, N> | number | string | boolean | symbol> = {
20
- extends: ExtendsClause<N, TValue>;
21
- narrowlyExtends: ExtendsNarrowlyClause<N, TValue>;
22
- };
23
- export declare const ifTypeOf: <N extends Narrowable, TValue extends string | number | boolean | symbol | Record<keyof TValue, N>>(val: TValue) => TypeCondition<N, TValue>;
@@ -1,5 +0,0 @@
1
- export * from "./condition";
2
- export * from "./ifTypeOf";
3
- export * from "./type";
4
- export * from "./withValue";
5
- export * from "./conditions/index";
@@ -1,27 +0,0 @@
1
- import { Narrowable, TypeGuard } from "../../types/index";
2
- import { isString, isBoolean, isNumber, isFunction, isSymbol, isNull, isTrue, isFalse, isUndefined, isObject, isArray } from "./conditions/index";
3
- export declare type Type<T extends any, V extends Function> = {
4
- name: string;
5
- type: T;
6
- typeGuard: TypeGuard<T>;
7
- is: V;
8
- };
9
- export declare const typeApi: () => {
10
- readonly string: Type<string, typeof isString>;
11
- readonly boolean: Type<boolean, typeof isBoolean>;
12
- readonly number: Type<number, typeof isNumber>;
13
- readonly function: Type<Function | (Function & {
14
- [key: string]: any;
15
- }), typeof isFunction>;
16
- readonly null: Type<null, typeof isNull>;
17
- readonly symbol: Type<symbol, typeof isSymbol>;
18
- readonly undefined: Type<undefined, typeof isUndefined>;
19
- readonly true: Type<true, typeof isTrue>;
20
- readonly false: Type<false, typeof isFalse>;
21
- readonly object: Type<Record<string, Narrowable>, typeof isObject>;
22
- readonly array: Type<any[], typeof isArray>;
23
- };
24
- export declare type TypeApi = ReturnType<typeof typeApi>;
25
- export declare function isType<T extends any, V extends Function>(t: unknown): t is Type<T, V>;
26
- export declare type TypeDefinition<T extends any, V extends Function> = (defn: TypeApi) => Type<T, V>;
27
- export declare function type<T extends any, V extends Function>(fn: TypeDefinition<T, V>): Type<T, V>;
@@ -1,19 +0,0 @@
1
- import { ExpandRecursively, Narrowable } from "../../types/index";
2
- import { TypeDefinition } from "./index";
3
- /**
4
- * **withValue**
5
- *
6
- * Reduces a dictionary object -- in both _type_ and _run-time_ structure -- to only those
7
- * key/value pairs which have a specified value. For instance:
8
- *
9
- * ```ts
10
- * const obj = { foo: 1, bar: 2, message: "hi there" };
11
- * // { message: "hi there" }
12
- * const onlyStrings = withValue(t => t.string)(obj);
13
- * // { foo: 1 }
14
- * const justOne = withValue(t => t.literal(1))(obj);
15
- * ```
16
- *
17
- * Note: _often useful to provide run-time type profiles with the_ `inferredType` _utility_
18
- */
19
- export declare function withValue<T extends any, V extends Function>(td: TypeDefinition<T, V>): <N extends Narrowable, R extends Record<string, N>>(obj: R) => ExpandRecursively<Pick<R, import("../../types/index").KeysWithValue<T, R>>>;
@@ -1,36 +0,0 @@
1
- import { ExpandRecursively } from "../../types/index";
2
- export interface IConfigurator<C = {}> {
3
- set<V, K extends string, KV = {
4
- [U in K]: V;
5
- }>(key: K, value: V): asserts this is IConfigurator<ExpandRecursively<C & KV>>;
6
- remove<K extends string & keyof C>(key: K): asserts this is IConfigurator<ExpandRecursively<Omit<C, K>>>;
7
- done(): C;
8
- }
9
- /**
10
- * **Configurator**
11
- *
12
- * This function provides a configurator which uses TypeScript assertions
13
- * to narrow the scope of variables. Using type assertions though means we
14
- * can't also return values and therefore a _fluent_ API style is not possible.
15
- *
16
- * Note: this approach does require, that you explicitly use the `IConfigurator`
17
- * interface exported by this library. Without it you'd getting annoying TS errors
18
- * on every call to `set()` but adding it is simple enough:
19
- *
20
- * ```ts
21
- * import { Configurator, IConfigurator } from "inferred-types";
22
- * const config: IConfigurator = Configurator();
23
- * ```
24
- *
25
- * If you want to specify some guideline params which you expect to be set, you
26
- * can add them like so:
27
- *
28
- * ```ts
29
- * export type IExpected = { foo: number, bar: string };
30
- * const config: IConfigurator<IExpected> = Configurator<IExpected>();
31
- * ```
32
- *
33
- * This configuration will ensure that `foo` and `bar` will be seen as optional
34
- * parameters. If you set them they will stop being optional.
35
- */
36
- export declare function Configurator(): IConfigurator<{}>;
@@ -1,27 +0,0 @@
1
- import type { ExpandRecursively } from "../../types/index";
2
- export interface IFluentConfigurator<C> {
3
- /**
4
- * **set**
5
- *
6
- * Sets a new key/value pair to the configurator.
7
- *
8
- * @param key the key to put this new configuration item
9
- * @param value the value of the configuration item
10
- */
11
- set<V, K extends string, KV = {
12
- [U in K]: V;
13
- }>(key: K, value: V): IFluentConfigurator<C & KV>;
14
- done(): ExpandRecursively<C>;
15
- }
16
- /**
17
- * This function will return a basic _configurator_ API surface which allows
18
- * you to add name/value pairs to a growing dictionary of strongly typed data.
19
- *
20
- * When configuration is complete, you call the `done()` endpoint and the typed
21
- * configuration will be returned with the API removed.
22
- *
23
- * > **Note:** the approach taken here requires that you configure using a **fluent style**
24
- * exclusively. If you don't the non-fluent properties set will not show up
25
- * in the typing or the run-time object.
26
- */
27
- export declare function FluentConfigurator<I>(initial?: I): IFluentConfigurator<{}>;
@@ -1,3 +0,0 @@
1
- export * from "./Configurator";
2
- export * from "./FluentConfigurator";
3
- export * from "./KeyStorage";
@@ -1,6 +0,0 @@
1
- /* eslint @typescript-eslint/no-unused-vars: "off" */
2
-
3
- export type Capitalize<T> = intrinsic;
4
- export type Uncapitalize<T> = intrinsic;
5
- export type Uppercase<T> = intrinsic;
6
- export type Lowercase<T> = intrinsic;
@@ -1,38 +0,0 @@
1
- import * as t from "io-ts";
2
- import { pascalize } from "native-dash";
3
- import type { PascalCase } from "~/types";
4
-
5
- /**
6
- * Defines an `io-ts` based **model**.
7
- *
8
- * - `<T>` represents type of the model
9
- * - `<S>` is the model's literal type
10
- *
11
- * Note: unlink the default `io-ts` model/codec, the
12
- * `name` variable is an explicit type alias and not a string
13
- * type. This helps to preserve it's type inference even though
14
- * the model itself does have a runtime definition of it's type.
15
- */
16
- export type IoModel<M, N extends string> = Omit<t.Type<M>, "name"> & { name: N };
17
-
18
- /**
19
- * **Model**
20
- *
21
- * A function which returns a `io-ts` based model/codec but with a _literal_ name
22
- * property, and a `kind` which uniquely distinguishes itself as a "model".
23
- *
24
- * **Note:** the name of a model is expected to be in _PascalCase_ and will be converted
25
- * to it if not passed in correctly.
26
- */
27
- export function IoModel<RP extends t.Props, OP extends t.Props | {}, N extends string>(
28
- name: N,
29
- req: RP,
30
- optional: OP = {} as OP
31
- ) {
32
- const model = t.intersection([t.type(req), t.partial(optional)], name);
33
- type T = t.TypeOf<typeof model>;
34
- return {
35
- ...(model as t.Type<T>),
36
- name: pascalize(name),
37
- } as IoModel<T, PascalCase<N>>;
38
- }
@@ -1,90 +0,0 @@
1
- import type { Expect, Equal, ExpectExtends, ExpectFalse } from "@type-challenges/utils";
2
- import { FluentApi, Keys } from "~/types";
3
-
4
- const escape = {
5
- hi: () => "hello",
6
- };
7
- const fluent = {
8
- foo: () => ({ ...fluent, ...escape }),
9
- bar: () => ({ ...fluent, ...escape }),
10
- };
11
- const fluentSolo = {
12
- foo: () => fluentSolo,
13
- bar: () => fluentSolo,
14
- };
15
-
16
- describe("FluentApi type", () => {
17
- it("Fluent API without escape API can be used as FluentAPI", () => {
18
- const api: FluentApi<typeof fluentSolo> = fluentSolo;
19
- type Api = typeof api;
20
-
21
- type cases = [
22
- // Api extends the type FluentApi
23
- Expect<ExpectExtends<FluentApi<any, any, any>, Api>>,
24
- // the fluent API keys are found on API
25
- Expect<ExpectExtends<Keys<Api>, "foo" | "bar">>,
26
- // the fluent API returns itself
27
- Expect<Equal<Api, ReturnType<Api["bar"]>>>,
28
- Expect<Equal<Api, ReturnType<Api["foo"]>>>
29
- ];
30
- const cases: cases = [true, true, true, true];
31
- expect(cases).toBe(cases);
32
- });
33
-
34
- it("Simple fluent API and escape API are combined", () => {
35
- const api: FluentApi<typeof fluent, typeof escape> = { ...fluent, ...escape };
36
- type Api = typeof api;
37
-
38
- type cases = [
39
- // Api extends the type FluentApi
40
- Expect<ExpectExtends<FluentApi<any, any, any>, Api>>,
41
- // the fluent and escape api keys are found on API
42
- Expect<ExpectExtends<Keys<Api>, "foo" | "bar" | "hi">>,
43
- // the fluent API returns itself
44
- Expect<Equal<Api, ReturnType<Api["bar"]>>>,
45
- Expect<Equal<Api, ReturnType<Api["foo"]>>>,
46
- // whereas the escape API just returns a string
47
- Expect<Equal<string, ReturnType<Api["hi"]>>>
48
- ];
49
- const cases: cases = [true, true, true, true, true];
50
- expect(cases).toBe(cases);
51
- });
52
-
53
- it("Exclusion masks certain API endpoints", () => {
54
- const api1: FluentApi<typeof fluent, typeof escape, "hi"> = { ...fluent, ...escape };
55
- type Api1 = typeof api1;
56
- const api2: FluentApi<typeof fluent, typeof escape, "foo" | "bar"> = { ...fluent, ...escape };
57
- type Api2 = typeof api2;
58
-
59
- type cases = [
60
- // excluding "hi" hides the escape api but leaves fluent API untouched
61
- Expect<ExpectExtends<"foo" | "bar", Keys<Api1>>>,
62
- ExpectFalse<ExpectExtends<"hi", Keys<Api1>>>,
63
- // similarly hiding "foo" and "bar" leaves the escape API untouched
64
- Expect<ExpectExtends<"hi", Keys<Api2>>>,
65
- ExpectFalse<ExpectExtends<"foo" | "bar", Keys<Api2>>>
66
- ];
67
-
68
- const cases: cases = [true, false, true, false];
69
- expect(cases).toBe(cases);
70
- });
71
-
72
- it("applying different FluentApi exclusions to the same runtime API modifies the API appropriately", () => {
73
- const api1: FluentApi<typeof fluent, typeof escape, "hi"> = { ...fluent, ...escape };
74
- type Api1 = typeof api1;
75
- const api2: FluentApi<typeof fluent, typeof escape, "foo" | "bar"> = api1 as any;
76
- type Api2 = typeof api2;
77
-
78
- type cases = [
79
- // excluding "hi" hides the escape api but leaves fluent API untouched
80
- Expect<ExpectExtends<"foo" | "bar", Keys<Api1>>>,
81
- ExpectFalse<ExpectExtends<"hi", Keys<Api1>>>,
82
- // similarly hiding "foo" and "bar" leaves the escape API untouched
83
- Expect<ExpectExtends<"hi", Keys<Api2>>>,
84
- ExpectFalse<ExpectExtends<"foo" | "bar", Keys<Api2>>>
85
- ];
86
-
87
- const cases: cases = [true, false, true, false];
88
- expect(cases).toBe(cases);
89
- });
90
- });