Skip to content

Commit 1fe4a7d

Browse files
Merge branch 'main' into patch-1
2 parents a8daee5 + 79185e7 commit 1fe4a7d

99 files changed

Lines changed: 14411 additions & 10602 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

.github/workflows/codeql-analysis.yml

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,10 @@ jobs:
2424
analyze:
2525
name: Analyze
2626
runs-on: ubuntu-latest
27+
permissions:
28+
actions: read
29+
contents: read
30+
security-events: write
2731

2832
strategy:
2933
fail-fast: false
@@ -35,11 +39,13 @@ jobs:
3539

3640
steps:
3741
- name: Checkout repository
38-
uses: actions/checkout@v2
42+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
43+
with:
44+
persist-credentials: false
3945

4046
# Initializes the CodeQL tools for scanning.
4147
- name: Initialize CodeQL
42-
uses: github/codeql-action/init@v2
48+
uses: github/codeql-action/init@54f647b7e1bb85c95cddabcd46b0c578ec92bc1a # v4.36.3
4349
with:
4450
languages: ${{ matrix.language }}
4551
# If you wish to specify custom queries, you can do so here or in a config file.
@@ -50,7 +56,7 @@ jobs:
5056
# Autobuild attempts to build any compiled languages (C/C++, C#, or Java).
5157
# If this step fails, then you should remove it and run the build manually (see below)
5258
- name: Autobuild
53-
uses: github/codeql-action/autobuild@v2
59+
uses: github/codeql-action/autobuild@54f647b7e1bb85c95cddabcd46b0c578ec92bc1a # v4.36.3
5460

5561
# ℹ️ Command-line programs to run using the OS shell.
5662
# 📚 https://git.io/JvXDl
@@ -64,4 +70,4 @@ jobs:
6470
# make release
6571

6672
- name: Perform CodeQL Analysis
67-
uses: github/codeql-action/analyze@v2
73+
uses: github/codeql-action/analyze@54f647b7e1bb85c95cddabcd46b0c578ec92bc1a # v4.36.3

.github/workflows/test.yml

Lines changed: 40 additions & 76 deletions
Original file line numberDiff line numberDiff line change
@@ -15,39 +15,29 @@ on:
1515
schedule:
1616
- cron: 0 0 * * 1-5
1717

18+
permissions:
19+
contents: read
20+
1821
jobs:
1922
build:
2023
runs-on: ubuntu-latest
2124
name: Build
2225
steps:
2326
- name: Checkout
24-
uses: actions/checkout@v3
27+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
28+
with:
29+
persist-credentials: false
2530
- name: Setup node
26-
uses: actions/setup-node@v3
31+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
2732
with:
2833
node-version: '20'
2934
check-latest: false
30-
- name: angular build cache
31-
uses: actions/cache@v3
32-
with:
33-
path: ./.angular
34-
key: angular-cache
35-
- name: node_modules cache
36-
uses: actions/cache@v3
37-
id: node_modules_cache
38-
with:
39-
path: ./node_modules
40-
key: ${{ runner.os }}-20-${{ hashFiles('package-lock.json') }}
41-
restore-keys: |
42-
${{ runner.os }}-20-
4335
- name: Install deps
44-
if: steps.node_modules_cache.outputs.cache-hit != 'true'
45-
run: |
46-
npm ci
36+
run: npm ci
4737
- name: Build
4838
run: ./tools/build.sh
4939
- name: 'Upload Artifact'
50-
uses: actions/upload-artifact@v3
40+
uses: actions/upload-artifact@043fb46d1a93c77aae656e7c1c64a875d1fc6a0a # v7.0.1
5141
with:
5242
name: angularfire-${{ github.run_id }}
5343
path: dist
@@ -59,32 +49,26 @@ jobs:
5949
strategy:
6050
matrix:
6151
os: [ ubuntu-latest, macos-latest, windows-latest ]
62-
node: ["18", "20", "22"]
52+
node: ["20", "22", "24"]
6353
fail-fast: false
6454
name: Test Node ${{ matrix.node }} (${{ matrix.os }})
6555
steps:
6656
- name: Checkout
67-
uses: actions/checkout@v3
57+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
58+
with:
59+
persist-credentials: false
6860
- name: Setup node
69-
uses: actions/setup-node@v3
61+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
7062
with:
7163
node-version: ${{ matrix.node }}
7264
check-latest: true
73-
- name: node_modules cache
74-
id: node_modules_cache
75-
uses: actions/cache@v3
76-
with:
77-
path: ./node_modules
78-
key: ${{ runner.os }}-${{ matrix.node }}-${{ hashFiles('package-lock.json') }}
79-
restore-keys: |
80-
${{ runner.os }}-${{ matrix.node }}-
8165
- name: Install deps
82-
if: steps.node_modules_cache.outputs.cache-hit != 'true'
8366
run: npm ci
8467
- name: Download Artifacts
85-
uses: actions/download-artifact@v3
86-
- name: Relocate Artifacts
87-
run: mv angularfire-${{ github.run_id }} dist
68+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
69+
with:
70+
name: angularfire-${{ github.run_id }}
71+
path: dist
8872
- name: Test Node
8973
run: |
9074
npm run build:jasmine
@@ -105,37 +89,26 @@ jobs:
10589
fail-fast: false
10690
steps:
10791
- name: Checkout
108-
uses: actions/checkout@v3
92+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
93+
with:
94+
persist-credentials: false
10995
- name: Setup node
110-
uses: actions/setup-node@v3
96+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
11197
with:
11298
node-version: 20
11399
check-latest: false
114100
- name: Setup java
115-
uses: actions/setup-java@v3
101+
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5.4.0
116102
with:
117103
distribution: 'temurin'
118-
java-version: '11'
119-
- name: node_modules cache
120-
id: node_modules_cache
121-
uses: actions/cache@v3
122-
with:
123-
path: ./node_modules
124-
key: ${{ runner.os }}-${{ matrix.node }}-${{ hashFiles('package-lock.json') }}
125-
restore-keys: |
126-
${{ runner.os }}-${{ matrix.node }}-
104+
java-version: '21'
127105
- name: Install deps
128-
if: steps.node_modules_cache.outputs.cache-hit != 'true'
129106
run: npm ci
130-
- name: Firebase emulator cache
131-
uses: actions/cache@v3
132-
with:
133-
path: ~/.cache/firebase/emulators
134-
key: firebase_emulators
135107
- name: Download Artifacts
136-
uses: actions/download-artifact@v3
137-
- name: Relocate Artifacts
138-
run: mv angularfire-${{ github.run_id }} dist
108+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
109+
with:
110+
name: angularfire-${{ github.run_id }}
111+
path: dist
139112
- name: Test browser
140113
run: npm run test:${{ matrix.browser }}
141114

