@gasboost/console 0.4.2 → 0.5.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 +228 -5
- package/dist/env/EnvFileRepository.d.ts +5 -0
- package/dist/env/EnvFileRepository.d.ts.map +1 -1
- package/dist/env/EnvFileRepository.js +5 -0
- package/dist/env/EnvFileRepository.js.map +1 -1
- package/dist/firebase/FirebaseProjectRepository.d.ts +1 -1
- package/dist/firebase/FirebaseProjectRepository.d.ts.map +1 -1
- package/dist/firebase/FirebaseProjectRepository.js.map +1 -1
- package/dist/firebase/FirebaseRunner.d.ts +1 -0
- package/dist/firebase/FirebaseRunner.d.ts.map +1 -1
- package/dist/firebase/FirebaseRunner.js +20 -1
- package/dist/firebase/FirebaseRunner.js.map +1 -1
- package/dist/firebase/firebaseOperations.d.ts +18 -1
- package/dist/firebase/firebaseOperations.d.ts.map +1 -1
- package/dist/firebase/firebaseOperations.js +323 -5
- package/dist/firebase/firebaseOperations.js.map +1 -1
- package/dist/ui/assets/index-BaS_FL2T.js +6 -0
- package/dist/ui/index.html +30 -2
- package/package.json +4 -3
- package/dist/ui/assets/index-BGK5B9RA.js +0 -6
package/README.md
CHANGED
|
@@ -1,13 +1,236 @@
|
|
|
1
1
|
# @gasboost/console
|
|
2
2
|
|
|
3
|
-
|
|
3
|
+
Local project lifecycle UI for gasboost.
|
|
4
|
+
|
|
5
|
+
Open the console with:
|
|
4
6
|
|
|
5
7
|
```bash
|
|
6
8
|
gasboost console open
|
|
7
9
|
```
|
|
8
10
|
|
|
9
|
-
|
|
11
|
+
Generated projects expose the same command as:
|
|
12
|
+
|
|
13
|
+
```bash
|
|
14
|
+
pnpm console
|
|
15
|
+
```
|
|
16
|
+
|
|
17
|
+
The UI is prebuilt and bundled with this package. Projects do not need a separate Vite configuration for the console itself.
|
|
18
|
+
|
|
19
|
+
## Project Lifecycle
|
|
20
|
+
|
|
21
|
+
The console is organized into five sections:
|
|
22
|
+
|
|
23
|
+
```text
|
|
24
|
+
Overview
|
|
25
|
+
Development
|
|
26
|
+
Apps Script
|
|
27
|
+
Deployment
|
|
28
|
+
Firebase
|
|
29
|
+
```
|
|
30
|
+
|
|
31
|
+
These sections represent the lifecycle of a gasboost project rather than individual CLI commands.
|
|
32
|
+
|
|
33
|
+
Sections remain accessible even when their corresponding external capability has not been configured.
|
|
34
|
+
|
|
35
|
+
If setup is incomplete, the section presents setup, connect, or enable operations instead of disappearing.
|
|
36
|
+
|
|
37
|
+
## Desired State and Actual State
|
|
38
|
+
|
|
39
|
+
The console combines the project's declared Desired State with detected Actual State.
|
|
40
|
+
|
|
41
|
+
### Desired State
|
|
42
|
+
|
|
43
|
+
Declared by:
|
|
44
|
+
|
|
45
|
+
```text
|
|
46
|
+
gasboost.config.ts
|
|
47
|
+
```
|
|
48
|
+
|
|
49
|
+
```text
|
|
50
|
+
gasboost.config.ts
|
|
51
|
+
↓
|
|
52
|
+
Desired State
|
|
53
|
+
```
|
|
54
|
+
|
|
55
|
+
Examples include:
|
|
56
|
+
|
|
57
|
+
- Apps Script web application configuration
|
|
58
|
+
- build output directory
|
|
59
|
+
- Firebase Realtime Database capability
|
|
60
|
+
- RTDB rules source and output paths
|
|
61
|
+
|
|
62
|
+
### Actual State
|
|
63
|
+
|
|
64
|
+
Actual State is discovered from the local environment and connected external resources.
|
|
65
|
+
|
|
66
|
+
Examples include:
|
|
67
|
+
|
|
68
|
+
```text
|
|
69
|
+
.clasp.json
|
|
70
|
+
appsscript.json
|
|
71
|
+
.env
|
|
72
|
+
CLI / Google authentication
|
|
73
|
+
Apps Script project state
|
|
74
|
+
deployment state
|
|
75
|
+
Firebase project state
|
|
76
|
+
```
|
|
77
|
+
|
|
78
|
+
```text
|
|
79
|
+
local files
|
|
80
|
+
provider state
|
|
81
|
+
authentication state
|
|
82
|
+
↓
|
|
83
|
+
Actual State
|
|
84
|
+
```
|
|
85
|
+
|
|
86
|
+
The console combines both views:
|
|
87
|
+
|
|
88
|
+
```text
|
|
89
|
+
Desired State
|
|
90
|
+
+
|
|
91
|
+
Actual State
|
|
92
|
+
↓
|
|
93
|
+
gasboost console
|
|
94
|
+
```
|
|
95
|
+
|
|
96
|
+
This makes it possible to show a capability before it has been fully connected and guide the developer toward the next lifecycle operation.
|
|
97
|
+
|
|
98
|
+
## Overview
|
|
99
|
+
|
|
100
|
+
Overview presents the current state of the project and its configured or detected capabilities.
|
|
101
|
+
|
|
102
|
+
It acts as the entry point for understanding what is connected and which setup work remains.
|
|
103
|
+
|
|
104
|
+
## Development
|
|
105
|
+
|
|
106
|
+
Development controls the local application lifecycle.
|
|
107
|
+
|
|
108
|
+
Supported operations include:
|
|
109
|
+
|
|
110
|
+
```text
|
|
111
|
+
start
|
|
112
|
+
stop
|
|
113
|
+
restart
|
|
114
|
+
```
|
|
115
|
+
|
|
116
|
+
The console can also detect the local development URL and open the running application.
|
|
117
|
+
|
|
118
|
+
Development runs the project's registered development operation rather than exposing an arbitrary shell command endpoint.
|
|
119
|
+
|
|
120
|
+
## Apps Script
|
|
121
|
+
|
|
122
|
+
The Apps Script section manages the Apps Script project lifecycle.
|
|
123
|
+
|
|
124
|
+
It can surface:
|
|
125
|
+
|
|
126
|
+
- clasp / Google authorization state
|
|
127
|
+
- project creation
|
|
128
|
+
- connection to an existing project
|
|
129
|
+
- Apps Script editor navigation
|
|
130
|
+
- source push
|
|
131
|
+
- project settings navigation
|
|
132
|
+
|
|
133
|
+
Local project state such as `.clasp.json` is treated as Actual State.
|
|
134
|
+
|
|
135
|
+
The section remains available before an Apps Script project has been connected.
|
|
136
|
+
|
|
137
|
+
## Deployment
|
|
138
|
+
|
|
139
|
+
The Deployment section manages Apps Script deployments.
|
|
140
|
+
|
|
141
|
+
Lifecycle operations include:
|
|
142
|
+
|
|
143
|
+
```text
|
|
144
|
+
list
|
|
145
|
+
create
|
|
146
|
+
update
|
|
147
|
+
open deployed app
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
Deployment state is discovered from the connected Apps Script project rather than stored in `gasboost.config.ts`.
|
|
151
|
+
|
|
152
|
+
## Firebase
|
|
153
|
+
|
|
154
|
+
The Firebase section manages the assisted lifecycle around Firebase capabilities.
|
|
155
|
+
|
|
156
|
+
It can guide the developer through operations such as:
|
|
157
|
+
|
|
158
|
+
- enable or connect a Firebase project
|
|
159
|
+
- open Firebase Console
|
|
160
|
+
- Web App setup
|
|
161
|
+
- Realtime Database setup
|
|
162
|
+
- Security Rules generation
|
|
163
|
+
- Security Rules deployment
|
|
164
|
+
- assisted credential configuration
|
|
165
|
+
|
|
166
|
+
The console does not silently create or register sensitive credentials.
|
|
167
|
+
|
|
168
|
+
## Credentials
|
|
169
|
+
|
|
170
|
+
Firebase service-account private keys are not entered into, stored by, or automatically registered by the console.
|
|
171
|
+
|
|
172
|
+
Instead, the console uses an assisted flow.
|
|
173
|
+
|
|
174
|
+
```text
|
|
175
|
+
gasboost console
|
|
176
|
+
↓
|
|
177
|
+
open provider / project settings UI
|
|
178
|
+
↓
|
|
179
|
+
developer obtains required value
|
|
180
|
+
↓
|
|
181
|
+
developer explicitly configures
|
|
182
|
+
Apps Script Script Properties
|
|
183
|
+
```
|
|
184
|
+
|
|
185
|
+
For example, the developer may configure:
|
|
186
|
+
|
|
187
|
+
```text
|
|
188
|
+
FIREBASE_SERVICE_ACCOUNT_EMAIL
|
|
189
|
+
FIREBASE_PRIVATE_KEY
|
|
190
|
+
```
|
|
191
|
+
|
|
192
|
+
through Apps Script Project Settings.
|
|
193
|
+
|
|
194
|
+
This keeps credential ownership explicit and avoids turning the console into a secret-storage system.
|
|
195
|
+
|
|
196
|
+
## Operation Security
|
|
197
|
+
|
|
198
|
+
The browser cannot execute arbitrary shell commands.
|
|
199
|
+
|
|
200
|
+
Console actions are implemented as registered operations with structured input.
|
|
201
|
+
|
|
202
|
+
```text
|
|
203
|
+
browser action
|
|
204
|
+
↓
|
|
205
|
+
registered operation ID
|
|
206
|
+
↓
|
|
207
|
+
validated structured input
|
|
208
|
+
↓
|
|
209
|
+
known implementation
|
|
210
|
+
```
|
|
211
|
+
|
|
212
|
+
The generic runtime and security boundary are provided by `@gasboost/console-runtime`.
|
|
213
|
+
|
|
214
|
+
## Architecture
|
|
215
|
+
|
|
216
|
+
```text
|
|
217
|
+
@gasboost/cli
|
|
218
|
+
↓
|
|
219
|
+
starts console
|
|
220
|
+
↓
|
|
221
|
+
@gasboost/console
|
|
222
|
+
↓
|
|
223
|
+
registers gasboost-specific operations
|
|
224
|
+
↓
|
|
225
|
+
@gasboost/console-runtime
|
|
226
|
+
↓
|
|
227
|
+
localhost browser transport
|
|
228
|
+
```
|
|
229
|
+
|
|
230
|
+
`@gasboost/console` owns gasboost-specific lifecycle knowledge.
|
|
231
|
+
|
|
232
|
+
`@gasboost/console-runtime` remains generic.
|
|
233
|
+
|
|
234
|
+
## License
|
|
10
235
|
|
|
11
|
-
|
|
12
|
-
project creation, editor opening, and confirmed file pushes through registered
|
|
13
|
-
operations backed by `@google/clasp`.
|
|
236
|
+
MIT
|
|
@@ -1,6 +1,11 @@
|
|
|
1
1
|
export type RuntimeIdentifiers = {
|
|
2
2
|
readonly GAS_SCRIPT_ID?: string;
|
|
3
3
|
readonly FIREBASE_PROJECT_ID?: string;
|
|
4
|
+
readonly VITE_FIREBASE_API_KEY?: string;
|
|
5
|
+
readonly VITE_FIREBASE_AUTH_DOMAIN?: string;
|
|
6
|
+
readonly VITE_FIREBASE_DATABASE_URL?: string;
|
|
7
|
+
readonly VITE_FIREBASE_PROJECT_ID?: string;
|
|
8
|
+
readonly VITE_FIREBASE_APP_ID?: string;
|
|
4
9
|
readonly DEPLOYMENT_ID?: string;
|
|
5
10
|
};
|
|
6
11
|
export declare class EnvFileRepository {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnvFileRepository.d.ts","sourceRoot":"","sources":["../../src/env/EnvFileRepository.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"EnvFileRepository.d.ts","sourceRoot":"","sources":["../../src/env/EnvFileRepository.ts"],"names":[],"mappings":"AAcA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,QAAQ,CAAC,qBAAqB,CAAC,EAAE,MAAM,CAAC;IACxC,QAAQ,CAAC,yBAAyB,CAAC,EAAE,MAAM,CAAC;IAC5C,QAAQ,CAAC,0BAA0B,CAAC,EAAE,MAAM,CAAC;IAC7C,QAAQ,CAAC,wBAAwB,CAAC,EAAE,MAAM,CAAC;IAC3C,QAAQ,CAAC,oBAAoB,CAAC,EAAE,MAAM,CAAC;IACvC,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;CACjC,CAAC;AAEF,qBAAa,iBAAiB;IAC5B,OAAO,CAAC,QAAQ,CAAC,IAAI,CAAS;IAE9B,YAAmB,WAAW,EAAE,MAAM,EAErC;IAEY,IAAI,IAAI,OAAO,CAAC,kBAAkB,CAAC,CAa/C;IAEY,MAAM,CAAC,MAAM,EAAE,kBAAkB,GAAG,OAAO,CAAC,IAAI,CAAC,CA+B7D;YAEa,WAAW;CAe1B"}
|
|
@@ -3,6 +3,11 @@ import { join } from "node:path";
|
|
|
3
3
|
const managedKeys = new Set([
|
|
4
4
|
"GAS_SCRIPT_ID",
|
|
5
5
|
"FIREBASE_PROJECT_ID",
|
|
6
|
+
"VITE_FIREBASE_API_KEY",
|
|
7
|
+
"VITE_FIREBASE_AUTH_DOMAIN",
|
|
8
|
+
"VITE_FIREBASE_DATABASE_URL",
|
|
9
|
+
"VITE_FIREBASE_PROJECT_ID",
|
|
10
|
+
"VITE_FIREBASE_APP_ID",
|
|
6
11
|
"DEPLOYMENT_ID",
|
|
7
12
|
]);
|
|
8
13
|
export class EnvFileRepository {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"EnvFileRepository.js","sourceRoot":"","sources":["../../src/env/EnvFileRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AAEjC,MAAM,WAAW,GAAG,IAAI,GAAG,CAAC;IAC1B,eAAe;IACf,qBAAqB;IACrB,eAAe;CAChB,CAAC,CAAC;
|
|
1
|
+
{"version":3,"file":"EnvFileRepository.js","sourceRoot":"","sources":["../../src/env/EnvFileRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,7 +5,7 @@ export type FirebaseProjectState = {
|
|
|
5
5
|
readonly firebaserc: boolean;
|
|
6
6
|
};
|
|
7
7
|
export declare class FirebaseProjectRepository {
|
|
8
|
-
|
|
8
|
+
readonly projectRoot: string;
|
|
9
9
|
constructor(projectRoot: string);
|
|
10
10
|
read(): Promise<FirebaseProjectState>;
|
|
11
11
|
enable(): Promise<void>;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirebaseProjectRepository.d.ts","sourceRoot":"","sources":["../../src/firebase/FirebaseProjectRepository.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,qBAAa,yBAAyB;IACpC,
|
|
1
|
+
{"version":3,"file":"FirebaseProjectRepository.d.ts","sourceRoot":"","sources":["../../src/firebase/FirebaseProjectRepository.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,qBAAa,yBAAyB;IACpC,SAAgB,WAAW,EAAE,MAAM,CAAC;IAEpC,YAAmB,WAAW,EAAE,MAAM,EAErC;IAEY,IAAI,IAAI,OAAO,CAAC,oBAAoB,CAAC,CAYjD;IAEY,MAAM,IAAI,OAAO,CAAC,IAAI,CAAC,CAQnC;IAEY,OAAO,CAAC,SAAS,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAkBrD;YAEa,uBAAuB;YAWvB,oBAAoB;YAwBpB,MAAM;CAgBrB"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirebaseProjectRepository.js","sourceRoot":"","sources":["../../src/firebase/FirebaseProjectRepository.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,kBAAkB,CAAC;AACvD,OAAO,EAAE,IAAI,EAAE,MAAM,WAAW,CAAC;AASjC,MAAM,OAAO,yBAAyB;
|
|
1
|
+
{"version":3,"file":"FirebaseProjectRepository.js","sourceRoot":"","sources":["../../src/firebase/FirebaseProjectRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -5,6 +5,7 @@ export type FirebaseResult = {
|
|
|
5
5
|
};
|
|
6
6
|
export type FirebaseRunner = {
|
|
7
7
|
readonly run: (args: readonly string[], onOutput?: (line: string) => void) => Promise<FirebaseResult>;
|
|
8
|
+
readonly initializeDefaultDatabase: (projectId: string, location: string) => Promise<void>;
|
|
8
9
|
};
|
|
9
10
|
export declare function createFirebaseRunner(projectRoot: string): FirebaseRunner;
|
|
10
11
|
//# sourceMappingURL=FirebaseRunner.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirebaseRunner.d.ts","sourceRoot":"","sources":["../../src/firebase/FirebaseRunner.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"FirebaseRunner.d.ts","sourceRoot":"","sources":["../../src/firebase/FirebaseRunner.ts"],"names":[],"mappings":"AAMA,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,QAAQ,EAAE,MAAM,CAAC;IAC1B,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,MAAM,EAAE,MAAM,CAAC;CACzB,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,GAAG,EAAE,CACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAC9B,OAAO,CAAC,cAAc,CAAC,CAAC;IAC7B,QAAQ,CAAC,yBAAyB,EAAE,CAClC,SAAS,EAAE,MAAM,EACjB,QAAQ,EAAE,MAAM,KACb,OAAO,CAAC,IAAI,CAAC,CAAC;CACpB,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CA4DxE"}
|
|
@@ -1,8 +1,27 @@
|
|
|
1
1
|
import { spawn } from "node:child_process";
|
|
2
|
+
import { createRequire } from "node:module";
|
|
3
|
+
const require = createRequire(import.meta.url);
|
|
4
|
+
const firebaseBin = require.resolve("firebase-tools/lib/bin/firebase.js");
|
|
2
5
|
export function createFirebaseRunner(projectRoot) {
|
|
3
6
|
return {
|
|
7
|
+
async initializeDefaultDatabase(projectId, location) {
|
|
8
|
+
const auth = require("firebase-tools/lib/auth.js");
|
|
9
|
+
const { requireAuth } = require("firebase-tools/lib/requireAuth.js");
|
|
10
|
+
const database = require("firebase-tools/lib/management/database.js");
|
|
11
|
+
const account = auth.selectAccount(undefined, projectRoot);
|
|
12
|
+
await requireAuth({ project: projectId, user: account?.user, tokens: account?.tokens });
|
|
13
|
+
const type = "default_database";
|
|
14
|
+
let name = `${projectId}-default-rtdb`;
|
|
15
|
+
const availability = await database.checkInstanceNameAvailable(projectId, name, type, location);
|
|
16
|
+
if (!availability.available) {
|
|
17
|
+
name = availability.suggestedIds?.[0] ?? "";
|
|
18
|
+
if (!name)
|
|
19
|
+
throw new Error("No available default Realtime Database instance name.");
|
|
20
|
+
}
|
|
21
|
+
await database.createInstance(projectId, name, location, type);
|
|
22
|
+
},
|
|
4
23
|
run: (args, onOutput) => new Promise((resolve, reject) => {
|
|
5
|
-
const child = spawn(
|
|
24
|
+
const child = spawn(process.execPath, [firebaseBin, ...args], {
|
|
6
25
|
cwd: projectRoot,
|
|
7
26
|
env: { ...process.env, NO_COLOR: "1" },
|
|
8
27
|
stdio: ["ignore", "pipe", "pipe"],
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"FirebaseRunner.js","sourceRoot":"","sources":["../../src/firebase/FirebaseRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;
|
|
1
|
+
{"version":3,"file":"FirebaseRunner.js","sourceRoot":"","sources":["../../src/firebase/FirebaseRunner.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,12 +1,29 @@
|
|
|
1
|
-
import type
|
|
1
|
+
import { type NormalizedGasboostConfig } from "@gasboost/config";
|
|
2
2
|
import type { OperationDefinition } from "@gasboost/console-runtime";
|
|
3
3
|
import type { FirebaseRunner } from "./FirebaseRunner.js";
|
|
4
|
+
export type FirebaseWebAppStatus = {
|
|
5
|
+
readonly configured: boolean;
|
|
6
|
+
readonly appId?: string;
|
|
7
|
+
readonly displayName?: string;
|
|
8
|
+
readonly sdkConfigAvailable: boolean;
|
|
9
|
+
};
|
|
10
|
+
export type FirebaseRealtimeDatabaseStatus = {
|
|
11
|
+
readonly desired: boolean;
|
|
12
|
+
readonly initialized: boolean;
|
|
13
|
+
readonly databaseUrl?: string;
|
|
14
|
+
};
|
|
4
15
|
export type FirebaseStatus = {
|
|
5
16
|
readonly enabled: boolean;
|
|
6
17
|
readonly configured: boolean;
|
|
7
18
|
readonly authenticated: boolean;
|
|
8
19
|
readonly projectId?: string;
|
|
20
|
+
readonly projectIdPresent: boolean;
|
|
21
|
+
readonly remoteProjectVerified: boolean;
|
|
22
|
+
readonly webApp: FirebaseWebAppStatus;
|
|
23
|
+
readonly realtimeDatabase: FirebaseRealtimeDatabaseStatus;
|
|
9
24
|
readonly realtimeDatabaseDesired: boolean;
|
|
25
|
+
readonly rulesSourceConfigured: boolean;
|
|
26
|
+
readonly rulesGenerated: boolean;
|
|
10
27
|
readonly firebaseJson: boolean;
|
|
11
28
|
readonly firebaserc: boolean;
|
|
12
29
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebaseOperations.d.ts","sourceRoot":"","sources":["../../src/firebase/firebaseOperations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,
|
|
1
|
+
{"version":3,"file":"firebaseOperations.d.ts","sourceRoot":"","sources":["../../src/firebase/firebaseOperations.ts"],"names":[],"mappings":"AAAA,OAAO,EAKL,KAAK,wBAAwB,EAC9B,MAAM,kBAAkB,CAAC;AAC1B,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAMrE,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1E,MAAM,MAAM,oBAAoB,GAAG;IACjC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,KAAK,CAAC,EAAE,MAAM,CAAC;IACxB,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;IAC9B,QAAQ,CAAC,kBAAkB,EAAE,OAAO,CAAC;CACtC,CAAC;AAEF,MAAM,MAAM,8BAA8B,GAAG;IAC3C,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,WAAW,EAAE,OAAO,CAAC;IAC9B,QAAQ,CAAC,WAAW,CAAC,EAAE,MAAM,CAAC;CAC/B,CAAC;AAEF,MAAM,MAAM,cAAc,GAAG;IAC3B,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,SAAS,CAAC,EAAE,MAAM,CAAC;IAC5B,QAAQ,CAAC,gBAAgB,EAAE,OAAO,CAAC;IACnC,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,MAAM,EAAE,oBAAoB,CAAC;IACtC,QAAQ,CAAC,gBAAgB,EAAE,8BAA8B,CAAC;IAC1D,QAAQ,CAAC,uBAAuB,EAAE,OAAO,CAAC;IAC1C,QAAQ,CAAC,qBAAqB,EAAE,OAAO,CAAC;IACxC,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,YAAY,EAAE,OAAO,CAAC;IAC/B,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;CAC9B,CAAC;AAEF,KAAK,iBAAiB,GAAG,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAkB3D,wBAAgB,wBAAwB,CAAC,EACvC,WAAW,EACX,MAAM,EACN,QAAQ,GACT,EAAE;IACD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;IAC1C,QAAQ,CAAC,QAAQ,EAAE,cAAc,CAAC;CACnC,GAAG,SAAS,iBAAiB,EAAE,CA8M/B"}
|
|
@@ -1,3 +1,6 @@
|
|
|
1
|
+
import { loadGasboostConfig, ModuleLoader, RtdbRulesGenerator, RtdbRulesWriter, } from "@gasboost/config";
|
|
2
|
+
import { access } from "node:fs/promises";
|
|
3
|
+
import { resolve } from "node:path";
|
|
1
4
|
import { z } from "zod";
|
|
2
5
|
import { EnvFileRepository } from "../env/EnvFileRepository.js";
|
|
3
6
|
import { FirebaseProjectRepository } from "./FirebaseProjectRepository.js";
|
|
@@ -5,9 +8,25 @@ const emptyInput = z.object({}).strict();
|
|
|
5
8
|
const projectInput = z
|
|
6
9
|
.object({ projectId: z.string().trim().min(3).max(80) })
|
|
7
10
|
.strict();
|
|
11
|
+
const webAppInput = z
|
|
12
|
+
.object({ displayName: z.string().trim().min(1).max(60).optional() })
|
|
13
|
+
.strict();
|
|
14
|
+
const sdkConfigInput = z
|
|
15
|
+
.object({ appId: z.string().trim().min(1).max(140).optional() })
|
|
16
|
+
.strict();
|
|
17
|
+
const rtdbInitializeInput = z
|
|
18
|
+
.object({
|
|
19
|
+
location: z.enum(["us-central1", "europe-west1", "asia-southeast1"]).default("us-central1"),
|
|
20
|
+
})
|
|
21
|
+
.strict();
|
|
8
22
|
export function createFirebaseOperations({ projectRoot, config, firebase, }) {
|
|
9
23
|
const projectRepository = new FirebaseProjectRepository(projectRoot);
|
|
10
24
|
const envRepository = new EnvFileRepository(projectRoot);
|
|
25
|
+
const rulesGenerator = new RtdbRulesGenerator({
|
|
26
|
+
loadConfig: () => loadGasboostConfig({ projectRoot }),
|
|
27
|
+
moduleLoader: new ModuleLoader(projectRoot),
|
|
28
|
+
writer: new RtdbRulesWriter(projectRoot),
|
|
29
|
+
});
|
|
11
30
|
const status = async () => getFirebaseStatus({ config, projectRepository, envRepository, firebase });
|
|
12
31
|
return [
|
|
13
32
|
{
|
|
@@ -29,6 +48,16 @@ export function createFirebaseOperations({ projectRoot, config, firebase, }) {
|
|
|
29
48
|
return status();
|
|
30
49
|
},
|
|
31
50
|
},
|
|
51
|
+
{
|
|
52
|
+
id: "firebase.project.status",
|
|
53
|
+
input: emptyInput,
|
|
54
|
+
async handler(_input, context) {
|
|
55
|
+
context.progress({ message: "Checking Firebase project", percentage: 25 });
|
|
56
|
+
const result = await status();
|
|
57
|
+
context.progress({ message: "Firebase project status ready", percentage: 100 });
|
|
58
|
+
return result;
|
|
59
|
+
},
|
|
60
|
+
},
|
|
32
61
|
{
|
|
33
62
|
id: "firebase.login",
|
|
34
63
|
input: emptyInput,
|
|
@@ -38,17 +67,133 @@ export function createFirebaseOperations({ projectRoot, config, firebase, }) {
|
|
|
38
67
|
return status();
|
|
39
68
|
},
|
|
40
69
|
},
|
|
70
|
+
{
|
|
71
|
+
id: "firebase.project.create",
|
|
72
|
+
input: projectInput,
|
|
73
|
+
async handler(input, context) {
|
|
74
|
+
context.progress({ message: "Creating Firebase project", percentage: 20 });
|
|
75
|
+
const create = await firebase.run(["projects:create", input.projectId, "--json"], context.log);
|
|
76
|
+
assertFirebaseSuccess("Firebase project create", create);
|
|
77
|
+
context.progress({ message: "Syncing Firebase project locally", percentage: 80 });
|
|
78
|
+
await projectRepository.connect(input.projectId);
|
|
79
|
+
await envRepository.update({
|
|
80
|
+
FIREBASE_PROJECT_ID: input.projectId,
|
|
81
|
+
VITE_FIREBASE_PROJECT_ID: input.projectId,
|
|
82
|
+
});
|
|
83
|
+
return status();
|
|
84
|
+
},
|
|
85
|
+
},
|
|
86
|
+
{
|
|
87
|
+
id: "firebase.project.connect",
|
|
88
|
+
input: projectInput,
|
|
89
|
+
async handler(input, context) {
|
|
90
|
+
context.progress({ message: "Verifying Firebase project", percentage: 30 });
|
|
91
|
+
await verifyRemoteProject(firebase, input.projectId);
|
|
92
|
+
await projectRepository.connect(input.projectId);
|
|
93
|
+
await envRepository.update({
|
|
94
|
+
FIREBASE_PROJECT_ID: input.projectId,
|
|
95
|
+
VITE_FIREBASE_PROJECT_ID: input.projectId,
|
|
96
|
+
});
|
|
97
|
+
context.progress({ message: "Firebase project connected", percentage: 100 });
|
|
98
|
+
return status();
|
|
99
|
+
},
|
|
100
|
+
},
|
|
41
101
|
{
|
|
42
102
|
id: "firebase.connect",
|
|
43
103
|
input: projectInput,
|
|
44
104
|
async handler(input, context) {
|
|
45
|
-
context.progress({ message: "
|
|
105
|
+
context.progress({ message: "Verifying Firebase project", percentage: 30 });
|
|
106
|
+
await verifyRemoteProject(firebase, input.projectId);
|
|
46
107
|
await projectRepository.connect(input.projectId);
|
|
47
|
-
await envRepository.update({
|
|
108
|
+
await envRepository.update({
|
|
109
|
+
FIREBASE_PROJECT_ID: input.projectId,
|
|
110
|
+
VITE_FIREBASE_PROJECT_ID: input.projectId,
|
|
111
|
+
});
|
|
48
112
|
context.progress({ message: "Firebase project connected", percentage: 100 });
|
|
49
113
|
return status();
|
|
50
114
|
},
|
|
51
115
|
},
|
|
116
|
+
{
|
|
117
|
+
id: "firebase.webapp.status",
|
|
118
|
+
input: emptyInput,
|
|
119
|
+
async handler(_input, context) {
|
|
120
|
+
context.progress({ message: "Checking Firebase Web App", percentage: 30 });
|
|
121
|
+
return status();
|
|
122
|
+
},
|
|
123
|
+
},
|
|
124
|
+
{
|
|
125
|
+
id: "firebase.webapp.create",
|
|
126
|
+
input: webAppInput,
|
|
127
|
+
async handler(input, context) {
|
|
128
|
+
const projectId = await requireProjectId({ projectRepository, envRepository });
|
|
129
|
+
const displayName = input.displayName ?? "Gasboost Web App";
|
|
130
|
+
context.progress({ message: "Creating Firebase Web App", percentage: 25 });
|
|
131
|
+
const result = await firebase.run(["apps:create", "WEB", displayName, "--project", projectId, "--json"], context.log);
|
|
132
|
+
assertFirebaseSuccess("Firebase Web App create", result);
|
|
133
|
+
const app = parseFirstWebApp(result) ?? (await getFirstWebApp(firebase, projectId));
|
|
134
|
+
if (app?.appId !== undefined) {
|
|
135
|
+
await persistSdkConfig({ firebase, envRepository, projectId, appId: app.appId, log: context.log });
|
|
136
|
+
}
|
|
137
|
+
return status();
|
|
138
|
+
},
|
|
139
|
+
},
|
|
140
|
+
{
|
|
141
|
+
id: "firebase.webapp.config",
|
|
142
|
+
input: sdkConfigInput,
|
|
143
|
+
async handler(input, context) {
|
|
144
|
+
const projectId = await requireProjectId({ projectRepository, envRepository });
|
|
145
|
+
const appId = input.appId ?? (await getFirstWebApp(firebase, projectId))?.appId;
|
|
146
|
+
if (appId === undefined) {
|
|
147
|
+
throw new Error("Create a Firebase Web App before fetching SDK config.");
|
|
148
|
+
}
|
|
149
|
+
context.progress({ message: "Fetching Firebase SDK config", percentage: 40 });
|
|
150
|
+
const configResult = await persistSdkConfig({
|
|
151
|
+
firebase,
|
|
152
|
+
envRepository,
|
|
153
|
+
projectId,
|
|
154
|
+
appId,
|
|
155
|
+
log: context.log,
|
|
156
|
+
});
|
|
157
|
+
context.progress({ message: "Firebase SDK config synced", percentage: 100 });
|
|
158
|
+
return configResult;
|
|
159
|
+
},
|
|
160
|
+
},
|
|
161
|
+
{
|
|
162
|
+
id: "firebase.rtdb.status",
|
|
163
|
+
input: emptyInput,
|
|
164
|
+
async handler(_input, context) {
|
|
165
|
+
context.progress({ message: "Checking Realtime Database", percentage: 30 });
|
|
166
|
+
return status();
|
|
167
|
+
},
|
|
168
|
+
},
|
|
169
|
+
{
|
|
170
|
+
id: "firebase.rtdb.initialize",
|
|
171
|
+
input: rtdbInitializeInput,
|
|
172
|
+
async handler(input, context) {
|
|
173
|
+
const projectId = await requireProjectId({ projectRepository, envRepository });
|
|
174
|
+
context.progress({ message: "Initializing Realtime Database", percentage: 25 });
|
|
175
|
+
const before = await getRealtimeDatabaseStatus(firebase, projectId, config);
|
|
176
|
+
if (!before.initialized) {
|
|
177
|
+
await firebase.initializeDefaultDatabase(projectId, input.location);
|
|
178
|
+
}
|
|
179
|
+
const after = await status();
|
|
180
|
+
if (!after.realtimeDatabase.initialized) {
|
|
181
|
+
throw new Error("Firebase RTDB initialization could not be verified.");
|
|
182
|
+
}
|
|
183
|
+
return after;
|
|
184
|
+
},
|
|
185
|
+
},
|
|
186
|
+
{
|
|
187
|
+
id: "firebase.rules.generate",
|
|
188
|
+
input: emptyInput,
|
|
189
|
+
async handler(_input, context) {
|
|
190
|
+
context.progress({ message: "Generating Firebase RTDB rules", percentage: 25 });
|
|
191
|
+
const result = await rulesGenerator.generate();
|
|
192
|
+
context.log(`Rules written: ${result.outputPath}`);
|
|
193
|
+
context.progress({ message: "Firebase RTDB rules generated", percentage: 100 });
|
|
194
|
+
return { generated: true, ...result };
|
|
195
|
+
},
|
|
196
|
+
},
|
|
52
197
|
{
|
|
53
198
|
id: "firebase.rules.deploy",
|
|
54
199
|
input: emptyInput,
|
|
@@ -59,6 +204,9 @@ export function createFirebaseOperations({ projectRoot, config, firebase, }) {
|
|
|
59
204
|
if (projectId === undefined) {
|
|
60
205
|
throw new Error("Connect a Firebase project before deploying rules.");
|
|
61
206
|
}
|
|
207
|
+
if (!(await rulesFileExists(config, projectRoot))) {
|
|
208
|
+
throw new Error("Generate Firebase RTDB rules before deploying them.");
|
|
209
|
+
}
|
|
62
210
|
const result = await firebase.run(["deploy", "--only", "database", "--project", projectId], context.log);
|
|
63
211
|
assertFirebaseSuccess("Firebase RTDB rules deploy", result);
|
|
64
212
|
await envRepository.update({ FIREBASE_PROJECT_ID: projectId });
|
|
@@ -75,18 +223,188 @@ async function getFirebaseStatus({ config, projectRepository, envRepository, fir
|
|
|
75
223
|
]);
|
|
76
224
|
const projectId = project.projectId ?? env.FIREBASE_PROJECT_ID;
|
|
77
225
|
if (projectId !== undefined) {
|
|
78
|
-
await envRepository.update({
|
|
226
|
+
await envRepository.update({
|
|
227
|
+
FIREBASE_PROJECT_ID: projectId,
|
|
228
|
+
VITE_FIREBASE_PROJECT_ID: projectId,
|
|
229
|
+
});
|
|
79
230
|
}
|
|
231
|
+
const authenticated = login.exitCode === 0;
|
|
232
|
+
const [remoteProjectVerified, webApp, realtimeDatabase, rulesGenerated] = await Promise.all([
|
|
233
|
+
projectId === undefined || !authenticated
|
|
234
|
+
? Promise.resolve(false)
|
|
235
|
+
: remoteProjectExists(firebase, projectId),
|
|
236
|
+
projectId === undefined || !authenticated
|
|
237
|
+
? Promise.resolve({
|
|
238
|
+
configured: false,
|
|
239
|
+
sdkConfigAvailable: sdkConfigAvailable(env),
|
|
240
|
+
})
|
|
241
|
+
: getWebAppStatus(firebase, projectId, env),
|
|
242
|
+
projectId === undefined || !authenticated
|
|
243
|
+
? Promise.resolve({
|
|
244
|
+
desired: config.firebase?.realtimeDatabase !== undefined,
|
|
245
|
+
initialized: false,
|
|
246
|
+
})
|
|
247
|
+
: getRealtimeDatabaseStatus(firebase, projectId, config),
|
|
248
|
+
rulesFileExists(config, projectRepository.projectRoot),
|
|
249
|
+
]);
|
|
80
250
|
return {
|
|
81
251
|
enabled: project.enabled || config.firebase !== undefined,
|
|
82
|
-
configured: projectId !== undefined,
|
|
83
|
-
authenticated
|
|
252
|
+
configured: projectId !== undefined && remoteProjectVerified,
|
|
253
|
+
authenticated,
|
|
84
254
|
...(projectId === undefined ? {} : { projectId }),
|
|
255
|
+
projectIdPresent: projectId !== undefined,
|
|
256
|
+
remoteProjectVerified,
|
|
257
|
+
webApp,
|
|
258
|
+
realtimeDatabase,
|
|
85
259
|
realtimeDatabaseDesired: config.firebase?.realtimeDatabase !== undefined,
|
|
260
|
+
rulesSourceConfigured: config.firebase?.realtimeDatabase !== undefined,
|
|
261
|
+
rulesGenerated,
|
|
86
262
|
firebaseJson: project.firebaseJson,
|
|
87
263
|
firebaserc: project.firebaserc,
|
|
88
264
|
};
|
|
89
265
|
}
|
|
266
|
+
async function verifyRemoteProject(firebase, projectId) {
|
|
267
|
+
if (await remoteProjectExists(firebase, projectId))
|
|
268
|
+
return;
|
|
269
|
+
throw new Error(`Firebase project was not found or is not accessible: ${projectId}`);
|
|
270
|
+
}
|
|
271
|
+
async function remoteProjectExists(firebase, projectId) {
|
|
272
|
+
const result = await firebase.run(["projects:list", "--json"]);
|
|
273
|
+
if (result.exitCode !== 0)
|
|
274
|
+
return false;
|
|
275
|
+
return collectObjects(parseFirebaseJson(result.stdout)).some((project) => project.projectId === projectId || project.projectNumber === projectId);
|
|
276
|
+
}
|
|
277
|
+
async function getWebAppStatus(firebase, projectId, env) {
|
|
278
|
+
const app = await getFirstWebApp(firebase, projectId);
|
|
279
|
+
return {
|
|
280
|
+
configured: app !== undefined,
|
|
281
|
+
...(app?.appId === undefined ? {} : { appId: app.appId }),
|
|
282
|
+
...(app?.displayName === undefined ? {} : { displayName: app.displayName }),
|
|
283
|
+
sdkConfigAvailable: sdkConfigAvailable(env),
|
|
284
|
+
};
|
|
285
|
+
}
|
|
286
|
+
async function getFirstWebApp(firebase, projectId) {
|
|
287
|
+
const result = await firebase.run(["apps:list", "WEB", "--project", projectId, "--json"]);
|
|
288
|
+
if (result.exitCode !== 0)
|
|
289
|
+
return undefined;
|
|
290
|
+
return parseFirstWebApp(result);
|
|
291
|
+
}
|
|
292
|
+
function parseFirstWebApp(result) {
|
|
293
|
+
const app = collectObjects(parseFirebaseJson(result.stdout)).find((candidate) => typeof candidate.appId === "string" ||
|
|
294
|
+
typeof candidate.app_id === "string" ||
|
|
295
|
+
typeof candidate.name === "string");
|
|
296
|
+
if (app === undefined)
|
|
297
|
+
return undefined;
|
|
298
|
+
const appId = stringValue(app.appId) ?? stringValue(app.app_id) ?? stringValue(app.name);
|
|
299
|
+
const displayName = stringValue(app.displayName) ?? stringValue(app.display_name);
|
|
300
|
+
return {
|
|
301
|
+
...(appId === undefined ? {} : { appId }),
|
|
302
|
+
...(displayName === undefined ? {} : { displayName }),
|
|
303
|
+
};
|
|
304
|
+
}
|
|
305
|
+
async function persistSdkConfig({ firebase, envRepository, projectId, appId, log, }) {
|
|
306
|
+
const result = await firebase.run(["apps:sdkconfig", "WEB", appId, "--project", projectId, "--json"], log);
|
|
307
|
+
assertFirebaseSuccess("Firebase Web App SDK config", result);
|
|
308
|
+
const config = parseSdkConfig(result.stdout);
|
|
309
|
+
await envRepository.update({
|
|
310
|
+
FIREBASE_PROJECT_ID: projectId,
|
|
311
|
+
VITE_FIREBASE_PROJECT_ID: config.projectId ?? projectId,
|
|
312
|
+
...(config.apiKey === undefined ? {} : { VITE_FIREBASE_API_KEY: config.apiKey }),
|
|
313
|
+
...(config.authDomain === undefined ? {} : { VITE_FIREBASE_AUTH_DOMAIN: config.authDomain }),
|
|
314
|
+
...(config.databaseURL === undefined ? {} : { VITE_FIREBASE_DATABASE_URL: config.databaseURL }),
|
|
315
|
+
...(config.appId === undefined ? {} : { VITE_FIREBASE_APP_ID: config.appId }),
|
|
316
|
+
});
|
|
317
|
+
return { configured: true, projectId, appId };
|
|
318
|
+
}
|
|
319
|
+
function parseSdkConfig(stdout) {
|
|
320
|
+
const value = parseFirebaseJson(stdout);
|
|
321
|
+
const candidates = collectObjects(value);
|
|
322
|
+
const config = candidates.find((candidate) => typeof candidate.apiKey === "string") ??
|
|
323
|
+
candidates.find((candidate) => typeof candidate.firebaseConfig === "object") ??
|
|
324
|
+
{};
|
|
325
|
+
const nested = typeof config.firebaseConfig === "object" &&
|
|
326
|
+
config.firebaseConfig !== null &&
|
|
327
|
+
!Array.isArray(config.firebaseConfig)
|
|
328
|
+
? config.firebaseConfig
|
|
329
|
+
: config;
|
|
330
|
+
const apiKey = stringValue(nested.apiKey);
|
|
331
|
+
const authDomain = stringValue(nested.authDomain);
|
|
332
|
+
const databaseURL = stringValue(nested.databaseURL);
|
|
333
|
+
const parsedProjectId = stringValue(nested.projectId);
|
|
334
|
+
const appId = stringValue(nested.appId);
|
|
335
|
+
return {
|
|
336
|
+
...(apiKey === undefined ? {} : { apiKey }),
|
|
337
|
+
...(authDomain === undefined ? {} : { authDomain }),
|
|
338
|
+
...(databaseURL === undefined ? {} : { databaseURL }),
|
|
339
|
+
...(parsedProjectId === undefined ? {} : { projectId: parsedProjectId }),
|
|
340
|
+
...(appId === undefined ? {} : { appId }),
|
|
341
|
+
};
|
|
342
|
+
}
|
|
343
|
+
async function getRealtimeDatabaseStatus(firebase, projectId, config) {
|
|
344
|
+
const desired = config.firebase?.realtimeDatabase !== undefined;
|
|
345
|
+
const result = await firebase.run(["database:instances:list", "--project", projectId, "--json"]);
|
|
346
|
+
if (result.exitCode !== 0)
|
|
347
|
+
return { desired, initialized: false };
|
|
348
|
+
const instance = collectObjects(parseFirebaseJson(result.stdout)).find((candidate) => typeof candidate.databaseUrl === "string" ||
|
|
349
|
+
typeof candidate.databaseURL === "string" ||
|
|
350
|
+
typeof candidate.instance === "string" ||
|
|
351
|
+
typeof candidate.name === "string");
|
|
352
|
+
const databaseUrl = stringValue(instance?.databaseUrl) ??
|
|
353
|
+
stringValue(instance?.databaseURL) ??
|
|
354
|
+
(stringValue(instance?.instance) === undefined
|
|
355
|
+
? undefined
|
|
356
|
+
: `https://${stringValue(instance?.instance)}.firebaseio.com`);
|
|
357
|
+
return {
|
|
358
|
+
desired,
|
|
359
|
+
initialized: instance !== undefined,
|
|
360
|
+
...(databaseUrl === undefined ? {} : { databaseUrl }),
|
|
361
|
+
};
|
|
362
|
+
}
|
|
363
|
+
async function requireProjectId({ projectRepository, envRepository, }) {
|
|
364
|
+
const [project, env] = await Promise.all([projectRepository.read(), envRepository.read()]);
|
|
365
|
+
const projectId = project.projectId ?? env.FIREBASE_PROJECT_ID;
|
|
366
|
+
if (projectId === undefined)
|
|
367
|
+
throw new Error("Connect a Firebase project first.");
|
|
368
|
+
return projectId;
|
|
369
|
+
}
|
|
370
|
+
async function rulesFileExists(config, projectRoot) {
|
|
371
|
+
const out = config.firebase?.realtimeDatabase?.out;
|
|
372
|
+
if (out === undefined || out.length === 0)
|
|
373
|
+
return false;
|
|
374
|
+
try {
|
|
375
|
+
await access(resolve(projectRoot, out));
|
|
376
|
+
return true;
|
|
377
|
+
}
|
|
378
|
+
catch {
|
|
379
|
+
return false;
|
|
380
|
+
}
|
|
381
|
+
}
|
|
382
|
+
function sdkConfigAvailable(env) {
|
|
383
|
+
return (env.VITE_FIREBASE_API_KEY !== undefined &&
|
|
384
|
+
env.VITE_FIREBASE_PROJECT_ID !== undefined &&
|
|
385
|
+
env.VITE_FIREBASE_APP_ID !== undefined);
|
|
386
|
+
}
|
|
387
|
+
function parseFirebaseJson(stdout) {
|
|
388
|
+
try {
|
|
389
|
+
return JSON.parse(stdout);
|
|
390
|
+
}
|
|
391
|
+
catch {
|
|
392
|
+
return undefined;
|
|
393
|
+
}
|
|
394
|
+
}
|
|
395
|
+
function collectObjects(value) {
|
|
396
|
+
if (Array.isArray(value))
|
|
397
|
+
return value.flatMap((item) => collectObjects(item));
|
|
398
|
+
if (typeof value !== "object" || value === null)
|
|
399
|
+
return [];
|
|
400
|
+
const object = value;
|
|
401
|
+
const nested = ["result", "apps", "projects", "instances", "data"]
|
|
402
|
+
.flatMap((key) => collectObjects(object[key]));
|
|
403
|
+
return [object, ...nested];
|
|
404
|
+
}
|
|
405
|
+
function stringValue(value) {
|
|
406
|
+
return typeof value === "string" && value.length > 0 ? value : undefined;
|
|
407
|
+
}
|
|
90
408
|
function assertFirebaseSuccess(action, result) {
|
|
91
409
|
if (result.exitCode === 0)
|
|
92
410
|
return;
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"firebaseOperations.js","sourceRoot":"","sources":["../../src/firebase/firebaseOperations.ts"],"names":[],"mappings":"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"}
|
|
1
|
+
{"version":3,"file":"firebaseOperations.js","sourceRoot":"","sources":["../../src/firebase/firebaseOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,6 @@
|
|
|
1
|
+
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`},t=([e,n,r])=>{let i=document.createElementNS(`http://www.w3.org/2000/svg`,e);return Object.keys(n).forEach(e=>{i.setAttribute(e,String(n[e]))}),r?.length&&r.forEach(e=>{let n=t(e);i.appendChild(n)}),i},n=(n,r={})=>t([`svg`,{...e,...r},n]),r=e=>Array.from(e.attributes).reduce((e,t)=>(e[t.name]=t.value,e),{}),i=e=>typeof e==`string`?e:!e||!e.class?``:e.class&&typeof e.class==`string`?e.class.split(` `):e.class&&Array.isArray(e.class)?e.class:``,a=e=>e.flatMap(i).map(e=>e.trim()).filter(Boolean).filter((e,t,n)=>n.indexOf(e)===t).join(` `),ee=e=>e.replace(/(\w)(\w*)(_|-|\s*)/g,(e,t,n)=>t.toUpperCase()+n.toLowerCase()),o=(t,{nameAttr:i,icons:o,attrs:s})=>{let c=t.getAttribute(i);if(c==null)return;let l=o[ee(c)];if(!l)return console.warn(`${t.outerHTML} icon name was not found in the provided icons object.`);let te=r(t),ne={...e,"data-lucide":c,...s,...te},u=a([`lucide`,`lucide-${c}`,te,s]);u&&Object.assign(ne,{class:u});let re=n(l,ne);return t.parentNode?.replaceChild(re,t)},s=[[`path`,{d:`m18 16 4-4-4-4`}],[`path`,{d:`m6 8-4 4 4 4`}],[`path`,{d:`m14.5 4-5 16`}]],c=[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`}]],l=[[`path`,{d:`M15 3h6v6`}],[`path`,{d:`M10 14 21 3`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`}]],te=[[`path`,{d:`M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4`}],[`path`,{d:`M14 2v4a2 2 0 0 0 2 2h4`}],[`path`,{d:`m5 12-3 3 3 3`}],[`path`,{d:`m9 18 3-3-3-3`}]],ne=[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`}]],u=[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`}]],re=[[`path`,{d:`m10 17 5-5-5-5`}],[`path`,{d:`M15 12H3`}],[`path`,{d:`M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4`}]],ie=[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`}]],ae=[[`path`,{d:`M5 12h14`}],[`path`,{d:`M12 5v14`}]],oe=[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`}],[`path`,{d:`M21 3v5h-5`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`}],[`path`,{d:`M8 16H3v5`}]],se=[[`path`,{d:`M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z`}],[`path`,{d:`m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z`}],[`path`,{d:`M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0`}],[`path`,{d:`M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5`}]],ce=[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`}]],le=[[`path`,{d:`M12 3v12`}],[`path`,{d:`m17 8-5-5-5 5`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}]],ue=[[`circle`,{cx:`12`,cy:`8`,r:`5`}],[`path`,{d:`M20 21a8 8 0 0 0-16 0`}]],de=[[`path`,{d:`M18 6 6 18`}],[`path`,{d:`m6 6 12 12`}]],fe=({icons:e={},nameAttr:t=`data-lucide`,attrs:n={},root:r=document}={})=>{if(!Object.values(e).length)throw Error(`Please provide an icons object.
|
|
2
|
+
If you want to use all the icons you can import it like:
|
|
3
|
+
\`import { createIcons, icons } from 'lucide';
|
|
4
|
+
lucide.createIcons({icons});\``);if(r===void 0)throw Error("`createIcons()` only works in a browser environment.");let i=r.querySelectorAll(`[${t}]`);if(Array.from(i).forEach(r=>o(r,{nameAttr:t,icons:e,attrs:n})),t===`data-lucide`){let t=r.querySelectorAll(`[icon-name]`);t.length>0&&(console.warn(`[Lucide] Some icons were found with the now deprecated icon-name attribute. These will still be replaced for backwards compatibility, but will no longer be supported in v1.0 and you should switch to data-lucide`),Array.from(t).forEach(t=>o(t,{nameAttr:`icon-name`,icons:e,attrs:n})))}};function pe(e=document){for(let t of e.querySelectorAll(`[data-close-dialog]`))t.addEventListener(`click`,()=>{let n=t.dataset.closeDialog;if(n===void 0)return;let r=e.getElementById(n);me(r)&&r.close()})}function me(e){return typeof e==`object`&&!!e&&`close`in e&&typeof e.close==`function`}var he=Fe(),ge,d,f,p,m=`existing`;fe({icons:{Code2:s,Database:c,ExternalLink:l,FileCode2:te,KeyRound:ne,LayoutDashboard:u,LogIn:re,Play:ie,Plus:ae,RefreshCw:oe,Rocket:se,Square:ce,Upload:le,UserRound:ue,X:de}});var h=$(`refresh`),g=$(`log`),_=$(`apps-log`),v=$(`deployment-log`),y=$(`firebase-log`),b=$(`development-log`),x={overview:$(`overview-nav`),development:$(`development-nav`),"apps-script":$(`apps-script-nav`),deployment:$(`deployment-nav`),firebase:$(`firebase-nav`)},S=$(`apps-login`),C=$(`apps-create`),w=$(`apps-connect`),_e=$(`apps-user-settings`),T=$(`apps-open`),E=$(`apps-push`),ve=$(`apps-pull`),ye=$(`credential-service-account`),be=$(`credential-script-properties`),D=$(`deployment-list`),O=$(`deployment-create`),k=$(`deployment-update`),xe=$(`deployment-open`),A=$(`development-start`),j=$(`development-stop`),M=$(`development-restart`),N=$(`development-open`),Se=$(`firebase-enable`),P=$(`firebase-login`),F=$(`firebase-project-create`),I=$(`firebase-connect`),L=$(`firebase-webapp-create`),R=$(`firebase-webapp-config`),z=$(`firebase-rtdb-initialize`),B=$(`firebase-rules-generate`),V=$(`firebase-rules-deploy`),Ce=$(`firebase-open`);h.addEventListener(`click`,()=>void we()),$(`clear-log`).addEventListener(`click`,()=>g.replaceChildren()),$(`apps-clear-log`).addEventListener(`click`,()=>_.replaceChildren()),$(`deployment-clear-log`).addEventListener(`click`,()=>v.replaceChildren()),$(`firebase-clear-log`).addEventListener(`click`,()=>y.replaceChildren()),$(`development-clear-log`).addEventListener(`click`,()=>b.replaceChildren());for(let[e,t]of Object.entries(x))t.addEventListener(`click`,()=>{je(e),e===`development`&&W(),e===`apps-script`&&H(),e===`deployment`&&H(),e===`firebase`&&U()});$(`apps-refresh`).addEventListener(`click`,()=>void H()),$(`development-refresh`).addEventListener(`click`,()=>void W()),$(`deployment-refresh`).addEventListener(`click`,()=>void H()),$(`firebase-refresh`).addEventListener(`click`,()=>void U());for(let e of document.querySelectorAll(`[data-setup-mode]`))e.addEventListener(`click`,()=>{m=e.dataset.setupMode===`new`?`new`:`existing`,Ae()});S.addEventListener(`click`,()=>void G(`apps.login`,{},_,K,[S])),_e.addEventListener(`click`,()=>window.open(`https://script.google.com/home/usersettings`,`_blank`,`noopener`)),C.addEventListener(`click`,()=>{let e=$(`script-title`);e.value=ge?.name??``,$(`create-dialog`).showModal(),e.focus()}),w.addEventListener(`click`,()=>{G(`apps.connect`,{scriptId:$(`script-id`).value.trim()},_,K,[w])}),T.addEventListener(`click`,()=>void G(`apps.open`,{},_,()=>void 0,[T])),E.addEventListener(`click`,()=>$(`push-dialog`).showModal()),ve.addEventListener(`click`,()=>Q(_,`Pull is reserved for a follow-up operation.`,`info`)),ye.addEventListener(`click`,()=>{let e=f?.projectId;e!==void 0&&window.open(`https://console.firebase.google.com/project/${encodeURIComponent(e)}/settings/serviceaccounts/adminsdk`,`_blank`,`noopener`)}),be.addEventListener(`click`,()=>{let e=d?.scriptId;e!==void 0&&window.open(`https://script.google.com/home/projects/${encodeURIComponent(e)}/settings`,`_blank`,`noopener`)}),D.addEventListener(`click`,()=>void G(`apps.deployments`,{},v,e=>{Q(v,e.deployments.length===0?`No deployments returned`:e.deployments.map(e=>`${e.deploymentId}${e.description===void 0?``:` (${e.description})`}`).join(`, `),`info`)},[D])),O.addEventListener(`click`,()=>$(`deployment-dialog`).showModal()),k.addEventListener(`click`,()=>void G(`apps.deployment.update`,{deploymentId:$(`deployment-id`).value.trim()||void 0},v,()=>void H(),[k])),xe.addEventListener(`click`,()=>{let e=d?.deploymentId??$(`deployment-id`).value.trim();e.length>0&&window.open(`https://script.google.com/macros/s/${e}/exec`,`_blank`,`noopener`)}),Se.addEventListener(`click`,()=>void G(`firebase.enable`,{},y,q,[Se])),P.addEventListener(`click`,()=>void G(`firebase.login`,{},y,q,[P])),F.addEventListener(`click`,()=>{G(`firebase.project.create`,{projectId:$(`firebase-project-id`).value.trim()},y,q,[F])}),I.addEventListener(`click`,()=>{G(`firebase.project.connect`,{projectId:$(`firebase-project-id`).value.trim()},y,q,[I])}),L.addEventListener(`click`,()=>{G(`firebase.webapp.create`,{displayName:$(`firebase-webapp-name`).value.trim()||void 0},y,q,[L])}),R.addEventListener(`click`,()=>void G(`firebase.webapp.config`,{},y,()=>void U(),[R])),z.addEventListener(`click`,()=>{G(`firebase.rtdb.initialize`,{location:$(`firebase-rtdb-location`).value.trim()||`us-central1`},y,q,[z])}),B.addEventListener(`click`,()=>void G(`firebase.rules.generate`,{},y,()=>void U(),[B])),V.addEventListener(`click`,()=>void G(`firebase.rules.deploy`,{},y,()=>void U(),[V])),Ce.addEventListener(`click`,()=>window.open(`https://console.firebase.google.com/`,`_blank`,`noopener`)),$(`create-form`).addEventListener(`submit`,e=>{e.preventDefault();let t=$(`create-dialog`),n=$(`script-title`).value;t.close(),G(`apps.create`,{title:n},_,K,[C])}),$(`push-form`).addEventListener(`submit`,e=>{e.preventDefault(),$(`push-dialog`).close(),G(`apps.push`,{confirmed:!0},_,()=>void H(),[E])}),$(`deployment-form`).addEventListener(`submit`,e=>{e.preventDefault(),$(`deployment-dialog`).close(),G(`apps.deployment.create`,{description:$(`deployment-description`).value.trim()||void 0},v,()=>void H(),[O])}),pe(),A.addEventListener(`click`,()=>void G(`development.start`,{},b,J,[A,M])),j.addEventListener(`click`,()=>void G(`development.stop`,{},b,J,[j,M])),M.addEventListener(`click`,()=>void G(`development.restart`,{},b,J,[A,j,M])),N.addEventListener(`click`,()=>void G(`development.open`,{},b,J,[N])),we();async function we(){await Te(),await Promise.all([W(),H(),U()])}async function Te(){h.disabled=!0,Z(`running`,`Inspecting`),Q(g,`Inspecting project definition`,`info`);try{await De(`project.inspect`,{},Ee(g,e=>{ge=e,ke(e)})),Z(`ready`,`Ready`)}catch(e){Z(`error`,`Error`),Pe(g,e)}finally{h.disabled=!1}}async function H(){await G(`apps.status`,{},_,K,[$(`apps-refresh`)])}async function U(){await G(`firebase.status`,{},y,q,[$(`firebase-refresh`)])}async function W(){await G(`development.status`,{},b,J,[$(`development-refresh`)])}async function G(e,t,n,r,i=[]){Me(i,!0),Z(`running`,`Working`);try{await De(e,t,Ee(n,r)),Z(`ready`,`Ready`)}catch(e){Z(`error`,`Error`),Pe(n,e)}finally{Me(i,!1),Y()}}function Ee(e,t){return{log:t=>Q(e,t,`info`),progress:(t,n)=>Q(e,n===void 0?t:`${t} (${n}%)`,`progress`),result:t}}async function De(e,t,n){let r=await fetch(`/api/operations/${encodeURIComponent(e)}`,{method:`POST`,headers:{"Content-Type":`application/json`,"X-Gasboost-Session":he},body:JSON.stringify(t)});if(!r.ok||r.body===null){let e=await r.json().catch(()=>null);throw Error(e?.error??`Operation failed with status ${r.status}`)}let i=r.body.pipeThrough(new TextDecoderStream).getReader(),a=``;for(;;){let{done:e,value:t}=await i.read();a+=t??``;let r=a.split(`
|
|
5
|
+
|
|
6
|
+
`);a=r.pop()??``;for(let e of r)Oe(e,n);if(e)break}}function Oe(e,t){let n=/^event: (.+)$/m.exec(e)?.[1],r=/^data: (.+)$/m.exec(e)?.[1];if(n===void 0||r===void 0)return;let i=JSON.parse(r);if(n===`log`&&typeof i.message==`string`)t.log(i.message);else if(n===`progress`&&typeof i.message==`string`)t.progress(i.message,typeof i.percentage==`number`?i.percentage:void 0);else if(n===`result`)t.result(i);else if(n===`error`)throw Error(typeof i.message==`string`?i.message:`Operation failed`)}function ke(e){$(`project-title`).textContent=e.name,$(`project-path`).textContent=e.root,Ne(`apps-script-status`,e.capabilities.appsScript),Ne(`firebase-status`,e.capabilities.firebaseRealtimeDatabase)}function K(e){d=e,X(`apps-auth-status`,e.authenticated,`Authorized`,`Sign in required`),X(`apps-project-status`,e.configured,`Connected`,`Not initialized`),X(`apps-manifest-status`,e.manifestExists,`Found`,`Missing`),X(`deployment-project-status`,e.configured,`Ready`,`Prerequisite`),$(`apps-account-detail`).textContent=e.authenticated?`clasp authorization available`:`No clasp authorization found`,$(`apps-project-detail`).textContent=e.configured?`${e.scriptId??`Connected`} · ${e.rootDir}`:`Local source: ${e.rootDir}`,$(`apps-manifest-detail`).textContent=e.manifestExists?`appsscript.json exists in project root`:`Manifest was not detected at project root`,$(`deployment-project-detail`).textContent=e.configured?`Script ID: ${e.scriptId??`connected`}`:`Create or connect an Apps Script project first`,$(`deployment-id`).value=e.deploymentId??``,X(`deployment-id-status`,e.deploymentId!==void 0,`Selected`,`Not selected`),$(`deployment-id-detail`).textContent=e.deploymentId===void 0?`No deployment synced to .env`:e.deploymentId,Ae(),Y()}function q(e){f=e,X(`firebase-enabled-status`,e.enabled,`Enabled`,`Not enabled`),X(`firebase-auth-status`,e.authenticated,`Authorized`,`Sign in required`),X(`firebase-project-status`,e.remoteProjectVerified,`Verified`,`Not verified`),X(`firebase-webapp-status`,e.webApp.configured,`Configured`,`Not configured`),X(`firebase-rtdb-status`,e.realtimeDatabase.initialized,`Initialized`,`Not initialized`),X(`firebase-rules-status`,e.rulesGenerated,`Generated`,`Not generated`),$(`firebase-enabled-detail`).textContent=e.enabled?`Local Firebase configuration detected`:`Enable Firebase to create local configuration`,$(`firebase-auth-detail`).textContent=e.authenticated?`Firebase CLI authorization available`:`No Firebase CLI authorization found`,$(`firebase-project-detail`).textContent=e.projectId===void 0?`No project ID synced to .env`:`${e.projectId}${e.remoteProjectVerified?``:` · remote verification pending`}`,$(`firebase-webapp-detail`).textContent=e.webApp.appId??(e.webApp.sdkConfigAvailable?`SDK config synced to .env`:`No Web App detected`),$(`firebase-rtdb-detail`).textContent=e.realtimeDatabase.databaseUrl??(e.realtimeDatabase.desired?`Realtime capability desired`:`Realtime capability not configured`),$(`firebase-rules-detail`).textContent=e.rulesSourceConfigured?e.rulesGenerated?`database.rules.json is ready`:`Generate rules before deploy`:`No RTDB rules source configured`,$(`firebase-project-id`).value=e.projectId??``,$(`firebase-webapp-name`).value=e.webApp.displayName??``,Y()}function J(e){p=e,X(`development-state-status`,e.running,`Running`,`Stopped`),$(`development-state-detail`).textContent=e.command===void 0?`No dev process launched by console`:e.command.join(` `),X(`development-url-status`,e.localUrl!==void 0,`Available`,`Pending`),$(`development-url-detail`).textContent=e.localUrl??`Start the local application to detect a URL`,b.replaceChildren();for(let t of e.log)Q(b,t,`info`);Y()}function Ae(){for(let e of document.querySelectorAll(`[data-setup-mode]`))e.classList.toggle(`setup-mode__button--active`,e.dataset.setupMode===m);$(`apps-create-panel`).hidden=m!==`new`,$(`apps-connect-panel`).hidden=m!==`existing`}function je(e){for(let t of Object.keys(x))$(`${t}-view`).hidden=t!==e,x[t].classList.toggle(`active`,t===e)}function Me(e,t){for(let n of e)n.disabled=t}function Y(){let e=d?.authenticated===!0,t=d?.configured===!0;S.disabled=e,C.disabled=!e||t,w.disabled=!e||t,T.disabled=!e||!t,E.disabled=!e||!t,ve.disabled=!e||!t,ye.disabled=f?.projectId===void 0,be.disabled=d?.scriptId===void 0,D.disabled=!e||!t,O.disabled=!e||!t,k.disabled=!e||!t,xe.disabled=(d?.deploymentId??$(`deployment-id`).value).length===0,A.disabled=p?.running===!0,j.disabled=p?.running!==!0,M.disabled=p?.running!==!0,N.disabled=p?.running!==!0||p.localUrl===void 0,P.disabled=f?.authenticated===!0,Se.disabled=f?.enabled===!0;let n=f?.authenticated===!0,r=f?.remoteProjectVerified===!0,i=$(`firebase-project-id`).value.trim();F.disabled=!n||i.length===0,I.disabled=!n||i.length===0,L.disabled=!r||f?.webApp.configured===!0,R.disabled=!r||f?.webApp.configured!==!0,z.disabled=!r||f?.realtimeDatabase.desired!==!0||f?.realtimeDatabase.initialized===!0,B.disabled=f?.rulesSourceConfigured!==!0,V.disabled=!r||f?.rulesGenerated!==!0,Ce.disabled=!1,h.disabled=!1;for(let e of Object.values(x))e.disabled=!1}function Ne(e,t){X(e,t,`Configured`,`Not configured`)}function X(e,t,n,r){let i=$(e);i.textContent=t?n:r,i.className=`badge ${t?`configured`:`inactive`}`}function Z(e,t){let n=$(`runtime-status`);n.className=`runtime-status ${e}`,n.innerHTML=``;let r=document.createElement(`span`);n.append(r,document.createTextNode(` ${t}`))}function Q(e,t,n){let r=document.createElement(`div`);r.className=`log-row ${n}`;let i=document.createElement(`time`);i.textContent=new Date().toLocaleTimeString();let a=document.createElement(`span`);a.textContent=t,r.append(i,a),e.append(r),e.scrollTop=e.scrollHeight}function Pe(e,t){Q(e,t instanceof Error?t.message:`Operation failed`,`error`)}function $(e){let t=document.getElementById(e);if(t===null)throw Error(`Missing UI element: ${e}`);return t}function Fe(){let e=document.querySelector(`meta[name="gasboost-session"]`)?.content;if(e===void 0||e.length===0)throw Error(`Console session was not initialized`);return e}
|
package/dist/ui/index.html
CHANGED
|
@@ -5,7 +5,7 @@
|
|
|
5
5
|
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
|
|
6
6
|
<meta name="gasboost-session" content="__GASBOOST_SESSION_TOKEN__" />
|
|
7
7
|
<title>gasboost console</title>
|
|
8
|
-
<script type="module" crossorigin src="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-BaS_FL2T.js"></script>
|
|
9
9
|
<link rel="stylesheet" crossorigin href="/assets/index-B6Dn-OF9.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
@@ -224,16 +224,44 @@
|
|
|
224
224
|
<div><h3>Firebase project</h3><p class="mono-detail" id="firebase-project-detail">Checking project ID</p></div>
|
|
225
225
|
<div class="badge" id="firebase-project-status">Checking</div>
|
|
226
226
|
</div>
|
|
227
|
+
<div class="status-row">
|
|
228
|
+
<div class="capability-icon firebase"><i data-lucide="layout-dashboard"></i></div>
|
|
229
|
+
<div><h3>Web App</h3><p class="mono-detail" id="firebase-webapp-detail">Checking Web App</p></div>
|
|
230
|
+
<div class="badge" id="firebase-webapp-status">Checking</div>
|
|
231
|
+
</div>
|
|
232
|
+
<div class="status-row">
|
|
233
|
+
<div class="capability-icon firebase"><i data-lucide="database"></i></div>
|
|
234
|
+
<div><h3>Realtime Database</h3><p class="mono-detail" id="firebase-rtdb-detail">Checking database</p></div>
|
|
235
|
+
<div class="badge" id="firebase-rtdb-status">Checking</div>
|
|
236
|
+
</div>
|
|
237
|
+
<div class="status-row">
|
|
238
|
+
<div class="capability-icon firebase"><i data-lucide="file-code-2"></i></div>
|
|
239
|
+
<div><h3>Security Rules</h3><p class="mono-detail" id="firebase-rules-detail">Checking rules</p></div>
|
|
240
|
+
<div class="badge" id="firebase-rules-status">Checking</div>
|
|
241
|
+
</div>
|
|
227
242
|
</div>
|
|
228
243
|
<div class="field">
|
|
229
244
|
<label for="firebase-project-id" class="field__label">Firebase Project ID <span class="required">*</span></label>
|
|
230
245
|
<input id="firebase-project-id" placeholder="my-firebase-project" />
|
|
231
|
-
<p class="field__help">
|
|
246
|
+
<p class="field__help">Create or connect verifies remote access, then syncs Firebase IDs to .env and .firebaserc.</p>
|
|
247
|
+
</div>
|
|
248
|
+
<div class="field">
|
|
249
|
+
<label for="firebase-webapp-name" class="field__label">Web App display name</label>
|
|
250
|
+
<input id="firebase-webapp-name" placeholder="Gasboost Web App" />
|
|
251
|
+
</div>
|
|
252
|
+
<div class="field">
|
|
253
|
+
<label for="firebase-rtdb-location" class="field__label">Realtime Database location</label>
|
|
254
|
+
<input id="firebase-rtdb-location" placeholder="us-central1" />
|
|
232
255
|
</div>
|
|
233
256
|
<div class="action-bar">
|
|
234
257
|
<button class="command-button primary" id="firebase-enable" type="button"><i data-lucide="plus"></i>Enable Firebase</button>
|
|
235
258
|
<button class="command-button" id="firebase-login" type="button"><i data-lucide="log-in"></i>Firebase login</button>
|
|
259
|
+
<button class="command-button" id="firebase-project-create" type="button"><i data-lucide="plus"></i>Create project</button>
|
|
236
260
|
<button class="command-button" id="firebase-connect" type="button"><i data-lucide="database"></i>Connect project</button>
|
|
261
|
+
<button class="command-button" id="firebase-webapp-create" type="button"><i data-lucide="layout-dashboard"></i>Create Web App</button>
|
|
262
|
+
<button class="command-button" id="firebase-webapp-config" type="button"><i data-lucide="key-round"></i>Fetch SDK config</button>
|
|
263
|
+
<button class="command-button" id="firebase-rtdb-initialize" type="button"><i data-lucide="play"></i>Initialize RTDB</button>
|
|
264
|
+
<button class="command-button" id="firebase-rules-generate" type="button"><i data-lucide="file-code-2"></i>Generate rules</button>
|
|
237
265
|
<button class="command-button" id="firebase-rules-deploy" type="button"><i data-lucide="upload"></i>Deploy rules</button>
|
|
238
266
|
<button class="command-button" id="firebase-open" type="button"><i data-lucide="external-link"></i>Open console</button>
|
|
239
267
|
</div>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gasboost/console",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.5.0",
|
|
4
4
|
"description": "gasboost project lifecycle console",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -18,10 +18,11 @@
|
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
20
|
"@google/clasp": "^3.4.1",
|
|
21
|
+
"firebase-tools": "15.30.2",
|
|
21
22
|
"lucide": "^0.544.0",
|
|
22
23
|
"zod": "^4.1.12",
|
|
23
|
-
"@gasboost/config": "0.
|
|
24
|
-
"@gasboost/console-runtime": "0.1.
|
|
24
|
+
"@gasboost/config": "0.2.0",
|
|
25
|
+
"@gasboost/console-runtime": "0.1.2"
|
|
25
26
|
},
|
|
26
27
|
"devDependencies": {
|
|
27
28
|
"@types/node": "^24.13.4",
|
|
@@ -1,6 +0,0 @@
|
|
|
1
|
-
(function(){let e=document.createElement(`link`).relList;if(e&&e.supports&&e.supports(`modulepreload`))return;for(let e of document.querySelectorAll(`link[rel="modulepreload"]`))n(e);new MutationObserver(e=>{for(let t of e)if(t.type===`childList`)for(let e of t.addedNodes)e.tagName===`LINK`&&e.rel===`modulepreload`&&n(e)}).observe(document,{childList:!0,subtree:!0});function t(e){let t={};return e.integrity&&(t.integrity=e.integrity),e.referrerPolicy&&(t.referrerPolicy=e.referrerPolicy),t.credentials=e.crossOrigin===`use-credentials`?`include`:e.crossOrigin===`anonymous`?`omit`:`same-origin`,t}function n(e){if(e.ep)return;e.ep=!0;let n=t(e);fetch(e.href,n)}})();var e={xmlns:`http://www.w3.org/2000/svg`,width:24,height:24,viewBox:`0 0 24 24`,fill:`none`,stroke:`currentColor`,"stroke-width":2,"stroke-linecap":`round`,"stroke-linejoin":`round`},t=([e,n,r])=>{let i=document.createElementNS(`http://www.w3.org/2000/svg`,e);return Object.keys(n).forEach(e=>{i.setAttribute(e,String(n[e]))}),r?.length&&r.forEach(e=>{let n=t(e);i.appendChild(n)}),i},n=(n,r={})=>t([`svg`,{...e,...r},n]),r=e=>Array.from(e.attributes).reduce((e,t)=>(e[t.name]=t.value,e),{}),i=e=>typeof e==`string`?e:!e||!e.class?``:e.class&&typeof e.class==`string`?e.class.split(` `):e.class&&Array.isArray(e.class)?e.class:``,a=e=>e.flatMap(i).map(e=>e.trim()).filter(Boolean).filter((e,t,n)=>n.indexOf(e)===t).join(` `),ee=e=>e.replace(/(\w)(\w*)(_|-|\s*)/g,(e,t,n)=>t.toUpperCase()+n.toLowerCase()),o=(t,{nameAttr:i,icons:o,attrs:s})=>{let c=t.getAttribute(i);if(c==null)return;let l=o[ee(c)];if(!l)return console.warn(`${t.outerHTML} icon name was not found in the provided icons object.`);let u=r(t),d={...e,"data-lucide":c,...s,...u},f=a([`lucide`,`lucide-${c}`,u,s]);f&&Object.assign(d,{class:f});let te=n(l,d);return t.parentNode?.replaceChild(te,t)},s=[[`path`,{d:`m18 16 4-4-4-4`}],[`path`,{d:`m6 8-4 4 4 4`}],[`path`,{d:`m14.5 4-5 16`}]],c=[[`ellipse`,{cx:`12`,cy:`5`,rx:`9`,ry:`3`}],[`path`,{d:`M3 5V19A9 3 0 0 0 21 19V5`}],[`path`,{d:`M3 12A9 3 0 0 0 21 12`}]],l=[[`path`,{d:`M15 3h6v6`}],[`path`,{d:`M10 14 21 3`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`}]],u=[[`path`,{d:`M4 22h14a2 2 0 0 0 2-2V7l-5-5H6a2 2 0 0 0-2 2v4`}],[`path`,{d:`M14 2v4a2 2 0 0 0 2 2h4`}],[`path`,{d:`m5 12-3 3 3 3`}],[`path`,{d:`m9 18 3-3-3-3`}]],d=[[`path`,{d:`M2.586 17.414A2 2 0 0 0 2 18.828V21a1 1 0 0 0 1 1h3a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h1a1 1 0 0 0 1-1v-1a1 1 0 0 1 1-1h.172a2 2 0 0 0 1.414-.586l.814-.814a6.5 6.5 0 1 0-4-4z`}],[`circle`,{cx:`16.5`,cy:`7.5`,r:`.5`,fill:`currentColor`}]],f=[[`rect`,{width:`7`,height:`9`,x:`3`,y:`3`,rx:`1`}],[`rect`,{width:`7`,height:`5`,x:`14`,y:`3`,rx:`1`}],[`rect`,{width:`7`,height:`9`,x:`14`,y:`12`,rx:`1`}],[`rect`,{width:`7`,height:`5`,x:`3`,y:`16`,rx:`1`}]],te=[[`path`,{d:`m10 17 5-5-5-5`}],[`path`,{d:`M15 12H3`}],[`path`,{d:`M15 3h4a2 2 0 0 1 2 2v14a2 2 0 0 1-2 2h-4`}]],ne=[[`path`,{d:`M5 5a2 2 0 0 1 3.008-1.728l11.997 6.998a2 2 0 0 1 .003 3.458l-12 7A2 2 0 0 1 5 19z`}]],re=[[`path`,{d:`M5 12h14`}],[`path`,{d:`M12 5v14`}]],ie=[[`path`,{d:`M3 12a9 9 0 0 1 9-9 9.75 9.75 0 0 1 6.74 2.74L21 8`}],[`path`,{d:`M21 3v5h-5`}],[`path`,{d:`M21 12a9 9 0 0 1-9 9 9.75 9.75 0 0 1-6.74-2.74L3 16`}],[`path`,{d:`M8 16H3v5`}]],ae=[[`path`,{d:`M4.5 16.5c-1.5 1.26-2 5-2 5s3.74-.5 5-2c.71-.84.7-2.13-.09-2.91a2.18 2.18 0 0 0-2.91-.09z`}],[`path`,{d:`m12 15-3-3a22 22 0 0 1 2-3.95A12.88 12.88 0 0 1 22 2c0 2.72-.78 7.5-6 11a22.35 22.35 0 0 1-4 2z`}],[`path`,{d:`M9 12H4s.55-3.03 2-4c1.62-1.08 5 0 5 0`}],[`path`,{d:`M12 15v5s3.03-.55 4-2c1.08-1.62 0-5 0-5`}]],oe=[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`}]],se=[[`path`,{d:`M12 3v12`}],[`path`,{d:`m17 8-5-5-5 5`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`}]],ce=[[`circle`,{cx:`12`,cy:`8`,r:`5`}],[`path`,{d:`M20 21a8 8 0 0 0-16 0`}]],le=[[`path`,{d:`M18 6 6 18`}],[`path`,{d:`m6 6 12 12`}]],ue=({icons:e={},nameAttr:t=`data-lucide`,attrs:n={},root:r=document}={})=>{if(!Object.values(e).length)throw Error(`Please provide an icons object.
|
|
2
|
-
If you want to use all the icons you can import it like:
|
|
3
|
-
\`import { createIcons, icons } from 'lucide';
|
|
4
|
-
lucide.createIcons({icons});\``);if(r===void 0)throw Error("`createIcons()` only works in a browser environment.");let i=r.querySelectorAll(`[${t}]`);if(Array.from(i).forEach(r=>o(r,{nameAttr:t,icons:e,attrs:n})),t===`data-lucide`){let t=r.querySelectorAll(`[icon-name]`);t.length>0&&(console.warn(`[Lucide] Some icons were found with the now deprecated icon-name attribute. These will still be replaced for backwards compatibility, but will no longer be supported in v1.0 and you should switch to data-lucide`),Array.from(t).forEach(t=>o(t,{nameAttr:`icon-name`,icons:e,attrs:n})))}};function de(e=document){for(let t of e.querySelectorAll(`[data-close-dialog]`))t.addEventListener(`click`,()=>{let n=t.dataset.closeDialog;if(n===void 0)return;let r=e.getElementById(n);fe(r)&&r.close()})}function fe(e){return typeof e==`object`&&!!e&&`close`in e&&typeof e.close==`function`}var pe=Ae(),me,p,m,h,g=`existing`;ue({icons:{Code2:s,Database:c,ExternalLink:l,FileCode2:u,KeyRound:d,LayoutDashboard:f,LogIn:te,Play:ne,Plus:re,RefreshCw:ie,Rocket:ae,Square:oe,Upload:se,UserRound:ce,X:le}});var _=$(`refresh`),v=$(`log`),y=$(`apps-log`),b=$(`deployment-log`),x=$(`firebase-log`),S=$(`development-log`),C={overview:$(`overview-nav`),development:$(`development-nav`),"apps-script":$(`apps-script-nav`),deployment:$(`deployment-nav`),firebase:$(`firebase-nav`)},w=$(`apps-login`),T=$(`apps-create`),E=$(`apps-connect`),he=$(`apps-user-settings`),D=$(`apps-open`),O=$(`apps-push`),k=$(`apps-pull`),ge=$(`credential-service-account`),_e=$(`credential-script-properties`),A=$(`deployment-list`),j=$(`deployment-create`),M=$(`deployment-update`),N=$(`deployment-open`),P=$(`development-start`),F=$(`development-stop`),I=$(`development-restart`),L=$(`development-open`),R=$(`firebase-enable`),z=$(`firebase-login`),B=$(`firebase-connect`),V=$(`firebase-rules-deploy`),ve=$(`firebase-open`);_.addEventListener(`click`,()=>void ye()),$(`clear-log`).addEventListener(`click`,()=>v.replaceChildren()),$(`apps-clear-log`).addEventListener(`click`,()=>y.replaceChildren()),$(`deployment-clear-log`).addEventListener(`click`,()=>b.replaceChildren()),$(`firebase-clear-log`).addEventListener(`click`,()=>x.replaceChildren()),$(`development-clear-log`).addEventListener(`click`,()=>S.replaceChildren());for(let[e,t]of Object.entries(C))t.addEventListener(`click`,()=>{Ee(e),e===`development`&&W(),e===`apps-script`&&H(),e===`deployment`&&H(),e===`firebase`&&U()});$(`apps-refresh`).addEventListener(`click`,()=>void H()),$(`development-refresh`).addEventListener(`click`,()=>void W()),$(`deployment-refresh`).addEventListener(`click`,()=>void H()),$(`firebase-refresh`).addEventListener(`click`,()=>void U());for(let e of document.querySelectorAll(`[data-setup-mode]`))e.addEventListener(`click`,()=>{g=e.dataset.setupMode===`new`?`new`:`existing`,Te()});w.addEventListener(`click`,()=>void G(`apps.login`,{},y,K,[w])),he.addEventListener(`click`,()=>window.open(`https://script.google.com/home/usersettings`,`_blank`,`noopener`)),T.addEventListener(`click`,()=>{let e=$(`script-title`);e.value=me?.name??``,$(`create-dialog`).showModal(),e.focus()}),E.addEventListener(`click`,()=>{G(`apps.connect`,{scriptId:$(`script-id`).value.trim()},y,K,[E])}),D.addEventListener(`click`,()=>void G(`apps.open`,{},y,()=>void 0,[D])),O.addEventListener(`click`,()=>$(`push-dialog`).showModal()),k.addEventListener(`click`,()=>Q(y,`Pull is reserved for a follow-up operation.`,`info`)),ge.addEventListener(`click`,()=>{let e=m?.projectId;e!==void 0&&window.open(`https://console.firebase.google.com/project/${encodeURIComponent(e)}/settings/serviceaccounts/adminsdk`,`_blank`,`noopener`)}),_e.addEventListener(`click`,()=>{let e=p?.scriptId;e!==void 0&&window.open(`https://script.google.com/home/projects/${encodeURIComponent(e)}/settings`,`_blank`,`noopener`)}),A.addEventListener(`click`,()=>void G(`apps.deployments`,{},b,e=>{Q(b,e.deployments.length===0?`No deployments returned`:e.deployments.map(e=>`${e.deploymentId}${e.description===void 0?``:` (${e.description})`}`).join(`, `),`info`)},[A])),j.addEventListener(`click`,()=>$(`deployment-dialog`).showModal()),M.addEventListener(`click`,()=>void G(`apps.deployment.update`,{deploymentId:$(`deployment-id`).value.trim()||void 0},b,()=>void H(),[M])),N.addEventListener(`click`,()=>{let e=p?.deploymentId??$(`deployment-id`).value.trim();e.length>0&&window.open(`https://script.google.com/macros/s/${e}/exec`,`_blank`,`noopener`)}),R.addEventListener(`click`,()=>void G(`firebase.enable`,{},x,q,[R])),z.addEventListener(`click`,()=>void G(`firebase.login`,{},x,q,[z])),B.addEventListener(`click`,()=>{G(`firebase.connect`,{projectId:$(`firebase-project-id`).value.trim()},x,q,[B])}),V.addEventListener(`click`,()=>void G(`firebase.rules.deploy`,{},x,()=>void U(),[V])),ve.addEventListener(`click`,()=>window.open(`https://console.firebase.google.com/`,`_blank`,`noopener`)),$(`create-form`).addEventListener(`submit`,e=>{e.preventDefault();let t=$(`create-dialog`),n=$(`script-title`).value;t.close(),G(`apps.create`,{title:n},y,K,[T])}),$(`push-form`).addEventListener(`submit`,e=>{e.preventDefault(),$(`push-dialog`).close(),G(`apps.push`,{confirmed:!0},y,()=>void H(),[O])}),$(`deployment-form`).addEventListener(`submit`,e=>{e.preventDefault(),$(`deployment-dialog`).close(),G(`apps.deployment.create`,{description:$(`deployment-description`).value.trim()||void 0},b,()=>void H(),[j])}),de(),P.addEventListener(`click`,()=>void G(`development.start`,{},S,J,[P,I])),F.addEventListener(`click`,()=>void G(`development.stop`,{},S,J,[F,I])),I.addEventListener(`click`,()=>void G(`development.restart`,{},S,J,[P,F,I])),L.addEventListener(`click`,()=>void G(`development.open`,{},S,J,[L])),ye();async function ye(){await be(),await Promise.all([W(),H(),U()])}async function be(){_.disabled=!0,Z(`running`,`Inspecting`),Q(v,`Inspecting project definition`,`info`);try{await Se(`project.inspect`,{},xe(v,e=>{me=e,we(e)})),Z(`ready`,`Ready`)}catch(e){Z(`error`,`Error`),ke(v,e)}finally{_.disabled=!1}}async function H(){await G(`apps.status`,{},y,K,[$(`apps-refresh`)])}async function U(){await G(`firebase.status`,{},x,q,[$(`firebase-refresh`)])}async function W(){await G(`development.status`,{},S,J,[$(`development-refresh`)])}async function G(e,t,n,r,i=[]){De(i,!0),Z(`running`,`Working`);try{await Se(e,t,xe(n,r)),Z(`ready`,`Ready`)}catch(e){Z(`error`,`Error`),ke(n,e)}finally{De(i,!1),Y()}}function xe(e,t){return{log:t=>Q(e,t,`info`),progress:(t,n)=>Q(e,n===void 0?t:`${t} (${n}%)`,`progress`),result:t}}async function Se(e,t,n){let r=await fetch(`/api/operations/${encodeURIComponent(e)}`,{method:`POST`,headers:{"Content-Type":`application/json`,"X-Gasboost-Session":pe},body:JSON.stringify(t)});if(!r.ok||r.body===null){let e=await r.json().catch(()=>null);throw Error(e?.error??`Operation failed with status ${r.status}`)}let i=r.body.pipeThrough(new TextDecoderStream).getReader(),a=``;for(;;){let{done:e,value:t}=await i.read();a+=t??``;let r=a.split(`
|
|
5
|
-
|
|
6
|
-
`);a=r.pop()??``;for(let e of r)Ce(e,n);if(e)break}}function Ce(e,t){let n=/^event: (.+)$/m.exec(e)?.[1],r=/^data: (.+)$/m.exec(e)?.[1];if(n===void 0||r===void 0)return;let i=JSON.parse(r);if(n===`log`&&typeof i.message==`string`)t.log(i.message);else if(n===`progress`&&typeof i.message==`string`)t.progress(i.message,typeof i.percentage==`number`?i.percentage:void 0);else if(n===`result`)t.result(i);else if(n===`error`)throw Error(typeof i.message==`string`?i.message:`Operation failed`)}function we(e){$(`project-title`).textContent=e.name,$(`project-path`).textContent=e.root,Oe(`apps-script-status`,e.capabilities.appsScript),Oe(`firebase-status`,e.capabilities.firebaseRealtimeDatabase)}function K(e){p=e,X(`apps-auth-status`,e.authenticated,`Authorized`,`Sign in required`),X(`apps-project-status`,e.configured,`Connected`,`Not initialized`),X(`apps-manifest-status`,e.manifestExists,`Found`,`Missing`),X(`deployment-project-status`,e.configured,`Ready`,`Prerequisite`),$(`apps-account-detail`).textContent=e.authenticated?`clasp authorization available`:`No clasp authorization found`,$(`apps-project-detail`).textContent=e.configured?`${e.scriptId??`Connected`} · ${e.rootDir}`:`Local source: ${e.rootDir}`,$(`apps-manifest-detail`).textContent=e.manifestExists?`appsscript.json exists in project root`:`Manifest was not detected at project root`,$(`deployment-project-detail`).textContent=e.configured?`Script ID: ${e.scriptId??`connected`}`:`Create or connect an Apps Script project first`,$(`deployment-id`).value=e.deploymentId??``,X(`deployment-id-status`,e.deploymentId!==void 0,`Selected`,`Not selected`),$(`deployment-id-detail`).textContent=e.deploymentId===void 0?`No deployment synced to .env`:e.deploymentId,Te(),Y()}function q(e){m=e,X(`firebase-enabled-status`,e.enabled,`Enabled`,`Not enabled`),X(`firebase-auth-status`,e.authenticated,`Authorized`,`Sign in required`),X(`firebase-project-status`,e.configured,`Connected`,`Not connected`),$(`firebase-enabled-detail`).textContent=e.enabled?`Local Firebase configuration detected`:`Enable Firebase to create local configuration`,$(`firebase-auth-detail`).textContent=e.authenticated?`Firebase CLI authorization available`:`No Firebase CLI authorization found`,$(`firebase-project-detail`).textContent=e.projectId===void 0?`No project ID synced to .env`:e.projectId,$(`firebase-project-id`).value=e.projectId??``,Y()}function J(e){h=e,X(`development-state-status`,e.running,`Running`,`Stopped`),$(`development-state-detail`).textContent=e.command===void 0?`No dev process launched by console`:e.command.join(` `),X(`development-url-status`,e.localUrl!==void 0,`Available`,`Pending`),$(`development-url-detail`).textContent=e.localUrl??`Start the local application to detect a URL`,S.replaceChildren();for(let t of e.log)Q(S,t,`info`);Y()}function Te(){for(let e of document.querySelectorAll(`[data-setup-mode]`))e.classList.toggle(`setup-mode__button--active`,e.dataset.setupMode===g);$(`apps-create-panel`).hidden=g!==`new`,$(`apps-connect-panel`).hidden=g!==`existing`}function Ee(e){for(let t of Object.keys(C))$(`${t}-view`).hidden=t!==e,C[t].classList.toggle(`active`,t===e)}function De(e,t){for(let n of e)n.disabled=t}function Y(){let e=p?.authenticated===!0,t=p?.configured===!0;w.disabled=e,T.disabled=!e||t,E.disabled=!e||t,D.disabled=!e||!t,O.disabled=!e||!t,k.disabled=!e||!t,ge.disabled=m?.projectId===void 0,_e.disabled=p?.scriptId===void 0,A.disabled=!e||!t,j.disabled=!e||!t,M.disabled=!e||!t,N.disabled=(p?.deploymentId??$(`deployment-id`).value).length===0,P.disabled=h?.running===!0,F.disabled=h?.running!==!0,I.disabled=h?.running!==!0,L.disabled=h?.running!==!0||h.localUrl===void 0,z.disabled=m?.authenticated===!0,R.disabled=m?.enabled===!0,B.disabled=!1,V.disabled=m?.configured!==!0,ve.disabled=!1,_.disabled=!1;for(let e of Object.values(C))e.disabled=!1}function Oe(e,t){X(e,t,`Configured`,`Not configured`)}function X(e,t,n,r){let i=$(e);i.textContent=t?n:r,i.className=`badge ${t?`configured`:`inactive`}`}function Z(e,t){let n=$(`runtime-status`);n.className=`runtime-status ${e}`,n.innerHTML=``;let r=document.createElement(`span`);n.append(r,document.createTextNode(` ${t}`))}function Q(e,t,n){let r=document.createElement(`div`);r.className=`log-row ${n}`;let i=document.createElement(`time`);i.textContent=new Date().toLocaleTimeString();let a=document.createElement(`span`);a.textContent=t,r.append(i,a),e.append(r),e.scrollTop=e.scrollHeight}function ke(e,t){Q(e,t instanceof Error?t.message:`Operation failed`,`error`)}function $(e){let t=document.getElementById(e);if(t===null)throw Error(`Missing UI element: ${e}`);return t}function Ae(){let e=document.querySelector(`meta[name="gasboost-session"]`)?.content;if(e===void 0||e.length===0)throw Error(`Console session was not initialized`);return e}
|