fireemu 0.15.0 → 0.17.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +106 -19
- package/package.json +6 -6
package/README.md
CHANGED
|
@@ -14,7 +14,7 @@ Fireemu is being developed to close these gaps. For example, it provides:
|
|
|
14
14
|
|
|
15
15
|
Fireemu is still in development and does not yet reproduce every feature and behavior of production Firebase. Before relying on Fireemu’s test results in CI or other automated workflows, we recommend differential testing against production Firebase services for the features and critical workflows your application uses. Run the same tests against Fireemu and a dedicated Firebase test project, and check for differences in results and behavior that could affect your application. Use a dedicated test project, not your live production project.
|
|
16
16
|
|
|
17
|
-
See the [capability manifest](https://github.com/t-k/fireemu/blob/v0.
|
|
17
|
+
See the [capability manifest](https://github.com/t-k/fireemu/blob/v0.17.0/crates/fireemu/src/capabilities.json) and [compatibility documentation](https://github.com/t-k/fireemu/blob/v0.17.0/docs/compatibility-contract.md) for supported features, known differences, and the status of compatibility verification.
|
|
18
18
|
|
|
19
19
|
## Quick start
|
|
20
20
|
|
|
@@ -41,6 +41,10 @@ npx fireemu exec -- <command>
|
|
|
41
41
|
npx fireemu exec -- npm test
|
|
42
42
|
```
|
|
43
43
|
|
|
44
|
+
`up` and `exec` read `fireemu.json` from the current directory, or, when there is none, the nearest `firebase.json` (see [Which configuration files are loaded](#which-configuration-files-are-loaded)). The first lines of the startup output name the files that were loaded and say, for Firestore and Storage, whether Security Rules are loaded.
|
|
45
|
+
|
|
46
|
+
Every command documents its options: run `npx fireemu --help` for the commands and `npx fireemu <command> --help` (or `npx fireemu help <command>`) for the options of one, for example `npx fireemu exec --help`. After `--`, `exec` passes `--help` to your command.
|
|
47
|
+
|
|
44
48
|
### Supported platforms
|
|
45
49
|
|
|
46
50
|
| OS | Architecture |
|
|
@@ -66,13 +70,13 @@ Fireemu supports Cloud Firestore, Firebase Authentication (Identity Platform), C
|
|
|
66
70
|
| Cloud Pub/Sub | Schemas, BigQuery and Cloud Storage subscription delivery, and some APIs such as `UpdateTopic` are not supported. |
|
|
67
71
|
| Firebase App Check | Local testing with debug tokens is supported. Real attestation through Play Integrity, App Attest, DeviceCheck, or reCAPTCHA, and replay protection using limited-use tokens, are not supported. |
|
|
68
72
|
|
|
69
|
-
This table highlights key limitations; it is not exhaustive. Check individual API support and conditions with the following command or the [capability manifest](https://github.com/t-k/fireemu/blob/v0.
|
|
73
|
+
This table highlights key limitations; it is not exhaustive. Check individual API support and conditions with the following command or the [capability manifest](https://github.com/t-k/fireemu/blob/v0.17.0/crates/fireemu/src/capabilities.json).
|
|
70
74
|
|
|
71
75
|
```sh
|
|
72
76
|
npx fireemu capabilities
|
|
73
77
|
```
|
|
74
78
|
|
|
75
|
-
See the [Functions support inventory](https://github.com/t-k/fireemu/blob/v0.
|
|
79
|
+
See the [Functions support inventory](https://github.com/t-k/fireemu/blob/v0.17.0/docs/functions-export-inventory.md) for support by trigger type.
|
|
76
80
|
|
|
77
81
|
### Unsupported products
|
|
78
82
|
|
|
@@ -131,7 +135,7 @@ Use `--ui-port 0` to disable the UI. When automatic UI startup cannot bind the d
|
|
|
131
135
|
|
|
132
136
|
When a Functions codebase is loaded, the Functions page shows registered functions, triggers, invocation results, and logs. You can run scheduled functions immediately or advance the virtual clock to their next scheduled execution.
|
|
133
137
|
|
|
134
|
-
For clock-sensitive and parallel integration tests, [test clocks and independent worlds](https://github.com/t-k/fireemu/blob/v0.
|
|
138
|
+
For clock-sensitive and parallel integration tests, [test clocks and independent worlds](https://github.com/t-k/fireemu/blob/v0.17.0/docs/test-worlds.md) describes explicit Node Date/timer/Cloud Tasks policies and the `fireemu/testing` helper. Separate worlds isolate their clocks, Rules, Functions and service state, including when they use the same project ID.
|
|
135
139
|
|
|
136
140
|
### Export data
|
|
137
141
|
|
|
@@ -173,17 +177,93 @@ npx fireemu init --yes
|
|
|
173
177
|
|
|
174
178
|
An existing `fireemu.json` is not overwritten unless `--force` is supplied.
|
|
175
179
|
|
|
180
|
+
### Which configuration files are loaded
|
|
181
|
+
|
|
182
|
+
`up`, `exec`, `emulators:start` and `emulators:exec` choose their configuration files as follows.
|
|
183
|
+
|
|
184
|
+
1. `--config <file>` and `--firebase-json <file>` load exactly the files they name, and nothing is searched for.
|
|
185
|
+
2. Otherwise, `fireemu.json` in the current directory is loaded as if it were passed with `--config`. Its `firebaseJson` entry, resolved relative to `fireemu.json`, names the `firebase.json` to load. A `firebase.json` beside a `fireemu.json` without a `firebaseJson` entry is not loaded, and the startup output says so. A `fireemu.json` in a parent directory is not used, because the paths it contains are relative to the current directory.
|
|
186
|
+
3. Otherwise, the nearest `firebase.json` is loaded as if it were passed with `--firebase-json`: the one in the current directory, else the first one found in a parent directory, as the Firebase CLI finds it. Its paths and the `.firebaserc` beside it are read from its directory.
|
|
187
|
+
4. Otherwise, the built-in defaults apply, and no Security Rules are loaded.
|
|
188
|
+
|
|
189
|
+
`--no-config-discovery` skips steps 2 and 3. The `config:` line of the startup output names the files that were loaded.
|
|
190
|
+
|
|
191
|
+
A discovered file can name Functions code to run and the rules to enforce, so on Unix the search checks who owns what it finds, as git checks repository ownership. The Firebase CLI does not check this. The trusted owners are you (the effective user), root, and, when you run as root through `sudo`, the user in `SUDO_UID`.
|
|
192
|
+
|
|
193
|
+
- A `fireemu.json` or `firebase.json` whose owner is not trusted, or that any user can write, is skipped. Group write is allowed, so files created under a user-private-group umask (002, the Debian and Ubuntu default) are loaded.
|
|
194
|
+
- A `.firebaserc` names only project and target aliases, never code or rules, so its owner is not checked. It is skipped only when it, or its directory, can be written by any user.
|
|
195
|
+
- The search stops before a parent directory whose owner is not trusted or that any user can write, such as `/tmp`. It also stops, without a warning, at a parent it cannot inspect, such as one you may not enter.
|
|
196
|
+
- The owner of the current directory is not checked, because you chose to run there. A current directory that any user can write is not searched at all.
|
|
197
|
+
- A symbolic link is judged by the file it points to. The directory that holds the target is not checked.
|
|
198
|
+
- Each candidate is opened once. Its owner and mode are checked on the open file before anything is read, and its text is then read from the same file. A discovered file larger than 16 MiB is refused with an error.
|
|
199
|
+
|
|
200
|
+
A skipped file or directory is named in a warning, and the run continues as if nothing had been found. To load a file anyway, name it with `--config` or `--firebase-json`. To silence the warning, pass `--no-config-discovery`. Errors in a discovered file say that the search found the file.
|
|
201
|
+
|
|
202
|
+
Two common setups run into this rule:
|
|
203
|
+
|
|
204
|
+
- A root container with a bind-mounted checkout. Examples are GitHub Actions `container:` jobs and `docker run -v "$PWD":/app` as root. The `fireemu.json` and `firebase.json` there are owned by a host user that the container's root does not trust, so they are skipped. Use the explicit flags, or `chown` the checkout. The `.firebaserc` still names the project. Rootless Podman maps your user to the container's root, so it is not affected.
|
|
205
|
+
- `sudo`. Files owned by the user that `sudo` names in `SUDO_UID` are trusted.
|
|
206
|
+
|
|
207
|
+
On Windows, ownership is not checked.
|
|
208
|
+
|
|
209
|
+
If you relied on the old behavior, where a `firebase.json` next to your tests was ignored, pass `--no-config-discovery`. Discovery means that the project ID comes from the `.firebaserc` beside the discovered `firebase.json`, that its emulator ports, Hub, UI and single-project settings apply, and that a `functions` entry starts the Functions runtime. `fireemu capabilities` also reports the profile of a discovered `fireemu.json`.
|
|
210
|
+
|
|
211
|
+
### Security Rules that are not loaded
|
|
212
|
+
|
|
213
|
+
Under the `strict` profile, a project without Security Rules behaves as a production project without a rules release: every client request to Firestore is refused with `PERMISSION_DENIED`, and every end-user request to Storage is refused with production's 400 "bucket has not been set up" answer. The Admin SDK and other owner credentials are not affected. The `emulator` profile allows every Firestore request, and every Storage request for a `demo-*` project, as the official emulator does.
|
|
214
|
+
|
|
215
|
+
The answers keep production's wording, which does not mention Fireemu. The startup output therefore has a `firestore rules:` and a `storage rules:` line that say when no rules are loaded and how to load them, and the first refused request for each database and bucket (up to 32 of each) prints a warning to standard error. Name the rules files in `firebase.json` (`firestore.rules`, `storage.rules`) or in `fireemu.json` (`rules.source`, `storage.rules`).
|
|
216
|
+
|
|
176
217
|
### Compatibility profiles
|
|
177
218
|
|
|
178
219
|
| Profile | Behavior |
|
|
179
220
|
|---|---|
|
|
180
|
-
| `strict` | Matches production Firebase behavior and constraints as closely as possible within the supported scope. This is the default profile |
|
|
181
|
-
| `emulator` | Targets the behavior of a pinned version of the official emulator. Known differences are documented in the compatibility documentation |
|
|
221
|
+
| `strict` | Matches production Firebase behavior and constraints as closely as possible within the supported scope. This is the default profile. Recommended, including when migrating from the official emulator |
|
|
222
|
+
| `emulator` | Targets the behavior of a pinned version of the official emulator. Known differences are documented in the compatibility documentation. Use it only to check alignment with the pinned official emulator (for example as an extra test target); it is not needed for a migration |
|
|
223
|
+
|
|
224
|
+
Use `strict` for your tests, also when you are moving a project over from the Firebase Local Emulator Suite. `strict` is recommended; `emulator` is only for checking alignment with the pinned official emulator (for example as an extra test target). It accepts behavior that production refuses, so a test can pass there and fail against production.
|
|
225
|
+
|
|
226
|
+
#### Development defaults and `productionExact`
|
|
182
227
|
|
|
183
|
-
|
|
228
|
+
Fireemu is mostly run by tests, in CI and on a developer's machine. Where production needs setup that a test should not have to do (signed tokens, signing keys, enabling a feature through an Admin API call), the default in both profiles is the development behavior, and each such behavior has its own configuration key. To get production's behavior for all of them at once, set `productionExact` to `true` (strict profile only); an explicit key still decides over it:
|
|
229
|
+
|
|
230
|
+
```json
|
|
231
|
+
{
|
|
232
|
+
"schemaVersion": 1,
|
|
233
|
+
"profile": "strict",
|
|
234
|
+
"productionExact": true,
|
|
235
|
+
"auth": { "allowUnsignedCustomTokens": true }
|
|
236
|
+
}
|
|
237
|
+
```
|
|
238
|
+
|
|
239
|
+
| Development default | Key | With `productionExact` |
|
|
240
|
+
|---|---|---|
|
|
241
|
+
| Unsigned emulator custom tokens are accepted | `auth.allowUnsignedCustomTokens` | refused |
|
|
242
|
+
| Firestore and Storage Security Rules accept `@firebase/rules-unit-testing`'s unsigned mock ID token (`authenticatedContext()`, the client SDK's `mockUserToken`) | `auth.allowUnsignedIdTokens` | refused, as production refuses an unsigned token |
|
|
243
|
+
| Identity-provider sign-in accepts the fixture assertions and the sign-in widget (`/emulator/auth/handler`), for built-in, `oidc.*` and `saml.*` providers | `auth.idpAssertions` (`"fixture"`) | `"signed"`: OIDC ID tokens must verify with an `auth.idpSigners` key, SAML responses with the provider's certificates, and the fixture and built-in providers are refused |
|
|
244
|
+
| The strict Eventarc listener admits any credential or none, so the Admin SDK publishes with a fake credential (see [Eventarc authentication](https://github.com/t-k/fireemu/blob/v0.17.0/docs/eventarc-authentication.md)) | `eventarc.authentication` (`"permissive"`) | `"production"`: a missing, malformed or JWT-shaped bearer is refused with production's 401 |
|
|
245
|
+
| A query whose composite index is not defined (or is still building, or was deleted) runs, and each missing index is reported once per database on stderr with production's refusal text and the `firestore.indexes.json` entry | `firestore.missingIndexes` (`"report"`) | refused with `FAILED_PRECONDITION` and the console link (`"refuse"`) |
|
|
246
|
+
|
|
247
|
+
The start banner and `fireemu capabilities` report whether `productionExact` is set.
|
|
184
248
|
|
|
185
249
|
Under the `emulator` profile, a request that names a tenant the project does not have creates that tenant, and the number of tenants is not limited, as in the official emulator. The `strict` profile refuses such a request, as production does. A request that Fireemu refuses (a wrong credential, a browser page without the control token on the emulator routes, App Check, an unknown API key) creates nothing. As in the official emulator, a plain `GET` without an `Origin` header to a tenant route of `127.0.0.1` creates the tenant, so any web page you visit while the emulator runs can add tenants to it (not read them); use the `strict` profile where that matters.
|
|
186
250
|
|
|
251
|
+
### Migrating from the Firebase Local Emulator Suite
|
|
252
|
+
|
|
253
|
+
Keep `"profile": "strict"` (the default of `fireemu init`), and point fireemu at your existing `firebase.json` with `npx fireemu init --firebase-json firebase.json` or `--firebase-json` on the command line. Replace `firebase emulators:exec` with `fireemu exec` and `firebase emulators:start` with `fireemu up`; the official command names `emulators:exec` and `emulators:start` also work.
|
|
254
|
+
|
|
255
|
+
When a test fails under `strict` but passed on the official emulator, it is usually behavior the application would also meet in production. Fix the test or the application, or relax only the specific setting below instead of switching the whole profile.
|
|
256
|
+
|
|
257
|
+
- **Unsigned emulator ID tokens** (`@firebase/rules-unit-testing` `authenticatedContext()`, the client SDK's `mockUserToken`) work under `strict` by default. Set `auth.allowUnsignedIdTokens` to `false` to test production's refusal of them on the Security Rules surfaces.
|
|
258
|
+
- **Composite indexes** are validated as production does, and no setting changes that. Declare the index a query needs in `firestore.indexes.json`, referenced from `firebase.json`.
|
|
259
|
+
- **Settings that mirror your production project.** Set them to match it instead of switching the profile:
|
|
260
|
+
|
|
261
|
+
| Setting | What it does under `strict` |
|
|
262
|
+
|---|---|
|
|
263
|
+
| `auth.improvedEmailPrivacy` | Email enumeration protection, on for a new production project. Set `false` only if your production project turned it off; sign-ins then answer `EMAIL_NOT_FOUND` and `INVALID_PASSWORD` as the official Auth emulator does |
|
|
264
|
+
| `auth.mfa` | Your project's multi-factor configuration (an object, see [Enable multi-factor authentication at start](#enable-multi-factor-authentication-at-start)). `strict` starts with multi-factor off, as a new production project does, and the official emulator has no TOTP at all |
|
|
265
|
+
| `firestore.enforceLimits` | Production always enforces the Standard edition query limits. `false` lets queries pass that production refuses, so leave it on unless you have a specific reason |
|
|
266
|
+
|
|
187
267
|
### Basic configuration
|
|
188
268
|
|
|
189
269
|
The initial configuration selects Standard edition Firestore with the Native API.
|
|
@@ -200,13 +280,13 @@ The initial configuration selects Standard edition Firestore with the Native API
|
|
|
200
280
|
}
|
|
201
281
|
```
|
|
202
282
|
|
|
203
|
-
You can
|
|
283
|
+
You can also name the configuration file with `--config`.
|
|
204
284
|
|
|
205
285
|
```sh
|
|
206
286
|
npx fireemu up --config ./fireemu.json
|
|
207
287
|
```
|
|
208
288
|
|
|
209
|
-
Keep Fireemu-specific settings in a Fireemu configuration file containing `"schemaVersion": 1`, rather than in `firebase.json`. See the [configuration schema](https://github.com/t-k/fireemu/blob/v0.
|
|
289
|
+
Keep Fireemu-specific settings in a Fireemu configuration file containing `"schemaVersion": 1`, rather than in `firebase.json`. See the [configuration schema](https://github.com/t-k/fireemu/blob/v0.17.0/spec/config/fireemu.schema.json) for all available settings.
|
|
210
290
|
|
|
211
291
|
### Firebase Authentication (Identity Platform) configuration
|
|
212
292
|
|
|
@@ -227,16 +307,23 @@ The `auth` section of `fireemu.json` lets you configure sign-in methods, passwor
|
|
|
227
307
|
| Project- and tenant-specific password policies and account permissions | `auth.passwordPolicyOverrides`, `auth.configOverrides` |
|
|
228
308
|
| Blocking functions before account creation or sign-in, and credential forwarding to those functions | `auth.blockingFunctions` |
|
|
229
309
|
| Initial custom OIDC and SAML provider resources | `auth.providers.oidc`, `auth.providers.saml` |
|
|
310
|
+
| Accept unsigned emulator custom tokens (default `true` in both profiles, `false` with `productionExact`) | `auth.allowUnsignedCustomTokens` |
|
|
311
|
+
| Accept `@firebase/rules-unit-testing`'s unsigned mock ID token in Firestore and Storage Security Rules (default `true` in both profiles, `false` with `productionExact`) | `auth.allowUnsignedIdTokens` |
|
|
312
|
+
| Accept the fixture identity-provider assertions and sign-in widget (`"fixture"`, the default in both profiles), or verify signed assertions as production does (`"signed"`, `strict` only; the default with `productionExact` or `auth.idpSigners`) | `auth.idpAssertions` |
|
|
230
313
|
| Public keys for verifying custom tokens and OIDC ID tokens | `auth.customTokenSigners`, `auth.idpSigners` |
|
|
231
314
|
| Sign-up quota configuration and local quota-exceeded simulation | `auth.quota`, `auth.quotaSimulation` |
|
|
232
315
|
|
|
233
|
-
|
|
316
|
+
Unsigned custom tokens minted by the Firebase Admin SDK in emulator mode are accepted by default, including with the recommended `strict` profile and with `auth.customTokenSigners` configured. To require signed custom tokens, set `auth.allowUnsignedCustomTokens` to `false` and configure `auth.customTokenSigners` with the service accounts' public JWK sets. The setting applies only to custom-token sign-in; strict claim checks and signed-token verification still apply. In the `emulator` profile, setting it to `false` also disables JSON fake custom tokens.
|
|
317
|
+
|
|
318
|
+
The unsigned mock ID token of `@firebase/rules-unit-testing` is accepted by default when Firestore and Storage Security Rules are evaluated, including with the `strict` profile. This is the token `authenticatedContext()` and the client SDKs' `mockUserToken` option send (`createMockUserToken` in `@firebase/util`). Under `strict` only that exact shape is accepted: a JWT whose header is exactly `{"alg":"none","type":"JWT"}` and whose signature is empty. `request.auth` is built from the token's claims, as the official emulator builds it, when the token names a subject (`sub`) and its audience (`aud`) is the project the request goes to. Its `exp` is not checked, because the SDK sets `iat: 0` and `exp: 3600` by default. Every other token is verified as before, expiry included. That covers the unsigned ID tokens fireemu itself issues (their header carries `typ`, not `type`), and a token that claims a signature that does not verify is still refused. The `emulator` profile accepts any unsigned token, as the official emulator does, and its Storage also accepts another project's token. To refuse the mock token as production does, set `auth.allowUnsignedIdTokens` to `false` (in either profile) or set `productionExact`. A session with `auth.idTokenSigning: "session-rsa"` accepts no unsigned token. The setting does not affect callable Functions, Identity Toolkit or App Check.
|
|
319
|
+
|
|
320
|
+
See the [configuration schema](https://github.com/t-k/fireemu/blob/v0.17.0/spec/config/fireemu.schema.json) for the format and accepted values of each setting.
|
|
234
321
|
|
|
235
|
-
Declare `auth.authorizedDomains`, for example `["localhost", "app.test"]`, to set the initial project-wide list in either profile. The list replaces the defaults, so include `localhost` if your tests use it. An empty list authorizes no host under `strict`; an absent or `null` setting keeps the existing defaults (`localhost` and the project's `firebaseapp.com` and `web.app` domains). Validation uses the Admin API's rules for the selected profile, including its conversion of numeric and boolean entries to strings and omission of `null` entries; use strings when writing the list. Fireemu intentionally keeps `localhost` in its defaults for development. The [recorded production sandbox baseline](https://github.com/t-k/fireemu/blob/v0.
|
|
322
|
+
Declare `auth.authorizedDomains`, for example `["localhost", "app.test"]`, to set the initial project-wide list in either profile. The list replaces the defaults, so include `localhost` if your tests use it. An empty list authorizes no host under `strict`; an absent or `null` setting keeps the existing defaults (`localhost` and the project's `firebaseapp.com` and `web.app` domains). Validation uses the Admin API's rules for the selected profile, including its conversion of numeric and boolean entries to strings and omission of `null` entries; use strings when writing the list. Fireemu intentionally keeps `localhost` in its defaults for development. The [recorded production sandbox baseline](https://github.com/t-k/fireemu/blob/v0.17.0/conformance/auth-action-production.json) does not include it; new production projects may also omit it. This default is a Fireemu-only convenience, and declaring the list replaces it. Tenant-scoped strict action links currently check the tenant's default domains rather than this project declaration; support for the parent project's live list is pending.
|
|
236
323
|
|
|
237
324
|
An Admin update changes the live list. A session reset restores the declared list, when present, and preserves an Admin-written list when no initial list was declared. Projects created later receive the declaration word for word, independently of the default project's live list; listing a particular project's `firebaseapp.com` or `web.app` domain therefore gives later projects that same domain. Clearing accounts leaves the live list alone. Auth export/import carries accounts without the domain list or its declaration. The `emulator` profile accepts the setting and exposes the list, while continuing to allow action-link continue URLs outside it.
|
|
238
325
|
|
|
239
|
-
Declare project OIDC and SAML resources with `auth.providers.oidc` and `auth.providers.saml`, using the Admin v2 resource fields and an ID-only `name` such as `oidc.fixture` or `saml.fixture`. Full resource names are refused. For example, `"providers": {"oidc": [{"name": "oidc.fixture", "enabled": true, "clientId": "local-client", "issuer": "https://issuer.test", "responseType": {"idToken": true}}]}` initializes that provider in both profiles.
|
|
326
|
+
Declare project OIDC and SAML resources with `auth.providers.oidc` and `auth.providers.saml`, using the Admin v2 resource fields and an ID-only `name` such as `oidc.fixture` or `saml.fixture`. Full resource names are refused. For example, `"providers": {"oidc": [{"name": "oidc.fixture", "enabled": true, "clientId": "local-client", "issuer": "https://issuer.test", "responseType": {"idToken": true}}]}` initializes that provider in both profiles. By default both profiles accept the fixture assertions the official emulator accepts (a JSON or unsigned ID token, a JSON SAML response, the sign-in widget), whether or not the provider is declared. With `auth.idpAssertions` set to `"signed"` (or `productionExact`, or `auth.idpSigners` present), strict OIDC sign-in needs matching public issuer keys in `auth.idpSigners`; no key is fetched. Strict SAML then uses the declared provider certificates and retains its existing assertion checks.
|
|
240
327
|
|
|
241
328
|
Each declared array replaces that provider kind; `[]` explicitly starts it empty, while an absent or `null` kind declares no initial resources. Admin operations change live resources until a session reset restores the declared kinds. Later session and routed projects inherit the declaration independently of the default project's live changes. Tenant resources and built-in providers remain separate. Clearing accounts preserves live resources; snapshots and Auth export/import transfer no provider resources or declarations. The emulator profile continues to accept its unsigned fixture credentials without requiring configured or enabled provider resources. These declarations require a canonical document with `"schemaVersion": 1`; a Firebase deployment `auth.providers` section without that version remains deployment data and installs no provider seeds.
|
|
242
329
|
|
|
@@ -326,7 +413,7 @@ Under the `strict` profile, TOTP is enabled only through the project's MFA confi
|
|
|
326
413
|
|
|
327
414
|
#### Enable multi-tenancy
|
|
328
415
|
|
|
329
|
-
Under the `strict` profile, enable `multiTenant.allowTenants` before using multi-tenancy: through the Admin API, or with `auth.multiTenant` in the file (see "Start with tenants" below). See the [compatibility documentation](https://github.com/t-k/fireemu/blob/v0.
|
|
416
|
+
Under the `strict` profile, enable `multiTenant.allowTenants` before using multi-tenancy: through the Admin API, or with `auth.multiTenant` in the file (see "Start with tenants" below). See the [compatibility documentation](https://github.com/t-k/fireemu/blob/v0.17.0/docs/compatibility-contract.md) for the supported Admin API scope.
|
|
330
417
|
|
|
331
418
|
#### Start with tenants
|
|
332
419
|
|
|
@@ -377,7 +464,7 @@ A schedule is driven by the virtual clock alone: real time passing runs nothing.
|
|
|
377
464
|
|
|
378
465
|
A manual run (`POST /v1/sessions/{session}/functions/{name}:run`) enqueues one run of a scheduled function stamped with the current virtual time. It does not consume the next occurrence, which still comes due and is subject to `scheduler.overlap` like any run. It answers `400 INVALID_ARGUMENT` for an unknown function, a function that is not scheduled, an overlap policy refusal, or a runtime that is shutting down, and `429 RESOURCE_EXHAUSTED` when the event queue is full. This is fireemu's own control, not a claim about production's run-now.
|
|
379
466
|
|
|
380
|
-
See the [configuration schema](https://github.com/t-k/fireemu/blob/v0.
|
|
467
|
+
See the [configuration schema](https://github.com/t-k/fireemu/blob/v0.17.0/spec/config/fireemu.schema.json) for available settings and values.
|
|
381
468
|
|
|
382
469
|
### Firestore history limits
|
|
383
470
|
|
|
@@ -455,7 +542,7 @@ Fireemu is compatible with the listed Local Emulator Suite products as shipped b
|
|
|
455
542
|
|
|
456
543
|
The `strict` and `emulator` profiles differ in some behaviors to serve their respective purposes. Where the official emulator and production Firebase disagree, Fireemu also adopts production behavior in some cases and records the difference.
|
|
457
544
|
|
|
458
|
-
Check support for the specific APIs and conditions your application uses, rather than relying on product names alone. The [compatibility contract](https://github.com/t-k/fireemu/blob/v0.
|
|
545
|
+
Check support for the specific APIs and conditions your application uses, rather than relying on product names alone. The [compatibility contract](https://github.com/t-k/fireemu/blob/v0.17.0/spec/compatibility/contract.json) records scope and known differences. The [compatibility documentation](https://github.com/t-k/fireemu/blob/v0.17.0/docs/compatibility-contract.md) explains the verification process and how to interpret its records.
|
|
459
546
|
|
|
460
547
|
### Network exposure of the Storage port
|
|
461
548
|
|
|
@@ -463,7 +550,7 @@ Like the official emulator, the Storage port reflects the requested object name
|
|
|
463
550
|
|
|
464
551
|
### Changes between versions
|
|
465
552
|
|
|
466
|
-
Configuration and behavior may change between releases. See the [CHANGELOG](https://github.com/t-k/fireemu/blob/v0.
|
|
553
|
+
Configuration and behavior may change between releases. See the [CHANGELOG](https://github.com/t-k/fireemu/blob/v0.17.0/CHANGELOG.md) for release changes.
|
|
467
554
|
|
|
468
555
|
## Performance
|
|
469
556
|
|
|
@@ -480,7 +567,7 @@ The following results come from one `standard` run at commit `f3b942c`. Ratios a
|
|
|
480
567
|
|
|
481
568
|
The 95% confidence interval for the startup-time ratio is `[21.4, 21.8]`. For the peak-memory ratio, calculated as official emulator divided by Fireemu, it is `[10.2, 11.1]`.
|
|
482
569
|
|
|
483
|
-
See [benchmark.yml](https://github.com/t-k/fireemu/blob/v0.
|
|
570
|
+
See [benchmark.yml](https://github.com/t-k/fireemu/blob/v0.17.0/.github/workflows/benchmark.yml) for the workflow and [`tools/bench/`](https://github.com/t-k/fireemu/tree/v0.17.0/tools/bench/) for the benchmark implementation.
|
|
484
571
|
|
|
485
572
|
## Reporting issues and contributing
|
|
486
573
|
|
|
@@ -488,8 +575,8 @@ When reporting an issue, include the Fireemu and Firebase SDK versions, the prof
|
|
|
488
575
|
|
|
489
576
|
For compatibility issues, also state whether you are comparing against the actual Firebase service or the official emulator, along with the expected and actual results. Remove credentials and personal information before sharing configuration files or logs.
|
|
490
577
|
|
|
491
|
-
See the [development guide](https://github.com/t-k/fireemu/blob/v0.
|
|
578
|
+
See the [development guide](https://github.com/t-k/fireemu/blob/v0.17.0/docs/development.md) for build and test instructions.
|
|
492
579
|
|
|
493
580
|
## License
|
|
494
581
|
|
|
495
|
-
Fireemu is licensed under the [Apache License 2.0](https://github.com/t-k/fireemu/blob/v0.
|
|
582
|
+
Fireemu is licensed under the [Apache License 2.0](https://github.com/t-k/fireemu/blob/v0.17.0/LICENSE). Third-party notices are listed in [THIRD_PARTY_LICENSES.txt](https://github.com/t-k/fireemu/blob/v0.17.0/THIRD_PARTY_LICENSES.txt).
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "fireemu",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.17.0",
|
|
4
4
|
"description": "A local runtime for testing Firebase SDK and Functions code, checked against production Firebase behavior",
|
|
5
5
|
"keywords": [
|
|
6
6
|
"emulator",
|
|
@@ -31,11 +31,11 @@
|
|
|
31
31
|
],
|
|
32
32
|
"type": "module",
|
|
33
33
|
"optionalDependencies": {
|
|
34
|
-
"@fireemu/darwin-arm64": "0.
|
|
35
|
-
"@fireemu/darwin-x64": "0.
|
|
36
|
-
"@fireemu/linux-x64": "0.
|
|
37
|
-
"@fireemu/linux-arm64": "0.
|
|
38
|
-
"@fireemu/win32-x64": "0.
|
|
34
|
+
"@fireemu/darwin-arm64": "0.17.0",
|
|
35
|
+
"@fireemu/darwin-x64": "0.17.0",
|
|
36
|
+
"@fireemu/linux-x64": "0.17.0",
|
|
37
|
+
"@fireemu/linux-arm64": "0.17.0",
|
|
38
|
+
"@fireemu/win32-x64": "0.17.0"
|
|
39
39
|
},
|
|
40
40
|
"engines": {
|
|
41
41
|
"node": ">=20"
|