@@ -149,22 +122,15 @@ jobs:
149122
fail-fast: false
150123
steps:
151124
- name: Checkout
152-
uses: actions/checkout@v3
125+
uses: actions/checkout@9c091bb21b7c1c1d1991bb908d89e4e9dddfe3e0 # v7.0.0
126+
with:
127+
persist-credentials: false
153128
- name: Setup node
154-
uses: actions/setup-node@v3
129+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
155130
with:
156131
node-version: ${{ matrix.node }}
157132
check-latest: true
158-
- name: node_modules cache
159-
uses: actions/cache@v3
160-
id: node_modules_cache
161-
with:
162-
path: ./node_modules
163-
key: ${{ runner.os }}-${{ matrix.node }}-${{ hashFiles('package-lock.json') }}
164-
restore-keys: |
165-
${{ runner.os }}-${{ matrix.node }}-
166133
- name: Install deps
167-
if: steps.node_modules_cache.outputs.cache-hit != 'true'
168134
run: npm ci
169135
#- name: Lint
170136
# run: npm run lint
@@ -174,16 +140,11 @@ jobs:
174140
run: |
175141
npm run build:jasmine
176142
npm run test:node
177-
- name: Firebase emulator cache
178-
uses: actions/cache@v3
179-
with:
180-
path: ~/.cache/firebase/emulators
181-
key: firebase_emulators
182143
- name: Setup java
183-
uses: actions/setup-java@v3
144+
uses: actions/setup-java@1bcf9fb12cf4aa7d266a90ae39939e61372fe520 # v5.4.0
184145
with:
185146
distribution: 'temurin'
186-
java-version: '11'
147+
java-version: '21'
187148
- name: Test headless
188149
run: npm run test:chrome-headless
189150
# Tests are flaky on Windows
@@ -204,16 +165,19 @@ jobs:
204165
if: ${{ github.ref == 'refs/heads/main' || github.event_name == 'release' }}
205166
steps:
206167
- name: Setup node
207-
uses: actions/setup-node@v3
168+
uses: actions/setup-node@48b55a011bda9f5d6aeb4c2d9c7362e8dae4041e # v6.4.0
208169
with:
209170
node-version: '20'
210171
registry-url: 'https://registry.npmjs.org'
211172
check-latest: false
212173
- name: 'Download Artifacts'
213-
uses: actions/download-artifact@v3
174+
uses: actions/download-artifact@3e5f45b2cfb9172054b4087a40e8e0b5a5461e7c # v8.0.1
175+
with:
176+
name: angularfire-${{ github.run_id }}
177+
path: dist
214178
- name: Publish
215179
run: |
216-
cd ./angularfire-${{ github.run_id }}/packages-dist
180+
cd ./dist/packages-dist
217181
chmod +x publish.sh
218182
./publish.sh
219183
env:

