Skip to content

Commit a98ed8b

Browse files
committed
https://github.com/tylim88/FirelordJS/releases/tag/2.4.7
1 parent b012090 commit a98ed8b

7 files changed

+157
-102
lines changed

package.json

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
{
22
"name": "firelord",
3-
"version": "2.4.1",
3+
"version": "2.4.7",
44
"description": "🔥 Write V9 like Firestore Admin code with extreme type safety.",
55
"main": "dist/index.js",
66
"types": "dist/index.d.ts",

src/types/error.ts

+1-1
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@ export type ErrorFieldValueInArray =
88
export type ErrorUnassignedAbleFieldValue =
99
'Error: Please do not directly assign Increment, Array Remove and Array Union Field Value'
1010
export type ErrorUnionInvolveObjectType =
11-
'Error: Please check your type declaration, do not union object literal type with other type except PossiblyReadAsUndefined'
11+
'Error: Please check your type declaration, do not union object literal type with other type except PossiblyReadAsUndefined and DeleteField'
1212
export type ErrorDeleteFieldMerge =
1313
`Error: To use deleteField, please set ( merge ) to ( true ) or set ( mergeFields with an array, empty array also fine ) in the options parameter.`
1414
export type ErrorDeleteFieldUnion<T extends string> =

src/types/markUnionObjectAsError.ts

+5-3
Original file line numberDiff line numberDiff line change
@@ -1,13 +1,15 @@
11
import { IsUnion } from './utils'
22
import { ErrorUnionInvolveObjectType } from './error'
3-
import { FieldValues, PossiblyReadAsUndefined } from './fieldValue'
3+
import { FieldValues, PossiblyReadAsUndefined, DeleteField } from './fieldValue'
44

55
type FilterInNonObject<T> = Extract<T, Record<string, unknown>>
66

77
type ReplaceUnionInvolveObjectTypeWithErrorMsg<T> = IsUnion<
8-
Exclude<T, PossiblyReadAsUndefined>
8+
Exclude<T, PossiblyReadAsUndefined | DeleteField>
99
> extends true
10-
? FilterInNonObject<Exclude<T, PossiblyReadAsUndefined>> extends never
10+
? FilterInNonObject<
11+
Exclude<T, PossiblyReadAsUndefined | DeleteField>
12+
> extends never
1113
? T
1214
: ErrorUnionInvolveObjectType
1315
: T extends FieldValues

src/types/metaTypeCreator.test.ts

+44-7
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
import { MetaTypeCreator, MetaType } from './metaTypeCreator'
2-
import { Timestamp, GeoPoint, Bytes } from './alias'
2+
import { Timestamp, Bytes, GeoPoint } from './alias'
33
import {
44
ErrorNullBanned,
55
ErrorUnionInvolveObjectType,
@@ -33,6 +33,7 @@ describe('test Firelord type', () => {
3333
}
3434
h: string
3535
i: number | null
36+
l: { a: 1 } | { b: 2 }
3637
},
3738
'A',
3839
string,
@@ -57,6 +58,7 @@ describe('test Firelord type', () => {
5758
| undefined
5859
h: string | undefined
5960
i: number | null | undefined
61+
l: ErrorUnionInvolveObjectType | undefined
6062
}
6163

6264
type ExpectedWrite = {
@@ -80,6 +82,7 @@ describe('test Firelord type', () => {
8082
}
8183
h: string
8284
i: number | null | Increment
85+
l: ErrorUnionInvolveObjectType
8386
}
8487

8588
type ExpectedWriteFlatten = {
@@ -104,6 +107,7 @@ describe('test Firelord type', () => {
104107
}
105108
h: string
106109
i: number | null | Increment
110+
l: ErrorUnionInvolveObjectType
107111
'b.c': 'a'
108112
'b.d': {
109113
e: false
@@ -140,6 +144,7 @@ describe('test Firelord type', () => {
140144
}
141145
h: string
142146
i: number | null
147+
l: ErrorUnionInvolveObjectType
143148
'b.c': 'a'
144149
'b.d': {
145150
e: false
@@ -484,7 +489,7 @@ describe('test Firelord type', () => {
484489
a: 1 | null | undefined
485490
b: {
486491
c: 'a' | undefined
487-
d: ErrorUnionInvolveObjectType
492+
d: { e: false } | undefined
488493
f:
489494
| {
490495
g: Timestamp | null
@@ -500,10 +505,32 @@ describe('test Firelord type', () => {
500505
}
501506

502507
type ExpectedWrite = {
508+
a: 1 | null
509+
b: {
510+
c: 'a'
511+
d: { e: false }
512+
f:
513+
| readonly {
514+
g: Date | Timestamp | null
515+
h: 2
516+
}[]
517+
| ArrayUnionOrRemove<{
518+
g: Date | Timestamp | null
519+
h: 2
520+
}>
521+
522+
j: ServerTimestamp | null | Date | Timestamp
523+
k: DocumentReference<MetaType> | null
524+
}
525+
h: string
526+
i: number | null | Increment
527+
}
528+
529+
type ExpectedWriteMerge = {
503530
a: 1 | null | DeleteField
504531
b: {
505532
c: 'a' | DeleteField
506-
d: ErrorUnionInvolveObjectType
533+
d: { e: false } | DeleteField
507534
f:
508535
| readonly {
509536
g: Date | Timestamp | null
@@ -525,7 +552,7 @@ describe('test Firelord type', () => {
525552
a: 1 | null | DeleteField
526553
b: {
527554
c: 'a' | DeleteField
528-
d: ErrorUnionInvolveObjectType
555+
d: { e: false } | DeleteField
529556
f:
530557
| readonly {
531558
g: Timestamp | Date | null
@@ -538,6 +565,7 @@ describe('test Firelord type', () => {
538565
| DeleteField
539566
j: ServerTimestamp | null | Date | Timestamp | DeleteField
540567
k: DocumentReference<MetaType> | null | DeleteField
568+
'd.e': false
541569
}
542570
h: string | DeleteField
543571
i: number | null | Increment | DeleteField
@@ -552,28 +580,34 @@ describe('test Firelord type', () => {
552580
}>
553581
| DeleteField
554582
'b.c': 'a' | DeleteField
555-
'b.d': ErrorUnionInvolveObjectType
583+
'b.d': { e: false } | DeleteField
556584
'b.j': ServerTimestamp | null | Date | Timestamp | DeleteField
557585
'b.k': DocumentReference<MetaType> | null | DeleteField
586+
'b.d.e': false
558587
}
559588

560589
type ExpectedCompare = {
561590
a: 1 | null
562591
b: {
563592
c: 'a'
564-
d: ErrorUnionInvolveObjectType
593+
d: {
594+
e: false
595+
}
565596
f:
566597
| readonly {
567598
g: Timestamp | Date | null
568599
h: 2
569600
}[]
570601
j: Timestamp | Date | null
571602
k: DocumentReference<MetaType> | null
603+
'd.e': false
572604
}
573605
h: string
574606
i: number | null
575607
'b.c': 'a'
576-
'b.d': ErrorUnionInvolveObjectType
608+
'b.d': {
609+
e: false
610+
}
577611
'b.f':
578612
| readonly {
579613
g: Timestamp | Date | null
@@ -582,15 +616,18 @@ describe('test Firelord type', () => {
582616

583617
'b.j': Timestamp | Date | null
584618
'b.k': DocumentReference<MetaType> | null
619+
'b.d.e': false
585620
}
586621

587622
type Read = A['read']
588623
type Write = A['write']
624+
type WriteMerge = A['writeMerge']
589625
type WriteFlatten = A['writeFlatten']
590626
type Compare = A['compare']
591627

592628
IsTrue<IsSame<ExpectedRead, Read>>()
593629
IsTrue<IsSame<ExpectedWrite, Write>>()
630+
IsTrue<IsSame<ExpectedWriteMerge, WriteMerge>>()
594631
IsTrue<IsEqual<ExpectedWriteFlatten, WriteFlatten>>()
595632
IsTrue<IsEqual<ExpectedCompare, Compare>>()
596633
})

src/types/metaTypeCreator.ts

+77-72
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ export type MetaType = {
3232
docPath: string
3333
read: Record<string, unknown>
3434
write: Record<string, unknown>
35+
writeMerge: Record<string, unknown>
3536
writeFlatten: Record<string, unknown>
3637
compare: Record<string, unknown>
3738
base: Record<string, unknown>
@@ -61,78 +62,57 @@ export type MetaTypeCreator<
6162
allFieldsPossiblyReadAsUndefined?: boolean
6263
banNull?: boolean
6364
} = { allFieldsPossiblyReadAsUndefined: false; banNull: false }
64-
> = {
65-
base: Base
66-
read: {
67-
[J in keyof RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<Base>]-?: ReadConverter<
68-
RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<Base>[J],
69-
Settings['allFieldsPossiblyReadAsUndefined'] extends true
70-
? undefined
71-
: never,
72-
Settings['banNull'] extends true ? null : never
73-
>
74-
}
75-
// so it looks more explicit in typescript hint
76-
write: {
77-
[J in keyof RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<
78-
RecursiveExcludePossiblyUndefinedFieldValue<Base>
79-
>]-?: WriteConverter<
80-
RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<
81-
RecursiveExcludePossiblyUndefinedFieldValue<Base>
82-
>[J],
83-
Settings['banNull'] extends true ? null : never
84-
>
85-
}
86-
writeFlatten: {
87-
[J in keyof ObjectFlatten<
88-
RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<
89-
RecursiveExcludePossiblyUndefinedFieldValue<Base>
90-
>
91-
>]-?: WriteConverter<
92-
ObjectFlatten<
93-
RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<
94-
RecursiveExcludePossiblyUndefinedFieldValue<Base>
95-
>
96-
>[J],
97-
Settings['banNull'] extends true ? null : never
98-
>
99-
}
100-
compare: {
101-
[J in keyof ObjectFlatten<
102-
RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<
103-
RecursiveExcludePossiblyUndefinedFieldValue<Base>
104-
>
105-
>]-?: CompareConverter<
106-
ObjectFlatten<
107-
RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<
108-
RecursiveExcludePossiblyUndefinedFieldValue<Base>
109-
>
110-
>[J],
111-
Settings['banNull'] extends true ? null : never
112-
>
113-
}
65+
> = RecursiveReplaceUnionInvolveObjectTypeWithErrorMsg<Base> extends infer Q
66+
? RecursiveExcludePossiblyUndefinedFieldValue<Q> extends infer P
67+
? ObjectFlatten<P> extends infer R
68+
? (Settings['banNull'] extends true ? null : never) extends infer S
69+
? {
70+
base: Base
71+
read: Exclude<
72+
ReadConverter<
73+
Q,
74+
Settings['allFieldsPossiblyReadAsUndefined'] extends true
75+
? undefined
76+
: never,
77+
S
78+
>,
79+
undefined
80+
>
11481

115-
collectionID: NoUndefinedAndBannedTypes<
116-
string extends CollectionID
117-
? ErrorCollectionIDString
118-
: IsValidID<CollectionID, 'Collection', 'ID'>,
119-
never
120-
>
121-
collectionPath: Parent extends MetaType
122-
? `${Parent['collectionPath']}/${Parent['docID']}/${CollectionID}`
123-
: CollectionID
124-
docID: IsValidID<DocID, 'Document', 'ID'>
125-
docPath: Parent extends MetaType
126-
? `${Parent['collectionPath']}/${Parent['docID']}/${CollectionID}/${DocID}`
127-
: `${CollectionID}/${DocID}`
128-
parent: Parent
129-
ancestors: Parent extends MetaType
130-
? [
131-
...Parent['ancestors'],
132-
MetaTypeCreator<Base, CollectionID, DocID, Parent, Settings>
133-
]
134-
: [MetaTypeCreator<Base, CollectionID, DocID, Parent, Settings>]
135-
}
82+
// so it looks more explicit in typescript hint
83+
write: WriteConverter<P, S>
84+
85+
writeMerge: WriteUpdateConverter<P, S>
86+
87+
writeFlatten: WriteUpdateConverter<R, S>
88+
89+
compare: CompareConverter<R, S>
90+
91+
collectionID: NoUndefinedAndBannedTypes<
92+
string extends CollectionID
93+
? ErrorCollectionIDString
94+
: IsValidID<CollectionID, 'Collection', 'ID'>,
95+
never
96+
>
97+
collectionPath: Parent extends MetaType
98+
? `${Parent['collectionPath']}/${Parent['docID']}/${CollectionID}`
99+
: CollectionID
100+
docID: IsValidID<DocID, 'Document', 'ID'>
101+
docPath: Parent extends MetaType
102+
? `${Parent['collectionPath']}/${Parent['docID']}/${CollectionID}/${DocID}`
103+
: `${CollectionID}/${DocID}`
104+
parent: Parent
105+
ancestors: Parent extends MetaType
106+
? [
107+
...Parent['ancestors'],
108+
MetaTypeCreator<Base, CollectionID, DocID, Parent, Settings>
109+
]
110+
: [MetaTypeCreator<Base, CollectionID, DocID, Parent, Settings>]
111+
}
112+
: never
113+
: never
114+
: never
115+
: never
136116

137117
type ReadConverterArray<
138118
T,
@@ -271,6 +251,31 @@ type ArrayWriteConverter<T, BannedTypes> = NoDirectNestedArray<
271251
>
272252

273253
type WriteConverter<T, BannedTypes> = NoDirectNestedArray<
254+
T,
255+
T extends (infer A)[]
256+
?
257+
| readonly ArrayWriteConverter<A, BannedTypes>[]
258+
| ArrayUnionOrRemove<ArrayWriteConverter<A, BannedTypes>>
259+
: T extends DocumentReference<any> | ServerTimestamp | GeoPoint
260+
? T
261+
: T extends number
262+
? number extends T
263+
? T | Increment
264+
: T
265+
: T extends UnassignedAbleFieldValue
266+
? ErrorUnassignedAbleFieldValue
267+
: T extends Timestamp | Date
268+
? Timestamp | Date
269+
: T extends PossiblyReadAsUndefined | DeleteField
270+
? never
271+
: T extends Record<string, unknown>
272+
? {
273+
[K in keyof T]-?: WriteConverter<T[K], BannedTypes>
274+
}
275+
: NoUndefinedAndBannedTypes<T, BannedTypes>
276+
>
277+
278+
type WriteUpdateConverter<T, BannedTypes> = NoDirectNestedArray<
274279
T,
275280
T extends (infer A)[]
276281
?
@@ -294,7 +299,7 @@ type WriteConverter<T, BannedTypes> = NoDirectNestedArray<
294299
? never
295300
: T extends Record<string, unknown>
296301
? {
297-
[K in keyof T]-?: WriteConverter<T[K], BannedTypes>
302+
[K in keyof T]-?: WriteUpdateConverter<T[K], BannedTypes>
298303
}
299304
: NoUndefinedAndBannedTypes<T, BannedTypes>
300305
>

0 commit comments

Comments
 (0)