@gasboost/console 0.4.3 → 0.5.1
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/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-H_m8-YrC.js +6 -0
- package/dist/ui/index.html +30 -2
- package/package.json +3 -2
- package/dist/ui/assets/index-BGK5B9RA.js +0 -6
|
@@ -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 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`}function pe(e,t){e.addEventListener(`input`,t)}function me(e,t,n,r){let i=e?.authenticated===!0,a=t.value.trim();n.disabled=!i||a.length===0,r.disabled=!i||a.length===0}var he=Re(),ge,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`)},_e=$(`apps-login`),ve=$(`apps-create`),ye=$(`apps-connect`),be=$(`apps-user-settings`),xe=$(`apps-open`),w=$(`apps-push`),Se=$(`apps-pull`),Ce=$(`credential-service-account`),we=$(`credential-script-properties`),T=$(`deployment-list`),E=$(`deployment-create`),D=$(`deployment-update`),Te=$(`deployment-open`),O=$(`development-start`),k=$(`development-stop`),A=$(`development-restart`),j=$(`development-open`),M=$(`firebase-enable`),N=$(`firebase-login`),P=$(`firebase-project-id`),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`),Ee=$(`firebase-open`);_.addEventListener(`click`,()=>void De()),$(`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`,()=>{Pe(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`,Ne()});_e.addEventListener(`click`,()=>void G(`apps.login`,{},y,K,[_e])),be.addEventListener(`click`,()=>window.open(`https://script.google.com/home/usersettings`,`_blank`,`noopener`)),ve.addEventListener(`click`,()=>{let e=$(`script-title`);e.value=ge?.name??``,$(`create-dialog`).showModal(),e.focus()}),ye.addEventListener(`click`,()=>{G(`apps.connect`,{scriptId:$(`script-id`).value.trim()},y,K,[ye])}),xe.addEventListener(`click`,()=>void G(`apps.open`,{},y,()=>void 0,[xe])),w.addEventListener(`click`,()=>$(`push-dialog`).showModal()),Se.addEventListener(`click`,()=>Q(y,`Pull is reserved for a follow-up operation.`,`info`)),Ce.addEventListener(`click`,()=>{let e=m?.projectId;e!==void 0&&window.open(`https://console.firebase.google.com/project/${encodeURIComponent(e)}/settings/serviceaccounts/adminsdk`,`_blank`,`noopener`)}),we.addEventListener(`click`,()=>{let e=p?.scriptId;e!==void 0&&window.open(`https://script.google.com/home/projects/${encodeURIComponent(e)}/settings`,`_blank`,`noopener`)}),T.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`)},[T])),E.addEventListener(`click`,()=>$(`deployment-dialog`).showModal()),D.addEventListener(`click`,()=>void G(`apps.deployment.update`,{deploymentId:$(`deployment-id`).value.trim()||void 0},b,()=>void H(),[D])),Te.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`)}),M.addEventListener(`click`,()=>void G(`firebase.enable`,{},x,q,[M])),N.addEventListener(`click`,()=>void G(`firebase.login`,{},x,q,[N])),pe(P,Y),F.addEventListener(`click`,()=>{G(`firebase.project.create`,{projectId:P.value.trim()},x,q,[F])}),I.addEventListener(`click`,()=>{G(`firebase.project.connect`,{projectId:P.value.trim()},x,q,[I])}),L.addEventListener(`click`,()=>{G(`firebase.webapp.create`,{displayName:$(`firebase-webapp-name`).value.trim()||void 0},x,q,[L])}),R.addEventListener(`click`,()=>void G(`firebase.webapp.config`,{},x,()=>void U(),[R])),z.addEventListener(`click`,()=>{G(`firebase.rtdb.initialize`,{location:$(`firebase-rtdb-location`).value.trim()||`us-central1`},x,q,[z])}),B.addEventListener(`click`,()=>void G(`firebase.rules.generate`,{},x,()=>void U(),[B])),V.addEventListener(`click`,()=>void G(`firebase.rules.deploy`,{},x,()=>void U(),[V])),Ee.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,[ve])}),$(`push-form`).addEventListener(`submit`,e=>{e.preventDefault(),$(`push-dialog`).close(),G(`apps.push`,{confirmed:!0},y,()=>void H(),[w])}),$(`deployment-form`).addEventListener(`submit`,e=>{e.preventDefault(),$(`deployment-dialog`).close(),G(`apps.deployment.create`,{description:$(`deployment-description`).value.trim()||void 0},b,()=>void H(),[E])}),de(),O.addEventListener(`click`,()=>void G(`development.start`,{},S,J,[O,A])),k.addEventListener(`click`,()=>void G(`development.stop`,{},S,J,[k,A])),A.addEventListener(`click`,()=>void G(`development.restart`,{},S,J,[O,k,A])),j.addEventListener(`click`,()=>void G(`development.open`,{},S,J,[j])),De();async function De(){await Oe(),await Promise.all([W(),H(),U()])}async function Oe(){_.disabled=!0,Z(`running`,`Inspecting`),Q(v,`Inspecting project definition`,`info`);try{await Ae(`project.inspect`,{},ke(v,e=>{ge=e,Me(e)})),Z(`ready`,`Ready`)}catch(e){Z(`error`,`Error`),Le(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=[]){Fe(i,!0),Z(`running`,`Working`);try{await Ae(e,t,ke(n,r)),Z(`ready`,`Ready`)}catch(e){Z(`error`,`Error`),Le(n,e)}finally{Fe(i,!1),Y()}}function ke(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 Ae(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)je(e,n);if(e)break}}function je(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 Me(e){$(`project-title`).textContent=e.name,$(`project-path`).textContent=e.root,Ie(`apps-script-status`,e.capabilities.appsScript),Ie(`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,Ne(),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.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`,P.value=e.projectId??``,$(`firebase-webapp-name`).value=e.webApp.displayName??``,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 Ne(){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 Pe(e){for(let t of Object.keys(C))$(`${t}-view`).hidden=t!==e,C[t].classList.toggle(`active`,t===e)}function Fe(e,t){for(let n of e)n.disabled=t}function Y(){let e=p?.authenticated===!0,t=p?.configured===!0;_e.disabled=e,ve.disabled=!e||t,ye.disabled=!e||t,xe.disabled=!e||!t,w.disabled=!e||!t,Se.disabled=!e||!t,Ce.disabled=m?.projectId===void 0,we.disabled=p?.scriptId===void 0,T.disabled=!e||!t,E.disabled=!e||!t,D.disabled=!e||!t,Te.disabled=(p?.deploymentId??$(`deployment-id`).value).length===0,O.disabled=h?.running===!0,k.disabled=h?.running!==!0,A.disabled=h?.running!==!0,j.disabled=h?.running!==!0||h.localUrl===void 0,N.disabled=m?.authenticated===!0,M.disabled=m?.enabled===!0;let n=m?.remoteProjectVerified===!0;me(m,P,F,I),L.disabled=!n||m?.webApp.configured===!0,R.disabled=!n||m?.webApp.configured!==!0,z.disabled=!n||m?.realtimeDatabase.desired!==!0||m?.realtimeDatabase.initialized===!0,B.disabled=m?.rulesSourceConfigured!==!0,V.disabled=!n||m?.rulesGenerated!==!0,Ee.disabled=!1,_.disabled=!1;for(let e of Object.values(C))e.disabled=!1}function Ie(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 Le(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 Re(){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-H_m8-YrC.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.1",
|
|
4
4
|
"description": "gasboost project lifecycle console",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -18,9 +18,10 @@
|
|
|
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/config": "0.2.0",
|
|
24
25
|
"@gasboost/console-runtime": "0.1.2"
|
|
25
26
|
},
|
|
26
27
|
"devDependencies": {
|
|
@@ -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}
|