inferred-types 0.28.5 → 0.30.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.
package/dist/index.d.ts CHANGED
@@ -807,7 +807,7 @@ declare const mapToDict: MapperApi;
807
807
  * const many2one = mapTo.manyToOne().map<I,O>( ... );
808
808
  * ```
809
809
  */
810
- declare const mapTo: (<I, O>(map: (source: I) => O[]) => <S extends I | I[]>(source: S) => S extends I[] ? O[] : O[] | null) & MapperApi;
810
+ declare const mapTo: (<I, O>(map: (source: I) => O[]) => Mapper<I, O, FinalizedMapConfig<"req", "I -> O[]", "opt">>) & MapperApi;
811
811
 
812
812
  /**
813
813
  * Expresses relationship between inputs/outputs:
@@ -873,7 +873,7 @@ declare type MapCardinalityConfig<IR extends OptRequired | undefined, OR extends
873
873
  * method which allows the user configure the specifics of the mapping.
874
874
  */
875
875
  declare type ConfiguredMap<C extends FinalizedMapConfig<OptRequired, MapCardinalityIllustrated, OptRequired>> = {
876
- map: <I, O>(map: MapTo<I, O, C>) => MapFn<I, O, C>;
876
+ map: <I, O>(map: MapTo<I, O, C>) => Mapper<I, O, C>;
877
877
  input: MapIR<C>;
878
878
  cardinality: MapCard<C>;
879
879
  output: MapOR<C>;
@@ -970,6 +970,25 @@ declare type MapFnInput<I, IR extends OptRequired, D extends MapCardinalityIllus
970
970
  * ```
971
971
  */
972
972
  declare type MapFn<I, O, C extends FinalizedMapConfig<OptRequired, MapCardinalityIllustrated, OptRequired>> = MapIR<C> extends "opt" ? <S extends MapFnInput<I, MapIR<C>, MapCard<C>>>(source?: S) => MapFnOutput<I, O, S, MapOR<C>, MapCard<C>> : <S extends MapFnInput<I, MapIR<C>, MapCard<C>>>(source: S) => MapFnOutput<I, O, S, MapOR<C>, MapCard<C>>;
973
+ /**
974
+ * **Mapper**
975
+ *
976
+ * A fully configured _mapper_ stemming from the **mapTo()** utility. It is both a mapping
977
+ * function and a dictionary which describes the mapper's properties.
978
+ * ```ts
979
+ * const m = mapTo.oneToOne().map( ... );
980
+ * const mapped = m(inputs);
981
+ * const mappedOver = inputs.map(m);
982
+ * ```
983
+ */
984
+ declare type Mapper<I, O, C extends FinalizedMapConfig<OptRequired, MapCardinalityIllustrated, OptRequired>> = {
985
+ input: MapIR<C>;
986
+ output: MapOR<C>;
987
+ cardinality: MapCard<C>;
988
+ debug: boolean | string;
989
+ inputType: I;
990
+ outputType: O;
991
+ } & MapFn<I, O, C>;
973
992
 
974
993
  /**
975
994
  * Given a dictionary of type `<T>`, this utility function will
@@ -2260,4 +2279,4 @@ interface IFluentConfigurator<C> {
2260
2279
  */
2261
2280
  declare function FluentConfigurator<I>(initial?: I): IFluentConfigurator<{}>;
2262
2281
 
