type-plus 7.2.0 → 7.2.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.
Files changed (38) hide show
  1. package/cjs/object/ANotB.d.ts +0 -6
  2. package/cjs/object/ANotB.d.ts.map +1 -1
  3. package/cjs/object/index.d.ts +3 -2
  4. package/cjs/object/index.d.ts.map +1 -1
  5. package/cjs/object/index.js +1 -0
  6. package/cjs/object/index.js.map +1 -1
  7. package/cjs/object/left_join.d.ts +43 -0
  8. package/cjs/object/left_join.d.ts.map +1 -0
  9. package/cjs/object/left_join.js +18 -0
  10. package/cjs/object/left_join.js.map +1 -0
  11. package/cjs/predicates/index.d.ts +1 -1
  12. package/cjs/predicates/index.d.ts.map +1 -1
  13. package/cjs/predicates/literal.d.ts +22 -0
  14. package/cjs/predicates/literal.d.ts.map +1 -0
  15. package/cjs/predicates/literal.js +3 -0
  16. package/cjs/predicates/literal.js.map +1 -0
  17. package/esm/object/ANotB.d.ts +0 -6
  18. package/esm/object/ANotB.d.ts.map +1 -1
  19. package/esm/object/index.d.ts +3 -2
  20. package/esm/object/index.d.ts.map +1 -1
  21. package/esm/object/index.js +1 -0
  22. package/esm/object/index.js.map +1 -1
  23. package/esm/object/left_join.d.ts +43 -0
  24. package/esm/object/left_join.d.ts.map +1 -0
  25. package/esm/object/left_join.js +14 -0
  26. package/esm/object/left_join.js.map +1 -0
  27. package/esm/predicates/index.d.ts +1 -1
  28. package/esm/predicates/index.d.ts.map +1 -1
  29. package/esm/predicates/literal.d.ts +22 -0
  30. package/esm/predicates/literal.d.ts.map +1 -0
  31. package/esm/predicates/literal.js +2 -0
  32. package/esm/predicates/literal.js.map +1 -0
  33. package/package.json +1 -1
  34. package/ts/object/ANotB.ts +0 -7
  35. package/ts/object/index.ts +4 -2
  36. package/ts/object/left_join.ts +42 -0
  37. package/ts/predicates/index.ts +1 -5
  38. package/ts/predicates/literal.ts +35 -0
@@ -2,14 +2,8 @@ import type { IsEqual } from '../equal/equal.js';
2
2
  import type { AnyRecord } from './AnyRecord.js';
3
3
  import type { IsDisjoint } from './IsDisjoint.js';
4
4
  import type { KeysWithDiffType } from './KeysWithDiffType.js';
5
- import type { Properties } from './properties.js';
6
5
  export type ANotB<A extends AnyRecord, B extends AnyRecord> = IsEqual<A, B> extends true ? never : IsDisjoint<A, B> extends true ? A : {
7
6
  [k in Exclude<keyof A, keyof B> | KeysWithDiffType<A, B>]: A[k];
8
7
  };
9
8
  export type BNotA<A extends AnyRecord, B extends AnyRecord> = ANotB<B, A>;
10
- export type LeftJoin<A extends AnyRecord, B extends AnyRecord> = IsEqual<A, B> extends true ? A : IsDisjoint<A, B> extends true ? A & B : Properties<{
11
- [k in Exclude<keyof A, keyof B>]: A[k];
12
- } & {
13
- [k in keyof B]: B[k];
14
- }>;
15
9
  //# sourceMappingURL=ANotB.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ANotB.d.ts","sourceRoot":"","sources":["../../ts/object/ANotB.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GACrF,KAAK,GACL,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GAC7B,CAAC,GACD;KAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AAEtE,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEzE,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GACxF,CAAC,GACD,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GAC7B,CAAC,GAAG,CAAC,GACL,UAAU,CAAC;KAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"ANotB.d.ts","sourceRoot":"","sources":["../../ts/object/ANotB.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GACrF,KAAK,GACL,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GAC7B,CAAC,GACD;KAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AAEtE,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA"}
@@ -1,4 +1,4 @@
1
- export type { ANotB, BNotA, LeftJoin } from './ANotB.js';
1
+ export type { ANotB, BNotA } from './ANotB.js';
2
2
  export type { AnyRecord } from './AnyRecord.js';
3
3
  export type { ExcludePropType } from './ExcludePropType.js';
4
4
  export type { IsDisjoint } from './IsDisjoint.js';
@@ -10,7 +10,6 @@ export type { KnownKeys } from './KnownKeys.js';
10
10
  export type { OptionalKeys } from './OptionalKeys.js';
11
11
  export type { Partial, PartialExcept, PartialOmit, PartialPick } from './Partial.js';
