angular / angular/angularfire

Providers and Injections should be by name or at least by Map<string,type> and not by a simple Array<type>

Open
#3,271 2 comments 0 reactions 0 assignees View on GitHub
Dominant language
TypeScript
Stars
7.8k
Forks
2.2k
Avg merge
22h 28m
Merged PRs (30d)
6

Description

### Version info

**Angular:** 14.2

**Firebase:** 9.9.3

**AngularFire:** 7.4.1

**Other (e.g. Ionic/Cordova, Node, browser, operating system):** Irrelevant

### Expected behavior

Provide / Injection by name or Map where the string is the name to find easy and clean your angular firebase components or have a function to findByName(name: string).

I'm not talking only about Auth, I'm talking regarding all your types but I use Auth for the examples

``` typescript
@NgModule({
imports: [
provideFirebaseApp(() => initializeApp(config)), // default app
provideFirebaseApp(() => initializeApp(config2, 'app2')),
provideFirebaseApp(() => initializeApp(config3, 'app3')),
provideAuth(() => getAuth()), // from default app
provideAuth(() => getAuth(getApp('app2'))),
provideAuth(() => getAuth(getApp('app3'))),
],
})
```

One of the next options should be there to be use it easy:

**Option 1** - Could be work with your actual Array but I think that search this search byName in this array is dirty and I recommend to not reinvent the wheel and use a Map
``` typescript
constructor(
private authApp: Auth,
private authApp2: AuthInstances.getByName('app2'),
private authApp3: AuthInstances.getByName('app3'),
) { }
```

**Option 2** - Could be work with your actual Array but again I recommend to not reinvent the wheel and use a Map
``` typescript
constructor(private authInstances: AuthInstances) { }

doWithAuth(name: string) {
const auth = this.authInstances.getByName(name)
// the things that you want to do with your auth
}
```

**Other options** - Any idea that let you select your angular fire element more easy and clean that now.

### Actual behavior

Provide / Injection is a simple Array and does not have any method to select by name.

``` typescript
@NgModule({
imports: [
provideFirebaseApp(() => initializeApp(config)), // default app
provideFirebaseApp(() => initializeApp(config2, 'app2')),
provideFirebaseApp(() => initializeApp(config3, 'app3')),
provideAuth(() => getAuth()), // from default app
provideAuth(() => getAuth(getApp('app2'))),
provideAuth(() => getAuth(getApp('app3'))),
],
})
```

``` typescript
private authMap: Map;
constructor(private authInstances: AuthInstances) {
this.authInstances.forEach(auth => {
this.authMap.set(auth.name,auth);
});
}
```

### Feedback

I think that your Provide / Injection should work with maps or with something that can be select the future injection by name.

Another important thing, is that you must declare a default app, if not the AuthInstaces fail because default app is not initializate and then to find this default app is so ugly `name: "[DEFAULT]"`

To finish, you cannot import only one auth if your auth is not default, because you have a way to import default and to import an array with default and another auths. Is there a way to inject `auth: Auth` by name and avoid import all the array?

Issue post from discussion: _Originally posted by @todosybuenrollo in https://github.com/angular/angularfire/discussions/1026#discussioncomment-3613308_

Contributor guide

Open the contributing guide

Research direction

Start by tracing the provideFirebaseApp, provideAuth, and AuthInstances entry points described in the issue, including how default and named Firebase apps are resolved. Review the current injection behavior and related tests, if present, before deciding between named injection and a map-based API. Done means consumers can select non-default Auth instances by name without manually scanning an array, while preserving default-app behavior.

Written by the indexing model from the issue text.

Assessment

Tech stack
angular, firebase, typescript
Domain
backend-api-design
Issue type
Feature
Difficulty
5/5
Estimated time
Over a week
Activity status
Stale
Clarity
Mostly clear
Newbie friendliness
28/100

Get new issues in your inbox

A short digest of beginner-friendly GitHub issues.