most-box 0.3.0 → 0.3.2
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 +45 -24
- package/electron/main.js +19 -2
- package/electron/preload.cjs +8 -0
- package/out/admin/index.html +0 -0
- package/out/app/index.html +0 -0
- package/out/assets/AccountMenu-BgbcUc0m.js +1 -0
- package/out/assets/AppTop-DZFTO9-m.js +1 -0
- package/out/assets/CopyButton-B03fpFFc.js +1 -0
- package/out/assets/FilePreviewOverlay-CA04_Ved.js +1 -0
- package/out/assets/MarketingHeader-BVJy8hXd.js +1 -0
- package/out/assets/MarketingLayout-Cltu-DRw.js +1 -0
- package/out/assets/{MilkdownEditor-BTq9bDAf.js → MilkdownEditor-Dw_ze7EE.js} +92 -92
- package/out/assets/OpenSidebarButton-C2UJYXKh.js +1 -0
- package/out/assets/arrow-right-CXzRt0Fp.js +1 -0
- package/out/assets/chatJoinInvite-BcPz_IV5.js +1 -0
- package/out/assets/chatNoteDraft-CYbvcEvC.js +1 -0
- package/out/assets/check-iBCQl0yr.js +1 -0
- package/out/assets/circle-alert-dfN4T6Nq.js +1 -0
- package/out/assets/cobol-DHLQUbN7.js +1 -0
- package/out/assets/copy-B7pPZ2MP.js +1 -0
- package/out/assets/{dist-DCX0ws1K.js → dist-1jNICPWO.js} +1 -1
- package/out/assets/{dist-BAJKKN4w.js → dist-B3unnv5t.js} +1 -1
- package/out/assets/{dist-DJdv-Ma3.js → dist-B5MBMmGa.js} +1 -1
- package/out/assets/{dist-CMmmtl3f.js → dist-BAqJdUtV.js} +1 -1
- package/out/assets/{dist-C3lbe8SW.js → dist-BBJOmVU3.js} +1 -1
- package/out/assets/{dist-IN8WN7NI.js → dist-BV5CqsJD.js} +1 -1
- package/out/assets/{dist-DBnWo8ZP.js → dist-Ba7fxbV-.js} +1 -1
- package/out/assets/{dist-BzqqCPi2.js → dist-BxxtNKuo.js} +1 -1
- package/out/assets/{dist-DvWZsW-D.js → dist-C8Ue2rSs.js} +1 -1
- package/out/assets/{dist-C-Tg23jc.js → dist-CIn7Xx5U.js} +1 -1
- package/out/assets/{dist-CbTzBiwL.js → dist-CSyRxrry.js} +3 -3
- package/out/assets/{dist-DTL5jL08.js → dist-CZIuQqmV.js} +1 -1
- package/out/assets/{dist-8QDHqrPN.js → dist-CaaBTHCc.js} +1 -1
- package/out/assets/{dist-yZ96GF-e.js → dist-CgReC0ZE.js} +1 -1
- package/out/assets/{dist-D94V9Zlh.js → dist-Ct90qYA2.js} +1 -1
- package/out/assets/{dist-IGpXmkFm.js → dist-DIFFjNuO.js} +1 -1
- package/out/assets/{dist-CqQavSZV.js → dist-DUB2IhWu.js} +1 -1
- package/out/assets/{dist-B0JrbG7f.js → dist-DheA_Tyz.js} +1 -1
- package/out/assets/{dist-Br_5lLVO.js → dist-DyZh1ncm.js} +1 -1
- package/out/assets/{dist-BPs0Xns9.js → dist-E74uGTy3.js} +1 -1
- package/out/assets/{dist-BFSyuOuw.js → dist-K2s-Uj08.js} +1 -1
- package/out/assets/{dist-zyJb88Zz.js → dist-RU_cpjXQ.js} +1 -1
- package/out/assets/{dist-chOCTzB2.js → dist-eIeCvp_6.js} +1 -1
- package/out/assets/{dist-CfU9fwWz.js → dist-hEE2Ub__.js} +1 -1
- package/out/assets/download-COQOcPqI.js +1 -0
- package/out/assets/downloadValidation-Zvllo2SZ.js +1 -0
- package/out/assets/external-link-D6tHlYgS.js +1 -0
- package/out/assets/file-text-DiyIGL1I.js +1 -0
- package/out/assets/folder-DAcox9xz.js +1 -0
- package/out/assets/folder-open-Di0oALaC.js +1 -0
- package/out/assets/hard-drive-Cqa7Rstj.js +1 -0
- package/out/assets/index-B6acG3-t.css +1 -0
- package/out/assets/index-DjBN7bZV.js +31 -0
- package/out/assets/index.lazy-BUODxlbz.js +1 -0
- package/out/assets/index.lazy-Ba2rqd32.js +3 -0
- package/out/assets/index.lazy-Bdh8QUOx.js +1 -0
- package/out/assets/index.lazy-BfAHB94y.js +1 -0
- package/out/assets/index.lazy-Bo0LfJNK.js +2 -0
- package/out/assets/index.lazy-C9-w4fAF.js +3 -0
- package/out/assets/index.lazy-CNQbNKyf.js +1 -0
- package/out/assets/index.lazy-Cd0znkpY.js +1 -0
- package/out/assets/index.lazy-CtUrBLS0.js +1 -0
- package/out/assets/index.lazy-CyNgk0ta.js +1 -0
- package/out/assets/index.lazy-D3HxQTg_.js +1 -0
- package/out/assets/index.lazy-DSsE3iyf.js +1 -0
- package/out/assets/index.lazy-DWXndrGa.js +1 -0
- package/out/assets/index.lazy-Dk7cmQ-j.js +2 -0
- package/out/assets/key-round-JR8M3aHl.js +1 -0
- package/out/assets/loader-CwyHYZdX.js +1 -0
- package/out/assets/lock-CuwwlXlx.js +1 -0
- package/out/assets/message-square-BgsNXPft.js +1 -0
- package/out/assets/mp-Dv12gDTx.js +1 -0
- package/out/assets/music-Dn9nm9Qb.js +1 -0
- package/out/assets/notebook-pen-SWT-zZ4v.js +1 -0
- package/out/assets/play-CvWKSMwY.js +1 -0
- package/out/assets/refresh-cw-D4BsHvhi.js +1 -0
- package/out/assets/save-B02sbO9Y.js +1 -0
- package/out/assets/scheme-tChLYBuY.js +1 -0
- package/out/assets/search-HW4oPOBP.js +1 -0
- package/out/assets/send-4dhnJGuS.js +1 -0
- package/out/assets/shield-check-Boae7Nc6.js +1 -0
- package/out/assets/smartphone-JXH-zQXB.js +1 -0
- package/out/assets/textile-CyzeGT9J.js +1 -0
- package/out/assets/trash-2-BLwoM0ME.js +1 -0
- package/out/assets/triangle-alert-B9sMiA9l.js +1 -0
- package/out/assets/upload-DVuXJt_o.js +1 -0
- package/out/assets/useAppStore-DOnk608w.js +4 -0
- package/out/assets/{useChannelMessages-DOaWHdAP.js → useChannelMessages-CDvw-f_x.js} +1 -1
- package/out/assets/useGameRoom-B1_r6bc7.js +1 -0
- package/out/assets/userProfile-BZvkCuet.js +1 -0
- package/out/assets/wallet-D9Iw4YWE.js +1 -0
- package/out/assets/wifi-ljEI_ySA.js +1 -0
- package/out/chat/index.html +0 -0
- package/out/chat/join/demo/index.html +0 -0
- package/out/chat/join/index.html +0 -0
- package/out/download/index.html +2 -2
- package/out/game/gandengyan/index.html +0 -0
- package/out/game/index.html +0 -0
- package/out/game/zhajinhua/index.html +0 -0
- package/out/index.html +2 -2
- package/out/note/index.html +0 -0
- package/out/ping/index.html +2 -2
- package/out/profile/index.html +0 -0
- package/out/web3/index.html +0 -0
- package/package.json +28 -28
- package/server/index.js +3 -0
- package/server/src/config.js +0 -1
- package/server/src/core/gameRoom.js +12 -19
- package/server/src/http/app.js +2 -0
- package/server/src/http/routePolicy.js +1 -0
- package/server/src/http/routes/noteVaultRoutes.js +155 -0
- package/server/src/index.js +9 -0
- package/server/src/utils/accountBackup.js +8 -0
- package/server/src/utils/api.js +0 -14
- package/server/src/utils/auth.js +0 -7
- package/server/src/utils/avatar.js +6 -6
- package/server/src/utils/noteVault.js +522 -0
- package/electron/preload.js +0 -6
- package/out/assets/FilePreviewOverlay-CM5IqnZD.js +0 -1
- package/out/assets/LanguageToggle-CSQtRZ3A.js +0 -1
- package/out/assets/MarketingHeader-B45AaM29.js +0 -1
- package/out/assets/MarketingLayout-A00pEOa2.js +0 -1
- package/out/assets/MarketingThemeToggle-CIKP8x9W.js +0 -1
- package/out/assets/OpenSidebarButton-D8qfUGzU.js +0 -1
- package/out/assets/SidebarAccount-_RBE5K_o.js +0 -1
- package/out/assets/SidebarHomeLink-qMFEGjZt.js +0 -1
- package/out/assets/arrow-right-BU9c_SL4.js +0 -1
- package/out/assets/circle-alert-iuHzciph.js +0 -1
- package/out/assets/cobol-B_OZ4V-R.js +0 -1
- package/out/assets/copy-DEzFUzeX.js +0 -1
- package/out/assets/download-jEPn2njL.js +0 -1
- package/out/assets/downloadValidation-CSXwoQKW.js +0 -1
- package/out/assets/external-link-BFaoZeK0.js +0 -1
- package/out/assets/file-text-DPA1riJ_.js +0 -1
- package/out/assets/folder-Cfgc70_F.js +0 -1
- package/out/assets/hard-drive-Dar_AZEq.js +0 -1
- package/out/assets/i18n-NjvOSuV6.js +0 -1
- package/out/assets/index-BHZhApbo.css +0 -1
- package/out/assets/index-C-_ZwxuN.js +0 -31
- package/out/assets/index.lazy-0YYV0CR3.js +0 -1
- package/out/assets/index.lazy-BTYGr9Vb.js +0 -1
- package/out/assets/index.lazy-BVAtQtTa.js +0 -3
- package/out/assets/index.lazy-BbdLA2L-.js +0 -1
- package/out/assets/index.lazy-CbiLtziY.js +0 -1
- package/out/assets/index.lazy-CcEdBg3i.js +0 -2
- package/out/assets/index.lazy-CePHsLXG.js +0 -1
- package/out/assets/index.lazy-DG_3_VdF.js +0 -1
- package/out/assets/index.lazy-DR0rWEWZ.js +0 -2
- package/out/assets/index.lazy-DSyTSCJD.js +0 -1
- package/out/assets/index.lazy-DUhsuPLv.js +0 -1
- package/out/assets/index.lazy-DVnhWbzH.js +0 -1
- package/out/assets/index.lazy-DZpkg1DJ.js +0 -1
- package/out/assets/key-round-DNcpSuMw.js +0 -1
- package/out/assets/loader-BXQtdens.js +0 -1
- package/out/assets/lock-CLIE8cct.js +0 -1
- package/out/assets/message-square-Dp09WY1I.js +0 -1
- package/out/assets/mp-B6kdA94c.js +0 -1
- package/out/assets/music-B19Tg557.js +0 -1
- package/out/assets/notebook-pen-C8TlK5sB.js +0 -1
- package/out/assets/play-B-BjsTZz.js +0 -1
- package/out/assets/plus-4hygj-1Z.js +0 -1
- package/out/assets/save-BjrbPwhJ.js +0 -1
- package/out/assets/scheme-CyDdOh7e.js +0 -1
- package/out/assets/search-DSkiWdvX.js +0 -1
- package/out/assets/send-BL4d5iOt.js +0 -1
- package/out/assets/shield-check-DzDuWO8r.js +0 -1
- package/out/assets/smartphone-tRRFFO0a.js +0 -1
- package/out/assets/textile-DWBqthVk.js +0 -1
- package/out/assets/trash-2-V12tJ8lI.js +0 -1
- package/out/assets/triangle-alert-DGWc8ZHu.js +0 -1
- package/out/assets/ui-BpDGD3IR.js +0 -4
- package/out/assets/upload-CoCptKya.js +0 -1
- package/out/assets/useGameRoom-hHkV65ii.js +0 -1
- package/out/assets/userProfile-DwZip0Dt.js +0 -1
- package/out/assets/wallet-T7ONZ3Kg.js +0 -1
- package/out/assets/wifi-Bgo8eHY0.js +0 -1
|
@@ -0,0 +1,522 @@
|
|
|
1
|
+
import crypto from 'node:crypto'
|
|
2
|
+
import fs from 'node:fs/promises'
|
|
3
|
+
import fsSync from 'node:fs'
|
|
4
|
+
import path from 'node:path'
|
|
5
|
+
import { ConflictError, PathSecurityError, ValidationError } from './errors.js'
|
|
6
|
+
|
|
7
|
+
const CONFIG_FILE_NAME = 'note-vault.json'
|
|
8
|
+
const MARKDOWN_EXTENSION = '.md'
|
|
9
|
+
const EXCLUDED_DIRECTORY_NAMES = new Set(['node_modules'])
|
|
10
|
+
|
|
11
|
+
function getNoteVaultConfigPath(configDir) {
|
|
12
|
+
return path.join(configDir, CONFIG_FILE_NAME)
|
|
13
|
+
}
|
|
14
|
+
|
|
15
|
+
function isPathInside(parentPath, childPath) {
|
|
16
|
+
const relative = path.relative(parentPath, childPath)
|
|
17
|
+
return (
|
|
18
|
+
relative === '' ||
|
|
19
|
+
(!relative.startsWith('..') && !path.isAbsolute(relative))
|
|
20
|
+
)
|
|
21
|
+
}
|
|
22
|
+
|
|
23
|
+
function isDisallowedDirectoryName(name) {
|
|
24
|
+
return name.startsWith('.') || EXCLUDED_DIRECTORY_NAMES.has(name)
|
|
25
|
+
}
|
|
26
|
+
|
|
27
|
+
function toNativePath(relativePath) {
|
|
28
|
+
return relativePath.split('/').join(path.sep)
|
|
29
|
+
}
|
|
30
|
+
|
|
31
|
+
async function pathExists(filePath) {
|
|
32
|
+
try {
|
|
33
|
+
await fs.access(filePath)
|
|
34
|
+
return true
|
|
35
|
+
} catch {
|
|
36
|
+
return false
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
async function removeEmptyParentDirectories(vaultRealPath, startPath) {
|
|
41
|
+
let currentPath = startPath
|
|
42
|
+
|
|
43
|
+
while (isPathInside(vaultRealPath, currentPath) && currentPath !== vaultRealPath) {
|
|
44
|
+
try {
|
|
45
|
+
await fs.rmdir(currentPath)
|
|
46
|
+
} catch {
|
|
47
|
+
return
|
|
48
|
+
}
|
|
49
|
+
currentPath = path.dirname(currentPath)
|
|
50
|
+
}
|
|
51
|
+
}
|
|
52
|
+
|
|
53
|
+
async function getVaultDirectoryInfo(vaultPath, options = {}) {
|
|
54
|
+
const rawPath = String(vaultPath || '').trim()
|
|
55
|
+
if (!rawPath) {
|
|
56
|
+
throw new ValidationError(
|
|
57
|
+
'note vault is not configured',
|
|
58
|
+
'NOTE_VAULT_NOT_CONFIGURED'
|
|
59
|
+
)
|
|
60
|
+
}
|
|
61
|
+
|
|
62
|
+
const resolvedPath = path.resolve(rawPath)
|
|
63
|
+
let stat
|
|
64
|
+
try {
|
|
65
|
+
stat = await fs.stat(resolvedPath)
|
|
66
|
+
} catch {
|
|
67
|
+
throw new ValidationError(
|
|
68
|
+
'note vault directory does not exist',
|
|
69
|
+
'NOTE_VAULT_NOT_FOUND'
|
|
70
|
+
)
|
|
71
|
+
}
|
|
72
|
+
|
|
73
|
+
if (!stat.isDirectory()) {
|
|
74
|
+
throw new ValidationError(
|
|
75
|
+
'note vault path must be a directory',
|
|
76
|
+
'NOTE_VAULT_NOT_DIRECTORY'
|
|
77
|
+
)
|
|
78
|
+
}
|
|
79
|
+
|
|
80
|
+
const realPath = await fs.realpath(resolvedPath)
|
|
81
|
+
await fs.access(realPath, fsSync.constants.R_OK)
|
|
82
|
+
if (options.requireWritable) {
|
|
83
|
+
await fs.access(realPath, fsSync.constants.W_OK)
|
|
84
|
+
}
|
|
85
|
+
|
|
86
|
+
return { path: resolvedPath, realPath }
|
|
87
|
+
}
|
|
88
|
+
|
|
89
|
+
async function readNoteVaultConfig(configDir) {
|
|
90
|
+
try {
|
|
91
|
+
const raw = await fs.readFile(getNoteVaultConfigPath(configDir), 'utf8')
|
|
92
|
+
const parsed = JSON.parse(raw)
|
|
93
|
+
return {
|
|
94
|
+
vaultPath:
|
|
95
|
+
typeof parsed.vaultPath === 'string' ? parsed.vaultPath.trim() : '',
|
|
96
|
+
updatedAt:
|
|
97
|
+
typeof parsed.updatedAt === 'string' ? parsed.updatedAt : undefined,
|
|
98
|
+
}
|
|
99
|
+
} catch {
|
|
100
|
+
return { vaultPath: '' }
|
|
101
|
+
}
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
async function writeNoteVaultConfig(configDir, config) {
|
|
105
|
+
await fs.mkdir(configDir, { recursive: true })
|
|
106
|
+
const configPath = getNoteVaultConfigPath(configDir)
|
|
107
|
+
const tempPath = `${configPath}.${process.pid}.${Date.now()}.tmp`
|
|
108
|
+
await fs.writeFile(tempPath, JSON.stringify(config, null, 2), 'utf8')
|
|
109
|
+
await fs.rename(tempPath, configPath)
|
|
110
|
+
}
|
|
111
|
+
|
|
112
|
+
export function normalizeNoteVaultRelativePath(input) {
|
|
113
|
+
const raw = String(input || '').trim()
|
|
114
|
+
if (!raw) {
|
|
115
|
+
throw new ValidationError(
|
|
116
|
+
'note vault file path is required',
|
|
117
|
+
'NOTE_VAULT_PATH_REQUIRED'
|
|
118
|
+
)
|
|
119
|
+
}
|
|
120
|
+
if (raw.includes('\0')) {
|
|
121
|
+
throw new PathSecurityError('Invalid note vault path')
|
|
122
|
+
}
|
|
123
|
+
if (path.isAbsolute(raw) || path.win32.isAbsolute(raw)) {
|
|
124
|
+
throw new PathSecurityError('Absolute note vault paths are not allowed')
|
|
125
|
+
}
|
|
126
|
+
|
|
127
|
+
const slashPath = raw.replace(/\\/g, '/')
|
|
128
|
+
const normalized = path.posix.normalize(slashPath)
|
|
129
|
+
if (
|
|
130
|
+
normalized === '.' ||
|
|
131
|
+
normalized === '..' ||
|
|
132
|
+
normalized.startsWith('../')
|
|
133
|
+
) {
|
|
134
|
+
throw new PathSecurityError('Path traversal is not allowed')
|
|
135
|
+
}
|
|
136
|
+
|
|
137
|
+
const parts = normalized.split('/').filter(Boolean)
|
|
138
|
+
if (
|
|
139
|
+
parts.length === 0 ||
|
|
140
|
+
parts.some(part => part === '.' || part === '..' || !part.trim())
|
|
141
|
+
) {
|
|
142
|
+
throw new PathSecurityError('Invalid note vault path')
|
|
143
|
+
}
|
|
144
|
+
|
|
145
|
+
const directoryParts = parts.slice(0, -1)
|
|
146
|
+
if (directoryParts.some(isDisallowedDirectoryName)) {
|
|
147
|
+
throw new PathSecurityError('Hidden or excluded directories are not allowed')
|
|
148
|
+
}
|
|
149
|
+
|
|
150
|
+
const fileName = parts[parts.length - 1]
|
|
151
|
+
if (!fileName.toLowerCase().endsWith(MARKDOWN_EXTENSION)) {
|
|
152
|
+
throw new ValidationError(
|
|
153
|
+
'only Markdown files are allowed',
|
|
154
|
+
'NOTE_VAULT_MARKDOWN_REQUIRED'
|
|
155
|
+
)
|
|
156
|
+
}
|
|
157
|
+
|
|
158
|
+
return parts.join('/')
|
|
159
|
+
}
|
|
160
|
+
|
|
161
|
+
export async function configureNoteVault(configDir, vaultPath) {
|
|
162
|
+
const info = await getVaultDirectoryInfo(vaultPath, { requireWritable: true })
|
|
163
|
+
const config = {
|
|
164
|
+
vaultPath: info.realPath,
|
|
165
|
+
updatedAt: new Date().toISOString(),
|
|
166
|
+
}
|
|
167
|
+
await writeNoteVaultConfig(configDir, config)
|
|
168
|
+
return getNoteVaultStatus(configDir)
|
|
169
|
+
}
|
|
170
|
+
|
|
171
|
+
export async function getConfiguredNoteVaultPath(configDir) {
|
|
172
|
+
const config = await readNoteVaultConfig(configDir)
|
|
173
|
+
const info = await getVaultDirectoryInfo(config.vaultPath)
|
|
174
|
+
return info.realPath
|
|
175
|
+
}
|
|
176
|
+
|
|
177
|
+
export async function getNoteVaultStatus(configDir) {
|
|
178
|
+
const config = await readNoteVaultConfig(configDir)
|
|
179
|
+
if (!config.vaultPath) {
|
|
180
|
+
return {
|
|
181
|
+
configured: false,
|
|
182
|
+
vaultPath: '',
|
|
183
|
+
fileCount: 0,
|
|
184
|
+
writable: false,
|
|
185
|
+
}
|
|
186
|
+
}
|
|
187
|
+
|
|
188
|
+
try {
|
|
189
|
+
const info = await getVaultDirectoryInfo(config.vaultPath)
|
|
190
|
+
const files = await listMarkdownFiles(info.realPath)
|
|
191
|
+
const writable = await fs
|
|
192
|
+
.access(info.realPath, fsSync.constants.W_OK)
|
|
193
|
+
.then(() => true)
|
|
194
|
+
.catch(() => false)
|
|
195
|
+
return {
|
|
196
|
+
configured: true,
|
|
197
|
+
vaultPath: info.realPath,
|
|
198
|
+
fileCount: files.length,
|
|
199
|
+
writable,
|
|
200
|
+
updatedAt: config.updatedAt,
|
|
201
|
+
}
|
|
202
|
+
} catch (err) {
|
|
203
|
+
return {
|
|
204
|
+
configured: false,
|
|
205
|
+
vaultPath: config.vaultPath,
|
|
206
|
+
fileCount: 0,
|
|
207
|
+
writable: false,
|
|
208
|
+
error: err instanceof Error ? err.message : 'note vault unavailable',
|
|
209
|
+
}
|
|
210
|
+
}
|
|
211
|
+
}
|
|
212
|
+
|
|
213
|
+
export async function listMarkdownFiles(vaultPath) {
|
|
214
|
+
const info = await getVaultDirectoryInfo(vaultPath)
|
|
215
|
+
const files = []
|
|
216
|
+
|
|
217
|
+
async function scanDirectory(currentPath, relativeParts = []) {
|
|
218
|
+
const entries = await fs.readdir(currentPath, { withFileTypes: true })
|
|
219
|
+
|
|
220
|
+
for (const entry of entries) {
|
|
221
|
+
if (entry.isSymbolicLink()) continue
|
|
222
|
+
if (entry.isDirectory()) {
|
|
223
|
+
if (isDisallowedDirectoryName(entry.name)) continue
|
|
224
|
+
const directoryPath = path.join(currentPath, entry.name)
|
|
225
|
+
const realDirectoryPath = await fs.realpath(directoryPath)
|
|
226
|
+
if (!isPathInside(info.realPath, realDirectoryPath)) continue
|
|
227
|
+
await scanDirectory(realDirectoryPath, [...relativeParts, entry.name])
|
|
228
|
+
continue
|
|
229
|
+
}
|
|
230
|
+
|
|
231
|
+
if (!entry.isFile()) continue
|
|
232
|
+
if (!entry.name.toLowerCase().endsWith(MARKDOWN_EXTENSION)) continue
|
|
233
|
+
|
|
234
|
+
const filePath = path.join(currentPath, entry.name)
|
|
235
|
+
const realFilePath = await fs.realpath(filePath)
|
|
236
|
+
if (!isPathInside(info.realPath, realFilePath)) continue
|
|
237
|
+
|
|
238
|
+
const stat = await fs.stat(realFilePath)
|
|
239
|
+
const relativePath = [...relativeParts, entry.name].join('/')
|
|
240
|
+
files.push({
|
|
241
|
+
path: relativePath,
|
|
242
|
+
name: entry.name,
|
|
243
|
+
directory: relativeParts.join('/'),
|
|
244
|
+
size: stat.size,
|
|
245
|
+
mtimeMs: stat.mtimeMs,
|
|
246
|
+
})
|
|
247
|
+
}
|
|
248
|
+
}
|
|
249
|
+
|
|
250
|
+
await scanDirectory(info.realPath)
|
|
251
|
+
return files.sort((left, right) => left.path.localeCompare(right.path))
|
|
252
|
+
}
|
|
253
|
+
|
|
254
|
+
export async function readMarkdownFile(vaultPath, relativePath) {
|
|
255
|
+
const info = await getVaultDirectoryInfo(vaultPath)
|
|
256
|
+
const normalizedPath = normalizeNoteVaultRelativePath(relativePath)
|
|
257
|
+
const targetPath = path.resolve(info.realPath, toNativePath(normalizedPath))
|
|
258
|
+
|
|
259
|
+
let realFilePath
|
|
260
|
+
try {
|
|
261
|
+
realFilePath = await fs.realpath(targetPath)
|
|
262
|
+
} catch {
|
|
263
|
+
throw new ValidationError(
|
|
264
|
+
'note vault file not found',
|
|
265
|
+
'NOTE_VAULT_FILE_NOT_FOUND'
|
|
266
|
+
)
|
|
267
|
+
}
|
|
268
|
+
|
|
269
|
+
if (!isPathInside(info.realPath, realFilePath)) {
|
|
270
|
+
throw new PathSecurityError('Note vault file escapes the configured vault')
|
|
271
|
+
}
|
|
272
|
+
|
|
273
|
+
const stat = await fs.stat(realFilePath)
|
|
274
|
+
if (!stat.isFile()) {
|
|
275
|
+
throw new ValidationError(
|
|
276
|
+
'note vault path is not a file',
|
|
277
|
+
'NOTE_VAULT_NOT_FILE'
|
|
278
|
+
)
|
|
279
|
+
}
|
|
280
|
+
|
|
281
|
+
return {
|
|
282
|
+
path: normalizedPath,
|
|
283
|
+
name: path.posix.basename(normalizedPath),
|
|
284
|
+
directory: path.posix.dirname(normalizedPath) === '.'
|
|
285
|
+
? ''
|
|
286
|
+
: path.posix.dirname(normalizedPath),
|
|
287
|
+
content: await fs.readFile(realFilePath, 'utf8'),
|
|
288
|
+
size: stat.size,
|
|
289
|
+
mtimeMs: stat.mtimeMs,
|
|
290
|
+
}
|
|
291
|
+
}
|
|
292
|
+
|
|
293
|
+
async function getWritableMarkdownTarget(vaultPath, relativePath) {
|
|
294
|
+
const info = await getVaultDirectoryInfo(vaultPath, { requireWritable: true })
|
|
295
|
+
const normalizedPath = normalizeNoteVaultRelativePath(relativePath)
|
|
296
|
+
const targetPath = path.resolve(info.realPath, toNativePath(normalizedPath))
|
|
297
|
+
const parentPath = path.dirname(targetPath)
|
|
298
|
+
|
|
299
|
+
await fs.mkdir(parentPath, { recursive: true })
|
|
300
|
+
const realParentPath = await fs.realpath(parentPath)
|
|
301
|
+
if (!isPathInside(info.realPath, realParentPath)) {
|
|
302
|
+
throw new PathSecurityError('Note vault file escapes the configured vault')
|
|
303
|
+
}
|
|
304
|
+
|
|
305
|
+
if (await pathExists(targetPath)) {
|
|
306
|
+
const targetStat = await fs.lstat(targetPath)
|
|
307
|
+
if (targetStat.isSymbolicLink()) {
|
|
308
|
+
throw new PathSecurityError('Symlink Markdown files are not writable')
|
|
309
|
+
}
|
|
310
|
+
if (!targetStat.isFile()) {
|
|
311
|
+
throw new ValidationError(
|
|
312
|
+
'note vault path is not a file',
|
|
313
|
+
'NOTE_VAULT_NOT_FILE'
|
|
314
|
+
)
|
|
315
|
+
}
|
|
316
|
+
const realTargetPath = await fs.realpath(targetPath)
|
|
317
|
+
if (!isPathInside(info.realPath, realTargetPath)) {
|
|
318
|
+
throw new PathSecurityError(
|
|
319
|
+
'Note vault file escapes the configured vault'
|
|
320
|
+
)
|
|
321
|
+
}
|
|
322
|
+
}
|
|
323
|
+
|
|
324
|
+
return { info, normalizedPath, targetPath, parentPath }
|
|
325
|
+
}
|
|
326
|
+
|
|
327
|
+
export async function createMarkdownFile(vaultPath, relativePath, content) {
|
|
328
|
+
const { info, normalizedPath, targetPath } =
|
|
329
|
+
await getWritableMarkdownTarget(vaultPath, relativePath)
|
|
330
|
+
if (await pathExists(targetPath)) {
|
|
331
|
+
throw new ConflictError('note vault file already exists')
|
|
332
|
+
}
|
|
333
|
+
return writeMarkdownFile(info.realPath, normalizedPath, content)
|
|
334
|
+
}
|
|
335
|
+
|
|
336
|
+
export async function writeMarkdownFile(vaultPath, relativePath, content) {
|
|
337
|
+
const { info, normalizedPath, targetPath, parentPath } =
|
|
338
|
+
await getWritableMarkdownTarget(vaultPath, relativePath)
|
|
339
|
+
|
|
340
|
+
const tempPath = path.join(
|
|
341
|
+
parentPath,
|
|
342
|
+
`.${path.basename(targetPath)}.${process.pid}.${Date.now()}.${crypto
|
|
343
|
+
.randomBytes(4)
|
|
344
|
+
.toString('hex')}.tmp`
|
|
345
|
+
)
|
|
346
|
+
|
|
347
|
+
try {
|
|
348
|
+
await fs.writeFile(tempPath, String(content ?? ''), 'utf8')
|
|
349
|
+
await fs.rename(tempPath, targetPath)
|
|
350
|
+
} catch (err) {
|
|
351
|
+
await fs.rm(tempPath, { force: true }).catch(() => {})
|
|
352
|
+
throw err
|
|
353
|
+
}
|
|
354
|
+
|
|
355
|
+
return readMarkdownFile(info.realPath, normalizedPath)
|
|
356
|
+
}
|
|
357
|
+
|
|
358
|
+
export async function moveMarkdownFile(
|
|
359
|
+
vaultPath,
|
|
360
|
+
fromRelativePath,
|
|
361
|
+
toRelativePath
|
|
362
|
+
) {
|
|
363
|
+
const info = await getVaultDirectoryInfo(vaultPath, { requireWritable: true })
|
|
364
|
+
const fromPath = normalizeNoteVaultRelativePath(fromRelativePath)
|
|
365
|
+
const toPath = normalizeNoteVaultRelativePath(toRelativePath)
|
|
366
|
+
if (fromPath === toPath) return readMarkdownFile(info.realPath, fromPath)
|
|
367
|
+
|
|
368
|
+
const sourcePath = path.resolve(info.realPath, toNativePath(fromPath))
|
|
369
|
+
const targetPath = path.resolve(info.realPath, toNativePath(toPath))
|
|
370
|
+
const targetParentPath = path.dirname(targetPath)
|
|
371
|
+
|
|
372
|
+
let sourceStat
|
|
373
|
+
try {
|
|
374
|
+
sourceStat = await fs.lstat(sourcePath)
|
|
375
|
+
} catch {
|
|
376
|
+
throw new ValidationError(
|
|
377
|
+
'note vault file not found',
|
|
378
|
+
'NOTE_VAULT_FILE_NOT_FOUND'
|
|
379
|
+
)
|
|
380
|
+
}
|
|
381
|
+
|
|
382
|
+
if (sourceStat.isSymbolicLink()) {
|
|
383
|
+
throw new PathSecurityError('Symlink Markdown files are not writable')
|
|
384
|
+
}
|
|
385
|
+
if (!sourceStat.isFile()) {
|
|
386
|
+
throw new ValidationError(
|
|
387
|
+
'note vault path is not a file',
|
|
388
|
+
'NOTE_VAULT_NOT_FILE'
|
|
389
|
+
)
|
|
390
|
+
}
|
|
391
|
+
|
|
392
|
+
const realSourcePath = await fs.realpath(sourcePath)
|
|
393
|
+
if (!isPathInside(info.realPath, realSourcePath)) {
|
|
394
|
+
throw new PathSecurityError('Note vault file escapes the configured vault')
|
|
395
|
+
}
|
|
396
|
+
|
|
397
|
+
if (await pathExists(targetPath)) {
|
|
398
|
+
throw new ConflictError('note vault target already exists')
|
|
399
|
+
}
|
|
400
|
+
|
|
401
|
+
await fs.mkdir(targetParentPath, { recursive: true })
|
|
402
|
+
const realTargetParentPath = await fs.realpath(targetParentPath)
|
|
403
|
+
if (!isPathInside(info.realPath, realTargetParentPath)) {
|
|
404
|
+
throw new PathSecurityError('Note vault file escapes the configured vault')
|
|
405
|
+
}
|
|
406
|
+
|
|
407
|
+
await fs.rename(realSourcePath, targetPath)
|
|
408
|
+
await removeEmptyParentDirectories(info.realPath, path.dirname(realSourcePath))
|
|
409
|
+
return readMarkdownFile(info.realPath, toPath)
|
|
410
|
+
}
|
|
411
|
+
|
|
412
|
+
export async function deleteMarkdownFile(vaultPath, relativePath) {
|
|
413
|
+
const info = await getVaultDirectoryInfo(vaultPath, { requireWritable: true })
|
|
414
|
+
const normalizedPath = normalizeNoteVaultRelativePath(relativePath)
|
|
415
|
+
const targetPath = path.resolve(info.realPath, toNativePath(normalizedPath))
|
|
416
|
+
|
|
417
|
+
let stat
|
|
418
|
+
try {
|
|
419
|
+
stat = await fs.lstat(targetPath)
|
|
420
|
+
} catch {
|
|
421
|
+
throw new ValidationError(
|
|
422
|
+
'note vault file not found',
|
|
423
|
+
'NOTE_VAULT_FILE_NOT_FOUND'
|
|
424
|
+
)
|
|
425
|
+
}
|
|
426
|
+
|
|
427
|
+
if (stat.isSymbolicLink()) {
|
|
428
|
+
throw new PathSecurityError('Symlink Markdown files are not writable')
|
|
429
|
+
}
|
|
430
|
+
if (!stat.isFile()) {
|
|
431
|
+
throw new ValidationError(
|
|
432
|
+
'note vault path is not a file',
|
|
433
|
+
'NOTE_VAULT_NOT_FILE'
|
|
434
|
+
)
|
|
435
|
+
}
|
|
436
|
+
|
|
437
|
+
const realFilePath = await fs.realpath(targetPath)
|
|
438
|
+
if (!isPathInside(info.realPath, realFilePath)) {
|
|
439
|
+
throw new PathSecurityError('Note vault file escapes the configured vault')
|
|
440
|
+
}
|
|
441
|
+
|
|
442
|
+
await fs.unlink(realFilePath)
|
|
443
|
+
await removeEmptyParentDirectories(info.realPath, path.dirname(realFilePath))
|
|
444
|
+
return { path: normalizedPath, deleted: true }
|
|
445
|
+
}
|
|
446
|
+
|
|
447
|
+
export async function createNoteVaultSnapshot(vaultPath) {
|
|
448
|
+
const files = await listMarkdownFiles(vaultPath)
|
|
449
|
+
const snapshotFiles = []
|
|
450
|
+
|
|
451
|
+
for (const file of files) {
|
|
452
|
+
const content = await readMarkdownFile(vaultPath, file.path)
|
|
453
|
+
snapshotFiles.push({
|
|
454
|
+
path: content.path,
|
|
455
|
+
content: content.content,
|
|
456
|
+
size: content.size,
|
|
457
|
+
mtimeMs: content.mtimeMs,
|
|
458
|
+
})
|
|
459
|
+
}
|
|
460
|
+
|
|
461
|
+
return { files: snapshotFiles }
|
|
462
|
+
}
|
|
463
|
+
|
|
464
|
+
function normalizeSnapshotFiles(input) {
|
|
465
|
+
const files = Array.isArray(input?.files) ? input.files : []
|
|
466
|
+
const byPath = new Map()
|
|
467
|
+
|
|
468
|
+
for (const file of files) {
|
|
469
|
+
if (!file || typeof file !== 'object') continue
|
|
470
|
+
const normalizedPath = normalizeNoteVaultRelativePath(file.path)
|
|
471
|
+
byPath.set(normalizedPath, {
|
|
472
|
+
path: normalizedPath,
|
|
473
|
+
content: String(file.content ?? ''),
|
|
474
|
+
})
|
|
475
|
+
}
|
|
476
|
+
|
|
477
|
+
return [...byPath.values()].sort((left, right) =>
|
|
478
|
+
left.path.localeCompare(right.path)
|
|
479
|
+
)
|
|
480
|
+
}
|
|
481
|
+
|
|
482
|
+
export async function restoreNoteVaultSnapshot(vaultPath, snapshotInput) {
|
|
483
|
+
const info = await getVaultDirectoryInfo(vaultPath, { requireWritable: true })
|
|
484
|
+
const snapshotFiles = normalizeSnapshotFiles(snapshotInput)
|
|
485
|
+
const snapshotPaths = new Set(snapshotFiles.map(file => file.path))
|
|
486
|
+
const currentFiles = await listMarkdownFiles(info.realPath)
|
|
487
|
+
const result = {
|
|
488
|
+
created: 0,
|
|
489
|
+
updated: 0,
|
|
490
|
+
deleted: 0,
|
|
491
|
+
skipped: 0,
|
|
492
|
+
files: snapshotFiles.length,
|
|
493
|
+
}
|
|
494
|
+
|
|
495
|
+
for (const currentFile of currentFiles) {
|
|
496
|
+
if (snapshotPaths.has(currentFile.path)) continue
|
|
497
|
+
await deleteMarkdownFile(info.realPath, currentFile.path)
|
|
498
|
+
result.deleted += 1
|
|
499
|
+
}
|
|
500
|
+
|
|
501
|
+
for (const snapshotFile of snapshotFiles) {
|
|
502
|
+
let existing = null
|
|
503
|
+
try {
|
|
504
|
+
existing = await readMarkdownFile(info.realPath, snapshotFile.path)
|
|
505
|
+
} catch {}
|
|
506
|
+
|
|
507
|
+
if (existing?.content === snapshotFile.content) {
|
|
508
|
+
result.skipped += 1
|
|
509
|
+
continue
|
|
510
|
+
}
|
|
511
|
+
|
|
512
|
+
await writeMarkdownFile(
|
|
513
|
+
info.realPath,
|
|
514
|
+
snapshotFile.path,
|
|
515
|
+
snapshotFile.content
|
|
516
|
+
)
|
|
517
|
+
if (existing) result.updated += 1
|
|
518
|
+
else result.created += 1
|
|
519
|
+
}
|
|
520
|
+
|
|
521
|
+
return result
|
|
522
|
+
}
|
package/electron/preload.js
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";import{C as r,S as i}from"./ui-BpDGD3IR.js";import{a}from"./i18n-NjvOSuV6.js";import{t as o}from"./file-text-DPA1riJ_.js";import{t as s}from"./loader-BXQtdens.js";import{t as c}from"./music-B19Tg557.js";import{m as l}from"./index-C-_ZwxuN.js";var u=r(`film`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M7 3v18`,key:`bbkbws`}],[`path`,{d:`M3 7.5h4`,key:`zfgn84`}],[`path`,{d:`M3 12h18`,key:`1i2n21`}],[`path`,{d:`M3 16.5h4`,key:`1230mu`}],[`path`,{d:`M17 3v18`,key:`in4fa5`}],[`path`,{d:`M17 7.5h4`,key:`myr1c1`}],[`path`,{d:`M17 16.5h4`,key:`go4c1d`}]]),d=r(`image`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,ry:`2`,key:`1m3agn`}],[`circle`,{cx:`9`,cy:`9`,r:`2`,key:`af1f0g`}],[`path`,{d:`m21 15-3.086-3.086a2 2 0 0 0-2.828 0L6 21`,key:`1xmnt7`}]]),f=r(`pen`,[[`path`,{d:`M21.174 6.812a1 1 0 0 0-3.986-3.987L3.842 16.174a2 2 0 0 0-.5.83l-1.321 4.352a.5.5 0 0 0 .623.622l4.353-1.32a2 2 0 0 0 .83-.497z`,key:`1a8usu`}]]);function p(e){let t=String(e||``).split(`.`).pop()?.toLowerCase()||``,n=[`jpg`,`jpeg`,`png`,`gif`,`webp`,`svg`,`bmp`,`ico`,`tiff`,`heic`,`heif`],r=[`mp4`,`webm`,`mov`,`avi`,`mkv`,`flv`,`wmv`,`m4v`,`mpeg`,`3gp`],i=[`mp3`,`wav`,`ogg`,`flac`,`aac`,`m4a`,`wma`,`opus`],a=`txt.md.js.ts.jsx.tsx.css.scss.less.json.xml.html.htm.yaml.yml.toml.ini.cfg.conf.log.sh.bash.py.rb.go.rs.java.c.cpp.h.hpp.cs.php.sql.graphql.env.gitignore.dockerfile.readme`.split(`.`);return n.includes(t)?`image`:r.includes(t)?`video`:i.includes(t)?`audio`:a.includes(t)?`text`:`file`}var m=t(e(),1),h=n();function g(e){return e===`image`||e===`video`||e===`audio`}function _({item:e,isBackendReady:t,getFileDownloadUrl:n,onClose:r}){let{t:u}=a(),[d,f]=(0,m.useState)(``),[p,_]=(0,m.useState)(!1),[v,y]=(0,m.useState)(``),[b,x]=(0,m.useState)(``);return(0,m.useEffect)(()=>{if(e.subtype!==`text`)return;let r=!1;if(f(``),x(``),!t){f(u(`preview.loadFailed`));return}return _(!0),(async()=>{try{let t=await fetch(n(e.cid),{headers:{...await l(`GET`,`/api/files/${e.cid}/download`),Range:`bytes=0-9999`}});if(!t.ok)throw Error(u(`preview.loadFailed`));let i=await t.text();r||f(i||u(`preview.emptyFile`))}catch{r||f(u(`preview.loadFailed`))}finally{r||_(!1)}})(),()=>{r=!0}},[n,t,e.cid,e.subtype]),(0,m.useEffect)(()=>{if(!g(e.subtype)){y(``);return}if(y(``),x(``),!t){x(u(`preview.loadFailed`));return}let r=``,i=!1;return(async()=>{try{let t=await fetch(n(e.cid),{headers:await l(`GET`,`/api/files/${e.cid}/download`)});if(!t.ok)throw Error(u(`preview.loadFailed`));let a=URL.createObjectURL(await t.blob());r=a,i||y(a)}catch{i||x(u(`preview.loadFailed`))}})(),()=>{i=!0,r&&URL.revokeObjectURL(r)}},[n,t,e.cid,e.subtype]),(0,h.jsxs)(`div`,{className:`preview-overlay`,onClick:r,children:[(0,h.jsx)(`button`,{type:`button`,className:`preview-close`,onClick:r,"aria-label":u(`preview.close`),children:(0,h.jsx)(i,{size:20})}),(0,h.jsxs)(`div`,{onClick:e=>e.stopPropagation(),children:[e.subtype===`image`&&(0,h.jsx)(`div`,{className:`preview-media-wrapper`,children:v?(0,h.jsx)(`img`,{src:v,alt:e.fileName,translate:`no`}):b?(0,h.jsxs)(`div`,{className:`preview-unsupported`,children:[(0,h.jsx)(o,{size:48,className:`preview-file-icon`}),(0,h.jsx)(`p`,{translate:`no`,children:e.fileName}),(0,h.jsx)(`p`,{className:`preview-unsupported-hint`,children:b})]}):(0,h.jsx)(`div`,{className:`preview-loading`,children:(0,h.jsx)(`div`,{className:`preview-loading-spinner`})})}),e.subtype===`video`&&(0,h.jsx)(`div`,{className:`preview-media-wrapper`,children:v?(0,h.jsx)(`video`,{src:v,controls:!0}):b?(0,h.jsxs)(`div`,{className:`preview-unsupported`,children:[(0,h.jsx)(o,{size:48,className:`preview-file-icon`}),(0,h.jsx)(`p`,{translate:`no`,children:e.fileName}),(0,h.jsx)(`p`,{className:`preview-unsupported-hint`,children:b})]}):(0,h.jsx)(`div`,{className:`preview-loading`,children:(0,h.jsx)(`div`,{className:`preview-loading-spinner`})})}),e.subtype===`audio`&&(0,h.jsxs)(`div`,{className:`preview-audio`,children:[(0,h.jsx)(`div`,{className:`preview-audio-icon`,children:(0,h.jsx)(c,{size:36,color:`var(--accent)`})}),(0,h.jsx)(`p`,{className:`preview-audio-filename`,translate:`no`,children:e.fileName}),v?(0,h.jsx)(`audio`,{className:`preview-audio-player`,src:v,controls:!0}):(0,h.jsx)(`div`,{className:`preview-text-loading`,children:b?(0,h.jsx)(`p`,{children:b}):(0,h.jsxs)(h.Fragment,{children:[(0,h.jsx)(s,{size:24,className:`preview-text-spinner`}),(0,h.jsx)(`p`,{children:u(`preview.audioLoading`)})]})})]}),e.subtype===`file`&&(0,h.jsxs)(`div`,{className:`preview-unsupported`,children:[(0,h.jsx)(o,{size:48,className:`preview-file-icon`}),(0,h.jsx)(`p`,{translate:`no`,children:e.fileName}),(0,h.jsx)(`p`,{className:`preview-unsupported-hint`,children:u(`preview.unsupported`)})]}),e.subtype===`text`&&(0,h.jsxs)(`div`,{className:`preview-text-container`,children:[(0,h.jsx)(`div`,{className:`preview-text-header`,children:(0,h.jsx)(`span`,{translate:`no`,children:e.fileName})}),p?(0,h.jsxs)(`div`,{className:`preview-text-loading`,children:[(0,h.jsx)(s,{size:24,className:`preview-text-spinner`}),(0,h.jsx)(`p`,{children:u(`preview.textLoading`)}),(0,h.jsx)(`p`,{className:`preview-text-loading-hint`,children:u(`preview.firstSyncHint`)})]}):(0,h.jsx)(`pre`,{className:`preview-text`,translate:`no`,children:d||u(`preview.emptyFile`)})]})]})]})}export{u as a,d as i,p as n,f as r,_ as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./jsx-runtime-Bt-cYkS5.js";import{C as t,t as n}from"./ui-BpDGD3IR.js";import{a as r,c as i,o as a}from"./i18n-NjvOSuV6.js";var o=t(`check`,[[`path`,{d:`M20 6 9 17l-5-5`,key:`1gmf2c`}]]),s=t(`languages`,[[`path`,{d:`m5 8 6 6`,key:`1wu5hv`}],[`path`,{d:`m4 14 6-6 2-3`,key:`1k1g8d`}],[`path`,{d:`M2 5h12`,key:`or177f`}],[`path`,{d:`M7 2h1`,key:`1t2jsx`}],[`path`,{d:`m22 22-5-10-5 10`,key:`don7ne`}],[`path`,{d:`M14 18h6`,key:`1m8k6r`}]]),c=t(`moon`,[[`path`,{d:`M20.985 12.486a9 9 0 1 1-9.473-9.472c.405-.022.617.46.402.803a6 6 0 0 0 8.268 8.268c.344-.215.825-.004.803.401`,key:`kfwtm`}]]),l=t(`sun`,[[`circle`,{cx:`12`,cy:`12`,r:`4`,key:`4exip2`}],[`path`,{d:`M12 2v2`,key:`tus03m`}],[`path`,{d:`M12 20v2`,key:`1lh1kg`}],[`path`,{d:`m4.93 4.93 1.41 1.41`,key:`149t6j`}],[`path`,{d:`m17.66 17.66 1.41 1.41`,key:`ptbguv`}],[`path`,{d:`M2 12h2`,key:`1t8f8n`}],[`path`,{d:`M20 12h2`,key:`1q8mjw`}],[`path`,{d:`m6.34 17.66-1.41 1.41`,key:`1m8zz5`}],[`path`,{d:`m19.07 4.93-1.41 1.41`,key:`1shlcs`}]]),u=e();function d({className:e=``}){let{locale:t,localeName:c,setLocale:l,t:d}=r(),f=d(`common.locale.choose`),p=`${f} (${d(`common.locale.current`)}: ${c})`;return(0,u.jsx)(n,{ariaLabel:f,placement:`bottom-end`,items:a.map(e=>({key:e,label:i[e],icon:e===t?(0,u.jsx)(o,{size:16}):(0,u.jsx)(`span`,{"aria-hidden":`true`}),onSelect:()=>{e!==t&&l(e)}})),renderTrigger:t=>(0,u.jsx)(`button`,{...t,className:[`language-toggle`,e].filter(Boolean).join(` `),"aria-label":f,title:p,children:(0,u.jsx)(s,{size:16})})})}export{o as i,l as n,c as r,d as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./jsx-runtime-Bt-cYkS5.js";import{t}from"./LanguageToggle-CSQtRZ3A.js";import{I as n,j as r}from"./index-C-_ZwxuN.js";import{t as i}from"./MarketingThemeToggle-CIKP8x9W.js";var a=e();function o(){return(0,a.jsx)(`nav`,{className:`mkt-nav`,children:(0,a.jsxs)(`div`,{className:`mkt-nav-inner`,children:[(0,a.jsxs)(`button`,{type:`button`,className:`mkt-nav-logo`,onClick:r(),children:[(0,a.jsx)(n,{size:18}),(0,a.jsx)(`span`,{children:`MOST PEOPLE`})]}),(0,a.jsxs)(`div`,{className:`mkt-nav-cta`,children:[(0,a.jsx)(i,{}),(0,a.jsx)(t,{className:`mkt-theme-toggle`})]})]})})}export{o as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./jsx-runtime-Bt-cYkS5.js";import{D as t,o as n,s as r}from"./ui-BpDGD3IR.js";import{a as i}from"./i18n-NjvOSuV6.js";import{t as a}from"./LanguageToggle-CSQtRZ3A.js";import{t as o}from"./download-jEPn2njL.js";import{i as s}from"./index-C-_ZwxuN.js";import{t as c}from"./MarketingThemeToggle-CIKP8x9W.js";import{t as l}from"./LogoIcon-B2fFe0l1.js";var u={name:`most-box`,version:`0.3.0`,description:`MostBox - P2P file sharing application`,type:`module`,main:`electron/main.js`,bin:{"most-box":`server/cli.js`},files:[`out`,`public`,`electron`,`server/src`,`server/index.js`,`server/cli.js`],scripts:{start:`vite`,server:`node --watch server/index.js`,dev:`vite`,build:`vite build && node scripts/prepare-start-static.mjs`,preview:`vite preview`,serve:`npm run build && node server/index.js`,test:`node --test server/tests/**/*.test.js`,"test:unit":`node --test server/tests/unit/*.test.js`,"test:desktop":`node --test electron/*.test.js`,"test:frontend":`node --test src/tests/*.test.js`,"test:protocol":`node --test --test-name-pattern "extracts CID and filename|matches golden CID samples|publishes a file from Buffer|lists published files|pulls through local seed nodes" server/tests/unit/cid.test.js server/tests/integration/cid.test.js server/tests/integration/engine.test.js`,android:`npm --prefix mobile/android start`,"android:build":`npm --prefix mobile/android run apk`,"android:test":`npm --prefix mobile/android test`,typecheck:`tsc -p tsconfig.typecheck.json`,"typecheck:strict-router":`tsc -p tsconfig.strict-router.json`,"check:static-output":`node scripts/check-static-output.mjs`,format:`npx prettier --write .`,lint:`npx eslint .`,"r2:cors":`node scripts/configure-r2-cors.mjs`,"electron:dev":`concurrently "npm run build" "wait-on out/index.html && electron ."`,"electron:rebuild":`electron-rebuild -f -w sodium-native`,"electron:build":`npm run build && npm run electron:rebuild && electron-builder`,"electron:build:win":`npm run build && npm run electron:rebuild && electron-builder --win`,"electron:build:win:x64":`npm run electron:build:win -- --x64`,"electron:build:win:arm64":`npm run electron:build:win -- --arm64`,"electron:build:mac":`npm run build && npm run electron:rebuild && electron-builder --mac`,"electron:build:linux":`npm run build && npm run electron:rebuild && electron-builder --linux`},keywords:[`p2p`,`file-sharing`,`hyperswarm`,`hyperdrive`],license:`MIT`,dependencies:{"@dicebear/collection":`^9.4.2`,"@dicebear/core":`^9.4.2`,"@hono/node-server":`^2.0.4`,"@tanstack/react-router":`^1.170.15`,"@tanstack/react-start":`^1.168.25`,b4a:`^1.8.1`,busboy:`^1.6.0`,corestore:`^7.10.0`,dayjs:`^1.11.21`,ethers:`^6.16.0`,eventemitter3:`^5.0.4`,hono:`^4.12.23`,hypercore:`^11.33.1`,hyperdrive:`^13.3.2`,hyperswarm:`^4.17.0`,"ipfs-unixfs-importer":`^17.0.1`,multiformats:`^14.0.0`,tweetnacl:`^1.0.3`,ws:`^8.21.0`},devDependencies:{"@electron/rebuild":`^4.0.4`,"@eslint/js":`^10.0.1`,"@iconify/react":`^6.0.2`,"@mantine/hooks":`^9.3.0`,"@milkdown/crepe":`^7.21.2`,"@milkdown/utils":`^7.21.2`,"@types/react":`^19.2.16`,"@vitejs/plugin-react":`^6.0.2`,concurrently:`^10.0.3`,electron:`^42.3.3`,"electron-builder":`^26.8.1`,esbuild:`^0.28.0`,eslint:`^10.4.1`,globals:`^17.6.0`,ky:`^2.0.2`,"lucide-react":`^1.17.0`,prettier:`^3.8.3`,"qrcode.react":`^4.2.0`,react:`^19.2.7`,"react-dom":`^19.2.7`,typescript:`6.0.3`,"typescript-eslint":`^8.60.1`,vite:`^8.0.16`,"wait-on":`^9.0.10`,zustand:`^5.0.14`},overrides:{"brace-expansion":`5.0.6`,postcss:`8.5.15`,ws:`$ws`},build:{appId:`com.mostbox.app`,productName:`MostBox`,publish:[{provider:`github`,releaseType:`release`}],directories:{output:`dist`},afterPack:`electron/afterPack.cjs`,files:[`out/**/*`,`electron/**/*`,`server/src/**/*`,`server/index.js`,`server/cli.js`,`package.json`,`!**/*.map`,`!electron/**/*.test.js`,`!server/tests/**/*`],asarUnpack:[`**/*.node`,`**/sodium-native/**`],protocols:[{name:`MostBox Link`,schemes:[`most`]}],win:{target:[`nsis`],artifactName:"${productName}-${version}-win-${arch}-setup.${ext}",icon:`public/logo.ico`},nsis:{oneClick:!1,allowToChangeInstallationDirectory:!0,createDesktopShortcut:!0,createStartMenuShortcut:!0,shortcutName:`MostBox`},mac:{artifactName:"${productName}-${version}-mac-${arch}.${ext}",target:[{target:`dmg`,arch:[`x64`,`arm64`]}],icon:`public/logo-512.png`,category:`public.app-category.utilities`},dmg:{contents:[{x:130,y:220},{x:410,y:220,type:`link`,path:`/Applications`}]},linux:{artifactName:"${productName}-${version}-linux-${arch}.${ext}",target:[{target:`AppImage`,arch:[`x64`,`arm64`]}],icon:`public/logo-512.png`,category:`Utility`}}},d=e(),f=[{to:`/`,labelKey:`footer.about`},{to:`/ping/`,labelKey:`footer.network`},{href:`https://github.com/most-people/most`,labelKey:null,label:`GitHub`,external:!0}],p=u.version;function m(){let{t:e}=i();return(0,d.jsx)(`footer`,{className:`mkt-footer`,children:(0,d.jsx)(`div`,{className:`mkt-container`,children:(0,d.jsxs)(`div`,{className:`mkt-footer-inner`,children:[(0,d.jsx)(`div`,{className:`mkt-footer-links`,children:f.map(n=>`external`in n?(0,d.jsx)(`a`,{href:n.href,target:`_blank`,rel:`noopener noreferrer`,children:n.label},n.href):(0,d.jsx)(t,{to:n.to,children:e(n.labelKey)},n.to))}),(0,d.jsxs)(`span`,{className:`mkt-footer-copy`,children:[`© `,new Date().getFullYear(),` MOST PEOPLE · MIT License`]}),(0,d.jsxs)(`span`,{className:`mkt-footer-build`,translate:`no`,children:[`v`,p]})]})})})}function h({children:e,header:t}){return(0,d.jsxs)(`div`,{className:`mkt-layout`,children:[t??(0,d.jsx)(g,{}),(0,d.jsx)(`main`,{className:`mkt-layout-main`,children:e}),(0,d.jsx)(m,{})]})}function g(){let e=r(e=>e.identity),u=r(e=>e.openLoginModal),{t:f}=i(),p=n(),m=e?.displayName||e?.username||f(`nav.openWeb`);return(0,d.jsx)(`nav`,{className:`mkt-nav`,children:(0,d.jsxs)(`div`,{className:`mkt-nav-inner`,children:[(0,d.jsxs)(t,{to:`/`,className:`mkt-nav-logo`,children:[(0,d.jsx)(l,{}),`MOST PEOPLE`]}),(0,d.jsxs)(`div`,{className:`mkt-nav-cta`,children:[(0,d.jsx)(c,{}),(0,d.jsx)(a,{className:`mkt-theme-toggle`}),!p&&(0,d.jsxs)(t,{to:`/download/`,className:`btn btn-primary mkt-nav-preview`,children:[(0,d.jsx)(o,{size:16}),f(`nav.downloadClient`)]}),e?(0,d.jsx)(t,{to:`/profile/`,className:`mkt-nav-avatar-trigger`,"aria-label":f(`nav.profile`),title:m,children:(0,d.jsx)(`img`,{className:`mkt-nav-avatar`,src:s(e.address,e.avatar),alt:``,"aria-hidden":`true`})}):(0,d.jsx)(`button`,{type:`button`,className:`btn btn-secondary`,onClick:u,children:f(`nav.getStarted`)})]})]})})}export{h as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";import{a as r}from"./i18n-NjvOSuV6.js";import{n as i,r as a}from"./LanguageToggle-CSQtRZ3A.js";var o=t(e(),1),s=n();function c(){let[e,t]=(0,o.useState)(!1),{t:n}=r();return(0,o.useEffect)(()=>{let e=localStorage.getItem(`theme`),n=window.matchMedia(`(prefers-color-scheme: dark)`).matches;(e===`dark`||!e&&n)&&t(!0)},[]),(0,o.useEffect)(()=>{document.documentElement.setAttribute(`data-theme`,e?`dark`:`light`),localStorage.setItem(`theme`,e?`dark`:`light`)},[e]),(0,s.jsx)(`button`,{type:`button`,className:`mkt-theme-toggle`,onClick:()=>t(!e),"aria-label":n(`common.theme.toggle`),title:n(`common.theme.toggle`),children:e?(0,s.jsx)(i,{size:16}):(0,s.jsx)(a,{size:16})})}export{c as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{t as e}from"./jsx-runtime-Bt-cYkS5.js";import{C as t}from"./ui-BpDGD3IR.js";import{a as n}from"./i18n-NjvOSuV6.js";import{r}from"./SidebarHomeLink-qMFEGjZt.js";var i=t(`panel-left-open`,[[`rect`,{width:`18`,height:`18`,x:`3`,y:`3`,rx:`2`,key:`afitv7`}],[`path`,{d:`M9 3v18`,key:`fh3hqa`}],[`path`,{d:`m14 9 3 3-3 3`,key:`8010ee`}]]),a=e();function o({label:e,className:t=``,variant:o=`primary`}){let{isSidebarVisible:s,openSidebar:c}=r(),{t:l}=n(),u=o===`primary`?`btn-primary`:``,d=e||l(`appShell.openSidebar`);return s?null:(0,a.jsxs)(`button`,{type:`button`,className:`btn ${u} sidebar-open-hint ${t}`.trim(),onClick:c,children:[(0,a.jsx)(i,{size:16}),d]})}export{o as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";import{D as r,r as i,s as a}from"./ui-BpDGD3IR.js";import{a as o}from"./i18n-NjvOSuV6.js";import{i as s}from"./index-C-_ZwxuN.js";var c=t(e(),1),l=n();function u({className:e=``}){let t=a(e=>e.identity),n=a(e=>e.openLoginModal),u=a(e=>e.logoutUser),[d,f]=(0,c.useState)(!1),{t:p}=o();return(0,l.jsxs)(`div`,{className:`chat-sidebar-footer sidebar-account ${e}`,children:[(0,l.jsxs)(`div`,{className:`user-info`,children:[t?(0,l.jsx)(r,{to:`/profile/`,className:`user-avatar-link`,"aria-label":p(`nav.profile`),title:p(`nav.profile`),children:(0,l.jsx)(`img`,{className:`user-avatar-img`,src:s(t.address,t.avatar),alt:``,"aria-hidden":`true`})}):(0,l.jsx)(`img`,{className:`user-avatar-img`,src:s(void 0,void 0),alt:``,"aria-hidden":`true`}),(0,l.jsx)(`span`,{className:`user-name`,title:t?.address,children:(0,l.jsx)(`span`,{translate:t?.displayName?`no`:`yes`,children:t?.displayName||p(`account.notSignedIn`)})})]}),t?(0,l.jsx)(`button`,{type:`button`,className:`btn btn-secondary logout-btn`,onClick:()=>f(!0),children:p(`account.logout`)}):(0,l.jsx)(`button`,{className:`btn btn-primary login-btn`,onClick:n,children:p(`account.signIn`)}),d&&(0,l.jsx)(i,{title:p(`account.logoutTitle`),message:p(`account.logoutConfirm`),confirmText:p(`account.logout`),danger:!0,onConfirm:()=>{u(),f(!1)},onClose:()=>f(!1)})]})}export{u as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{n as e,o as t,t as n}from"./jsx-runtime-Bt-cYkS5.js";import{C as r,D as i}from"./ui-BpDGD3IR.js";import{a}from"./i18n-NjvOSuV6.js";import{t as o}from"./LanguageToggle-CSQtRZ3A.js";import{I as s}from"./index-C-_ZwxuN.js";var c=r(`menu`,[[`path`,{d:`M4 5h16`,key:`1tepv9`}],[`path`,{d:`M4 12h16`,key:`1lakjw`}],[`path`,{d:`M4 19h16`,key:`1djgab`}]]),l=t(e(),1);function u(e,t){return typeof t==`boolean`?t:typeof window<`u`&&`matchMedia`in window?window.matchMedia(e).matches:!1}function d(e,t,{getInitialValueInEffect:n}={getInitialValueInEffect:!0}){let[r,i]=(0,l.useState)(n?t:u(e));return(0,l.useEffect)(()=>{try{if(`matchMedia`in window){let t=window.matchMedia(e);i(t.matches);let n=e=>i(e.matches);return t.addEventListener(`change`,n),()=>{t.removeEventListener(`change`,n)}}}catch{return}},[e]),r||!1}function f(e=!1,t={}){let[n,r]=(0,l.useState)(e),i=(0,l.useCallback)(()=>{r(e=>e||(t.onOpen?.(),!0))},[t.onOpen]),a=(0,l.useCallback)(()=>{r(e=>e&&(t.onClose?.(),!1))},[t.onClose]);return[n,{open:i,close:a,toggle:(0,l.useCallback)(()=>{n?a():i()},[a,i,n]),set:r}]}var p=n(),m=(0,l.createContext)(null);function h(){let e=(0,l.useContext)(m);if(!e)throw Error(`useAppShell must be used within AppShell`);return e}function g({sidebar:e,className:t=``,headerTitle:n,headerRight:r,sidebarToggleReplacement:i,defaultHide:s=!1,children:u}){let[h,g]=f(!1),[_,v]=(0,l.useState)(s),y=(0,l.useRef)(s),b=d(`(max-width: 768px)`),{t:x}=a(),S=(0,l.useCallback)((e={})=>{g.close(),e.collapse&&v(!0)},[g]);(0,l.useEffect)(()=>{s!==y.current&&(s?S({collapse:!0}):v(!1),y.current=s)},[s,S]);let C=()=>{b?g.toggle():v(!_)},w=()=>{b?g.open():v(!1)},T=b?h:!_;return(0,p.jsx)(m.Provider,{value:{closeSidebar:S,openSidebar:w,isSidebarVisible:T},children:(0,p.jsxs)(`div`,{className:[`app-layout`,t].filter(Boolean).join(` `),children:[(0,p.jsx)(`div`,{className:`sidebar-overlay ${h?`visible`:``}`,onClick:()=>S()}),(0,p.jsx)(`div`,{className:`sidebar ${h?`open`:``} ${_?`collapsed`:``}`,children:e({closeSidebar:S,openSidebar:w})}),(0,p.jsxs)(`div`,{className:`main-content`,children:[(0,p.jsxs)(`header`,{className:`app-header`,children:[(0,p.jsxs)(`div`,{className:`header-left`,children:[i??(0,p.jsx)(`button`,{onClick:C,className:`btn btn-icon sidebar-toggle-btn`,"aria-label":x(b?`appShell.openMenu`:_?`appShell.expandSidebar`:`appShell.collapseSidebar`),children:(0,p.jsx)(c,{size:16})}),n]}),(0,p.jsxs)(`div`,{className:`header-right`,children:[(0,p.jsx)(o,{className:`btn btn-icon app-language-toggle`}),r]})]}),u]})]})})}function _({onNavigate:e}){let{t}=a(),n=t(`common.brand`);return(0,p.jsxs)(i,{to:`/`,className:`sidebar-header sidebar-header-link`,onClick:e,"aria-label":n,title:n,children:[(0,p.jsx)(s,{size:18}),(0,p.jsx)(`h1`,{children:n})]})}export{f as i,g as n,h as r,_ as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e}from"./ui-BpDGD3IR.js";var t=e(`arrow-right`,[[`path`,{d:`M5 12h14`,key:`1ays0h`}],[`path`,{d:`m12 5 7 7-7 7`,key:`xquz4c`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e}from"./ui-BpDGD3IR.js";var t=e(`circle-alert`,[[`circle`,{cx:`12`,cy:`12`,r:`10`,key:`1mglay`}],[`line`,{x1:`12`,x2:`12`,y1:`8`,y2:`12`,key:`1pkeuh`}],[`line`,{x1:`12`,x2:`12.01`,y1:`16`,y2:`16`,key:`4dfq90`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
var e=`builtin`,t=`comment`,n=`string`,r=`atom`,i=`number`,a=`keyword`,o=`header`,s=`def`,c=`link`;function l(e){for(var t={},n=e.split(` `),r=0;r<n.length;++r)t[n[r]]=!0;return t}var u=l(`TRUE FALSE ZEROES ZEROS ZERO SPACES SPACE LOW-VALUE LOW-VALUES `),d=l(`ACCEPT ACCESS ACQUIRE ADD ADDRESS ADVANCING AFTER ALIAS ALL ALPHABET ALPHABETIC ALPHABETIC-LOWER ALPHABETIC-UPPER ALPHANUMERIC ALPHANUMERIC-EDITED ALSO ALTER ALTERNATE AND ANY ARE AREA AREAS ARITHMETIC ASCENDING ASSIGN AT ATTRIBUTE AUTHOR AUTO AUTO-SKIP AUTOMATIC B-AND B-EXOR B-LESS B-NOT B-OR BACKGROUND-COLOR BACKGROUND-COLOUR BEEP BEFORE BELL BINARY BIT BITS BLANK BLINK BLOCK BOOLEAN BOTTOM BY CALL CANCEL CD CF CH CHARACTER CHARACTERS CLASS CLOCK-UNITS CLOSE COBOL CODE CODE-SET COL COLLATING COLUMN COMMA COMMIT COMMITMENT COMMON COMMUNICATION COMP COMP-0 COMP-1 COMP-2 COMP-3 COMP-4 COMP-5 COMP-6 COMP-7 COMP-8 COMP-9 COMPUTATIONAL COMPUTATIONAL-0 COMPUTATIONAL-1 COMPUTATIONAL-2 COMPUTATIONAL-3 COMPUTATIONAL-4 COMPUTATIONAL-5 COMPUTATIONAL-6 COMPUTATIONAL-7 COMPUTATIONAL-8 COMPUTATIONAL-9 COMPUTE CONFIGURATION CONNECT CONSOLE CONTAINED CONTAINS CONTENT CONTINUE CONTROL CONTROL-AREA CONTROLS CONVERTING COPY CORR CORRESPONDING COUNT CRT CRT-UNDER CURRENCY CURRENT CURSOR DATA DATE DATE-COMPILED DATE-WRITTEN DAY DAY-OF-WEEK DB DB-ACCESS-CONTROL-KEY DB-DATA-NAME DB-EXCEPTION DB-FORMAT-NAME DB-RECORD-NAME DB-SET-NAME DB-STATUS DBCS DBCS-EDITED DE DEBUG-CONTENTS DEBUG-ITEM DEBUG-LINE DEBUG-NAME DEBUG-SUB-1 DEBUG-SUB-2 DEBUG-SUB-3 DEBUGGING DECIMAL-POINT DECLARATIVES DEFAULT DELETE DELIMITED DELIMITER DEPENDING DESCENDING DESCRIBED DESTINATION DETAIL DISABLE DISCONNECT DISPLAY DISPLAY-1 DISPLAY-2 DISPLAY-3 DISPLAY-4 DISPLAY-5 DISPLAY-6 DISPLAY-7 DISPLAY-8 DISPLAY-9 DIVIDE DIVISION DOWN DROP DUPLICATE DUPLICATES DYNAMIC EBCDIC EGI EJECT ELSE EMI EMPTY EMPTY-CHECK ENABLE END END. END-ACCEPT END-ACCEPT. END-ADD END-CALL END-COMPUTE END-DELETE END-DISPLAY END-DIVIDE END-EVALUATE END-IF END-INVOKE END-MULTIPLY END-OF-PAGE END-PERFORM END-READ END-RECEIVE END-RETURN END-REWRITE END-SEARCH END-START END-STRING END-SUBTRACT END-UNSTRING END-WRITE END-XML ENTER ENTRY ENVIRONMENT EOP EQUAL EQUALS ERASE ERROR ESI EVALUATE EVERY EXCEEDS EXCEPTION EXCLUSIVE EXIT EXTEND EXTERNAL EXTERNALLY-DESCRIBED-KEY FD FETCH FILE FILE-CONTROL FILE-STREAM FILES FILLER FINAL FIND FINISH FIRST FOOTING FOR FOREGROUND-COLOR FOREGROUND-COLOUR FORMAT FREE FROM FULL FUNCTION GENERATE GET GIVING GLOBAL GO GOBACK GREATER GROUP HEADING HIGH-VALUE HIGH-VALUES HIGHLIGHT I-O I-O-CONTROL ID IDENTIFICATION IF IN INDEX INDEX-1 INDEX-2 INDEX-3 INDEX-4 INDEX-5 INDEX-6 INDEX-7 INDEX-8 INDEX-9 INDEXED INDIC INDICATE INDICATOR INDICATORS INITIAL INITIALIZE INITIATE INPUT INPUT-OUTPUT INSPECT INSTALLATION INTO INVALID INVOKE IS JUST JUSTIFIED KANJI KEEP KEY LABEL LAST LD LEADING LEFT LEFT-JUSTIFY LENGTH LENGTH-CHECK LESS LIBRARY LIKE LIMIT LIMITS LINAGE LINAGE-COUNTER LINE LINE-COUNTER LINES LINKAGE LOCAL-STORAGE LOCALE LOCALLY LOCK MEMBER MEMORY MERGE MESSAGE METACLASS MODE MODIFIED MODIFY MODULES MOVE MULTIPLE MULTIPLY NATIONAL NATIVE NEGATIVE NEXT NO NO-ECHO NONE NOT NULL NULL-KEY-MAP NULL-MAP NULLS NUMBER NUMERIC NUMERIC-EDITED OBJECT OBJECT-COMPUTER OCCURS OF OFF OMITTED ON ONLY OPEN OPTIONAL OR ORDER ORGANIZATION OTHER OUTPUT OVERFLOW OWNER PACKED-DECIMAL PADDING PAGE PAGE-COUNTER PARSE PERFORM PF PH PIC PICTURE PLUS POINTER POSITION POSITIVE PREFIX PRESENT PRINTING PRIOR PROCEDURE PROCEDURE-POINTER PROCEDURES PROCEED PROCESS PROCESSING PROGRAM PROGRAM-ID PROMPT PROTECTED PURGE QUEUE QUOTE QUOTES RANDOM RD READ READY REALM RECEIVE RECONNECT RECORD RECORD-NAME RECORDS RECURSIVE REDEFINES REEL REFERENCE REFERENCE-MONITOR REFERENCES RELATION RELATIVE RELEASE REMAINDER REMOVAL RENAMES REPEATED REPLACE REPLACING REPORT REPORTING REPORTS REPOSITORY REQUIRED RERUN RESERVE RESET RETAINING RETRIEVAL RETURN RETURN-CODE RETURNING REVERSE-VIDEO REVERSED REWIND REWRITE RF RH RIGHT RIGHT-JUSTIFY ROLLBACK ROLLING ROUNDED RUN SAME SCREEN SD SEARCH SECTION SECURE SECURITY SEGMENT SEGMENT-LIMIT SELECT SEND SENTENCE SEPARATE SEQUENCE SEQUENTIAL SET SHARED SIGN SIZE SKIP1 SKIP2 SKIP3 SORT SORT-MERGE SORT-RETURN SOURCE SOURCE-COMPUTER SPACE-FILL SPECIAL-NAMES STANDARD STANDARD-1 STANDARD-2 START STARTING STATUS STOP STORE STRING SUB-QUEUE-1 SUB-QUEUE-2 SUB-QUEUE-3 SUB-SCHEMA SUBFILE SUBSTITUTE SUBTRACT SUM SUPPRESS SYMBOLIC SYNC SYNCHRONIZED SYSIN SYSOUT TABLE TALLYING TAPE TENANT TERMINAL TERMINATE TEST TEXT THAN THEN THROUGH THRU TIME TIMES TITLE TO TOP TRAILING TRAILING-SIGN TRANSACTION TYPE TYPEDEF UNDERLINE UNEQUAL UNIT UNSTRING UNTIL UP UPDATE UPON USAGE USAGE-MODE USE USING VALID VALIDATE VALUE VALUES VARYING VLR WAIT WHEN WHEN-COMPILED WITH WITHIN WORDS WORKING-STORAGE WRITE XML XML-CODE XML-EVENT XML-NTEXT XML-TEXT ZERO ZERO-FILL `),f=l(`- * ** / + < <= = > >= `),p={digit:/\d/,digit_or_colon:/[\d:]/,hex:/[0-9a-f]/i,sign:/[+-]/,exponent:/e/i,keyword_char:/[^\s\(\[\;\)\]]/,symbol:/[\w*+\-]/};function m(e,t){return e===`0`&&t.eat(/x/i)?(t.eatWhile(p.hex),!0):((e==`+`||e==`-`)&&p.digit.test(t.peek())&&(t.eat(p.sign),e=t.next()),p.digit.test(e)?(t.eat(e),t.eatWhile(p.digit),t.peek()==`.`&&(t.eat(`.`),t.eatWhile(p.digit)),t.eat(p.exponent)&&(t.eat(p.sign),t.eatWhile(p.digit)),!0):!1)}var h={name:`cobol`,startState:function(){return{indentStack:null,indentation:0,mode:!1}},token:function(l,h){if(h.indentStack==null&&l.sol()&&(h.indentation=6),l.eatSpace())return null;var g=null;switch(h.mode){case`string`:for(var _=!1;(_=l.next())!=null;)if((_==`"`||_==`'`)&&!l.match(/['"]/,!1)){h.mode=!1;break}g=n;break;default:var v=l.next(),y=l.column();if(y>=0&&y<=5)g=s;else if(y>=72&&y<=79)l.skipToEnd(),g=o;else if(v==`*`&&y==6)l.skipToEnd(),g=t;else if(v==`"`||v==`'`)h.mode=`string`,g=n;else if(v==`'`&&!p.digit_or_colon.test(l.peek()))g=r;else if(v==`.`)g=c;else if(m(v,l))g=i;else{if(l.current().match(p.symbol))for(;y<71&&l.eat(p.symbol)!==void 0;)y++;g=d&&d.propertyIsEnumerable(l.current().toUpperCase())?a:f&&f.propertyIsEnumerable(l.current().toUpperCase())?e:u&&u.propertyIsEnumerable(l.current().toUpperCase())?r:null}}return g},indent:function(e){return e.indentStack==null?e.indentation:e.indentStack.indent}};export{h as cobol};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e}from"./ui-BpDGD3IR.js";var t=e(`copy`,[[`rect`,{width:`14`,height:`14`,x:`8`,y:`8`,rx:`2`,ry:`2`,key:`17jyea`}],[`path`,{d:`M4 16c-1.1 0-2-.9-2-2V4c0-1.1.9-2 2-2h10c1.1 0 2 .9 2 2`,key:`zix9uf`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e}from"./ui-BpDGD3IR.js";var t=e(`download`,[[`path`,{d:`M12 15V3`,key:`m9g1x1`}],[`path`,{d:`M21 15v4a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2v-4`,key:`ih7n3h`}],[`path`,{d:`m7 10 5 5 5-5`,key:`brsn70`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{A as e,h as t,l as n,p as r}from"./index-C-_ZwxuN.js";var i={CID_EMPTY:`cid_empty`,INVALID_CID_FORMAT:`invalid_cid_format`,CID_V1_REQUIRED:`cid_v1_required`,CID_DIGEST_LENGTH:`cid_digest_length`,LINK_EMPTY:`link_empty`,INVALID_URL:`invalid_url`,INVALID_PROTOCOL:`invalid_protocol`,UNSUPPORTED_PATH:`unsupported_path`,UNSUPPORTED_QUERY_PARAM:`unsupported_query_param`};function a(e){return{valid:!1,errorCode:e}}function o(e,t){return{cid:``,errorCode:e,...t?{details:t}:{}}}function s(t){if(!t||typeof t!=`string`)return a(i.CID_EMPTY);let n;try{n=e.parse(t)}catch{return a(i.INVALID_CID_FORMAT)}return n.version===1?n.multihash.digest.length===32?{valid:!0}:a(i.CID_DIGEST_LENGTH):a(i.CID_V1_REQUIRED)}function c(e){if(!e||typeof e!=`string`)return o(i.LINK_EMPTY);let t;try{t=new URL(e)}catch{return o(i.INVALID_URL)}if(t.protocol!==`most:`)return o(i.INVALID_PROTOCOL);if(t.pathname&&t.pathname!==`/`)return o(i.UNSUPPORTED_PATH);let n=t.hostname,r=t.searchParams.get(`filename`),a=[...t.searchParams.keys()].find(e=>e!==`filename`),c=s(n);return c.valid?a?o(i.UNSUPPORTED_QUERY_PARAM,{param:a}):{cid:n,fileName:r?.trim()||n}:o(c.errorCode)}var l={timeout:`检测等待超时,暂时没有等到在线种子响应。请确认分享者或其他下载者仍在线做种,稍后再检测。`,offline:`无法连接本地节点,请确认 MostBox 后端正在运行后再检测。`,missingApi:`当前后端还没有检测接口,请重启 MostBox 后端后再试。`,validation:`链接格式不正确,请粘贴完整的 most://<cid>?filename=... 分享链接。`,nameConflict:`下载目录已有同名文件,请先重命名或移走后再检测。`,noPeer:`暂时没有发现在线种子。请确认分享者或其他下载者仍在线做种,稍后再检测。`,permission:`下载目录不可写,请检查目录权限后再检测。`,starting:`本地节点还没有启动完成,请稍等几秒后重新检测。`,server:`本地节点检测时出错,请稍后重试或查看节点日志。`,fallback:`检测未通过,请确认链接完整、发布者在线且本机网络正常。`};i.INVALID_URL,i.INVALID_PROTOCOL,i.UNSUPPORTED_PATH,i.CID_EMPTY,i.INVALID_CID_FORMAT,i.CID_V1_REQUIRED,i.CID_DIGEST_LENGTH;function u(e={},t=``){if(t===`TimeoutError`)return l.timeout;if(!e.status)return l.offline;if(e.status===404)return l.missingApi;switch(e.code){case`VALIDATION_ERROR`:return l.validation;case`CONFLICT`:return e.error?`${e.error},请先处理同名文件后再下载。`:l.nameConflict;case`PEER_NOT_FOUND`:return l.noPeer;case`PERMISSION_ERROR`:return e.error?`下载目录不可写:${e.error}`:l.permission;case`ENGINE_NOT_INITIALIZED`:return l.starting;default:break}return e.status===503?l.noPeer:e.status>=500?l.server:e.error?`检测未通过:${e.error}`:l.fallback}async function d(e,t){let r=new FormData;r.append(`file`,e,t||e.name);let i=await n.post(`/api/publish`,{body:r});if(!i.ok){let e=await i.json().catch(()=>({error:i.statusText}));throw Error(e.error||`Request failed`)}return i.json()}async function f(e){return u(await r(e),e&&typeof e==`object`&&`name`in e?String(e.name):``)}var p={listPublishedFiles:()=>n.get(`/api/files`).json(),listTrashFiles:()=>n.get(`/api/trash`).json(),deletePublishedFile:e=>n.delete(`/api/files/${e}`).json(),restoreTrashFile:e=>n.post(`/api/trash/${e}/restore`).json(),permanentDeleteTrashFile:e=>n.delete(`/api/trash/${e}`).json(),emptyTrash:()=>n.delete(`/api/trash`).json(),toggleStar:e=>n.post(`/api/files/${e}/star`).json(),getConfig:()=>n.get(`/api/config`).json(),getDataPath:()=>n.get(`/api/config/data-path`).json(),getNetworkAddresses:()=>n.get(`/api/network`).json(),saveConfig:e=>n.post(`/api/config`,{json:e}).json(),publishFile:d,checkDownload:(e,t={})=>{let r=typeof t.timeout==`number`?{link:e,timeout:t.timeout}:{link:e};return n.post(`/api/download/check`,{json:r,timeout:t.requestTimeout??15e3}).json()},downloadFile:e=>n.post(`/api/download`,{json:{link:e}}).json(),cacheFile:e=>n.post(`/api/files/${e}/cache`).json(),cancelDownload:e=>n.post(`/api/download/cancel`,{json:{taskId:e}}).json(),getFileDownloadUrl:e=>t(`/api/files/${e}/download`),moveFile:(e,t)=>n.post(`/api/move`,{json:{cid:e,newFileName:t}}).json(),renameFolder:(e,t)=>n.post(`/api/folder/rename`,{json:{oldPath:e,newPath:t}}).json()},m={[i.LINK_EMPTY]:`app.download.validation.empty`,[i.INVALID_URL]:`app.download.validation.invalidUrl`,[i.INVALID_PROTOCOL]:`app.download.validation.protocol`,[i.UNSUPPORTED_PATH]:`app.download.validation.path`,[i.CID_EMPTY]:`app.download.validation.invalidCid`,[i.INVALID_CID_FORMAT]:`app.download.validation.invalidCid`,[i.CID_V1_REQUIRED]:`app.download.validation.cidV1`,[i.CID_DIGEST_LENGTH]:`app.download.validation.cidDigest`};function h(e){if(!e)return{key:`app.download.validation.empty`};let t=c(e);return t.errorCode?t.errorCode===i.UNSUPPORTED_QUERY_PARAM?{key:`app.download.validation.unsupportedParam`,params:{param:t.details?.param||``}}:{key:m[t.errorCode||``]||`app.download.validation.generic`}:null}function g(e,t){let n=h(e);return n?t(n.key,n.params):null}export{c as i,p as n,f as r,g as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e}from"./ui-BpDGD3IR.js";var t=e(`external-link`,[[`path`,{d:`M15 3h6v6`,key:`1q9fwt`}],[`path`,{d:`M10 14 21 3`,key:`gplh6r`}],[`path`,{d:`M18 13v6a2 2 0 0 1-2 2H5a2 2 0 0 1-2-2V8a2 2 0 0 1 2-2h6`,key:`a6xqqp`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e}from"./ui-BpDGD3IR.js";var t=e(`file-text`,[[`path`,{d:`M6 22a2 2 0 0 1-2-2V4a2 2 0 0 1 2-2h8a2.4 2.4 0 0 1 1.704.706l3.588 3.588A2.4 2.4 0 0 1 20 8v12a2 2 0 0 1-2 2z`,key:`1oefj6`}],[`path`,{d:`M14 2v5a1 1 0 0 0 1 1h5`,key:`wfsgrz`}],[`path`,{d:`M10 9H8`,key:`b1mrlr`}],[`path`,{d:`M16 13H8`,key:`t4e002`}],[`path`,{d:`M16 17H8`,key:`z1uh3a`}]]);export{t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e}from"./ui-BpDGD3IR.js";var t=e(`chevron-right`,[[`path`,{d:`m9 18 6-6-6-6`,key:`mthhwq`}]]),n=e(`folder`,[[`path`,{d:`M20 20a2 2 0 0 0 2-2V8a2 2 0 0 0-2-2h-7.9a2 2 0 0 1-1.69-.9L9.6 3.9A2 2 0 0 0 7.93 3H4a2 2 0 0 0-2 2v13a2 2 0 0 0 2 2Z`,key:`1kt360`}]]);export{t as n,n as t};
|
|
@@ -1 +0,0 @@
|
|
|
1
|
-
import{C as e}from"./ui-BpDGD3IR.js";var t=e(`hard-drive`,[[`path`,{d:`M10 16h.01`,key:`1bzywj`}],[`path`,{d:`M2.212 11.577a2 2 0 0 0-.212.896V18a2 2 0 0 0 2 2h16a2 2 0 0 0 2-2v-5.527a2 2 0 0 0-.212-.896L18.55 5.11A2 2 0 0 0 16.76 4H7.24a2 2 0 0 0-1.79 1.11z`,key:`18tbho`}],[`path`,{d:`M21.946 12.013H2.054`,key:`zqlbp7`}],[`path`,{d:`M6 16h.01`,key:`1pmjb7`}]]);export{t};
|