super-project-cli
Version:
CLI for creating project based on Super Project.
117 lines (100 loc) • 4.45 kB
JavaScript
// 使用替换字符串的方法,以保留原始JSON中的空行
const replace = (str, key, value, isStringified) => {
// console.log(value)
if (!isStringified) {
if (typeof value === 'object') {
const testSpaces = (new RegExp(`^([ \t]*)"${key}`, 'm')).exec(str)
const thisSpaces = testSpaces[1]
value = JSON.stringify(value, undefined, 1).replace(
new RegExp(`^([ \t]+)`, 'mg'),
(match, p1) => {
let r = thisSpaces
for (let i = 0; i < p1.length; i++) {
r += thisSpaces
}
return r
}
).replace(
new RegExp(`([ \s]*)}$`, ''),
`${thisSpaces}$1}`
)
} else
value = JSON.stringify(value)
}
return str.replace(
new RegExp(`^([ \s]*)"${key}":([ \s]*)(.+?)([,]*)$`, 'm'),
`$1"${key}":$2${value}$4`
)
}
const add = (str, key, value) => {
const testSpaces = /^([ \t]*)"/m.exec(str)
const spaces = testSpaces[1]
const testLastBracket = /([ \s]*)}$/.exec(str)
const resultValue = JSON.stringify(value, undefined, 1).replace(
new RegExp(`^([ \t]+)`, 'mg'),
(match, p1) => {
let r = spaces
for (let i = 0; i < p1.length; i++) {
r += spaces
}
return r
}
).replace(
new RegExp(`([ \s]*)}$`, ''),
`${spaces}$1}`
)
const exec = (new RegExp(`([ \s]*)}$`, '')).exec(str)
str = str.substr(0, exec.index - 1) + ',' + str.substr(exec.index - 1)
return str.replace(
new RegExp(`([ \s]*)}$`, ''),
`${spaces}"${key}": ${resultValue}\n$1}`
)
}
const merge = (originalString = '', mergeJson = {}) => {
// if (typeof originalJson === 'object') {
// return originalJson
// }
// originalString = originalString.replace(/\r\n/g, '\n')
const originalJson = JSON.parse(originalString)
let resultString = originalString
for (const key in mergeJson) {
if (typeof mergeJson[key] === 'object' && typeof originalJson[key] === 'object') {
// replace original string's current key value to ""
const testSpaces = (new RegExp(`^([ \t]*)"${key}`, 'm')).exec(originalString)
const thisSpaces = testSpaces[1]
// console.log('testSpaces', testSpaces)
const indexStart = testSpaces.index + `${thisSpaces}"${key}":`.length
// let partBefore = resultString.substr(0, indexStart)
// console.log('aaaa', partBefore.substr(partBefore.length - 2))
// if (partBefore.substr(partBefore.length) === '{') {
// }
const dividerBefore = `${thisSpaces}"${key}":`
const partBefore = resultString.split(dividerBefore)[0] + dividerBefore
// const partAfter = resultString.substr(indexStart)
const partAfter = resultString.split(dividerBefore)[1]
const strClosingBracket = `${thisSpaces}}`
const testClosingBracket = (new RegExp(`^${strClosingBracket}[,]*$`, 'm')).exec(partAfter)
// console.log('partBefore', partBefore)
// console.log('partAfter', partAfter)
// console.log('testClosingBracket', testClosingBracket)
const indexClosingBracket = testClosingBracket.index + strClosingBracket.length
const thisValue = partAfter.substr(0, testClosingBracket.index + strClosingBracket.length)
resultString = partBefore + '""' + partAfter.substr(indexClosingBracket)
// console.log(resultString)
// console.log('thisValue', thisValue)
// console.log(thisValue, mergeJson[key])
// console.log(merge(thisValue, mergeJson[key]))
resultString = replace(
resultString,
key,
merge(thisValue, mergeJson[key]),
true
)
} else if (typeof originalJson[key] === 'undefined') {
resultString = add(resultString, key, mergeJson[key])
} else
resultString = replace(resultString, key, mergeJson[key])
}
return resultString
}
module.exports = merge