@umituz/react-native-firebase 2.6.1 → 2.6.3

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 (94) hide show
  1. package/package.json +1 -1
  2. package/src/application/auth/ports/AuthPort_part_aa +150 -0
  3. package/src/application/auth/ports/AuthPort_part_ab +14 -0
  4. package/src/application/auth/use-cases/SignInUseCaseHelpers.ts +0 -0
  5. package/src/application/auth/use-cases/SignInUseCaseMain.ts +0 -0
  6. package/src/application/auth/use-cases/SignInUseCase_part_aa +150 -0
  7. package/src/application/auth/use-cases/SignInUseCase_part_ab +103 -0
  8. package/src/application/auth/use-cases/SignOutUseCaseCleanup.ts +0 -0
  9. package/src/application/auth/use-cases/SignOutUseCaseMain.ts +0 -0
  10. package/src/application/auth/use-cases/SignOutUseCase_part_aa +150 -0
  11. package/src/application/auth/use-cases/SignOutUseCase_part_ab +138 -0
  12. package/src/domains/account-deletion/domain/services/UserValidationHelpers.ts.bak +181 -0
  13. package/src/domains/account-deletion/domain/services/UserValidationHelpers_part_aa +150 -0
  14. package/src/domains/account-deletion/domain/services/UserValidationHelpers_part_ab +31 -0
  15. package/src/domains/account-deletion/domain/services/{UserValidationService.ts → UserValidationService.ts.bak} +1 -10
  16. package/src/domains/account-deletion/domain/services/UserValidationService_part_aa +150 -0
  17. package/src/domains/account-deletion/domain/services/UserValidationService_part_ab +136 -0
  18. package/src/domains/account-deletion/infrastructure/services/AccountDeletionExecutor_part_aa +150 -0
  19. package/src/domains/account-deletion/infrastructure/services/AccountDeletionExecutor_part_ab +80 -0
  20. package/src/domains/account-deletion/infrastructure/services/AccountDeletionReauthHandler_part_aa +150 -0
  21. package/src/domains/account-deletion/infrastructure/services/AccountDeletionReauthHandler_part_ab +24 -0
  22. package/src/domains/account-deletion/infrastructure/services/AccountDeletionRepository_part_aa +150 -0
  23. package/src/domains/account-deletion/infrastructure/services/AccountDeletionRepository_part_ab +116 -0
  24. package/src/domains/account-deletion/infrastructure/services/reauthentication.service_part_aa +150 -0
  25. package/src/domains/account-deletion/infrastructure/services/reauthentication.service_part_ab +10 -0
  26. package/src/domains/auth/infrastructure_part_aa +150 -0
  27. package/src/domains/auth/infrastructure_part_ab +6 -0
  28. package/src/domains/auth/presentation/hooks/GoogleOAuthHelpers.ts +0 -0
  29. package/src/domains/auth/presentation/hooks/GoogleOAuthHookService_part_aa +150 -0
  30. package/src/domains/auth/presentation/hooks/GoogleOAuthHookService_part_ab +97 -0
  31. package/src/domains/auth/presentation/hooks/GoogleOAuthService.ts +0 -0
  32. package/src/domains/firestore/domain/entities/Collection.ts +31 -191
  33. package/src/domains/firestore/domain/entities/Collection.ts.bak +288 -0
  34. package/src/domains/firestore/domain/entities/CollectionFactory.ts +55 -0
  35. package/src/domains/firestore/domain/entities/CollectionHelpers.ts +143 -0
  36. package/src/domains/firestore/domain/entities/CollectionUtils.ts +72 -0
  37. package/src/domains/firestore/domain/entities/CollectionValidation.ts +138 -0
  38. package/src/domains/firestore/domain/entities/Collection_part_aa +150 -0
  39. package/src/domains/firestore/domain/entities/Collection_part_ab +138 -0
  40. package/src/domains/firestore/domain/entities/DocumentHelpers.ts +0 -0
  41. package/src/domains/firestore/domain/entities/DocumentMain.ts +0 -0
  42. package/src/domains/firestore/domain/entities/Document_part_aa +150 -0
  43. package/src/domains/firestore/domain/entities/Document_part_ab +83 -0
  44. package/src/domains/firestore/domain/index.ts +35 -8
  45. package/src/domains/firestore/domain/services/QueryServiceAnalysis_part_aa +150 -0
  46. package/src/domains/firestore/domain/services/QueryServiceAnalysis_part_ab +19 -0
  47. package/src/domains/firestore/domain/services/QueryServiceHelpers_part_aa +150 -0
  48. package/src/domains/firestore/domain/services/QueryServiceHelpers_part_ab +1 -0
  49. package/src/domains/firestore/domain/services/QueryService_part_aa +150 -0
  50. package/src/domains/firestore/domain/services/QueryService_part_ab +32 -0
  51. package/src/domains/firestore/domain/value-objects/QueryOptions.ts +20 -68
  52. package/src/domains/firestore/domain/value-objects/QueryOptions.ts.bak +6 -135
  53. package/src/domains/firestore/domain/value-objects/QueryOptionsFactory.ts +95 -0
  54. package/src/domains/firestore/domain/value-objects/QueryOptionsHelpers.ts +110 -0
  55. package/src/domains/firestore/domain/value-objects/QueryOptionsSerialization_part_aa +150 -0
  56. package/src/domains/firestore/domain/value-objects/QueryOptionsSerialization_part_ab +57 -0
  57. package/src/domains/firestore/domain/value-objects/QueryOptionsValidation_part_aa +150 -0
  58. package/src/domains/firestore/domain/value-objects/QueryOptionsValidation_part_ab +32 -0
  59. package/src/domains/firestore/domain/value-objects/QueryOptions_part_aa +150 -0
  60. package/src/domains/firestore/domain/value-objects/QueryOptions_part_ab +41 -0
  61. package/src/domains/firestore/domain/value-objects/WhereClause.ts +35 -205
  62. package/src/domains/firestore/domain/value-objects/WhereClause.ts.bak +299 -0
  63. package/src/domains/firestore/domain/value-objects/WhereClauseFactory.ts +44 -150
  64. package/src/domains/firestore/domain/value-objects/WhereClauseFactory.ts.bak +207 -0
  65. package/src/domains/firestore/domain/value-objects/WhereClauseFactory_part_aa +150 -0
  66. package/src/domains/firestore/domain/value-objects/WhereClauseFactory_part_ab +57 -0
  67. package/src/domains/firestore/domain/value-objects/WhereClauseHelpers.ts +123 -0
  68. package/src/domains/firestore/domain/value-objects/WhereClauseValidation.ts +83 -0
  69. package/src/domains/firestore/domain/value-objects/WhereClause_part_aa +150 -0
  70. package/src/domains/firestore/domain/value-objects/WhereClause_part_ab +149 -0
  71. package/src/shared/infrastructure/base/ErrorHandler_part_aa +150 -0
  72. package/src/shared/infrastructure/base/ErrorHandler_part_ab +39 -0
  73. package/src/shared/infrastructure/base/ServiceBase_part_aa +150 -0
  74. package/src/shared/infrastructure/base/ServiceBase_part_ab +70 -0
  75. package/src/shared/infrastructure/config/base/ServiceClientSingleton_part_aa +150 -0
  76. package/src/shared/infrastructure/config/base/ServiceClientSingleton_part_ab +5 -0
  77. /package/src/application/auth/ports/{AuthPort.ts → AuthPort.ts.bak} +0 -0
  78. /package/src/application/auth/use-cases/{SignInUseCase.ts → SignInUseCase.ts.bak} +0 -0
  79. /package/src/application/auth/use-cases/{SignOutUseCase.ts → SignOutUseCase.ts.bak} +0 -0
  80. /package/src/domains/account-deletion/infrastructure/services/{AccountDeletionExecutor.ts → AccountDeletionExecutor.ts.bak} +0 -0
  81. /package/src/domains/account-deletion/infrastructure/services/{AccountDeletionReauthHandler.ts → AccountDeletionReauthHandler.ts.bak} +0 -0
  82. /package/src/domains/account-deletion/infrastructure/services/{AccountDeletionRepository.ts → AccountDeletionRepository.ts.bak} +0 -0
  83. /package/src/domains/account-deletion/infrastructure/services/{reauthentication.service.ts → reauthentication.service.ts.bak} +0 -0
  84. /package/src/domains/auth/{infrastructure.ts → infrastructure.ts.bak} +0 -0
  85. /package/src/domains/auth/presentation/hooks/{GoogleOAuthHookService.ts → GoogleOAuthHookService.ts.bak} +0 -0
  86. /package/src/domains/firestore/domain/entities/{Document.ts → Document.ts.bak} +0 -0
  87. /package/src/domains/firestore/domain/services/{QueryService.ts → QueryService.ts.bak} +0 -0
  88. /package/src/domains/firestore/domain/services/{QueryServiceAnalysis.ts → QueryServiceAnalysis.ts.bak} +0 -0
  89. /package/src/domains/firestore/domain/services/{QueryServiceHelpers.ts → QueryServiceHelpers.ts.bak} +0 -0
  90. /package/src/domains/firestore/domain/value-objects/{QueryOptionsSerialization.ts → QueryOptionsSerialization.ts.bak} +0 -0
  91. /package/src/domains/firestore/domain/value-objects/{QueryOptionsValidation.ts → QueryOptionsValidation.ts.bak} +0 -0
  92. /package/src/shared/infrastructure/base/{ErrorHandler.ts → ErrorHandler.ts.bak} +0 -0
  93. /package/src/shared/infrastructure/base/{ServiceBase.ts → ServiceBase.ts.bak} +0 -0
  94. /package/src/shared/infrastructure/config/base/{ServiceClientSingleton.ts → ServiceClientSingleton.ts.bak} +0 -0