README.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -58,7 +58,7 @@ interface Item {
5858
export class AppComponent {
5959
firestore = inject(Firestore);
6060
itemCollection = collection(this.firestore, 'items');
61-
items$ = collectionData<Item>(itemCollection);
61+
items$ = collectionData<Item>(this.itemCollection);
6262
}
6363
```
6464

docs/auth.md

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -106,7 +106,7 @@ import { Auth, User, user } from '@angular/fire/auth';
106106

107107
export class UserComponent implements OnDestroy {
108108
private auth: Auth = inject(Auth);
109-
user$ = user(auth);
109+
user$ = user(this.auth);
110110
userSubscription: Subscription;
111111
...
112112

@@ -136,7 +136,7 @@ import { Auth, authState } from '@angular/fire/auth';
136136

137137
export class UserComponent implements OnDestroy {
138138
private auth: Auth = inject(Auth);
139-
authState$ = authState(auth);
139+
authState$ = authState(this.auth);
140140
authStateSubscription: Subscription;
141141
...
142142

@@ -165,7 +165,7 @@ import { Auth, idToken } from '@angular/fire/auth';
165165

166166
export class UserComponent implements OnDestroy {
167167
private auth: Auth = inject(Auth);
168-
idToken$ = idToken(auth);
168+
idToken$ = idToken(this.auth);
169169
idTokenSubscription: Subscription;
170170
...
171171

docs/zones.md

Lines changed: 39 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,39 @@
1+
<small>
2+
<a href="https://github.com/angular/angularfire">AngularFire</a> &#10097; <a href="../README.md#developer-guide">Developer Guide</a> &#10097; Zone Wrappers
3+
</small>
4+
5+
# Zone Wrappers
6+
7+
AngularFire wraps the [framework agnostic Firebase JS SDK](https://github.com/firebase/firebase-js-sdk) and [RxFire](https://github.com/firebaseextended/rxfire) to ensure proper functionality in Zone and Zoneless applications alike.
8+
9+
These wrappers ensure Firebase APIs are called outside of the Angular zone. This isolates side-effects such as timers so that they do not destabilize your application.
10+
11+
Observables, Promise-based APIs, and those with callbacks will purposely destabilize your application until a initial value is returned, this ensures that server-side rendering (SSR) and static site generation (SSG/pre-rendering) wait for data before rendering the page's HTML.
12+
13+
## Consequences of not Zone wrapping
14+
15+
When using a Firebase or RxFire API without importing from AngularFire or if AngularFire APIs are used outside of an injection context you _may_ experience instability.
16+
17+
When an application is unstable change-detection, two-way binding, and rehydration may not work as expected—leading to both subtle and non-subtle bugs in your application. Further, server-side rendering (SSR) and static site generation (SSG/pre-rendering) may timeout or render a blank page.
18+
19+
There are a number of situations where AngularFire's Zone wrapping is inconsequential such adding/deleting/updating a document in response to user-input, signing a user in, calling a Cloud Function, etc. So long as no long-lived side-effects are kicked off, your application should be ok. Most Promise based APIs are fairly safe without zone wrapping.
20+
21+
## Logging
22+
23+
You may see a log warning, `Calling Firebase APIs outside of an Injection context may destabilize your application leading to subtle change-detection and hydration bugs. Find more at https://github.com/angular/angularfire/blob/main/docs/zones.md` when developing your application.
24+
25+
Instability can be difficult to track down. To help with debugging, AngularFire emits warnings when it is unable to Zone wrap an API while in dev-mode. **Often these messages can be safely ignored** but we'd rather be verbose.
26+
27+
There are three logging levels in AngularFire:
28+
29+
* **Silent**: when the logging level is set to silent only the above banner is displayed when AngularFire APIs are called outside of an injection context, this is the default when using Zoneless change-detection.
30+
* **Warn**: when the logging level is set to warn, only blocking reads, long-lived tasks, and APIs with high risk of destabilizing your application are called, this is the default when using ZoneJS.
31+
* **Verbose**: when the logging level is set to verbose, all AngularFire APIs called outside of an injection context are logged—helping you track down APIs that may be destabilizing your application
32+
33+
You can change the log-level like so:
34+
35+
```ts
36+
import { setLogLevel, LogLevel } from "@angular/fire";
37+
38+
setLogLevel(LogLevel.VERBOSE);
39+
```

eslint.config.js

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -96,6 +96,21 @@ module.exports = [
9696
"newlines-between": "never"
9797
},
9898
],
99+
'@angular-eslint/prefer-inject': 'off',
100+
'@typescript-eslint/no-empty-object-type': 'off',
101+
'import/named': 'off',
102+
"@typescript-eslint/no-unused-vars": [
103+
"error",
104+
{
105+
"argsIgnorePattern": "^_",
106+
"varsIgnorePattern": "^_",
107+
"caughtErrorsIgnorePattern": "^_",
108+
"ignoreRestSiblings": true
109+
}
110+
],
111+
"@typescript-eslint/prefer-promise-reject-errors": "off",
112+
"@typescript-eslint/no-require-imports": "off",
113+
"@typescript-eslint/ban-ts-comment": "warn",
99114
},
100115
},
101116
{

mise.toml

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,2 @@
1+
[tools]
2+
node = "latest"

0 commit comments

Comments
 (0)