Tengo una cadena de salida git diff analizada en esta matriz, lo que me da todas las dependencias modificadas en un archivo package.json:
const data = [ [ '-', '@date-io/moment', '1.3.13', '1', '3', '13' ], [ '+', '@date-io/moment', '1.3.14', '1', '3', '14' ], [ '-', '@emotion/react', '11.7.0', '11', '7', '0' ], [ '-', '@emotion/styled', '11.6.0', '11', '6', '0' ], [ '+', '@emotion/react', '11.8.2', '11', '8', '2' ], [ '+', '@emotion/styled', '11.8.1', '11', '8', '1' ] ] El primer elemento ( + - me muestra si este cambio se agregó o eliminó. El segundo elemento es el nombre del paquete (este es el elemento que conecta dos matrices), y los siguientes campos me dan la versión. Ahora necesito iterar esta matriz para averiguar qué tipo de cambio de versión se ha realizado para cada paquete. Entonces la salida debería ser:
{ '@date-io/moment': 'patch', '@emotion/react': 'minor', '@emotion/styled': 'minor' }Traté de obtener todos los paquetes haciendo
const result = {} data.forEach(d => { result[d[1]] = bump // how to calculate `bump`? }) Pero esto no maneja + y - y no calcula el tipo de aumento de versión.
Usando Array.prototype.reduce para reducir, puede reducir la matriz a un objeto y para cada paquete use Array.prototype.find para encontrar el cambio correspondiente. Luego puede comparar las versiones y determinar su cambio.
const data = [ [ '-', '@date-io/moment', '1.3.13', '1', '3', '13' ], [ '+', '@date-io/moment', '1.3.14', '1', '3', '14' ], [ '-', '@emotion/react', '11.7.0', '11', '7', '0' ], [ '-', '@emotion/styled', '11.6.0', '11', '6', '0' ], [ '+', '@emotion/react', '11.8.2', '11', '8', '2' ], [ '+', '@emotion/styled', '11.8.1', '11', '8', '1' ] ]; const changes = data.reduce((t, [type, name, , major, minor, patch], i, arr) => { if (type === "+") { const match = arr .find(([type, pName]) => type === "-" && pName === name); if (!match) { return t; // handle no match here } const [, , , pMajor, pMinor, pPatch] = match; return { ...t, [name]: pMajor !== major ? "major" : pMinor !== minor ? "minor" : "patch" } } return t; }, {}); console.log(changes);Map de todas las restas const data = [ ["-", "@date-io/moment", "1.3.13", "1", "3", "13"], ["+", "@date-io/moment", "1.3.14", "1", "3", "14"], ["-", "@emotion/react", "11.7.0", "11", "7", "0"], ["-", "@emotion/styled", "11.6.0", "11", "6", "0"], ["+", "@emotion/react", "11.8.2", "11", "8", "2"], ["+", "@emotion/styled", "11.8.1", "11", "8", "1"], ]; const subMap = new Map(data.filter((d) => d[0] === "-").map((d) => [d[1], d])); const additions = data.filter((d) => d[0] === "+"); const updates = additions.reduce((updates, addition) => { const pkgName = addition[1]; const [maj, min, patch] = addition.slice(-3); const [oldMaj, oldMin, oldPatch] = subMap.get(pkgName).slice(-3); if (maj === oldMaj && min === oldMin && patch >= oldPatch) { updates[pkgName] = "patch"; } else if (maj === oldMaj && min >= oldMin) { updates[pkgName] = "minor"; } else { updates[pkgName] = "major"; } return updates; }, {}); console.log(updates);