pinokiod 8.0.22 → 8.0.30
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
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,
|
package/server/public/style.css
CHANGED
|
@@ -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>
|
package/server/views/index.ejs
CHANGED
|
@@ -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>
|
package/server/views/index2.ejs
CHANGED
|
@@ -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
|
+
})
|