@gasboost/console 0.2.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 (38) hide show
  1. package/dist/appsScript/AppsScriptProjectRepository.d.ts +21 -0
  2. package/dist/appsScript/AppsScriptProjectRepository.d.ts.map +1 -0
  3. package/dist/appsScript/AppsScriptProjectRepository.js +75 -0
  4. package/dist/appsScript/AppsScriptProjectRepository.js.map +1 -0
  5. package/dist/appsScript/appsScriptOperations.d.ts +4 -1
  6. package/dist/appsScript/appsScriptOperations.d.ts.map +1 -1
  7. package/dist/appsScript/appsScriptOperations.js +146 -37
  8. package/dist/appsScript/appsScriptOperations.js.map +1 -1
  9. package/dist/env/EnvFileRepository.d.ts +13 -0
  10. package/dist/env/EnvFileRepository.d.ts.map +1 -0
  11. package/dist/env/EnvFileRepository.js +67 -0
  12. package/dist/env/EnvFileRepository.js.map +1 -0
  13. package/dist/firebase/FirebaseProjectRepository.d.ts +17 -0
  14. package/dist/firebase/FirebaseProjectRepository.d.ts.map +1 -0
  15. package/dist/firebase/FirebaseProjectRepository.js +82 -0
  16. package/dist/firebase/FirebaseProjectRepository.js.map +1 -0
  17. package/dist/firebase/FirebaseRunner.d.ts +10 -0
  18. package/dist/firebase/FirebaseRunner.d.ts.map +1 -0
  19. package/dist/firebase/FirebaseRunner.js +54 -0
  20. package/dist/firebase/FirebaseRunner.js.map +1 -0
  21. package/dist/firebase/firebaseOperations.d.ts +20 -0
  22. package/dist/firebase/firebaseOperations.d.ts.map +1 -0
  23. package/dist/firebase/firebaseOperations.js +96 -0
  24. package/dist/firebase/firebaseOperations.js.map +1 -0
  25. package/dist/index.d.ts +2 -0
  26. package/dist/index.d.ts.map +1 -1
  27. package/dist/index.js +2 -0
  28. package/dist/index.js.map +1 -1
  29. package/dist/startGasboostConsole.d.ts +3 -1
  30. package/dist/startGasboostConsole.d.ts.map +1 -1
  31. package/dist/startGasboostConsole.js +15 -9
  32. package/dist/startGasboostConsole.js.map +1 -1
  33. package/dist/ui/assets/index-ClzuMWwT.css +1 -0
  34. package/dist/ui/assets/index-DSY49jCs.js +6 -0
  35. package/dist/ui/index.html +154 -11
  36. package/package.json +1 -1
  37. package/dist/ui/assets/index-B2QLlRZv.css +0 -1
  38. package/dist/ui/assets/index-Bv7Miq39.js +0 -6
@@ -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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"}
@@ -6,11 +6,14 @@ export type AppsScriptStatus = {
6
6
  readonly configured: boolean;
7
7
  readonly scriptId?: string;
8
8
  readonly rootDir: string;
9
+ readonly manifestExists: boolean;
10
+ readonly desired: boolean;
11
+ readonly deploymentId?: string;
9
12
  };
10
13
  type AppsScriptOperation = OperationDefinition<any, unknown>;
11
14
  export declare function createAppsScriptOperations({ projectRoot, config, clasp, }: {
12
15
  readonly projectRoot: string;
13
- readonly config: GasboostAppsScriptConfig;
16
+ readonly config?: GasboostAppsScriptConfig;
14
17
  readonly clasp: ClaspRunner;
15
18
  }): readonly AppsScriptOperation[];
16
19
  export {};
@@ -1 +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,EAEV,mBAAmB,EACpB,MAAM,2BAA2B,CAAC;AAInC,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;CAC1B,CAAC;AAEF,KAAK,mBAAmB,GAAG,mBAAmB,CAAC,GAAG,EAAE,OAAO,CAAC,CAAC;AAU7D,wBAAgB,0BAA0B,CAAC,EACzC,WAAW,EACX,MAAM,EACN,KAAK,GACN,EAAE;IACD,QAAQ,CAAC,WAAW,EAAE,MAAM,CAAC;IAC7B,QAAQ,CAAC,MAAM,EAAE,wBAAwB,CAAC;IAC1C,QAAQ,CAAC,KAAK,EAAE,WAAW,CAAC;CAC7B,GAAG,SAAS,mBAAmB,EAAE,CA0EjC"}
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"}
@@ -1,15 +1,43 @@
1
- import { readFile } from "node:fs/promises";
2
- import { join } from "node:path";
3
1
  import { z } from "zod";
2
+ import { EnvFileRepository } from "../env/EnvFileRepository.js";
3
+ import { AppsScriptProjectRepository } from "./AppsScriptProjectRepository.js";
4
4
  const emptyInput = z.object({}).strict();
5
5
  const createInput = z
6
6
  .object({
7
7
  title: z.string().trim().min(1).max(100),
8
8
  })
9
9
  .strict();
