You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
53 lines
1.7 KiB
53 lines
1.7 KiB
const fs = require('fs');
|
|
const { parse, modify } = require('jsonc-parser');
|
|
const path = require('path');
|
|
|
|
/**
|
|
* 通用 JSONC 文件字段修改器(支持注释、嵌套路径)
|
|
* @param {string} filePath - JSON 或 JSONC 文件路径
|
|
* @param {string[]} fieldPath - 要修改的字段路径,如 ['a', 'b', 'c']
|
|
* @param {any} newValue - 要写入的新值
|
|
* @param {object} [options] - 可选项
|
|
* @param {number} [options.tabSize=2] - 缩进空格数
|
|
*/
|
|
function updateJsonFileField(filePath, fieldPath, newValue, options = {}) {
|
|
const tabSize = options.tabSize || 2;
|
|
if (!fs.existsSync(filePath)) {
|
|
console.warn(`[json-editor] 文件不存在: ${filePath}`);
|
|
return;
|
|
}
|
|
try {
|
|
const raw = fs.readFileSync(filePath, 'utf-8');
|
|
parse(raw); // 验证是否为合法 JSONC
|
|
|
|
const edits = modify(raw, fieldPath, newValue, {
|
|
formattingOptions: {
|
|
insertSpaces: true,
|
|
tabSize,
|
|
},
|
|
});
|
|
const updated = applyEdits(raw, edits);
|
|
fs.writeFileSync(filePath, updated, 'utf-8');
|
|
console.log(`[json-editor] ${path.basename(filePath)} -> 修改 ${fieldPath.join('.')} = ${JSON.stringify(newValue)}`);
|
|
} catch (err) {
|
|
console.error(`[json-editor] 修改失败: ${err.message}`);
|
|
}
|
|
}
|
|
|
|
/**
|
|
* 应用 jsonc-parser 的编辑操作
|
|
* @param {string} text
|
|
* @param {import('jsonc-parser').Edit[]} edits
|
|
* @returns {string}
|
|
*/
|
|
function applyEdits(text, edits) {
|
|
edits.sort((a, b) => b.offset - a.offset);
|
|
for (const edit of edits) {
|
|
text = text.slice(0, edit.offset) + edit.content + text.slice(edit.offset + edit.length);
|
|
}
|
|
return text;
|
|
}
|
|
|
|
module.exports = {
|
|
updateJsonFileField,
|
|
};
|