inferred-types 0.37.0 → 0.37.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 (280) hide show
  1. package/dist/index.d.ts +2745 -0
  2. package/dist/index.js +854 -0
  3. package/package.json +8 -13
  4. package/.eslintrc +0 -77
  5. package/.github/workflows/main.yml +0 -34
  6. package/.github/workflows/other.yml +0 -15
  7. package/.nvmrc +0 -1
  8. package/.prettierrc.js +0 -3
  9. package/.vscode/launch.json +0 -27
  10. package/.vscode/settings.json +0 -19
  11. package/devops/build.js +0 -243
  12. package/docs/builder-overview.md +0 -45
  13. package/docs/builder.md +0 -94
  14. package/src/errors/ReadOnlyViolation.ts +0 -3
  15. package/src/errors/index.ts +0 -12
  16. package/src/index.ts +0 -14
  17. package/src/runtime/README.md +0 -3
  18. package/src/runtime/api/api.ts +0 -10
  19. package/src/runtime/api/index.ts +0 -12
  20. package/src/runtime/builders/Model.ts +0 -25
  21. package/src/runtime/builders/url.ts +0 -15
  22. package/src/runtime/combinators/and.ts +0 -15
  23. package/src/runtime/combinators/filter.ts +0 -267
  24. package/src/runtime/combinators/index.ts +0 -4
  25. package/src/runtime/combinators/not.ts +0 -15
  26. package/src/runtime/combinators/or.ts +0 -5
  27. package/src/runtime/createFnWithProps.ts +0 -37
  28. package/src/runtime/dictionary/arrayToKeyLookup.ts +0 -19
  29. package/src/runtime/dictionary/defineProperties.ts +0 -35
  30. package/src/runtime/dictionary/dictArr.ts +0 -69
  31. package/src/runtime/dictionary/dictionaryTransform.ts +0 -22
  32. package/src/runtime/dictionary/entries.ts +0 -33
  33. package/src/runtime/dictionary/index.ts +0 -21
  34. package/src/runtime/dictionary/kv/dictToKv.ts +0 -21
  35. package/src/runtime/dictionary/kv/filterDictArray.ts +0 -31
  36. package/src/runtime/dictionary/kv/index.ts +0 -15
  37. package/src/runtime/dictionary/kv/kv.ts +0 -18
  38. package/src/runtime/dictionary/kv/kvToDict.ts +0 -24
  39. package/src/runtime/dictionary/mapTo.ts +0 -206
  40. package/src/runtime/dictionary/mapValues.ts +0 -23
  41. package/src/runtime/dictionary/merge.ts +0 -36
  42. package/src/runtime/dictionary/strArrayToDict.ts +0 -12
  43. package/src/runtime/index.ts +0 -23
  44. package/src/runtime/keys.ts +0 -16
  45. package/src/runtime/lists/asArray.ts +0 -38
  46. package/src/runtime/lists/createConverter.ts +0 -62
  47. package/src/runtime/lists/groupBy.ts +0 -15
  48. package/src/runtime/lists/index.ts +0 -15
  49. package/src/runtime/literals/ExplicitFunction.ts +0 -10
  50. package/src/runtime/literals/Suggest.ts +0 -19
  51. package/src/runtime/literals/arrayToObject.ts +0 -78
  52. package/src/runtime/literals/box.ts +0 -98
  53. package/src/runtime/literals/defineType.ts +0 -20
  54. package/src/runtime/literals/ensureLeading.ts +0 -17
  55. package/src/runtime/literals/ensureTrailing.ts +0 -17
  56. package/src/runtime/literals/identity.ts +0 -12
  57. package/src/runtime/literals/index.ts +0 -23
  58. package/src/runtime/literals/literal.ts +0 -48
  59. package/src/runtime/literals/pathJoin.ts +0 -33
  60. package/src/runtime/literals/stripLeading.ts +0 -15
  61. package/src/runtime/literals/stripTrailing.ts +0 -15
  62. package/src/runtime/literals/wide.ts +0 -13
  63. package/src/runtime/ruleset.ts +0 -42
  64. package/src/runtime/runtime/README.md +0 -3
  65. package/src/runtime/runtime/condition.ts +0 -13
  66. package/src/runtime/runtime/index.ts +0 -16
  67. package/src/runtime/runtime/type.ts +0 -127
  68. package/src/runtime/runtime/withValue.ts +0 -39
  69. package/src/runtime/state/Configurator.ts +0 -76
  70. package/src/runtime/state/FluentConfigurator.ts +0 -49
  71. package/src/runtime/state/index.ts +0 -13
  72. package/src/runtime/type-checks/ifSameType.ts +0 -20
  73. package/src/runtime/type-checks/ifTypeOf.ts +0 -124
  74. package/src/runtime/type-checks/index.ts +0 -24
  75. package/src/runtime/type-checks/isArray.ts +0 -34
  76. package/src/runtime/type-checks/isBoolean.ts +0 -24
  77. package/src/runtime/type-checks/isFalse.ts +0 -29
  78. package/src/runtime/type-checks/isFunction.ts +0 -26
  79. package/src/runtime/type-checks/isNull.ts +0 -26
  80. package/src/runtime/type-checks/isNumber.ts +0 -20
  81. package/src/runtime/type-checks/isObject.ts +0 -22
  82. package/src/runtime/type-checks/isString.ts +0 -34
  83. package/src/runtime/type-checks/isSymbol.ts +0 -3
  84. package/src/runtime/type-checks/isTrue.ts +0 -31
  85. package/src/runtime/type-checks/isUndefined.ts +0 -33
  86. package/src/runtime/type-checks/startsWith.ts +0 -107
  87. package/src/runtime/valueTypes.ts +0 -48
  88. package/src/types/Api.ts +0 -16
  89. package/src/types/Constructor.ts +0 -5
  90. package/src/types/EnumValues.ts +0 -14
  91. package/src/types/ExpandRecursively.ts +0 -12
  92. package/src/types/FunctionType.ts +0 -19
  93. package/src/types/If.ts +0 -10
  94. package/src/types/Include.ts +0 -18
  95. package/src/types/KeyedRecord.ts +0 -21
  96. package/src/types/Keys.ts +0 -26
  97. package/src/types/Length.ts +0 -8
  98. package/src/types/Mutable.ts +0 -8
  99. package/src/types/Narrowable.ts +0 -5
  100. package/src/types/Not.ts +0 -13
  101. package/src/types/Numeric.ts +0 -20
  102. package/src/types/Opaque.ts +0 -11
  103. package/src/types/README.md +0 -3
  104. package/src/types/Retain.ts +0 -16
  105. package/src/types/SimplifyObject.ts +0 -12
  106. package/src/types/Transformer.ts +0 -15
  107. package/src/types/TypeGuard.ts +0 -7
  108. package/src/types/Where.ts +0 -40
  109. package/src/types/alphabetic/AllCaps.ts +0 -15
  110. package/src/types/alphabetic/CamelCase.ts +0 -3
  111. package/src/types/alphabetic/CapFirstAlpha.ts +0 -23
  112. package/src/types/alphabetic/CapitalizeWords.ts +0 -9
  113. package/src/types/alphabetic/Cardinality.ts +0 -80
  114. package/src/types/alphabetic/DashToSnake.ts +0 -3
  115. package/src/types/alphabetic/DashUppercase.ts +0 -19
  116. package/src/types/alphabetic/Dasherize.ts +0 -23
  117. package/src/types/alphabetic/EnsureLeading.ts +0 -24
  118. package/src/types/alphabetic/EnsureTrailing.ts +0 -24
  119. package/src/types/alphabetic/HasUppercase.ts +0 -16
  120. package/src/types/alphabetic/IsCapitalized.ts +0 -18
  121. package/src/types/alphabetic/KebabCase.ts +0 -13
  122. package/src/types/alphabetic/LowerAllCaps.ts +0 -5
  123. package/src/types/alphabetic/PascalCase.ts +0 -29
  124. package/src/types/alphabetic/PathJoin.ts +0 -54
  125. package/src/types/alphabetic/Pluralize.ts +0 -112
  126. package/src/types/alphabetic/SnakeCase.ts +0 -27
  127. package/src/types/alphabetic/StripLeading.ts +0 -23
  128. package/src/types/alphabetic/StripTrailing.ts +0 -23
  129. package/src/types/alphabetic/Url.ts +0 -29
  130. package/src/types/alphabetic/alpha-characters.ts +0 -81
  131. package/src/types/alphabetic/index.ts +0 -32
  132. package/src/types/append-types.ts +0 -10
  133. package/src/types/boolean-logic/EndsWith.ts +0 -40
  134. package/src/types/boolean-logic/Extends.ts +0 -22
  135. package/src/types/boolean-logic/HasParameters.ts +0 -21
  136. package/src/types/boolean-logic/Includes.ts +0 -33
  137. package/src/types/boolean-logic/IsLiteral.ts +0 -101
  138. package/src/types/boolean-logic/IsScalar.ts +0 -20
  139. package/src/types/boolean-logic/IsUndefined.ts +0 -20
  140. package/src/types/boolean-logic/Or.ts +0 -12
  141. package/src/types/boolean-logic/StartsWith.ts +0 -42
  142. package/src/types/boolean-logic/TypeDefault.ts +0 -58
  143. package/src/types/boolean-logic/array.ts +0 -57
  144. package/src/types/boolean-logic/boolean.ts +0 -84
  145. package/src/types/boolean-logic/equivalency.ts +0 -15
  146. package/src/types/boolean-logic/index.ts +0 -14
  147. package/src/types/boolean-logic/object.ts +0 -30
  148. package/src/types/boolean-logic/string.ts +0 -21
  149. package/src/types/dictionary/DictChangeValue.ts +0 -34
  150. package/src/types/dictionary/DictPartialApplication.ts +0 -30
  151. package/src/types/dictionary/DictPrependWithFn.ts +0 -23
  152. package/src/types/dictionary/DictReturnValues.ts +0 -27
  153. package/src/types/dictionary/Get.ts +0 -14
  154. package/src/types/dictionary/MapTo.ts +0 -428
  155. package/src/types/dictionary/MutableProps.ts +0 -19
  156. package/src/types/dictionary/RequireProps.ts +0 -15
  157. package/src/types/dictionary/SameKeys.ts +0 -11
  158. package/src/types/dictionary/index.ts +0 -21
  159. package/src/types/dictionary/props.ts +0 -145
  160. package/src/types/fluent/fluent.ts +0 -61
  161. package/src/types/fluent/index.ts +0 -12
  162. package/src/types/functions/FinalReturn.ts +0 -12
  163. package/src/types/functions/LogicFunction.ts +0 -4
  164. package/src/types/functions/index.ts +0 -13
  165. package/src/types/index.ts +0 -49
  166. package/src/types/kv/DictFromKv.ts +0 -3
  167. package/src/types/kv/KeyValue.ts +0 -12
  168. package/src/types/kv/KvFrom.ts +0 -8
  169. package/src/types/kv/KvTuple.ts +0 -14
  170. package/src/types/kv/index.ts +0 -15
  171. package/src/types/lists/AfterFirst.ts +0 -10
  172. package/src/types/lists/ConvertAndMap.ts +0 -152
  173. package/src/types/lists/FilterTuple.ts +0 -20
  174. package/src/types/lists/First.ts +0 -8
  175. package/src/types/lists/FirstString.ts +0 -4
  176. package/src/types/lists/Split.ts +0 -21
  177. package/src/types/lists/UniqueForProp.ts +0 -18
  178. package/src/types/lists/index.ts +0 -18
  179. package/src/types/literal-unions/OptRequired.ts +0 -4
  180. package/src/types/literal-unions/index.ts +0 -1
  181. package/src/types/maybe.ts +0 -9
  182. package/src/types/ruleset-types.ts +0 -76
  183. package/src/types/runtime.ts +0 -39
  184. package/src/types/string-literals/Break.ts +0 -22
  185. package/src/types/string-literals/Concat.ts +0 -9
  186. package/src/types/string-literals/LeftWhitespace.ts +0 -13
  187. package/src/types/string-literals/Replace.ts +0 -17
  188. package/src/types/string-literals/RightWhitespace.ts +0 -13
  189. package/src/types/string-literals/StringLength.ts +0 -34
  190. package/src/types/string-literals/Trim.ts +0 -15
  191. package/src/types/string-literals/TrimLeft.ts +0 -14
  192. package/src/types/string-literals/TrimRight.ts +0 -14
  193. package/src/types/string-literals/form-fields.ts +0 -15
  194. package/src/types/string-literals/index.ts +0 -21
  195. package/src/types/tuples/DictArray.ts +0 -21
  196. package/src/types/tuples/FirstKey.ts +0 -10
  197. package/src/types/tuples/FirstKeyValue.ts +0 -9
  198. package/src/types/tuples/FirstOfEach.ts +0 -13
  199. package/src/types/tuples/FromDictArray.ts +0 -14
  200. package/src/types/tuples/SecondOfEach.ts +0 -13
  201. package/src/types/tuples/index.ts +0 -17
  202. package/src/types/type-conversion/TupleToUnion.ts +0 -9
  203. package/src/types/type-conversion/UnionToIntersection.ts +0 -9
  204. package/src/types/type-conversion/UnionToTuple.ts +0 -20
  205. package/src/types/type-conversion/Widen.ts +0 -22
  206. package/src/types/type-conversion/index.ts +0 -16
  207. package/src/types/type-testing.ts +0 -14
  208. package/tests/CamelCase-spec.ts +0 -20
  209. package/tests/Configurator-spec.hold +0 -106
  210. package/tests/ExplicitFunction-spec.ts +0 -50
  211. package/tests/IncludeAndRetain-spec.ts +0 -67
  212. package/tests/Includes-spec.ts +0 -36
  213. package/tests/KebabCase-spec.ts +0 -21
  214. package/tests/PascalCase-spec.ts +0 -22
  215. package/tests/Pluralize-spec.ts +0 -23
  216. package/tests/SnakeCase-spec.ts +0 -21
  217. package/tests/Where.spec.ts +0 -38
  218. package/tests/arrayToKeyLookup-spec.ts +0 -17
  219. package/tests/arrayToObject-spec.ts +0 -115
  220. package/tests/boolean-logic/Contains.test.ts +0 -55
  221. package/tests/boolean-logic/HasParameters.ts +0 -29
  222. package/tests/boolean-logic/IsLiteral.spec.ts +0 -65
  223. package/tests/boolean-logic/boolean.spec.ts +0 -21
  224. package/tests/boolean-logic/filter.spec.ts +0 -52
  225. package/tests/constructor.spec.ts +0 -42
  226. package/tests/createFnWithProps.spec.ts +0 -14
  227. package/tests/data/SimpleTable.hold +0 -21
  228. package/tests/data/index.ts +0 -12
  229. package/tests/data/playlist.hold +0 -25
  230. package/tests/data/song.hold +0 -23
  231. package/tests/defineType-spec.ts +0 -57
  232. package/tests/dictionary/DictChangeValue.test.ts +0 -30
  233. package/tests/dictionary/DictPartialApplication.test.ts +0 -43
  234. package/tests/dictionary/DictReturnValues.test.ts +0 -36
  235. package/tests/dictionary/Get.spec.ts +0 -28
  236. package/tests/dictionary/IntersectingKeys.test.ts +0 -42
  237. package/tests/dictionary/MutableProps.test.ts +0 -30
  238. package/tests/dictionary/OptionalKeys.test.ts +0 -24
  239. package/tests/dictionary/PrependValuesWithFunction.test.ts +0 -34
  240. package/tests/dictionary/RequireProps.test.ts +0 -21
  241. package/tests/dictionary/RequiredKeys.test.ts +0 -53
  242. package/tests/dictionary/TypeDefault.test.ts +0 -76
  243. package/tests/dictionary/mapTo.test.ts +0 -388
  244. package/tests/dictionary/merge.test.ts +0 -41
  245. package/tests/dictionaryTransform-spec.ts +0 -280
  246. package/tests/ifTypeOf-spec.ts +0 -191
  247. package/tests/kv/KeyValue-spec.ts +0 -22
  248. package/tests/kv/SameKeys-spec.ts +0 -35
  249. package/tests/kv/dict-to-kv-and-back.spec.ts +0 -169
  250. package/tests/kv/entries-spec.ts +0 -65
  251. package/tests/kv/keys.spec.ts +0 -66
  252. package/tests/kv/kv-spec.ts +0 -20
  253. package/tests/lists/First.test.ts +0 -43
  254. package/tests/lists/Length.test.ts +0 -19
  255. package/tests/lists/Split.test.ts +0 -29
  256. package/tests/lists/UniqueForProp.spec.ts +0 -59
  257. package/tests/lists/asArray.test.ts +0 -109
  258. package/tests/lists/dictArr.test.ts +0 -110
  259. package/tests/literal-spec.ts +0 -82
  260. package/tests/literals/AllCaps.spec.ts +0 -33
  261. package/tests/literals/CamelCase.spec.ts +0 -109
  262. package/tests/literals/Dasherize.spec.ts +0 -107
  263. package/tests/literals/EnsureStripLeadingTrailing.test.ts +0 -79
  264. package/tests/literals/HasUppercase.spec.ts +0 -33
  265. package/tests/literals/PascalCase.spec.ts +0 -109
  266. package/tests/literals/PathJoin.test.ts +0 -111
  267. package/tests/literals/SnakeCase.spec.ts +0 -109
  268. package/tests/literals/box.test.ts +0 -85
  269. package/tests/literals/whitespace-capture.spec.ts +0 -60
  270. package/tests/mapValues-spec.ts +0 -50
  271. package/tests/props-spec.ts +0 -234
  272. package/tests/runtime/condition.spec.ts +0 -19
  273. package/tests/runtime/if-is.spec.ts +0 -390
  274. package/tests/runtime/map-and-convert.test.ts +0 -31
  275. package/tests/runtime/type.spec.ts +0 -190
  276. package/tests/strArrayToDict-spec.ts +0 -40
  277. package/tests/tuples/TupleToUnion.spec.ts +0 -20
  278. package/tests/withValue.spec.ts +0 -173
  279. package/tsconfig.json +0 -36
  280. package/vitest.config.ts +0 -17
