diff --git a/package-lock.json b/package-lock.json index 0036d1e..8bc93e9 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,6 +1,6 @@ { "name": "fivem-merge", - "version": "0.0.4", + "version": "0.0.5", "lockfileVersion": 1, "requires": true, "dependencies": { @@ -1174,6 +1174,11 @@ "path-exists": "^3.0.0" } }, + "lodash": { + "version": "4.17.21", + "resolved": "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz", + "integrity": "sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg==" + }, "lodash.clonedeep": { "version": "4.5.0", "resolved": "https://registry.npmjs.org/lodash.clonedeep/-/lodash.clonedeep-4.5.0.tgz", diff --git a/package.json b/package.json index 117b8f1..8646cf4 100644 --- a/package.json +++ b/package.json @@ -45,6 +45,7 @@ "chalk": "^4.1.2", "eslint-plugin-html": "^6.2.0", "fast-xml-parser": "^3.20.3", + "lodash": "^4.17.21", "luaparse": "^0.3.1", "md5-dir": "^0.2.0", "mri": "^1.2.0", diff --git a/src/util/Util.js b/src/util/Util.js index 12c1188..0cc26f1 100644 --- a/src/util/Util.js +++ b/src/util/Util.js @@ -3,6 +3,7 @@ const fs = require('fs'); const nodePath = require('path'); const xml = require('fast-xml-parser'); +const { isEqual } = require('lodash'); const lua = require('luaparse'); const xmlFormatter = require('xml-formatter'); const Manifest = require('./Manifest'); @@ -125,14 +126,18 @@ class Util extends null { const meta = Object.assign({}, meta0); for (const name in meta1) { - if (name === 'Item') { - if ([undefined, null].includes(meta[name])) meta[name] = meta1[name]; - else if (Array.isArray(meta[name])) meta[name] = [...meta[name], ...(Array.isArray(meta1[name]) ? meta1[name] : [meta1[name]])]; - } else if (typeof meta1[name] === 'object' && meta1[name] !== null) { + if (typeof meta1[name] === 'object' && meta1[name] !== null && name !== 'Item') { meta[name] = Util.mergeMeta(meta[name], meta1[name]); } else if (meta1[name] !== '') { - if (![undefined, null].includes(meta[name]) && !Array.isArray(meta[name])) meta[name] = [meta[name]]; - if (!meta[name].includes(meta1[name])) meta[name] = (meta[name] ?? []).push(meta1[name]); + if ([undefined, null].includes(meta[name])) { + meta[name] = meta1[name]; + } else { + const fixedMeta1Array = Array.isArray(meta1[name]) ? meta1[name] : [meta1[name]]; + if (!Array.isArray(meta[name])) meta[name] = [meta[name]]; + for (const fixedMeta1 of fixedMeta1Array) { + if (!meta[name].some(v => isEqual(v, fixedMeta1))) meta[name].push(fixedMeta1); + } + } } }