pinokiod 1.3.90 → 1.3.91

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/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "pinokiod",
3
- "version": "1.3.90",
3
+ "version": "1.3.91",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/server/index.js CHANGED
@@ -172,6 +172,31 @@ class Server {
172
172
  }
173
173
  })
174
174
  }
175
+ async init_env(env_dir_path) {
176
+ console.log("env_path",env_dir_path)
177
+ let current = this.kernel.path(env_dir_path, "ENVIRONMENT")
178
+ // if environment.json doesn't exist,
179
+ let exists = await this.exists(current)
180
+ console.log({ current, exists })
181
+ if (exists) {
182
+ // if ENVIRONMENT already exists, don't do anything
183
+ } else {
184
+ // if ENVIRONMENT doesn't exist, need to create one
185
+ // 1. if _ENVIRONMENT exists, create ENVIRONMENT by appending _ENVIRONMENT to ENVIRONMENT
186
+ // 2. if _ENVIRONMENT doesn't exist, just write ENVIRONMENT
187
+ // if _ENVIRONMENT exists,
188
+ let _environment = this.kernel.path(env_dir_path, "_ENVIRONMENT")
189
+ let _exists = await this.exists(_environment)
190
+ console.log({ _environment, _exists })
191
+ let content = await Environment.ENV("app")
192
+ if (_exists) {
193
+ let _environmentStr = await fs.promises.readFile(_environment, "utf8")
194
+ await fs.promises.writeFile(current, _environmentStr + "\n\\n\n" + content)
195
+ } else {
196
+ await fs.promises.writeFile(current, content)
197
+ }
198
+ }
199
+ }
175
200
  async chrome(req, res, type) {
176
201
  let name = req.params.name
177
202
  let app_path = this.kernel.path("api", name, "pinokio.js")
@@ -230,26 +255,7 @@ class Server {
230
255
  }
231
256
  }
232
257
 
233
- let current = this.kernel.path("api", name, "ENVIRONMENT")
234
- // if environment.json doesn't exist,
235
- let exists = await this.exists(current)
236
- if (exists) {
237
- // if ENVIRONMENT already exists, don't do anything
238
- } else {
239
- // if ENVIRONMENT doesn't exist, need to create one
240
- // 1. if _ENVIRONMENT exists, create ENVIRONMENT by appending _ENVIRONMENT to ENVIRONMENT
241
- // 2. if _ENVIRONMENT doesn't exist, just write ENVIRONMENT
242
- // if _ENVIRONMENT exists,
243
- let _environment = this.kernel.path("api", name, "_ENVIRONMENT")
244
- let _exists = await this.exists(_environment)
245
- let content = await Environment.ENV("app")
246
- if (_exists) {
247
- let _environmentStr = await fs.promises.readFile(_environment, "utf8")
248
- await fs.promises.writeFile(current, content + "\n\n" + _environmentStr)
249
- } else {
250
- await fs.promises.writeFile(current, content)
251
- }
252
- }
258
+ await this.init_env("api/" + name)
253
259
 
254
260
  let mode = "run"
255
261
  if (req.query && req.query.mode) {
@@ -2166,17 +2172,61 @@ class Server {
2166
2172
  })
2167
2173
  this.app.post("/env", async (req, res) => {
2168
2174
  console.log("req.body", req.body)
2169
- let fullpath = path.resolve(this.kernel.homedir, req.body.filepath)
2175
+ let fullpath = path.resolve(this.kernel.homedir, req.body.filepath, "ENVIRONMENT")
2170
2176
  let updated = req.body.vals
2171
2177
  await Util.update_env(fullpath, updated)
2172
2178
  res.json({})
2173
2179
  })