@@ -1,30 +0,0 @@
1
- import { describe, it } from "vitest";
2
- import type { Expect, Equal } from "@type-challenges/utils";
3
- import { DictChangeValue } from "../../src/types/dictionary/DictChangeValue";
4
- import { SimplifyObject } from "../../src/types/SimplifyObject";
5
-
6
- const test_obj = {
7
- foo: "hello world",
8
- bar: 42,
9
- baz: () => "that's all folks",
10
- } as const;
11
- type TestObj = typeof test_obj;
12
-
13
- describe("DictChangeValue", () => {
14
- it("convert all KVs to a single value type", () => {
15
- type T = DictChangeValue<TestObj, number>;
16
-
17
- type cases = [Expect<Equal<T, { foo: number; bar: number; baz: number }>>];
18
- const cases: cases = [true];
19
- });
20
-
21
- it("convert functions values to boolean", () => {
22
- type F = DictChangeValue<TestObj, boolean, Function>;
23
- type S = DictChangeValue<TestObj, string, string>;
24
- type N = DictChangeValue<TestObj, number, number>;
25
- type T = SimplifyObject<F & S & N>;
26
-
27
- type cases = [Expect<Equal<T, { foo: string; bar: number; baz: boolean }>>];
28
- const cases: cases = [true];
29
- });
30
- });
@@ -1,43 +0,0 @@
1
- import { describe, it } from "vitest";
2
-
3
- import type { DictPartialApplication } from "src/types";
4
- import type { Expect, Equal } from "@type-challenges/utils";
5
-
6
- describe("DictUnwrapValues<T>", () => {
7
- it("happy path", () => {
8
- const api = {
9
- hi: (name: string) => `hi ${name}`,
10
- bye: (name: string) => `bye ${name}`,
11
- };
12
-
13
- type Api = typeof api;
14
- type T = DictPartialApplication<Api>;
15
- type Expected = { hi: string; bye: string };
16
-
17
- type cases = [Expect<Equal<T, Expected>>];
18
-
19
- const cases: cases = [true];
20
- });
21
-
22
- it("object which has non-function based props", () => {
23
- const api = {
24
- theAnswer: 42,
25
- hi: (name: string) => `hi ${name}`,
26
- bye: (name: string) => `bye ${name}`,
27
- };
28
-
29
- type Api = typeof api;
30
- type T1 = DictPartialApplication<Api>;
31
- type T2 = DictPartialApplication<Api, true>;
32
- type T3 = DictPartialApplication<Api, false>;
33
- type Expected = { hi: string; bye: string };
34
- type Expected3 = { theAnswer: number; hi: string; bye: string };
35
-
36
- type cases = [
37
- Expect<Equal<T1, Expected>>,
38
- Expect<Equal<T2, Expected>>,
39
- Expect<Equal<T3, Expected3>>
40
- ];
41
- const cases: cases = [true, true, true];
42
- });
43
- });
@@ -1,36 +0,0 @@
1
- import { describe, it } from "vitest";
2
-
3
- import type { DictReturnValues } from "src/types";
4
- import type { Expect, Equal } from "@type-challenges/utils";
5
-
6
- describe("DictReturnValues<T, R, O>", () => {
7
- it("happy path", () => {
8
- const api = {
9
- foo: (name: string) => `${name}`,
10
- multiply: (v1: number, v2: number) => v1 * v2,
11
- };
12
-
13
- type Api = typeof api;
14
- // convert all functions
15
- type T1 = DictReturnValues<Api, null>;
16
- // convert functions with `number` return
17
- type T2 = DictReturnValues<Api, null, (...args: any[]) => number>;
18
-
19
- type Expected1 = {
20
- foo: (name: string) => null;
21
- multiply: (v1: number, v2: number) => null;
22
- };
23
- type Expected2 = {
24
- foo: (name: string) => string;
25
- multiply: (v1: number, v2: number) => null;
26
- };
27
-
28
- type cases = [
29
- //
30
- Expect<Equal<T1, Expected1>>,
31
- Expect<Equal<T2, Expected2>>
32
- ];
33
-
34
- const cases: cases = [true, true];
35
- });
36
- });
@@ -1,28 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
-
3
- import { Equal, Expect } from "@type-challenges/utils";
4
- import { Get } from "src/types";
5
- import { defineType } from "src/runtime";
6
-
7
- describe("Get<T, K> type utility", () => {
8
- it("Get<T,K> works with literals and wide types", () => {
9
- const input = defineType({ id: 1234 })({ foo: 1, bar: "hi" });
10
- type Input = typeof input;
11
-
12
- type Id = Get<Input, "id">;
13
- type Foo = Get<Input, "foo">;
14
- type Bar = Get<Input, "bar">;
15
- type Nada = Get<Input, "nada">;
16
-
17
- type cases = [
18
- // valid props are pulled off
19
- Expect<Equal<Id, 1234>>,
20
- Expect<Equal<Foo, number>>,
21
- Expect<Equal<Bar, string>>,
22
- // non-existent props return never
23
- Expect<Equal<Nada, never>>
24
- ];
25
- const c: cases = [true, true, true, true];
26
- expect(c).toBe(c);
27
- });
28
- });
@@ -1,42 +0,0 @@
1
- import { describe, it } from "vitest";
2
-
3
- import type { Expect, Equal } from "@type-challenges/utils";
4
- import { IntersectingKeys } from "src/types/dictionary";
5
-
6
- describe("IntersectingKeys<T,U>", () => {
7
- it("with overlap", () => {
8
- type T = { foo: string; bar: number; baz: any };
9
- type U = { foo: string; bar: number };
10
- type V = IntersectingKeys<T, U>;
11
-
12
- type cases = [Expect<Equal<V, "foo" | "bar">>];
13
- const cases: cases = [true];
14
- });
15
-
16
- it("no overlap", () => {
17
- type T = { foo1: string; bar1: number; baz1: any };
18
- type U = { foo: string; bar: number };
19
- type V = IntersectingKeys<T, U>;
20
- type VU = Exclude<U, V>;
21
-
22
- type cases = [
23
- // intersection is "never"
24
- Expect<Equal<VU, U>>,
25
- // Excluding "never" results in no change
26
- Expect<Equal<VU, U>>
27
- ];
28
- const cases: cases = [true, true];
29
- });
30
-
31
- it("using string[] instead of object", () => {
32
- type T = { foo: string; bar: number; baz: any };
33
- type U = readonly ["foo", "bart"];
34
- type V = IntersectingKeys<T, U>;
35
-
36
- type cases = [
37
- //
38
- Expect<Equal<V, "foo">>
39
- ];
40
- const cases: cases = [true];
41
- });
42
- });
@@ -1,30 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import type { Expect, Equal } from "@type-challenges/utils";
3
-
4
- import { MutableProps } from "src/types/dictionary";
5
-
6
- describe("MutableProps<T,M>", () => {
7
- it("works as expected", () => {
8
- type Test = { foo: string; bar?: number; baz: Readonly<boolean> };
9
- type Foo = MutableProps<Test, "foo" | "bar">;
10
- type Bar = MutableProps<Test, "bar">;
11
- type FooBar = MutableProps<Test, "foo" | "bar">;
12
- type FooBaz = MutableProps<Test, "foo" | "baz">;
13
-
14
- type cases = [
15
- Expect<Equal<Foo, { foo: string; bar?: Readonly<number>; readonly baz: Readonly<boolean> }>>,
16
- Expect<
17
- Equal<
18
- Bar,
19
- { readonly foo: Readonly<string>; bar?: number; readonly baz: Readonly<boolean> }
20
- >
21
- >,
22
- Expect<Equal<FooBar, { foo: string; bar?: number; readonly baz: Readonly<boolean> }>>,
23
- Expect<
24
- Equal<FooBaz, { foo: string; readonly bar?: Readonly<number>; baz: Readonly<boolean> }>
25
- >
26
- ];
27
- const cases: cases = [true, true, true, true];
28
- expect(cases).toBe(cases);
29
- });
30
- });
@@ -1,24 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import type { Expect, Equal } from "@type-challenges/utils";
3
- import { OptionalKeys } from "src/types/dictionary";
4
-
5
- type Test = { title: string; value: number; color?: string };
6
-
7
- describe("OptionalKeys<T, V>", () => {
8
- it("basic usage without filtering on value", () => {
9
- type T = OptionalKeys<Test>;
10
-
11
- type cases = [Expect<Equal<T, "color">>];
12
- const cases: cases = [true];
13
- expect(cases).toBe(cases);
14
- });
15
-
16
- it("basic usage with a value filter", () => {
17
- type T1 = OptionalKeys<Test, string>;
18
- type T2 = OptionalKeys<Test, number>;
19
-
20
- type cases = [Expect<Equal<T1, "color">>, Expect<Equal<T2, never>>];
21
- const cases: cases = [true, true];
22
- expect(cases).toBe(cases);
23
- });
24
- });
@@ -1,34 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
-
3
- import type { DictPrependWithFn } from "src/types";
4
- import type { Expect, Equal } from "@type-challenges/utils";
5
-
6
- describe("WrapValuesWithFunction<T, R, O>", () => {
7
- it("happy path", () => {
8
- const api = {
9
- static: 42,
10
- foo: (name: string) => `${name}`,
11
- multiply: (v1: number, v2: number) => v1 * v2,
12
- };
13
-
14
- type Api = typeof api;
15
- type T1 = DictPrependWithFn<Api, [name: string, age: number]>;
16
- type T2 = DictPrependWithFn<Api, [name: string, age: number], Function>;
17
-
18
- type Expected1 = {
19
- static: (name: string, age: number) => number;
20
- foo: (name: string, age: number) => (name: string) => string;
21
- multiply: (name: string, age: number) => (v1: number, v2: number) => number;
22
- };
23
-
24
- type Expected2 = {
25
- static: number;
26
- foo: (name: string, age: number) => (name: string) => string;
27
- multiply: (name: string, age: number) => (v1: number, v2: number) => number;
28
- };
29
-
30
- type cases = [Expect<Equal<T1, Expected1>>, Expect<Equal<T2, Expected2>>];
31
- const cases: cases = [true, true];
32
- expect(cases).toBe(cases);
33
- });
34
- });
@@ -1,21 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import type { Expect, Equal } from "@type-challenges/utils";
3
-
4
- import { RequireProps } from "src/types/dictionary";
5
-
6
- describe("RequireProps<T,R>", () => {
7
- it("works as expected", () => {
8
- type Start = { foo?: string; bar?: number };
9
- type Foo = RequireProps<Start, "foo">;
10
- type Bar = RequireProps<Start, "bar">;
11
- type Both = RequireProps<Start, "foo" | "bar">;
12
-
13
- type cases = [
14
- Expect<Equal<Foo, { foo: string; bar?: number }>>,
15
- Expect<Equal<Bar, { foo?: string; bar: number }>>,
16
- Expect<Equal<Both, { foo: string; bar: number }>>
17
- ];
18
- const cases: cases = [true, true, true];
19
- expect(cases).toBe(cases);
20
- });
21
- });
@@ -1,53 +0,0 @@
1
- import { describe, it, expect } from "vitest";
2
- import type { Expect, Equal } from "@type-challenges/utils";
3
- import { RequiredKeys } from "src/types/dictionary";
4
- import { First, Narrowable } from "src";
5
-
6
- type Test = { title: string; value: number; color?: string };
7
-
8
- describe("RequiredKeys<T, V>", () => {
9
- it("basic usage without filtering on value", () => {
10
- type T = RequiredKeys<Test>;
11
-
12
- type cases = [Expect<Equal<T, "title" | "value">>];
13
- const cases: cases = [true];
14
- expect(cases).toBe(cases);
15
- });
16
-
17
- it("basic usage with a value filter", () => {
18
- type T1 = RequiredKeys<Test, string>;
19
- type T2 = RequiredKeys<Test, number>;
20
-
21
- type cases = [Expect<Equal<T1, "title">>, Expect<Equal<T2, "value">>];
22
- const cases: cases = [true, true];
23
- expect(cases).toBe(cases);
24
- });
25
-
26
- it("typed explicitly", () => {
27
- type O = {
28
- id: number;
29
- name: string;
30
- title: string;
31
- cost?: number;
32
- color?: string;
33
- };
34
-
35
- const genericArr: O[] = [
36
- { id: 1, name: "foo", title: "one", cost: 15 },
37
- { id: 2, name: "bar", title: "one" },
38
- { id: 3, name: "baz", title: "two", cost: 45, color: "green" },
39
- ];
40
- const fn = <T extends Record<string, Narrowable>, A extends readonly T[]>(arr: A): A => arr;
41
-
42
- const v = fn(genericArr);
43
- type V = typeof v;
44
- type T1 = RequiredKeys<First<V>>;
45
- type T2 = RequiredKeys<First<V>, string>;
46
-
47
- type cases = [
48
- Expect<Equal<T1, "id" | "name" | "title">>, //
49
- Expect<Equal<T2, "name" | "title">>
50
- ];
51
- const cases: cases = [true, true];
52
- });
53
- });
@@ -1,76 +0,0 @@
1
- import { describe, it } from "vitest";
2
- import { Equal, Expect } from "@type-challenges/utils";
3
- import { TypeDefault } from "src/types/boolean-logic/TypeDefault";
4
- import { literal } from "src/runtime/literals";
5
-
6
- describe("TypeDefault<T,D>", () => {
7
- it("T/D as dictionary", () => {
8
- type T = { foo?: "foo" | "fooy" | undefined; bar?: 42 | 53 | undefined };
9
- type D = { foo: "foo"; bar: 42 };
10
- type V = TypeDefault<T, D>;
11
- const t1 = literal({ foo: undefined, bar: 56 });
12
- type V1 = TypeDefault<typeof t1, D>;
13
- const t2 = { foo: undefined, bar: 56 };
14
- type V2 = TypeDefault<typeof t2, D>;
15
- // const t3 = { bar: 56, baz: "hello" } as const;
16
- // type _V3 = TypeDefault<typeof t3, D>;
17
-
18
- type cases = [
19
- // D's props all extend T
20
- Expect<Equal<V, D>>,
21
- // foo is inherited from default, bar keeps literal type from T
22
- Expect<Equal<V1, { foo: "foo"; bar: 56 }>>,
23
- // bar is widened to "number" because that's the resolution T had
24
- Expect<Equal<V2, { foo: "foo"; bar: number }>>
25
- // the T prop has the prop "baz" which did not exist on D
26
- // TODO: this last test SHOULD work but doesn't yet
27
- // Expect<Equal<V3, { foo: "foo"; bar: 56; baz: "hello" }>>
28
- ];
29
- const cases: cases = [true, true, true];
30
- });
31
- it("T is undefined, D is a dictionary", () => {
32
- type T = undefined;
33
- type D = { foo: "foo"; bar: 42 };
34
- type V = TypeDefault<T, D>;
35
-
36
- type cases = [
37
- // the value's type is converted to the default
38
- Expect<Equal<V, D>>
39
- ];
40
- const cases: cases = [true];
41
- });
42
-
43
- it("T and D are scalars", () => {
44
- type T1 = 5;
45
- type D1 = 8;
46
- type V1 = TypeDefault<T1, D1>;
47
-
48
- type T2 = "foo";
49
- type D2 = "bar";
50
- type V2 = TypeDefault<T2, D2>;
51
-
52
- type T3 = undefined;
53
- type D3 = "bar";
54
- type V3 = TypeDefault<T3, D3>;
55
-
56
- type cases = [
57
- Expect<Equal<V1, 5>>, //
58
- Expect<Equal<V2, "foo">>,
59
- Expect<Equal<V3, "bar">>
60
- ];
61
-
62
- const cases: cases = [true, true, true];
63
- });
64
-
65
- it("Property includes a function", () => {
66
- type T1 = { foo: "foo"; bar: undefined };
67
- type D1 = { foo: "bar"; bar: () => "hello" };
68
- type V1 = TypeDefault<T1, D1>;
69
-
70
- type cases = [
71
- Expect<Equal<V1["foo"], "foo">>, //
72
- Expect<Equal<V1["bar"], () => "hello">>
73
- ];
74
- const cases: cases = [true, true];
75
- });
76
- });