12
12
  export type { RecursiveIntersect } from './RecursiveIntersect.js';
13
- export type { RecursivePartial } from './recursive_partial.js';
14
13
  export type { RecursiveRequired } from './RecursiveRequired.js';
15
14
  export type { RequiredExcept, RequiredPick } from './Required.js';
16
15
  export type { RequiredKeys } from './RequiredKeys.js';
@@ -24,12 +23,14 @@ export * from './forEachKey.js';
24
23
  export * from './getField.js';
25
24
  export * from './hasKey.js';
26
25
  export * from './hasProperty.js';
26
+ export * from './left_join.js';
27
27
  export * from './mapKey.js';
28
28
  export * from './mapProperties.js';
29
29
  export * from './omit.js';
30
30
  export * from './pick.js';
31
31
  export type { Properties } from './properties.js';
32
32
  export * from './record.js';
33
+ export type { RecursivePartial } from './recursive_partial.js';
33
34
  export * from './reduceKey.js';
34
35
  export * from './replaceProperty.js';
35
36
  export * from './someKey.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACxD,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACpF,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,+BAA+B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAC9C,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACpF,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,cAAc,aAAa,CAAA;AAC3B,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,+BAA+B,CAAA"}
@@ -22,6 +22,7 @@ __exportStar(require("./forEachKey.js"), exports);
22
22
  __exportStar(require("./getField.js"), exports);
23
23
  __exportStar(require("./hasKey.js"), exports);
24
24
  __exportStar(require("./hasProperty.js"), exports);
25
+ __exportStar(require("./left_join.js"), exports);
25
26
  __exportStar(require("./mapKey.js"), exports);
26
27
  __exportStar(require("./mapProperties.js"), exports);
27
28
  __exportStar(require("./omit.js"), exports);
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAkBA,gDAA6B;AAC7B,8CAA2B;AAC3B,iDAA8B;AAC9B,+CAA4B;AAC5B,kDAA+B;AAC/B,gDAA6B;AAC7B,8CAA2B;AAC3B,mDAAgC;AAChC,8CAA2B;AAC3B,qDAAkC;AAClC,4CAAyB;AACzB,4CAAyB;AAEzB,8CAA2B;AAC3B,iDAA8B;AAC9B,uDAAoC;AACpC,+CAA4B;AAC5B,6CAA0B;AAC1B,gEAA6C"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;AAiBA,gDAA6B;AAC7B,8CAA2B;AAC3B,iDAA8B;AAC9B,+CAA4B;AAC5B,kDAA+B;AAC/B,gDAA6B;AAC7B,8CAA2B;AAC3B,mDAAgC;AAChC,iDAA8B;AAC9B,8CAA2B;AAC3B,qDAAkC;AAClC,4CAAyB;AACzB,4CAAyB;AAEzB,8CAA2B;AAE3B,iDAA8B;AAC9B,uDAAoC;AACpC,+CAA4B;AAC5B,6CAA0B;AAC1B,gEAA6C"}
@@ -0,0 +1,43 @@
1
+ import type { IsLiteral } from '../predicates/index.js';
2
+ import type { AnyRecord } from './AnyRecord.js';
3
+ import type { IsDisjoint } from './IsDisjoint.js';
4
+ import type { KeyTypes } from './KeyTypes.js';
5
+ /**
6
+ * Left join type `A` with type `B`.
7
+ *
8
+ * It handles cases like A or B are `Record`,
9
+ * joining between required and optional props, etc.
10
+ */
11
+ export type LeftJoin<A extends AnyRecord, B extends AnyRecord> = IsDisjoint<A, B> extends true ? A & B : [keyof A, keyof B] extends [infer KA extends KeyTypes, infer KB extends KeyTypes] ? IsLiteral<KA> extends true ? IsLiteral<KB> extends true ? {
12
+ [k in Exclude<KA, KB>]: A[k];
13
+ } & {
14
+ [k in KB]: undefined extends B[k] ? Exclude<A[k] | B[k], undefined> : B[k];
15
+ } : {
16
+ [k in Exclude<KA, KA & KB>]: A[k];
17
+ } & {
18
+ [k in Exclude<KB, KA & KB>]: B[k];
19
+ } & {
20
+ [k in KA & KB]: A[k] | B[k];
21
+ } : IsLiteral<KB> extends true ? {
22
+ [k in Exclude<KA, KB>]: A[k];
23
+ } & {
24
+ [k in keyof B]: B[k];
25
+ } : {
26
+ [k in Exclude<KA, KA & KB>]: A[k];
27
+ } & {
28
+ [k in Exclude<KB, KA & KB>]: B[k];
29
+ } & {
30
+ [k in KA & KB]: A[k] | B[k];
31
+ } : never;
32
+ /**
33
+ * Left join `a` with `b`.
34
+ *
35
+ * This returns the proper type of `{ ...a, ...b }`
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * leftJoin({ a: 1 }, {} as { a?: string | undefined }) // { a: number | string }
40
+ * ```
41
+ */
42
+ export declare function leftJoin<A extends AnyRecord, B extends AnyRecord>(a: A, b: B): LeftJoin<A, B>;
43
+ //# sourceMappingURL=left_join.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"left_join.d.ts","sourceRoot":"","sources":["../../ts/object/left_join.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GAC3F,CAAC,GAAG,CAAC,GACL,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,MAAM,EAAE,SAAS,QAAQ,CAAC,GACjF,SAAS,CAAC,EAAE,CAAC,SAAS,IAAI,GACzB,SAAS,CAAC,EAAE,CAAC,SAAS,IAAI,GACzB;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAClC,CAAC,IAAI,EAAE,GAAG,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACzE,GACD;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAC/E,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC1B,GACF,SAAS,CAAC,EAAE,CAAC,SAAS,IAAI,GAC1B;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAC3D;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAC/E,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC1B,GACF,KAAK,CAAA;AAER;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAE7F"}
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.leftJoin = void 0;
4
+ /**
5
+ * Left join `a` with `b`.
6
+ *
7
+ * This returns the proper type of `{ ...a, ...b }`
8
+ *
9
+ * @example
10
+ * ```ts
11
+ * leftJoin({ a: 1 }, {} as { a?: string | undefined }) // { a: number | string }
12
+ * ```
13
+ */
14
+ function leftJoin(a, b) {
15
+ return { ...a, ...b };
16
+ }
17
+ exports.leftJoin = leftJoin;
18
+ //# sourceMappingURL=left_join.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"left_join.js","sourceRoot":"","sources":["../../ts/object/left_join.ts"],"names":[],"mappings":";;;AA6BA;;;;;;;;;GASG;AACH,SAAgB,QAAQ,CAA2C,CAAI,EAAE,CAAI;IAC5E,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAS,CAAA;AAC7B,CAAC;AAFD,4BAEC"}
@@ -2,6 +2,6 @@ export * from './CanAssign.js';
2
2
  export type { Extendable, IsExtend, IsNotExtend, NotExtendable } from './Extends.js';
