From c346294b0560a82debc2cae81600dc37bdc5c925 Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Mon, 12 Oct 2026 01:42:25 +0000 Subject: [PATCH 1/5] fix(apple): compile Firestore pipelines and ML Model Downloader on SDK 13 Firestore 13 prefixes the pipeline bridge classes, and the Swift package no longer ships FirebaseMLModelDownloader. --- .../e2e_tests_ml_model_downloader.yaml | 3 + .../cloud_firestore/FLTPipelineParser.m | 396 +++++++++--------- .../Package.swift | 2 +- .../FirebaseModelDownloaderPlugin.swift | 18 +- .../Package.swift | 2 +- 5 files changed, 220 insertions(+), 201 deletions(-) diff --git a/.github/workflows/e2e_tests_ml_model_downloader.yaml b/.github/workflows/e2e_tests_ml_model_downloader.yaml index 4a4f2ce70706..624d56ffc1d3 100644 --- a/.github/workflows/e2e_tests_ml_model_downloader.yaml +++ b/.github/workflows/e2e_tests_ml_model_downloader.yaml @@ -81,6 +81,9 @@ jobs: native-config-args: '--live-tier-plist=ml_model_downloader' inject-config-secrets: true use-firebase-emulators: false + # Firebase Apple SDK 13 removed FirebaseMLModelDownloader. Live tests stay + # on CocoaPods, which is still pinned to 12.19.0. + ios-spm: false nightly_test_mode: ${{ inputs.nightly_test_mode == true }} secrets: TESTS_E2E_FIREBASE_OPTIONS_DART: ${{ secrets.TESTS_E2E_FIREBASE_OPTIONS_DART }} diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m index ed2838214342..c4fdc9ec6601 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m @@ -52,16 +52,16 @@ // Firebase iOS SDK versions differ: some expose initWithName:Args:Options:, others // initWithName:Args:. -@interface FIRFunctionExprBridge (FLTSDKCompat) +@interface __FIRFunctionExprBridge (FLTSDKCompat) - (instancetype)initWithName:(NSString *)name - Args:(NSArray *)args - Options:(NSDictionary *)options; -- (instancetype)initWithName:(NSString *)name Args:(NSArray *)args; + Args:(NSArray<__FIRExprBridge *> *)args + Options:(NSDictionary *)options; +- (instancetype)initWithName:(NSString *)name Args:(NSArray<__FIRExprBridge *> *)args; @end -static FIRFunctionExprBridge *FLTNewFunctionExprBridge(NSString *name, - NSArray *args) { - FIRFunctionExprBridge *obj = [FIRFunctionExprBridge alloc]; +static __FIRFunctionExprBridge *FLTNewFunctionExprBridge(NSString *name, + NSArray<__FIRExprBridge *> *args) { + __FIRFunctionExprBridge *obj = [__FIRFunctionExprBridge alloc]; if ([obj respondsToSelector:@selector(initWithName:Args:Options:)]) { return [obj initWithName:name Args:args Options:nil]; } @@ -77,10 +77,10 @@ - (instancetype)initWithName:(NSString *)name Args:(NSArray *)a @interface FLTPipelineExpressionParser : NSObject @property(nonatomic, strong) FIRFirestore *firestore; - (instancetype)initWithFirestore:(FIRFirestore *)firestore; -- (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NSError **)error; -- (FIRExprBridge *)parseBooleanExpression:(NSDictionary *)map +- (__FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NSError **)error; +- (__FIRExprBridge *)parseBooleanExpression:(NSDictionary *)map error:(NSError **)error; -- (FIRExprBridge *)rightExprFromValue:(id)value error:(NSError **)error; +- (__FIRExprBridge *)rightExprFromValue:(id)value error:(NSError **)error; @end @implementation FLTPipelineExpressionParser @@ -93,12 +93,12 @@ - (instancetype)initWithFirestore:(FIRFirestore *)firestore { return self; } -- (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NSError **)error { +- (__FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NSError **)error { NSString *name = map[@"name"]; if (!name) { NSDictionary *args = map[@"args"]; if ([args isKindOfClass:[NSDictionary class]] && args[@"field"]) { - return [[FIRFieldBridge alloc] initWithName:args[@"field"]]; + return [[__FIRFieldBridge alloc] initWithName:args[@"field"]]; } if (error) *error = parseError(@"Expression must have a 'name' field"); return nil; @@ -113,7 +113,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"Field expression requires 'field' argument"); return nil; } - return [[FIRFieldBridge alloc] initWithName:field]; + return [[__FIRFieldBridge alloc] initWithName:field]; } if ([name isEqualToString:@"constant"]) { @@ -126,10 +126,10 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS NSString *path = ((NSDictionary *)value)[@"path"]; if ([path isKindOfClass:[NSString class]] && self.firestore) { FIRDocumentReference *docRef = [self.firestore documentWithPath:path]; - return [[FIRConstantBridge alloc] init:docRef]; + return [[__FIRConstantBridge alloc] init:docRef]; } } - return [[FIRConstantBridge alloc] init:value]; + return [[__FIRConstantBridge alloc] init:value]; } if ([name isEqualToString:@"alias"]) { @@ -144,7 +144,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS } if ([name isEqualToString:@"null"]) { - return [[FIRConstantBridge alloc] init:[NSNull null]]; + return [[__FIRConstantBridge alloc] init:[NSNull null]]; } if ([name isEqualToString:@"document_id_from_ref"]) { @@ -158,12 +158,12 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS return nil; } FIRDocumentReference *docRef = [self.firestore documentWithPath:path]; - FIRExprBridge *refExpr = [[FIRConstantBridge alloc] init:docRef]; + __FIRExprBridge *refExpr = [[__FIRConstantBridge alloc] init:docRef]; return FLTNewFunctionExprBridge(@"document_id", @[ refExpr ]); } // Swift asBoolean() is a type coercion, not a pipeline function named "as_boolean". - // Dart still sends as_boolean + expression; unwrap to the inner FIRExprBridge. + // Dart still sends as_boolean + expression; unwrap to the inner __FIRExprBridge. if ([name isEqualToString:@"as_boolean"]) { id exprMap = args[@"expression"]; if (![exprMap isKindOfClass:[NSDictionary class]]) { @@ -179,7 +179,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"document_matches requires query"); return nil; } - FIRExprBridge *queryExpr = [[FIRConstantBridge alloc] init:query]; + __FIRExprBridge *queryExpr = [[__FIRConstantBridge alloc] init:query]; return FLTNewFunctionExprBridge(@"document_matches", @[ queryExpr ]); } @@ -210,8 +210,8 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS parseError([NSString stringWithFormat:@"%@ requires left and right expressions", name]); return nil; } - FIRExprBridge *left = [self parseExpression:leftMap error:error]; - FIRExprBridge *right = [self parseExpression:rightMap error:error]; + __FIRExprBridge *left = [self parseExpression:leftMap error:error]; + __FIRExprBridge *right = [self parseExpression:rightMap error:error]; if (!left || !right) return nil; return FLTNewFunctionExprBridge(sdkName, @[ left, right ]); } @@ -227,7 +227,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError([NSString stringWithFormat:@"%@ requires expression", name]); return nil; } - FIRExprBridge *expr = [name isEqualToString:@"not"] + __FIRExprBridge *expr = [name isEqualToString:@"not"] ? [self parseBooleanExpression:exprMap error:error] : [self parseExpression:exprMap error:error]; if (!expr) return nil; @@ -248,7 +248,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError([NSString stringWithFormat:@"%@ requires expression", name]); return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; if (!expr) return nil; NSString *unarySdkName = name; if ([name isEqualToString:@"to_lower_case"]) unarySdkName = @"to_lower"; @@ -268,10 +268,10 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS parseError([NSString stringWithFormat:@"%@ requires at least one expression", name]); return nil; } - NSMutableArray *all = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *all = [NSMutableArray array]; for (id em in exprMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *e = [self parseBooleanExpression:em error:error]; + __FIRExprBridge *e = [self parseBooleanExpression:em error:error]; if (!e) return nil; [all addObject:e]; } @@ -296,12 +296,12 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS parseError([NSString stringWithFormat:@"%@ requires value and non-empty values", name]); return nil; } - FIRExprBridge *valueExpr = [self parseExpression:valueMap error:error]; + __FIRExprBridge *valueExpr = [self parseExpression:valueMap error:error]; if (!valueExpr) return nil; - NSMutableArray *valueExprs = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *valueExprs = [NSMutableArray array]; for (id vm in valuesMaps) { if (![vm isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *ve = [self parseExpression:vm error:error]; + __FIRExprBridge *ve = [self parseExpression:vm error:error]; if (!ve) return nil; [valueExprs addObject:ve]; } @@ -310,7 +310,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS *error = parseError([NSString stringWithFormat:@"%@ requires at least one value", name]); return nil; } - FIRExprBridge *valuesArrayExpr = FLTNewFunctionExprBridge(@"array", valueExprs); + __FIRExprBridge *valuesArrayExpr = FLTNewFunctionExprBridge(@"array", valueExprs); return FLTNewFunctionExprBridge(name, @[ valueExpr, valuesArrayExpr ]); } @@ -325,8 +325,8 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"array_contains requires array and element"); return nil; } - FIRExprBridge *arrayExpr = [self parseExpression:arrayMap error:error]; - FIRExprBridge *elementExpr = [self parseExpression:elementMap error:error]; + __FIRExprBridge *arrayExpr = [self parseExpression:arrayMap error:error]; + __FIRExprBridge *elementExpr = [self parseExpression:elementMap error:error]; if (!arrayExpr || !elementExpr) return nil; return FLTNewFunctionExprBridge(name, @[ arrayExpr, elementExpr ]); } @@ -343,7 +343,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError([NSString stringWithFormat:@"%@ requires array", name]); return nil; } - FIRExprBridge *arrayExpr = [self parseExpression:arrayMap error:error]; + __FIRExprBridge *arrayExpr = [self parseExpression:arrayMap error:error]; if (!arrayExpr) return nil; NSArray *valuesMaps = args[@"values"]; @@ -352,7 +352,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (hasValues) { NSDictionary *arrayExprMap = @{@"name" : @"array", @"args" : @{@"elements" : valuesMaps}}; - FIRExprBridge *valuesArrayExpr = [self parseExpression:arrayExprMap error:error]; + __FIRExprBridge *valuesArrayExpr = [self parseExpression:arrayExprMap error:error]; if (!valuesArrayExpr) return nil; return FLTNewFunctionExprBridge(name, @[ arrayExpr, valuesArrayExpr ]); } @@ -360,7 +360,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if ([name isEqualToString:@"array_contains_all"]) { id arrayExpressionMap = args[@"array_expression"]; if ([arrayExpressionMap isKindOfClass:[NSDictionary class]]) { - FIRExprBridge *requiredArrayExpr = [self parseExpression:arrayExpressionMap error:error]; + __FIRExprBridge *requiredArrayExpr = [self parseExpression:arrayExpressionMap error:error]; if (!requiredArrayExpr) return nil; return FLTNewFunctionExprBridge(name, @[ arrayExpr, requiredArrayExpr ]); } @@ -383,10 +383,10 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"concat requires non-empty expressions"); return nil; } - NSMutableArray *all = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *all = [NSMutableArray array]; for (id em in exprMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *e = [self parseExpression:em error:error]; + __FIRExprBridge *e = [self parseExpression:em error:error]; if (!e) return nil; [all addObject:e]; } @@ -410,9 +410,9 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"substring requires expression, start, and end"); return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; - FIRExprBridge *start = [self parseExpression:startMap error:error]; - FIRExprBridge *end = [self parseExpression:endMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *start = [self parseExpression:startMap error:error]; + __FIRExprBridge *end = [self parseExpression:endMap error:error]; if (!expr || !start || !end) return nil; return FLTNewFunctionExprBridge(@"substring", @[ expr, start, end ]); } @@ -430,9 +430,9 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"replace requires expression, find, and replacement"); return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; - FIRExprBridge *find = [self parseExpression:findMap error:error]; - FIRExprBridge *replacement = [self parseExpression:replacementMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *find = [self parseExpression:findMap error:error]; + __FIRExprBridge *replacement = [self parseExpression:replacementMap error:error]; if (!expr || !find || !replacement) return nil; return FLTNewFunctionExprBridge(@"string_replace", @[ expr, find, replacement ]); } @@ -453,9 +453,9 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS [NSString stringWithFormat:@"%@ requires expression, find, and replacement", name]); return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; - FIRExprBridge *find = [self parseExpression:findMap error:error]; - FIRExprBridge *replacement = [self parseExpression:replacementMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *find = [self parseExpression:findMap error:error]; + __FIRExprBridge *replacement = [self parseExpression:replacementMap error:error]; if (!expr || !find || !replacement) return nil; return FLTNewFunctionExprBridge(name, @[ expr, find, replacement ]); } @@ -474,8 +474,8 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS [NSString stringWithFormat:@"%@ requires expression and %@", name, argumentName]); return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; - FIRExprBridge *argument = [self parseExpression:argumentMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *argument = [self parseExpression:argumentMap error:error]; if (!expr || !argument) return nil; return FLTNewFunctionExprBridge(name, @[ expr, argument ]); } @@ -489,14 +489,14 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError([NSString stringWithFormat:@"%@ requires expression", name]); return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; if (!expr) return nil; id valueMap = args[@"value"]; if (![valueMap isKindOfClass:[NSDictionary class]]) { return FLTNewFunctionExprBridge(name, @[ expr ]); } - FIRExprBridge *value = [self parseExpression:valueMap error:error]; + __FIRExprBridge *value = [self parseExpression:valueMap error:error]; if (!value) return nil; return FLTNewFunctionExprBridge(name, @[ expr, value ]); } @@ -514,8 +514,8 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS parseError([NSString stringWithFormat:@"%@ requires expression and delimiter", name]); return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; - FIRExprBridge *delimiter = [self parseExpression:delimiterMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *delimiter = [self parseExpression:delimiterMap error:error]; if (!expr || !delimiter) return nil; return FLTNewFunctionExprBridge(name, @[ expr, delimiter ]); } @@ -531,8 +531,8 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"array_concat requires first and second"); return nil; } - FIRExprBridge *first = [self parseExpression:firstMap error:error]; - FIRExprBridge *second = [self parseExpression:secondMap error:error]; + __FIRExprBridge *first = [self parseExpression:firstMap error:error]; + __FIRExprBridge *second = [self parseExpression:secondMap error:error]; if (!first || !second) return nil; return FLTNewFunctionExprBridge(@"array_concat", @[ first, second ]); } @@ -546,10 +546,10 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"array_concat_multiple requires non-empty arrays"); return nil; } - NSMutableArray *all = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *all = [NSMutableArray array]; for (id am in arraysMaps) { if (![am isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *e = [self parseExpression:am error:error]; + __FIRExprBridge *e = [self parseExpression:am error:error]; if (!e) return nil; [all addObject:e]; } @@ -572,13 +572,13 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"array_slice requires expression and offset"); return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; - FIRExprBridge *offset = [self parseExpression:offsetMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *offset = [self parseExpression:offsetMap error:error]; if (!expr || !offset) return nil; - NSMutableArray *sliceArgs = + NSMutableArray<__FIRExprBridge *> *sliceArgs = [NSMutableArray arrayWithObjects:expr, offset, nil]; if ([lengthMap isKindOfClass:[NSDictionary class]]) { - FIRExprBridge *length = [self parseExpression:lengthMap error:error]; + __FIRExprBridge *length = [self parseExpression:lengthMap error:error]; if (!length) return nil; [sliceArgs addObject:length]; } @@ -597,11 +597,11 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"array_filter requires expression, alias, and filter"); return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; - FIRExprBridge *filter = [self parseBooleanExpression:filterMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *filter = [self parseBooleanExpression:filterMap error:error]; if (!expr || !filter) return nil; return FLTNewFunctionExprBridge(@"array_filter", - @[ expr, [[FIRConstantBridge alloc] init:alias], filter ]); + @[ expr, [[__FIRConstantBridge alloc] init:alias], filter ]); } // ------------------------------------------------------------------------- @@ -628,13 +628,13 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS } return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; - FIRExprBridge *transform = [self parseExpression:transformMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *transform = [self parseExpression:transformMap error:error]; if (!expr || !transform) return nil; - NSMutableArray *transformArgs = - [NSMutableArray arrayWithObjects:expr, [[FIRConstantBridge alloc] init:elementAlias], nil]; + NSMutableArray<__FIRExprBridge *> *transformArgs = + [NSMutableArray arrayWithObjects:expr, [[__FIRConstantBridge alloc] init:elementAlias], nil]; if (withIndex) { - [transformArgs addObject:[[FIRConstantBridge alloc] init:indexAlias]]; + [transformArgs addObject:[[__FIRConstantBridge alloc] init:indexAlias]]; } [transformArgs addObject:transform]; return FLTNewFunctionExprBridge(name, transformArgs); @@ -649,10 +649,10 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"array requires non-empty elements"); return nil; } - NSMutableArray *elementExprs = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *elementExprs = [NSMutableArray array]; for (id em in elementsMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *e = [self parseExpression:em error:error]; + __FIRExprBridge *e = [self parseExpression:em error:error]; if (!e) return nil; [elementExprs addObject:e]; } @@ -673,12 +673,12 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"map requires non-empty data"); return nil; } - NSMutableArray *mapArgs = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *mapArgs = [NSMutableArray array]; for (NSString *key in dataMap) { id valueMap = dataMap[key]; if (![valueMap isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *keyExpr = [[FIRConstantBridge alloc] init:key]; - FIRExprBridge *valueExpr = [self parseExpression:valueMap error:error]; + __FIRExprBridge *keyExpr = [[__FIRConstantBridge alloc] init:key]; + __FIRExprBridge *valueExpr = [self parseExpression:valueMap error:error]; if (!valueExpr) return nil; [mapArgs addObject:keyExpr]; [mapArgs addObject:valueExpr]; @@ -701,8 +701,8 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"map_get requires map and key"); return nil; } - FIRExprBridge *mapExpr = [self parseExpression:mapMap error:error]; - FIRExprBridge *keyExpr = [self parseExpression:keyMap error:error]; + __FIRExprBridge *mapExpr = [self parseExpression:mapMap error:error]; + __FIRExprBridge *keyExpr = [self parseExpression:keyMap error:error]; if (!mapExpr || !keyExpr) return nil; return FLTNewFunctionExprBridge(@"map_get", @[ mapExpr, keyExpr ]); } @@ -718,8 +718,8 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"if_absent requires expression and else"); return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; - FIRExprBridge *elseExpr = [self parseExpression:elseMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *elseExpr = [self parseExpression:elseMap error:error]; if (!expr || !elseExpr) return nil; return FLTNewFunctionExprBridge(@"if_absent", @[ expr, elseExpr ]); } @@ -735,8 +735,8 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"if_error requires expression and catch"); return nil; } - FIRExprBridge *expr = [self parseExpression:exprMap error:error]; - FIRExprBridge *catchExpr = [self parseExpression:catchMap error:error]; + __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; + __FIRExprBridge *catchExpr = [self parseExpression:catchMap error:error]; if (!expr || !catchExpr) return nil; return FLTNewFunctionExprBridge(@"if_error", @[ expr, catchExpr ]); } @@ -754,9 +754,9 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"conditional requires condition, then, and else"); return nil; } - FIRExprBridge *condition = [self parseBooleanExpression:conditionMap error:error]; - FIRExprBridge *thenExpr = [self parseExpression:thenMap error:error]; - FIRExprBridge *elseExpr = [self parseExpression:elseMap error:error]; + __FIRExprBridge *condition = [self parseBooleanExpression:conditionMap error:error]; + __FIRExprBridge *thenExpr = [self parseExpression:thenMap error:error]; + __FIRExprBridge *elseExpr = [self parseExpression:elseMap error:error]; if (!condition || !thenExpr || !elseExpr) return nil; return FLTNewFunctionExprBridge(@"conditional", @[ condition, thenExpr, elseExpr ]); } @@ -775,10 +775,10 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS [NSString stringWithFormat:@"%@ requires timestamp, unit, and amount", name]); return nil; } - FIRExprBridge *timestampExpr = [self parseExpression:timestampMap error:error]; - FIRExprBridge *amountExpr = [self parseExpression:amountMap error:error]; + __FIRExprBridge *timestampExpr = [self parseExpression:timestampMap error:error]; + __FIRExprBridge *amountExpr = [self parseExpression:amountMap error:error]; if (!timestampExpr || !amountExpr) return nil; - FIRExprBridge *unitExpr = [[FIRConstantBridge alloc] init:unitVal]; + __FIRExprBridge *unitExpr = [[__FIRConstantBridge alloc] init:unitVal]; return FLTNewFunctionExprBridge(name, @[ timestampExpr, unitExpr, amountExpr ]); } @@ -799,9 +799,9 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"timestamp_truncate requires timestamp and unit"); return nil; } - FIRExprBridge *timestampExpr = [self parseExpression:timestampMap error:error]; + __FIRExprBridge *timestampExpr = [self parseExpression:timestampMap error:error]; if (!timestampExpr) return nil; - FIRExprBridge *unitExpr = [[FIRConstantBridge alloc] init:unitVal]; + __FIRExprBridge *unitExpr = [[__FIRConstantBridge alloc] init:unitVal]; return FLTNewFunctionExprBridge(@"timestamp_trunc", @[ timestampExpr, unitExpr ]); } @@ -814,7 +814,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError([NSString stringWithFormat:@"%@ requires expression", name]); return nil; } - FIRExprBridge *expr = [self parseExpression:(NSDictionary *)exprMap error:error]; + __FIRExprBridge *expr = [self parseExpression:(NSDictionary *)exprMap error:error]; if (!expr) return nil; return FLTNewFunctionExprBridge(name, @[ expr ]); } @@ -826,7 +826,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS NSString *docPath = args[@"doc_ref"]; if ([docPath isKindOfClass:[NSString class]] && docPath.length > 0) { FIRDocumentReference *ref = [self.firestore documentWithPath:docPath]; - FIRExprBridge *refExpr = [[FIRConstantBridge alloc] init:ref]; + __FIRExprBridge *refExpr = [[__FIRConstantBridge alloc] init:ref]; return FLTNewFunctionExprBridge(@"parent", @[ refExpr ]); } id exprMap = args[@"expression"]; @@ -834,7 +834,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"parent requires expression or doc_ref"); return nil; } - FIRExprBridge *expr = [self parseExpression:(NSDictionary *)exprMap error:error]; + __FIRExprBridge *expr = [self parseExpression:(NSDictionary *)exprMap error:error]; if (!expr) return nil; return FLTNewFunctionExprBridge(@"parent", @[ expr ]); } @@ -851,12 +851,12 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"timestamp_diff requires end, start, and unit"); return nil; } - FIRExprBridge *endExpr = [self parseExpression:(NSDictionary *)endMap error:error]; - FIRExprBridge *startExpr = [self parseExpression:(NSDictionary *)startMap error:error]; + __FIRExprBridge *endExpr = [self parseExpression:(NSDictionary *)endMap error:error]; + __FIRExprBridge *startExpr = [self parseExpression:(NSDictionary *)startMap error:error]; if (!endExpr || !startExpr) return nil; - FIRExprBridge *unitExpr = nil; + __FIRExprBridge *unitExpr = nil; if ([unitObj isKindOfClass:[NSString class]]) { - unitExpr = [[FIRConstantBridge alloc] init:unitObj]; + unitExpr = [[__FIRConstantBridge alloc] init:unitObj]; } else if ([unitObj isKindOfClass:[NSDictionary class]]) { unitExpr = [self parseExpression:(NSDictionary *)unitObj error:error]; } else { @@ -878,16 +878,16 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"timestamp_extract requires timestamp and part"); return nil; } - FIRExprBridge *tsExpr = [self parseExpression:(NSDictionary *)timestampMap error:error]; - FIRExprBridge *partExpr = [self parseExpression:(NSDictionary *)partMap error:error]; + __FIRExprBridge *tsExpr = [self parseExpression:(NSDictionary *)timestampMap error:error]; + __FIRExprBridge *partExpr = [self parseExpression:(NSDictionary *)partMap error:error]; if (!tsExpr || !partExpr) return nil; id tzRaw = args[@"timezone"]; if (tzRaw == nil) { return FLTNewFunctionExprBridge(@"timestamp_extract", @[ tsExpr, partExpr ]); } - FIRExprBridge *tzExpr = nil; + __FIRExprBridge *tzExpr = nil; if ([tzRaw isKindOfClass:[NSString class]]) { - tzExpr = [[FIRConstantBridge alloc] init:tzRaw]; + tzExpr = [[__FIRConstantBridge alloc] init:tzRaw]; } else if ([tzRaw isKindOfClass:[NSDictionary class]]) { tzExpr = [self parseExpression:(NSDictionary *)tzRaw error:error]; } else { @@ -909,8 +909,8 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"if_null requires expression and replacement"); return nil; } - FIRExprBridge *ifExpr = [self parseExpression:(NSDictionary *)exprMap error:error]; - FIRExprBridge *replExpr = [self parseExpression:(NSDictionary *)replMap error:error]; + __FIRExprBridge *ifExpr = [self parseExpression:(NSDictionary *)exprMap error:error]; + __FIRExprBridge *replExpr = [self parseExpression:(NSDictionary *)replMap error:error]; if (!ifExpr || !replExpr) return nil; return FLTNewFunctionExprBridge(@"if_null", @[ ifExpr, replExpr ]); } @@ -924,10 +924,10 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (error) *error = parseError(@"coalesce requires at least two expressions"); return nil; } - NSMutableArray *exprs = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *exprs = [NSMutableArray array]; for (id em in exprMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *e = [self parseExpression:(NSDictionary *)em error:error]; + __FIRExprBridge *e = [self parseExpression:(NSDictionary *)em error:error]; if (!e) return nil; [exprs addObject:e]; } @@ -948,15 +948,15 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS return nil; } NSUInteger n = exprMaps.count; - FIRExprBridge *first = [self parseBooleanExpression:exprMaps[0] error:error]; - FIRExprBridge *second = [self parseExpression:exprMaps[1] error:error]; + __FIRExprBridge *first = [self parseBooleanExpression:exprMaps[0] error:error]; + __FIRExprBridge *second = [self parseExpression:exprMaps[1] error:error]; if (!first || !second) return nil; if (n == 2) { return FLTNewFunctionExprBridge(@"switch_on", @[ first, second ]); } - NSMutableArray *rest = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *rest = [NSMutableArray array]; for (NSUInteger i = 2; i < n; i++) { - FIRExprBridge *e = nil; + __FIRExprBridge *e = nil; if ((n % 2 == 1) && (i == n - 1)) { e = [self parseExpression:exprMaps[i] error:error]; } else if (i % 2 == 0) { @@ -967,7 +967,7 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS if (!e) return nil; [rest addObject:e]; } - NSMutableArray *all = [NSMutableArray arrayWithObjects:first, second, nil]; + NSMutableArray<__FIRExprBridge *> *all = [NSMutableArray arrayWithObjects:first, second, nil]; [all addObjectsFromArray:rest]; return FLTNewFunctionExprBridge(@"switch_on", all); } @@ -983,14 +983,14 @@ - (FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NS return nil; } -- (FIRExprBridge *)rightExprFromValue:(id)value error:(NSError **)error { +- (__FIRExprBridge *)rightExprFromValue:(id)value error:(NSError **)error { if ([value isKindOfClass:[NSDictionary class]]) { return [self parseExpression:(NSDictionary *)value error:error]; } - return [[FIRConstantBridge alloc] init:value]; + return [[__FIRConstantBridge alloc] init:value]; } -- (FIRExprBridge *)parseFilterExpressionWithArgs:(NSDictionary *)args error:(NSError **)error { +- (__FIRExprBridge *)parseFilterExpressionWithArgs:(NSDictionary *)args error:(NSError **)error { // Operator-based: and/or with expressions array (from PipelineFilter.and / .or) NSString *operator= args[@"operator"]; NSArray *exprMaps = args[@"expressions"]; @@ -1007,10 +1007,10 @@ - (FIRExprBridge *)parseFilterExpressionWithArgs:(NSDictionary *)args error:(NSE } return [self parseBooleanExpression:(NSDictionary *)em error:error]; } - NSMutableArray *all = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *all = [NSMutableArray array]; for (id em in exprMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *e = [self parseBooleanExpression:(NSDictionary *)em error:error]; + __FIRExprBridge *e = [self parseBooleanExpression:(NSDictionary *)em error:error]; if (!e) return nil; [all addObject:e]; } @@ -1024,7 +1024,7 @@ - (FIRExprBridge *)parseFilterExpressionWithArgs:(NSDictionary *)args error:(NSE if (error) *error = parseError(@"filter requires operator+expressions or field"); return nil; } - FIRExprBridge *fieldExpr = [[FIRFieldBridge alloc] initWithName:fieldName]; + __FIRExprBridge *fieldExpr = [[__FIRFieldBridge alloc] initWithName:fieldName]; static NSArray *filterComparisonKeys = nil; static dispatch_once_t filterOnce; @@ -1040,45 +1040,45 @@ - (FIRExprBridge *)parseFilterExpressionWithArgs:(NSDictionary *)args error:(NSE if (value == nil) continue; if ([key isEqualToString:@"isEqualTo"]) { - FIRExprBridge *right = [self rightExprFromValue:value error:error]; + __FIRExprBridge *right = [self rightExprFromValue:value error:error]; if (!right) return nil; return FLTNewFunctionExprBridge(@"equal", @[ fieldExpr, right ]); } if ([key isEqualToString:@"isNotEqualTo"]) { - FIRExprBridge *right = [self rightExprFromValue:value error:error]; + __FIRExprBridge *right = [self rightExprFromValue:value error:error]; if (!right) return nil; return FLTNewFunctionExprBridge(@"not_equal", @[ fieldExpr, right ]); } if ([key isEqualToString:@"isGreaterThan"]) { - FIRExprBridge *right = [self rightExprFromValue:value error:error]; + __FIRExprBridge *right = [self rightExprFromValue:value error:error]; if (!right) return nil; return FLTNewFunctionExprBridge(@"greater_than", @[ fieldExpr, right ]); } if ([key isEqualToString:@"isGreaterThanOrEqualTo"]) { - FIRExprBridge *right = [self rightExprFromValue:value error:error]; + __FIRExprBridge *right = [self rightExprFromValue:value error:error]; if (!right) return nil; return FLTNewFunctionExprBridge(@"greater_than_or_equal", @[ fieldExpr, right ]); } if ([key isEqualToString:@"isLessThan"]) { - FIRExprBridge *right = [self rightExprFromValue:value error:error]; + __FIRExprBridge *right = [self rightExprFromValue:value error:error]; if (!right) return nil; return FLTNewFunctionExprBridge(@"less_than", @[ fieldExpr, right ]); } if ([key isEqualToString:@"isLessThanOrEqualTo"]) { - FIRExprBridge *right = [self rightExprFromValue:value error:error]; + __FIRExprBridge *right = [self rightExprFromValue:value error:error]; if (!right) return nil; return FLTNewFunctionExprBridge(@"less_than_or_equal", @[ fieldExpr, right ]); } if ([key isEqualToString:@"arrayContains"]) { - FIRExprBridge *right = [self rightExprFromValue:value error:error]; + __FIRExprBridge *right = [self rightExprFromValue:value error:error]; if (!right) return nil; return FLTNewFunctionExprBridge(@"array_contains", @[ fieldExpr, right ]); } if ([key isEqualToString:@"arrayContainsAny"] || [key isEqualToString:@"whereIn"]) { NSArray *valuesList = [value isKindOfClass:[NSArray class]] ? value : @[]; - NSMutableArray *valueExprs = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *valueExprs = [NSMutableArray array]; for (id v in valuesList) { - FIRExprBridge *ve = [self rightExprFromValue:v error:error]; + __FIRExprBridge *ve = [self rightExprFromValue:v error:error]; if (!ve) return nil; [valueExprs addObject:ve]; } @@ -1087,14 +1087,14 @@ - (FIRExprBridge *)parseFilterExpressionWithArgs:(NSDictionary *)args error:(NSE return nil; } // SDK expects (value, array) not (value, v1, v2, ...); wrap in "array" expr. - FIRExprBridge *valuesArrayExpr = FLTNewFunctionExprBridge(@"array", valueExprs); + __FIRExprBridge *valuesArrayExpr = FLTNewFunctionExprBridge(@"array", valueExprs); return FLTNewFunctionExprBridge(@"equal_any", @[ fieldExpr, valuesArrayExpr ]); } if ([key isEqualToString:@"whereNotIn"]) { NSArray *valuesList = [value isKindOfClass:[NSArray class]] ? value : @[]; - NSMutableArray *valueExprs = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *valueExprs = [NSMutableArray array]; for (id v in valuesList) { - FIRExprBridge *ve = [self rightExprFromValue:v error:error]; + __FIRExprBridge *ve = [self rightExprFromValue:v error:error]; if (!ve) return nil; [valueExprs addObject:ve]; } @@ -1103,15 +1103,15 @@ - (FIRExprBridge *)parseFilterExpressionWithArgs:(NSDictionary *)args error:(NSE return nil; } // SDK expects (value, array) not (value, v1, v2, ...); wrap in "array" expr. - FIRExprBridge *valuesArrayExpr = FLTNewFunctionExprBridge(@"array", valueExprs); + __FIRExprBridge *valuesArrayExpr = FLTNewFunctionExprBridge(@"array", valueExprs); return FLTNewFunctionExprBridge(@"not_equal_any", @[ fieldExpr, valuesArrayExpr ]); } if ([key isEqualToString:@"isNull"]) { - FIRExprBridge *right = [[FIRConstantBridge alloc] init:[NSNull null]]; + __FIRExprBridge *right = [[__FIRConstantBridge alloc] init:[NSNull null]]; return FLTNewFunctionExprBridge(@"equal", @[ fieldExpr, right ]); } if ([key isEqualToString:@"isNotNull"]) { - FIRExprBridge *right = [[FIRConstantBridge alloc] init:[NSNull null]]; + __FIRExprBridge *right = [[__FIRConstantBridge alloc] init:[NSNull null]]; return FLTNewFunctionExprBridge(@"not_equal", @[ fieldExpr, right ]); } } @@ -1122,7 +1122,7 @@ - (FIRExprBridge *)parseFilterExpressionWithArgs:(NSDictionary *)args error:(NSE return nil; } -- (FIRExprBridge *)parseBooleanExpression:(NSDictionary *)map +- (__FIRExprBridge *)parseBooleanExpression:(NSDictionary *)map error:(NSError **)error { return [self parseExpression:map error:error]; } @@ -1149,17 +1149,17 @@ + (NSString *)keyForExpressionMap:(NSDictionary *)em error:(NSError **)error { return nil; } -+ (NSDictionary *) ++ (NSDictionary *) parseSearchFieldsWithExpressionMaps:(NSArray *> *)exprMaps exprParser:(FLTPipelineExpressionParser *)exprParser error:(NSError **)error { - NSMutableDictionary *fields = [NSMutableDictionary dictionary]; + NSMutableDictionary *fields = [NSMutableDictionary dictionary]; NSError *parseErr = nil; for (id em in exprMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *expr = [exprParser parseExpression:em error:&parseErr]; + __FIRExprBridge *expr = [exprParser parseExpression:em error:&parseErr]; if (!expr) { if (error) *error = parseErr; return nil; @@ -1173,12 +1173,12 @@ + (NSString *)keyForExpressionMap:(NSDictionary *)em error:(NSError **)error { return fields; } -+ (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args ++ (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args exprParser:(FLTPipelineExpressionParser *)exprParser error:(NSError **)error { NSString *queryType = args[@"query_type"]; id query = args[@"query"]; - NSMutableDictionary *options = [NSMutableDictionary dictionary]; + NSMutableDictionary *options = [NSMutableDictionary dictionary]; NSError *parseErr = nil; if ([queryType isEqualToString:@"string"]) { @@ -1186,14 +1186,14 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (error) *error = parseError(@"search query_type 'string' requires string query"); return nil; } - FIRExprBridge *queryExpr = [[FIRConstantBridge alloc] init:query]; + __FIRExprBridge *queryExpr = [[__FIRConstantBridge alloc] init:query]; options[@"query"] = FLTNewFunctionExprBridge(@"document_matches", @[ queryExpr ]); } else if ([queryType isEqualToString:@"expression"]) { if (![query isKindOfClass:[NSDictionary class]]) { if (error) *error = parseError(@"search query_type 'expression' requires expression query"); return nil; } - FIRExprBridge *queryExpr = [exprParser parseBooleanExpression:query error:&parseErr]; + __FIRExprBridge *queryExpr = [exprParser parseBooleanExpression:query error:&parseErr]; if (!queryExpr) { if (error) *error = parseErr; return nil; @@ -1205,24 +1205,24 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args } NSNumber *limit = [args[@"limit"] isKindOfClass:[NSNumber class]] ? args[@"limit"] : nil; - if (limit) options[@"limit"] = [[FIRConstantBridge alloc] init:limit]; + if (limit) options[@"limit"] = [[__FIRConstantBridge alloc] init:limit]; NSNumber *offset = [args[@"offset"] isKindOfClass:[NSNumber class]] ? args[@"offset"] : nil; - if (offset) options[@"offset"] = [[FIRConstantBridge alloc] init:offset]; + if (offset) options[@"offset"] = [[__FIRConstantBridge alloc] init:offset]; NSNumber *retrievalDepth = [args[@"retrieval_depth"] isKindOfClass:[NSNumber class]] ? args[@"retrieval_depth"] : nil; if (retrievalDepth) { - options[@"retrieval_depth"] = [[FIRConstantBridge alloc] init:retrievalDepth]; + options[@"retrieval_depth"] = [[__FIRConstantBridge alloc] init:retrievalDepth]; } NSString *languageCode = [args[@"language_code"] isKindOfClass:[NSString class]] ? args[@"language_code"] : nil; if (languageCode) { - options[@"language_code"] = [[FIRConstantBridge alloc] init:languageCode]; + options[@"language_code"] = [[__FIRConstantBridge alloc] init:languageCode]; } - NSMutableArray *sort = [NSMutableArray array]; + NSMutableArray<__FIROrderingBridge *> *sort = [NSMutableArray array]; NSArray *orderingMaps = args[@"sort"]; if ([orderingMaps isKindOfClass:[NSArray class]]) { for (id om in orderingMaps) { @@ -1230,17 +1230,17 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args id exprMap = ((NSDictionary *)om)[@"expression"]; NSString *dir = ((NSDictionary *)om)[@"order_direction"]; if (![exprMap isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *expr = [exprParser parseExpression:exprMap error:&parseErr]; + __FIRExprBridge *expr = [exprParser parseExpression:exprMap error:&parseErr]; if (!expr) { if (error) *error = parseErr; return nil; } NSString *direction = [dir isEqualToString:@"asc"] ? @"ascending" : @"descending"; - [sort addObject:[[FIROrderingBridge alloc] initWithExpr:expr Direction:direction]]; + [sort addObject:[[__FIROrderingBridge alloc] initWithExpr:expr Direction:direction]]; } } - NSDictionary *addFields = @{}; + NSDictionary *addFields = @{}; NSArray *addFieldMaps = args[@"add_fields"]; if ([addFieldMaps isKindOfClass:[NSArray class]] && addFieldMaps.count > 0) { addFields = [self parseSearchFieldsWithExpressionMaps:addFieldMaps @@ -1249,19 +1249,19 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (!addFields) return nil; } - return [[FIRSearchStageBridge alloc] initWithOptions:options + return [[__FIRSearchStageBridge alloc] initWithOptions:options addFields:addFields select:@{} sort:sort]; } -+ (NSArray *) ++ (NSArray<__FIRStageBridge *> *) parseStagesWithFirestore:(FIRFirestore *)firestore stages:(NSArray *> *)stages error:(NSError **)error { FLTPipelineExpressionParser *exprParser = [[FLTPipelineExpressionParser alloc] initWithFirestore:firestore]; - NSMutableArray *stageBridges = [NSMutableArray array]; + NSMutableArray<__FIRStageBridge *> *stageBridges = [NSMutableArray array]; NSError *parseErr = nil; for (NSUInteger i = 0; i < stages.count; i++) { @@ -1279,7 +1279,7 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args NSDictionary *args = [argsObj isKindOfClass:[NSDictionary class]] ? argsObj : @{}; NSArray *argsArray = [argsObj isKindOfClass:[NSArray class]] ? argsObj : nil; - FIRStageBridge *stage = nil; + __FIRStageBridge *stage = nil; if (i == 0) { if ([stageName isEqualToString:@"collection"]) { @@ -1289,7 +1289,7 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args return nil; } FIRCollectionReference *ref = [firestore collectionWithPath:path]; - stage = [[FIRCollectionSourceStageBridge alloc] initWithRef:ref + stage = [[__FIRCollectionSourceStageBridge alloc] initWithRef:ref firestore:firestore forceIndex:nil]; } else if ([stageName isEqualToString:@"collection_group"]) { @@ -1298,10 +1298,10 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (error) *error = parseError(@"collection_group requires 'path'"); return nil; } - stage = [[FIRCollectionGroupSourceStageBridge alloc] initWithCollectionId:path + stage = [[__FIRCollectionGroupSourceStageBridge alloc] initWithCollectionId:path forceIndex:nil]; } else if ([stageName isEqualToString:@"database"]) { - stage = [[FIRDatabaseSourceStageBridge alloc] init]; + stage = [[__FIRDatabaseSourceStageBridge alloc] init]; } else if ([stageName isEqualToString:@"documents"]) { NSArray *docMaps = argsArray; if (!docMaps || docMaps.count == 0) { @@ -1314,7 +1314,7 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args NSString *path = ((NSDictionary *)docMap)[@"path"]; if (path) [refs addObject:[firestore documentWithPath:path]]; } - stage = [[FIRDocumentsSourceStageBridge alloc] initWithDocuments:refs firestore:firestore]; + stage = [[__FIRDocumentsSourceStageBridge alloc] initWithDocuments:refs firestore:firestore]; } else { if (error) *error = parseError( @@ -1330,12 +1330,12 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (error) *error = parseError(@"where requires expression"); return nil; } - FIRExprBridge *expr = [exprParser parseBooleanExpression:exprMap error:&parseErr]; + __FIRExprBridge *expr = [exprParser parseBooleanExpression:exprMap error:&parseErr]; if (!expr) { if (error) *error = parseErr; return nil; } - stage = [[FIRWhereStageBridge alloc] initWithExpr:expr]; + stage = [[__FIRWhereStageBridge alloc] initWithExpr:expr]; } else if ([stageName isEqualToString:@"search"]) { stage = [self parseSearchStageWithArgs:args exprParser:exprParser error:error]; if (!stage) return nil; @@ -1345,33 +1345,33 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (error) *error = parseError(@"limit requires numeric limit"); return nil; } - stage = [[FIRLimitStageBridge alloc] initWithLimit:limit.intValue]; + stage = [[__FIRLimitStageBridge alloc] initWithLimit:limit.intValue]; } else if ([stageName isEqualToString:@"offset"]) { NSNumber *offset = args[@"offset"]; if (![offset isKindOfClass:[NSNumber class]]) { if (error) *error = parseError(@"offset requires numeric offset"); return nil; } - stage = [[FIROffsetStageBridge alloc] initWithOffset:offset.intValue]; + stage = [[__FIROffsetStageBridge alloc] initWithOffset:offset.intValue]; } else if ([stageName isEqualToString:@"sort"]) { NSArray *orderingMaps = args[@"orderings"]; if (![orderingMaps isKindOfClass:[NSArray class]] || orderingMaps.count == 0) { if (error) *error = parseError(@"sort requires at least one ordering"); return nil; } - NSMutableArray *orderings = [NSMutableArray array]; + NSMutableArray<__FIROrderingBridge *> *orderings = [NSMutableArray array]; for (id om in orderingMaps) { if (![om isKindOfClass:[NSDictionary class]]) continue; id exprMap = ((NSDictionary *)om)[@"expression"]; NSString *dir = ((NSDictionary *)om)[@"order_direction"]; if (![exprMap isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *expr = [exprParser parseExpression:exprMap error:&parseErr]; + __FIRExprBridge *expr = [exprParser parseExpression:exprMap error:&parseErr]; if (!expr) { if (error) *error = parseErr; return nil; } NSString *direction = [dir isEqualToString:@"asc"] ? @"ascending" : @"descending"; - FIROrderingBridge *ordering = [[FIROrderingBridge alloc] initWithExpr:expr + __FIROrderingBridge *ordering = [[__FIROrderingBridge alloc] initWithExpr:expr Direction:direction]; [orderings addObject:ordering]; } @@ -1379,17 +1379,17 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (error) *error = parseError(@"sort requires at least one ordering"); return nil; } - stage = [[FIRSorStageBridge alloc] initWithOrderings:orderings]; + stage = [[__FIRSortStageBridge alloc] initWithOrderings:orderings]; } else if ([stageName isEqualToString:@"select"]) { NSArray *exprMaps = args[@"expressions"]; if (![exprMaps isKindOfClass:[NSArray class]] || exprMaps.count == 0) { if (error) *error = parseError(@"select requires at least one expression"); return nil; } - NSMutableDictionary *fields = [NSMutableDictionary dictionary]; + NSMutableDictionary *fields = [NSMutableDictionary dictionary]; for (id em in exprMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *expr = [exprParser parseExpression:em error:&parseErr]; + __FIRExprBridge *expr = [exprParser parseExpression:em error:&parseErr]; if (!expr) { if (error) *error = parseErr; return nil; @@ -1398,17 +1398,17 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (!key) return nil; fields[key] = expr; } - stage = [[FIRSelectStageBridge alloc] initWithSelections:fields]; + stage = [[__FIRSelectStageBridge alloc] initWithSelections:fields]; } else if ([stageName isEqualToString:@"add_fields"]) { NSArray *exprMaps = args[@"expressions"]; if (![exprMaps isKindOfClass:[NSArray class]] || exprMaps.count == 0) { if (error) *error = parseError(@"add_fields requires at least one expression"); return nil; } - NSMutableDictionary *fields = [NSMutableDictionary dictionary]; + NSMutableDictionary *fields = [NSMutableDictionary dictionary]; for (id em in exprMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *expr = [exprParser parseExpression:em error:&parseErr]; + __FIRExprBridge *expr = [exprParser parseExpression:em error:&parseErr]; if (!expr) { if (error) *error = parseErr; return nil; @@ -1420,24 +1420,24 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args } fields[alias] = expr; } - stage = [[FIRAddFieldsStageBridge alloc] initWithFields:fields]; + stage = [[__FIRAddFieldsStageBridge alloc] initWithFields:fields]; } else if ([stageName isEqualToString:@"remove_fields"]) { NSArray *paths = args[@"field_paths"]; if (![paths isKindOfClass:[NSArray class]] || paths.count == 0) { if (error) *error = parseError(@"remove_fields requires field_paths"); return nil; } - stage = [[FIRRemoveFieldsStageBridge alloc] initWithFields:paths]; + stage = [[__FIRRemoveFieldsStageBridge alloc] initWithFields:paths]; } else if ([stageName isEqualToString:@"distinct"]) { NSArray *exprMaps = args[@"expressions"]; if (![exprMaps isKindOfClass:[NSArray class]] || exprMaps.count == 0) { if (error) *error = parseError(@"distinct requires at least one expression"); return nil; } - NSMutableDictionary *fields = [NSMutableDictionary dictionary]; + NSMutableDictionary *fields = [NSMutableDictionary dictionary]; for (id em in exprMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *expr = [exprParser parseExpression:em error:&parseErr]; + __FIRExprBridge *expr = [exprParser parseExpression:em error:&parseErr]; if (!expr) { if (error) *error = parseErr; return nil; @@ -1446,19 +1446,19 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (!key) return nil; fields[key] = expr; } - stage = [[FIRDistinctStageBridge alloc] initWithGroups:fields]; + stage = [[__FIRDistinctStageBridge alloc] initWithGroups:fields]; } else if ([stageName isEqualToString:@"replace_with"]) { id exprMap = args[@"expression"]; if (![exprMap isKindOfClass:[NSDictionary class]]) { if (error) *error = parseError(@"replace_with requires expression"); return nil; } - FIRExprBridge *expr = [exprParser parseExpression:exprMap error:&parseErr]; + __FIRExprBridge *expr = [exprParser parseExpression:exprMap error:&parseErr]; if (!expr) { if (error) *error = parseErr; return nil; } - stage = [[FIRReplaceWithStageBridge alloc] initWithExpr:expr]; + stage = [[__FIRReplaceWithStageBridge alloc] initWithExpr:expr]; } else if ([stageName isEqualToString:@"union"]) { NSArray *nestedStages = args[@"pipeline"]; if (![nestedStages isKindOfClass:[NSArray class]] || nestedStages.count == 0) { @@ -1472,16 +1472,16 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (error) *error = parseErr; return nil; } - stage = [[FIRUnionStageBridge alloc] initWithOther:otherPipeline]; + stage = [[__FIRUnionStageBridge alloc] initWithOther:otherPipeline]; } else if ([stageName isEqualToString:@"sample"]) { NSString *type = args[@"type"]; id val = args[@"value"]; if ([type isEqualToString:@"percentage"]) { double v = [val isKindOfClass:[NSNumber class]] ? [(NSNumber *)val doubleValue] : 0; - stage = [[FIRSampleStageBridge alloc] initWithPercentage:v]; + stage = [[__FIRSampleStageBridge alloc] initWithPercentage:v]; } else { int v = [val isKindOfClass:[NSNumber class]] ? [(NSNumber *)val intValue] : 0; - stage = [[FIRSampleStageBridge alloc] initWithCount:v]; + stage = [[__FIRSampleStageBridge alloc] initWithCount:v]; } } else if ([stageName isEqualToString:@"aggregate"]) { stage = [self parseAggregateStageWithArgs:args exprParser:exprParser error:error]; @@ -1493,8 +1493,8 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (error) *error = parseError(@"unnest requires expression"); return nil; } - FIRExprBridge *fieldExpr = nil; - FIRExprBridge *aliasExpr = nil; + __FIRExprBridge *fieldExpr = nil; + __FIRExprBridge *aliasExpr = nil; NSDictionary *exprDict = (NSDictionary *)exprMap; NSString *aliasStr = nil; if ([exprDict[@"name"] isEqualToString:@"alias"]) { @@ -1522,12 +1522,12 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args } } if (!aliasStr) aliasStr = @"_"; - aliasExpr = [[FIRFieldBridge alloc] initWithName:aliasStr]; + aliasExpr = [[__FIRFieldBridge alloc] initWithName:aliasStr]; NSString *indexFieldStr = [args[@"index_field"] isKindOfClass:[NSString class]] ? args[@"index_field"] : nil; - FIRExprBridge *indexFieldExpr = - (indexFieldStr.length > 0) ? [[FIRFieldBridge alloc] initWithName:indexFieldStr] : nil; - stage = [[FIRUnnestStageBridge alloc] initWithField:fieldExpr + __FIRExprBridge *indexFieldExpr = + (indexFieldStr.length > 0) ? [[__FIRFieldBridge alloc] initWithName:indexFieldStr] : nil; + stage = [[__FIRUnnestStageBridge alloc] initWithField:fieldExpr alias:aliasExpr indexField:indexFieldExpr]; } else if ([stageName isEqualToString:@"find_nearest"]) { @@ -1550,7 +1550,7 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (error) *error = parseError(@"find_nearest requires 'distance_measure'"); return nil; } - FIRFieldBridge *embeddingField = [[FIRFieldBridge alloc] initWithName:vectorFieldName]; + __FIRFieldBridge *embeddingField = [[__FIRFieldBridge alloc] initWithName:vectorFieldName]; NSMutableArray *numbers = [NSMutableArray arrayWithCapacity:vectorValueArray.count]; for (id v in vectorValueArray) { @@ -1563,7 +1563,7 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args return nil; } FIRVectorValue *queryVector = [[FIRVectorValue alloc] initWithArray:numbers]; - stage = [[FIRFindNearestStageBridge alloc] initWithField:embeddingField + stage = [[__FIRFindNearestStageBridge alloc] initWithField:embeddingField vectorValue:queryVector distanceMeasure:distanceMeasure limit:limit @@ -1586,7 +1586,7 @@ + (FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args return stageBridges; } -+ (FIRAggregateFunctionBridge *)aggregateFunctionFromMap:(NSDictionary *)funcMap ++ (__FIRAggregateFunctionBridge *)aggregateFunctionFromMap:(NSDictionary *)funcMap exprParser:(FLTPipelineExpressionParser *)exprParser error:(NSError **)error { NSString *name = funcMap[@"name"]; @@ -1605,19 +1605,19 @@ + (FIRAggregateFunctionBridge *)aggregateFunctionFromMap:(NSDictionary *)funcMap iosName = @"max"; } NSDictionary *argsDict = funcMap[@"args"]; - NSMutableArray *argsArray = [NSMutableArray array]; + NSMutableArray<__FIRExprBridge *> *argsArray = [NSMutableArray array]; if ([argsDict isKindOfClass:[NSDictionary class]]) { id exprMap = argsDict[@"expression"]; if ([exprMap isKindOfClass:[NSDictionary class]]) { - FIRExprBridge *expr = [exprParser parseExpression:exprMap error:error]; + __FIRExprBridge *expr = [exprParser parseExpression:exprMap error:error]; if (!expr) return nil; [argsArray addObject:expr]; } } - return [[FIRAggregateFunctionBridge alloc] initWithName:iosName Args:argsArray]; + return [[__FIRAggregateFunctionBridge alloc] initWithName:iosName Args:argsArray]; } -+ (FIRStageBridge *)parseAggregateStageWithArgs:(NSDictionary *)args ++ (__FIRStageBridge *)parseAggregateStageWithArgs:(NSDictionary *)args exprParser:(FLTPipelineExpressionParser *)exprParser error:(NSError **)error { NSArray *accumulatorMaps = args[@"aggregate_functions"]; @@ -1631,7 +1631,7 @@ + (FIRStageBridge *)parseAggregateStageWithArgs:(NSDictionary *)args error:error]; } -+ (FIRStageBridge *)parseAggregateStageWithOptionsArgs:(NSDictionary *)args ++ (__FIRStageBridge *)parseAggregateStageWithOptionsArgs:(NSDictionary *)args exprParser:(FLTPipelineExpressionParser *)exprParser error:(NSError **)error { NSDictionary *stageMap = args[@"aggregate_stage"]; @@ -1654,12 +1654,12 @@ + (FIRStageBridge *)parseAggregateStageWithOptionsArgs:(NSDictionary *)args error:error]; } -+ (FIRStageBridge *)parseAggregateStageWithAccumulatorMaps:(NSArray *)accumulatorMaps ++ (__FIRStageBridge *)parseAggregateStageWithAccumulatorMaps:(NSArray *)accumulatorMaps groupMaps:(nullable NSArray *)groupMaps exprParser:(FLTPipelineExpressionParser *)exprParser error:(NSError **)error { NSError *parseErr = nil; - NSMutableDictionary *accumulators = + NSMutableDictionary *accumulators = [NSMutableDictionary dictionary]; for (id accMap in accumulatorMaps) { if (![accMap isKindOfClass:[NSDictionary class]]) continue; @@ -1675,7 +1675,7 @@ + (FIRStageBridge *)parseAggregateStageWithAccumulatorMaps:(NSArray *)accumulato if (error) *error = parseError(@"Each accumulator must have alias and aggregate_function"); return nil; } - FIRAggregateFunctionBridge *func = [self aggregateFunctionFromMap:funcMap + __FIRAggregateFunctionBridge *func = [self aggregateFunctionFromMap:funcMap exprParser:exprParser error:&parseErr]; if (!func) { @@ -1689,12 +1689,12 @@ + (FIRStageBridge *)parseAggregateStageWithAccumulatorMaps:(NSArray *)accumulato return nil; } - NSMutableDictionary *groups = [NSMutableDictionary dictionary]; + NSMutableDictionary *groups = [NSMutableDictionary dictionary]; if ([groupMaps isKindOfClass:[NSArray class]] && groupMaps.count > 0) { for (NSUInteger g = 0; g < groupMaps.count; g++) { id gm = groupMaps[g]; if (![gm isKindOfClass:[NSDictionary class]]) continue; - FIRExprBridge *expr = [exprParser parseExpression:gm error:&parseErr]; + __FIRExprBridge *expr = [exprParser parseExpression:gm error:&parseErr]; if (!expr) continue; NSError *groupKeyError = nil; NSString *groupKey = [self keyForExpressionMap:gm error:&groupKeyError]; @@ -1710,7 +1710,7 @@ + (FIRStageBridge *)parseAggregateStageWithAccumulatorMaps:(NSArray *)accumulato } } - return [[FIRAggregateStageBridge alloc] initWithAccumulators:accumulators groups:groups]; + return [[__FIRAggregateStageBridge alloc] initWithAccumulators:accumulators groups:groups]; } + (void)executePipelineWithFirestore:(FIRFirestore *)firestore @@ -1724,7 +1724,7 @@ + (void)executePipelineWithFirestore:(FIRFirestore *)firestore } NSError *parseErr = nil; - NSArray *stageBridges = [self parseStagesWithFirestore:firestore + NSArray<__FIRStageBridge *> *stageBridges = [self parseStagesWithFirestore:firestore stages:stages error:&parseErr]; if (!stageBridges) { @@ -1732,7 +1732,7 @@ + (void)executePipelineWithFirestore:(FIRFirestore *)firestore return; } - FIRPipelineBridge *pipeline = [[FIRPipelineBridge alloc] initWithStages:stageBridges + __FIRPipelineBridge *pipeline = [[__FIRPipelineBridge alloc] initWithStages:stageBridges db:firestore]; [pipeline executeWithCompletion:^(id snapshot, NSError *execError) { if (execError) { @@ -1746,11 +1746,11 @@ + (void)executePipelineWithFirestore:(FIRFirestore *)firestore + (id)buildPipelineWithFirestore:(FIRFirestore *)firestore stages:(NSArray *> *)stages error:(NSError **)error { - NSArray *stageBridges = [self parseStagesWithFirestore:firestore + NSArray<__FIRStageBridge *> *stageBridges = [self parseStagesWithFirestore:firestore stages:stages error:error]; if (!stageBridges) return nil; - return [[FIRPipelineBridge alloc] initWithStages:stageBridges db:firestore]; + return [[__FIRPipelineBridge alloc] initWithStages:stageBridges db:firestore]; } @end diff --git a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Package.swift b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Package.swift index 1df7a129260c..a449881aedac 100644 --- a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Package.swift +++ b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Package.swift @@ -26,7 +26,7 @@ let package = Package( .target( name: "firebase_ml_model_downloader", dependencies: [ - .product(name: "FirebaseMLModelDownloader", package: "firebase-ios-sdk"), + .product(name: "FirebaseCore", package: "firebase-ios-sdk"), .product(name: "firebase-core", package: "firebase_core"), .product(name: "FlutterFramework", package: "FlutterFramework"), ], diff --git a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift index 94cc55407399..b4cbabe06ef1 100644 --- a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift +++ b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift @@ -3,7 +3,9 @@ // found in the LICENSE file. import FirebaseCore -import FirebaseMLModelDownloader +#if canImport(FirebaseMLModelDownloader) + import FirebaseMLModelDownloader +#endif #if canImport(FlutterMacOS) import FlutterMacOS @@ -61,6 +63,7 @@ public class FirebaseModelDownloaderPlugin: NSObject, FLTFirebasePluginProtocol, "plugins.flutter.io/firebase_ml_model_downloader" } +#if canImport(FirebaseMLModelDownloader) func mapErrorCodes(error: Error) -> NSString { switch error { case DownloadError.notFound: @@ -201,4 +204,17 @@ public class FirebaseModelDownloaderPlugin: NSObject, FLTFirebasePluginProtocol, let app: FirebaseApp = FLTFirebasePlugin.firebaseAppNamed(arguments["appName"] as! String)! return ModelDownloader.modelDownloader(app: app) } +#else + public func handle(_: FlutterMethodCall, result: @escaping FlutterResult) { + result( + FLTFirebasePlugin.createFlutterError( + fromCode: "unimplemented", + message: + "Firebase ML Model Downloader is not in the Firebase Apple SDK 13 Swift package. CocoaPods remains on Firebase Apple SDK 12.19.0, which still includes it.", + optionalDetails: nil, + andOptionalNSError: nil + ) + ) + } +#endif } diff --git a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/macos/firebase_ml_model_downloader/Package.swift b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/macos/firebase_ml_model_downloader/Package.swift index cd20c7b2f7f4..a12f45d5eb0b 100644 --- a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/macos/firebase_ml_model_downloader/Package.swift +++ b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/macos/firebase_ml_model_downloader/Package.swift @@ -26,7 +26,7 @@ let package = Package( .target( name: "firebase_ml_model_downloader", dependencies: [ - .product(name: "FirebaseMLModelDownloader", package: "firebase-ios-sdk"), + .product(name: "FirebaseCore", package: "firebase-ios-sdk"), .product(name: "firebase-core", package: "firebase_core"), .product(name: "FlutterFramework", package: "FlutterFramework"), ], From 74666ce30686e563121f1c39dba414e644eec0ba Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Mon, 12 Oct 2026 01:56:52 +0000 Subject: [PATCH 2/5] fix(firestore): keep pipeline bridges compiling on CocoaPods 12.19.0 SDK 13 prefixes the bridge classes, and the same parser is still built against the unprefixed 12.19.0 names. --- .../ios/cloud_firestore/Package.swift | 1 + .../cloud_firestore/FLTPipelineParser.m | 39 +++++++++++++++++++ .../macos/cloud_firestore/Package.swift | 1 + 3 files changed, 41 insertions(+) diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Package.swift b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Package.swift index 725e56e647e8..c7dd750f7057 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Package.swift +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Package.swift @@ -39,6 +39,7 @@ let package = Package( .headerSearchPath("include/cloud_firestore/Public"), .define("LIBRARY_VERSION", to: "\"\(libraryVersion)\""), .define("LIBRARY_NAME", to: "\"flutter-fire-fst\""), + .define("FLT_FIREBASE_SDK_13"), ] ) ] diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m index c4fdc9ec6601..19dfd9c82da7 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m @@ -50,6 +50,45 @@ #if FLT_PIPELINE_AVAILABLE +// Swift Package Manager builds against Firebase Apple SDK 13, which prefixes +// these classes with __. CocoaPods stays on 12.19.0, where the same classes +// are unprefixed and the sort stage is FIRSorStageBridge. Package.swift sets +// FLT_FIREBASE_SDK_13 so these aliases are skipped. Classes that were already +// __FIR* in 12.19.0 are left alone. +#ifndef FLT_FIREBASE_SDK_13 +@compatibility_alias __FIRExprBridge FIRExprBridge; +@compatibility_alias __FIRFieldBridge FIRFieldBridge; +@compatibility_alias __FIRConstantBridge FIRConstantBridge; +@compatibility_alias __FIRFunctionExprBridge FIRFunctionExprBridge; +@compatibility_alias __FIRAggregateFunctionBridge FIRAggregateFunctionBridge; +@compatibility_alias __FIROrderingBridge FIROrderingBridge; +@compatibility_alias __FIRStageBridge FIRStageBridge; +@compatibility_alias __FIRCollectionSourceStageBridge \ + FIRCollectionSourceStageBridge; +@compatibility_alias __FIRDatabaseSourceStageBridge \ + FIRDatabaseSourceStageBridge; +@compatibility_alias __FIRCollectionGroupSourceStageBridge \ + FIRCollectionGroupSourceStageBridge; +@compatibility_alias __FIRDocumentsSourceStageBridge \ + FIRDocumentsSourceStageBridge; +@compatibility_alias __FIRWhereStageBridge FIRWhereStageBridge; +@compatibility_alias __FIRLimitStageBridge FIRLimitStageBridge; +@compatibility_alias __FIROffsetStageBridge FIROffsetStageBridge; +@compatibility_alias __FIRAddFieldsStageBridge FIRAddFieldsStageBridge; +@compatibility_alias __FIRRemoveFieldsStageBridge FIRRemoveFieldsStageBridge; +@compatibility_alias __FIRSelectStageBridge FIRSelectStageBridge; +@compatibility_alias __FIRDistinctStageBridge FIRDistinctStageBridge; +@compatibility_alias __FIRAggregateStageBridge FIRAggregateStageBridge; +@compatibility_alias __FIRFindNearestStageBridge FIRFindNearestStageBridge; +@compatibility_alias __FIRSearchStageBridge FIRSearchStageBridge; +@compatibility_alias __FIRSortStageBridge FIRSorStageBridge; +@compatibility_alias __FIRReplaceWithStageBridge FIRReplaceWithStageBridge; +@compatibility_alias __FIRSampleStageBridge FIRSampleStageBridge; +@compatibility_alias __FIRUnionStageBridge FIRUnionStageBridge; +@compatibility_alias __FIRUnnestStageBridge FIRUnnestStageBridge; +@compatibility_alias __FIRPipelineBridge FIRPipelineBridge; +#endif + // Firebase iOS SDK versions differ: some expose initWithName:Args:Options:, others // initWithName:Args:. @interface __FIRFunctionExprBridge (FLTSDKCompat) diff --git a/packages/cloud_firestore/cloud_firestore/macos/cloud_firestore/Package.swift b/packages/cloud_firestore/cloud_firestore/macos/cloud_firestore/Package.swift index 454455df9a56..3c68c344f01c 100644 --- a/packages/cloud_firestore/cloud_firestore/macos/cloud_firestore/Package.swift +++ b/packages/cloud_firestore/cloud_firestore/macos/cloud_firestore/Package.swift @@ -39,6 +39,7 @@ let package = Package( .headerSearchPath("include/cloud_firestore/Public"), .define("LIBRARY_VERSION", to: "\"\(libraryVersion)\""), .define("LIBRARY_NAME", to: "\"flutter-fire-fst\""), + .define("FLT_FIREBASE_SDK_13"), ] ) ] From dce61e5af78695976f0d228bbec3d547a648de53 Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Mon, 12 Oct 2026 02:01:04 +0000 Subject: [PATCH 3/5] style(apple): format the SDK 13 pipeline parser and model downloader clang-format and swift-format reindent the bridge rename and the canImport guard. --- .../cloud_firestore/FLTPipelineParser.m | 104 +++---- .../FirebaseModelDownloaderPlugin.swift | 268 +++++++++--------- 2 files changed, 188 insertions(+), 184 deletions(-) diff --git a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m index 19dfd9c82da7..f416fbc2bd4d 100644 --- a/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m +++ b/packages/cloud_firestore/cloud_firestore/ios/cloud_firestore/Sources/cloud_firestore/FLTPipelineParser.m @@ -63,14 +63,10 @@ @compatibility_alias __FIRAggregateFunctionBridge FIRAggregateFunctionBridge; @compatibility_alias __FIROrderingBridge FIROrderingBridge; @compatibility_alias __FIRStageBridge FIRStageBridge; -@compatibility_alias __FIRCollectionSourceStageBridge \ - FIRCollectionSourceStageBridge; -@compatibility_alias __FIRDatabaseSourceStageBridge \ - FIRDatabaseSourceStageBridge; -@compatibility_alias __FIRCollectionGroupSourceStageBridge \ - FIRCollectionGroupSourceStageBridge; -@compatibility_alias __FIRDocumentsSourceStageBridge \ - FIRDocumentsSourceStageBridge; +@compatibility_alias __FIRCollectionSourceStageBridge FIRCollectionSourceStageBridge; +@compatibility_alias __FIRDatabaseSourceStageBridge FIRDatabaseSourceStageBridge; +@compatibility_alias __FIRCollectionGroupSourceStageBridge FIRCollectionGroupSourceStageBridge; +@compatibility_alias __FIRDocumentsSourceStageBridge FIRDocumentsSourceStageBridge; @compatibility_alias __FIRWhereStageBridge FIRWhereStageBridge; @compatibility_alias __FIRLimitStageBridge FIRLimitStageBridge; @compatibility_alias __FIROffsetStageBridge FIROffsetStageBridge; @@ -99,7 +95,7 @@ - (instancetype)initWithName:(NSString *)name Args:(NSArray<__FIRExprBridge *> * @end static __FIRFunctionExprBridge *FLTNewFunctionExprBridge(NSString *name, - NSArray<__FIRExprBridge *> *args) { + NSArray<__FIRExprBridge *> *args) { __FIRFunctionExprBridge *obj = [__FIRFunctionExprBridge alloc]; if ([obj respondsToSelector:@selector(initWithName:Args:Options:)]) { return [obj initWithName:name Args:args Options:nil]; @@ -118,7 +114,7 @@ @interface FLTPipelineExpressionParser : NSObject - (instancetype)initWithFirestore:(FIRFirestore *)firestore; - (__FIRExprBridge *)parseExpression:(NSDictionary *)map error:(NSError **)error; - (__FIRExprBridge *)parseBooleanExpression:(NSDictionary *)map - error:(NSError **)error; + error:(NSError **)error; - (__FIRExprBridge *)rightExprFromValue:(id)value error:(NSError **)error; @end @@ -267,8 +263,8 @@ - (__FIRExprBridge *)parseExpression:(NSDictionary *)map error:( return nil; } __FIRExprBridge *expr = [name isEqualToString:@"not"] - ? [self parseBooleanExpression:exprMap error:error] - : [self parseExpression:exprMap error:error]; + ? [self parseBooleanExpression:exprMap error:error] + : [self parseExpression:exprMap error:error]; if (!expr) return nil; return FLTNewFunctionExprBridge(name, @[ expr ]); } @@ -670,8 +666,8 @@ - (__FIRExprBridge *)parseExpression:(NSDictionary *)map error:( __FIRExprBridge *expr = [self parseExpression:exprMap error:error]; __FIRExprBridge *transform = [self parseExpression:transformMap error:error]; if (!expr || !transform) return nil; - NSMutableArray<__FIRExprBridge *> *transformArgs = - [NSMutableArray arrayWithObjects:expr, [[__FIRConstantBridge alloc] init:elementAlias], nil]; + NSMutableArray<__FIRExprBridge *> *transformArgs = [NSMutableArray + arrayWithObjects:expr, [[__FIRConstantBridge alloc] init:elementAlias], nil]; if (withIndex) { [transformArgs addObject:[[__FIRConstantBridge alloc] init:indexAlias]]; } @@ -1162,7 +1158,7 @@ - (__FIRExprBridge *)parseFilterExpressionWithArgs:(NSDictionary *)args error:(N } - (__FIRExprBridge *)parseBooleanExpression:(NSDictionary *)map - error:(NSError **)error { + error:(NSError **)error { return [self parseExpression:map error:error]; } @@ -1213,8 +1209,8 @@ + (NSString *)keyForExpressionMap:(NSDictionary *)em error:(NSError **)error { } + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args - exprParser:(FLTPipelineExpressionParser *)exprParser - error:(NSError **)error { + exprParser:(FLTPipelineExpressionParser *)exprParser + error:(NSError **)error { NSString *queryType = args[@"query_type"]; id query = args[@"query"]; NSMutableDictionary *options = [NSMutableDictionary dictionary]; @@ -1289,9 +1285,9 @@ + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args } return [[__FIRSearchStageBridge alloc] initWithOptions:options - addFields:addFields - select:@{} - sort:sort]; + addFields:addFields + select:@{} + sort:sort]; } + (NSArray<__FIRStageBridge *> *) @@ -1329,8 +1325,8 @@ + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args } FIRCollectionReference *ref = [firestore collectionWithPath:path]; stage = [[__FIRCollectionSourceStageBridge alloc] initWithRef:ref - firestore:firestore - forceIndex:nil]; + firestore:firestore + forceIndex:nil]; } else if ([stageName isEqualToString:@"collection_group"]) { NSString *path = args[@"path"]; if (!path) { @@ -1338,7 +1334,7 @@ + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args return nil; } stage = [[__FIRCollectionGroupSourceStageBridge alloc] initWithCollectionId:path - forceIndex:nil]; + forceIndex:nil]; } else if ([stageName isEqualToString:@"database"]) { stage = [[__FIRDatabaseSourceStageBridge alloc] init]; } else if ([stageName isEqualToString:@"documents"]) { @@ -1353,7 +1349,8 @@ + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args NSString *path = ((NSDictionary *)docMap)[@"path"]; if (path) [refs addObject:[firestore documentWithPath:path]]; } - stage = [[__FIRDocumentsSourceStageBridge alloc] initWithDocuments:refs firestore:firestore]; + stage = [[__FIRDocumentsSourceStageBridge alloc] initWithDocuments:refs + firestore:firestore]; } else { if (error) *error = parseError( @@ -1411,7 +1408,7 @@ + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args } NSString *direction = [dir isEqualToString:@"asc"] ? @"ascending" : @"descending"; __FIROrderingBridge *ordering = [[__FIROrderingBridge alloc] initWithExpr:expr - Direction:direction]; + Direction:direction]; [orderings addObject:ordering]; } if (orderings.count == 0) { @@ -1425,7 +1422,8 @@ + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (error) *error = parseError(@"select requires at least one expression"); return nil; } - NSMutableDictionary *fields = [NSMutableDictionary dictionary]; + NSMutableDictionary *fields = + [NSMutableDictionary dictionary]; for (id em in exprMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; __FIRExprBridge *expr = [exprParser parseExpression:em error:&parseErr]; @@ -1444,7 +1442,8 @@ + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (error) *error = parseError(@"add_fields requires at least one expression"); return nil; } - NSMutableDictionary *fields = [NSMutableDictionary dictionary]; + NSMutableDictionary *fields = + [NSMutableDictionary dictionary]; for (id em in exprMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; __FIRExprBridge *expr = [exprParser parseExpression:em error:&parseErr]; @@ -1473,7 +1472,8 @@ + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args if (error) *error = parseError(@"distinct requires at least one expression"); return nil; } - NSMutableDictionary *fields = [NSMutableDictionary dictionary]; + NSMutableDictionary *fields = + [NSMutableDictionary dictionary]; for (id em in exprMaps) { if (![em isKindOfClass:[NSDictionary class]]) continue; __FIRExprBridge *expr = [exprParser parseExpression:em error:&parseErr]; @@ -1565,10 +1565,11 @@ + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args NSString *indexFieldStr = [args[@"index_field"] isKindOfClass:[NSString class]] ? args[@"index_field"] : nil; __FIRExprBridge *indexFieldExpr = - (indexFieldStr.length > 0) ? [[__FIRFieldBridge alloc] initWithName:indexFieldStr] : nil; + (indexFieldStr.length > 0) ? [[__FIRFieldBridge alloc] initWithName:indexFieldStr] + : nil; stage = [[__FIRUnnestStageBridge alloc] initWithField:fieldExpr - alias:aliasExpr - indexField:indexFieldExpr]; + alias:aliasExpr + indexField:indexFieldExpr]; } else if ([stageName isEqualToString:@"find_nearest"]) { NSString *vectorFieldName = args[@"vector_field"]; NSArray *vectorValueArray = args[@"vector_value"]; @@ -1603,10 +1604,10 @@ + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args } FIRVectorValue *queryVector = [[FIRVectorValue alloc] initWithArray:numbers]; stage = [[__FIRFindNearestStageBridge alloc] initWithField:embeddingField - vectorValue:queryVector - distanceMeasure:distanceMeasure - limit:limit - distanceField:distanceField]; + vectorValue:queryVector + distanceMeasure:distanceMeasure + limit:limit + distanceField:distanceField]; } else { if (error) *error = parseError([NSString stringWithFormat:@"Unknown pipeline stage: %@", stageName]); @@ -1626,8 +1627,8 @@ + (__FIRStageBridge *)parseSearchStageWithArgs:(NSDictionary *)args } + (__FIRAggregateFunctionBridge *)aggregateFunctionFromMap:(NSDictionary *)funcMap - exprParser:(FLTPipelineExpressionParser *)exprParser - error:(NSError **)error { + exprParser:(FLTPipelineExpressionParser *)exprParser + error:(NSError **)error { NSString *name = funcMap[@"name"]; if (![name isKindOfClass:[NSString class]]) { if (error) *error = parseError(@"Aggregate function must have a 'name'"); @@ -1657,8 +1658,8 @@ + (__FIRAggregateFunctionBridge *)aggregateFunctionFromMap:(NSDictionary *)funcM } + (__FIRStageBridge *)parseAggregateStageWithArgs:(NSDictionary *)args - exprParser:(FLTPipelineExpressionParser *)exprParser - error:(NSError **)error { + exprParser:(FLTPipelineExpressionParser *)exprParser + error:(NSError **)error { NSArray *accumulatorMaps = args[@"aggregate_functions"]; if (![accumulatorMaps isKindOfClass:[NSArray class]] || accumulatorMaps.count == 0) { if (error) *error = parseError(@"aggregate requires aggregate_functions"); @@ -1671,8 +1672,8 @@ + (__FIRStageBridge *)parseAggregateStageWithArgs:(NSDictionary *)args } + (__FIRStageBridge *)parseAggregateStageWithOptionsArgs:(NSDictionary *)args - exprParser:(FLTPipelineExpressionParser *)exprParser - error:(NSError **)error { + exprParser:(FLTPipelineExpressionParser *)exprParser + error:(NSError **)error { NSDictionary *stageMap = args[@"aggregate_stage"]; if (![stageMap isKindOfClass:[NSDictionary class]]) { if (error) *error = parseError(@"aggregate_with_options requires aggregate_stage"); @@ -1694,9 +1695,10 @@ + (__FIRStageBridge *)parseAggregateStageWithOptionsArgs:(NSDictionary *)args } + (__FIRStageBridge *)parseAggregateStageWithAccumulatorMaps:(NSArray *)accumulatorMaps - groupMaps:(nullable NSArray *)groupMaps - exprParser:(FLTPipelineExpressionParser *)exprParser - error:(NSError **)error { + groupMaps:(nullable NSArray *)groupMaps + exprParser: + (FLTPipelineExpressionParser *)exprParser + error:(NSError **)error { NSError *parseErr = nil; NSMutableDictionary *accumulators = [NSMutableDictionary dictionary]; @@ -1715,8 +1717,8 @@ + (__FIRStageBridge *)parseAggregateStageWithAccumulatorMaps:(NSArray *)accumula return nil; } __FIRAggregateFunctionBridge *func = [self aggregateFunctionFromMap:funcMap - exprParser:exprParser - error:&parseErr]; + exprParser:exprParser + error:&parseErr]; if (!func) { if (error) *error = parseErr; return nil; @@ -1764,15 +1766,15 @@ + (void)executePipelineWithFirestore:(FIRFirestore *)firestore NSError *parseErr = nil; NSArray<__FIRStageBridge *> *stageBridges = [self parseStagesWithFirestore:firestore - stages:stages - error:&parseErr]; + stages:stages + error:&parseErr]; if (!stageBridges) { completion(nil, parseErr); return; } __FIRPipelineBridge *pipeline = [[__FIRPipelineBridge alloc] initWithStages:stageBridges - db:firestore]; + db:firestore]; [pipeline executeWithCompletion:^(id snapshot, NSError *execError) { if (execError) { completion(nil, execError); @@ -1786,8 +1788,8 @@ + (id)buildPipelineWithFirestore:(FIRFirestore *)firestore stages:(NSArray *> *)stages error:(NSError **)error { NSArray<__FIRStageBridge *> *stageBridges = [self parseStagesWithFirestore:firestore - stages:stages - error:error]; + stages:stages + error:error]; if (!stageBridges) return nil; return [[__FIRPipelineBridge alloc] initWithStages:stageBridges db:firestore]; } diff --git a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift index b4cbabe06ef1..b65745ff4e2c 100644 --- a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift +++ b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/ios/firebase_ml_model_downloader/Sources/firebase_ml_model_downloader/FirebaseModelDownloaderPlugin.swift @@ -3,6 +3,7 @@ // found in the LICENSE file. import FirebaseCore + #if canImport(FirebaseMLModelDownloader) import FirebaseMLModelDownloader #endif @@ -63,158 +64,159 @@ public class FirebaseModelDownloaderPlugin: NSObject, FLTFirebasePluginProtocol, "plugins.flutter.io/firebase_ml_model_downloader" } -#if canImport(FirebaseMLModelDownloader) - func mapErrorCodes(error: Error) -> NSString { - switch error { - case DownloadError.notFound: - return "no-existing-model" - case DownloadError.permissionDenied: - return "permission-denied" - case DownloadError.notFound: - return "server-unreachable" - case DownloadError.failedPrecondition: - return "failed-precondition" - case DownloadedModelError.fileIOError: - return "file-io-error" - case DownloadedModelError.internalError: - return "internal-error" - default: - return "unknown" + #if canImport(FirebaseMLModelDownloader) + func mapErrorCodes(error: Error) -> NSString { + switch error { + case DownloadError.notFound: + return "no-existing-model" + case DownloadError.permissionDenied: + return "permission-denied" + case DownloadError.notFound: + return "server-unreachable" + case DownloadError.failedPrecondition: + return "failed-precondition" + case DownloadedModelError.fileIOError: + return "file-io-error" + case DownloadedModelError.internalError: + return "internal-error" + default: + return "unknown" + } } - } - public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { - let errorBlock: FLTFirebaseMethodCallErrorBlock = { (code, message, details, error: Error?) in - var errorDetails = [String: Any?]() + public func handle(_ call: FlutterMethodCall, result: @escaping FlutterResult) { + let errorBlock: FLTFirebaseMethodCallErrorBlock = { (code, message, details, error: Error?) in + var errorDetails = [String: Any?]() - errorDetails["code"] = code ?? self.mapErrorCodes(error: error! as NSError) - errorDetails["message"] = - message ?? error? - .localizedDescription ?? "An unknown error has occurred." - errorDetails["additionalData"] = - details ?? ["code": errorDetails["code"], "message": errorDetails["message"]] + errorDetails["code"] = code ?? self.mapErrorCodes(error: error! as NSError) + errorDetails["message"] = + message ?? error? + .localizedDescription ?? "An unknown error has occurred." + errorDetails["additionalData"] = + details ?? ["code": errorDetails["code"], "message": errorDetails["message"]] - if code == "unknown" { - NSLog("FLTFirebaseModelDownloader: An error occurred while calling method %@", call.method) - } + if code == "unknown" { + NSLog( + "FLTFirebaseModelDownloader: An error occurred while calling method %@", call.method) + } - result( - FLTFirebasePlugin.createFlutterError( - fromCode: errorDetails["code"] as! String, - message: errorDetails["message"] as! String, - optionalDetails: errorDetails[ - "additionalData" - ] as? [AnyHashable: Any], - andOptionalNSError: nil + result( + FLTFirebasePlugin.createFlutterError( + fromCode: errorDetails["code"] as! String, + message: errorDetails["message"] as! String, + optionalDetails: errorDetails[ + "additionalData" + ] as? [AnyHashable: Any], + andOptionalNSError: nil + ) ) - ) - } + } - let result = FLTFirebaseMethodCallResult.create(success: result, andErrorBlock: errorBlock) - if call.method == "FirebaseModelDownloader#getModel" { - getModel(arguments: call.arguments as! [String: Any], result: result) - } - if call.method == "FirebaseModelDownloader#listDownloadedModels" { - listDownloadedModels(arguments: call.arguments as! [String: Any], result: result) - } - if call.method == "FirebaseModelDownloader#deleteDownloadedModel" { - deleteDownloadedModel(arguments: call.arguments as! [String: Any], result: result) + let result = FLTFirebaseMethodCallResult.create(success: result, andErrorBlock: errorBlock) + if call.method == "FirebaseModelDownloader#getModel" { + getModel(arguments: call.arguments as! [String: Any], result: result) + } + if call.method == "FirebaseModelDownloader#listDownloadedModels" { + listDownloadedModels(arguments: call.arguments as! [String: Any], result: result) + } + if call.method == "FirebaseModelDownloader#deleteDownloadedModel" { + deleteDownloadedModel(arguments: call.arguments as! [String: Any], result: result) + } } - } - func listDownloadedModels( - arguments: [String: Any], - result: FLTFirebaseMethodCallResult - ) { - let modelDownloader = modelDownloaderFromArguments(arguments: arguments) - - modelDownloader?.listDownloadedModels { response in - switch response { - case .success(let customModel): - let responseList: [[String: Any]] = customModel.map { - [ - "filePath": $0.path, - "size": $0.size, - "hash": $0.hash, - "name": $0.name, - ] + func listDownloadedModels( + arguments: [String: Any], + result: FLTFirebaseMethodCallResult + ) { + let modelDownloader = modelDownloaderFromArguments(arguments: arguments) + + modelDownloader?.listDownloadedModels { response in + switch response { + case .success(let customModel): + let responseList: [[String: Any]] = customModel.map { + [ + "filePath": $0.path, + "size": $0.size, + "hash": $0.hash, + "name": $0.name, + ] + } + result.success(responseList) + case .failure(let error): + result.error(nil, nil, nil, error) } - result.success(responseList) - case .failure(let error): - result.error(nil, nil, nil, error) } } - } - func getModel(arguments: [String: Any], result: FLTFirebaseMethodCallResult) { - let modelDownloader = modelDownloaderFromArguments(arguments: arguments) - let modelName = arguments["modelName"] as! String - let downloadType = arguments["downloadType"] as! String - let conditions = arguments["conditions"] as! [String: Bool] - - let cellularAccess = conditions["iosAllowsCellularAccess"]! - var downloadTypeEnum = ModelDownloadType.localModel - if downloadType == "local" { - downloadTypeEnum = ModelDownloadType.localModel - } else if downloadType == "local_background" { - downloadTypeEnum = ModelDownloadType.localModelUpdateInBackground - } else if downloadType == "latest" { - downloadTypeEnum = ModelDownloadType.latestModel - } + func getModel(arguments: [String: Any], result: FLTFirebaseMethodCallResult) { + let modelDownloader = modelDownloaderFromArguments(arguments: arguments) + let modelName = arguments["modelName"] as! String + let downloadType = arguments["downloadType"] as! String + let conditions = arguments["conditions"] as! [String: Bool] + + let cellularAccess = conditions["iosAllowsCellularAccess"]! + var downloadTypeEnum = ModelDownloadType.localModel + if downloadType == "local" { + downloadTypeEnum = ModelDownloadType.localModel + } else if downloadType == "local_background" { + downloadTypeEnum = ModelDownloadType.localModelUpdateInBackground + } else if downloadType == "latest" { + downloadTypeEnum = ModelDownloadType.latestModel + } - let modelDownloadConditions = ModelDownloadConditions(allowsCellularAccess: cellularAccess) - - modelDownloader?.getModel( - name: modelName, - downloadType: downloadTypeEnum, - conditions: modelDownloadConditions - ) { response in - switch response { - case .success(let customModel): - result.success([ - "filePath": customModel.path, - "size": customModel.size, - "hash": customModel.hash, - "name": customModel.name, - ]) - case .failure(let error): - result.error(nil, nil, nil, error) + let modelDownloadConditions = ModelDownloadConditions(allowsCellularAccess: cellularAccess) + + modelDownloader?.getModel( + name: modelName, + downloadType: downloadTypeEnum, + conditions: modelDownloadConditions + ) { response in + switch response { + case .success(let customModel): + result.success([ + "filePath": customModel.path, + "size": customModel.size, + "hash": customModel.hash, + "name": customModel.name, + ]) + case .failure(let error): + result.error(nil, nil, nil, error) + } } } - } - func deleteDownloadedModel( - arguments: [String: Any], - result: FLTFirebaseMethodCallResult - ) { - let modelDownloader = modelDownloaderFromArguments(arguments: arguments) - let modelName = arguments["modelName"] - - modelDownloader?.deleteDownloadedModel(name: modelName as! String) { response in - switch response { - case .success(): - result.success(nil) - case .failure(let error): - result.error(nil, nil, nil, error) + func deleteDownloadedModel( + arguments: [String: Any], + result: FLTFirebaseMethodCallResult + ) { + let modelDownloader = modelDownloaderFromArguments(arguments: arguments) + let modelName = arguments["modelName"] + + modelDownloader?.deleteDownloadedModel(name: modelName as! String) { response in + switch response { + case .success(): + result.success(nil) + case .failure(let error): + result.error(nil, nil, nil, error) + } } } - } - func modelDownloaderFromArguments(arguments: [String: Any]) -> ModelDownloader? { - let app: FirebaseApp = FLTFirebasePlugin.firebaseAppNamed(arguments["appName"] as! String)! - return ModelDownloader.modelDownloader(app: app) - } -#else - public func handle(_: FlutterMethodCall, result: @escaping FlutterResult) { - result( - FLTFirebasePlugin.createFlutterError( - fromCode: "unimplemented", - message: - "Firebase ML Model Downloader is not in the Firebase Apple SDK 13 Swift package. CocoaPods remains on Firebase Apple SDK 12.19.0, which still includes it.", - optionalDetails: nil, - andOptionalNSError: nil + func modelDownloaderFromArguments(arguments: [String: Any]) -> ModelDownloader? { + let app: FirebaseApp = FLTFirebasePlugin.firebaseAppNamed(arguments["appName"] as! String)! + return ModelDownloader.modelDownloader(app: app) + } + #else + public func handle(_: FlutterMethodCall, result: @escaping FlutterResult) { + result( + FLTFirebasePlugin.createFlutterError( + fromCode: "unimplemented", + message: + "Firebase ML Model Downloader is not in the Firebase Apple SDK 13 Swift package. CocoaPods remains on Firebase Apple SDK 12.19.0, which still includes it.", + optionalDetails: nil, + andOptionalNSError: nil + ) ) - ) - } -#endif + } + #endif } From 1265a9a5126e16d29e4f9efbb4cd6b62d12fd26b Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Mon, 12 Oct 2026 09:43:39 +0000 Subject: [PATCH 4/5] refactor(apple)!: require macOS 11 for the Swift packages on SDK 13 Firebase Apple SDK 13 requires macOS 11. CocoaPods stays on 10.15 because that path is still SDK 12.19.0. --- .../cloud_firestore/macos/cloud_firestore/Package.swift | 2 +- .../cloud_functions/macos/cloud_functions/Package.swift | 2 +- .../firebase_ai/firebase_ai/macos/firebase_ai/Package.swift | 2 +- .../firebase_analytics/macos/firebase_analytics/Package.swift | 2 +- .../firebase_app_check/macos/firebase_app_check/Package.swift | 2 +- .../macos/firebase_app_installations/Package.swift | 2 +- .../firebase_auth/macos/firebase_auth/Package.swift | 2 +- .../firebase_core/macos/firebase_core/Package.swift | 2 +- .../macos/firebase_crashlytics/Package.swift | 2 +- .../firebase_database/macos/firebase_database/Package.swift | 2 +- .../firebase_messaging/macos/firebase_messaging/Package.swift | 2 +- .../macos/firebase_ml_model_downloader/Package.swift | 2 +- .../macos/firebase_remote_config/Package.swift | 2 +- .../firebase_storage/macos/firebase_storage/Package.swift | 2 +- 14 files changed, 14 insertions(+), 14 deletions(-) diff --git a/packages/cloud_firestore/cloud_firestore/macos/cloud_firestore/Package.swift b/packages/cloud_firestore/cloud_firestore/macos/cloud_firestore/Package.swift index 3c68c344f01c..e583e7311128 100644 --- a/packages/cloud_firestore/cloud_firestore/macos/cloud_firestore/Package.swift +++ b/packages/cloud_firestore/cloud_firestore/macos/cloud_firestore/Package.swift @@ -13,7 +13,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "cloud_firestore", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "cloud-firestore", targets: ["cloud_firestore"]) diff --git a/packages/cloud_functions/cloud_functions/macos/cloud_functions/Package.swift b/packages/cloud_functions/cloud_functions/macos/cloud_functions/Package.swift index d4e5242c7b49..7f56d8dcfef3 100644 --- a/packages/cloud_functions/cloud_functions/macos/cloud_functions/Package.swift +++ b/packages/cloud_functions/cloud_functions/macos/cloud_functions/Package.swift @@ -12,7 +12,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "cloud_functions", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "cloud-functions", targets: ["cloud_functions"]) diff --git a/packages/firebase_ai/firebase_ai/macos/firebase_ai/Package.swift b/packages/firebase_ai/firebase_ai/macos/firebase_ai/Package.swift index 4770c08d9644..9507aca17611 100644 --- a/packages/firebase_ai/firebase_ai/macos/firebase_ai/Package.swift +++ b/packages/firebase_ai/firebase_ai/macos/firebase_ai/Package.swift @@ -10,7 +10,7 @@ import PackageDescription let package = Package( name: "firebase_ai", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-ai", targets: ["firebase_ai"]) diff --git a/packages/firebase_analytics/firebase_analytics/macos/firebase_analytics/Package.swift b/packages/firebase_analytics/firebase_analytics/macos/firebase_analytics/Package.swift index 56fe23401099..693a9d20f27c 100644 --- a/packages/firebase_analytics/firebase_analytics/macos/firebase_analytics/Package.swift +++ b/packages/firebase_analytics/firebase_analytics/macos/firebase_analytics/Package.swift @@ -12,7 +12,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "firebase_analytics", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-analytics", targets: ["firebase_analytics"]) diff --git a/packages/firebase_app_check/firebase_app_check/macos/firebase_app_check/Package.swift b/packages/firebase_app_check/firebase_app_check/macos/firebase_app_check/Package.swift index 14c6d35d69e8..c3e4f3ddb963 100644 --- a/packages/firebase_app_check/firebase_app_check/macos/firebase_app_check/Package.swift +++ b/packages/firebase_app_check/firebase_app_check/macos/firebase_app_check/Package.swift @@ -12,7 +12,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "firebase_app_check", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-app-check", targets: ["firebase_app_check"]) diff --git a/packages/firebase_app_installations/firebase_app_installations/macos/firebase_app_installations/Package.swift b/packages/firebase_app_installations/firebase_app_installations/macos/firebase_app_installations/Package.swift index be42814c97f3..151359045518 100644 --- a/packages/firebase_app_installations/firebase_app_installations/macos/firebase_app_installations/Package.swift +++ b/packages/firebase_app_installations/firebase_app_installations/macos/firebase_app_installations/Package.swift @@ -12,7 +12,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "firebase_app_installations", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-app-installations", targets: ["firebase_app_installations"]) diff --git a/packages/firebase_auth/firebase_auth/macos/firebase_auth/Package.swift b/packages/firebase_auth/firebase_auth/macos/firebase_auth/Package.swift index 38d3799039c3..f8f89cdb3832 100644 --- a/packages/firebase_auth/firebase_auth/macos/firebase_auth/Package.swift +++ b/packages/firebase_auth/firebase_auth/macos/firebase_auth/Package.swift @@ -13,7 +13,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "firebase_auth", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-auth", targets: ["firebase_auth"]) diff --git a/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift b/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift index 11eb9bf68621..08716645c63e 100644 --- a/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift +++ b/packages/firebase_core/firebase_core/macos/firebase_core/Package.swift @@ -13,7 +13,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "firebase_core", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-core", targets: ["firebase_core", "firebase_core_objc"]) diff --git a/packages/firebase_crashlytics/firebase_crashlytics/macos/firebase_crashlytics/Package.swift b/packages/firebase_crashlytics/firebase_crashlytics/macos/firebase_crashlytics/Package.swift index a340dbdca084..40d55d436967 100644 --- a/packages/firebase_crashlytics/firebase_crashlytics/macos/firebase_crashlytics/Package.swift +++ b/packages/firebase_crashlytics/firebase_crashlytics/macos/firebase_crashlytics/Package.swift @@ -12,7 +12,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "firebase_crashlytics", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-crashlytics", targets: ["firebase_crashlytics"]) diff --git a/packages/firebase_database/firebase_database/macos/firebase_database/Package.swift b/packages/firebase_database/firebase_database/macos/firebase_database/Package.swift index a887a872806b..a9dc50f4ae69 100644 --- a/packages/firebase_database/firebase_database/macos/firebase_database/Package.swift +++ b/packages/firebase_database/firebase_database/macos/firebase_database/Package.swift @@ -13,7 +13,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "firebase_database", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-database", targets: ["firebase_database"]) diff --git a/packages/firebase_messaging/firebase_messaging/macos/firebase_messaging/Package.swift b/packages/firebase_messaging/firebase_messaging/macos/firebase_messaging/Package.swift index 927a55ca647f..7d81d0ce3498 100644 --- a/packages/firebase_messaging/firebase_messaging/macos/firebase_messaging/Package.swift +++ b/packages/firebase_messaging/firebase_messaging/macos/firebase_messaging/Package.swift @@ -13,7 +13,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "firebase_messaging", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-messaging", targets: ["firebase_messaging"]) diff --git a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/macos/firebase_ml_model_downloader/Package.swift b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/macos/firebase_ml_model_downloader/Package.swift index a12f45d5eb0b..c679f43a85e6 100644 --- a/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/macos/firebase_ml_model_downloader/Package.swift +++ b/packages/firebase_ml_model_downloader/firebase_ml_model_downloader/macos/firebase_ml_model_downloader/Package.swift @@ -12,7 +12,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "firebase_ml_model_downloader", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-ml-model-downloader", targets: ["firebase_ml_model_downloader"]) diff --git a/packages/firebase_remote_config/firebase_remote_config/macos/firebase_remote_config/Package.swift b/packages/firebase_remote_config/firebase_remote_config/macos/firebase_remote_config/Package.swift index 4c4539f12306..4ee4afd80875 100644 --- a/packages/firebase_remote_config/firebase_remote_config/macos/firebase_remote_config/Package.swift +++ b/packages/firebase_remote_config/firebase_remote_config/macos/firebase_remote_config/Package.swift @@ -12,7 +12,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "firebase_remote_config", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-remote-config", targets: ["firebase_remote_config"]) diff --git a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Package.swift b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Package.swift index 848c19b1cc51..47439b1fc6c1 100644 --- a/packages/firebase_storage/firebase_storage/macos/firebase_storage/Package.swift +++ b/packages/firebase_storage/firebase_storage/macos/firebase_storage/Package.swift @@ -13,7 +13,7 @@ let firebaseSdkVersion: Version = "13.0.0" let package = Package( name: "firebase_storage", platforms: [ - .macOS("10.15") + .macOS("11.0") ], products: [ .library(name: "firebase-storage", targets: ["firebase_storage"]) From 317504110ee3ca628081eb631cb8197bf008a385 Mon Sep 17 00:00:00 2001 From: Jude Kwashie Date: Mon, 12 Oct 2026 11:20:36 +0000 Subject: [PATCH 5/5] ci(auth): run iOS e2e on CocoaPods until GoogleSignIn supports App Check 12 Firebase Apple SDK 13 requires app-check 12 under Swift Package Manager, and every GoogleSignIn-iOS release still requires app-check 11, so the auth example cannot resolve its packages under SPM. --- .github/workflows/e2e_tests_auth.yaml | 6 ++++++ .github/workflows/e2e_tests_functions.yaml | 2 +- .github/workflows/e2e_tests_performance.yaml | 2 +- 3 files changed, 8 insertions(+), 2 deletions(-) diff --git a/.github/workflows/e2e_tests_auth.yaml b/.github/workflows/e2e_tests_auth.yaml index a0ce1ca07dcb..976dcc275766 100644 --- a/.github/workflows/e2e_tests_auth.yaml +++ b/.github/workflows/e2e_tests_auth.yaml @@ -86,6 +86,12 @@ jobs: # FIRInstallations aborts on at launch. native-config-args: '--live-tier-plist=auth' inject-config-secrets: true + # Firebase Apple SDK 13 needs app-check 12, and every GoogleSignIn-iOS + # release (8.0.0 to 10.0.0) needs app-check 11, so the example's + # google_sign_in cannot resolve under SPM. CocoaPods is still on 12.19.0. + # Rejoin SPM once https://github.com/google/GoogleSignIn-iOS/pull/626 + # ships and google_sign_in_ios accepts that release. + ios-spm: false nightly_test_mode: ${{ inputs.nightly_test_mode == true }} secrets: TESTS_E2E_FIREBASE_OPTIONS_DART: ${{ secrets.TESTS_E2E_FIREBASE_OPTIONS_DART }} diff --git a/.github/workflows/e2e_tests_functions.yaml b/.github/workflows/e2e_tests_functions.yaml index 701cabe3923b..d205e3f0f696 100644 --- a/.github/workflows/e2e_tests_functions.yaml +++ b/.github/workflows/e2e_tests_functions.yaml @@ -72,7 +72,7 @@ jobs: # 26.2 pin (see `reusable_e2e_ios.yaml`) is the likely fix, but one # variable at a time - these two rejoin SPM once the default-Xcode runs # prove clean. iOS SPM coverage is unaffected meanwhile: storage, - # database, firestore and auth still build under it. + # database and firestore still build under it. ios-spm: false native-config-args: '--functions-native' nightly_test_mode: ${{ inputs.nightly_test_mode == true }} diff --git a/.github/workflows/e2e_tests_performance.yaml b/.github/workflows/e2e_tests_performance.yaml index 26f0623830b3..6b9c5eaba1d0 100644 --- a/.github/workflows/e2e_tests_performance.yaml +++ b/.github/workflows/e2e_tests_performance.yaml @@ -85,7 +85,7 @@ jobs: # 26.2 pin (see `reusable_e2e_ios.yaml`) is the likely fix, but one # variable at a time - these two rejoin SPM once the default-Xcode runs # prove clean. iOS SPM coverage is unaffected meanwhile: storage, - # database, firestore and auth still build under it. + # database and firestore still build under it. ios-spm: false native-config-args: '--live-tier-plist=performance' inject-config-secrets: true