@gasboost/console 0.2.0 → 0.4.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 +1 -1
- package/dist/appsScript/AppsScriptProjectRepository.d.ts +21 -0
- package/dist/appsScript/AppsScriptProjectRepository.d.ts.map +1 -0
- package/dist/appsScript/AppsScriptProjectRepository.js +75 -0
- package/dist/appsScript/AppsScriptProjectRepository.js.map +1 -0
- package/dist/appsScript/appsScriptOperations.d.ts +6 -2
- package/dist/appsScript/appsScriptOperations.d.ts.map +1 -1
- package/dist/appsScript/appsScriptOperations.js +150 -40
- package/dist/appsScript/appsScriptOperations.js.map +1 -1
- package/dist/development/developmentOperations.d.ts +17 -0
- package/dist/development/developmentOperations.d.ts.map +1 -0
- package/dist/development/developmentOperations.js +197 -0
- package/dist/development/developmentOperations.js.map +1 -0
- package/dist/env/EnvFileRepository.d.ts +13 -0
- package/dist/env/EnvFileRepository.d.ts.map +1 -0
- package/dist/env/EnvFileRepository.js +67 -0
- package/dist/env/EnvFileRepository.js.map +1 -0
- package/dist/firebase/FirebaseProjectRepository.d.ts +17 -0
- package/dist/firebase/FirebaseProjectRepository.d.ts.map +1 -0
- package/dist/firebase/FirebaseProjectRepository.js +82 -0
- package/dist/firebase/FirebaseProjectRepository.js.map +1 -0
- package/dist/firebase/FirebaseRunner.d.ts +10 -0
- package/dist/firebase/FirebaseRunner.d.ts.map +1 -0
- package/dist/firebase/FirebaseRunner.js +54 -0
- package/dist/firebase/FirebaseRunner.js.map +1 -0
- package/dist/firebase/firebaseOperations.d.ts +20 -0
- package/dist/firebase/firebaseOperations.d.ts.map +1 -0
- package/dist/firebase/firebaseOperations.js +96 -0
- package/dist/firebase/firebaseOperations.js.map +1 -0
- package/dist/index.d.ts +3 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +3 -0
- package/dist/index.js.map +1 -1
- package/dist/openBrowser.d.ts +2 -0
- package/dist/openBrowser.d.ts.map +1 -0
- package/dist/openBrowser.js +20 -0
- package/dist/openBrowser.js.map +1 -0
- package/dist/startGasboostConsole.d.ts +3 -1
- package/dist/startGasboostConsole.d.ts.map +1 -1
- package/dist/startGasboostConsole.js +26 -10
- package/dist/startGasboostConsole.js.map +1 -1
- package/dist/ui/assets/index-B6Dn-OF9.css +1 -0
- package/dist/ui/assets/index-BGK5B9RA.js +6 -0
- package/dist/ui/gasboost-logo.png +0 -0
- package/dist/ui/index.html +170 -14
- package/package.json +3 -3
- package/dist/ui/assets/index-B2QLlRZv.css +0 -1
- package/dist/ui/assets/index-Bv7Miq39.js +0 -6
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
import { readFile } from "node:fs/promises";
|
|
3
|
+
import { join } from "node:path";
|
|
4
|
+
import { z } from "zod";
|
|
5
|
+
import { openBrowser } from "../openBrowser.js";
|
|
6
|
+
const emptyInput = z.object({}).strict();
|
|
7
|
+
const MAX_LOG_LINES = 200;
|
|
8
|
+
const LOCAL_URL_PATTERN = /https?:\/\/(?:localhost|127\.0\.0\.1|\[::1\])(?::\d+)?[^\s"'<>)]*/;
|
|
9
|
+
export function createDevelopmentOperations({ projectRoot, browserOpener = openBrowser, }) {
|
|
10
|
+
const manager = new DevelopmentProcessManager(projectRoot, browserOpener);
|
|
11
|
+
return {
|
|
12
|
+
cleanup: async () => {
|
|
13
|
+
await manager.stop();
|
|
14
|
+
},
|
|
15
|
+
operations: [
|
|
16
|
+
{
|
|
17
|
+
id: "development.status",
|
|
18
|
+
input: emptyInput,
|
|
19
|
+
async handler() {
|
|
20
|
+
return manager.status();
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: "development.start",
|
|
25
|
+
input: emptyInput,
|
|
26
|
+
async handler(_input, context) {
|
|
27
|
+
context.progress({ message: "Starting local application", percentage: 20 });
|
|
28
|
+
const status = await manager.start(context.log);
|
|
29
|
+
context.progress({ message: status.running ? "Local application running" : "Local application stopped", percentage: 100 });
|
|
30
|
+
return status;
|
|
31
|
+
},
|
|
32
|
+
},
|
|
33
|
+
{
|
|
34
|
+
id: "development.stop",
|
|
35
|
+
input: emptyInput,
|
|
36
|
+
async handler(_input, context) {
|
|
37
|
+
context.progress({ message: "Stopping local application", percentage: 30 });
|
|
38
|
+
const status = await manager.stop();
|
|
39
|
+
context.progress({ message: "Local application stopped", percentage: 100 });
|
|
40
|
+
return status;
|
|
41
|
+
},
|
|
42
|
+
},
|
|
43
|
+
{
|
|
44
|
+
id: "development.restart",
|
|
45
|
+
input: emptyInput,
|
|
46
|
+
async handler(_input, context) {
|
|
47
|
+
context.progress({ message: "Restarting local application", percentage: 20 });
|
|
48
|
+
await manager.stop();
|
|
49
|
+
const status = await manager.start(context.log);
|
|
50
|
+
context.progress({ message: "Local application restarted", percentage: 100 });
|
|
51
|
+
return status;
|
|
52
|
+
},
|
|
53
|
+
},
|
|
54
|
+
{
|
|
55
|
+
id: "development.open",
|
|
56
|
+
input: emptyInput,
|
|
57
|
+
async handler() {
|
|
58
|
+
const status = manager.status();
|
|
59
|
+
if (!status.running) {
|
|
60
|
+
throw new Error("Start the local application first.");
|
|
61
|
+
}
|
|
62
|
+
if (status.localUrl === undefined) {
|
|
63
|
+
throw new Error("Local application URL is not available yet.");
|
|
64
|
+
}
|
|
65
|
+
await manager.open(status.localUrl);
|
|
66
|
+
return status;
|
|
67
|
+
},
|
|
68
|
+
},
|
|
69
|
+
],
|
|
70
|
+
};
|
|
71
|
+
}
|
|
72
|
+
class DevelopmentProcessManager {
|
|
73
|
+
projectRoot;
|
|
74
|
+
browserOpener;
|
|
75
|
+
child;
|
|
76
|
+
command;
|
|
77
|
+
localUrl;
|
|
78
|
+
logLines = [];
|
|
79
|
+
constructor(projectRoot, browserOpener) {
|
|
80
|
+
this.projectRoot = projectRoot;
|
|
81
|
+
this.browserOpener = browserOpener;
|
|
82
|
+
}
|
|
83
|
+
status() {
|
|
84
|
+
return {
|
|
85
|
+
running: this.child !== undefined,
|
|
86
|
+
...(this.localUrl === undefined ? {} : { localUrl: this.localUrl }),
|
|
87
|
+
...(this.command === undefined ? {} : { command: this.command }),
|
|
88
|
+
log: this.logLines,
|
|
89
|
+
};
|
|
90
|
+
}
|
|
91
|
+
async start(log) {
|
|
92
|
+
if (this.child !== undefined) {
|
|
93
|
+
const message = "Development server is already running.";
|
|
94
|
+
this.record(message);
|
|
95
|
+
log(message);
|
|
96
|
+
return this.status();
|
|
97
|
+
}
|
|
98
|
+
const command = await resolveDevCommand(this.projectRoot);
|
|
99
|
+
this.command = [command.executable, ...command.args];
|
|
100
|
+
this.localUrl = undefined;
|
|
101
|
+
this.record(`$ ${this.command.join(" ")}`);
|
|
102
|
+
const child = spawn(command.executable, command.args, {
|
|
103
|
+
cwd: this.projectRoot,
|
|
104
|
+
env: {
|
|
105
|
+
...process.env,
|
|
106
|
+
BROWSER: "none",
|
|
107
|
+
FORCE_COLOR: "1",
|
|
108
|
+
},
|
|
109
|
+
shell: process.platform === "win32",
|
|
110
|
+
});
|
|
111
|
+
this.child = child;
|
|
112
|
+
const handleOutput = (chunk) => {
|
|
113
|
+
const text = chunk.toString("utf8");
|
|
114
|
+
const url = LOCAL_URL_PATTERN.exec(text)?.[0];
|
|
115
|
+
if (url !== undefined)
|
|
116
|
+
this.localUrl = normalizeLocalUrl(url);
|
|
117
|
+
for (const line of text.split(/\r?\n/)) {
|
|
118
|
+
const trimmed = stripAnsi(line).trimEnd();
|
|
119
|
+
if (trimmed.length === 0)
|
|
120
|
+
continue;
|
|
121
|
+
this.record(trimmed);
|
|
122
|
+
log(trimmed);
|
|
123
|
+
}
|
|
124
|
+
};
|
|
125
|
+
child.stdout.on("data", handleOutput);
|
|
126
|
+
child.stderr.on("data", handleOutput);
|
|
127
|
+
child.once("exit", (code, signal) => {
|
|
128
|
+
this.record(`Development server exited${signal === null ? ` with code ${code ?? 0}` : ` by ${signal}`}.`);
|
|
129
|
+
if (this.child === child) {
|
|
130
|
+
this.child = undefined;
|
|
131
|
+
this.localUrl = undefined;
|
|
132
|
+
}
|
|
133
|
+
});
|
|
134
|
+
child.once("error", (error) => {
|
|
135
|
+
this.record(error.message);
|
|
136
|
+
if (this.child === child) {
|
|
137
|
+
this.child = undefined;
|
|
138
|
+
this.localUrl = undefined;
|
|
139
|
+
}
|
|
140
|
+
});
|
|
141
|
+
return this.status();
|
|
142
|
+
}
|
|
143
|
+
async stop() {
|
|
144
|
+
const child = this.child;
|
|
145
|
+
if (child === undefined)
|
|
146
|
+
return this.status();
|
|
147
|
+
this.child = undefined;
|
|
148
|
+
this.localUrl = undefined;
|
|
149
|
+
let exited = false;
|
|
150
|
+
child.once("exit", () => {
|
|
151
|
+
exited = true;
|
|
152
|
+
});
|
|
153
|
+
child.kill("SIGTERM");
|
|
154
|
+
await Promise.race([
|
|
155
|
+
new Promise((resolve) => child.once("exit", () => resolve())),
|
|
156
|
+
new Promise((resolve) => {
|
|
157
|
+
setTimeout(() => {
|
|
158
|
+
if (!exited)
|
|
159
|
+
child.kill("SIGKILL");
|
|
160
|
+
resolve();
|
|
161
|
+
}, 5000);
|
|
162
|
+
}),
|
|
163
|
+
]);
|
|
164
|
+
this.record("Development server stopped.");
|
|
165
|
+
return this.status();
|
|
166
|
+
}
|
|
167
|
+
async open(url) {
|
|
168
|
+
await this.browserOpener(url);
|
|
169
|
+
}
|
|
170
|
+
record(message) {
|
|
171
|
+
this.logLines.push(message);
|
|
172
|
+
if (this.logLines.length > MAX_LOG_LINES) {
|
|
173
|
+
this.logLines.splice(0, this.logLines.length - MAX_LOG_LINES);
|
|
174
|
+
}
|
|
175
|
+
}
|
|
176
|
+
}
|
|
177
|
+
async function resolveDevCommand(projectRoot) {
|
|
178
|
+
const packageJson = JSON.parse(await readFile(join(projectRoot, "package.json"), "utf8"));
|
|
179
|
+
if (typeof packageJson.scripts?.dev !== "string") {
|
|
180
|
+
throw new Error("No package.json dev script was found.");
|
|
181
|
+
}
|
|
182
|
+
const packageManager = packageJson.packageManager?.split("@", 1)[0] ?? "npm";
|
|
183
|
+
if (packageManager === "pnpm")
|
|
184
|
+
return { executable: "pnpm", args: ["run", "dev"] };
|
|
185
|
+
if (packageManager === "yarn")
|
|
186
|
+
return { executable: "yarn", args: ["dev"] };
|
|
187
|
+
if (packageManager === "bun")
|
|
188
|
+
return { executable: "bun", args: ["run", "dev"] };
|
|
189
|
+
return { executable: "npm", args: ["run", "dev"] };
|
|
190
|
+
}
|
|
191
|
+
function normalizeLocalUrl(url) {
|
|
192
|
+
return url.replace("http://localhost", "http://127.0.0.1");
|
|
193
|
+
}
|
|
194
|
+
function stripAnsi(value) {
|
|
195
|
+
return value.replace(/\u001b\[[0-9;]*m/g, "");
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=developmentOperations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"developmentOperations.js","sourceRoot":"","sources":["../../src/development/developmentOperations.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
export type RuntimeIdentifiers = {
|
|
2
|
+
readonly GAS_SCRIPT_ID?: string;
|
|
3
|
+
readonly FIREBASE_PROJECT_ID?: string;
|
|
4
|
+
readonly DEPLOYMENT_ID?: string;
|
|
5
|
+
};
|
|
6
|
+
export declare class EnvFileRepository {
|
|
7
|
+
private readonly path;
|
|
8
|
+
constructor(projectRoot: string);
|
|
9
|
+
read(): Promise<RuntimeIdentifiers>;
|
|
10
|
+
update(values: RuntimeIdentifiers): Promise<void>;
|
|
11
|
+
private readContent;
|
|
12
|
+
}
|
|
13
|
+
//# sourceMappingURL=EnvFileRepository.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvFileRepository.d.ts","sourceRoot":"","sources":["../../src/env/EnvFileRepository.ts"],"names":[],"mappings":"AASA,MAAM,MAAM,kBAAkB,GAAG;IAC/B,QAAQ,CAAC,aAAa,CAAC,EAAE,MAAM,CAAC;IAChC,QAAQ,CAAC,mBAAmB,CAAC,EAAE,MAAM,CAAC;IACtC,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"}
|
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
const managedKeys = new Set([
|
|
4
|
+
"GAS_SCRIPT_ID",
|
|
5
|
+
"FIREBASE_PROJECT_ID",
|
|
6
|
+
"DEPLOYMENT_ID",
|
|
7
|
+
]);
|
|
8
|
+
export class EnvFileRepository {
|
|
9
|
+
path;
|
|
10
|
+
constructor(projectRoot) {
|
|
11
|
+
this.path = join(projectRoot, ".env");
|
|
12
|
+
}
|
|
13
|
+
async read() {
|
|
14
|
+
const content = await this.readContent();
|
|
15
|
+
const values = {};
|
|
16
|
+
for (const line of content.split(/\r?\n/)) {
|
|
17
|
+
const match = /^([A-Za-z_][A-Za-z0-9_]*)=(.*)$/.exec(line);
|
|
18
|
+
const key = match?.[1];
|
|
19
|
+
const value = match?.[2];
|
|
20
|
+
if (key === undefined || value === undefined || !managedKeys.has(key))
|
|
21
|
+
continue;
|
|
22
|
+
values[key] = value;
|
|
23
|
+
}
|
|
24
|
+
return values;
|
|
25
|
+
}
|
|
26
|
+
async update(values) {
|
|
27
|
+
const updates = Object.entries(values).filter((entry) => entry[1] !== undefined && managedKeys.has(entry[0]));
|
|
28
|
+
if (updates.length === 0)
|
|
29
|
+
return;
|
|
30
|
+
const content = await this.readContent();
|
|
31
|
+
const lines = content.length === 0 ? [] : content.split(/\r?\n/);
|
|
32
|
+
const seen = new Set();
|
|
33
|
+
const updatedLines = [];
|
|
34
|
+
for (const line of lines) {
|
|
35
|
+
const match = /^([A-Za-z_][A-Za-z0-9_]*)=/.exec(line);
|
|
36
|
+
const key = match?.[1];
|
|
37
|
+
if (key === undefined || !(key in values) || values[key] === undefined) {
|
|
38
|
+
updatedLines.push(line);
|
|
39
|
+
continue;
|
|
40
|
+
}
|
|
41
|
+
if (seen.has(key))
|
|
42
|
+
continue;
|
|
43
|
+
seen.add(key);
|
|
44
|
+
updatedLines.push(`${key}=${values[key]}`);
|
|
45
|
+
}
|
|
46
|
+
for (const [key, value] of updates) {
|
|
47
|
+
if (!seen.has(key))
|
|
48
|
+
updatedLines.push(`${key}=${value}`);
|
|
49
|
+
}
|
|
50
|
+
await writeFile(this.path, `${updatedLines.join("\n").replace(/\n*$/, "")}\n`, "utf8");
|
|
51
|
+
}
|
|
52
|
+
async readContent() {
|
|
53
|
+
try {
|
|
54
|
+
return await readFile(this.path, "utf8");
|
|
55
|
+
}
|
|
56
|
+
catch (error) {
|
|
57
|
+
if (typeof error === "object" &&
|
|
58
|
+
error !== null &&
|
|
59
|
+
"code" in error &&
|
|
60
|
+
error.code === "ENOENT") {
|
|
61
|
+
return "";
|
|
62
|
+
}
|
|
63
|
+
throw error;
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
}
|
|
67
|
+
//# sourceMappingURL=EnvFileRepository.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"EnvFileRepository.js","sourceRoot":"","sources":["../../src/env/EnvFileRepository.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
export type FirebaseProjectState = {
|
|
2
|
+
readonly enabled: boolean;
|
|
3
|
+
readonly projectId?: string;
|
|
4
|
+
readonly firebaseJson: boolean;
|
|
5
|
+
readonly firebaserc: boolean;
|
|
6
|
+
};
|
|
7
|
+
export declare class FirebaseProjectRepository {
|
|
8
|
+
private readonly projectRoot;
|
|
9
|
+
constructor(projectRoot: string);
|
|
10
|
+
read(): Promise<FirebaseProjectState>;
|
|
11
|
+
enable(): Promise<void>;
|
|
12
|
+
connect(projectId: string): Promise<void>;
|
|
13
|
+
private readFirebasercProjectId;
|
|
14
|
+
private readFirebasercObject;
|
|
15
|
+
private exists;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=FirebaseProjectRepository.d.ts.map
|
|
@@ -0,0 +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,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IAErC,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"}
|
|
@@ -0,0 +1,82 @@
|
|
|
1
|
+
import { readFile, writeFile } from "node:fs/promises";
|
|
2
|
+
import { join } from "node:path";
|
|
3
|
+
export class FirebaseProjectRepository {
|
|
4
|
+
projectRoot;
|
|
5
|
+
constructor(projectRoot) {
|
|
6
|
+
this.projectRoot = projectRoot;
|
|
7
|
+
}
|
|
8
|
+
async read() {
|
|
9
|
+
const [firebaseJson, rcProjectId] = await Promise.all([
|
|
10
|
+
this.exists("firebase.json"),
|
|
11
|
+
this.readFirebasercProjectId(),
|
|
12
|
+
]);
|
|
13
|
+
return {
|
|
14
|
+
enabled: firebaseJson || rcProjectId !== undefined,
|
|
15
|
+
...(rcProjectId === undefined ? {} : { projectId: rcProjectId }),
|
|
16
|
+
firebaseJson,
|
|
17
|
+
firebaserc: rcProjectId !== undefined,
|
|
18
|
+
};
|
|
19
|
+
}
|
|
20
|
+
async enable() {
|
|
21
|
+
if (!(await this.exists("firebase.json"))) {
|
|
22
|
+
await writeFile(join(this.projectRoot, "firebase.json"), `${JSON.stringify({ database: { rules: "database.rules.json" } }, null, 2)}\n`, "utf8");
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
async connect(projectId) {
|
|
26
|
+
await this.enable();
|
|
27
|
+
const current = (await this.readFirebasercObject()) ?? {};
|
|
28
|
+
const projects = typeof current.projects === "object" &&
|
|
29
|
+
current.projects !== null &&
|
|
30
|
+
!Array.isArray(current.projects)
|
|
31
|
+
? current.projects
|
|
32
|
+
: {};
|
|
33
|
+
await writeFile(join(this.projectRoot, ".firebaserc"), `${JSON.stringify({ ...current, projects: { ...projects, default: projectId } }, null, 2)}\n`, "utf8");
|
|
34
|
+
}
|
|
35
|
+
async readFirebasercProjectId() {
|
|
36
|
+
const value = await this.readFirebasercObject();
|
|
37
|
+
if (value === undefined)
|
|
38
|
+
return undefined;
|
|
39
|
+
const projects = value.projects;
|
|
40
|
+
if (typeof projects !== "object" || projects === null || Array.isArray(projects)) {
|
|
41
|
+
return undefined;
|
|
42
|
+
}
|
|
43
|
+
const projectMap = projects;
|
|
44
|
+
return typeof projectMap.default === "string" ? projectMap.default : undefined;
|
|
45
|
+
}
|
|
46
|
+
async readFirebasercObject() {
|
|
47
|
+
try {
|
|
48
|
+
const value = JSON.parse(await readFile(join(this.projectRoot, ".firebaserc"), "utf8"));
|
|
49
|
+
if (typeof value !== "object" || value === null || Array.isArray(value)) {
|
|
50
|
+
throw new Error("Expected a JSON object.");
|
|
51
|
+
}
|
|
52
|
+
return value;
|
|
53
|
+
}
|
|
54
|
+
catch (error) {
|
|
55
|
+
if (typeof error === "object" &&
|
|
56
|
+
error !== null &&
|
|
57
|
+
"code" in error &&
|
|
58
|
+
error.code === "ENOENT") {
|
|
59
|
+
return undefined;
|
|
60
|
+
}
|
|
61
|
+
throw new Error(".firebaserc exists but does not contain valid Firebase settings.", {
|
|
62
|
+
cause: error,
|
|
63
|
+
});
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
async exists(relativePath) {
|
|
67
|
+
try {
|
|
68
|
+
await readFile(join(this.projectRoot, relativePath), "utf8");
|
|
69
|
+
return true;
|
|
70
|
+
}
|
|
71
|
+
catch (error) {
|
|
72
|
+
if (typeof error === "object" &&
|
|
73
|
+
error !== null &&
|
|
74
|
+
"code" in error &&
|
|
75
|
+
error.code === "ENOENT") {
|
|
76
|
+
return false;
|
|
77
|
+
}
|
|
78
|
+
throw error;
|
|
79
|
+
}
|
|
80
|
+
}
|
|
81
|
+
}
|
|
82
|
+
//# sourceMappingURL=FirebaseProjectRepository.js.map
|
|
@@ -0,0 +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;IACnB,WAAW,CAAS;IAErC,YAAmB,WAAmB;QACpC,IAAI,CAAC,WAAW,GAAG,WAAW,CAAC;IACjC,CAAC;IAEM,KAAK,CAAC,IAAI;QACf,MAAM,CAAC,YAAY,EAAE,WAAW,CAAC,GAAG,MAAM,OAAO,CAAC,GAAG,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC;YAC5B,IAAI,CAAC,uBAAuB,EAAE;SAC/B,CAAC,CAAC;QAEH,OAAO;YACL,OAAO,EAAE,YAAY,IAAI,WAAW,KAAK,SAAS;YAClD,GAAG,CAAC,WAAW,KAAK,SAAS,CAAC,CAAC,CAAC,EAAE,CAAC,CAAC,CAAC,EAAE,SAAS,EAAE,WAAW,EAAE,CAAC;YAChE,YAAY;YACZ,UAAU,EAAE,WAAW,KAAK,SAAS;SACtC,CAAC;IACJ,CAAC;IAEM,KAAK,CAAC,MAAM;QACjB,IAAI,CAAC,CAAC,MAAM,IAAI,CAAC,MAAM,CAAC,eAAe,CAAC,CAAC,EAAE,CAAC;YAC1C,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,eAAe,CAAC,EACvC,GAAG,IAAI,CAAC,SAAS,CAAC,EAAE,QAAQ,EAAE,EAAE,KAAK,EAAE,qBAAqB,EAAE,EAAE,EAAE,IAAI,EAAE,CAAC,CAAC,IAAI,EAC9E,MAAM,CACP,CAAC;QACJ,CAAC;IACH,CAAC;IAEM,KAAK,CAAC,OAAO,CAAC,SAAiB;QACpC,MAAM,IAAI,CAAC,MAAM,EAAE,CAAC;QACpB,MAAM,OAAO,GAAG,CAAC,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC,IAAI,EAAE,CAAC;QAC1D,MAAM,QAAQ,GACZ,OAAO,OAAO,CAAC,QAAQ,KAAK,QAAQ;YACpC,OAAO,CAAC,QAAQ,KAAK,IAAI;YACzB,CAAC,KAAK,CAAC,OAAO,CAAC,OAAO,CAAC,QAAQ,CAAC;YAC9B,CAAC,CAAE,OAAO,CAAC,QAAoC;YAC/C,CAAC,CAAC,EAAE,CAAC;QACT,MAAM,SAAS,CACb,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EACrC,GAAG,IAAI,CAAC,SAAS,CACf,EAAE,GAAG,OAAO,EAAE,QAAQ,EAAE,EAAE,GAAG,QAAQ,EAAE,OAAO,EAAE,SAAS,EAAE,EAAE,EAC7D,IAAI,EACJ,CAAC,CACF,IAAI,EACL,MAAM,CACP,CAAC;IACJ,CAAC;IAEO,KAAK,CAAC,uBAAuB;QACnC,MAAM,KAAK,GAAG,MAAM,IAAI,CAAC,oBAAoB,EAAE,CAAC;QAChD,IAAI,KAAK,KAAK,SAAS;YAAE,OAAO,SAAS,CAAC;QAC1C,MAAM,QAAQ,GAAG,KAAK,CAAC,QAAQ,CAAC;QAChC,IAAI,OAAO,QAAQ,KAAK,QAAQ,IAAI,QAAQ,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,QAAQ,CAAC,EAAE,CAAC;YACjF,OAAO,SAAS,CAAC;QACnB,CAAC;QACD,MAAM,UAAU,GAAG,QAAmC,CAAC;QACvD,OAAO,OAAO,UAAU,CAAC,OAAO,KAAK,QAAQ,CAAC,CAAC,CAAC,UAAU,CAAC,OAAO,CAAC,CAAC,CAAC,SAAS,CAAC;IACjF,CAAC;IAEO,KAAK,CAAC,oBAAoB;QAChC,IAAI,CAAC;YACH,MAAM,KAAK,GAAG,IAAI,CAAC,KAAK,CACtB,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,aAAa,CAAC,EAAE,MAAM,CAAC,CACnD,CAAC;YACb,IAAI,OAAO,KAAK,KAAK,QAAQ,IAAI,KAAK,KAAK,IAAI,IAAI,KAAK,CAAC,OAAO,CAAC,KAAK,CAAC,EAAE,CAAC;gBACxE,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;YAC7C,CAAC;YACD,OAAO,KAAgC,CAAC;QAC1C,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,OAAO,KAAK,KAAK,QAAQ;gBACzB,KAAK,KAAK,IAAI;gBACd,MAAM,IAAI,KAAK;gBACf,KAAK,CAAC,IAAI,KAAK,QAAQ,EACvB,CAAC;gBACD,OAAO,SAAS,CAAC;YACnB,CAAC;YACD,MAAM,IAAI,KAAK,CAAC,kEAAkE,EAAE;gBAClF,KAAK,EAAE,KAAK;aACb,CAAC,CAAC;QACL,CAAC;IACH,CAAC;IAEO,KAAK,CAAC,MAAM,CAAC,YAAoB;QACvC,IAAI,CAAC;YACH,MAAM,QAAQ,CAAC,IAAI,CAAC,IAAI,CAAC,WAAW,EAAE,YAAY,CAAC,EAAE,MAAM,CAAC,CAAC;YAC7D,OAAO,IAAI,CAAC;QACd,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IACE,OAAO,KAAK,KAAK,QAAQ;gBACzB,KAAK,KAAK,IAAI;gBACd,MAAM,IAAI,KAAK;gBACf,KAAK,CAAC,IAAI,KAAK,QAAQ,EACvB,CAAC;gBACD,OAAO,KAAK,CAAC;YACf,CAAC;YACD,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;CACF"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
export type FirebaseResult = {
|
|
2
|
+
readonly exitCode: number;
|
|
3
|
+
readonly stdout: string;
|
|
4
|
+
readonly stderr: string;
|
|
5
|
+
};
|
|
6
|
+
export type FirebaseRunner = {
|
|
7
|
+
readonly run: (args: readonly string[], onOutput?: (line: string) => void) => Promise<FirebaseResult>;
|
|
8
|
+
};
|
|
9
|
+
export declare function createFirebaseRunner(projectRoot: string): FirebaseRunner;
|
|
10
|
+
//# sourceMappingURL=FirebaseRunner.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FirebaseRunner.d.ts","sourceRoot":"","sources":["../../src/firebase/FirebaseRunner.ts"],"names":[],"mappings":"AAEA,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;CAC9B,CAAC;AAEF,wBAAgB,oBAAoB,CAAC,WAAW,EAAE,MAAM,GAAG,cAAc,CAgCxE"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
import { spawn } from "node:child_process";
|
|
2
|
+
export function createFirebaseRunner(projectRoot) {
|
|
3
|
+
return {
|
|
4
|
+
run: (args, onOutput) => new Promise((resolve, reject) => {
|
|
5
|
+
const child = spawn("pnpm", ["exec", "firebase", ...args], {
|
|
6
|
+
cwd: projectRoot,
|
|
7
|
+
env: { ...process.env, NO_COLOR: "1" },
|
|
8
|
+
stdio: ["ignore", "pipe", "pipe"],
|
|
9
|
+
});
|
|
10
|
+
let stdout = "";
|
|
11
|
+
let stderr = "";
|
|
12
|
+
const stdoutLines = createLineEmitter(onOutput);
|
|
13
|
+
const stderrLines = createLineEmitter(onOutput);
|
|
14
|
+
child.stdout.setEncoding("utf8");
|
|
15
|
+
child.stderr.setEncoding("utf8");
|
|
16
|
+
child.stdout.on("data", (chunk) => {
|
|
17
|
+
stdout += chunk;
|
|
18
|
+
stdoutLines.write(chunk);
|
|
19
|
+
});
|
|
20
|
+
child.stderr.on("data", (chunk) => {
|
|
21
|
+
stderr += chunk;
|
|
22
|
+
stderrLines.write(chunk);
|
|
23
|
+
});
|
|
24
|
+
child.once("error", reject);
|
|
25
|
+
child.once("close", (exitCode) => {
|
|
26
|
+
stdoutLines.flush();
|
|
27
|
+
stderrLines.flush();
|
|
28
|
+
resolve({ exitCode: exitCode ?? 1, stdout, stderr });
|
|
29
|
+
});
|
|
30
|
+
}),
|
|
31
|
+
};
|
|
32
|
+
}
|
|
33
|
+
function createLineEmitter(onOutput) {
|
|
34
|
+
let buffer = "";
|
|
35
|
+
const emit = (line) => {
|
|
36
|
+
const message = line.trim();
|
|
37
|
+
if (message.length > 0)
|
|
38
|
+
onOutput?.(message);
|
|
39
|
+
};
|
|
40
|
+
return {
|
|
41
|
+
write(chunk) {
|
|
42
|
+
buffer += chunk;
|
|
43
|
+
const lines = buffer.split(/\r?\n/);
|
|
44
|
+
buffer = lines.pop() ?? "";
|
|
45
|
+
for (const line of lines)
|
|
46
|
+
emit(line);
|
|
47
|
+
},
|
|
48
|
+
flush() {
|
|
49
|
+
emit(buffer);
|
|
50
|
+
buffer = "";
|
|
51
|
+
},
|
|
52
|
+
};
|
|
53
|
+
}
|
|
54
|
+
//# sourceMappingURL=FirebaseRunner.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"FirebaseRunner.js","sourceRoot":"","sources":["../../src/firebase/FirebaseRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAe3C,MAAM,UAAU,oBAAoB,CAAC,WAAmB;IACtD,OAAO;QACL,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CACtB,IAAI,OAAO,CAAiB,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC9C,MAAM,KAAK,GAAG,KAAK,CAAC,MAAM,EAAE,CAAC,MAAM,EAAE,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE;gBACzD,GAAG,EAAE,WAAW;gBAChB,GAAG,EAAE,EAAE,GAAG,OAAO,CAAC,GAAG,EAAE,QAAQ,EAAE,GAAG,EAAE;gBACtC,KAAK,EAAE,CAAC,QAAQ,EAAE,MAAM,EAAE,MAAM,CAAC;aAClC,CAAC,CAAC;YACH,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,IAAI,MAAM,GAAG,EAAE,CAAC;YAChB,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAChD,MAAM,WAAW,GAAG,iBAAiB,CAAC,QAAQ,CAAC,CAAC;YAEhD,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACjC,KAAK,CAAC,MAAM,CAAC,WAAW,CAAC,MAAM,CAAC,CAAC;YACjC,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACxC,MAAM,IAAI,KAAK,CAAC;gBAChB,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,MAAM,CAAC,EAAE,CAAC,MAAM,EAAE,CAAC,KAAa,EAAE,EAAE;gBACxC,MAAM,IAAI,KAAK,CAAC;gBAChB,WAAW,CAAC,KAAK,CAAC,KAAK,CAAC,CAAC;YAC3B,CAAC,CAAC,CAAC;YACH,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,MAAM,CAAC,CAAC;YAC5B,KAAK,CAAC,IAAI,CAAC,OAAO,EAAE,CAAC,QAAQ,EAAE,EAAE;gBAC/B,WAAW,CAAC,KAAK,EAAE,CAAC;gBACpB,WAAW,CAAC,KAAK,EAAE,CAAC;gBACpB,OAAO,CAAC,EAAE,QAAQ,EAAE,QAAQ,IAAI,CAAC,EAAE,MAAM,EAAE,MAAM,EAAE,CAAC,CAAC;YACvD,CAAC,CAAC,CAAC;QACL,CAAC,CAAC;KACL,CAAC;AACJ,CAAC;AAED,SAAS,iBAAiB,CACxB,QAA8C;IAE9C,IAAI,MAAM,GAAG,EAAE,CAAC;IAChB,MAAM,IAAI,GAAG,CAAC,IAAY,EAAQ,EAAE;QAClC,MAAM,OAAO,GAAG,IAAI,CAAC,IAAI,EAAE,CAAC;QAC5B,IAAI,OAAO,CAAC,MAAM,GAAG,CAAC;YAAE,QAAQ,EAAE,CAAC,OAAO,CAAC,CAAC;IAC9C,CAAC,CAAC;IAEF,OAAO;QACL,KAAK,CAAC,KAAK;YACT,MAAM,IAAI,KAAK,CAAC;YAChB,MAAM,KAAK,GAAG,MAAM,CAAC,KAAK,CAAC,OAAO,CAAC,CAAC;YACpC,MAAM,GAAG,KAAK,CAAC,GAAG,EAAE,IAAI,EAAE,CAAC;YAC3B,KAAK,MAAM,IAAI,IAAI,KAAK;gBAAE,IAAI,CAAC,IAAI,CAAC,CAAC;QACvC,CAAC;QACD,KAAK;YACH,IAAI,CAAC,MAAM,CAAC,CAAC;YACb,MAAM,GAAG,EAAE,CAAC;QACd,CAAC;KACF,CAAC;AACJ,CAAC"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import type { NormalizedGasboostConfig } from "@gasboost/config";
|
|
2
|
+
import type { OperationDefinition } from "@gasboost/console-runtime";
|
|
3
|
+
import type { FirebaseRunner } from "./FirebaseRunner.js";
|
|
4
|
+
export type FirebaseStatus = {
|
|
5
|
+
readonly enabled: boolean;
|
|
6
|
+
readonly configured: boolean;
|
|
7
|
+
readonly authenticated: boolean;
|
|
8
|
+
readonly projectId?: string;
|
|
9
|
+
readonly realtimeDatabaseDesired: boolean;
|
|
10
|
+
readonly firebaseJson: boolean;
|
|
11
|
+
readonly firebaserc: boolean;
|
|
12
|
+
};
|
|
13
|
+
type FirebaseOperation = OperationDefinition<any, unknown>;
|
|
14
|
+
export declare function createFirebaseOperations({ projectRoot, config, firebase, }: {
|
|
15
|
+
readonly projectRoot: string;
|
|
16
|
+
readonly config: NormalizedGasboostConfig;
|
|
17
|
+
readonly firebase: FirebaseRunner;
|
|
18
|
+
}): readonly FirebaseOperation[];
|
|
19
|
+
export {};
|
|
20
|
+
//# sourceMappingURL=firebaseOperations.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebaseOperations.d.ts","sourceRoot":"","sources":["../../src/firebase/firebaseOperations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIrE,OAAO,KAAK,EAAkB,cAAc,EAAE,MAAM,qBAAqB,CAAC;AAE1E,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,uBAAuB,EAAE,OAAO,CAAC;IAC1C,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;AAO3D,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,CAkE/B"}
|
|
@@ -0,0 +1,96 @@
|
|
|
1
|
+
import { z } from "zod";
|
|
2
|
+
import { EnvFileRepository } from "../env/EnvFileRepository.js";
|
|
3
|
+
import { FirebaseProjectRepository } from "./FirebaseProjectRepository.js";
|
|
4
|
+
const emptyInput = z.object({}).strict();
|
|
5
|
+
const projectInput = z
|
|
6
|
+
.object({ projectId: z.string().trim().min(3).max(80) })
|
|
7
|
+
.strict();
|
|
8
|
+
export function createFirebaseOperations({ projectRoot, config, firebase, }) {
|
|
9
|
+
const projectRepository = new FirebaseProjectRepository(projectRoot);
|
|
10
|
+
const envRepository = new EnvFileRepository(projectRoot);
|
|
11
|
+
const status = async () => getFirebaseStatus({ config, projectRepository, envRepository, firebase });
|
|
12
|
+
return [
|
|
13
|
+
{
|
|
14
|
+
id: "firebase.status",
|
|
15
|
+
input: emptyInput,
|
|
16
|
+
async handler(_input, context) {
|
|
17
|
+
context.progress({ message: "Checking Firebase", percentage: 25 });
|
|
18
|
+
const result = await status();
|
|
19
|
+
context.progress({ message: "Firebase status ready", percentage: 100 });
|
|
20
|
+
return result;
|
|
21
|
+
},
|
|
22
|
+
},
|
|
23
|
+
{
|
|
24
|
+
id: "firebase.enable",
|
|
25
|
+
input: emptyInput,
|
|
26
|
+
async handler(_input, context) {
|
|
27
|
+
context.progress({ message: "Creating Firebase local configuration" });
|
|
28
|
+
await projectRepository.enable();
|
|
29
|
+
return status();
|
|
30
|
+
},
|
|
31
|
+
},
|
|
32
|
+
{
|
|
33
|
+
id: "firebase.login",
|
|
34
|
+
input: emptyInput,
|
|
35
|
+
async handler(_input, context) {
|
|
36
|
+
const result = await firebase.run(["login"], context.log);
|
|
37
|
+
assertFirebaseSuccess("Firebase login", result);
|
|
38
|
+
return status();
|
|
39
|
+
},
|
|
40
|
+
},
|
|
41
|
+
{
|
|
42
|
+
id: "firebase.connect",
|
|
43
|
+
input: projectInput,
|
|
44
|
+
async handler(input, context) {
|
|
45
|
+
context.progress({ message: "Connecting Firebase project", percentage: 30 });
|
|
46
|
+
await projectRepository.connect(input.projectId);
|
|
47
|
+
await envRepository.update({ FIREBASE_PROJECT_ID: input.projectId });
|
|
48
|
+
context.progress({ message: "Firebase project connected", percentage: 100 });
|
|
49
|
+
return status();
|
|
50
|
+
},
|
|
51
|
+
},
|
|
52
|
+
{
|
|
53
|
+
id: "firebase.rules.deploy",
|
|
54
|
+
input: emptyInput,
|
|
55
|
+
async handler(_input, context) {
|
|
56
|
+
const env = await envRepository.read();
|
|
57
|
+
const current = await projectRepository.read();
|
|
58
|
+
const projectId = env.FIREBASE_PROJECT_ID ?? current.projectId;
|
|
59
|
+
if (projectId === undefined) {
|
|
60
|
+
throw new Error("Connect a Firebase project before deploying rules.");
|
|
61
|
+
}
|
|
62
|
+
const result = await firebase.run(["deploy", "--only", "database", "--project", projectId], context.log);
|
|
63
|
+
assertFirebaseSuccess("Firebase RTDB rules deploy", result);
|
|
64
|
+
await envRepository.update({ FIREBASE_PROJECT_ID: projectId });
|
|
65
|
+
return { deployed: true, projectId };
|
|
66
|
+
},
|
|
67
|
+
},
|
|
68
|
+
];
|
|
69
|
+
}
|
|
70
|
+
async function getFirebaseStatus({ config, projectRepository, envRepository, firebase, }) {
|
|
71
|
+
const [project, env, login] = await Promise.all([
|
|
72
|
+
projectRepository.read(),
|
|
73
|
+
envRepository.read(),
|
|
74
|
+
firebase.run(["login:list", "--json"]),
|
|
75
|
+
]);
|
|
76
|
+
const projectId = project.projectId ?? env.FIREBASE_PROJECT_ID;
|
|
77
|
+
if (projectId !== undefined) {
|
|
78
|
+
await envRepository.update({ FIREBASE_PROJECT_ID: projectId });
|
|
79
|
+
}
|
|
80
|
+
return {
|
|
81
|
+
enabled: project.enabled || config.firebase !== undefined,
|
|
82
|
+
configured: projectId !== undefined,
|
|
83
|
+
authenticated: login.exitCode === 0,
|
|
84
|
+
...(projectId === undefined ? {} : { projectId }),
|
|
85
|
+
realtimeDatabaseDesired: config.firebase?.realtimeDatabase !== undefined,
|
|
86
|
+
firebaseJson: project.firebaseJson,
|
|
87
|
+
firebaserc: project.firebaserc,
|
|
88
|
+
};
|
|
89
|
+
}
|
|
90
|
+
function assertFirebaseSuccess(action, result) {
|
|
91
|
+
if (result.exitCode === 0)
|
|
92
|
+
return;
|
|
93
|
+
const diagnostic = result.stderr.trim() || result.stdout.trim();
|
|
94
|
+
throw new Error(diagnostic.length === 0 ? `${action} failed.` : `${action} failed: ${diagnostic}`);
|
|
95
|
+
}
|
|
96
|
+
//# sourceMappingURL=firebaseOperations.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"firebaseOperations.js","sourceRoot":"","sources":["../../src/firebase/firebaseOperations.ts"],"names":[],"mappings":"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"}
|
package/dist/index.d.ts
CHANGED
|
@@ -2,4 +2,7 @@ export { createProjectInspectOperation, type ProjectState, } from "./projectInsp
|
|
|
2
2
|
export { startGasboostConsole } from "./startGasboostConsole.js";
|
|
3
3
|
export { createAppsScriptOperations, type AppsScriptStatus, } from "./appsScript/appsScriptOperations.js";
|
|
4
4
|
export { createClaspRunner, type ClaspResult, type ClaspRunner, } from "./appsScript/ClaspRunner.js";
|
|
5
|
+
export { createDevelopmentOperations, type DevelopmentStatus, } from "./development/developmentOperations.js";
|
|
6
|
+
export { createFirebaseRunner, type FirebaseResult, type FirebaseRunner, } from "./firebase/FirebaseRunner.js";
|
|
7
|
+
export { createFirebaseOperations, type FirebaseStatus, } from "./firebase/firebaseOperations.js";
|
|
5
8
|
//# sourceMappingURL=index.d.ts.map
|
package/dist/index.d.ts.map
CHANGED
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,KAAK,YAAY,GAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACL,0BAA0B,EAC1B,KAAK,gBAAgB,GACtB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,6BAA6B,CAAC"}
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../src/index.ts"],"names":[],"mappings":"AAAA,OAAO,EACL,6BAA6B,EAC7B,KAAK,YAAY,GAClB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EAAE,oBAAoB,EAAE,MAAM,2BAA2B,CAAC;AACjE,OAAO,EACL,0BAA0B,EAC1B,KAAK,gBAAgB,GACtB,MAAM,sCAAsC,CAAC;AAC9C,OAAO,EACL,iBAAiB,EACjB,KAAK,WAAW,EAChB,KAAK,WAAW,GACjB,MAAM,6BAA6B,CAAC;AACrC,OAAO,EACL,2BAA2B,EAC3B,KAAK,iBAAiB,GACvB,MAAM,wCAAwC,CAAC;AAChD,OAAO,EACL,oBAAoB,EACpB,KAAK,cAAc,EACnB,KAAK,cAAc,GACpB,MAAM,8BAA8B,CAAC;AACtC,OAAO,EACL,wBAAwB,EACxB,KAAK,cAAc,GACpB,MAAM,kCAAkC,CAAC"}
|
package/dist/index.js
CHANGED
|
@@ -2,4 +2,7 @@ export { createProjectInspectOperation, } from "./projectInspectOperation.js";
|
|
|
2
2
|
export { startGasboostConsole } from "./startGasboostConsole.js";
|
|
3
3
|
export { createAppsScriptOperations, } from "./appsScript/appsScriptOperations.js";
|
|
4
4
|
export { createClaspRunner, } from "./appsScript/ClaspRunner.js";
|
|
5
|
+
export { createDevelopmentOperations, } from "./development/developmentOperations.js";
|
|
6
|
+
export { createFirebaseRunner, } from "./firebase/FirebaseRunner.js";
|
|
7
|
+
export { createFirebaseOperations, } from "./firebase/firebaseOperations.js";
|
|
5
8
|
//# sourceMappingURL=index.js.map
|