2263
- export { AllCaps, Alpha, AlphaNumeric, Api, ApiFunction, ApiValue, AppendToDictionary, AppendToObject, ArrConcat, Array$1 as Array, ArrayConverter, AsArray, AsFinalizedConfig, AssertExtends, Bracket, Break, CamelCase, CapitalizeWords, Cardinality, Cardinality0, Cardinality1, CardinalityExplicit, CardinalityFilter0, CardinalityFilter1, CardinalityIn, CardinalityInput, CardinalityNode, CardinalityOut, CardinalityTuple, ClosingBracket, Condition, ConditionFilter, Configurator, ConfiguredMap, Constructor, DEFAULT_MANY_TO_ONE_MAPPING, DEFAULT_ONE_TO_MANY_MAPPING, DEFAULT_ONE_TO_ONE_MAPPING, DashToSnake, DashUppercase, Dasherize, DecomposeMapConfig, DefaultManyToOneMapping, DefaultOneToManyMapping, DefaultOneToOneMapping, DefinePropertiesApi, DictArrApi, DictArray, DictArrayFilterCallback, DictArrayKv, DictChangeValue, DictFromKv, DictKvTuple, DictPartialApplication, DictPrependWithFn, DictReturnValues, DynamicRule, DynamicRuleSet, Email, EnumValues, ExpandRecursively, ExpectExtends, ExplicitFunction, Extends, ExtendsClause, ExtendsNarrowlyClause, FilterContains, FilterDefn, FilterEnds, FilterEquals, FilterFn, FilterGreaterThan, FilterIs, FilterLessThan, FilterNotEqual, FilterStarts, FinalReturn, FinalizedMapConfig, First, FirstKey, FirstKeyValue, FirstOfEach, FluentConfigurator, FluentFunction, FromDictArray, FunctionType, GeneralDictionary, Get, HasUppercase, IConfigurator, IFluentConfigurator, If, IfBooleanLiteral, IfExtends, IfExtendsThen, IfLiteral, IfNumericLiteral, IfObject, IfOptionalLiteral, IfScalar, IfStringLiteral, Include, Includes, IntersectingKeys, IsArray, IsBoolean, IsBooleanLiteral, IsCapitalized, IsFalse, IsFunction, IsLiteral, IsNumericLiteral, IsObject, IsOptionalLiteral, IsScalar, IsString, IsStringLiteral, IsTrue, KebabCase, KeyValue, KeyedRecord, Keys, KeysWithValue, KvFrom, KvTuple, LastInUnion, LeftWhitespace, Length, LogicFunction, LogicalCombinator, LowerAllCaps, LowerAlpha, ManyToMany, ManyToOne, ManyToZero, MapCard, MapCardinality, MapCardinalityIllustrated, MapConfig, MapFn, MapFnInput, MapFnOutput, MapIR, MapInput, MapOR, MapOutput, MapTo, MapperApi, MaybeFalse, MaybeTrue, Model, Mutable, MutableProps, MutationFunction, MutationIdentity, Narrowable, NonAlpha, NonNumericKeys, NonStringKeys, Not, NotFilter, Numeric, NumericFilter, NumericKeys, NumericString, ObjectType, OneToMany, OneToOne, OneToZero, Opaque, OpeningBracket, OptRequired, OptionalKeys, OptionalProps, Parenthesis, PascalCase, Pluralize, PrivateKey, PrivateKeys, PublicKeys, Punctuation, PureFluentApi, Replace, RequireProps, RequiredKeys, RequiredProps, Retain, RightWhitespace, RuleDefinition, RuntimeProp, RuntimeType, SameKeys, SecondOfEach, SimplifyObject, SnakeCase, SpecialCharacters, StringDelimiter, StringFilter, StringKeys, StringLength, ToFluent, Transformer, Trim, TrimLeft, TrimRight, TupleToUnion, Type, TypeApi, TypeCondition, TypeDefault, TypeDefinition, TypeGuard, TypeOptions, UndefinedArrayIsUnknown, UndefinedTreatment, UndefinedValue, UnionToIntersection, UnionToTuple, UniqueDictionary, UniqueForProp, Uniqueness, UnwrapNot, UpperAlpha, ValueTuple, ValueTypeFunc, ValueTypes, Where, WhereNot, Whitespace, Widen, WithNumericKeys, WithStringKeys, WithValue, ZeroToMany, ZeroToOne, ZeroToZero, ZipCode, and, api, arrayToKeyLookup, arrayToObject, asArray, condition, createFnWithProps, createMutationFunction, defineProperties, defineType, dictArr, dictToKv, dictionaryTransform, entries, filter, filterDictArray, fnWithProps, groupBy, idLiteral, idTypeGuard, identity, ifTypeOf, isArray, isBoolean, isFalse, isFunction, isNotFilter, isNull, isNumber, isNumericFilter, isObject, isString, isSymbol, isTrue, isType, isUndefined, keys, kindLiteral, kv, kvToDict, literal, mapTo, mapToDict, mapToFn, mapValues, nameLiteral, not, or, randomString, readonlyFnWithProps, ruleSet, strArrayToDict, type, typeApi, uuid, valueTypes, withValue };
2282
+ export { AllCaps, Alpha, AlphaNumeric, Api, ApiFunction, ApiValue, AppendToDictionary, AppendToObject, ArrConcat, Array$1 as Array, ArrayConverter, AsArray, AsFinalizedConfig, AssertExtends, Bracket, Break, CamelCase, CapitalizeWords, Cardinality, Cardinality0, Cardinality1, CardinalityExplicit, CardinalityFilter0, CardinalityFilter1, CardinalityIn, CardinalityInput, CardinalityNode, CardinalityOut, CardinalityTuple, ClosingBracket, Condition, ConditionFilter, Configurator, ConfiguredMap, Constructor, DEFAULT_MANY_TO_ONE_MAPPING, DEFAULT_ONE_TO_MANY_MAPPING, DEFAULT_ONE_TO_ONE_MAPPING, DashToSnake, DashUppercase, Dasherize, DecomposeMapConfig, DefaultManyToOneMapping, DefaultOneToManyMapping, DefaultOneToOneMapping, DefinePropertiesApi, DictArrApi, DictArray, DictArrayFilterCallback, DictArrayKv, DictChangeValue, DictFromKv, DictKvTuple, DictPartialApplication, DictPrependWithFn, DictReturnValues, DynamicRule, DynamicRuleSet, Email, EnumValues, ExpandRecursively, ExpectExtends, ExplicitFunction, Extends, ExtendsClause, ExtendsNarrowlyClause, FilterContains, FilterDefn, FilterEnds, FilterEquals, FilterFn, FilterGreaterThan, FilterIs, FilterLessThan, FilterNotEqual, FilterStarts, FinalReturn, FinalizedMapConfig, First, FirstKey, FirstKeyValue, FirstOfEach, FluentConfigurator, FluentFunction, FromDictArray, FunctionType, GeneralDictionary, Get, HasUppercase, IConfigurator, IFluentConfigurator, If, IfBooleanLiteral, IfExtends, IfExtendsThen, IfLiteral, IfNumericLiteral, IfObject, IfOptionalLiteral, IfScalar, IfStringLiteral, Include, Includes, IntersectingKeys, IsArray, IsBoolean, IsBooleanLiteral, IsCapitalized, IsFalse, IsFunction, IsLiteral, IsNumericLiteral, IsObject, IsOptionalLiteral, IsScalar, IsString, IsStringLiteral, IsTrue, KebabCase, KeyValue, KeyedRecord, Keys, KeysWithValue, KvFrom, KvTuple, LastInUnion, LeftWhitespace, Length, LogicFunction, LogicalCombinator, LowerAllCaps, LowerAlpha, ManyToMany, ManyToOne, ManyToZero, MapCard, MapCardinality, MapCardinalityIllustrated, MapConfig, MapFn, MapFnInput, MapFnOutput, MapIR, MapInput, MapOR, MapOutput, MapTo, Mapper, MapperApi, MaybeFalse, MaybeTrue, Model, Mutable, MutableProps, MutationFunction, MutationIdentity, Narrowable, NonAlpha, NonNumericKeys, NonStringKeys, Not, NotFilter, Numeric, NumericFilter, NumericKeys, NumericString, ObjectType, OneToMany, OneToOne, OneToZero, Opaque, OpeningBracket, OptRequired, OptionalKeys, OptionalProps, Parenthesis, PascalCase, Pluralize, PrivateKey, PrivateKeys, PublicKeys, Punctuation, PureFluentApi, Replace, RequireProps, RequiredKeys, RequiredProps, Retain, RightWhitespace, RuleDefinition, RuntimeProp, RuntimeType, SameKeys, SecondOfEach, SimplifyObject, SnakeCase, SpecialCharacters, StringDelimiter, StringFilter, StringKeys, StringLength, ToFluent, Transformer, Trim, TrimLeft, TrimRight, TupleToUnion, Type, TypeApi, TypeCondition, TypeDefault, TypeDefinition, TypeGuard, TypeOptions, UndefinedArrayIsUnknown, UndefinedTreatment, UndefinedValue, UnionToIntersection, UnionToTuple, UniqueDictionary, UniqueForProp, Uniqueness, UnwrapNot, UpperAlpha, ValueTuple, ValueTypeFunc, ValueTypes, Where, WhereNot, Whitespace, Widen, WithNumericKeys, WithStringKeys, WithValue, ZeroToMany, ZeroToOne, ZeroToZero, ZipCode, and, api, arrayToKeyLookup, arrayToObject, asArray, condition, createFnWithProps, createMutationFunction, defineProperties, defineType, dictArr, dictToKv, dictionaryTransform, entries, filter, filterDictArray, fnWithProps, groupBy, idLiteral, idTypeGuard, identity, ifTypeOf, isArray, isBoolean, isFalse, isFunction, isNotFilter, isNull, isNumber, isNumericFilter, isObject, isString, isSymbol, isTrue, isType, isUndefined, keys, kindLiteral, kv, kvToDict, literal, mapTo, mapToDict, mapToFn, mapValues, nameLiteral, not, or, randomString, readonlyFnWithProps, ruleSet, strArrayToDict, type, typeApi, uuid, valueTypes, withValue };
package/dist/index.js CHANGED
@@ -627,7 +627,7 @@ And produced: ${JSON.stringify(
627
627
  }
628
628
  };