@@ -1,207 +1,101 @@
1
1
  /**
2
2
  * Where Clause Factory
3
- * Single Responsibility: Provide factory methods for common where clauses
4
- *
5
- * Factory functions for creating commonly used where clauses.
6
- * Separated from WhereClause for better maintainability.
3
+ * Single Responsibility: Create where clauses
7
4
  *
8
5
  * Max lines: 150 (enforced for maintainability)
9
6
  */
10
7
 
11
8
  import type { WhereFilterOp } from 'firebase/firestore';
12
9
  import { WhereClause } from './WhereClause';
13
- import type { WhereOperator } from './WhereClause';
14
-
15
- /**
16
- * Factory function to create where clause
17
- */
18
- export function createWhereClause(
19
- field: string,
20
- operator: WhereFilterOp,
21
- value: unknown
22
- ): WhereClause {
23
- return WhereClause.create(field, operator, value);
24
- }
25
-
26
- /**
27
- * Factory functions for common where clauses
28
- */
29
- export const where = {
30
- equals: WhereClause.equals,
31
- notEquals: WhereClause.notEquals,
32
- lessThan: WhereClause.lessThan,
33
- lessThanOrEqual: WhereClause.lessThanOrEqual,
34
- greaterThan: WhereClause.greaterThan,
35
- greaterThanOrEqual: WhereClause.greaterThanOrEqual,
36
- arrayContains: WhereClause.arrayContains,
37
- arrayContainsAny: WhereClause.arrayContainsAny,
38
- in: WhereClause.in,
39
- notIn: WhereClause.notIn,
40
- };
41
-
42
- /**
43
- * Create batch of where clauses
44
- */
45
- export function createWhereBatch(
46
- clauses: Array<{ field: string; operator: WhereFilterOp; value: unknown }>
47
- ): WhereClause[] {
48
- return clauses.map(c => WhereClause.create(c.field, c.operator, c.value));
49
- }
50
10
 
