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.
- package/cjs/object/ANotB.d.ts +0 -6
- package/cjs/object/ANotB.d.ts.map +1 -1
- package/cjs/object/index.d.ts +3 -2
- package/cjs/object/index.d.ts.map +1 -1
- package/cjs/object/index.js +1 -0
- package/cjs/object/index.js.map +1 -1
- package/cjs/object/left_join.d.ts +43 -0
- package/cjs/object/left_join.d.ts.map +1 -0
- package/cjs/object/left_join.js +18 -0
- package/cjs/object/left_join.js.map +1 -0
- package/cjs/predicates/index.d.ts +1 -1
- package/cjs/predicates/index.d.ts.map +1 -1
- package/cjs/predicates/literal.d.ts +22 -0
- package/cjs/predicates/literal.d.ts.map +1 -0
- package/cjs/predicates/literal.js +3 -0
- package/cjs/predicates/literal.js.map +1 -0
- package/esm/object/ANotB.d.ts +0 -6
- package/esm/object/ANotB.d.ts.map +1 -1
- package/esm/object/index.d.ts +3 -2
- package/esm/object/index.d.ts.map +1 -1
- package/esm/object/index.js +1 -0
- package/esm/object/index.js.map +1 -1
- package/esm/object/left_join.d.ts +43 -0
- package/esm/object/left_join.d.ts.map +1 -0
- package/esm/object/left_join.js +14 -0
- package/esm/object/left_join.js.map +1 -0
- package/esm/predicates/index.d.ts +1 -1
- package/esm/predicates/index.d.ts.map +1 -1
- package/esm/predicates/literal.d.ts +22 -0
- package/esm/predicates/literal.d.ts.map +1 -0
- package/esm/predicates/literal.js +2 -0
- package/esm/predicates/literal.js.map +1 -0
- package/package.json +1 -1
- package/ts/object/ANotB.ts +0 -7
- package/ts/object/index.ts +4 -2
- package/ts/object/left_join.ts +42 -0
- package/ts/predicates/index.ts +1 -5
- package/ts/predicates/literal.ts +35 -0
package/cjs/object/ANotB.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/cjs/object/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { ANotB, BNotA
|
|
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,
|
|
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"}
|
package/cjs/object/index.js
CHANGED
|
@@ -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);
|
package/cjs/object/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;
|
|
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,
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"literal.js","sourceRoot":"","sources":["../../ts/predicates/literal.ts"],"names":[],"mappings":""}
|
package/esm/object/ANotB.d.ts
CHANGED
|
@@ -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;
|
|
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"}
|
package/esm/object/index.d.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { ANotB, BNotA
|
|
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,
|
|
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"}
|
package/esm/object/index.js
CHANGED
package/esm/object/index.js.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../ts/object/index.ts"],"names":[],"mappings":"
|
|
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,
|
|
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 @@
|
|
|
1
|
+
{"version":3,"file":"literal.js","sourceRoot":"","sources":["../../ts/predicates/literal.ts"],"names":[],"mappings":""}
|
package/package.json
CHANGED
package/ts/object/ANotB.ts
CHANGED
|
@@ -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] }>
|
package/ts/object/index.ts
CHANGED
|
@@ -1,4 +1,4 @@
|
|
|
1
|
-
export type { ANotB, BNotA
|
|
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
|
+
}
|
package/ts/predicates/index.ts
CHANGED
|
@@ -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
|