@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.
- package/README.md +4 -0
- 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/ClaspRunner.d.ts +10 -0
- package/dist/appsScript/ClaspRunner.d.ts.map +1 -0
- package/dist/appsScript/ClaspRunner.js +56 -0
- package/dist/appsScript/ClaspRunner.js.map +1 -0
- package/dist/appsScript/appsScriptOperations.d.ts +20 -0
- package/dist/appsScript/appsScriptOperations.d.ts.map +1 -0
- package/dist/appsScript/appsScriptOperations.js +240 -0
- package/dist/appsScript/appsScriptOperations.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 +4 -0
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +4 -0
- package/dist/index.js.map +1 -1
- package/dist/startGasboostConsole.d.ts +5 -1
- package/dist/startGasboostConsole.d.ts.map +1 -1
- package/dist/startGasboostConsole.js +22 -2
- package/dist/startGasboostConsole.js.map +1 -1
- package/dist/ui/assets/index-ClzuMWwT.css +1 -0
- package/dist/ui/assets/index-DSY49jCs.js +6 -0
- package/dist/ui/index.html +203 -11
- package/package.json +3 -2
- package/dist/ui/assets/index-BSvEhLfS.css +0 -1
- package/dist/ui/assets/index-OcWauX8w.js +0 -6
package/dist/ui/index.html
CHANGED
|
@@ -5,8 +5,8 @@
|
|
|
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-
|
|
9
|
-
<link rel="stylesheet" crossorigin href="/assets/index-
|
|
8
|
+
<script type="module" crossorigin src="/assets/index-DSY49jCs.js"></script>
|
|
9
|
+
<link rel="stylesheet" crossorigin href="/assets/index-ClzuMWwT.css">
|
|
10
10
|
</head>
|
|
11
11
|
<body>
|
|
12
12
|
<header class="topbar">
|
|
@@ -23,7 +23,7 @@
|
|
|
23
23
|
<main>
|
|
24
24
|
<section class="status-band" aria-labelledby="project-title">
|
|
25
25
|
<div>
|
|
26
|
-
<div class="eyebrow">PROJECT</div>
|
|
26
|
+
<div class="eyebrow">PROJECT LIFECYCLE</div>
|
|
27
27
|
<h1 id="project-title">Loading...</h1>
|
|
28
28
|
</div>
|
|
29
29
|
<div class="runtime-status" id="runtime-status"><span></span> Connecting</div>
|
|
@@ -31,14 +31,14 @@
|
|
|
31
31
|
|
|
32
32
|
<section class="workspace" aria-label="Project lifecycle">
|
|
33
33
|
<nav class="sidebar" aria-label="Console sections">
|
|
34
|
-
<button class="nav-item active" type="button"><i data-lucide="layout-dashboard"></i>Overview</button>
|
|
35
|
-
<button class="nav-item" type="button"
|
|
36
|
-
<button class="nav-item" type="button"
|
|
37
|
-
<button class="nav-item" type="button"
|
|
38
|
-
<button class="nav-item" type="button"
|
|
34
|
+
<button class="nav-item active" id="overview-nav" type="button"><i data-lucide="layout-dashboard"></i>Overview</button>
|
|
35
|
+
<button class="nav-item" id="development-nav" type="button"><i data-lucide="code-2"></i>Development</button>
|
|
36
|
+
<button class="nav-item" id="apps-script-nav" type="button"><i data-lucide="file-code-2"></i>Apps Script</button>
|
|
37
|
+
<button class="nav-item" id="deployment-nav" type="button"><i data-lucide="rocket"></i>Deployment</button>
|
|
38
|
+
<button class="nav-item" id="firebase-nav" type="button"><i data-lucide="database"></i>Firebase</button>
|
|
39
39
|
</nav>
|
|
40
40
|
|
|
41
|
-
<div class="content">
|
|
41
|
+
<div class="content" id="overview-view">
|
|
42
42
|
<div class="section-heading">
|
|
43
43
|
<div>
|
|
44
44
|
<div class="eyebrow">OVERVIEW</div>
|
|
@@ -49,12 +49,12 @@
|
|
|
49
49
|
<div class="capability-list">
|
|
50
50
|
<article class="capability-row">
|
|
51
51
|
<div class="capability-icon apps"><i data-lucide="file-code-2"></i></div>
|
|
52
|
-
<div><h3>Apps Script</h3><p>
|
|
52
|
+
<div><h3>Apps Script</h3><p>Desired capability from gasboost.config.ts. Lifecycle controls stay available either way.</p></div>
|
|
53
53
|
<div class="badge" id="apps-script-status">Checking</div>
|
|
54
54
|
</article>
|
|
55
55
|
<article class="capability-row">
|
|
56
56
|
<div class="capability-icon firebase"><i data-lucide="database"></i></div>
|
|
57
|
-
<div><h3>Firebase Realtime Database</h3><p>Rules generation and deployment
|
|
57
|
+
<div><h3>Firebase Realtime Database</h3><p>Rules generation and deployment capability.</p></div>
|
|
58
58
|
<div class="badge" id="firebase-status">Checking</div>
|
|
59
59
|
</article>
|
|
60
60
|
</div>
|
|
@@ -64,7 +64,199 @@
|
|
|
64
64
|
<div class="log" id="log" role="log" aria-live="polite"></div>
|
|
65
65
|
</section>
|
|
66
66
|
</div>
|
|
67
|
+
|
|
68
|
+
<div class="content" id="development-view" hidden>
|
|
69
|
+
<div class="section-heading">
|
|
70
|
+
<div><div class="eyebrow">DEVELOPMENT</div><h2>Local application</h2></div>
|
|
71
|
+
</div>
|
|
72
|
+
<div class="info-box"><span class="info-box__icon">i</span><div>Dev server operations are intentionally separated from arbitrary package script execution. Start/stop wiring can be added as registered operations without opening a shell launcher.</div></div>
|
|
73
|
+
<div class="action-bar">
|
|
74
|
+
<button class="command-button" type="button" disabled><i data-lucide="play"></i>Start</button>
|
|
75
|
+
<button class="command-button" type="button" disabled><i data-lucide="square"></i>Stop</button>
|
|
76
|
+
<button class="command-button" type="button" disabled><i data-lucide="refresh-cw"></i>Restart</button>
|
|
77
|
+
<button class="command-button" type="button" disabled><i data-lucide="external-link"></i>Open local app</button>
|
|
78
|
+
</div>
|
|
79
|
+
<section class="activity" aria-labelledby="development-activity-title">
|
|
80
|
+
<div class="activity-heading"><h2 id="development-activity-title">Activity</h2><button id="development-clear-log" class="text-button" type="button">Clear</button></div>
|
|
81
|
+
<div class="log" id="development-log" role="log" aria-live="polite"></div>
|
|
82
|
+
</section>
|
|
83
|
+
</div>
|
|
84
|
+
|
|
85
|
+
<div class="content" id="apps-script-view" hidden>
|
|
86
|
+
<div class="section-heading">
|
|
87
|
+
<div><div class="eyebrow">APPS SCRIPT</div><h2>Project lifecycle</h2></div>
|
|
88
|
+
<button class="icon-button light" id="apps-refresh" type="button" title="Refresh Apps Script status" aria-label="Refresh Apps Script status"><i data-lucide="refresh-cw"></i></button>
|
|
89
|
+
</div>
|
|
90
|
+
|
|
91
|
+
<div class="status-list">
|
|
92
|
+
<div class="status-row">
|
|
93
|
+
<div class="capability-icon account"><i data-lucide="user-round"></i></div>
|
|
94
|
+
<div><h3>Google account</h3><p id="apps-account-detail">Checking authorization</p></div>
|
|
95
|
+
<div class="badge" id="apps-auth-status">Checking</div>
|
|
96
|
+
</div>
|
|
97
|
+
<div class="status-row">
|
|
98
|
+
<div class="capability-icon apps"><i data-lucide="file-code-2"></i></div>
|
|
99
|
+
<div><h3>Script project</h3><p class="mono-detail" id="apps-project-detail">Checking project</p></div>
|
|
100
|
+
<div class="badge" id="apps-project-status">Checking</div>
|
|
101
|
+
</div>
|
|
102
|
+
<div class="status-row">
|
|
103
|
+
<div class="capability-icon apps"><i data-lucide="file-code-2"></i></div>
|
|
104
|
+
<div><h3>Manifest</h3><p class="mono-detail" id="apps-manifest-detail">Checking appsscript.json</p></div>
|
|
105
|
+
<div class="badge" id="apps-manifest-status">Checking</div>
|
|
106
|
+
</div>
|
|
107
|
+
</div>
|
|
108
|
+
|
|
109
|
+
<div class="action-bar" aria-label="Apps Script actions">
|
|
110
|
+
<button class="command-button" id="apps-login" type="button"><i data-lucide="log-in"></i>Sign in</button>
|
|
111
|
+
<button class="command-button" id="apps-user-settings" type="button"><i data-lucide="external-link"></i>User Settings</button>
|
|
112
|
+
<button class="command-button" id="apps-open" type="button"><i data-lucide="external-link"></i>Open editor</button>
|
|
113
|
+
<button class="command-button primary" id="apps-push" type="button"><i data-lucide="upload"></i>Push</button>
|
|
114
|
+
<button class="command-button" id="apps-pull" type="button"><i data-lucide="refresh-cw"></i>Pull</button>
|
|
115
|
+
</div>
|
|
116
|
+
|
|
117
|
+
<div class="setup-mode">
|
|
118
|
+
<button type="button" class="setup-mode__button setup-mode__button--active" data-setup-mode="existing">
|
|
119
|
+
<strong>Connect existing project</strong>
|
|
120
|
+
<span>Store the Script ID in .clasp.json and sync GAS_SCRIPT_ID to .env.</span>
|
|
121
|
+
</button>
|
|
122
|
+
<button type="button" class="setup-mode__button" data-setup-mode="new">
|
|
123
|
+
<strong>Create new</strong>
|
|
124
|
+
<span>Create a new Apps Script project through the registered clasp operation.</span>
|
|
125
|
+
</button>
|
|
126
|
+
</div>
|
|
127
|
+
|
|
128
|
+
<div class="panel" id="apps-connect-panel">
|
|
129
|
+
<div class="field">
|
|
130
|
+
<label for="script-id" class="field__label">Apps Script Script ID <span class="required">*</span></label>
|
|
131
|
+
<input id="script-id" placeholder="1BxImVS0XRA5nFMdKvBdBZjgmlUqptlbs..." />
|
|
132
|
+
<p class="field__help">Console writes .clasp.json and .env; no command copy is required.</p>
|
|
133
|
+
</div>
|
|
134
|
+
<button class="button button--primary" id="apps-connect" type="button"><i data-lucide="plus"></i>Connect project</button>
|
|
135
|
+
</div>
|
|
136
|
+
|
|
137
|
+
<div class="panel" id="apps-create-panel" hidden>
|
|
138
|
+
<div class="info-box"><span class="info-box__icon">i</span><div>This runs the fixed Apps Script project creation operation and refreshes state afterward.</div></div>
|
|
139
|
+
<button class="button button--primary" id="apps-create" type="button"><i data-lucide="plus"></i>Create project</button>
|
|
140
|
+
</div>
|
|
141
|
+
|
|
142
|
+
<div class="panel">
|
|
143
|
+
<div>
|
|
144
|
+
<h3>Firebase credentials</h3>
|
|
145
|
+
<p class="field__help">Create a service account key in Firebase, then add its values to Script Properties in Apps Script. Credentials stay in those provider interfaces and never pass through Console.</p>
|
|
146
|
+
</div>
|
|
147
|
+
<div class="action-bar">
|
|
148
|
+
<button class="command-button" id="credential-service-account" type="button"><i data-lucide="key-round"></i>1. Open Service Accounts</button>
|
|
149
|
+
<button class="command-button" id="credential-script-properties" type="button"><i data-lucide="external-link"></i>2. Open Script Properties</button>
|
|
150
|
+
</div>
|
|
151
|
+
</div>
|
|
152
|
+
|
|
153
|
+
<section class="activity" aria-labelledby="apps-activity-title">
|
|
154
|
+
<div class="activity-heading"><h2 id="apps-activity-title">Activity</h2><button id="apps-clear-log" class="text-button" type="button">Clear</button></div>
|
|
155
|
+
<div class="log" id="apps-log" role="log" aria-live="polite"></div>
|
|
156
|
+
</section>
|
|
157
|
+
</div>
|
|
158
|
+
|
|
159
|
+
<div class="content" id="deployment-view" hidden>
|
|
160
|
+
<div class="section-heading">
|
|
161
|
+
<div><div class="eyebrow">DEPLOYMENT</div><h2>Apps Script deployment</h2></div>
|
|
162
|
+
<button class="icon-button light" id="deployment-refresh" type="button" title="Refresh deployment status" aria-label="Refresh deployment status"><i data-lucide="refresh-cw"></i></button>
|
|
163
|
+
</div>
|
|
164
|
+
<div class="status-list">
|
|
165
|
+
<div class="status-row">
|
|
166
|
+
<div class="capability-icon apps"><i data-lucide="file-code-2"></i></div>
|
|
167
|
+
<div><h3>Apps Script project</h3><p class="mono-detail" id="deployment-project-detail">Checking prerequisite</p></div>
|
|
168
|
+
<div class="badge" id="deployment-project-status">Checking</div>
|
|
169
|
+
</div>
|
|
170
|
+
<div class="status-row">
|
|
171
|
+
<div class="capability-icon apps"><i data-lucide="rocket"></i></div>
|
|
172
|
+
<div><h3>Deployment ID</h3><p class="mono-detail" id="deployment-id-detail">Checking .env</p></div>
|
|
173
|
+
<div class="badge" id="deployment-id-status">Checking</div>
|
|
174
|
+
</div>
|
|
175
|
+
</div>
|
|
176
|
+
<div class="field">
|
|
177
|
+
<label for="deployment-id" class="field__label">Deployment ID</label>
|
|
178
|
+
<input id="deployment-id" placeholder="AKfycb..." />
|
|
179
|
+
<p class="field__help">Create or update syncs DEPLOYMENT_ID to .env.</p>
|
|
180
|
+
</div>
|
|
181
|
+
<div class="action-bar">
|
|
182
|
+
<button class="command-button" id="deployment-list" type="button"><i data-lucide="refresh-cw"></i>List</button>
|
|
183
|
+
<button class="command-button primary" id="deployment-create" type="button"><i data-lucide="plus"></i>Create</button>
|
|
184
|
+
<button class="command-button" id="deployment-update" type="button"><i data-lucide="upload"></i>Update</button>
|
|
185
|
+
<button class="command-button" id="deployment-open" type="button"><i data-lucide="external-link"></i>Open deployed app</button>
|
|
186
|
+
</div>
|
|
187
|
+
<section class="activity" aria-labelledby="deployment-activity-title">
|
|
188
|
+
<div class="activity-heading"><h2 id="deployment-activity-title">Activity</h2><button id="deployment-clear-log" class="text-button" type="button">Clear</button></div>
|
|
189
|
+
<div class="log" id="deployment-log" role="log" aria-live="polite"></div>
|
|
190
|
+
</section>
|
|
191
|
+
</div>
|
|
192
|
+
|
|
193
|
+
<div class="content" id="firebase-view" hidden>
|
|
194
|
+
<div class="section-heading">
|
|
195
|
+
<div><div class="eyebrow">FIREBASE</div><h2>Realtime Database lifecycle</h2></div>
|
|
196
|
+
<button class="icon-button light" id="firebase-refresh" type="button" title="Refresh Firebase status" aria-label="Refresh Firebase status"><i data-lucide="refresh-cw"></i></button>
|
|
197
|
+
</div>
|
|
198
|
+
<div class="status-list">
|
|
199
|
+
<div class="status-row">
|
|
200
|
+
<div class="capability-icon firebase"><i data-lucide="database"></i></div>
|
|
201
|
+
<div><h3>Firebase</h3><p id="firebase-enabled-detail">Checking local configuration</p></div>
|
|
202
|
+
<div class="badge" id="firebase-enabled-status">Checking</div>
|
|
203
|
+
</div>
|
|
204
|
+
<div class="status-row">
|
|
205
|
+
<div class="capability-icon account"><i data-lucide="user-round"></i></div>
|
|
206
|
+
<div><h3>Firebase account</h3><p id="firebase-auth-detail">Checking authorization</p></div>
|
|
207
|
+
<div class="badge" id="firebase-auth-status">Checking</div>
|
|
208
|
+
</div>
|
|
209
|
+
<div class="status-row">
|
|
210
|
+
<div class="capability-icon firebase"><i data-lucide="database"></i></div>
|
|
211
|
+
<div><h3>Firebase project</h3><p class="mono-detail" id="firebase-project-detail">Checking project ID</p></div>
|
|
212
|
+
<div class="badge" id="firebase-project-status">Checking</div>
|
|
213
|
+
</div>
|
|
214
|
+
</div>
|
|
215
|
+
<div class="field">
|
|
216
|
+
<label for="firebase-project-id" class="field__label">Firebase Project ID <span class="required">*</span></label>
|
|
217
|
+
<input id="firebase-project-id" placeholder="my-firebase-project" />
|
|
218
|
+
<p class="field__help">Connect syncs FIREBASE_PROJECT_ID to .env and .firebaserc.</p>
|
|
219
|
+
</div>
|
|
220
|
+
<div class="action-bar">
|
|
221
|
+
<button class="command-button primary" id="firebase-enable" type="button"><i data-lucide="plus"></i>Enable Firebase</button>
|
|
222
|
+
<button class="command-button" id="firebase-login" type="button"><i data-lucide="log-in"></i>Firebase login</button>
|
|
223
|
+
<button class="command-button" id="firebase-connect" type="button"><i data-lucide="database"></i>Connect project</button>
|
|
224
|
+
<button class="command-button" id="firebase-rules-deploy" type="button"><i data-lucide="upload"></i>Deploy rules</button>
|
|
225
|
+
<button class="command-button" id="firebase-open" type="button"><i data-lucide="external-link"></i>Open console</button>
|
|
226
|
+
</div>
|
|
227
|
+
<section class="activity" aria-labelledby="firebase-activity-title">
|
|
228
|
+
<div class="activity-heading"><h2 id="firebase-activity-title">Activity</h2><button id="firebase-clear-log" class="text-button" type="button">Clear</button></div>
|
|
229
|
+
<div class="log" id="firebase-log" role="log" aria-live="polite"></div>
|
|
230
|
+
</section>
|
|
231
|
+
</div>
|
|
67
232
|
</section>
|
|
68
233
|
</main>
|
|
234
|
+
|
|
235
|
+
<dialog id="create-dialog">
|
|
236
|
+
<form id="create-form">
|
|
237
|
+
<div class="dialog-heading"><h2>Create Apps Script project</h2><button class="dialog-close" type="button" data-close-dialog="create-dialog" aria-label="Close"><i data-lucide="x"></i></button></div>
|
|
238
|
+
<label for="script-title">Project title</label>
|
|
239
|
+
<input id="script-title" name="title" maxlength="100" required />
|
|
240
|
+
<div class="dialog-actions"><button class="secondary-button" type="button" data-close-dialog="create-dialog">Cancel</button><button class="command-button primary" type="submit"><i data-lucide="plus"></i>Create</button></div>
|
|
241
|
+
</form>
|
|
242
|
+
</dialog>
|
|
243
|
+
|
|
244
|
+
<dialog id="push-dialog">
|
|
245
|
+
<form id="push-form">
|
|
246
|
+
<div class="dialog-heading"><h2>Push local files?</h2><button class="dialog-close" type="button" data-close-dialog="push-dialog" aria-label="Close"><i data-lucide="x"></i></button></div>
|
|
247
|
+
<p class="dialog-copy">Remote Apps Script content will be replaced by the local project files.</p>
|
|
248
|
+
<div class="dialog-actions"><button class="secondary-button" type="button" data-close-dialog="push-dialog">Cancel</button><button class="command-button danger" type="submit"><i data-lucide="upload"></i>Push and replace</button></div>
|
|
249
|
+
</form>
|
|
250
|
+
</dialog>
|
|
251
|
+
|
|
252
|
+
<dialog id="deployment-dialog">
|
|
253
|
+
<form id="deployment-form">
|
|
254
|
+
<div class="dialog-heading"><h2>Create deployment</h2><button class="dialog-close" type="button" data-close-dialog="deployment-dialog" aria-label="Close"><i data-lucide="x"></i></button></div>
|
|
255
|
+
<label for="deployment-description">Description</label>
|
|
256
|
+
<input id="deployment-description" maxlength="120" placeholder="Initial deployment" />
|
|
257
|
+
<div class="dialog-actions"><button class="secondary-button" type="button" data-close-dialog="deployment-dialog">Cancel</button><button class="command-button primary" type="submit"><i data-lucide="rocket"></i>Create</button></div>
|
|
258
|
+
</form>
|
|
259
|
+
</dialog>
|
|
260
|
+
|
|
69
261
|
</body>
|
|
70
262
|
</html>
|
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@gasboost/console",
|
|
3
|
-
"version": "0.
|
|
3
|
+
"version": "0.3.0",
|
|
4
4
|
"description": "Gasboost project lifecycle console",
|
|
5
5
|
"type": "module",
|
|
6
6
|
"exports": {
|
|
@@ -17,9 +17,10 @@
|
|
|
17
17
|
"node": ">=24"
|
|
18
18
|
},
|
|
19
19
|
"dependencies": {
|
|
20
|
+
"@google/clasp": "^3.4.1",
|
|
20
21
|
"lucide": "^0.544.0",
|
|
21
22
|
"zod": "^4.1.12",
|
|
22
|
-
"@gasboost/config": "0.1.
|
|
23
|
+
"@gasboost/config": "0.1.1",
|
|
23
24
|
"@gasboost/console-runtime": "0.1.0"
|
|
24
25
|
},
|
|
25
26
|
"devDependencies": {
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
:root{color:#17211b;font-synthesis:none;background:#f4f6f4;font-family:Inter,ui-sans-serif,system-ui,-apple-system,BlinkMacSystemFont,Segoe UI,sans-serif}*{box-sizing:border-box}body{min-width:320px;min-height:100vh;margin:0}button{font:inherit}.topbar{color:#fff;background:#15271e;border-bottom:1px solid #294235;align-items:center;gap:12px;height:64px;padding:0 24px;display:flex}.brand-mark{color:#15271e;background:#e8ff6a;border-radius:6px;place-items:center;width:34px;height:34px;font-weight:800;display:grid}.product-name{font-size:14px;font-weight:700}.project-path{text-overflow:ellipsis;white-space:nowrap;color:#aabbb1;max-width:min(60vw,680px);font:12px ui-monospace,SFMono-Regular,Menlo,monospace;overflow:hidden}.icon-button{color:#fff;cursor:pointer;background:0 0;border:1px solid #496052;border-radius:6px;place-items:center;width:36px;height:36px;margin-left:auto;display:grid}.icon-button:hover{background:#294235}.icon-button:disabled{opacity:.5;cursor:wait}.icon-button svg{width:17px;height:17px}.status-band{background:#fff;border-bottom:1px solid #dce2de;justify-content:space-between;align-items:center;gap:24px;min-height:112px;padding:24px clamp(24px,5vw,72px);display:flex}.eyebrow{color:#668071;font-size:11px;font-weight:800}h1,h2,h3,p{letter-spacing:0;margin:0}h1{margin-top:5px;font-size:28px;line-height:1.2}.runtime-status{color:#526158;align-items:center;font-size:13px;font-weight:650;display:flex}.runtime-status span{background:#e0a526;border-radius:50%;width:8px;height:8px}.runtime-status.ready span{background:#28a264}.runtime-status.error span{background:#d54c4c}.workspace{grid-template-columns:220px minmax(0,1fr);min-height:calc(100vh - 176px);display:grid}.sidebar{background:#e9eeea;border-right:1px solid #d5ddd7;padding:18px 12px}.nav-item{color:#46554c;text-align:left;background:0 0;border:0;border-radius:5px;align-items:center;gap:10px;width:100%;height:40px;padding:0 12px;display:flex}.nav-item svg{width:17px;height:17px}.nav-item.active{color:#17211b;background:#fff;font-weight:700;box-shadow:0 1px 2px #11231914}.nav-item:disabled{opacity:.55}.content{width:min(960px,100%);padding:32px clamp(24px,5vw,64px) 56px}.section-heading{justify-content:space-between;align-items:end;margin-bottom:18px;display:flex}h2{margin-top:4px;font-size:20px;line-height:1.3}.capability-list{background:#fff;border:1px solid #d8dfda;border-radius:7px;overflow:hidden}.capability-row{border-bottom:1px solid #e4e9e5;grid-template-columns:42px minmax(0,1fr) auto;align-items:center;gap:15px;min-height:82px;padding:16px 18px;display:grid}.capability-row:last-child{border-bottom:0}.capability-icon{border-radius:6px;place-items:center;width:40px;height:40px;display:grid}.capability-icon svg{width:19px;height:19px}.capability-icon.apps{color:#2659a8;background:#e7f0ff}.capability-icon.firebase{color:#9a5c00;background:#fff1d6}h3{font-size:14px}.capability-row p{color:#6c7971;margin-top:4px;font-size:12px}.badge{color:#66736b;text-align:center;background:#f6f8f6;border:1px solid #d7ded9;border-radius:4px;min-width:94px;padding:5px 8px;font-size:11px;font-weight:700}.badge.configured{color:#137145;background:#e9f8f0;border-color:#a9dbc1}.badge.inactive{color:#68736c}.activity{margin-top:30px}.activity-heading{justify-content:space-between;align-items:center;margin-bottom:12px;display:flex}.text-button{color:#446052;cursor:pointer;background:0 0;border:0;font-size:12px;font-weight:700}.log{color:#dce8e0;background:#18241d;border-radius:6px;height:180px;padding:8px 0;font:12px/1.6 ui-monospace,SFMono-Regular,Menlo,monospace;overflow:auto}.log-row{grid-template-columns:84px 1fr;gap:10px;padding:4px 14px;display:grid}.log-row time{color:#789083}.log-row.progress span{color:#e8ff6a}.log-row.error span{color:#ff9b9b}@media (width<=700px){.topbar{padding:0 16px}.status-band{min-height:104px;padding:20px}h1{font-size:23px}.workspace{grid-template-columns:1fr}.sidebar{border-bottom:1px solid #d5ddd7;border-right:0;padding:8px;display:flex;overflow-x:auto}.nav-item{width:auto;min-width:max-content}.content{padding:24px 16px 40px}.capability-row{grid-template-columns:40px minmax(0,1fr)}.badge{grid-column:2;justify-self:start}}
|
|
@@ -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(` `),o=e=>e.replace(/(\w)(\w*)(_|-|\s*)/g,(e,t,n)=>t.toUpperCase()+n.toLowerCase()),s=(t,{nameAttr:i,icons:s,attrs:c})=>{let l=t.getAttribute(i);if(l==null)return;let u=s[o(l)];if(!u)return console.warn(`${t.outerHTML} icon name was not found in the provided icons object.`);let d=r(t),f={...e,"data-lucide":l,...c,...d},p=a([`lucide`,`lucide-${l}`,d,c]);p&&Object.assign(f,{class:p});let m=n(u,f);return t.parentNode?.replaceChild(m,t)},c=[[`path`,{d:`m18 16 4-4-4-4`}],[`path`,{d:`m6 8-4 4 4 4`}],[`path`,{d:`m14.5 4-5 16`}]],l=[[`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`}]],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=[[`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`}]],f=[[`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`}]],p=[[`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`}]],m=({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=>s(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=>s(t,{nameAttr:`icon-name`,icons:e,attrs:n})))}},h=D();m({icons:{Code2:c,Database:l,FileCode2:u,LayoutDashboard:d,RefreshCw:f,Rocket:p}});var g=E(`refresh`),_=E(`clear-log`),v=E(`log`);g.addEventListener(`click`,()=>void y()),_.addEventListener(`click`,()=>{v.replaceChildren()}),y();async function y(){g.disabled=!0,w(`running`,`Inspecting`),T(`Inspecting project definition`,`info`);try{await b(`project.inspect`,{},{log:e=>T(e,`info`),progress:(e,t)=>T(t===void 0?e:`${e} (${t}%)`,`progress`),result:S}),w(`ready`,`Ready`)}catch(e){w(`error`,`Error`),T(e instanceof Error?e.message:`Operation failed`,`error`)}finally{g.disabled=!1}}async function b(e,t,n){let r=await fetch(`/api/operations/${encodeURIComponent(e)}`,{method:`POST`,headers:{"Content-Type":`application/json`,"X-Gasboost-Session":h},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)x(e,n);if(e)break}}function x(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 S(e){E(`project-title`).textContent=e.name,E(`project-path`).textContent=e.root,C(`apps-script-status`,e.capabilities.appsScript),C(`firebase-status`,e.capabilities.firebaseRealtimeDatabase)}function C(e,t){let n=E(e);n.textContent=t?`Configured`:`Not configured`,n.className=`badge ${t?`configured`:`inactive`}`}function w(e,t){let n=E(`runtime-status`);n.className=`runtime-status ${e}`,n.innerHTML=``;let r=document.createElement(`span`);n.append(r,document.createTextNode(` ${t}`))}function T(e,t){let n=document.createElement(`div`);n.className=`log-row ${t}`;let r=document.createElement(`time`);r.textContent=new Date().toLocaleTimeString();let i=document.createElement(`span`);i.textContent=e,n.append(r,i),v.append(n),v.scrollTop=v.scrollHeight}function E(e){let t=document.getElementById(e);if(t===null)throw Error(`Missing UI element: ${e}`);return t}function D(){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}
|