@gasboost/console 0.1.0 → 0.3.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.
Files changed (43) hide show
  1. package/README.md +4 -0
  2. package/dist/appsScript/AppsScriptProjectRepository.d.ts +21 -0
  3. package/dist/appsScript/AppsScriptProjectRepository.d.ts.map +1 -0
  4. package/dist/appsScript/AppsScriptProjectRepository.js +75 -0
  5. package/dist/appsScript/AppsScriptProjectRepository.js.map +1 -0
  6. package/dist/appsScript/ClaspRunner.d.ts +10 -0
  7. package/dist/appsScript/ClaspRunner.d.ts.map +1 -0
  8. package/dist/appsScript/ClaspRunner.js +56 -0
  9. package/dist/appsScript/ClaspRunner.js.map +1 -0
  10. package/dist/appsScript/appsScriptOperations.d.ts +20 -0
  11. package/dist/appsScript/appsScriptOperations.d.ts.map +1 -0
  12. package/dist/appsScript/appsScriptOperations.js +240 -0
  13. package/dist/appsScript/appsScriptOperations.js.map +1 -0
  14. package/dist/env/EnvFileRepository.d.ts +13 -0
  15. package/dist/env/EnvFileRepository.d.ts.map +1 -0
  16. package/dist/env/EnvFileRepository.js +67 -0
  17. package/dist/env/EnvFileRepository.js.map +1 -0
  18. package/dist/firebase/FirebaseProjectRepository.d.ts +17 -0
  19. package/dist/firebase/FirebaseProjectRepository.d.ts.map +1 -0
  20. package/dist/firebase/FirebaseProjectRepository.js +82 -0
  21. package/dist/firebase/FirebaseProjectRepository.js.map +1 -0
  22. package/dist/firebase/FirebaseRunner.d.ts +10 -0
  23. package/dist/firebase/FirebaseRunner.d.ts.map +1 -0
  24. package/dist/firebase/FirebaseRunner.js +54 -0
  25. package/dist/firebase/FirebaseRunner.js.map +1 -0
  26. package/dist/firebase/firebaseOperations.d.ts +20 -0
  27. package/dist/firebase/firebaseOperations.d.ts.map +1 -0
  28. package/dist/firebase/firebaseOperations.js +96 -0
  29. package/dist/firebase/firebaseOperations.js.map +1 -0
  30. package/dist/index.d.ts +4 -0
  31. package/dist/index.d.ts.map +1 -1
  32. package/dist/index.js +4 -0
  33. package/dist/index.js.map +1 -1
  34. package/dist/startGasboostConsole.d.ts +5 -1
  35. package/dist/startGasboostConsole.d.ts.map +1 -1
  36. package/dist/startGasboostConsole.js +22 -2
  37. package/dist/startGasboostConsole.js.map +1 -1
  38. package/dist/ui/assets/index-ClzuMWwT.css +1 -0
  39. package/dist/ui/assets/index-DSY49jCs.js +6 -0
  40. package/dist/ui/index.html +203 -11
  41. package/package.json +3 -2
  42. package/dist/ui/assets/index-BSvEhLfS.css +0 -1
  43. package/dist/ui/assets/index-OcWauX8w.js +0 -6