2180
+ this.app.get("/env", async (req, res) => {
2181
+ let env_path = path.resolve(this.kernel.homedir)
2182
+ await this.init_env(env_path)
2183
+
2184
+ let filepath = path.resolve(this.kernel.homedir, "ENVIRONMENT")
2185
+ let editorpath = "/edit/ENVIRONMENT"
2186
+
2187
+ const items = await Util.parse_env_detail(filepath)
2188
+
2189
+
2190
+ res.render("env_editor", {
2191
+ config: null,
2192
+ name: null,
2193
+ init: null,
2194
+ editorpath,
2195
+ items,
2196
+ theme: this.theme,
2197
+ filepath,
2198
+ agent: this.agent,
2199
+ })
2200
+ })
2174
2201
  this.app.get("/env/*", async (req, res) => {
2202
+
2203
+ let env_path = req.params[0]
2204
+ await this.init_env(env_path)
2205
+
2175
2206
  let pathComponents = req.params[0].split("/")
2176
- let filepath = path.resolve(this.kernel.homedir, req.params[0])
2177
- let editorpath = "/edit/" + req.params[0]
2207
+ let filepath = path.resolve(this.kernel.homedir, req.params[0], "ENVIRONMENT")
2208
+ let editorpath = "/edit/" + req.params[0] + "/ENVIRONMENT"
2209
+
2210
+ console.log({ pathComponents, filepath, editorpath, })
2178
2211
  const items = await Util.parse_env_detail(filepath)
2212
+
2213
+ console.log(items)
2214
+
2215
+ let p = path.resolve(this.kernel.homedir, env_path, "pinokio.js")
2216
+ let config = (await this.kernel.loader.load(p)).resolved
2217
+ if (config.icon) {
2218
+ config.icon = `/${env_path}/${config.icon}?raw=true`
2219
+ }
2220
+
2221
+ let name
2222
+ if (env_path.startsWith("api")) {
2223
+ name = env_path.split("/")[1]
2224
+ }
2225
+
2179
2226
  res.render("env_editor", {
2227
+ config,
2228
+ name,
2229
+ init: req.query ? req.query.init : null,
2180
2230
  editorpath,
2181
2231
  items,
2182
2232
  theme: this.theme,
@@ -2184,6 +2234,44 @@ class Server {
2184
2234
  agent: this.agent,
2185
2235
  })
2186
2236
  })
2237
+ this.app.get("/pre/:name", async (req, res) => {
2238
+ let p = path.resolve(this.kernel.homedir, "api", req.params.name, "pinokio.js")
2239
+ let config = (await this.kernel.loader.load(p)).resolved
2240
+ console.log("config", config)
2241
+ if (config && config.pre) {
2242
+
2243
+ config.pre.forEach((item) => {
2244
+ item.icon = `/api/${req.params.name}/${item.icon}?raw=true`
2245
+ })
2246
+
2247
+ res.render("pre", {
2248
+ name: req.params.name,
2249
+ theme: this.theme,
2250
+ agent: this.agent,
2251
+ name: req.params.name,
2252
+ items: config.pre
2253
+ })
2254
+ } else {
2255
+ res.redirect("/env/" + req.params.name)
2256
+ }
2257
+ })
2258
+ this.app.get("/initialize/:name", async (req, res) => {
2259
+ let p = path.resolve(this.kernel.homedir, "api", req.params.name, "pinokio.js")
2260
+ let config = (await this.kernel.loader.load(p)).resolved
2261
+ if (config) {
2262
+ // if pinokio.js exists
2263
+ if (config.pre && Array.isArray(config.pre)) {
2264
+ // if pre exists, redirect to /pre/:name
2265
+ res.redirect(`/pre/${req.params.name}`)
2266
+ } else {
2267
+ // if pre doesn't exist, redirect to /env/:name
2268
+ res.redirect(`/env/${req.params.name}`)
2269
+ }
2270
+ } else {
2271
+ // if pinokio.js doesn't exist, send to /browser/:name
2272
+ res.redirect(`/pinokio/browser/${req.params.name}`)
2273
+ }
2274
+ })
2187
2275
  this.app.get("/share/:name", async (req, res) => {
2188
2276
  let filepath = path.resolve(this.kernel.homedir, "api", req.params.name, "ENVIRONMENT")
2189
2277
  //let filepath = path.resolve(this.kernel.homedir, req.params[0])
@@ -104,8 +104,8 @@ const install = async (name, url, term, socket, options) => {
104
104
  })
105
105
  } else {
106
106
  // ask the backend to create install.json and start.json if gradio
107
- //location.href = `/?selected=${name}`
108
- location.href = `/pinokio/browser/${name}`
107
+ //location.href = `/pinokio/browser/${name}`
108
+ location.href = `/initialize/${name}`
109
109
 
110
110
  }
111
111
  }