3
3
  export type { If } from './If.js';
4
4
  export type { IsEmptyObject } from './IsEmptyObject.js';
5
+ export type { IsLiteral } from './literal.js';
5
6
  export type { And, Not, Or, Xor } from './logical.js';
6
- export type IsLiteral<T extends number | string, Then = true, Else = false> = number extends T ? Else : string extends T ? Else : Then;
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/predicates/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACpF,YAAY,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AACjC,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,IAAI,MAAM,SAAS,CAAC,GAC3F,IAAI,GACJ,MAAM,SAAS,CAAC,GAChB,IAAI,GACJ,IAAI,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/predicates/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACpF,YAAY,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AACjC,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Validate if specified type is a scalar literal.
3
+ *
4
+ * 🎭 *validate*
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * type R = IsLiteral<string> // false
9
+ * type R = IsLiteral<number> // false
10
+ * type R = IsLiteral<boolean> // false
11
+ * type R = IsLiteral<bigint> // false
12
+ * type R = IsLiteral<symbol> // false
13
+ *
14
+ * type R = IsLiteral<'a'> // true
15
+ * type R = IsLiteral<1> // true
16
+ * type R = IsLiteral<true> // true
17
+ * type R = IsLiteral<1n> // true
18
+ * type R = IsLiteral<typeof someSymbol> // true
19
+ * ```
20
+ */
21
+ export type IsLiteral<T extends number | boolean | bigint | string | symbol, Then = true, Else = false> = number extends T ? Else : string extends T ? Else : boolean extends T ? Else : symbol extends T ? Else : bigint extends T ? Else : Then;
22
+ //# sourceMappingURL=literal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../ts/predicates/literal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,SAAS,CACpB,CAAC,SAAS,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EACrD,IAAI,GAAG,IAAI,EACX,IAAI,GAAG,KAAK,IACT,MAAM,SAAS,CAAC,GACjB,IAAI,GACJ,MAAM,SAAS,CAAC,GAChB,IAAI,GACJ,OAAO,SAAS,CAAC,GACjB,IAAI,GACJ,MAAM,SAAS,CAAC,GAChB,IAAI,GACJ,MAAM,SAAS,CAAC,GAChB,IAAI,GACJ,IAAI,CAAA"}
@@ -0,0 +1,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=literal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literal.js","sourceRoot":"","sources":["../../ts/predicates/literal.ts"],"names":[],"mappings":""}
@@ -2,14 +2,8 @@ import type { IsEqual } from '../equal/equal.js';
2
2
  import type { AnyRecord } from './AnyRecord.js';
3
3
  import type { IsDisjoint } from './IsDisjoint.js';
4
4
  import type { KeysWithDiffType } from './KeysWithDiffType.js';
5
- import type { Properties } from './properties.js';
6
5
  export type ANotB<A extends AnyRecord, B extends AnyRecord> = IsEqual<A, B> extends true ? never : IsDisjoint<A, B> extends true ? A : {
7
6
  [k in Exclude<keyof A, keyof B> | KeysWithDiffType<A, B>]: A[k];
8
7
  };
9
8
  export type BNotA<A extends AnyRecord, B extends AnyRecord> = ANotB<B, A>;
10
- export type LeftJoin<A extends AnyRecord, B extends AnyRecord> = IsEqual<A, B> extends true ? A : IsDisjoint<A, B> extends true ? A & B : Properties<{
11
- [k in Exclude<keyof A, keyof B>]: A[k];
12
- } & {
13
- [k in keyof B]: B[k];
14
- }>;
15
9
  //# sourceMappingURL=ANotB.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"ANotB.d.ts","sourceRoot":"","sources":["../../ts/object/ANotB.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AAEjD,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GACrF,KAAK,GACL,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GAC7B,CAAC,GACD;KAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AAEtE,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA;AAEzE,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GACxF,CAAC,GACD,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GAC7B,CAAC,GAAG,CAAC,GACL,UAAU,CAAC;KAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAC,CAAA"}
1
+ {"version":3,"file":"ANotB.d.ts","sourceRoot":"","sources":["../../ts/object/ANotB.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,OAAO,EAAE,MAAM,mBAAmB,CAAA;AAChD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAE7D,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,OAAO,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GACrF,KAAK,GACL,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GAC7B,CAAC,GACD;KAAG,CAAC,IAAI,OAAO,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,GAAG,gBAAgB,CAAC,CAAC,EAAE,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,CAAA;AAEtE,MAAM,MAAM,KAAK,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,KAAK,CAAC,CAAC,EAAE,CAAC,CAAC,CAAA"}
@@ -1,4 +1,4 @@
1
- export type { ANotB, BNotA, LeftJoin } from './ANotB.js';
1
+ export type { ANotB, BNotA } from './ANotB.js';
2
2
  export type { AnyRecord } from './AnyRecord.js';
3
3
  export type { ExcludePropType } from './ExcludePropType.js';
4
4
  export type { IsDisjoint } from './IsDisjoint.js';
@@ -10,7 +10,6 @@ export type { KnownKeys } from './KnownKeys.js';
10
10
  export type { OptionalKeys } from './OptionalKeys.js';
11
11
  export type { Partial, PartialExcept, PartialOmit, PartialPick } from './Partial.js';
12
12
  export type { RecursiveIntersect } from './RecursiveIntersect.js';
13
- export type { RecursivePartial } from './recursive_partial.js';
14
13
  export type { RecursiveRequired } from './RecursiveRequired.js';
15
14
  export type { RequiredExcept, RequiredPick } from './Required.js';
16
15
  export type { RequiredKeys } from './RequiredKeys.js';
@@ -24,12 +23,14 @@ export * from './forEachKey.js';
24
23
  export * from './getField.js';
25
24
  export * from './hasKey.js';
26
25
  export * from './hasProperty.js';
26
+ export * from './left_join.js';
27
27
  export * from './mapKey.js';
28
28
  export * from './mapProperties.js';
29
29
  export * from './omit.js';
30
30
  export * from './pick.js';
31
31
  export type { Properties } from './properties.js';
32
32
  export * from './record.js';
33
+ export type { RecursivePartial } from './recursive_partial.js';
33
34
  export * from './reduceKey.js';
34
35
  export * from './replaceProperty.js';
35
36
  export * from './someKey.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAA;AACxD,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACpF,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,+BAA+B,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":"AAAA,YAAY,EAAE,KAAK,EAAE,KAAK,EAAE,MAAM,YAAY,CAAA;AAC9C,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,eAAe,EAAE,MAAM,sBAAsB,CAAA;AAC3D,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,YAAY,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAC7C,YAAY,EAAE,cAAc,EAAE,MAAM,oBAAoB,CAAA;AACxD,YAAY,EAAE,gBAAgB,EAAE,MAAM,uBAAuB,CAAA;AAC7D,YAAY,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,OAAO,EAAE,aAAa,EAAE,WAAW,EAAE,WAAW,EAAE,MAAM,cAAc,CAAA;AACpF,YAAY,EAAE,kBAAkB,EAAE,MAAM,yBAAyB,CAAA;AACjE,YAAY,EAAE,iBAAiB,EAAE,MAAM,wBAAwB,CAAA;AAC/D,YAAY,EAAE,cAAc,EAAE,YAAY,EAAE,MAAM,eAAe,CAAA;AACjE,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,YAAY,EAAE,MAAM,mBAAmB,CAAA;AACrD,YAAY,EAAE,OAAO,EAAE,MAAM,cAAc,CAAA;AAC3C,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AACzB,YAAY,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,cAAc,aAAa,CAAA;AAC3B,YAAY,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAA;AAC9D,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,+BAA+B,CAAA"}
@@ -6,6 +6,7 @@ export * from './forEachKey.js';
6
6
  export * from './getField.js';
7
7
  export * from './hasKey.js';
8
8
  export * from './hasProperty.js';
9
+ export * from './left_join.js';
9
10
  export * from './mapKey.js';
10
11
  export * from './mapProperties.js';
11
12
  export * from './omit.js';
@@ -1 +1 @@
1
- {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":"AAkBA,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AAEzB,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,+BAA+B,CAAA"}
1
+ {"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":"AAiBA,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,cAAc,CAAA;AAC5B,cAAc,iBAAiB,CAAA;AAC/B,cAAc,eAAe,CAAA;AAC7B,cAAc,aAAa,CAAA;AAC3B,cAAc,kBAAkB,CAAA;AAChC,cAAc,gBAAgB,CAAA;AAC9B,cAAc,aAAa,CAAA;AAC3B,cAAc,oBAAoB,CAAA;AAClC,cAAc,WAAW,CAAA;AACzB,cAAc,WAAW,CAAA;AAEzB,cAAc,aAAa,CAAA;AAE3B,cAAc,gBAAgB,CAAA;AAC9B,cAAc,sBAAsB,CAAA;AACpC,cAAc,cAAc,CAAA;AAC5B,cAAc,YAAY,CAAA;AAC1B,cAAc,+BAA+B,CAAA"}
@@ -0,0 +1,43 @@
1
+ import type { IsLiteral } from '../predicates/index.js';
2
+ import type { AnyRecord } from './AnyRecord.js';
3
+ import type { IsDisjoint } from './IsDisjoint.js';
4
+ import type { KeyTypes } from './KeyTypes.js';
5
+ /**
6
+ * Left join type `A` with type `B`.
7
+ *
8
+ * It handles cases like A or B are `Record`,
9
+ * joining between required and optional props, etc.
10
+ */
11
+ export type LeftJoin<A extends AnyRecord, B extends AnyRecord> = IsDisjoint<A, B> extends true ? A & B : [keyof A, keyof B] extends [infer KA extends KeyTypes, infer KB extends KeyTypes] ? IsLiteral<KA> extends true ? IsLiteral<KB> extends true ? {
12
+ [k in Exclude<KA, KB>]: A[k];
13
+ } & {
14
+ [k in KB]: undefined extends B[k] ? Exclude<A[k] | B[k], undefined> : B[k];
15
+ } : {
16
+ [k in Exclude<KA, KA & KB>]: A[k];
17
+ } & {
18
+ [k in Exclude<KB, KA & KB>]: B[k];
19
+ } & {
20
+ [k in KA & KB]: A[k] | B[k];
21
+ } : IsLiteral<KB> extends true ? {
22
+ [k in Exclude<KA, KB>]: A[k];
23
+ } & {
24
+ [k in keyof B]: B[k];
25
+ } : {
26
+ [k in Exclude<KA, KA & KB>]: A[k];
27
+ } & {
28
+ [k in Exclude<KB, KA & KB>]: B[k];
29
+ } & {
30
+ [k in KA & KB]: A[k] | B[k];
31
+ } : never;
32
+ /**
33
+ * Left join `a` with `b`.
34
+ *
35
+ * This returns the proper type of `{ ...a, ...b }`
36
+ *
37
+ * @example
38
+ * ```ts
39
+ * leftJoin({ a: 1 }, {} as { a?: string | undefined }) // { a: number | string }
40
+ * ```
41
+ */
42
+ export declare function leftJoin<A extends AnyRecord, B extends AnyRecord>(a: A, b: B): LeftJoin<A, B>;
43
+ //# sourceMappingURL=left_join.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"left_join.d.ts","sourceRoot":"","sources":["../../ts/object/left_join.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,wBAAwB,CAAA;AACvD,OAAO,KAAK,EAAE,SAAS,EAAE,MAAM,gBAAgB,CAAA;AAC/C,OAAO,KAAK,EAAE,UAAU,EAAE,MAAM,iBAAiB,CAAA;AACjD,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,eAAe,CAAA;AAE7C;;;;;GAKG;AACH,MAAM,MAAM,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,IAAI,UAAU,CAAC,CAAC,EAAE,CAAC,CAAC,SAAS,IAAI,GAC3F,CAAC,GAAG,CAAC,GACL,CAAC,MAAM,CAAC,EAAE,MAAM,CAAC,CAAC,SAAS,CAAC,MAAM,EAAE,SAAS,QAAQ,EAAE,MAAM,EAAE,SAAS,QAAQ,CAAC,GACjF,SAAS,CAAC,EAAE,CAAC,SAAS,IAAI,GACzB,SAAS,CAAC,EAAE,CAAC,SAAS,IAAI,GACzB;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAClC,CAAC,IAAI,EAAE,GAAG,SAAS,SAAS,CAAC,CAAC,CAAC,CAAC,GAAG,OAAO,CAAC,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC,EAAE,SAAS,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CACzE,GACD;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAC/E,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC1B,GACF,SAAS,CAAC,EAAE,CAAC,SAAS,IAAI,GAC1B;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAAG,CAAC,IAAI,MAAM,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAC3D;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAAG,CAAC,IAAI,OAAO,CAAC,EAAE,EAAE,EAAE,GAAG,EAAE,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAAE,GAAG;KAC/E,CAAC,IAAI,EAAE,GAAG,EAAE,GAAG,CAAC,CAAC,CAAC,CAAC,GAAG,CAAC,CAAC,CAAC,CAAC;CAC1B,GACF,KAAK,CAAA;AAER;;;;;;;;;GASG;AACH,wBAAgB,QAAQ,CAAC,CAAC,SAAS,SAAS,EAAE,CAAC,SAAS,SAAS,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,EAAE,CAAC,GAAG,QAAQ,CAAC,CAAC,EAAE,CAAC,CAAC,CAE7F"}
@@ -0,0 +1,14 @@
1
+ /**
2
+ * Left join `a` with `b`.
3
+ *
4
+ * This returns the proper type of `{ ...a, ...b }`
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * leftJoin({ a: 1 }, {} as { a?: string | undefined }) // { a: number | string }
9
+ * ```
10
+ */
11
+ export function leftJoin(a, b) {
12
+ return { ...a, ...b };
13
+ }
14
+ //# sourceMappingURL=left_join.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"left_join.js","sourceRoot":"","sources":["../../ts/object/left_join.ts"],"names":[],"mappings":"AA6BA;;;;;;;;;GASG;AACH,MAAM,UAAU,QAAQ,CAA2C,CAAI,EAAE,CAAI;IAC5E,OAAO,EAAE,GAAG,CAAC,EAAE,GAAG,CAAC,EAAS,CAAA;AAC7B,CAAC"}
@@ -2,6 +2,6 @@ export * from './CanAssign.js';
2
2
  export type { Extendable, IsExtend, IsNotExtend, NotExtendable } from './Extends.js';