package/README.md CHANGED
@@ -7,3 +7,7 @@ gasboost console open
7
7
  ```
8
8
 
9
9
  The UI is prebuilt and bundled with this package. Projects do not need a Vite configuration for the Console.
10
+
11
+ When `appsScript` is configured, the Console provides authorization status,
12
+ project creation, editor opening, and confirmed file pushes through registered
13
+ operations backed by `@google/clasp`.
@@ -0,0 +1,21 @@
1
+ import type { GasboostAppsScriptConfig } from "@gasboost/config";
2
+ export type AppsScriptProjectState = {
3
+ readonly configured: boolean;
4
+ readonly scriptId?: string;
5
+ readonly rootDir: string;
6
+ readonly manifestExists: boolean;
7
+ };
8
+ export declare class AppsScriptProjectRepository {
9
+ private readonly projectRoot;
10
+ private readonly config;
11
+ constructor({ projectRoot, config, }: {
12
+ readonly projectRoot: string;
13
+ readonly config: GasboostAppsScriptConfig;
14
+ });
15
+ read(): Promise<AppsScriptProjectState>;
16
+ connect(scriptId: string): Promise<void>;
17
+ private readClaspSettings;
18
+ private readClaspObject;
19
+ private exists;
20
+ }
21
+ //# sourceMappingURL=AppsScriptProjectRepository.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppsScriptProjectRepository.d.ts","sourceRoot":"","sources":["../../src/appsScript/AppsScriptProjectRepository.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AAIjE,MAAM,MAAM,sBAAsB,GAAG;IACnC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;CAClC,CAAC;AAEF,qBAAa,2BAA2B;IACtC,OAAO,CAAC,QAAQ,CAAC,WAAW,CAAS;IACrC,OAAO,CAAC,QAAQ,CAAC,MAAM,CAA2B;IAElD,YAAmB,EACjB,WAAW,EACX,MAAM,GACP,EAAE;QACD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;QAC7B,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;KAC3C,EAGA;IAEY,IAAI,IAAI,OAAO,CAAC,sBAAsB,CAAC,CAOnD;IAEY,OAAO,CAAC,QAAQ,EAAE,MAAM,GAAG,OAAO,CAAC,IAAI,CAAC,CAWpD;YAEa,iBAAiB;YA2BjB,eAAe;YA0Bf,MAAM;CAgBrB"}
@@ -0,0 +1,75 @@
1
+ import { readFile, writeFile } from "node:fs/promises";
2
+ import { join } from "node:path";
3
+ export class AppsScriptProjectRepository {
4
+ projectRoot;
5
+ config;
6
+ constructor({ projectRoot, config, }) {
7
+ this.projectRoot = projectRoot;
8
+ this.config = config;
9
+ }
10
+ async read() {
11
+ const settings = await this.readClaspSettings();
12
+ const manifestExists = await this.exists(join(this.projectRoot, settings.rootDir, "appsscript.json"));
13
+ return { ...settings, manifestExists };
14
+ }
15
+ async connect(scriptId) {
16
+ const current = (await this.readClaspObject()) ?? {};
17
+ const rootDir = typeof current.rootDir === "string"
18
+ ? current.rootDir
19
+ : (this.config.rootDir ?? ".");
20
+ await writeFile(join(this.projectRoot, ".clasp.json"), `${JSON.stringify({ ...current, scriptId, rootDir }, null, 2)}\n`, "utf8");
21
+ }
22
+ async readClaspSettings() {
23
+ const fallback = {
24
+ configured: false,
25
+ rootDir: this.config.rootDir ?? ".",
26
+ };
27
+ const value = await this.readClaspObject();
28
+ if (value === undefined)
29
+ return fallback;
30
+ if (typeof value.scriptId !== "string" || value.scriptId.length === 0) {
31
+ return fallback;
32
+ }
33
+ return {
34
+ configured: true,
35
+ scriptId: value.scriptId,
36
+ rootDir: typeof value.rootDir === "string"
37
+ ? value.rootDir
38
+ : (this.config.rootDir ?? "."),
39
+ };
40
+ }
41
+ async readClaspObject() {
42
+ try {
43
+ const value = JSON.parse(await readFile(join(this.projectRoot, ".clasp.json"), "utf8"));
44
+ if (typeof value !== "object" || value === null || Array.isArray(value)) {
45
+ throw new Error("Expected a JSON object.");
46
+ }
47
+ return value;
48
+ }
49
+ catch (error) {
50
+ if (typeof error === "object" &&
51
+ error !== null &&
52
+ "code" in error &&
53
+ error.code === "ENOENT") {
54
+ return undefined;
55
+ }
56
+ throw new Error(".clasp.json exists but does not contain valid project settings.", { cause: error });
57
+ }
58
+ }
59
+ async exists(path) {
60
+ try {
61
+ await readFile(path, "utf8");
62
+ return true;
63
+ }
64
+ catch (error) {
65
+ if (typeof error === "object" &&
66
+ error !== null &&
67
+ "code" in error &&
68
+ error.code === "ENOENT") {
69
+ return false;
70
+ }
71
+ throw error;
72
+ }
73
+ }
74
+ }
75
+ //# sourceMappingURL=AppsScriptProjectRepository.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"AppsScriptProjectRepository.js","sourceRoot":"","sources":["../../src/appsScript/AppsScriptProjectRepository.ts"],"names":[],"mappings":"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"}
@@ -0,0 +1,10 @@
1
+ export type ClaspResult = {
2
+ readonly exitCode: number;
3
+ readonly stdout: string;
4
+ readonly stderr: string;
5
+ };
6
+ export type ClaspRunner = {
7
+ readonly run: (args: readonly string[], onOutput?: (line: string) => void) => Promise<ClaspResult>;
8
+ };
9
+ export declare function createClaspRunner(projectRoot: string): ClaspRunner;
10
+ //# sourceMappingURL=ClaspRunner.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaspRunner.d.ts","sourceRoot":"","sources":["../../src/appsScript/ClaspRunner.ts"],"names":[],"mappings":"AAGA,MAAM,MAAM,WAAW,GAAG;IACxB,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,WAAW,GAAG;IACxB,QAAQ,CAAC,GAAG,EAAE,CACZ,IAAI,EAAE,SAAS,MAAM,EAAE,EACvB,QAAQ,CAAC,EAAE,CAAC,IAAI,EAAE,MAAM,KAAK,IAAI,KAC9B,OAAO,CAAC,WAAW,CAAC,CAAC;CAC3B,CAAC;AAEF,wBAAgB,iBAAiB,CAAC,WAAW,EAAE,MAAM,GAAG,WAAW,CAkClE"}
@@ -0,0 +1,56 @@
1
+ import { spawn } from "node:child_process";
2
+ import { fileURLToPath } from "node:url";
3
+ export function createClaspRunner(projectRoot) {
4
+ const claspEntry = fileURLToPath(import.meta.resolve("@google/clasp"));
5
+ return {
6
+ run: (args, onOutput) => new Promise((resolve, reject) => {
7
+ const child = spawn(process.execPath, [claspEntry, ...args], {
8
+ cwd: projectRoot,
9
+ env: { ...process.env, NO_COLOR: "1" },
10
+ stdio: ["ignore", "pipe", "pipe"],
11
+ });
12
+ let stdout = "";
13
+ let stderr = "";
14
+ const stdoutLines = createLineEmitter(onOutput);
15
+ const stderrLines = createLineEmitter(onOutput);
16
+ child.stdout.setEncoding("utf8");
17
+ child.stderr.setEncoding("utf8");
18
+ child.stdout.on("data", (chunk) => {
19
+ stdout += chunk;
20
+ stdoutLines.write(chunk);
21
+ });
22
+ child.stderr.on("data", (chunk) => {
23
+ stderr += chunk;
24
+ stderrLines.write(chunk);
25
+ });
26
+ child.once("error", reject);
27
+ child.once("close", (exitCode) => {
28
+ stdoutLines.flush();
29
+ stderrLines.flush();
30
+ resolve({ exitCode: exitCode ?? 1, stdout, stderr });
31
+ });
32
+ }),
33
+ };
34
+ }
35
+ function createLineEmitter(onOutput) {
36
+ let buffer = "";
37
+ const emit = (line) => {
38
+ const message = line.trim();
39
+ if (message.length > 0)
40
+ onOutput?.(message);
41
+ };
42
+ return {
43
+ write(chunk) {
44
+ buffer += chunk;
45
+ const lines = buffer.split(/\r?\n/);
46
+ buffer = lines.pop() ?? "";
47
+ for (const line of lines)
48
+ emit(line);
49
+ },
50
+ flush() {
51
+ emit(buffer);
52
+ buffer = "";
53
+ },
54
+ };
55
+ }
56
+ //# sourceMappingURL=ClaspRunner.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"ClaspRunner.js","sourceRoot":"","sources":["../../src/appsScript/ClaspRunner.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,KAAK,EAAE,MAAM,oBAAoB,CAAC;AAC3C,OAAO,EAAE,aAAa,EAAE,MAAM,UAAU,CAAC;AAezC,MAAM,UAAU,iBAAiB,CAAC,WAAmB;IACnD,MAAM,UAAU,GAAG,aAAa,CAAC,OAAO,IAAI,CAAC,OAAO,CAAC,eAAe,CAAC,CAAC,CAAC;IAEvE,OAAO;QACL,GAAG,EAAE,CAAC,IAAI,EAAE,QAAQ,EAAE,EAAE,CACtB,IAAI,OAAO,CAAc,CAAC,OAAO,EAAE,MAAM,EAAE,EAAE;YAC3C,MAAM,KAAK,GAAG,KAAK,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC,UAAU,EAAE,GAAG,IAAI,CAAC,EAAE;gBAC3D,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 { GasboostAppsScriptConfig } from "@gasboost/config";
2
+ import type { OperationDefinition } from "@gasboost/console-runtime";
3
+ import type { ClaspRunner } from "./ClaspRunner.js";
4
+ export type AppsScriptStatus = {
5
+ readonly authenticated: boolean;
6
+ readonly configured: boolean;
7
+ readonly scriptId?: string;
8
+ readonly rootDir: string;
9
+ readonly manifestExists: boolean;
10
+ readonly desired: boolean;
11
+ readonly deploymentId?: string;
12
+ };
13
+ type AppsScriptOperation = OperationDefinition<any, unknown>;
14
+ export declare function createAppsScriptOperations({ projectRoot, config, clasp, }: {
15
+ readonly projectRoot: string;
16
+ readonly config?: GasboostAppsScriptConfig;
17
+ readonly clasp: ClaspRunner;
18
+ }): readonly AppsScriptOperation[];
19
+ export {};
20
+ //# sourceMappingURL=appsScriptOperations.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appsScriptOperations.d.ts","sourceRoot":"","sources":["../../src/appsScript/appsScriptOperations.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,wBAAwB,EAAE,MAAM,kBAAkB,CAAC;AACjE,OAAO,KAAK,EAAE,mBAAmB,EAAE,MAAM,2BAA2B,CAAC;AAIrE,OAAO,KAAK,EAAe,WAAW,EAAE,MAAM,kBAAkB,CAAC;AAEjE,MAAM,MAAM,gBAAgB,GAAG;IAC7B,QAAQ,CAAC,aAAa,EAAE,OAAO,CAAC;IAChC,QAAQ,CAAC,UAAU,EAAE,OAAO,CAAC;IAC7B,QAAQ,CAAC,QAAQ,CAAC,EAAE,MAAM,CAAC;IAC3B,QAAQ,CAAC,OAAO,EAAE,MAAM,CAAC;IACzB,QAAQ,CAAC,cAAc,EAAE,OAAO,CAAC;IACjC,QAAQ,CAAC,OAAO,EAAE,OAAO,CAAC;IAC1B,QAAQ,CAAC,YAAY,CAAC,EAAE,MAAM,CAAC;CAChC,CAAC;AAEF,KAAK,mBAAmB,GAAG,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AA2B7D,wBAAgB,0BAA0B,CAAC,EACzC,WAAW,EACX,MAAM,EACN,KAAK,GACN,EAAE;IACD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,CAAC,EAAE,wBAAwB,CAAC;IAC3C,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B,GAAG,SAAS,mBAAmB,EAAE,CAiJjC"}
@@ -0,0 +1,240 @@
1
+ import { z } from "zod";
2
+ import { EnvFileRepository } from "../env/EnvFileRepository.js";
3
+ import { AppsScriptProjectRepository } from "./AppsScriptProjectRepository.js";
4
+ const emptyInput = z.object({}).strict();
5
+ const createInput = z
6
+ .object({
7
+ title: z.string().trim().min(1).max(100),
8
+ })
9
+ .strict();
10
+ const connectInput = z
11
+ .object({
12
+ scriptId: z.string().trim().min(6).max(200),
13
+ })
14
+ .strict();
15
+ const pushInput = z.object({ confirmed: z.literal(true) }).strict();
16
+ const createDeploymentInput = z
17
+ .object({
18
+ description: z.string().trim().max(120).optional(),
19
+ })
20
+ .strict();
21
+ const updateDeploymentInput = z
22
+ .object({
23
+ deploymentId: z.string().trim().min(1).max(200).optional(),
24
+ description: z.string().trim().max(120).optional(),
25
+ })
26
+ .strict();
27
+ const defaultAppsScriptConfig = { type: "webapp" };
28
+ export function createAppsScriptOperations({ projectRoot, config, clasp, }) {
29
+ const effectiveConfig = config ?? defaultAppsScriptConfig;
30
+ const projectRepository = new AppsScriptProjectRepository({
31
+ projectRoot,
32
+ config: effectiveConfig,
33
+ });
34
+ const envRepository = new EnvFileRepository(projectRoot);
35
+ const status = async () => getAppsScriptStatus({
36
+ configDesired: config !== undefined,
37
+ projectRepository,
38
+ envRepository,
39
+ clasp,
40
+ });
41
+ return [
42
+ {
43
+ id: "apps.status",
44
+ input: emptyInput,
45
+ async handler(_input, context) {
46
+ context.progress({ message: "Checking Apps Script", percentage: 25 });
47
+ const result = await status();
48
+ context.progress({ message: "Apps Script ready", percentage: 100 });
49
+ return result;
50
+ },
51
+ },
52
+ {
53
+ id: "apps.login",
54
+ input: emptyInput,
55
+ async handler(_input, context) {
56
+ context.progress({ message: "Starting Google authorization" });
57
+ const result = await clasp.run(["login"], context.log);
58
+ assertClaspSuccess("Apps Script authorization", result);
59
+ context.progress({ message: "Authorization complete", percentage: 100 });
60
+ return status();
61
+ },
62
+ },
63
+ {
64
+ id: "apps.create",
65
+ input: createInput,
66
+ async handler(input, context) {
67
+ const current = await projectRepository.read();
68
+ if (current.configured) {
69
+ throw new Error("An Apps Script project is already configured.");
70
+ }
71
+ context.progress({ message: "Creating Apps Script project", percentage: 20 });
72
+ const args = [
73
+ "create-script",
74
+ "--type",
75
+ effectiveConfig.type,
76
+ "--title",
77
+ input.title,
78
+ "--rootDir",
79
+ effectiveConfig.rootDir ?? ".",
80
+ ];
81
+ const result = await clasp.run(args, context.log);
82
+ assertClaspSuccess("Apps Script project creation", result);
83
+ await syncScriptId(projectRepository, envRepository);
84
+ context.progress({ message: "Apps Script project created", percentage: 100 });
85
+ return status();
86
+ },
87
+ },
88
+ {
89
+ id: "apps.connect",
90
+ input: connectInput,
91
+ async handler(input, context) {
92
+ context.progress({ message: "Connecting Apps Script project", percentage: 30 });
93
+ await projectRepository.connect(input.scriptId);
94
+ await envRepository.update({ GAS_SCRIPT_ID: input.scriptId });
95
+ context.progress({ message: "Apps Script project connected", percentage: 100 });
96
+ return status();
97
+ },
98
+ },
99
+ {
100
+ id: "apps.open",
101
+ input: emptyInput,
102
+ async handler(_input, context) {
103
+ await assertProjectConfigured(projectRepository);
104
+ const result = await clasp.run(["open-script"], context.log);
105
+ assertClaspSuccess("Opening Apps Script editor", result);
106
+ return { opened: true };
107
+ },
108
+ },
109
+ {
110
+ id: "apps.push",
111
+ input: pushInput,
112
+ async handler(_input, context) {
113
+ await assertProjectConfigured(projectRepository);
114
+ context.progress({ message: "Pushing local files", percentage: 20 });
115
+ const result = await clasp.run(["push", "--force"], context.log);
116
+ assertClaspSuccess("Apps Script push", result);
117
+ context.progress({ message: "Push complete", percentage: 100 });
118
+ return { pushed: true };
119
+ },
120
+ },
121
+ {
122
+ id: "apps.deployments",
123
+ input: emptyInput,
124
+ async handler(_input, context) {
125
+ await assertProjectConfigured(projectRepository);
126
+ const result = await clasp.run(["deployments", "--json"], context.log);
127
+ assertClaspSuccess("Loading deployments", result);
128
+ return parseDeployments(result.stdout);
129
+ },
130
+ },
131
+ {
132
+ id: "apps.deployment.create",
133
+ input: createDeploymentInput,
134
+ async handler(input, context) {
135
+ await assertProjectConfigured(projectRepository);
136
+ const args = ["create-deployment"];
137
+ if (input.description !== undefined && input.description.length > 0) {
138
+ args.push("--description", input.description);
139
+ }
140
+ const result = await clasp.run(args, context.log);
141
+ assertClaspSuccess("Creating deployment", result);
142
+ const deploymentId = extractDeploymentId(result.stdout);
143
+ if (deploymentId !== undefined) {
144
+ await envRepository.update({ DEPLOYMENT_ID: deploymentId });
145
+ }
146
+ return { deploymentId };
147
+ },
148
+ },
149
+ {
150
+ id: "apps.deployment.update",
151
+ input: updateDeploymentInput,
152
+ async handler(input, context) {
153
+ await assertProjectConfigured(projectRepository);
154
+ const env = await envRepository.read();
155
+ const deploymentId = input.deploymentId ?? env.DEPLOYMENT_ID;
156
+ if (deploymentId === undefined || deploymentId.length === 0) {
157
+ throw new Error("Select or create a deployment first.");
158
+ }
159
+ const args = ["update-deployment", "--deploymentId", deploymentId];
160
+ if (input.description !== undefined && input.description.length > 0) {
161
+ args.push("--description", input.description);
162
+ }
163
+ const result = await clasp.run(args, context.log);
164
+ assertClaspSuccess("Updating deployment", result);
165
+ await envRepository.update({ DEPLOYMENT_ID: deploymentId });
166
+ return { deploymentId };
167
+ },
168
+ },
169
+ ];
170
+ }
171
+ async function getAppsScriptStatus({ configDesired, projectRepository, envRepository, clasp, }) {
172
+ const [project, authorization] = await Promise.all([
173
+ projectRepository.read(),
174
+ clasp.run(["show-authorized-user", "--json"]),
175
+ ]);
176
+ if (project.scriptId !== undefined) {
177
+ await envRepository.update({ GAS_SCRIPT_ID: project.scriptId });
178
+ }
179
+ const runtime = await envRepository.read();
180
+ return {
181
+ authenticated: authorization.exitCode === 0,
182
+ configured: project.configured,
183
+ ...(project.scriptId === undefined ? {} : { scriptId: project.scriptId }),
184
+ rootDir: project.rootDir,
185
+ manifestExists: project.manifestExists,
186
+ desired: configDesired,
187
+ ...(runtime.DEPLOYMENT_ID === undefined
188
+ ? {}
189
+ : { deploymentId: runtime.DEPLOYMENT_ID }),
190
+ };
191
+ }
192
+ async function assertProjectConfigured(projectRepository) {
193
+ const project = await projectRepository.read();
194
+ if (!project.configured || project.scriptId === undefined) {
195
+ throw new Error("Create or connect an Apps Script project first.");
196
+ }
197
+ return { scriptId: project.scriptId };
198
+ }
199
+ function assertClaspSuccess(action, result) {
200
+ if (result.exitCode === 0)
201
+ return;
202
+ const diagnostic = result.stderr.trim() || result.stdout.trim();
203
+ throw new Error(diagnostic.length === 0 ? `${action} failed.` : `${action} failed: ${diagnostic}`);
204
+ }
205
+ async function syncScriptId(projectRepository, envRepository) {
206
+ const project = await projectRepository.read();
207
+ if (project.scriptId !== undefined) {
208
+ await envRepository.update({ GAS_SCRIPT_ID: project.scriptId });
209
+ }
210
+ }
211
+ function parseDeployments(stdout) {
212
+ try {
213
+ const value = JSON.parse(stdout);
214
+ if (!Array.isArray(value))
215
+ return { deployments: [] };
216
+ return {
217
+ deployments: value.flatMap((item) => {
218
+ if (typeof item !== "object" || item === null)
219
+ return [];
220
+ const deploymentId = "deploymentId" in item ? item.deploymentId : undefined;
221
+ const description = "description" in item ? item.description : undefined;
222
+ if (typeof deploymentId !== "string")
223
+ return [];
224
+ return [
225
+ {
226
+ deploymentId,
227
+ ...(typeof description === "string" ? { description } : {}),
228
+ },
229
+ ];
230
+ }),
231
+ };
232
+ }
233
+ catch {
234
+ return { deployments: [] };
235
+ }
236
+ }
237
+ function extractDeploymentId(stdout) {
238
+ return /(?:Deployment ID|deploymentId)[:\s]+([A-Za-z0-9_-]+)/.exec(stdout)?.[1];
239
+ }
240
+ //# sourceMappingURL=appsScriptOperations.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"appsScriptOperations.js","sourceRoot":"","sources":["../../src/appsScript/appsScriptOperations.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"}