mirror of
https://github.com/CherryHQ/cherry-studio.git
synced 2025-12-19 06:30:10 +08:00
* feat(discover): implement Discover feature with routing and UI components - Added a new Discover page with sidebar and main content areas. - Integrated routing for Discover, including subcategories and tabs. - Created components for Discover sidebar and main content. - Updated localization files to include new Discover titles and labels. - Refactored existing components to accommodate the new Discover feature. - Enhanced sidebar icons and navigation for better user experience. * feat(discover): enhance Discover page with Tailwind CSS integration and routing improvements - Added Tailwind CSS import to the entry point for styling. - Updated the ThemeProvider to dynamically apply Tailwind themes based on user selection. - Refactored Discover page to utilize new ROUTERS structure for better routing management. - Simplified category handling in useDiscoverCategories hook by leveraging ROUTERS_ENTRIES. - Introduced InternalCategory interface for better type management in Discover components. - Cleaned up unused code and comments for improved readability. * fix: update import statement for linguist-languages in update-languages.ts * fix: standardize import quotes and improve localization files - Updated import statements in use-mobile.ts and motionVariants.ts to use single quotes for consistency. - Added new localization entries for the "discover" section in multiple language files, including English, Japanese, Russian, Traditional Chinese, Greek, Spanish, French, and Portuguese. * refactor(discover): simplify Discover page structure and improve routing logic - Refactored DiscoverPage component to streamline tab and sidebar handling. - Updated routing logic to utilize a new ROUTERS_MAP for better category management. - Removed unused props and simplified state management in useDiscoverCategories hook. - Enhanced DiscoverSidebar and DiscoverMain components for improved clarity and performance. - Adjusted CherryStoreType enum values for consistency in path definitions. * fix: update file upload body type in MineruPreprocessProvider - Changed the body of the fetch request from a Buffer to a Uint8Array to ensure proper handling of binary data during PDF uploads. * fix: ensure Blob creation uses a copy of byte arrays for image handling - Updated Blob creation in ImageGenerationMiddleware, ImageViewer, and MessageImage components to use `slice()` on byte arrays, preventing potential mutations of the original data. * chore: update Vite React SWC plugin and adjust Electron config for conditional styling - Upgraded `@vitejs/plugin-react-swc` from version 3.9.0 to 3.11.0 for improved performance and features. - Modified Electron Vite configuration to conditionally apply styled-components plugin based on the VITEST environment variable. - Updated snapshot tests for `InputEmbeddingDimension` and `Spinner` components to reflect style changes. * chore: upgrade @swc/plugin-styled-components to version 9.0.2 in package.json and yarn.lock * refactor: streamline styled-components plugin configuration in Electron Vite setup - Consolidated the styled-components plugin configuration in the Electron Vite config file for improved readability and maintainability. - Removed conditional application of the plugin based on the VITEST environment variable, ensuring consistent styling behavior across environments. * i18n: update translations for discover section across multiple languages - Replaced placeholder text with accurate translations for the "discover" section in English, Japanese, Russian, Traditional Chinese, Greek, Spanish, French, and Portuguese. - Ensured consistency in terminology and improved clarity in user-facing messages. * i18n: update "discover" title translations across multiple languages - Updated the "discover" title in English, Japanese, Russian, Traditional Chinese, Greek, Spanish, French, and Portuguese to ensure accurate and consistent terminology. - Adjusted related key mappings in the localization files for improved clarity in user-facing messages. * chore: update lucide-react to version 0.536.0 and clean up tsconfig paths * fix: update input style in snapshot tests and format message mentions in MessageContent component
136 lines
4.5 KiB
TypeScript
136 lines
4.5 KiB
TypeScript
import { exec } from 'child_process'
|
|
import * as fs from 'fs/promises'
|
|
import * as linguistLanguages from 'linguist-languages'
|
|
import * as path from 'path'
|
|
import { promisify } from 'util'
|
|
|
|
const execAsync = promisify(exec)
|
|
|
|
type LanguageData = {
|
|
type: string
|
|
aliases?: string[]
|
|
extensions?: string[]
|
|
}
|
|
|
|
const LANGUAGES_FILE_PATH = path.join(__dirname, '../packages/shared/config/languages.ts')
|
|
|
|
/**
|
|
* Extracts and filters necessary language data from the linguist-languages package.
|
|
* @returns A record of language data.
|
|
*/
|
|
function extractAllLanguageData(): Record<string, LanguageData> {
|
|
console.log('🔍 Extracting language data from linguist-languages...')
|
|
const languages = Object.entries(linguistLanguages).reduce(
|
|
(acc, [name, langData]) => {
|
|
const { type, extensions, aliases } = langData as any
|
|
|
|
// Only include languages with extensions or aliases
|
|
if ((extensions && extensions.length > 0) || (aliases && aliases.length > 0)) {
|
|
acc[name] = {
|
|
type: type || 'programming',
|
|
...(extensions && { extensions }),
|
|
...(aliases && { aliases })
|
|
}
|
|
}
|
|
return acc
|
|
},
|
|
{} as Record<string, LanguageData>
|
|
)
|
|
console.log(`✅ Extracted ${Object.keys(languages).length} languages.`)
|
|
return languages
|
|
}
|
|
|
|
/**
|
|
* Generates the content for the languages.ts file.
|
|
* @param languages The language data to include in the file.
|
|
* @returns The generated file content as a string.
|
|
*/
|
|
function generateLanguagesFileContent(languages: Record<string, LanguageData>): string {
|
|
console.log('📝 Generating languages.ts file content...')
|
|
const sortedLanguages = Object.fromEntries(Object.entries(languages).sort(([a], [b]) => a.localeCompare(b)))
|
|
|
|
const languagesObjectString = JSON.stringify(sortedLanguages, null, 2)
|
|
|
|
const content = `/**
|
|
* Code language list.
|
|
* Data source: linguist-languages
|
|
*
|
|
* ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
|
|
* THIS FILE IS AUTOMATICALLY GENERATED BY A SCRIPT. DO NOT EDIT IT MANUALLY!
|
|
* Run \`yarn update:languages\` to update this file.
|
|
* ⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️⚠️
|
|
*
|
|
*/
|
|
|
|
type LanguageData = {
|
|
type: string;
|
|
aliases?: string[];
|
|
extensions?: string[];
|
|
};
|
|
|
|
export const languages: Record<string, LanguageData> = ${languagesObjectString};
|
|
`
|
|
console.log('✅ File content generated.')
|
|
return content
|
|
}
|
|
|
|
/**
|
|
* Formats a file using Prettier.
|
|
* @param filePath The path to the file to format.
|
|
*/
|
|
async function formatWithPrettier(filePath: string): Promise<void> {
|
|
console.log('🎨 Formatting file with Prettier...')
|
|
try {
|
|
await execAsync(`yarn prettier --write ${filePath}`)
|
|
console.log('✅ Prettier formatting complete.')
|
|
} catch (e: any) {
|
|
console.error('❌ Prettier formatting failed:', e.stdout || e.stderr)
|
|
throw new Error('Prettier formatting failed.')
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Checks a file with TypeScript compiler.
|
|
* @param filePath The path to the file to check.
|
|
*/
|
|
async function checkTypeScript(filePath: string): Promise<void> {
|
|
console.log('🧐 Checking file with TypeScript compiler...')
|
|
try {
|
|
await execAsync(`yarn tsc --noEmit --skipLibCheck ${filePath}`)
|
|
console.log('✅ TypeScript check passed.')
|
|
} catch (e: any) {
|
|
console.error('❌ TypeScript check failed:', e.stdout || e.stderr)
|
|
throw new Error('TypeScript check failed.')
|
|
}
|
|
}
|
|
|
|
/**
|
|
* Main function to update the languages.ts file.
|
|
*/
|
|
async function updateLanguagesFile(): Promise<void> {
|
|
console.log('🚀 Starting to update languages.ts...')
|
|
try {
|
|
const extractedLanguages = extractAllLanguageData()
|
|
const fileContent = generateLanguagesFileContent(extractedLanguages)
|
|
|
|
await fs.writeFile(LANGUAGES_FILE_PATH, fileContent, 'utf-8')
|
|
console.log(`✅ Successfully wrote to ${LANGUAGES_FILE_PATH}`)
|
|
|
|
await formatWithPrettier(LANGUAGES_FILE_PATH)
|
|
await checkTypeScript(LANGUAGES_FILE_PATH)
|
|
|
|
console.log('🎉 Successfully updated languages.ts file!')
|
|
console.log(`📊 Contains ${Object.keys(extractedLanguages).length} languages.`)
|
|
} catch (error) {
|
|
console.error('❌ An error occurred during the update process:', (error as Error).message)
|
|
// No need to restore backup as we write only at the end of successful generation.
|
|
process.exit(1)
|
|
}
|
|
}
|
|
|
|
if (require.main === module) {
|
|
updateLanguagesFile()
|
|
}
|
|
|
|
export { updateLanguagesFile }
|