51
11
  /**
52
- * Create equality clauses from object
12
+ * Create equals where clause
53
13
  */
54
- export function createEqualityFilters(obj: Record<string, unknown>): WhereClause[] {
55
- return Object.entries(obj).map(([field, value]) =>
56
- WhereClause.equals(field, value)
57
- );
14
+ export function equals(field: string, value: unknown): WhereClause {
15
+ return new WhereClause(field, '==', value);
58
16
  }
59
17
 
60
18
  /**
61
- * Create in clause from values
19
+ * Create not-equals where clause
62
20
  */
63
- export function createInClause(field: string, values: unknown[]): WhereClause {
64
- return WhereClause.in(field, values);
21
+ export function notEquals(field: string, value: unknown): WhereClause {
22
+ return new WhereClause(field, '!=', value);
65
23
  }
66
24
 
67
25
  /**
68
- * Create not-in clause from values
26
+ * Create less-than where clause
69
27
  */
70
- export function createNotInClause(field: string, values: unknown[]): WhereClause {
71
- return WhereClause.notIn(field, values);
28
+ export function lessThan(field: string, value: unknown): WhereClause {
29
+ return new WhereClause(field, '<', value);
72
30
  }
73
31
 
74
32
  /**
75
- * Create range clause (>= start and <= end)
33
+ * Create less-than-or-equal where clause
76
34
  */
77
- export function createRangeClause(
78
- field: string,
79
- startValue: unknown,
80
- endValue: unknown
81
- ): WhereClause[] {
82
- return [
83
- WhereClause.greaterThanOrEqual(field, startValue),
84
- WhereClause.lessThanOrEqual(field, endValue),
85
- ];
35
+ export function lessThanOrEqual(field: string, value: unknown): WhereClause {
36
+ return new WhereClause(field, '<=', value);
86
37
  }
87
38
 
88
39
  /**
89
- * Create date range clause
40
+ * Create greater-than where clause
90
41
  */
91
- export function createDateRangeClause(
92
- field: string,
93
- startDate: Date,
94
- endDate: Date
95
- ): WhereClause[] {
96
- return createRangeClause(field, startDate, endDate);
42
+ export function greaterThan(field: string, value: unknown): WhereClause {
43
+ return new WhereClause(field, '>', value);
97
44
  }
98
45
 
99
46
  /**
100
- * Create text search clause (case-insensitive contains)
101
- * Note: Firestore doesn't support native contains, this is for consistency
47
+ * Create greater-than-or-equal where clause
102
48
  */
103
- export function createTextSearchClause(field: string, searchText: string): WhereClause {
104
- return WhereClause.equals(field, searchText);
49
+ export function greaterThanOrEqual(field: string, value: unknown): WhereClause {
50
+ return new WhereClause(field, '>=', value);
105
51
  }
106
52
 
107
53
  /**
108
- * Create multiple equality clauses combined
54
+ * Create array-contains where clause
109
55
  */
110
- export function createMultiFieldFilter(filters: Record<string, unknown>): WhereClause[] {
111
- return createEqualityFilters(filters);
56
+ export function arrayContains(field: string, value: unknown): WhereClause {
57
+ return new WhereClause(field, 'array-contains', value);
112
58
  }
113
59
 
114
60
  /**
115
- * Create not-null clause
61
+ * Create in where clause
116
62
  */
117
- export function createNotNullClause(field: string): WhereClause {
118
- return WhereClause.notEquals(field, null);
63
+ export function inOp(field: string, values: unknown[]): WhereClause {
64
+ return new WhereClause(field, 'in', values);
119
65
  }
120
66
 
121
67
  /**
122
- * Create null clause
68
+ * Create not-in where clause
123
69
  */
124
- export function createNullClause(field: string): WhereClause {
125
- return WhereClause.equals(field, null);
70
+ export function notIn(field: string, values: unknown[]): WhereClause {
71
+ return new WhereClause(field, 'not-in', values);
126
72
  }
127
73
 
128
74
  /**
129
- * Create boolean clause
75
+ * Create array-contains-any where clause
130
76
  */
131
- export function createBooleanClause(field: string, value: boolean): WhereClause {
132
- return WhereClause.equals(field, value);
77
+ export function arrayContainsAny(field: string, values: unknown[]): WhereClause {
78
+ return new WhereClause(field, 'array-contains-any', values);
133
79
  }
134
80
 
135
81
  /**
136
- * Create number range clause
82
+ * Create where clause with custom operator
137
83
  */
138
- export function createNumberRangeClause(
84
+ export function where(
139
85
  field: string,
140
- min: number,
141
- max: number
142
- ): WhereClause[] {
143
- return [
144
- WhereClause.greaterThanOrEqual(field, min),
145
- WhereClause.lessThanOrEqual(field, max),
146
- ];
147
- }
148
-
149
- /**
150
- * Validate where clauses compatibility
151
- */
152
- export function validateWhereClauses(clauses: WhereClause[]): {
153
- valid: boolean;
154
- errors: string[];
155
- } {
156
- const errors: string[] = [];
157
-
158
- // Validate each clause individually
159
- for (let i = 0; i < clauses.length; i++) {
160
- const validation = clauses[i].validate();
161
- if (!validation.valid) {
162
- errors.push(`Clause ${i}: ${validation.errors.join(', ')}`);
163
- }
164
- }
165
-
166
- // Validate compatibility
167
- for (let i = 0; i < clauses.length; i++) {
168
- for (let j = i + 1; j < clauses.length; j++) {
169
- if (!clauses[i].isCompatibleWith(clauses[j])) {
170
- errors.push(`Clauses ${i} and ${j} are incompatible`);
171
- }
172
- }
173
- }
174
-
175
- return {
176
- valid: errors.length === 0,
177
- errors,
178
- };
86
+ operator: WhereFilterOp,
87
+ value: unknown
88
+ ): WhereClause {
89
+ return new WhereClause(field, operator, value);
179
90
  }
180
91
 
181
92
  /**
182
- * Optimize where clauses
183
- * Removes duplicates and incompatible clauses
93
+ * Create where clause from object
184
94
  */
185
- export function optimizeWhereClauses(clauses: WhereClause[]): WhereClause[] {
186
- // Remove duplicates
187
- const unique = clauses.filter((clause, index, self) =>
188
- index === self.findIndex(c => clause.equals(c))
189
- );
190
-
191
- // Remove incompatible (keep first occurrences)
192
- const compatible: WhereClause[] = [];
193
- for (const clause of unique) {
194
- let canAdd = true;
195
- for (const existing of compatible) {
196
- if (!clause.isCompatibleWith(existing)) {
197
- canAdd = false;
198
- break;
199
- }
200
- }
201
- if (canAdd) {
202
- compatible.push(clause);
203
- }
204
- }
205
-
206
- return compatible;
95
+ export function fromObject(obj: {
96
+ field: string;
97
+ operator: WhereFilterOp;
98
+ value: unknown;
99
+ }): WhereClause {
100
+ return new WhereClause(obj.field, obj.operator, obj.value);
207
101
  }
@@ -0,0 +1,207 @@
1
+ /**
2
+ * Where Clause Factory
3
+ * Single Responsibility: Provide factory methods for common where clauses
4
+ *
5
+ * Factory functions for creating commonly used where clauses.
6
+ * Separated from WhereClause for better maintainability.
7
+ *
8
+ * Max lines: 150 (enforced for maintainability)
9
+ */
10
+
11
+ import type { WhereFilterOp } from 'firebase/firestore';
12
+ import { WhereClause } from './WhereClause';
13
+ import type { WhereOperator } from './WhereClause';
14
+
15
+ /**
16
+ * Factory function to create where clause
17
+ */
18
+ export function createWhereClause(
19
+ field: string,
20
+ operator: WhereFilterOp,
21
+ value: unknown
22
+ ): WhereClause {
23
+ return WhereClause.create(field, operator, value);
24
+ }
25
+
26
+ /**
27
+ * Factory functions for common where clauses
28
+ */
29
+ export const where = {
30
+ equals: WhereClause.equals,
31
+ notEquals: WhereClause.notEquals,
32
+ lessThan: WhereClause.lessThan,
33
+ lessThanOrEqual: WhereClause.lessThanOrEqual,
34
+ greaterThan: WhereClause.greaterThan,
35
+ greaterThanOrEqual: WhereClause.greaterThanOrEqual,
36
+ arrayContains: WhereClause.arrayContains,
37
+ arrayContainsAny: WhereClause.arrayContainsAny,
38
+ in: WhereClause.in,
39
+ notIn: WhereClause.notIn,
40
+ };
41
+
42
+ /**
43
+ * Create batch of where clauses
44
+ */
45
+ export function createWhereBatch(
46
+ clauses: Array<{ field: string; operator: WhereFilterOp; value: unknown }>
47
+ ): WhereClause[] {
48
+ return clauses.map(c => WhereClause.create(c.field, c.operator, c.value));
49
+ }
50
+
51
+ /**
52
+ * Create equality clauses from object
53
+ */
54
+ export function createEqualityFilters(obj: Record<string, unknown>): WhereClause[] {
55
+ return Object.entries(obj).map(([field, value]) =>
56
+ WhereClause.equals(field, value)
57
+ );
58
+ }
59
+
60
+ /**
61
+ * Create in clause from values
62
+ */
63
+ export function createInClause(field: string, values: unknown[]): WhereClause {
64
+ return WhereClause.in(field, values);
65
+ }
66
+
67
+ /**
68
+ * Create not-in clause from values
69
+ */
70
+ export function createNotInClause(field: string, values: unknown[]): WhereClause {
71
+ return WhereClause.notIn(field, values);
72
+ }
73
+
74
+ /**
75
+ * Create range clause (>= start and <= end)
76
+ */
77
+ export function createRangeClause(
78
+ field: string,
79
+ startValue: unknown,
80
+ endValue: unknown
81
+ ): WhereClause[] {
82
+ return [
83
+ WhereClause.greaterThanOrEqual(field, startValue),
84
+ WhereClause.lessThanOrEqual(field, endValue),
85
+ ];
86
+ }
87
+
88
+ /**
89
+ * Create date range clause
90
+ */
91
+ export function createDateRangeClause(
92
+ field: string,
93
+ startDate: Date,
94
+ endDate: Date
95
+ ): WhereClause[] {
96
+ return createRangeClause(field, startDate, endDate);
97
+ }
98
+
99
+ /**
100
+ * Create text search clause (case-insensitive contains)
101
+ * Note: Firestore doesn't support native contains, this is for consistency
102
+ */
103
+ export function createTextSearchClause(field: string, searchText: string): WhereClause {
104
+ return WhereClause.equals(field, searchText);
105
+ }
106
+
107
+ /**
108
+ * Create multiple equality clauses combined
109
+ */
110
+ export function createMultiFieldFilter(filters: Record<string, unknown>): WhereClause[] {
111
+ return createEqualityFilters(filters);
112
+ }
113
+
114
+ /**
115
+ * Create not-null clause
116
+ */
117
+ export function createNotNullClause(field: string): WhereClause {
118
+ return WhereClause.notEquals(field, null);
119
+ }
120
+
121
+ /**
122
+ * Create null clause
123
+ */
124
+ export function createNullClause(field: string): WhereClause {
125
+ return WhereClause.equals(field, null);
126
+ }
127
+
128
+ /**
129
+ * Create boolean clause
130
+ */
131
+ export function createBooleanClause(field: string, value: boolean): WhereClause {
132
+ return WhereClause.equals(field, value);
133
+ }
134
+
135
+ /**
136
+ * Create number range clause
137
+ */
138
+ export function createNumberRangeClause(
139
+ field: string,
140
+ min: number,
141
+ max: number
142
+ ): WhereClause[] {
143
+ return [
144
+ WhereClause.greaterThanOrEqual(field, min),
145
+ WhereClause.lessThanOrEqual(field, max),
146
+ ];
147
+ }
148
+
149
+ /**
150
+ * Validate where clauses compatibility
151
+ */
152
+ export function validateWhereClauses(clauses: WhereClause[]): {
153
+ valid: boolean;
154
+ errors: string[];
155
+ } {
156
+ const errors: string[] = [];
157
+
158
+ // Validate each clause individually
159
+ for (let i = 0; i < clauses.length; i++) {
160
+ const validation = clauses[i].validate();
161
+ if (!validation.valid) {
162
+ errors.push(`Clause ${i}: ${validation.errors.join(', ')}`);
163
+ }
164
+ }
165
+
166
+ // Validate compatibility
167
+ for (let i = 0; i < clauses.length; i++) {
168
+ for (let j = i + 1; j < clauses.length; j++) {
169
+ if (!clauses[i].isCompatibleWith(clauses[j])) {
170
+ errors.push(`Clauses ${i} and ${j} are incompatible`);
171
+ }
172
+ }
173
+ }
174
+
175
+ return {
176
+ valid: errors.length === 0,
177
+ errors,
178
+ };
179
+ }
180
+
181
+ /**
182
+ * Optimize where clauses
183
+ * Removes duplicates and incompatible clauses
184
+ */
185
+ export function optimizeWhereClauses(clauses: WhereClause[]): WhereClause[] {
186
+ // Remove duplicates
187
+ const unique = clauses.filter((clause, index, self) =>
188
+ index === self.findIndex(c => clause.equals(c))
189
+ );
190
+
191
+ // Remove incompatible (keep first occurrences)
192
+ const compatible: WhereClause[] = [];
193
+ for (const clause of unique) {
194
+ let canAdd = true;
195
+ for (const existing of compatible) {
196
+ if (!clause.isCompatibleWith(existing)) {
197
+ canAdd = false;
198
+ break;
199
+ }
200
+ }
201
+ if (canAdd) {
202
+ compatible.push(clause);
203
+ }
204
+ }
205
+
206
+ return compatible;
207
+ }
@@ -0,0 +1,150 @@
1
+ /**
2
+ * Where Clause Factory
3
+ * Single Responsibility: Provide factory methods for common where clauses
4
+ *
5
+ * Factory functions for creating commonly used where clauses.
6
+ * Separated from WhereClause for better maintainability.
7
+ *
8
+ * Max lines: 150 (enforced for maintainability)
9
+ */
10
+
11
+ import type { WhereFilterOp } from 'firebase/firestore';
12
+ import { WhereClause } from './WhereClause';
13
+ import type { WhereOperator } from './WhereClause';
14
+
15
+ /**
16
+ * Factory function to create where clause
17
+ */
18
+ export function createWhereClause(
19
+ field: string,
20
+ operator: WhereFilterOp,
21
+ value: unknown
22
+ ): WhereClause {
23
+ return WhereClause.create(field, operator, value);
24
+ }
25
+
26
+ /**
27
+ * Factory functions for common where clauses
28
+ */
29
+ export const where = {
30
+ equals: WhereClause.equals,
31
+ notEquals: WhereClause.notEquals,
32
+ lessThan: WhereClause.lessThan,
33
+ lessThanOrEqual: WhereClause.lessThanOrEqual,
34
+ greaterThan: WhereClause.greaterThan,
35
+ greaterThanOrEqual: WhereClause.greaterThanOrEqual,
36
+ arrayContains: WhereClause.arrayContains,
37
+ arrayContainsAny: WhereClause.arrayContainsAny,
38
+ in: WhereClause.in,
39
+ notIn: WhereClause.notIn,
40
+ };
41
+
42
+ /**
43
+ * Create batch of where clauses
44
+ */
45
+ export function createWhereBatch(
46
+ clauses: Array<{ field: string; operator: WhereFilterOp; value: unknown }>
47
+ ): WhereClause[] {
48
+ return clauses.map(c => WhereClause.create(c.field, c.operator, c.value));
49
+ }
50
+
51
+ /**
52
+ * Create equality clauses from object
53
+ */
54
+ export function createEqualityFilters(obj: Record<string, unknown>): WhereClause[] {
55
+ return Object.entries(obj).map(([field, value]) =>
56
+ WhereClause.equals(field, value)
57
+ );
58
+ }
59
+
60
+ /**
61
+ * Create in clause from values
62
+ */
63
+ export function createInClause(field: string, values: unknown[]): WhereClause {
64
+ return WhereClause.in(field, values);
65
+ }
66
+
67
+ /**
68
+ * Create not-in clause from values
69
+ */
70
+ export function createNotInClause(field: string, values: unknown[]): WhereClause {
71
+ return WhereClause.notIn(field, values);
72
+ }
73
+
74
+ /**
75
+ * Create range clause (>= start and <= end)
76
+ */
77
+ export function createRangeClause(
78
+ field: string,
79
+ startValue: unknown,
80
+ endValue: unknown
81
+ ): WhereClause[] {
82
+ return [
83
+ WhereClause.greaterThanOrEqual(field, startValue),
84
+ WhereClause.lessThanOrEqual(field, endValue),
85
+ ];
86
+ }
87
+
88
+ /**
89
+ * Create date range clause
90
+ */
91
+ export function createDateRangeClause(
92
+ field: string,
93
+ startDate: Date,
94
+ endDate: Date
95
+ ): WhereClause[] {
96
+ return createRangeClause(field, startDate, endDate);
97
+ }
98
+
99
+ /**
100
+ * Create text search clause (case-insensitive contains)
101
+ * Note: Firestore doesn't support native contains, this is for consistency
102
+ */
103
+ export function createTextSearchClause(field: string, searchText: string): WhereClause {
104
+ return WhereClause.equals(field, searchText);
105
+ }
106
+
107
+ /**
108
+ * Create multiple equality clauses combined
109
+ */
110
+ export function createMultiFieldFilter(filters: Record<string, unknown>): WhereClause[] {
111
+ return createEqualityFilters(filters);
112
+ }
113
+
114
+ /**
115
+ * Create not-null clause
116
+ */
117
+ export function createNotNullClause(field: string): WhereClause {
118
+ return WhereClause.notEquals(field, null);
119
+ }
120
+
121
+ /**
122
+ * Create null clause
123
+ */
124
+ export function createNullClause(field: string): WhereClause {
125
+ return WhereClause.equals(field, null);
126
+ }
127
+
128
+ /**
129
+ * Create boolean clause
130
+ */
131
+ export function createBooleanClause(field: string, value: boolean): WhereClause {
132
+ return WhereClause.equals(field, value);
133
+ }
134
+
135
+ /**
136
+ * Create number range clause
137
+ */
138
+ export function createNumberRangeClause(
139
+ field: string,
140
+ min: number,
141
+ max: number
142
+ ): WhereClause[] {
143
+ return [
144
+ WhereClause.greaterThanOrEqual(field, min),
145
+ WhereClause.lessThanOrEqual(field, max),
146
+ ];
147
+ }
148
+
149
+ /**
150
+ * Validate where clauses compatibility
@@ -0,0 +1,57 @@
1
+ */
2
+ export function validateWhereClauses(clauses: WhereClause[]): {
3
+ valid: boolean;
4
+ errors: string[];
5
+ } {
6
+ const errors: string[] = [];
7
+
8
+ // Validate each clause individually
9
+ for (let i = 0; i < clauses.length; i++) {
10
+ const validation = clauses[i].validate();
11
+ if (!validation.valid) {
12
+ errors.push(`Clause ${i}: ${validation.errors.join(', ')}`);
13
+ }
14
+ }
15
+
16
+ // Validate compatibility
17
+ for (let i = 0; i < clauses.length; i++) {
18
+ for (let j = i + 1; j < clauses.length; j++) {
19
+ if (!clauses[i].isCompatibleWith(clauses[j])) {
20
+ errors.push(`Clauses ${i} and ${j} are incompatible`);
21
+ }
22
+ }
23
+ }
24
+
25
+ return {
26
+ valid: errors.length === 0,
27
+ errors,
28
+ };
29
+ }
30
+
31
+ /**
32
+ * Optimize where clauses
33
+ * Removes duplicates and incompatible clauses
34
+ */
35
+ export function optimizeWhereClauses(clauses: WhereClause[]): WhereClause[] {
36
+ // Remove duplicates
37
+ const unique = clauses.filter((clause, index, self) =>
38
+ index === self.findIndex(c => clause.equals(c))
39
+ );
40
+
41
+ // Remove incompatible (keep first occurrences)
42
+ const compatible: WhereClause[] = [];
43
+ for (const clause of unique) {
44
+ let canAdd = true;
45
+ for (const existing of compatible) {
46
+ if (!clause.isCompatibleWith(existing)) {
47
+ canAdd = false;
48
+ break;
49
+ }
50
+ }
51
+ if (canAdd) {
52
+ compatible.push(clause);
53
+ }
54
+ }
55
+
56
+ return compatible;
57
+ }