10
+ const connectInput = z
11
+ .object({
12
+ scriptId: z.string().trim().min(6).max(200),
13
+ })
14
+ .strict();
10
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" };
11
28
  export function createAppsScriptOperations({ projectRoot, config, clasp, }) {
12
- const status = async () => getAppsScriptStatus({ 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
+ });
13
41
  return [
14
42
  {
15
43
  id: "apps.status",
@@ -36,7 +64,7 @@ export function createAppsScriptOperations({ projectRoot, config, clasp, }) {
36
64
  id: "apps.create",
37
65
  input: createInput,
38
66
  async handler(input, context) {
39
- const current = await readProjectSettings(projectRoot, config);
67
+ const current = await projectRepository.read();
40
68
  if (current.configured) {
41
69
  throw new Error("An Apps Script project is already configured.");
42
70
  }
@@ -44,23 +72,35 @@ export function createAppsScriptOperations({ projectRoot, config, clasp, }) {
44
72
  const args = [
45
73
  "create-script",
46
74
  "--type",
47
- config.type,
75
+ effectiveConfig.type,
48
76
  "--title",
49
77
  input.title,
50
78
  "--rootDir",
51
- config.rootDir ?? ".",
79
+ effectiveConfig.rootDir ?? ".",
52
80
  ];
53
81
  const result = await clasp.run(args, context.log);
54
82
  assertClaspSuccess("Apps Script project creation", result);
83
+ await syncScriptId(projectRepository, envRepository);
55
84
  context.progress({ message: "Apps Script project created", percentage: 100 });
56
85
  return status();
57
86
  },
58
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
+ },
59
99
  {
60
100
  id: "apps.open",
61
101
  input: emptyInput,
62
102
  async handler(_input, context) {
63
- await assertProjectConfigured(projectRoot, config);
103
+ await assertProjectConfigured(projectRepository);
64
104
  const result = await clasp.run(["open-script"], context.log);
65
105
  assertClaspSuccess("Opening Apps Script editor", result);
66
106
  return { opened: true };
@@ -70,7 +110,7 @@ export function createAppsScriptOperations({ projectRoot, config, clasp, }) {
70
110
  id: "apps.push",
71
111
  input: pushInput,
72
112
  async handler(_input, context) {
73
- await assertProjectConfigured(projectRoot, config);
113
+ await assertProjectConfigured(projectRepository);
74
114
  context.progress({ message: "Pushing local files", percentage: 20 });
75
115
  const result = await clasp.run(["push", "--force"], context.log);
76
116
  assertClaspSuccess("Apps Script push", result);
@@ -78,49 +118,83 @@ export function createAppsScriptOperations({ projectRoot, config, clasp, }) {
78
118
  return { pushed: true };
79
119
  },
80
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
+ },
81
169
  ];
82
170
  }
83
- async function getAppsScriptStatus({ projectRoot, config, clasp, }) {
171
+ async function getAppsScriptStatus({ configDesired, projectRepository, envRepository, clasp, }) {
84
172
  const [project, authorization] = await Promise.all([
85
- readProjectSettings(projectRoot, config),
173
+ projectRepository.read(),
86
174
  clasp.run(["show-authorized-user", "--json"]),
87
175
  ]);
176
+ if (project.scriptId !== undefined) {
177
+ await envRepository.update({ GAS_SCRIPT_ID: project.scriptId });
178
+ }
179
+ const runtime = await envRepository.read();
88
180
  return {
89
181
  authenticated: authorization.exitCode === 0,
90
182
  configured: project.configured,
91
183
  ...(project.scriptId === undefined ? {} : { scriptId: project.scriptId }),
92
184
  rootDir: project.rootDir,
185
+ manifestExists: project.manifestExists,
186
+ desired: configDesired,
187
+ ...(runtime.DEPLOYMENT_ID === undefined
188
+ ? {}
189
+ : { deploymentId: runtime.DEPLOYMENT_ID }),
93
190
  };
94
191
  }
95
- async function readProjectSettings(projectRoot, config) {
96
- const fallback = { configured: false, rootDir: config.rootDir ?? "." };
97
- try {
98
- const value = JSON.parse(await readFile(join(projectRoot, ".clasp.json"), "utf8"));
99
- if (typeof value.scriptId !== "string" || value.scriptId.length === 0) {
100
- return fallback;
101
- }
102
- return {
103
- configured: true,
104
- scriptId: value.scriptId,
105
- rootDir: typeof value.rootDir === "string"
106
- ? value.rootDir
107
- : (config.rootDir ?? "."),
108
- };
109
- }
110
- catch (error) {
111
- if (typeof error === "object" &&
112
- error !== null &&
113
- "code" in error &&
114
- error.code === "ENOENT") {
115
- return fallback;
116
- }
117
- throw new Error(".clasp.json exists but does not contain valid project settings.", { cause: error });
118
- }
119
- }
120
- async function assertProjectConfigured(projectRoot, config) {
121
- if (!(await readProjectSettings(projectRoot, config)).configured) {
192
+ async function assertProjectConfigured(projectRepository) {
193
+ const project = await projectRepository.read();
194
+ if (!project.configured || project.scriptId === undefined) {
122
195
  throw new Error("Create or connect an Apps Script project first.");
123
196
  }
197
+ return { scriptId: project.scriptId };
124
198
  }
125
199
  function assertClaspSuccess(action, result) {
126
200
  if (result.exitCode === 0)
@@ -128,4 +202,39 @@ function assertClaspSuccess(action, result) {
128
202
  const diagnostic = result.stderr.trim() || result.stdout.trim();
129
203
  throw new Error(diagnostic.length === 0 ? `${action} failed.` : `${action} failed: ${diagnostic}`);
130
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
+ }
131
240
  //# sourceMappingURL=appsScriptOperations.js.map
@@ -1 +1 @@
1
- {"version":3,"file":"appsScriptOperations.js","sourceRoot":"","sources":["../../src/appsScript/appsScriptOperations.ts"],"names":[],"mappings":"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"}
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"}
@@ -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":"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"}
@@ -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