@pyric/cli 0.1.0-alpha.26 → 0.1.0-alpha.27
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 +1 -1
- package/dist/assurance/.generated/conformance-verdicts.d.ts +5 -0
- package/dist/assurance/.generated/conformance-verdicts.d.ts.map +1 -1
- package/dist/assurance/.generated/conformance-verdicts.js +5 -0
- package/dist/assurance/.generated/conformance-verdicts.js.map +1 -1
- package/dist/assurance/capabilities.d.ts.map +1 -1
- package/dist/assurance/capabilities.js +24 -5
- package/dist/assurance/capabilities.js.map +1 -1
- package/dist/assurance/runner.d.ts.map +1 -1
- package/dist/assurance/runner.js +37 -50
- package/dist/assurance/runner.js.map +1 -1
- package/dist/assurance/types.d.ts +5 -0
- package/dist/assurance/types.d.ts.map +1 -1
- package/dist/assurance/types.js.map +1 -1
- package/dist/assurance/validation.d.ts +2 -16
- package/dist/assurance/validation.d.ts.map +1 -1
- package/dist/assurance/validation.js +121 -1
- package/dist/assurance/validation.js.map +1 -1
- package/dist/bridge/surface/arguments/assurance.d.ts +25 -0
- package/dist/bridge/surface/arguments/assurance.d.ts.map +1 -1
- package/dist/bridge/surface/arguments/assurance.js +1 -0
- package/dist/bridge/surface/arguments/assurance.js.map +1 -1
- package/dist/bridge/surface/methods/assurance/define.d.ts +2 -2
- package/dist/bridge/surface/methods/assurance/map.d.ts +23 -0
- package/dist/bridge/surface/methods/assurance/map.d.ts.map +1 -1
- package/dist/bridge/surface/methods/assurance/propose.d.ts +7 -0
- package/dist/bridge/surface/methods/assurance/propose.d.ts.map +1 -1
- package/dist/bridge/surface/render/discriminator-schemas.d.ts +2 -2
- package/dist/cli/database-rules.js +1 -1
- package/dist/cli/database-rules.js.map +1 -1
- package/dist/cli/index.d.ts.map +1 -1
- package/dist/cli/index.js +13 -2
- package/dist/cli/index.js.map +1 -1
- package/dist/cli/pyric-config.d.ts +8 -0
- package/dist/cli/pyric-config.d.ts.map +1 -1
- package/dist/cli/pyric-config.js.map +1 -1
- package/dist/cli/serve.d.ts.map +1 -1
- package/dist/cli/serve.js +5 -3
- package/dist/cli/serve.js.map +1 -1
- package/dist/cli/verify.d.ts +6 -0
- package/dist/cli/verify.d.ts.map +1 -1
- package/dist/cli/verify.js +240 -15
- package/dist/cli/verify.js.map +1 -1
- package/dist/conformance/.generated/can-i-use.d.ts.map +1 -1
- package/dist/conformance/.generated/can-i-use.js +1 -1
- package/dist/conformance/.generated/can-i-use.js.map +1 -1
- package/dist/conformance/.generated/conformance-docs.d.ts.map +1 -1
- package/dist/conformance/.generated/conformance-docs.js +1 -1
- package/dist/conformance/.generated/conformance-docs.js.map +1 -1
- package/dist/serve/repro/denials.d.ts.map +1 -1
- package/dist/serve/repro/denials.js +2 -1
- package/dist/serve/repro/denials.js.map +1 -1
- package/dist/serve/site-ui/_astro/{app.BpEphDR7.js → app.CiMHEvEW.js} +15 -15
- package/dist/serve/site-ui/_astro/{app.DFdWhpVY.js → app.DpzsBfos.js} +1 -1
- package/dist/serve/site-ui/_astro/{seed.vvXV1ioI.js → seed.BpXSRzLo.js} +1 -1
- package/dist/serve/site-ui/auth/index.html +1 -1
- package/dist/serve/site-ui/docs/database-compat/index.html +4 -0
- package/dist/serve/site-ui/docs/database-compat.md +4 -0
- package/dist/serve/site-ui/docs/get-started/start-building/index.html +1 -0
- package/dist/serve/site-ui/docs/get-started/start-building.md +2 -0
- package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api/index.html +23 -4
- package/dist/serve/site-ui/docs/pyric-cli-assurance-reference-api.md +11 -4
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api/index.html +15 -2
- package/dist/serve/site-ui/docs/pyric-cli-verify-reference-api.md +11 -10
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite/index.html +1 -1
- package/dist/serve/site-ui/docs/secure/write-a-rules-test-suite.md +1 -1
- package/dist/serve/site-ui/docs/ship/ship-to-production/index.html +4 -1
- package/dist/serve/site-ui/docs/ship/ship-to-production.md +7 -1
- package/dist/serve/site-ui/examples/chess/index.html +1 -1
- package/dist/serve/site-ui/firestore/index.html +1 -1
- package/dist/serve/site-ui/rtdb/index.html +1 -1
- package/dist/serve/site-ui/settings/index.html +1 -1
- package/dist/serve/site-ui/storage/index.html +1 -1
- package/dist/serve/site-ui/studio/index.html +1 -1
- package/dist/serve/site-ui/traffic/index.html +1 -1
- package/dist/serve/verify-hint.d.ts +2 -0
- package/dist/serve/verify-hint.d.ts.map +1 -0
- package/dist/serve/verify-hint.js +10 -0
- package/dist/serve/verify-hint.js.map +1 -0
- package/dist/serve/vite-generation-rules-watch.d.ts.map +1 -1
- package/dist/serve/vite-generation-rules-watch.js +5 -3
- package/dist/serve/vite-generation-rules-watch.js.map +1 -1
- package/dist/verify/index.d.ts +16 -2
- package/dist/verify/index.d.ts.map +1 -1
- package/dist/verify/index.js +100 -18
- package/dist/verify/index.js.map +1 -1
- package/dist/verify/staging/engine.d.ts +102 -0
- package/dist/verify/staging/engine.d.ts.map +1 -0
- package/dist/verify/staging/engine.js +371 -0
- package/dist/verify/staging/engine.js.map +1 -0
- package/dist/verify/staging/rest.d.ts +68 -0
- package/dist/verify/staging/rest.d.ts.map +1 -0
- package/dist/verify/staging/rest.js +93 -0
- package/dist/verify/staging/rest.js.map +1 -0
- package/dist/verify/staging/target.d.ts +39 -0
- package/dist/verify/staging/target.d.ts.map +1 -0
- package/dist/verify/staging/target.js +117 -0
- package/dist/verify/staging/target.js.map +1 -0
- package/package.json +4 -4
- package/src/assurance/.generated/conformance-verdicts.ts +5 -0
- package/src/assurance/capabilities.ts +22 -4
- package/src/assurance/runner.ts +40 -58
- package/src/assurance/types.ts +3 -0
- package/src/assurance/validation.ts +137 -0
- package/src/bridge/surface/arguments/assurance.ts +1 -0
- package/src/cli/database-rules.ts +1 -1
- package/src/cli/index.ts +13 -2
- package/src/cli/pyric-config.ts +5 -0
- package/src/cli/serve.ts +6 -3
- package/src/cli/verify.ts +244 -18
- package/src/conformance/.generated/can-i-use.ts +1 -1
- package/src/conformance/.generated/conformance-docs.ts +1 -1
- package/src/serve/repro/denials.ts +2 -1
- package/src/serve/verify-hint.ts +8 -0
- package/src/serve/vite-generation-rules-watch.ts +6 -3
- package/src/verify/index.ts +119 -19
- package/src/verify/staging/engine.ts +455 -0
- package/src/verify/staging/rest.ts +129 -0
- package/src/verify/staging/target.ts +137 -0
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"engine.js","sourceRoot":"","sources":["../../../src/verify/staging/engine.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,68 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A minimal Realtime Database REST client for the staging engine: data reads
|
|
3
|
+
* and writes as admin or as an application user (`auth_variable_override`),
|
|
4
|
+
* and the rules endpoint (`/.settings/rules.json`).
|
|
5
|
+
*
|
|
6
|
+
* Production applies an `auth_variable_override` object as the rules `auth`
|
|
7
|
+
* variable, `auth.token` claims included; the identity capture recorded in
|
|
8
|
+
* `packages/conformance/observations/rtdb-staging/rtdb-staging-auth-override.json`
|
|
9
|
+
* pins that for every field the engine passes.
|
|
10
|
+
*/
|
|
11
|
+
/** The rules `auth` variable a request runs as; `null` is signed out. Absent is admin. */
|
|
12
|
+
export type RtdbAuthOverride = Record<string, unknown> | null;
|
|
13
|
+
export interface RtdbRestResponse {
|
|
14
|
+
status: number;
|
|
15
|
+
/** Parsed JSON body, or the raw text when it is not JSON. */
|
|
16
|
+
body: unknown;
|
|
17
|
+
text: string;
|
|
18
|
+
/** The `ETag` of the location, when the request asked for it (`etag: true`). */
|
|
19
|
+
etag?: string;
|
|
20
|
+
}
|
|
21
|
+
export interface RtdbRestRequest {
|
|
22
|
+
/** Run as this `auth`; absent runs as admin. */
|
|
23
|
+
auth?: RtdbAuthOverride;
|
|
24
|
+
/** REST query parameters (`orderBy`, `startAt`, ...), already JSON-encoded where REST requires it. */
|
|
25
|
+
query?: Record<string, string>;
|
|
26
|
+
/** `export` returns priorities as `.priority` keys. */
|
|
27
|
+
format?: 'export';
|
|
28
|
+
shallow?: boolean;
|
|
29
|
+
/** Ask for the location's `ETag` (a read), for a later conditional write. */
|
|
30
|
+
etag?: boolean;
|
|
31
|
+
/** Write only if the location's `ETag` is still this one; production answers 412 otherwise. */
|
|
32
|
+
ifMatch?: string;
|
|
33
|
+
}
|
|
34
|
+
export type FetchLike = (url: string, init: {
|
|
35
|
+
method: string;
|
|
36
|
+
headers: Record<string, string>;
|
|
37
|
+
body?: string;
|
|
38
|
+
}) => Promise<{
|
|
39
|
+
status: number;
|
|
40
|
+
text(): Promise<string>;
|
|
41
|
+
headers?: {
|
|
42
|
+
get(name: string): string | null;
|
|
43
|
+
};
|
|
44
|
+
}>;
|
|
45
|
+
export declare class RtdbRestClient {
|
|
46
|
+
private readonly token;
|
|
47
|
+
private readonly fetchImpl;
|
|
48
|
+
readonly databaseUrl: string;
|
|
49
|
+
constructor(databaseUrl: string, token: () => Promise<string>, fetchImpl?: FetchLike);
|
|
50
|
+
get(path: string, request?: RtdbRestRequest): Promise<RtdbRestResponse>;
|
|
51
|
+
put(path: string, value: unknown, request?: RtdbRestRequest): Promise<RtdbRestResponse>;
|
|
52
|
+
patch(path: string, value: unknown, request?: RtdbRestRequest): Promise<RtdbRestResponse>;
|
|
53
|
+
delete(path: string, request?: RtdbRestRequest): Promise<RtdbRestResponse>;
|
|
54
|
+
/** The deployed rules as stored, comments included. */
|
|
55
|
+
getRulesText(): Promise<string>;
|
|
56
|
+
/** Deploy `source` as the rules, or validate it without deploying (`dryRun`). */
|
|
57
|
+
putRules(source: string, options?: {
|
|
58
|
+
dryRun?: boolean;
|
|
59
|
+
}): Promise<RtdbRestResponse>;
|
|
60
|
+
private rules;
|
|
61
|
+
private send;
|
|
62
|
+
private fetchResponse;
|
|
63
|
+
}
|
|
64
|
+
/** `/a/b` for any of `a/b`, `/a/b/`, `a//b`; the root is the empty string. */
|
|
65
|
+
export declare function restPath(path: string): string;
|
|
66
|
+
/** Whether a REST status is the rules denying the request. */
|
|
67
|
+
export declare function isRestDenial(status: number): boolean;
|
|
68
|
+
//# sourceMappingURL=rest.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest.d.ts","sourceRoot":"","sources":["../../../src/verify/staging/rest.ts"],"names":[],"mappings":"AAAA;;;;;;;;;GASG;AAEH,0FAA0F;AAC1F,MAAM,MAAM,gBAAgB,GAAG,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,CAAC;AAE9D,MAAM,WAAW,gBAAgB;IAC/B,MAAM,EAAE,MAAM,CAAC;IACf,6DAA6D;IAC7D,IAAI,EAAE,OAAO,CAAC;IACd,IAAI,EAAE,MAAM,CAAC;IACb,gFAAgF;IAChF,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,MAAM,WAAW,eAAe;IAC9B,gDAAgD;IAChD,IAAI,CAAC,EAAE,gBAAgB,CAAC;IACxB,sGAAsG;IACtG,KAAK,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC/B,uDAAuD;IACvD,MAAM,CAAC,EAAE,QAAQ,CAAC;IAClB,OAAO,CAAC,EAAE,OAAO,CAAC;IAClB,6EAA6E;IAC7E,IAAI,CAAC,EAAE,OAAO,CAAC;IACf,+FAA+F;IAC/F,OAAO,CAAC,EAAE,MAAM,CAAC;CAClB;AAED,MAAM,MAAM,SAAS,GAAG,CAAC,GAAG,EAAE,MAAM,EAAE,IAAI,EAAE;IAAE,MAAM,EAAE,MAAM,CAAC;IAAC,OAAO,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAAC,IAAI,CAAC,EAAE,MAAM,CAAA;CAAE,KAAK,OAAO,CAAC;IACzH,MAAM,EAAE,MAAM,CAAC;IACf,IAAI,IAAI,OAAO,CAAC,MAAM,CAAC,CAAC;IACxB,OAAO,CAAC,EAAE;QAAE,GAAG,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,GAAG,IAAI,CAAA;KAAE,CAAC;CAChD,CAAC,CAAC;AAEH,qBAAa,cAAc;IAKvB,OAAO,CAAC,QAAQ,CAAC,KAAK;IACtB,OAAO,CAAC,QAAQ,CAAC,SAAS;IAL5B,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;gBAG3B,WAAW,EAAE,MAAM,EACF,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,EAC5B,SAAS,GAAE,SAA2C;IAKzE,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI3E,GAAG,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI3F,KAAK,CAAC,IAAI,EAAE,MAAM,EAAE,KAAK,EAAE,OAAO,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI7F,MAAM,CAAC,IAAI,EAAE,MAAM,EAAE,OAAO,GAAE,eAAoB,GAAG,OAAO,CAAC,gBAAgB,CAAC;IAI9E,uDAAuD;IACjD,YAAY,IAAI,OAAO,CAAC,MAAM,CAAC;IAMrC,iFAAiF;IACjF,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,GAAE;QAAE,MAAM,CAAC,EAAE,OAAO,CAAA;KAAO,GAAG,OAAO,CAAC,gBAAgB,CAAC;YAIzE,KAAK;YAKL,IAAI;YAcJ,aAAa;CAgB5B;AAED,8EAA8E;AAC9E,wBAAgB,QAAQ,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAG7C;AAED,8DAA8D;AAC9D,wBAAgB,YAAY,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAEpD"}
|
|
@@ -0,0 +1,93 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* A minimal Realtime Database REST client for the staging engine: data reads
|
|
3
|
+
* and writes as admin or as an application user (`auth_variable_override`),
|
|
4
|
+
* and the rules endpoint (`/.settings/rules.json`).
|
|
5
|
+
*
|
|
6
|
+
* Production applies an `auth_variable_override` object as the rules `auth`
|
|
7
|
+
* variable, `auth.token` claims included; the identity capture recorded in
|
|
8
|
+
* `packages/conformance/observations/rtdb-staging/rtdb-staging-auth-override.json`
|
|
9
|
+
* pins that for every field the engine passes.
|
|
10
|
+
*/
|
|
11
|
+
export class RtdbRestClient {
|
|
12
|
+
token;
|
|
13
|
+
fetchImpl;
|
|
14
|
+
databaseUrl;
|
|
15
|
+
constructor(databaseUrl, token, fetchImpl = (url, init) => fetch(url, init)) {
|
|
16
|
+
this.token = token;
|
|
17
|
+
this.fetchImpl = fetchImpl;
|
|
18
|
+
this.databaseUrl = databaseUrl.replace(/\/+$/, '');
|
|
19
|
+
}
|
|
20
|
+
get(path, request = {}) {
|
|
21
|
+
return this.send('GET', path, undefined, request);
|
|
22
|
+
}
|
|
23
|
+
put(path, value, request = {}) {
|
|
24
|
+
return this.send('PUT', path, JSON.stringify(value), request);
|
|
25
|
+
}
|
|
26
|
+
patch(path, value, request = {}) {
|
|
27
|
+
return this.send('PATCH', path, JSON.stringify(value), request);
|
|
28
|
+
}
|
|
29
|
+
delete(path, request = {}) {
|
|
30
|
+
return this.send('DELETE', path, undefined, request);
|
|
31
|
+
}
|
|
32
|
+
/** The deployed rules as stored, comments included. */
|
|
33
|
+
async getRulesText() {
|
|
34
|
+
const res = await this.rules('GET');
|
|
35
|
+
if (res.status !== 200)
|
|
36
|
+
throw new Error(`reading the rules of ${this.databaseUrl} failed: HTTP ${res.status} ${res.text.slice(0, 200)}`);
|
|
37
|
+
return res.text;
|
|
38
|
+
}
|
|
39
|
+
/** Deploy `source` as the rules, or validate it without deploying (`dryRun`). */
|
|
40
|
+
putRules(source, options = {}) {
|
|
41
|
+
return this.rules('PUT', source, options.dryRun === true);
|
|
42
|
+
}
|
|
43
|
+
async rules(method, body, dryRun = false) {
|
|
44
|
+
const url = `${this.databaseUrl}/.settings/rules.json${dryRun ? '?dryRun=true' : ''}`;
|
|
45
|
+
return this.fetchResponse(url, method, body);
|
|
46
|
+
}
|
|
47
|
+
async send(method, path, body, request) {
|
|
48
|
+
const params = new URLSearchParams();
|
|
49
|
+
if (request.auth !== undefined)
|
|
50
|
+
params.set('auth_variable_override', JSON.stringify(request.auth));
|
|
51
|
+
if (request.format)
|
|
52
|
+
params.set('format', request.format);
|
|
53
|
+
if (request.shallow)
|
|
54
|
+
params.set('shallow', 'true');
|
|
55
|
+
for (const [key, value] of Object.entries(request.query ?? {}))
|
|
56
|
+
params.set(key, value);
|
|
57
|
+
const query = params.toString();
|
|
58
|
+
const url = `${this.databaseUrl}${restPath(path) || '/'}.json${query ? `?${query}` : ''}`;
|
|
59
|
+
const headers = {};
|
|
60
|
+
if (request.etag)
|
|
61
|
+
headers['X-Firebase-ETag'] = 'true';
|
|
62
|
+
if (request.ifMatch !== undefined)
|
|
63
|
+
headers['if-match'] = request.ifMatch;
|
|
64
|
+
return this.fetchResponse(url, method, body, headers);
|
|
65
|
+
}
|
|
66
|
+
async fetchResponse(url, method, body, extra = {}) {
|
|
67
|
+
const res = await this.fetchImpl(url, {
|
|
68
|
+
method,
|
|
69
|
+
headers: { Authorization: `Bearer ${await this.token()}`, 'Content-Type': 'application/json', ...extra },
|
|
70
|
+
...(body === undefined ? {} : { body }),
|
|
71
|
+
});
|
|
72
|
+
const text = await res.text();
|
|
73
|
+
let parsed = text;
|
|
74
|
+
try {
|
|
75
|
+
parsed = JSON.parse(text);
|
|
76
|
+
}
|
|
77
|
+
catch {
|
|
78
|
+
// Not JSON: keep the text.
|
|
79
|
+
}
|
|
80
|
+
const etag = res.headers?.get('etag') ?? undefined;
|
|
81
|
+
return { status: res.status, body: parsed, text, ...(etag ? { etag } : {}) };
|
|
82
|
+
}
|
|
83
|
+
}
|
|
84
|
+
/** `/a/b` for any of `a/b`, `/a/b/`, `a//b`; the root is the empty string. */
|
|
85
|
+
export function restPath(path) {
|
|
86
|
+
const segments = path.split('/').filter(Boolean).map(encodeURIComponent);
|
|
87
|
+
return segments.length === 0 ? '' : `/${segments.join('/')}`;
|
|
88
|
+
}
|
|
89
|
+
/** Whether a REST status is the rules denying the request. */
|
|
90
|
+
export function isRestDenial(status) {
|
|
91
|
+
return status === 401 || status === 403;
|
|
92
|
+
}
|
|
93
|
+
//# sourceMappingURL=rest.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rest.js","sourceRoot":"","sources":["../../../src/verify/staging/rest.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,39 @@
|
|
|
1
|
+
import type { FirebaseJson } from '../../cli/firebase-json.js';
|
|
2
|
+
import { resolveScope } from '../../credentials/node/scope.js';
|
|
3
|
+
export interface StagingTarget {
|
|
4
|
+
projectId: string;
|
|
5
|
+
databaseUrl: string;
|
|
6
|
+
/** The instance name the URL names. */
|
|
7
|
+
instance: string;
|
|
8
|
+
}
|
|
9
|
+
export declare class StagingConfigError extends Error {
|
|
10
|
+
constructor(message: string);
|
|
11
|
+
}
|
|
12
|
+
/** The staging target in a parsed `pyric.json`, or a config error naming what is missing. */
|
|
13
|
+
export declare function stagingTargetFrom(config: unknown): StagingTarget;
|
|
14
|
+
/**
|
|
15
|
+
* Refuse a staging instance the app uses: one `firebase.json` deploys rules
|
|
16
|
+
* to (by instance or by a `.firebaserc` target), or the default instance of
|
|
17
|
+
* the app's project.
|
|
18
|
+
*/
|
|
19
|
+
export declare function assertNotAppInstance(target: StagingTarget, app: {
|
|
20
|
+
firebaseJson: FirebaseJson | null;
|
|
21
|
+
appProjectId?: string;
|
|
22
|
+
targetInstances?: string[];
|
|
23
|
+
}): void;
|
|
24
|
+
/**
|
|
25
|
+
* An OAuth token for the staging project: a service account or Application
|
|
26
|
+
* Default Credentials (`resolveScope`), else the Firebase CLI's login
|
|
27
|
+
* (`firebase login`) while its access token is fresh.
|
|
28
|
+
*/
|
|
29
|
+
export declare function stagingToken(projectId: string, deps?: {
|
|
30
|
+
resolve?: typeof resolveScope;
|
|
31
|
+
env?: NodeJS.ProcessEnv;
|
|
32
|
+
now?: () => number;
|
|
33
|
+
}): Promise<{
|
|
34
|
+
token: () => Promise<string>;
|
|
35
|
+
source: string;
|
|
36
|
+
}>;
|
|
37
|
+
/** How long a CLI token must stay valid for a run to start with it; it cannot be refreshed mid-run. */
|
|
38
|
+
export declare const CLI_TOKEN_MARGIN_MS: number;
|
|
39
|
+
//# sourceMappingURL=target.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target.d.ts","sourceRoot":"","sources":["../../../src/verify/staging/target.ts"],"names":[],"mappings":"AAkBA,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,4BAA4B,CAAC;AAC/D,OAAO,EAAE,YAAY,EAAgE,MAAM,iCAAiC,CAAC;AAE7H,MAAM,WAAW,aAAa;IAC5B,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,uCAAuC;IACvC,QAAQ,EAAE,MAAM,CAAC;CAClB;AAED,qBAAa,kBAAmB,SAAQ,KAAK;gBAC/B,OAAO,EAAE,MAAM;CAI5B;AAID,6FAA6F;AAC7F,wBAAgB,iBAAiB,CAAC,MAAM,EAAE,OAAO,GAAG,aAAa,CAwBhE;AAED;;;;GAIG;AACH,wBAAgB,oBAAoB,CAClC,MAAM,EAAE,aAAa,EACrB,GAAG,EAAE;IAAE,YAAY,EAAE,YAAY,GAAG,IAAI,CAAC;IAAC,YAAY,CAAC,EAAE,MAAM,CAAC;IAAC,eAAe,CAAC,EAAE,MAAM,EAAE,CAAA;CAAE,GAC5F,IAAI,CAcN;AAED;;;;GAIG;AACH,wBAAsB,YAAY,CAChC,SAAS,EAAE,MAAM,EACjB,IAAI,GAAE;IAAE,OAAO,CAAC,EAAE,OAAO,YAAY,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,CAAC,UAAU,CAAC;IAAC,GAAG,CAAC,EAAE,MAAM,MAAM,CAAA;CAAO,GACxF,OAAO,CAAC;IAAE,KAAK,EAAE,MAAM,OAAO,CAAC,MAAM,CAAC,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAgB3D;AAOD,uGAAuG;AACvG,eAAO,MAAM,mBAAmB,QAAc,CAAC"}
|
|
@@ -0,0 +1,117 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* The staging target `pyric verify --engine staging` replays against, from
|
|
3
|
+
* the project's `pyric.json`:
|
|
4
|
+
*
|
|
5
|
+
* { "verify": { "staging": { "project": "my-staging", "rtdb": "https://my-verify.firebaseio.com" } } }
|
|
6
|
+
*
|
|
7
|
+
* `rtdb` is a database URL or an instance name (`my-verify` resolves to
|
|
8
|
+
* `https://my-verify.firebaseio.com`; an instance outside us-central1 needs
|
|
9
|
+
* its full URL). The user brings the instance; pyric provisions nothing.
|
|
10
|
+
*
|
|
11
|
+
* An instance the app's own `firebase.json` deploys rules to, or the app
|
|
12
|
+
* project's default instance, is refused: those hold the app's data.
|
|
13
|
+
*/
|
|
14
|
+
import { readFileSync } from 'node:fs';
|
|
15
|
+
import { resolveDatabaseInstance } from 'pyric/sandbox/internal';
|
|
16
|
+
import { firebaseToolsConfigstorePath } from '../../cli/firebase-project.js';
|
|
17
|
+
import { resolveScope, SERVICE_ACCOUNT_BASE64_ENV_KEY, SERVICE_ACCOUNT_FILE_ENV_KEY } from '../../credentials/node/scope.js';
|
|
18
|
+
export class StagingConfigError extends Error {
|
|
19
|
+
constructor(message) {
|
|
20
|
+
super(message);
|
|
21
|
+
this.name = 'StagingConfigError';
|
|
22
|
+
}
|
|
23
|
+
}
|
|
24
|
+
const CONFIG_EXAMPLE = '{ "verify": { "staging": { "project": "<staging project id>", "rtdb": "https://<dedicated instance>.firebaseio.com" } } }';
|
|
25
|
+
/** The staging target in a parsed `pyric.json`, or a config error naming what is missing. */
|
|
26
|
+
export function stagingTargetFrom(config) {
|
|
27
|
+
const staging = config?.verify?.staging;
|
|
28
|
+
if (staging === undefined) {
|
|
29
|
+
throw new StagingConfigError(`no staging target. Add one to pyric.json: ${CONFIG_EXAMPLE}`);
|
|
30
|
+
}
|
|
31
|
+
const { project, rtdb } = (staging ?? {});
|
|
32
|
+
if (typeof project !== 'string' || project.trim() === '') {
|
|
33
|
+
throw new StagingConfigError(`pyric.json verify.staging.project must name the staging project: ${CONFIG_EXAMPLE}`);
|
|
34
|
+
}
|
|
35
|
+
if (typeof rtdb !== 'string' || rtdb.trim() === '') {
|
|
36
|
+
throw new StagingConfigError(`pyric.json verify.staging.rtdb must name the dedicated instance: ${CONFIG_EXAMPLE}`);
|
|
37
|
+
}
|
|
38
|
+
const trimmed = rtdb.trim();
|
|
39
|
+
const databaseUrl = /^[a-z0-9-]+$/i.test(trimmed) ? `https://${trimmed}.firebaseio.com` : trimmed.replace(/\/+$/, '');
|
|
40
|
+
let instance;
|
|
41
|
+
try {
|
|
42
|
+
instance = resolveDatabaseInstance(databaseUrl)?.name;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
instance = undefined;
|
|
46
|
+
}
|
|
47
|
+
if (instance === undefined) {
|
|
48
|
+
throw new StagingConfigError(`pyric.json verify.staging.rtdb "${rtdb}" is not a Realtime Database URL or instance name.`);
|
|
49
|
+
}
|
|
50
|
+
return { projectId: project.trim(), databaseUrl, instance };
|
|
51
|
+
}
|
|
52
|
+
/**
|
|
53
|
+
* Refuse a staging instance the app uses: one `firebase.json` deploys rules
|
|
54
|
+
* to (by instance or by a `.firebaserc` target), or the default instance of
|
|
55
|
+
* the app's project.
|
|
56
|
+
*/
|
|
57
|
+
export function assertNotAppInstance(target, app) {
|
|
58
|
+
const declared = new Set(app.targetInstances ?? []);
|
|
59
|
+
const database = app.firebaseJson?.database;
|
|
60
|
+
const entries = Array.isArray(database) ? database : database ? [database] : [];
|
|
61
|
+
for (const entry of entries) {
|
|
62
|
+
const instance = entry.instance;
|
|
63
|
+
if (typeof instance === 'string')
|
|
64
|
+
declared.add(instance);
|
|
65
|
+
}
|
|
66
|
+
if (app.appProjectId)
|
|
67
|
+
declared.add(`${app.appProjectId}-default-rtdb`);
|
|
68
|
+
if (declared.has(target.instance)) {
|
|
69
|
+
throw new StagingConfigError(`refusing staging instance ${target.instance}: the app uses it (firebase.json deploys rules to it, or it is the default instance of project ${app.appProjectId}). The staging engine replaces an instance's rules and data, so it needs one dedicated to it.`);
|
|
70
|
+
}
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* An OAuth token for the staging project: a service account or Application
|
|
74
|
+
* Default Credentials (`resolveScope`), else the Firebase CLI's login
|
|
75
|
+
* (`firebase login`) while its access token is fresh.
|
|
76
|
+
*/
|
|
77
|
+
export async function stagingToken(projectId, deps = {}) {
|
|
78
|
+
const env = deps.env ?? process.env;
|
|
79
|
+
try {
|
|
80
|
+
const { scope, source } = await (deps.resolve ?? resolveScope)({ projectId, ...(deps.env ? { env: deps.env } : {}) });
|
|
81
|
+
return { token: () => scope.resolveToken(), source };
|
|
82
|
+
}
|
|
83
|
+
catch (resolveError) {
|
|
84
|
+
// A configured credential that fails is an error to fix, not a reason to
|
|
85
|
+
// run as the developer's own CLI login instead.
|
|
86
|
+
if (configuredCredential(env))
|
|
87
|
+
throw resolveError;
|
|
88
|
+
const cli = firebaseCliToken(env, (deps.now ?? Date.now)());
|
|
89
|
+
if (cli !== undefined)
|
|
90
|
+
return { token: async () => cli, source: 'firebase login' };
|
|
91
|
+
throw new StagingConfigError(`no credentials for staging project ${projectId}. ${resolveError instanceof Error ? resolveError.message : String(resolveError)} ` +
|
|
92
|
+
'Or sign in with `firebase login`: its token is used while it has at least 15 minutes left (run any firebase command to refresh it).');
|
|
93
|
+
}
|
|
94
|
+
}
|
|
95
|
+
/** Whether the environment names a service account (`resolveScope`'s first two sources). */
|
|
96
|
+
function configuredCredential(env) {
|
|
97
|
+
return [SERVICE_ACCOUNT_BASE64_ENV_KEY, SERVICE_ACCOUNT_FILE_ENV_KEY].some((key) => (env[key] ?? '').trim() !== '');
|
|
98
|
+
}
|
|
99
|
+
/** How long a CLI token must stay valid for a run to start with it; it cannot be refreshed mid-run. */
|
|
100
|
+
export const CLI_TOKEN_MARGIN_MS = 15 * 60_000;
|
|
101
|
+
/** The Firebase CLI's access token, when its configstore holds one with a known expiry at least the margin away. */
|
|
102
|
+
function firebaseCliToken(env, now) {
|
|
103
|
+
try {
|
|
104
|
+
const store = JSON.parse(readFileSync(firebaseToolsConfigstorePath(env), 'utf8'));
|
|
105
|
+
const token = store.tokens?.access_token;
|
|
106
|
+
const expiresAt = store.tokens?.expires_at;
|
|
107
|
+
if (typeof token !== 'string' || token === '')
|
|
108
|
+
return undefined;
|
|
109
|
+
if (typeof expiresAt !== 'number' || expiresAt - now < CLI_TOKEN_MARGIN_MS)
|
|
110
|
+
return undefined;
|
|
111
|
+
return token;
|
|
112
|
+
}
|
|
113
|
+
catch {
|
|
114
|
+
return undefined;
|
|
115
|
+
}
|
|
116
|
+
}
|
|
117
|
+
//# sourceMappingURL=target.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"target.js","sourceRoot":"","sources":["../../../src/verify/staging/target.ts"],"names":[],"mappings":"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"}
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@pyric/cli",
|
|
3
|
-
"version": "0.1.0-alpha.
|
|
3
|
+
"version": "0.1.0-alpha.27",
|
|
4
4
|
"license": "Apache-2.0",
|
|
5
5
|
"homepage": "https://pyric.dev",
|
|
6
6
|
"repository": {
|
|
@@ -245,12 +245,12 @@
|
|
|
245
245
|
},
|
|
246
246
|
"dependencies": {
|
|
247
247
|
"@modelcontextprotocol/sdk": "^1.0.0",
|
|
248
|
-
"create-pyric": "^0.1.0-alpha.
|
|
248
|
+
"create-pyric": "^0.1.0-alpha.27",
|
|
249
249
|
"esbuild": "^0.28.0",
|
|
250
250
|
"fake-indexeddb": "^6.0.0",
|
|
251
251
|
"jsonc-parser": "^3.3.1",
|
|
252
|
-
"pyric": "^0.1.0-alpha.
|
|
253
|
-
"pyric-admin": "^0.1.0-alpha.
|
|
252
|
+
"pyric": "^0.1.0-alpha.27",
|
|
253
|
+
"pyric-admin": "^0.1.0-alpha.27",
|
|
254
254
|
"ws": "^8.18.0",
|
|
255
255
|
"zod": "^3.23.0"
|
|
256
256
|
},
|
|
@@ -1372,9 +1372,14 @@ export const CONFORMANCE_VERDICTS = {
|
|
|
1372
1372
|
"rtdb-modular#MI4": "supported",
|
|
1373
1373
|
"rtdb-modular#MI5": "supported",
|
|
1374
1374
|
"rtdb-modular#MI6": "supported",
|
|
1375
|
+
"rtdb-modular#MI7": "supported",
|
|
1375
1376
|
"rtdb-modular#RS1": "qualified",
|
|
1376
1377
|
"rtdb-modular#RS2": "qualified",
|
|
1377
1378
|
"rtdb-modular#RS3": "qualified",
|
|
1379
|
+
"rtdb-modular#VR1": "supported",
|
|
1380
|
+
"rtdb-modular#VR2": "supported",
|
|
1381
|
+
"rtdb-modular#VR3": "supported",
|
|
1382
|
+
"rtdb-modular#VR4": "supported",
|
|
1378
1383
|
"rtdb-rules#1": "supported",
|
|
1379
1384
|
"rtdb-rules#10": "supported",
|
|
1380
1385
|
"rtdb-rules#11": "supported",
|
|
@@ -21,6 +21,7 @@ import {
|
|
|
21
21
|
type PathSegment,
|
|
22
22
|
} from "pyric/rules/internal";
|
|
23
23
|
import { rtdbRulesSourceRejection } from "pyric/rules/internal/rtdb";
|
|
24
|
+
import { resolveDatabaseInstance } from "pyric/sandbox/internal";
|
|
24
25
|
import { compileStorageRules } from "pyric/storage/internal";
|
|
25
26
|
import {
|
|
26
27
|
CONFORMANCE_VERDICTS,
|
|
@@ -101,9 +102,17 @@ export function rulesLoadRefusal(
|
|
|
101
102
|
service: AssuranceProbe["control"]["service"],
|
|
102
103
|
): string | undefined {
|
|
103
104
|
if (service === "rtdb") {
|
|
104
|
-
if (
|
|
105
|
-
|
|
106
|
-
|
|
105
|
+
if (target.rules.rtdb) {
|
|
106
|
+
const rejection = rtdbRulesSourceRejection(target.rules.rtdb);
|
|
107
|
+
if (rejection !== null) return rejection.message;
|
|
108
|
+
}
|
|
109
|
+
if (target.rules.rtdbInstances) {
|
|
110
|
+
for (const [instanceName, instanceRules] of Object.entries(target.rules.rtdbInstances)) {
|
|
111
|
+
const rejection = rtdbRulesSourceRejection(instanceRules as any);
|
|
112
|
+
if (rejection !== null) return `instance '${instanceName}': ${rejection.message}`;
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
return undefined;
|
|
107
116
|
}
|
|
108
117
|
const source =
|
|
109
118
|
service === "firestore"
|
|
@@ -389,7 +398,16 @@ function rtdbRequirements(
|
|
|
389
398
|
target: LocalFirebaseTarget,
|
|
390
399
|
probe: AssuranceProbe,
|
|
391
400
|
): CapabilityRequirement[] {
|
|
392
|
-
|
|
401
|
+
let rules = target.rules.rtdb;
|
|
402
|
+
if (probe.control.service === "rtdb" && probe.control.instance && probe.control.instance !== "default") {
|
|
403
|
+
const resolvedName = resolveDatabaseInstance(probe.control.instance)?.name;
|
|
404
|
+
if (resolvedName && target.rules.rtdbInstances) {
|
|
405
|
+
const declaredEntry = Object.entries(target.rules.rtdbInstances).find(([k]) => resolveDatabaseInstance(k)?.name === resolvedName);
|
|
406
|
+
if (declaredEntry) {
|
|
407
|
+
rules = declaredEntry[1] as any;
|
|
408
|
+
}
|
|
409
|
+
}
|
|
410
|
+
}
|
|
393
411
|
const operations = [probe.control, probe.mutation.operation];
|
|
394
412
|
const ruleSources = rules
|
|
395
413
|
? collectRtdbRuleSources(rules.rules).filter((rule) =>
|
package/src/assurance/runner.ts
CHANGED
|
@@ -60,15 +60,17 @@ import {
|
|
|
60
60
|
initializeSandbox,
|
|
61
61
|
type AuthState,
|
|
62
62
|
type LocalSandbox,
|
|
63
|
+
type SandboxContext,
|
|
63
64
|
type SandboxEvent,
|
|
64
65
|
} from "pyric/sandbox";
|
|
65
|
-
import { getInternalEnv } from "pyric/sandbox/internal";
|
|
66
|
+
import { getInternalEnv, resolveDatabaseInstance } from "pyric/sandbox/internal";
|
|
66
67
|
import { qualifyProbe, rulesLoadRefusal } from "./capabilities.js";
|
|
67
68
|
import {
|
|
68
69
|
assertActor,
|
|
69
70
|
assertInvariant,
|
|
70
71
|
assertProbe,
|
|
71
72
|
assertTarget,
|
|
73
|
+
assertCampaign,
|
|
72
74
|
} from "./validation.js";
|
|
73
75
|
import {
|
|
74
76
|
ASSURANCE_CAMPAIGN_SCHEMA,
|
|
@@ -96,9 +98,12 @@ interface ActorRuntime {
|
|
|
96
98
|
auth: AuthState | null;
|
|
97
99
|
}
|
|
98
100
|
|
|
101
|
+
|
|
102
|
+
|
|
99
103
|
interface ServiceRuntime {
|
|
100
104
|
sandbox: LocalSandbox;
|
|
101
105
|
actor: ActorRuntime;
|
|
106
|
+
context: SandboxContext;
|
|
102
107
|
firestore?: Firestore;
|
|
103
108
|
rtdb?: Database;
|
|
104
109
|
rtdbAdmin?: Database;
|
|
@@ -114,56 +119,6 @@ interface ExecutedOperation {
|
|
|
114
119
|
|
|
115
120
|
let storageRunSequence = 0;
|
|
116
121
|
|
|
117
|
-
function assertCampaign(spec: AuthorizationCampaignSpec): void {
|
|
118
|
-
if (spec.schema !== ASSURANCE_CAMPAIGN_SCHEMA) {
|
|
119
|
-
throw new AssuranceInputError(
|
|
120
|
-
`campaign schema must be '${ASSURANCE_CAMPAIGN_SCHEMA}'.`,
|
|
121
|
-
);
|
|
122
|
-
}
|
|
123
|
-
if (!spec.id.trim())
|
|
124
|
-
throw new AssuranceInputError("campaign id is required.");
|
|
125
|
-
assertTarget(spec.target);
|
|
126
|
-
if (!Array.isArray(spec.actors)) {
|
|
127
|
-
throw new AssuranceInputError("campaign actors must be an array.");
|
|
128
|
-
}
|
|
129
|
-
if (!Array.isArray(spec.invariants)) {
|
|
130
|
-
throw new AssuranceInputError("campaign invariants must be an array.");
|
|
131
|
-
}
|
|
132
|
-
if (!Array.isArray(spec.probes)) {
|
|
133
|
-
throw new AssuranceInputError("campaign probes must be an array.");
|
|
134
|
-
}
|
|
135
|
-
for (const actor of spec.actors) assertActor(actor);
|
|
136
|
-
for (const invariant of spec.invariants) assertInvariant(invariant);
|
|
137
|
-
for (const probe of spec.probes) assertProbe(probe);
|
|
138
|
-
uniqueIds(spec.actors, "actor");
|
|
139
|
-
uniqueIds(spec.invariants, "invariant");
|
|
140
|
-
uniqueIds(spec.probes, "probe");
|
|
141
|
-
|
|
142
|
-
for (const probe of spec.probes) {
|
|
143
|
-
const actor = spec.actors.find((item) => item.id === probe.actorId);
|
|
144
|
-
const invariant = spec.invariants.find(
|
|
145
|
-
(item) => item.id === probe.invariantId,
|
|
146
|
-
);
|
|
147
|
-
if (!actor)
|
|
148
|
-
throw new AssuranceInputError(
|
|
149
|
-
`probe '${probe.id}' references unknown actor '${probe.actorId}'.`,
|
|
150
|
-
);
|
|
151
|
-
if (!invariant) {
|
|
152
|
-
throw new AssuranceInputError(
|
|
153
|
-
`probe '${probe.id}' references unknown invariant '${probe.invariantId}'.`,
|
|
154
|
-
);
|
|
155
|
-
}
|
|
156
|
-
if (
|
|
157
|
-
invariant.service !== "cross-service" &&
|
|
158
|
-
invariant.service !== probe.control.service
|
|
159
|
-
) {
|
|
160
|
-
throw new AssuranceInputError(
|
|
161
|
-
`probe '${probe.id}' service does not match invariant '${invariant.id}'.`,
|
|
162
|
-
);
|
|
163
|
-
}
|
|
164
|
-
}
|
|
165
|
-
}
|
|
166
|
-
|
|
167
122
|
function uniqueIds(items: ReadonlyArray<{ id: string }>, label: string): void {
|
|
168
123
|
const seen = new Set<string>();
|
|
169
124
|
for (const item of items) {
|
|
@@ -337,7 +292,7 @@ async function createRuntime(
|
|
|
337
292
|
const sandbox = initializeSandbox();
|
|
338
293
|
seedAuth(sandbox, target);
|
|
339
294
|
const context = sandbox.withAuth(actorRuntime.auth);
|
|
340
|
-
const runtime: ServiceRuntime = { sandbox, actor: actorRuntime };
|
|
295
|
+
const runtime: ServiceRuntime = { sandbox, actor: actorRuntime, context };
|
|
341
296
|
|
|
342
297
|
if (service === "firestore") {
|
|
343
298
|
const firestore = getFirestore(context);
|
|
@@ -347,12 +302,34 @@ async function createRuntime(
|
|
|
347
302
|
} else if (service === "rtdb") {
|
|
348
303
|
const rtdb = getDatabase(context);
|
|
349
304
|
const admin = getAdminDatabase(sandbox);
|
|
350
|
-
|
|
351
|
-
|
|
352
|
-
|
|
353
|
-
|
|
305
|
+
if (target.rules.rtdb) {
|
|
306
|
+
const refusal = rtdbRulesSourceRejection(target.rules.rtdb as any);
|
|
307
|
+
if (refusal !== null) throw new Error(`The assurance target's database rules would not deploy. ${refusal.message}`);
|
|
308
|
+
rtdbSandbox.setRules(rtdb, target.rules.rtdb as any);
|
|
309
|
+
rtdbSandbox.setData(admin, { "/": target.state.rtdb ?? {} });
|
|
310
|
+
}
|
|
354
311
|
runtime.rtdb = rtdb;
|
|
355
312
|
runtime.rtdbAdmin = admin;
|
|
313
|
+
|
|
314
|
+
if (target.rules.rtdbInstances) {
|
|
315
|
+
const stateByResolved = new Map<string, unknown>();
|
|
316
|
+
if (target.state.rtdbInstances) {
|
|
317
|
+
for (const [k, v] of Object.entries(target.state.rtdbInstances)) {
|
|
318
|
+
stateByResolved.set(resolveDatabaseInstance(k)!.name, v);
|
|
319
|
+
}
|
|
320
|
+
}
|
|
321
|
+
for (const [instanceName, instanceValue] of Object.entries(target.rules.rtdbInstances)) {
|
|
322
|
+
const instanceRefusal = rtdbRulesSourceRejection(instanceValue);
|
|
323
|
+
if (instanceRefusal !== null) throw new Error(`The assurance target's database rules for instance '${instanceName}' would not deploy. ${instanceRefusal.message}`);
|
|
324
|
+
|
|
325
|
+
const resolved = resolveDatabaseInstance(instanceName)!;
|
|
326
|
+
const instDb = getDatabase(context, resolved.url);
|
|
327
|
+
const instAdmin = getAdminDatabase(sandbox, resolved.url);
|
|
328
|
+
rtdbSandbox.setRules(instDb, instanceValue as { rules: Record<string, unknown> });
|
|
329
|
+
const instData = stateByResolved.get(resolved.name);
|
|
330
|
+
rtdbSandbox.setData(instAdmin, { "/": instData ?? {} });
|
|
331
|
+
}
|
|
332
|
+
}
|
|
356
333
|
} else {
|
|
357
334
|
if (target.state.firestore) {
|
|
358
335
|
seedDocuments(
|
|
@@ -678,7 +655,12 @@ async function readState(
|
|
|
678
655
|
return state[normalizedPath] ?? null;
|
|
679
656
|
}
|
|
680
657
|
if (operation.service === "rtdb") {
|
|
681
|
-
|
|
658
|
+
let admin = runtime.rtdbAdmin!;
|
|
659
|
+
if (operation.instance && operation.instance !== "default") {
|
|
660
|
+
const url = resolveDatabaseInstance(operation.instance)!.url;
|
|
661
|
+
admin = getAdminDatabase(runtime.sandbox, url);
|
|
662
|
+
}
|
|
663
|
+
return (await getRtdb(rtdbRef(admin, operation.path))).val();
|
|
682
664
|
}
|
|
683
665
|
return readStorageState(operation, runtime.storageAdmin!);
|
|
684
666
|
}
|
|
@@ -740,7 +722,7 @@ async function executeOperation(
|
|
|
740
722
|
operation.service === "firestore"
|
|
741
723
|
? await executeFirestore(operation, runtime.firestore!, runtime)
|
|
742
724
|
: operation.service === "rtdb"
|
|
743
|
-
? await executeRtdb(operation, runtime.rtdb!)
|
|
725
|
+
? await executeRtdb(operation, operation.instance && operation.instance !== "default" ? getDatabase(runtime.context, resolveDatabaseInstance(operation.instance)!.url) : runtime.rtdb!)
|
|
744
726
|
: await executeStorage(operation, runtime.storage!);
|
|
745
727
|
} catch (error) {
|
|
746
728
|
const result = errorDecision(error);
|