3
3
  export type { If } from './If.js';
4
4
  export type { IsEmptyObject } from './IsEmptyObject.js';
5
+ export type { IsLiteral } from './literal.js';
5
6
  export type { And, Not, Or, Xor } from './logical.js';
6
- export type IsLiteral<T extends number | string, Then = true, Else = false> = number extends T ? Else : string extends T ? Else : Then;
7
7
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/predicates/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACpF,YAAY,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AACjC,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA;AAErD,MAAM,MAAM,SAAS,CAAC,CAAC,SAAS,MAAM,GAAG,MAAM,EAAE,IAAI,GAAG,IAAI,EAAE,IAAI,GAAG,KAAK,IAAI,MAAM,SAAS,CAAC,GAC3F,IAAI,GACJ,MAAM,SAAS,CAAC,GAChB,IAAI,GACJ,IAAI,CAAA"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../ts/predicates/index.ts"],"names":[],"mappings":"AAAA,cAAc,gBAAgB,CAAA;AAC9B,YAAY,EAAE,UAAU,EAAE,QAAQ,EAAE,WAAW,EAAE,aAAa,EAAE,MAAM,cAAc,CAAA;AACpF,YAAY,EAAE,EAAE,EAAE,MAAM,SAAS,CAAA;AACjC,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAA;AACvD,YAAY,EAAE,SAAS,EAAE,MAAM,cAAc,CAAA;AAC7C,YAAY,EAAE,GAAG,EAAE,GAAG,EAAE,EAAE,EAAE,GAAG,EAAE,MAAM,cAAc,CAAA"}
@@ -0,0 +1,22 @@
1
+ /**
2
+ * Validate if specified type is a scalar literal.
3
+ *
4
+ * 🎭 *validate*
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * type R = IsLiteral<string> // false
9
+ * type R = IsLiteral<number> // false
10
+ * type R = IsLiteral<boolean> // false
11
+ * type R = IsLiteral<bigint> // false
12
+ * type R = IsLiteral<symbol> // false
13
+ *
14
+ * type R = IsLiteral<'a'> // true
15
+ * type R = IsLiteral<1> // true
16
+ * type R = IsLiteral<true> // true
17
+ * type R = IsLiteral<1n> // true
18
+ * type R = IsLiteral<typeof someSymbol> // true
19
+ * ```
20
+ */
21
+ export type IsLiteral<T extends number | boolean | bigint | string | symbol, Then = true, Else = false> = number extends T ? Else : string extends T ? Else : boolean extends T ? Else : symbol extends T ? Else : bigint extends T ? Else : Then;
22
+ //# sourceMappingURL=literal.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literal.d.ts","sourceRoot":"","sources":["../../ts/predicates/literal.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;;;;;;GAmBG;AACH,MAAM,MAAM,SAAS,CACpB,CAAC,SAAS,MAAM,GAAG,OAAO,GAAG,MAAM,GAAG,MAAM,GAAG,MAAM,EACrD,IAAI,GAAG,IAAI,EACX,IAAI,GAAG,KAAK,IACT,MAAM,SAAS,CAAC,GACjB,IAAI,GACJ,MAAM,SAAS,CAAC,GAChB,IAAI,GACJ,OAAO,SAAS,CAAC,GACjB,IAAI,GACJ,MAAM,SAAS,CAAC,GAChB,IAAI,GACJ,MAAM,SAAS,CAAC,GAChB,IAAI,GACJ,IAAI,CAAA"}
@@ -0,0 +1,2 @@
1
+ export {};
2
+ //# sourceMappingURL=literal.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"literal.js","sourceRoot":"","sources":["../../ts/predicates/literal.ts"],"names":[],"mappings":""}
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "type-plus",
3
- "version": "7.2.0",
3
+ "version": "7.2.1",
4
4
  "description": "Provides additional types for TypeScript.",
