pinokiod 8.0.22 → 8.0.23

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": "8.0.22",
3
+ "version": "8.0.23",
4
4
  "description": "",
5
5
  "main": "index.js",
6
6
  "scripts": {
package/server/index.js CHANGED
@@ -3606,7 +3606,6 @@ class Server {
3606
3606
 
3607
3607
  let error
3608
3608
  let items
3609
- let readme
3610
3609
  // if (pathComponents.length === 0) {
3611
3610
  // let files = await fs.promises.readdir(filepath, { withFileTypes: true })
3612
3611
  // items = files
@@ -3629,18 +3628,8 @@ class Server {
3629
3628
  }
3630
3629
  }
3631
3630
 
3632
- // look for README.md
3633
-
3634
3631
  let config
3635
3632
  for(let file of f.files) {
3636
- if (file.name.toLowerCase() === "readme.md") {
3637
- let p = path.resolve(filepath, file.name)
3638
- let md = await fs.promises.readFile(p, "utf8")
3639
- readme = marked.parse(md, {
3640
- baseUrl: req._parsedUrl.pathname.replace(/^\/_api/, "/raw/") + "/"
3641
- //baseUrl: req.originalUrl + "/"
3642
- })
3643
- }
3644
3633
  if (file.name === "pinokio.js") {
3645
3634
  let p = path.resolve(filepath, file.name)
3646
3635
  config = (await this.kernel.loader.load(p)).resolved
@@ -4297,7 +4286,6 @@ class Server {
4297
4286
  home_sort: homeSortMode,
4298
4287
  running,
4299
4288
  notRunning,
4300
- readme,
4301
4289
  filepath,
4302
4290
  mode: null,
4303
4291
  kernel: this.kernel,
@@ -4329,7 +4317,6 @@ class Server {
4329
4317
  ishome: meta,
4330
4318
  running,
4331
4319
  notRunning,
4332
- readme,
4333
4320
  filepath,
4334
4321
  mode: null,
4335
4322
  kernel: this.kernel,
@@ -2637,13 +2637,6 @@ pre {
2637
2637
  pre:empty {
2638
2638
  display: none;
2639
2639
  }
2640
- body.dark .readme {
2641
- background: none;
2642
- color: var(--dark-color);
2643
- }
2644
- .readme .content {
2645
- padding: 0 20px 20px;
2646
- }
2647
2640
  body.dark .empty {
2648
2641
  background: var(--dark-bg);
2649
2642
  }
@@ -2653,21 +2646,6 @@ body.dark .empty {
2653
2646
  opacity: 0.5;
2654
2647
  background: var(--light-bg);
2655
2648
  }
2656
- .readme {
2657
- max-width: var(--content-width);
2658
- box-sizing: border-box;
2659
- margin: 0 auto;
2660
- }
2661
- body.dark .readme a {
2662
- color: var(--dark-link-color);
2663
- }
2664
- .readme a {
2665
- color: var(--light-link-color);
2666
- text-decoration: none;
2667
- }
2668
- .readme ol, .readme ul {
2669
- padding-inline-start: 20px;
2670
- }
2671
2649
  .runnables .row {
2672
2650
  display: flex;
2673
2651
  padding: 10px;
@@ -8,7 +8,6 @@
8
8
  <link href="/css/solid.min.css" rel="stylesheet">
9
9
  <link href="/css/regular.min.css" rel="stylesheet">
10
10
  <link href="/css/brands.min.css" rel="stylesheet">
11
- <link href="/markdown.css" rel="stylesheet"/>
12
11
  <link href="/noty.css" rel="stylesheet"/>
13
12
  <link href="/style.css" rel="stylesheet"/>
14
13
  <% if (agent === "electron") { %>
@@ -230,11 +229,6 @@ body.dark .browser-options-row {
230
229
  <div class='description'><%=item.description%></div>
231
230
  </a>
232
231
  <% }) %>
233
- <% if (readme) { %>
234
- <div class='readme markdown-body'>
235
- <div class='content'><%-readme%></div>
236
- </div>
237
- <% } %>
238
232
  </div>
239
233
  </main>
240
234
  <script>
@@ -8,7 +8,6 @@
8
8
  <link href="/css/solid.min.css" rel="stylesheet">
9
9
  <link href="/css/regular.min.css" rel="stylesheet">
10
10
  <link href="/css/brands.min.css" rel="stylesheet">
11
- <link href="/markdown.css" rel="stylesheet"/>
12
11
  <link href="/noty.css" rel="stylesheet"/>
13
12
  <link href="/filepond.min.css" rel="stylesheet" />
14
13
  <link href="/filepond-plugin-image-preview.min.css" rel="stylesheet" />
@@ -2000,11 +1999,6 @@ body.dark aside .current.selected {
2000
1999
  </a>
2001
2000
  <% }) %>
2002
2001
  <% } %>
2003
- <% if (readme) { %>
2004
- <div class='readme markdown-body'>
2005
- <div class='content'><%-readme%></div>
2006
- </div>
2007
- <% } %>
2008
2002
  </div>
2009
2003
  <%- include('partials/main_sidebar', { selected: 'home' }) %>
2010
2004
  </main>
@@ -8,7 +8,6 @@
8
8
  <link href="/css/solid.min.css" rel="stylesheet">
9
9
  <link href="/css/regular.min.css" rel="stylesheet">
10
10
  <link href="/css/brands.min.css" rel="stylesheet">
11
- <link href="/markdown.css" rel="stylesheet"/>
12
11
  <link href="/noty.css" rel="stylesheet"/>
13
12
  <link href="/filepond.min.css" rel="stylesheet" />
14
13
  <link href="/filepond-plugin-image-preview.min.css" rel="stylesheet" />
@@ -500,11 +499,6 @@ body.dark .open-menu, body.dark .browse {
500
499
  </a>
501
500
  <% }) %>
502
501
  <% } %>
503
- <% if (readme) { %>
504
- <div class='readme markdown-body'>
505
- <div class='content'><%-readme%></div>
506
- </div>
507
- <% } %>
508
502
  <% if (display.includes("onboarding")) { %>
509
503
  <!--
510
504
  <div class='container'>
@@ -0,0 +1,125 @@
1
+ const assert = require('node:assert/strict')
2
+ const fs = require('node:fs')
3
+ const http = require('node:http')
4
+ const os = require('node:os')
5
+ const path = require('node:path')
6
+ const test = require('node:test')
7
+ const express = require('express')
8
+ const Server = require('../server')
9
+
10
+ const viewsPath = path.resolve(__dirname, '..', 'server', 'views')
11
+
12
+ async function createDirectoryRendererFixture() {
13
+ const homedir = await fs.promises.mkdtemp(path.join(os.tmpdir(), 'pinokio-directory-readme-'))
14
+ const apiRoot = path.resolve(homedir, 'api')
15
+ const appRoot = path.resolve(apiRoot, 'demo')
16
+ await fs.promises.mkdir(appRoot, { recursive: true })
17
+ await fs.promises.writeFile(path.resolve(apiRoot, 'README.md'), '# ROOT README SENTINEL\n')
18
+ await fs.promises.writeFile(path.resolve(appRoot, 'README.md'), '# APP README SENTINEL\n')
19
+ await fs.promises.writeFile(path.resolve(appRoot, 'keep.txt'), 'keep\n')
20
+
21
+ const renderer = Object.create(Server.prototype)
22
+ renderer.kernel = {
23
+ homedir,
24
+ path: (...segments) => path.resolve(homedir, ...segments),
25
+ api: {
26
+ userdir: apiRoot,
27
+ proxies: {},
28
+ running: {},
29
+ launcher: async (name) => ({
30
+ script: null,
31
+ launcher_root: ''
32
+ })
33
+ },
34
+ dns: async ({ name }) => {
35
+ renderer.kernel.pinokio_configs[name] = { dns: { '@': [] } }
36
+ },
37
+ peer: {
38
+ host: '127.0.0.1',
39
+ check_peers: async () => {}
40
+ },
41
+ launch_complete: true,
42
+ pinokio_configs: {}
43
+ }
44
+ renderer.autolaunch = {
45
+ applyHomeStartingState: async () => false
46
+ }
47
+ renderer.portal = ''
48
+ renderer.install = ''
49
+ renderer.port = 0
50
+ renderer.theme = 'light'
51
+ renderer.logo = ''
52
+ renderer.cloudflare_pub = null
53
+ renderer.composePeerAccessPayload = async () => ({
54
+ peer_access_points: [],
55
+ peer_url: 'http://127.0.0.1:42000',
56
+ peer_qr: null,
57
+ peer_access_router_installed: false
58
+ })
59
+ renderer.current_urls = async () => ({})
60
+ renderer.getPeers = () => []
61
+
62
+ const app = express()
63
+ app.set('views', viewsPath)
64
+ app.set('view engine', 'ejs')
65
+ app.get('/home', (req, res, next) => {
66
+ renderer.render(req, res, [], {}).catch(next)
67
+ })
68
+ app.get('/_api/demo', (req, res, next) => {
69
+ req.query.mode = 'source'
70
+ renderer.render(req, res, ['demo']).catch(next)
71
+ })
72
+ app.get('/api/demo', (req, res, next) => {
73
+ renderer.render(req, res, ['demo']).catch(next)
74
+ })
75
+ app.use((error, req, res, next) => {
76
+ res.status(500).send(error.stack || error.message)
77
+ })
78
+
79
+ const httpServer = http.createServer(app)
80
+ await new Promise((resolve, reject) => {
81
+ httpServer.once('error', reject)
82
+ httpServer.listen(0, '127.0.0.1', resolve)
83
+ })
84
+ const address = httpServer.address()
85
+
86
+ return {
87
+ baseUrl: `http://127.0.0.1:${address.port}`,
88
+ close: async () => {
89
+ await new Promise((resolve, reject) => {
90
+ httpServer.close((error) => error ? reject(error) : resolve())
91
+ })
92
+ await fs.promises.rm(homedir, { recursive: true, force: true })
93
+ }
94
+ }
95
+ }
96
+
97
+ test('directory pages list README files without auto-rendering their contents', async () => {
98
+ const fixture = await createDirectoryRendererFixture()
99
+ try {
100
+ const [homeResponse, sourceResponse, runResponse] = await Promise.all([
101
+ fetch(`${fixture.baseUrl}/home`),
102
+ fetch(`${fixture.baseUrl}/_api/demo`),
103
+ fetch(`${fixture.baseUrl}/api/demo`)
104
+ ])
105
+ const [homeHtml, sourceHtml, runHtml] = await Promise.all([
106
+ homeResponse.text(),
107
+ sourceResponse.text(),
108
+ runResponse.text()
109
+ ])
110
+
111
+ assert.equal(homeResponse.status, 200, homeHtml)
112
+ assert.equal(sourceResponse.status, 200, sourceHtml)
113
+ assert.equal(runResponse.status, 200, runHtml)
114
+
115
+ assert.doesNotMatch(homeHtml, /ROOT README SENTINEL/)
116
+ for (const html of [sourceHtml, runHtml]) {
117
+ assert.doesNotMatch(html, /APP README SENTINEL/)
118
+ assert.match(html, /data-name="README\.md"/)
119
+ assert.match(html, /data-name="keep\.txt"/)
120
+ assert.doesNotMatch(html, /class=['"]readme markdown-body['"]/)
121
+ }
122
+ } finally {
123
+ await fixture.close()
124
+ }
125
+ })