@@ -561,7 +561,7 @@ body.dark .loader-container {
561
561
  <a target="/share/<%=name%>" href="/share/<%=name%>", class="btn header-item frame-link" data-index="1" data-mode="refresh">
562
562
  <div class='tab'><i class="fa-solid fa-wifi"></i> Share</div>
563
563
  </a>
564
- <a target="/env/api/<%=name%>/ENVIRONMENT" href="/env/api/<%=name%>/ENVIRONMENT", class="btn header-item frame-link" data-index="1" data-mode="refresh">
564
+ <a target="/env/api/<%=name%>" href="/env/api/<%=name%>", class="btn header-item frame-link" data-index="1" data-mode="refresh">
565
565
  <div class='tab'><i class="fa-solid fa-gear"></i> Configure</div>
566
566
  </a>
567
567
  </div>
@@ -73,13 +73,25 @@ td.key {
73
73
  .button:hover {
74
74
 
75
75
  }
76
- #editor {
77
- box-sizing: border-box;
78
- max-width: 800px;
79
- padding: 20px;
80
- }
76
+ <% if (init) { %>
77
+ main {
78
+ width: 100%;
79
+ box-sizing: border-box;
80
+ max-width: 600px;
81
+ padding: 20px;
82
+ margin: 0 auto;
83
+ }
84
+ <% } else { %>
85
+ #editor {
86
+ width: 100%;
87
+ box-sizing: border-box;
88
+ max-width: 600px;
89
+ padding: 20px;
90
+ margin: 0 auto;
91
+ }
92
+ <% } %>
93
+
81
94
  header .runner {
82
- padding: 10px 0 0;
83
95
  }
84
96
  .disabled {
85
97
  opacity: 0.7;
@@ -119,6 +131,59 @@ body.dark .comment {
119
131
  #save {
120
132
  background: royalblue;
121
133
  }
134
+ a#customize {
135
+ text-decoration: underline;
136
+ cursor: pointer;
137
+ }
138
+ .e {
139
+ padding: 10px 0;
140
+ }
141
+ #editor {
142
+ padding: 20px 0;
143
+ }
144
+ .center {
145
+ display: flex;
146
+ align-items: center;
147
+ justify-content: center;
148
+ }
149
+ body {
150
+ display: block;
151
+ }
152
+ .card {
153
+ display: flex;
154
+ padding: 10px 0;
155
+ box-sizing: border-box;
156
+ }
157
+ .card img {
158
+ width: 100px;
159
+ border-radius: 10px;
160
+ }
161
+ .card .description {
162
+ opacity: 0.8;
163
+ }
164
+ .card .title {
165
+ font-weight: bold;
166
+ font-size: 30px;
167
+ letter-spacing: -1px;
168
+ }
169
+ .card .col {
170
+ padding-left: 10px;
171
+ }
172
+ h1 {
173
+ font-size: 50px;
174
+ font-family: georgia;
175
+ font-style: italic;
176
+ }
177
+ footer {
178
+ background: none;
179
+ padding: 0;
180
+ text-align: right;
181
+ display: block;
182
+ margin-bottom: 20px;
183
+ }
184
+ footer .btn {
185
+ margin-left: 10px;
186
+ }
122
187
  </style>
123
188
  <script>
124
189
  document.addEventListener("DOMContentLoaded", async () => {
@@ -145,40 +210,70 @@ document.addEventListener("DOMContentLoaded", async () => {
145
210
  return res.json()
146
211
  })
147
212
  console.log("res" ,res)
148
- n.Noty({
149
- text: `Updated!`
150
- })
213
+ <% if (init && name) { %>
214
+ location.href = "/pinokio/browser/<%=name%>"
215
+ <% } else { %>
216
+ n.Noty({
217
+ text: `Updated!`
218
+ })
219
+ <% } %>
151
220
  })
221
+ <% if (init) { %>
222
+ document.querySelector("#customize").addEventListener("click", (e) => {
223
+ e.preventDefault()
224
+ e.stopPropagation()
225
+ document.querySelector("#editor").classList.toggle("hidden")
226
+ })
227
+ <% } %>
152
228
  })
