UNPKG

super-project-cli

Version:

CLI for creating project based on Super Project.

117 lines (100 loc) 4.45 kB
// 使用替换字符串的方法,以保留原始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