chore: import upstream snapshot with attribution
This commit is contained in:
@@ -0,0 +1,91 @@
|
||||
import fs from 'node:fs'
|
||||
import path from 'node:path'
|
||||
|
||||
import { PROFILE_TOOLS_PATH, TOOLS_PATH } from '@/constants'
|
||||
|
||||
import { createSetupStatus } from './setup-status'
|
||||
import { mergeMissingSettings } from './settings-merge'
|
||||
|
||||
const TOOL_SETTINGS_SAMPLE_FILENAME = 'settings.sample.json'
|
||||
const TOOL_SETTINGS_FILENAME = 'settings.json'
|
||||
|
||||
function readJSONFile(filePath) {
|
||||
return JSON.parse(fs.readFileSync(filePath, 'utf8'))
|
||||
}
|
||||
|
||||
async function syncToolSettings(toolkitId, toolId, toolPath) {
|
||||
const settingsSamplePath = path.join(toolPath, TOOL_SETTINGS_SAMPLE_FILENAME)
|
||||
|
||||
if (!fs.existsSync(settingsSamplePath)) {
|
||||
throw new Error(
|
||||
`The "${toolkitId}.${toolId}" tool settings sample does not exist.`
|
||||
)
|
||||
}
|
||||
|
||||
const settingsPath = path.join(
|
||||
PROFILE_TOOLS_PATH,
|
||||
toolkitId,
|
||||
toolId,
|
||||
TOOL_SETTINGS_FILENAME
|
||||
)
|
||||
const settingsSample = readJSONFile(settingsSamplePath)
|
||||
const currentSettings = fs.existsSync(settingsPath)
|
||||
? readJSONFile(settingsPath)
|
||||
: {}
|
||||
const mergedSettings = mergeMissingSettings(settingsSample, currentSettings)
|
||||
|
||||
if (
|
||||
fs.existsSync(settingsPath) &&
|
||||
JSON.stringify(currentSettings) === JSON.stringify(mergedSettings)
|
||||
) {
|
||||
return
|
||||
}
|
||||
|
||||
await fs.promises.mkdir(path.dirname(settingsPath), { recursive: true })
|
||||
await fs.promises.writeFile(
|
||||
settingsPath,
|
||||
`${JSON.stringify(mergedSettings, null, 2)}\n`
|
||||
)
|
||||
}
|
||||
|
||||
/**
|
||||
* Create or update profile settings for built-in tools.
|
||||
*/
|
||||
export default async function setupToolsSettings() {
|
||||
const status = createSetupStatus('Setting up tool settings...').start()
|
||||
|
||||
try {
|
||||
for (const toolkitEntry of fs.readdirSync(TOOLS_PATH, {
|
||||
withFileTypes: true
|
||||
})) {
|
||||
if (!toolkitEntry.isDirectory()) {
|
||||
continue
|
||||
}
|
||||
|
||||
const toolkitId = toolkitEntry.name
|
||||
const toolkitPath = path.join(TOOLS_PATH, toolkitId)
|
||||
const toolkitConfigPath = path.join(toolkitPath, 'toolkit.json')
|
||||
|
||||
if (!fs.existsSync(toolkitConfigPath)) {
|
||||
continue
|
||||
}
|
||||
|
||||
const toolkitConfig = readJSONFile(toolkitConfigPath)
|
||||
|
||||
for (const toolId of toolkitConfig.tools || []) {
|
||||
const toolPath = path.join(toolkitPath, toolId)
|
||||
|
||||
if (!fs.existsSync(path.join(toolPath, 'tool.json'))) {
|
||||
continue
|
||||
}
|
||||
|
||||
await syncToolSettings(toolkitId, toolId, toolPath)
|
||||
}
|
||||
}
|
||||
|
||||
status.succeed('Tool settings: ready')
|
||||
} catch (e) {
|
||||
status.fail('Failed to set up tool settings')
|
||||
throw e
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user