153
229
  </script>
154
230
  </head>
155
- <body class='columns <%=theme%>'>
156
- <header class='navheader grabbable'>
157
- <h1>
158
- <a class='home' href="/"><i class="fa-solid fa-house"></i></a>
159
- <%=filepath%>
160
- </h1>
161
- <div class='runner'>
162
- <div id='save' class='btn'>
163
- <span class='save'><i class="fa-solid fa-check"></i> Save</span>
164
- </div>
165
- <a class='btn' href="<%=editorpath%>"><i class="fa-solid fa-pen-to-square"></i> Edit file</a>
166
- <button class='btn' id='open-fs' data-filepath="<%=filepath%>"><i class="fa-solid fa-eye"></i> Open in File Explorer</button>
167
- </div>
168
- </header>
169
- <main>
170
- <div id='editor'>
171
- <% items.forEach((item) => { %>
172
- <% if (item.type === "comment") { %>
173
- <div class='comment'><%=item.val.replaceAll(/^[ #]+/g, "")%></div>
174
- <% } else { %>
175
- <div class='env-item'>
176
- <label for="<%=item.key%>"><%=item.key%></label>
177
- <input id="<%=item.key%>" type="text" value="<%=item.val%>">
231
+ <body class='<%=theme%> <%=init ? 'center' : ''%>'>
232
+ <main>
233
+ <% if (init) { %>
234
+ <div>
235
+ <h1>Install</h1>
236
+ <% if (config) { %>
237
+ <div class='card'>
238
+ <% if (config.icon) { %>
239
+ <img src="<%=config.icon%>">
240
+ <% } %>
241
+ <div class='col'>
242
+ <div class='title'><%=config.title%></div>
243
+ <div class='description'><%=config.description%></div>
178
244
  </div>
179
- <% } %>
180
- <% }) %>
245
+ </div>
246
+ <% } %>
247
+ <footer>
248
+ <button id='customize' class='btn'><i class="fa-solid fa-gear"></i> Customize</button>
249
+ <div id='save' class='btn'>
250
+ <span class='save'><i class="fa-solid fa-check"></i> Install</span>
251
+ </div>
252
+ </footer>
181
253
  </div>
182
- </main>
254
+ <% } else { %>
255
+ <header class='navheader grabbable'>
256
+ <div class='runner'>
257
+ <div id='save' class='btn'>
258
+ <span class='save'><i class="fa-solid fa-check"></i> Save</span>
259
+ </div>
260
+ <a class='btn' href="<%=editorpath%>"><i class="fa-solid fa-pen-to-square"></i> Edit file</a>
261
+ <button class='btn' id='open-fs' data-filepath="<%=filepath%>"><i class="fa-solid fa-eye"></i> Open in File Explorer</button>
262
+ </div>
263
+ </header>
264
+ <% } %>
265
+ <div id='editor' class='<%=init ? "hidden" : ''%>'>
266
+ <% items.forEach((item) => { %>
267
+ <% if (item.type === "comment") { %>
268
+ <div class='comment'><%=item.val.replaceAll(/^[ #]+/g, "")%></div>
269
+ <% } else { %>
270
+ <div class='env-item'>
271
+ <label for="<%=item.key%>"><%=item.key%></label>
272
+ <input id="<%=item.key%>" type="text" value="<%=item.val%>">
273
+ </div>
274
+ <% } %>
275
+ <% }) %>
276
+ </div>
277
+ </main>
183
278
  </body>
184
279
  </html>
@@ -0,0 +1,109 @@
1
+ <html class='columns'>
2
+ <head>
3
+ <meta name="viewport" content="width=device-width, initial-scale=1, maximum-scale=1" />
4
+ <script src="/hotkeys.min.js"></script>
5
+ <script src="/ace/ace.js"></script>
6
+ <script src="/noty.js"></script>
7
+ <script src="/notyq.js"></script>
8
+ <script src="/xterm.js"></script>
9
+ <script src="/xterm-addon-fit.js"></script>
10
+ <script src="/xterm-addon-web-links.js"></script>
11
+ <script src="/xterm-theme.js"></script>
12
+ <script src="/xterm-addon-search.js"></script>
13
+ <script src="/xterm-addon-search-bar.js"></script>
14
+ <script src="/sweetalert2.js"></script>
15
+ <script src="/Socket.js"></script>
16
+ <script src="/common.js"></script>
17
+ <script src="/he.js"></script>
18
+ <script src="/opener.js"></script>
19
+ <script src="/nav.js"></script>
20
+ <script src="/autoexpand.js"></script>
21
+ <script src="/modalinput.js"></script>
22
+ <script src="/simplemodal.js"></script>
23
+ <script src="/waitmodal.js"></script>
24
+ <script src="/notifyinput.js"></script>
25
+ <script src="/report.js"></script>
26
+ <link href="/xterm.min.css" rel="stylesheet" />
27
+ <link href="/css/fontawesome.min.css" rel="stylesheet">
28
+ <link href="/css/solid.min.css" rel="stylesheet">
29
+ <link href="/css/regular.min.css" rel="stylesheet">
30
+ <link href="/css/brands.min.css" rel="stylesheet">
31
+ <link href="/style.css" rel="stylesheet"/>
32
+ <link href="/noty.css" rel="stylesheet"/>
33
+ <% if (agent === "electron") { %>
34
+ <link href="/electron.css" rel="stylesheet"/>
35
+ <% } %>
36
+ <style>
37
+ main {
38
+ max-width: 500px;
39
+ margin: 50px auto;
40
+ width: 100%;
41
+ }
42
+ h1 {
43
+ letter-spacing: -1px;
44
+ }
45
+ .item {
46
+ border-radius: 5px;
47
+ padding: 10px;
48
+ box-sizing: border-box;
49
+ display: flex;
50
+ align-items: flex-start;
51
+ /*
52
+ border: 1px solid rgba(0,0,0,0.07);
53
+ */
54
+ background: rgba(0,0,0,0.04);
55
+ margin: 10px 0;
56
+
57
+ }
58
+ .item .btn {
59
+ width: 50px;
60
+ text-align: center;
61
+ }
62
+ .item img {
63
+ width: 100px;
64
+ }
65
+ .item .col {
66
+ flex-grow: 1;
67
+ padding: 10px;
68
+ box-sizing: border-box;
69
+ }
70
+ footer {
71
+ background: none;
72
+ }
73
+ footer a.btn {
74
+ text-align: center;
75
+ display: block;
76
+ width: 100%;
77
+ }
78
+ .e {
79
+ padding: 5px 0;
80
+ }
81
+ </style>
82
+ </head>
83
+ <body class='columns <%=theme%>'>
84
+ <header class='navheader grabbable'>
85
+ </header>
86
+ <main>
87
+ <h1>Requirements</h1>
88
+ <div class='e'>
89
+ <div>To run <%=name%>, you need to have the following programs installed.</div>
90
+ <div>Get the apps if you haven't already, and press "Done".</div>
91
+ </div>
92
+ <div class='items'>
93
+ <% items.forEach((item) => { %>
94
+ <div class='item'>
95
+ <img src="<%=item.icon%>">
96
+ <div class='col'>
97
+ <div class='title'><%=item.title%></div>
98
+ <div class='description'><%=item.description%></div>
99
+ </div>
100
+ <a target="_blank" features="browser" href='<%=item.href%>' class='btn'>Get</a>
101
+ </div>
102
+ <% }) %>
103
+ </div>
104
+ <footer>
105
+ <a class='btn' href="/env/api/<%=name%>?init=true">Done</a>
106
+ </footer>
107
+ </main>
108
+ </body>
109
+ </html>
@@ -302,7 +302,7 @@ hr {
302
302
  <br>
303
303
  <div>Edit the system ENVIRONMENT file to customize pinokio system wide settings, such as where files are stored, terminal behavior, etc.</div>
304
304
  <br>
305
- <a class='btn' href="/env/ENVIRONMENT"><i class="fa-regular fa-pen-to-square"></i> Edit ENVIRONMENT</a>
305
+ <a class='btn' href="/env"><i class="fa-regular fa-pen-to-square"></i> Edit ENVIRONMENT</a>
306
306
  </div>
307
307
  <hr/>
308
308
  <div class='troubleshoot'>