Initial commit

This commit is contained in:
2026-03-08 01:34:54 +08:00
commit 1f104f73c8
441 changed files with 64911 additions and 0 deletions

37
shared/constants/api.ts Normal file
View File

@@ -0,0 +1,37 @@
export const API_ENDPOINTS = {
FILES: '/api/files',
FILES_CONTENT: '/api/files/content',
FILES_MOVE: '/api/files/move',
FILES_RECYCLE: '/api/files/recycle',
FILES_EXISTS: '/api/files/exists',
FILES_RENAME: '/api/files/rename',
FILES_CREATE: '/api/files/create',
FILES_MKDIR: '/api/files/mkdir',
FILES_RESTORE: '/api/files/restore',
FILES_PERMANENT_DELETE: '/api/files/permanent-delete',
FILES_EMPTY_RECYCLE_BIN: '/api/files/empty-recycle-bin',
TIME: '/api/time',
TIME_EVENT: '/api/time/event',
TIME_STATS: '/api/time/stats',
TIME_DAY: '/api/time/day',
TIME_MONTH: '/api/time/month',
TIME_YEAR: '/api/time/year',
TODO: '/api/todo',
TODO_ADD: '/api/todo/add',
TODO_TOGGLE: '/api/todo/toggle',
TODO_UPDATE: '/api/todo/update',
TODO_DELETE: '/api/todo/delete',
TODO_MIGRATE: '/api/todo/migrate',
SEARCH: '/api/search',
EVENTS: '/api/events',
SYNC: '/api/sync',
SYNC_UPLOAD: '/api/sync/upload',
SYNC_DOWNLOAD: '/api/sync/download',
SYNC_STATUS: '/api/sync/status',
PYDEMOS: '/api/pydemos',
PYDEMOS_CREATE: '/api/pydemos/create',
PYDEMOS_RENAME: '/api/pydemos/rename',
PYDEMOS_DELETE: '/api/pydemos/delete',
} as const
export type ApiEndpoint = typeof API_ENDPOINTS[keyof typeof API_ENDPOINTS]

View File

@@ -0,0 +1,14 @@
export const ASYNC_IMPORT_STATUS = {
PDF_PARSING_TITLE: '# 正在解析 PDF 内容...',
HTML_PARSING_TITLE: '# 正在解析 HTML 内容...',
PDF_PARSING_CONTENT: '# 正在解析 PDF 内容...\n\n> 请稍候,系统正在后台解析您的 PDF 文件。解析完成后,本文档将自动更新。\n> \n> 您可以继续进行其他操作。',
HTML_PARSING_CONTENT: '# 正在解析 HTML 内容...\n\n> 请稍候,系统正在解析您的 HTML 文件。解析完成后,本文档将自动更新。',
} as const
export const isAsyncImportProcessingContent = (text: string): boolean => {
const trimmed = text.trimStart()
return (
trimmed.startsWith(ASYNC_IMPORT_STATUS.PDF_PARSING_TITLE) ||
trimmed.startsWith(ASYNC_IMPORT_STATUS.HTML_PARSING_TITLE)
)
}

View File

@@ -0,0 +1 @@
export const WEEK_DAYS = ['周日', '周一', '周二', '周三', '周四', '周五', '周六'] as const

View File

@@ -0,0 +1,22 @@
export const ERROR_CODES = {
PATH_NOT_FOUND: 'PATH_NOT_FOUND',
NOT_A_DIRECTORY: 'NOT_A_DIRECTORY',
ACCESS_DENIED: 'ACCESS_DENIED',
FILE_EXISTS: 'FILE_EXISTS',
INVALID_PATH: 'INVALID_PATH',
VALIDATION_ERROR: 'VALIDATION_ERROR',
INTERNAL_ERROR: 'INTERNAL_ERROR',
NOT_FOUND: 'NOT_FOUND',
BAD_REQUEST: 'BAD_REQUEST',
NAME_GENERATION_FAILED: 'NAME_GENERATION_FAILED',
SSE_UNSUPPORTED: 'SSE_UNSUPPORTED',
ALREADY_EXISTS: 'ALREADY_EXISTS',
NOT_A_FILE: 'NOT_A_FILE',
FORBIDDEN: 'FORBIDDEN',
UNSUPPORTED_MEDIA_TYPE: 'UNSUPPORTED_MEDIA_TYPE',
PAYLOAD_TOO_LARGE: 'PAYLOAD_TOO_LARGE',
RESOURCE_LOCKED: 'RESOURCE_LOCKED',
INVALID_NAME: 'INVALID_NAME',
} as const
export type ErrorCode = typeof ERROR_CODES[keyof typeof ERROR_CODES]

View File

@@ -0,0 +1,5 @@
export { API_ENDPOINTS, type ApiEndpoint } from './api.js'
export { ERROR_CODES, type ErrorCode } from './errors.js'
export { ERROR_MESSAGES, getErrorMessage } from './messages.js'
export { ASYNC_IMPORT_STATUS, isAsyncImportProcessingContent } from './asyncImport.js'
export { WEEK_DAYS } from './dates.js'

View File

@@ -0,0 +1,26 @@
import { ERROR_CODES } from './errors'
export const ERROR_MESSAGES: Record<string, string> = {
[ERROR_CODES.PATH_NOT_FOUND]: '路径不存在',
[ERROR_CODES.NOT_A_DIRECTORY]: '不是目录',
[ERROR_CODES.ACCESS_DENIED]: '访问被拒绝',
[ERROR_CODES.FILE_EXISTS]: '文件已存在',
[ERROR_CODES.INVALID_PATH]: '无效路径',
[ERROR_CODES.VALIDATION_ERROR]: '验证失败',
[ERROR_CODES.INTERNAL_ERROR]: '内部错误',
[ERROR_CODES.NOT_FOUND]: '资源不存在',
[ERROR_CODES.BAD_REQUEST]: '请求错误',
[ERROR_CODES.NAME_GENERATION_FAILED]: '名称生成失败',
[ERROR_CODES.SSE_UNSUPPORTED]: 'SSE 不支持',
[ERROR_CODES.ALREADY_EXISTS]: '已存在',
[ERROR_CODES.NOT_A_FILE]: '不是文件',
[ERROR_CODES.FORBIDDEN]: '禁止访问',
[ERROR_CODES.UNSUPPORTED_MEDIA_TYPE]: '不支持的媒体类型',
[ERROR_CODES.PAYLOAD_TOO_LARGE]: '请求体过大',
[ERROR_CODES.RESOURCE_LOCKED]: '资源已锁定',
[ERROR_CODES.INVALID_NAME]: '无效名称',
}
export const getErrorMessage = (code: string): string => {
return ERROR_MESSAGES[code] || '未知错误'
}