629
629
  var mapper = (config) => (map) => {
630
- return (source) => {
630
+ const fn = (source) => {
631
631
  const isArray2 = config.cardinality === "I -> O[]" && Array.isArray(source) ? true : config.cardinality === "I[] -> O" && Array.isArray(source) && Array.isArray(source[0]) ? true : false;
632
632
  if (isArray2) {
633
633
  const output = source.flatMap(map);
@@ -639,6 +639,14 @@ var mapper = (config) => (map) => {
639
639
  return output;
640
640
  }
641
641
  };
642
+ return createFnWithProps(fn, {
643
+ input: config.input,
644
+ output: config.output,
645
+ cardinality: config.cardinality,
646
+ debug: config.debug,
647
+ inputType: {},
648
+ outputType: {}
649
+ });
642
650
  };
643
651
  var setMapper = (config = { input: void 0, output: void 0, cardinality: void 0 }, defaultValue) => ({
644
652
  map: (source) => {
package/dist/index.mjs CHANGED
@@ -536,7 +536,7 @@ And produced: ${JSON.stringify(
536
536
  }
537
537
  };
538
538
  var mapper = (config) => (map) => {
539
- return (source) => {
539
+ const fn = (source) => {
540
540
  const isArray2 = config.cardinality === "I -> O[]" && Array.isArray(source) ? true : config.cardinality === "I[] -> O" && Array.isArray(source) && Array.isArray(source[0]) ? true : false;
541
541
  if (isArray2) {
542
542
  const output = source.flatMap(map);
@@ -548,6 +548,14 @@ var mapper = (config) => (map) => {
548
548
  return output;
549
549
  }
550
550
  };
551
+ return createFnWithProps(fn, {
552
+ input: config.input,
553
+ output: config.output,
554
+ cardinality: config.cardinality,
555
+ debug: config.debug,
556
+ inputType: {},
557
+ outputType: {}
558
+ });
551
559
  };
552
560
  var setMapper = (config = { input: void 0, output: void 0, cardinality: void 0 }, defaultValue) => ({
553
561
  map: (source) => {
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "inferred-types",
3
- "version": "0.28.5",
3
+ "version": "0.30.0",
4
4
  "description": "Functions which provide useful type inference on TS projects",
5
5
  "license": "MIT",
6
6
  "author": "Ken Snyder<ken@ken.net>",
@@ -87,7 +87,7 @@ type MapCardinalityConfig<
87
87
  export type ConfiguredMap<
88
88
  C extends FinalizedMapConfig<OptRequired, MapCardinalityIllustrated, OptRequired>
89
89
  > = {
90
- map: <I, O>(map: MapTo<I, O, C>) => MapFn<I, O, C>;
90
+ map: <I, O>(map: MapTo<I, O, C>) => Mapper<I, O, C>;
91
91
  input: MapIR<C>;
92
92
  cardinality: MapCard<C>;
93
93
  output: MapOR<C>;
@@ -361,3 +361,27 @@ export type MapFn<
361
361
  : <S extends MapFnInput<I, MapIR<C>, MapCard<C>>>(
362
362
  source: S
363
363
  ) => MapFnOutput<I, O, S, MapOR<C>, MapCard<C>>;
364
+
365
+ /**
366
+ * **Mapper**
367
+ *
368
+ * A fully configured _mapper_ stemming from the **mapTo()** utility. It is both a mapping
369
+ * function and a dictionary which describes the mapper's properties.
370
+ * ```ts
371
+ * const m = mapTo.oneToOne().map( ... );
372
+ * const mapped = m(inputs);
373
+ * const mappedOver = inputs.map(m);
374
+ * ```
375
+ */
376
+ export type Mapper<
377
+ I,
378
+ O,
379
+ C extends FinalizedMapConfig<OptRequired, MapCardinalityIllustrated, OptRequired>
380
+ > = {
381
+ input: MapIR<C>;
382
+ output: MapOR<C>;
383
+ cardinality: MapCard<C>;
384
+ debug: boolean | string;
385
+ inputType: I;
386
+ outputType: O;
387
+ } & MapFn<I, O, C>;
@@ -1,16 +1,13 @@
1
1
  import {
2
2
  FinalizedMapConfig,
3
3
  MapCardinalityIllustrated,
4
- MapFnInput,
5
4
  MapperApi,
6
5
  MapTo,
7
6
  AsFinalizedConfig,
8
7
  MapConfig,
9
8
  ConfiguredMap,
10
- MapFnOutput,
11
- MapIR,
12
- MapCard,
13
- MapOR,
9
+ Mapper,
10
+ MapFn,
14
11
  } from "src/types/dictionary";
15
12
  import { OptRequired } from "src/types/literal-unions";
16
13
  import { createFnWithProps } from "../createFnWithProps";
@@ -69,11 +66,18 @@ const debugMsg = <C extends FinalizedMapConfig<any, any, any>>(
69
66
  * The single implementation for all mapping
70
67
  */
71
68
  const mapper =
72
- <C extends FinalizedMapConfig<OptRequired, MapCardinalityIllustrated, OptRequired>>(config: C) =>
73
- <I, O>(map: MapTo<I, O, C>) => {
74
- return <S extends MapFnInput<I, MapIR<C>, MapCard<C>>>(
75
- source?: S
76
- ): MapFnOutput<I, O, S, MapOR<C>, MapCard<C>> => {
69
+ <
70
+ //
71
+ C extends FinalizedMapConfig<
72
+ OptRequired, //
73
+ MapCardinalityIllustrated,
74
+ OptRequired
75
+ >
76
+ >(
77
+ config: C
78
+ ) =>
79
+ <I, O>(map: MapTo<I, O, C>): Mapper<I, O, C> => {
80
+ const fn: MapFn<I, O, C> = <S>(source: S) => {
77
81
  /**
78
82
  * Determine whether input is an array; this will be true
79
83
  */
@@ -93,18 +97,28 @@ const mapper =
93
97
  // item and this approach achieves this.
94
98
  // TODO: we should check that the approach below doesn't work for M:1 here
95
99
  // as well
96
- const output = (source as any).flatMap(map) as MapFnOutput<I, O, S, MapOR<C>, MapCard<C>>;
100
+ const output = (source as any).flatMap(map);
97
101
  debugMsg(config, source, output);
98
102
 
99
103
  return output;
100
104
  } else {
101
105
  // receive _all_ inputs provided as pass into ; this is just a single input unless the
102
106
  // cardinality is
103
- const output = map(source as any) as MapFnOutput<I, O, S, MapOR<C>, MapCard<C>>;
107
+ const output = map(source as any);
104
108
  debugMsg(config, source, output);
109
+
105
110
  return output;
106
111
  }
107
112
  };
113
+
114
+ return createFnWithProps(fn, {
115
+ input: config.input,
116
+ output: config.output,
117
+ cardinality: config.cardinality,
118
+ debug: config.debug,
119
+ inputType: {} as I,
120
+ outputType: {} as O,
121
+ });
108
122
  };
109
123
 
110
124
  /**
@@ -6,6 +6,7 @@ import {
6
6
  AsFinalizedConfig,
7
7
  MapConfig,
8
8
  ConfiguredMap,
9
+ Mapper,
9
10
  } from "src/types/dictionary";
10
11
  import { describe, expect, it } from "vitest";
11
12
  import type { Expect, Equal } from "@type-challenges/utils";
@@ -169,37 +170,21 @@ describe("MapTo<I,O> and MapToFn<I,O>", () => {
169
170
  // map() function's parameters (unknown is I)
170
171
  Expect<Equal<[map: (source: unknown) => unknown], M1P>>,
171
172
  // map() function's return value
172
- Expect<
173
- Equal<<S extends unknown>(source: S) => S extends unknown[] ? unknown[] : unknown, M1R>
174
- >,
173
+ Expect<Equal<Mapper<unknown, unknown, FinalizedMapConfig<"req", "I -> O", "opt">>, M1R>>,
175
174
 
176
175
  // merged configuration is same as default for M:1
177
176
  Expect<Equal<C2, FinalizedMapConfig<"req", "I[] -> O", "req">>>,
178
177
  // map() function's parameters (unknown is I)
179
178
  Expect<Equal<[map: (source: unknown[]) => unknown], M2P>>,
180
179
  // map() function's return value
181
- Expect<
182
- Equal<
183
- <S extends unknown[] | unknown[][]>(
184
- source: S
185
- ) => S extends unknown[][] ? [unknown, ...unknown[]] : unknown,
186
- M2R
187
- >
188
- >,
180
+ Expect<Equal<Mapper<unknown, unknown, FinalizedMapConfig<"req", "I[] -> O", "req">>, M2R>>,
189
181
 
190
182
  // merged configuration should be M:1 default with an "opt" for output
191
183
  Expect<Equal<C3, FinalizedMapConfig<"req", "I[] -> O", "opt">>>,
192
184
  // map() function's parameters (unknown is I)
193
185
  Expect<Equal<[map: (source: unknown[]) => unknown | null], M3P>>,
194
186
  // map() function's return value
195
- Expect<
196
- Equal<
197
- <S extends unknown[] | unknown[][]>(
198
- source: S
199
- ) => S extends unknown[][] ? unknown[] : unknown,
200
- M3R
201
- >
202
- >
187
+ Expect<Equal<Mapper<unknown, unknown, FinalizedMapConfig<"req", "I[] -> O", "opt">>, M3R>>
203
188
  ];
204
189
 
205
190
  const cases: cases = [true, true, true, true, true, true, true, true, true];
@@ -269,6 +254,22 @@ describe("mapTo() utility function", () => {
269
254
  expect(c1.cardinality).toBe(MapCardinality.OneToMany);
270
255
  });
271
256
 
257
+ it("Mapper<I,O,C>", () => {
258
+ const m0 = mapTo.oneToOne();
259
+ const m1 = m0.map<I, I>((i) => i);
260
+
261
+ expect(m1.input).toBe("req");
262
+ expect(m1.output).toBe("req");
263
+ expect(m1.cardinality).toBe("I -> O");
264
+ expect(m1(i)).toEqual(i);
265
+
266
+ type cases = [
267
+ Expect<Equal<typeof m1["inputType"], I>>, //
268
+ Expect<Equal<typeof m1["outputType"], I>> //
269
+ ];
270
+ const cases: cases = [true, true];
271
+ });
272
+
272
273
  it("M:1 conversion", () => {
273
274
  const m = mapTo
274
275
  .config({
@@ -314,9 +315,13 @@ describe("mapTo() utility function", () => {
314
315
  .config({ output: "req", cardinality: "I -> O[]" })
315
316
  .map<I, O>((i) => [{ title: i.title, count: i.products.length }]);
316
317
  const o = m([i, i2]);
318
+ type RT = ReturnType<typeof m>;
317
319
 
318
320
  expect(o.length).toBe(2);
319
321
  o.map((item) => expect("title" in item).toBeTruthy());
322
+
323
+ type cases = [Expect<Equal<RT, O[] | [O, ...O[]]>>];
324
+ const cases: cases = [true];
320
325
  });
321
326
 
322
327
  it("1:M conversion with filtering", () => {