5
5
  "homepage": "https://github.com/unional/type-plus/tree/main/type-plus",
6
6
  "bugs": {
@@ -2,7 +2,6 @@ import type { IsEqual } from '../equal/equal.js'
2
2
  import type { AnyRecord } from './AnyRecord.js'
3
3
  import type { IsDisjoint } from './IsDisjoint.js'
4
4
  import type { KeysWithDiffType } from './KeysWithDiffType.js'
5
- import type { Properties } from './properties.js'
6
5
 
7
6
  export type ANotB<A extends AnyRecord, B extends AnyRecord> = IsEqual<A, B> extends true
8
7
  ? never
@@ -11,9 +10,3 @@ export type ANotB<A extends AnyRecord, B extends AnyRecord> = IsEqual<A, B> exte
11
10
  : { [k in Exclude<keyof A, keyof B> | KeysWithDiffType<A, B>]: A[k] }
12
11
 
13
12
  export type BNotA<A extends AnyRecord, B extends AnyRecord> = ANotB<B, A>
14
-
15
- export type LeftJoin<A extends AnyRecord, B extends AnyRecord> = IsEqual<A, B> extends true
16
- ? A
17
- : IsDisjoint<A, B> extends true
18
- ? A & B
19
- : Properties<{ [k in Exclude<keyof A, keyof B>]: A[k] } & { [k in keyof B]: B[k] }>
@@ -1,4 +1,4 @@
1
- export type { ANotB, BNotA, LeftJoin } from './ANotB.js'
1
+ export type { ANotB, BNotA } from './ANotB.js'
2
2
  export type { AnyRecord } from './AnyRecord.js'
3
3
  export type { ExcludePropType } from './ExcludePropType.js'
4
4
  export type { IsDisjoint } from './IsDisjoint.js'
@@ -10,7 +10,6 @@ export type { KnownKeys } from './KnownKeys.js'
10
10
  export type { OptionalKeys } from './OptionalKeys.js'
11
11
  export type { Partial, PartialExcept, PartialOmit, PartialPick } from './Partial.js'
12
12
  export type { RecursiveIntersect } from './RecursiveIntersect.js'
13
- export type { RecursivePartial } from './recursive_partial.js'
14
13
  export type { RecursiveRequired } from './RecursiveRequired.js'
15
14
  export type { RequiredExcept, RequiredPick } from './Required.js'
16
15
  export type { RequiredKeys } from './RequiredKeys.js'
@@ -24,14 +23,17 @@ export * from './forEachKey.js'
24
23
  export * from './getField.js'
25
24
  export * from './hasKey.js'
26
25
  export * from './hasProperty.js'
26
+ export * from './left_join.js'
27
27
  export * from './mapKey.js'
28
28
  export * from './mapProperties.js'
29
29
  export * from './omit.js'
30
30
  export * from './pick.js'
31
31
  export type { Properties } from './properties.js'
32
32
  export * from './record.js'
33
+ export type { RecursivePartial } from './recursive_partial.js'
33
34
  export * from './reduceKey.js'
34
35
  export * from './replaceProperty.js'
35
36
  export * from './someKey.js'
36
37
  export * from './split.js'
37
38
  export * from './typeOverrideIncompatible.js'
39
+
@@ -0,0 +1,42 @@
1
+ import type { IsLiteral } from '../predicates/index.js'
2
+ import type { AnyRecord } from './AnyRecord.js'
3
+ import type { IsDisjoint } from './IsDisjoint.js'
4
+ import type { KeyTypes } from './KeyTypes.js'
5
+
6
+ /**
7
+ * Left join type `A` with type `B`.
8
+ *
9
+ * It handles cases like A or B are `Record`,
10
+ * joining between required and optional props, etc.
11
+ */
12
+ export type LeftJoin<A extends AnyRecord, B extends AnyRecord> = IsDisjoint<A, B> extends true
13
+ ? A & B
14
+ : [keyof A, keyof B] extends [infer KA extends KeyTypes, infer KB extends KeyTypes]
15
+ ? IsLiteral<KA> extends true
16
+ ? IsLiteral<KB> extends true
17
+ ? { [k in Exclude<KA, KB>]: A[k] } & {
18
+ [k in KB]: undefined extends B[k] ? Exclude<A[k] | B[k], undefined> : B[k]
19
+ }
20
+ : { [k in Exclude<KA, KA & KB>]: A[k] } & { [k in Exclude<KB, KA & KB>]: B[k] } & {
21
+ [k in KA & KB]: A[k] | B[k]
22
+ }
23
+ : IsLiteral<KB> extends true
24
+ ? { [k in Exclude<KA, KB>]: A[k] } & { [k in keyof B]: B[k] }
25
+ : { [k in Exclude<KA, KA & KB>]: A[k] } & { [k in Exclude<KB, KA & KB>]: B[k] } & {
26
+ [k in KA & KB]: A[k] | B[k]
27
+ }
28
+ : never
29
+
30
+ /**
31
+ * Left join `a` with `b`.
32
+ *
33
+ * This returns the proper type of `{ ...a, ...b }`
34
+ *
35
+ * @example
36
+ * ```ts
37
+ * leftJoin({ a: 1 }, {} as { a?: string | undefined }) // { a: number | string }
38
+ * ```
39
+ */
40
+ export function leftJoin<A extends AnyRecord, B extends AnyRecord>(a: A, b: B): LeftJoin<A, B> {
41
+ return { ...a, ...b } as any
42
+ }
@@ -2,10 +2,6 @@ export * from './CanAssign.js'
2
2
  export type { Extendable, IsExtend, IsNotExtend, NotExtendable } from './Extends.js'
3
3
  export type { If } from './If.js'
4
4
  export type { IsEmptyObject } from './IsEmptyObject.js'
5
+ export type { IsLiteral } from './literal.js'
5
6
  export type { And, Not, Or, Xor } from './logical.js'
6
7
 
7
- export type IsLiteral<T extends number | string, Then = true, Else = false> = number extends T
8
- ? Else
9
- : string extends T
10
- ? Else
11
- : Then
@@ -0,0 +1,35 @@
1
+ /**
2
+ * Validate if specified type is a scalar literal.
3
+ *
4
+ * 🎭 *validate*
5
+ *
6
+ * @example
7
+ * ```ts
8
+ * type R = IsLiteral<string> // false
9
+ * type R = IsLiteral<number> // false
10
+ * type R = IsLiteral<boolean> // false
11
+ * type R = IsLiteral<bigint> // false
12
+ * type R = IsLiteral<symbol> // false
13
+ *
14
+ * type R = IsLiteral<'a'> // true
15
+ * type R = IsLiteral<1> // true
16
+ * type R = IsLiteral<true> // true
17
+ * type R = IsLiteral<1n> // true
18
+ * type R = IsLiteral<typeof someSymbol> // true
19
+ * ```
20
+ */
21
+ export type IsLiteral<
22
+ T extends number | boolean | bigint | string | symbol,
23
+ Then = true,
24
+ Else = false
25
+ > = number extends T
26
+ ? Else
27
+ : string extends T
28
+ ? Else
29
+ : boolean extends T
30
+ ? Else
31
+ : symbol extends T
32
+ ? Else
33
+ : bigint extends T
34
+ ? Else
35
+ : Then