diff --git a/package-lock.json b/package-lock.json index 298b74ed..4ad58138 100644 --- a/package-lock.json +++ b/package-lock.json @@ -1,35 +1,29 @@ { "name": "@agility/cli", - "version": "1.0.0-beta.13.14", + "version": "1.0.0", "lockfileVersion": 3, "requires": true, "packages": { "": { "name": "@agility/cli", - "version": "1.0.0-beta.13.14", + "version": "1.0.0", "license": "ISC", "dependencies": { - "@agility/content-fetch": "^2.0.10", "@agility/content-sync": "^1.2.0", "@agility/management-sdk": "^0.1.38", "ansi-colors": "^4.1.3", - "blessed": "^0.1.81", - "blessed-contrib": "^4.11.0", + "axios": "^0.27.2", "cli-progress": "^3.11.2", "date-fns": "^4.1.0", + "dotenv": "^8.6.0", "form-data": "^4.0.5", - "fuzzy": "^0.1.3", "inquirer": "^8.0.0", - "inquirer-checkbox-plus-prompt": "^1.4.2", - "inquirer-fs-selector": "^1.5.0", - "inquirer-fuzzy-path": "^2.3.0", "inquirer-search-list": "^1.2.6", "keytar": "^7.9.0", - "log-update": "^5.0.1", + "lodash": "^4.17.21", "open": "^8.4.0", - "ora": "^5.4.1", + "proper-lockfile": "^4.1.2", "tsconfig-paths": "^4.2.0", - "wrap-ansi": "^9.0.0", "yargs": "^17.6.2" }, "bin": { @@ -37,7 +31,6 @@ "agility-cli": "dist/index.js" }, "devDependencies": { - "@types/form-data": "^2.2.1", "@types/inquirer": "^9.0.3", "@types/jest": "^29.5.14", "@types/node": "^18.11.17", @@ -52,15 +45,6 @@ "typescript": "^5.8.3" } }, - "node_modules/@agility/content-fetch": { - "version": "2.0.10", - "resolved": "https://registry.npmjs.org/@agility/content-fetch/-/content-fetch-2.0.10.tgz", - "integrity": "sha512-DhEQtd4943M4aQKXuYxDFOKSTbP68CqwMCBxVkPhXAExNyeNNHLt2s3O55pF3OzVAMnIFByw71BLz8lKQmeB3Q==", - "license": "MIT", - "engines": { - "node": ">= 18.0.0" - } - }, "node_modules/@agility/content-sync": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@agility/content-sync/-/content-sync-1.2.0.tgz", @@ -623,16 +607,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@colors/colors": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz", - "integrity": "sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ==", - "license": "MIT", - "optional": true, - "engines": { - "node": ">=0.1.90" - } - }, "node_modules/@cspotcode/source-map-support": { "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", @@ -1625,16 +1599,6 @@ "dev": true, "license": "MIT" }, - "node_modules/@types/form-data": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz", - "integrity": "sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ==", - "dev": true, - "license": "MIT", - "dependencies": { - "@types/node": "*" - } - }, "node_modules/@types/graceful-fs": { "version": "4.1.9", "resolved": "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz", @@ -2030,12 +1994,6 @@ "url": "https://opencollective.com/eslint" } }, - "node_modules/abbrev": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz", - "integrity": "sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q==", - "license": "ISC" - }, "node_modules/acorn": { "version": "8.15.0", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.15.0.tgz", @@ -2113,39 +2071,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/ansi-regex": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz", - "integrity": "sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-styles": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz", - "integrity": "sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA==", - "license": "MIT", - "engines": { - "node": ">=0.10.0" - } - }, - "node_modules/ansi-term": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/ansi-term/-/ansi-term-0.0.2.tgz", - "integrity": "sha512-jLnGE+n8uAjksTJxiWZf/kcUmXq+cRWSl550B9NmQ8YiqaTM+lILcSe5dHdp8QkJPhaOghDjnMKwyYSMjosgAA==", - "license": "ISC", - "dependencies": { - "x256": ">=0.0.1" - } - }, - "node_modules/ansicolors": { - "version": "0.3.2", - "resolved": "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz", - "integrity": "sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg==", - "license": "MIT" - }, "node_modules/anymatch": { "version": "3.1.3", "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", @@ -2423,40 +2348,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/blessed": { - "version": "0.1.81", - "resolved": "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz", - "integrity": "sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ==", - "license": "MIT", - "bin": { - "blessed": "bin/tput.js" - }, - "engines": { - "node": ">= 0.8.0" - } - }, - "node_modules/blessed-contrib": { - "version": "4.11.0", - "resolved": "https://registry.npmjs.org/blessed-contrib/-/blessed-contrib-4.11.0.tgz", - "integrity": "sha512-P00Xji3xPp53+FdU9f74WpvnOAn/SS0CKLy4vLAf5Ps7FGDOTY711ruJPZb3/7dpFuP+4i7f4a/ZTZdLlKG9WA==", - "license": "MIT", - "dependencies": { - "ansi-term": ">=0.0.2", - "chalk": "^1.1.0", - "drawille-canvas-blessed-contrib": ">=0.1.3", - "lodash": "~>=4.17.21", - "map-canvas": ">=0.1.5", - "marked": "^4.0.12", - "marked-terminal": "^5.1.1", - "memory-streams": "^0.1.0", - "memorystream": "^0.3.1", - "picture-tuber": "^1.0.1", - "sparkline": "^0.1.1", - "strip-ansi": "^3.0.0", - "term-canvas": "0.0.5", - "x256": ">=0.0.1" - } - }, "node_modules/brace-expansion": { "version": "1.1.12", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz", @@ -2481,12 +2372,6 @@ "node": ">=8" } }, - "node_modules/bresenham": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/bresenham/-/bresenham-0.0.3.tgz", - "integrity": "sha512-wbMxoJJM1p3+6G7xEFXYNCJ30h2qkwmVxebkbwIl4OcnWtno5R3UT9VuYLfStlVNAQCmRjkGwjPFdfaPd4iNXw==", - "license": "MIT" - }, "node_modules/browserslist": { "version": "4.25.1", "resolved": "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz", @@ -2574,14 +2459,6 @@ "dev": true, "license": "MIT" }, - "node_modules/buffers": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz", - "integrity": "sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ==", - "engines": { - "node": ">=0.2.0" - } - }, "node_modules/cache-control-esm": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/cache-control-esm/-/cache-control-esm-1.0.0.tgz", @@ -2642,35 +2519,6 @@ ], "license": "CC-BY-4.0" }, - "node_modules/cardinal": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz", - "integrity": "sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw==", - "license": "MIT", - "dependencies": { - "ansicolors": "~0.3.2", - "redeyed": "~2.1.0" - }, - "bin": { - "cdl": "bin/cdl.js" - } - }, - "node_modules/chalk": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz", - "integrity": "sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^2.2.1", - "escape-string-regexp": "^1.0.2", - "has-ansi": "^2.0.0", - "strip-ansi": "^3.0.0", - "supports-color": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/char-regex": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz", @@ -2696,12 +2544,6 @@ "node": "*" } }, - "node_modules/charm": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz", - "integrity": "sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ==", - "license": "MIT/X11" - }, "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", @@ -2767,21 +2609,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/cli-table3": { - "version": "0.6.5", - "resolved": "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz", - "integrity": "sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ==", - "license": "MIT", - "dependencies": { - "string-width": "^4.2.0" - }, - "engines": { - "node": "10.* || >= 12.*" - }, - "optionalDependencies": { - "@colors/colors": "1.5.0" - } - }, "node_modules/cli-width": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-3.0.0.tgz", @@ -2929,12 +2756,6 @@ "dev": true, "license": "MIT" }, - "node_modules/core-util-is": { - "version": "1.0.3", - "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", - "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", - "license": "MIT" - }, "node_modules/create-jest": { "version": "29.7.0", "resolved": "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz", @@ -3196,25 +3017,6 @@ "node": ">=10" } }, - "node_modules/drawille-blessed-contrib": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/drawille-blessed-contrib/-/drawille-blessed-contrib-1.0.0.tgz", - "integrity": "sha512-WnHMgf5en/hVOsFhxLI8ZX0qTJmerOsVjIMQmn4cR1eI8nLGu+L7w5ENbul+lZ6w827A3JakCuernES5xbHLzQ==", - "license": "MIT" - }, - "node_modules/drawille-canvas-blessed-contrib": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/drawille-canvas-blessed-contrib/-/drawille-canvas-blessed-contrib-0.1.3.tgz", - "integrity": "sha512-bdDvVJOxlrEoPLifGDPaxIzFh3cD7QH05ePoQ4fwnqfi08ZSxzEhOUpI5Z0/SQMlWgcCQOEtuw0zrwezacXglw==", - "license": "MIT", - "dependencies": { - "ansi-term": ">=0.0.2", - "bresenham": "0.0.3", - "drawille-blessed-contrib": ">=0.0.1", - "gl-matrix": "^2.1.0", - "x256": ">=0.0.1" - } - }, "node_modules/dunder-proto": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz", @@ -3229,12 +3031,6 @@ "node": ">= 0.4" } }, - "node_modules/eastasianwidth": { - "version": "0.2.0", - "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", - "integrity": "sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA==", - "license": "MIT" - }, "node_modules/ejs": { "version": "3.1.10", "resolved": "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz", @@ -3615,6 +3411,7 @@ "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "dev": true, "license": "BSD-2-Clause", "bin": { "esparse": "bin/esparse.js", @@ -3670,29 +3467,6 @@ "node": ">=0.10.0" } }, - "node_modules/event-stream": { - "version": "0.9.8", - "resolved": "https://registry.npmjs.org/event-stream/-/event-stream-0.9.8.tgz", - "integrity": "sha512-o5h0Mp1bkoR6B0i7pTCAzRy+VzdsRWH997KQD4Psb0EOPoKEIiaRx/EsOdUl7p1Ktjw7aIWvweI/OY1R9XrlUg==", - "dependencies": { - "optimist": "0.2" - }, - "engines": { - "node": "*" - } - }, - "node_modules/event-stream/node_modules/optimist": { - "version": "0.2.8", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz", - "integrity": "sha512-Wy7E3cQDpqsTIFyW7m22hSevyTLxw850ahYv7FWsw4G6MIKVTZ8NSA95KBrQ95a4SMsMr1UGUUnwEFKhVaSzIg==", - "license": "MIT/X11", - "dependencies": { - "wordwrap": ">=0.0.1 <0.1.0" - }, - "engines": { - "node": "*" - } - }, "node_modules/execa": { "version": "5.1.1", "resolved": "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz", @@ -4006,18 +3780,6 @@ "node": "6.* || 8.* || >= 10.*" } }, - "node_modules/get-east-asian-width": { - "version": "1.3.0", - "resolved": "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz", - "integrity": "sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ==", - "license": "MIT", - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/get-intrinsic": { "version": "1.3.0", "resolved": "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz", @@ -4084,12 +3846,6 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", "license": "MIT" }, - "node_modules/gl-matrix": { - "version": "2.8.1", - "resolved": "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.8.1.tgz", - "integrity": "sha512-0YCjVpE3pS5XWlN3J4X7AiAx65+nqAI54LndtVFnQZB6G/FVLkZH8y8V6R3cIoOQR4pUdfwQGd1iwyoXHJ4Qfw==", - "license": "MIT" - }, "node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -4156,18 +3912,6 @@ "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", "license": "ISC" }, - "node_modules/has-ansi": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz", - "integrity": "sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/has-flag": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", @@ -4216,12 +3960,6 @@ "node": ">= 0.4" } }, - "node_modules/here": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/here/-/here-0.0.2.tgz", - "integrity": "sha512-U7VYImCTcPoY27TSmzoiFsmWLEqQFaYNdpsPb9K0dXJhE6kufUqycaz51oR09CW85dDU9iWyy7At8M+p7hb3NQ==", - "license": "MIT" - }, "node_modules/html-escaper": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz", @@ -4388,520 +4126,93 @@ "node": ">=12.0.0" } }, - "node_modules/inquirer-autocomplete-prompt": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.4.0.tgz", - "integrity": "sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw==", - "license": "ISC", - "dependencies": { - "ansi-escapes": "^4.3.1", - "chalk": "^4.0.0", - "figures": "^3.2.0", - "run-async": "^2.4.0", - "rxjs": "^6.6.2" - }, - "engines": { - "node": ">=10" - }, - "peerDependencies": { - "inquirer": "^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0" - } - }, - "node_modules/inquirer-autocomplete-prompt/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/inquirer-search-list": { + "version": "1.2.6", + "resolved": "https://registry.npmjs.org/inquirer-search-list/-/inquirer-search-list-1.2.6.tgz", + "integrity": "sha512-C4pKSW7FOYnkAloH8rB4FiM91H1v08QFZZJh6KRt//bMfdDBIhgdX8wjHvrVH2bu5oIo6wYqGpzSBxkeClPxew==", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "chalk": "^2.3.0", + "figures": "^2.0.0", + "fuzzy": "^0.1.3", + "inquirer": "^3.3.0" } }, - "node_modules/inquirer-autocomplete-prompt/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/inquirer-search-list/node_modules/ansi-escapes": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", + "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" } }, - "node_modules/inquirer-autocomplete-prompt/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/inquirer-search-list/node_modules/ansi-regex": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", + "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, "engines": { - "node": ">=8" + "node": ">=4" } }, - "node_modules/inquirer-checkbox-plus-prompt": { - "version": "1.4.2", - "resolved": "https://registry.npmjs.org/inquirer-checkbox-plus-prompt/-/inquirer-checkbox-plus-prompt-1.4.2.tgz", - "integrity": "sha512-W8/NL9x5A81Oq9ZfbYW5c1LuwtAhc/oB/u9YZZejna0pqrajj27XhnUHygJV0Vn5TvcDy1VJcD2Ld9kTk40dvg==", + "node_modules/inquirer-search-list/node_modules/ansi-styles": { + "version": "3.2.1", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", + "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", "license": "MIT", "dependencies": { - "chalk": "4.1.2", - "cli-cursor": "^3.1.0", - "figures": "^3.0.0", - "lodash": "^4.17.5", - "rxjs": "^6.6.7" + "color-convert": "^1.9.0" }, - "peerDependencies": { - "inquirer": "< 9.x" + "engines": { + "node": ">=4" } }, - "node_modules/inquirer-checkbox-plus-prompt/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", + "node_modules/inquirer-search-list/node_modules/chalk": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", + "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", "license": "MIT", "dependencies": { - "color-convert": "^2.0.1" + "ansi-styles": "^3.2.1", + "escape-string-regexp": "^1.0.5", + "supports-color": "^5.3.0" }, "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" + "node": ">=4" } }, - "node_modules/inquirer-checkbox-plus-prompt/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", + "node_modules/inquirer-search-list/node_modules/chardet": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", + "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", + "license": "MIT" + }, + "node_modules/inquirer-search-list/node_modules/cli-cursor": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", + "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", "license": "MIT", "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" + "restore-cursor": "^2.0.0" }, "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" + "node": ">=4" } }, - "node_modules/inquirer-checkbox-plus-prompt/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", + "node_modules/inquirer-search-list/node_modules/cli-width": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", + "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", + "license": "ISC" + }, + "node_modules/inquirer-search-list/node_modules/color-convert": { + "version": "1.9.3", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", + "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", "license": "MIT", "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer-fs-selector": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/inquirer-fs-selector/-/inquirer-fs-selector-1.5.0.tgz", - "integrity": "sha512-mteT9/8cYqv6QvoZQXRLIkzONe7tFPl1AFo/Tg3SpYk1scCVfJay/yqRR/kgLKLr23vuSYoq/MuF5GThmNxciQ==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.2", - "cli-cursor": "^3.1.0", - "figures": "^3.2.0", - "rx-lite": "^4.0.8" - }, - "engines": { - "node": ">=6.0.0" - }, - "peerDependencies": { - "inquirer": ">=5 <=8" - } - }, - "node_modules/inquirer-fs-selector/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/inquirer-fs-selector/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/inquirer-fs-selector/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/inquirer-fuzzy-path": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/inquirer-fuzzy-path/-/inquirer-fuzzy-path-2.3.0.tgz", - "integrity": "sha512-zfHC/97GSkxKKM7IctZM22x1sVi+FYBh9oaHTmI7Er/GKFpNykUgtviTmqqpiFQs5yJoSowxbT0PHy6N+H+QRg==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "fuzzy": "^0.1.3", - "inquirer": "^6.0.0", - "inquirer-autocomplete-prompt": "^1.0.2", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=8.0" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "license": "ISC" - }, - "node_modules/inquirer-fuzzy-path/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/color-name": { - "version": "1.1.3", - "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.3.tgz", - "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==", - "license": "MIT" - }, - "node_modules/inquirer-fuzzy-path/node_modules/figures": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/figures/-/figures-2.0.0.tgz", - "integrity": "sha512-Oa2M9atig69ZkfwiApY8F2Yy+tzMbazyvqv21R0NsSC8floSOC09BbT1ITWAdoMGQvJ/aZnR1KMwdx9tvHnTNA==", - "license": "MIT", - "dependencies": { - "escape-string-regexp": "^1.0.5" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/has-flag": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", - "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/inquirer": { - "version": "6.5.2", - "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz", - "integrity": "sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^3.2.0", - "chalk": "^2.4.2", - "cli-cursor": "^2.1.0", - "cli-width": "^2.0.0", - "external-editor": "^3.0.3", - "figures": "^2.0.0", - "lodash": "^4.17.12", - "mute-stream": "0.0.7", - "run-async": "^2.2.0", - "rxjs": "^6.4.0", - "string-width": "^2.1.0", - "strip-ansi": "^5.1.0", - "through": "^2.3.6" - }, - "engines": { - "node": ">=6.0.0" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/inquirer/node_modules/ansi-regex": { - "version": "4.1.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz", - "integrity": "sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g==", - "license": "MIT", - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/inquirer/node_modules/strip-ansi": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz", - "integrity": "sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^4.1.0" - }, - "engines": { - "node": ">=6" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/is-fullwidth-code-point": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-2.0.0.tgz", - "integrity": "sha512-VHskAKYM8RfSFXwee5t5cbN5PZeq1Wrh6qd5bkyiXIf6UQcN6w/A0eXM9r6t8d+GYOh+o6ZhiEnb88LN/Y8m2w==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/mimic-fn": { - "version": "1.2.0", - "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-1.2.0.tgz", - "integrity": "sha512-jf84uxzwiuiIVKiOLpfYk7N46TSy8ubTonmneY9vrpHNAnp0QBt2BxWV9dO3/j+BoVAb+a5G6YDPW3M5HOdMWQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/mute-stream": { - "version": "0.0.7", - "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-0.0.7.tgz", - "integrity": "sha512-r65nCZhrbXXb6dXOACihYApHw2Q6pV0M3V0PSxd74N0+D8nzAdEAITq2oAjA1jVnKI+tGvEBUpqiMh0+rW6zDQ==", - "license": "ISC" - }, - "node_modules/inquirer-fuzzy-path/node_modules/onetime": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/onetime/-/onetime-2.0.1.tgz", - "integrity": "sha512-oyyPpiMaKARvvcgip+JV+7zci5L8D1W9RZIz2l1o08AM3pfspitVWnPt3mzHcBPp12oYMTy0pqrFs/C+m3EwsQ==", - "license": "MIT", - "dependencies": { - "mimic-fn": "^1.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/restore-cursor": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-2.0.0.tgz", - "integrity": "sha512-6IzJLuGi4+R14vwagDHX+JrXmPVtPpn4mffDJ1UdR7/Edm87fl6yi8mMBIVvFtJaNTUvjughmW4hwLhRG7gC1Q==", - "license": "MIT", - "dependencies": { - "onetime": "^2.0.0", - "signal-exit": "^3.0.2" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/string-width": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-2.1.1.tgz", - "integrity": "sha512-nOqH59deCq9SRHlxq1Aw85Jnt4w6KvLKqWVik6oA9ZklXLNIOlqg4F2yrT1MVaTjAqvVwdfeZ7w7aCvJD7ugkw==", - "license": "MIT", - "dependencies": { - "is-fullwidth-code-point": "^2.0.0", - "strip-ansi": "^4.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/strip-ansi": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz", - "integrity": "sha512-4XaJ2zQdCzROZDivEVIDPkcQn8LMFSa8kj8Gxb/Lnwzv9A8VctNZ+lfivC/sV3ivW8ElJTERXZoPBRrZKkNKow==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-fuzzy-path/node_modules/supports-color": { - "version": "5.5.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", - "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "license": "MIT", - "dependencies": { - "has-flag": "^3.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-search-list": { - "version": "1.2.6", - "resolved": "https://registry.npmjs.org/inquirer-search-list/-/inquirer-search-list-1.2.6.tgz", - "integrity": "sha512-C4pKSW7FOYnkAloH8rB4FiM91H1v08QFZZJh6KRt//bMfdDBIhgdX8wjHvrVH2bu5oIo6wYqGpzSBxkeClPxew==", - "license": "MIT", - "dependencies": { - "chalk": "^2.3.0", - "figures": "^2.0.0", - "fuzzy": "^0.1.3", - "inquirer": "^3.3.0" - } - }, - "node_modules/inquirer-search-list/node_modules/ansi-escapes": { - "version": "3.2.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz", - "integrity": "sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-search-list/node_modules/ansi-regex": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz", - "integrity": "sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw==", - "license": "MIT", - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-search-list/node_modules/ansi-styles": { - "version": "3.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz", - "integrity": "sha512-VT0ZI6kZRdTh8YyJw3SMbYm/u+NqfsAxEpWO0Pf9sq8/e94WxxOpPKx9FR1FlyCtOVDNOQ+8ntlqFxiRc+r5qA==", - "license": "MIT", - "dependencies": { - "color-convert": "^1.9.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-search-list/node_modules/chalk": { - "version": "2.4.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", - "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^3.2.1", - "escape-string-regexp": "^1.0.5", - "supports-color": "^5.3.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-search-list/node_modules/chardet": { - "version": "0.4.2", - "resolved": "https://registry.npmjs.org/chardet/-/chardet-0.4.2.tgz", - "integrity": "sha512-j/Toj7f1z98Hh2cYo2BVr85EpIRWqUi7rtRSGxh/cqUjqrnJe9l9UE7IUGd2vQ2p+kSHLkSzObQPZPLUC6TQwg==", - "license": "MIT" - }, - "node_modules/inquirer-search-list/node_modules/cli-cursor": { - "version": "2.1.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-2.1.0.tgz", - "integrity": "sha512-8lgKz8LmCRYZZQDpRyT2m5rKJ08TnU4tR9FFFW2rxpxR1FzWi4PQ/NfyODchAatHaUgnSPVcx/R5w6NuTBzFiw==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^2.0.0" - }, - "engines": { - "node": ">=4" - } - }, - "node_modules/inquirer-search-list/node_modules/cli-width": { - "version": "2.2.1", - "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz", - "integrity": "sha512-GRMWDxpOB6Dgk2E5Uo+3eEBvtOOlimMmpbFiKuLFnQzYDavtLFY3K5ona41jgN/WdRZtG7utuVSVTL4HbZHGkw==", - "license": "ISC" - }, - "node_modules/inquirer-search-list/node_modules/color-convert": { - "version": "1.9.3", - "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", - "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "license": "MIT", - "dependencies": { - "color-name": "1.1.3" + "color-name": "1.1.3" } }, "node_modules/inquirer-search-list/node_modules/color-name": { @@ -5185,18 +4496,6 @@ "node": ">=0.10.0" } }, - "node_modules/is-fullwidth-code-point": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz", - "integrity": "sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, "node_modules/is-generator-fn": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz", @@ -5276,12 +4575,6 @@ "node": ">=8" } }, - "node_modules/isarray": { - "version": "0.0.1", - "resolved": "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz", - "integrity": "sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ==", - "license": "MIT" - }, "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", @@ -6863,216 +6156,60 @@ "node_modules/log-symbols": { "version": "4.1.0", "resolved": "https://registry.npmjs.org/log-symbols/-/log-symbols-4.1.0.tgz", - "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", - "license": "MIT", - "dependencies": { - "chalk": "^4.1.0", - "is-unicode-supported": "^0.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-symbols/node_modules/ansi-styles": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", - "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "license": "MIT", - "dependencies": { - "color-convert": "^2.0.1" - }, - "engines": { - "node": ">=8" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/chalk": { - "version": "4.1.2", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", - "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^4.1.0", - "supports-color": "^7.1.0" - }, - "engines": { - "node": ">=10" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, - "node_modules/log-symbols/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/log-update": { - "version": "5.0.1", - "resolved": "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz", - "integrity": "sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^5.0.0", - "cli-cursor": "^4.0.0", - "slice-ansi": "^5.0.0", - "strip-ansi": "^7.0.1", - "wrap-ansi": "^8.0.1" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-escapes": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz", - "integrity": "sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA==", - "license": "MIT", - "dependencies": { - "type-fest": "^1.0.2" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/log-update/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/log-update/node_modules/cli-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz", - "integrity": "sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg==", - "license": "MIT", - "dependencies": { - "restore-cursor": "^4.0.0" - }, - "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/log-update/node_modules/emoji-regex": { - "version": "9.2.2", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz", - "integrity": "sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg==", - "license": "MIT" - }, - "node_modules/log-update/node_modules/restore-cursor": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz", - "integrity": "sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg==", + "integrity": "sha512-8XPvpAA8uyhfteu8pIvQxpJZ7SYYdpUivZpGy6sFsBuKRY/7rQGavedeB8aK+Zkyq6upMFVL/9AW6vOYzfRyLg==", "license": "MIT", "dependencies": { - "onetime": "^5.1.0", - "signal-exit": "^3.0.2" + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" }, "engines": { - "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + "node": ">=10" }, "funding": { "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/log-update/node_modules/string-width": { - "version": "5.1.2", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz", - "integrity": "sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA==", + "node_modules/log-symbols/node_modules/ansi-styles": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", + "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", "license": "MIT", "dependencies": { - "eastasianwidth": "^0.2.0", - "emoji-regex": "^9.2.2", - "strip-ansi": "^7.0.1" + "color-convert": "^2.0.1" }, "engines": { - "node": ">=12" + "node": ">=8" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/ansi-styles?sponsor=1" } }, - "node_modules/log-update/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", + "node_modules/log-symbols/node_modules/chalk": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", + "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", "license": "MIT", "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" + "ansi-styles": "^4.1.0", + "supports-color": "^7.1.0" }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, - "node_modules/log-update/node_modules/type-fest": { - "version": "1.4.0", - "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz", - "integrity": "sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA==", - "license": "(MIT OR CC0-1.0)", "engines": { "node": ">=10" }, "funding": { - "url": "https://github.com/sponsors/sindresorhus" + "url": "https://github.com/chalk/chalk?sponsor=1" } }, - "node_modules/log-update/node_modules/wrap-ansi": { - "version": "8.1.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz", - "integrity": "sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ==", + "node_modules/log-symbols/node_modules/supports-color": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", + "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", "license": "MIT", "dependencies": { - "ansi-styles": "^6.1.0", - "string-width": "^5.0.1", - "strip-ansi": "^7.0.1" + "has-flag": "^4.0.0" }, "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + "node": ">=8" } }, "node_modules/lru-cache": { @@ -7131,72 +6268,6 @@ "tmpl": "1.0.5" } }, - "node_modules/map-canvas": { - "version": "0.1.5", - "resolved": "https://registry.npmjs.org/map-canvas/-/map-canvas-0.1.5.tgz", - "integrity": "sha512-f7M3sOuL9+up0NCOZbb1rQpWDLZwR/ftCiNbyscjl9LUUEwrRaoumH4sz6swgs58lF21DQ0hsYOCw5C6Zz7hbg==", - "license": "ISC", - "dependencies": { - "drawille-canvas-blessed-contrib": ">=0.0.1", - "xml2js": "^0.4.5" - } - }, - "node_modules/marked": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz", - "integrity": "sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A==", - "license": "MIT", - "bin": { - "marked": "bin/marked.js" - }, - "engines": { - "node": ">= 12" - } - }, - "node_modules/marked-terminal": { - "version": "5.2.0", - "resolved": "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz", - "integrity": "sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA==", - "license": "MIT", - "dependencies": { - "ansi-escapes": "^6.2.0", - "cardinal": "^2.1.1", - "chalk": "^5.2.0", - "cli-table3": "^0.6.3", - "node-emoji": "^1.11.0", - "supports-hyperlinks": "^2.3.0" - }, - "engines": { - "node": ">=14.13.1 || >=16.0.0" - }, - "peerDependencies": { - "marked": "^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0" - } - }, - "node_modules/marked-terminal/node_modules/ansi-escapes": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz", - "integrity": "sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig==", - "license": "MIT", - "engines": { - "node": ">=14.16" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/marked-terminal/node_modules/chalk": { - "version": "5.4.1", - "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz", - "integrity": "sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w==", - "license": "MIT", - "engines": { - "node": "^12.17.0 || ^14.13 || >=16.0.0" - }, - "funding": { - "url": "https://github.com/chalk/chalk?sponsor=1" - } - }, "node_modules/math-intrinsics": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz", @@ -7217,23 +6288,6 @@ "is-buffer": "~1.1.6" } }, - "node_modules/memory-streams": { - "version": "0.1.3", - "resolved": "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz", - "integrity": "sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA==", - "license": "MIT", - "dependencies": { - "readable-stream": "~1.0.2" - } - }, - "node_modules/memorystream": { - "version": "0.3.1", - "resolved": "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz", - "integrity": "sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw==", - "engines": { - "node": ">= 0.10.0" - } - }, "node_modules/merge-stream": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", @@ -7381,15 +6435,6 @@ "integrity": "sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ==", "license": "MIT" }, - "node_modules/node-emoji": { - "version": "1.11.0", - "resolved": "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz", - "integrity": "sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A==", - "license": "MIT", - "dependencies": { - "lodash": "^4.17.21" - } - }, "node_modules/node-int64": { "version": "0.4.0", "resolved": "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz", @@ -7404,18 +6449,6 @@ "dev": true, "license": "MIT" }, - "node_modules/nopt": { - "version": "2.1.2", - "resolved": "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz", - "integrity": "sha512-x8vXm7BZ2jE1Txrxh/hO74HTuYZQEbo8edoRcANgdZ4+PCV+pbjd/xdummkmjjC7LU5EjPzlu8zEq/oxWylnKA==", - "license": "MIT", - "dependencies": { - "abbrev": "1" - }, - "bin": { - "nopt": "bin/nopt.js" - } - }, "node_modules/normalize-path": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", @@ -7480,15 +6513,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/optimist": { - "version": "0.3.7", - "resolved": "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz", - "integrity": "sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ==", - "license": "MIT/X11", - "dependencies": { - "wordwrap": "~0.0.2" - } - }, "node_modules/optionator": { "version": "0.9.4", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz", @@ -7747,26 +6771,6 @@ "url": "https://github.com/sponsors/jonschlinkert" } }, - "node_modules/picture-tuber": { - "version": "1.0.2", - "resolved": "https://registry.npmjs.org/picture-tuber/-/picture-tuber-1.0.2.tgz", - "integrity": "sha512-49/xq+wzbwDeI32aPvwQJldM8pr7dKDRuR76IjztrkmiCkAQDaWFJzkmfVqCHmt/iFoPFhHmI9L0oKhthrTOQw==", - "license": "MIT", - "dependencies": { - "buffers": "~0.1.1", - "charm": "~0.1.0", - "event-stream": "~0.9.8", - "optimist": "~0.3.4", - "png-js": "~0.1.0", - "x256": "~0.0.1" - }, - "bin": { - "picture-tube": "bin/tube.js" - }, - "engines": { - "node": ">=0.4.0" - } - }, "node_modules/pirates": { "version": "4.0.7", "resolved": "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz", @@ -7790,11 +6794,6 @@ "node": ">=8" } }, - "node_modules/png-js": { - "version": "0.1.1", - "resolved": "https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz", - "integrity": "sha512-NTtk2SyfjBm+xYl2/VZJBhFnTQ4kU5qWC7VC4/iGbrgiU4FuB4xC+74erxADYJIqZICOR1HCvRA7EBHkpjTg9g==" - }, "node_modules/prebuild-install": { "version": "7.1.3", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz", @@ -7968,27 +6967,6 @@ "dev": true, "license": "MIT" }, - "node_modules/readable-stream": { - "version": "1.0.34", - "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz", - "integrity": "sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg==", - "license": "MIT", - "dependencies": { - "core-util-is": "~1.0.0", - "inherits": "~2.0.1", - "isarray": "0.0.1", - "string_decoder": "~0.10.x" - } - }, - "node_modules/redeyed": { - "version": "2.1.1", - "resolved": "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz", - "integrity": "sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ==", - "license": "MIT", - "dependencies": { - "esprima": "~4.0.0" - } - }, "node_modules/require-directory": { "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", @@ -8131,12 +7109,6 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==", "license": "MIT" }, - "node_modules/sax": { - "version": "1.4.1", - "resolved": "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz", - "integrity": "sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg==", - "license": "ISC" - }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -8238,34 +7210,6 @@ "node": ">=8" } }, - "node_modules/slice-ansi": { - "version": "5.0.0", - "resolved": "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz", - "integrity": "sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.0.0", - "is-fullwidth-code-point": "^4.0.0" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/slice-ansi?sponsor=1" - } - }, - "node_modules/slice-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, "node_modules/source-map": { "version": "0.6.1", "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", @@ -8287,21 +7231,6 @@ "source-map": "^0.6.0" } }, - "node_modules/sparkline": { - "version": "0.1.2", - "resolved": "https://registry.npmjs.org/sparkline/-/sparkline-0.1.2.tgz", - "integrity": "sha512-t//aVOiWt9fi/e22ea1vXVWBDX+gp18y+Ch9sKqmHl828bRfvP2VtfTJVEcgWFBQHd0yDPNQRiHdqzCvbcYSDA==", - "dependencies": { - "here": "0.0.2", - "nopt": "~2.1.2" - }, - "bin": { - "sparkline": "bin/sparkline" - }, - "engines": { - "node": ">= 0.8.0" - } - }, "node_modules/sprintf-js": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz", @@ -8332,12 +7261,6 @@ "node": ">=8" } }, - "node_modules/string_decoder": { - "version": "0.10.31", - "resolved": "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz", - "integrity": "sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ==", - "license": "MIT" - }, "node_modules/string-length": { "version": "4.0.2", "resolved": "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz", @@ -8419,18 +7342,6 @@ "node": ">=8" } }, - "node_modules/strip-ansi": { - "version": "3.0.1", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz", - "integrity": "sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^2.0.0" - }, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/strip-bom": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-4.0.0.tgz", @@ -8464,40 +7375,6 @@ "url": "https://github.com/sponsors/sindresorhus" } }, - "node_modules/supports-color": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz", - "integrity": "sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g==", - "license": "MIT", - "engines": { - "node": ">=0.8.0" - } - }, - "node_modules/supports-hyperlinks": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz", - "integrity": "sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0", - "supports-color": "^7.0.0" - }, - "engines": { - "node": ">=8" - } - }, - "node_modules/supports-hyperlinks/node_modules/supports-color": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", - "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "license": "MIT", - "dependencies": { - "has-flag": "^4.0.0" - }, - "engines": { - "node": ">=8" - } - }, "node_modules/supports-preserve-symlinks-flag": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz", @@ -8562,11 +7439,6 @@ "safe-buffer": "~5.2.0" } }, - "node_modules/term-canvas": { - "version": "0.0.5", - "resolved": "https://registry.npmjs.org/term-canvas/-/term-canvas-0.0.5.tgz", - "integrity": "sha512-eZ3rIWi5yLnKiUcsW8P79fKyooaLmyLWAGqBhFspqMxRNUiB4GmHHk5AzQ4LxvFbJILaXqQZLwbbATLOhCFwkw==" - }, "node_modules/test-exclude": { "version": "6.0.0", "resolved": "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz", @@ -9015,94 +7887,6 @@ "node": ">=0.10.0" } }, - "node_modules/wordwrap": { - "version": "0.0.3", - "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz", - "integrity": "sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/wrap-ansi": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz", - "integrity": "sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q==", - "license": "MIT", - "dependencies": { - "ansi-styles": "^6.2.1", - "string-width": "^7.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/chalk/wrap-ansi?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-regex": { - "version": "6.1.0", - "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz", - "integrity": "sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-regex?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/ansi-styles": { - "version": "6.2.1", - "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz", - "integrity": "sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug==", - "license": "MIT", - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/ansi-styles?sponsor=1" - } - }, - "node_modules/wrap-ansi/node_modules/emoji-regex": { - "version": "10.4.0", - "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz", - "integrity": "sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw==", - "license": "MIT" - }, - "node_modules/wrap-ansi/node_modules/string-width": { - "version": "7.2.0", - "resolved": "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz", - "integrity": "sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ==", - "license": "MIT", - "dependencies": { - "emoji-regex": "^10.3.0", - "get-east-asian-width": "^1.0.0", - "strip-ansi": "^7.1.0" - }, - "engines": { - "node": ">=18" - }, - "funding": { - "url": "https://github.com/sponsors/sindresorhus" - } - }, - "node_modules/wrap-ansi/node_modules/strip-ansi": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz", - "integrity": "sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ==", - "license": "MIT", - "dependencies": { - "ansi-regex": "^6.0.1" - }, - "engines": { - "node": ">=12" - }, - "funding": { - "url": "https://github.com/chalk/strip-ansi?sponsor=1" - } - }, "node_modules/wrappy": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", @@ -9123,37 +7907,6 @@ "node": "^12.13.0 || ^14.15.0 || >=16.0.0" } }, - "node_modules/x256": { - "version": "0.0.2", - "resolved": "https://registry.npmjs.org/x256/-/x256-0.0.2.tgz", - "integrity": "sha512-ZsIH+sheoF8YG9YG+QKEEIdtqpHRA9FYuD7MqhfyB1kayXU43RUNBFSxBEnF8ywSUxdg+8no4+bPr5qLbyxKgA==", - "license": "MIT", - "engines": { - "node": ">=0.4.0" - } - }, - "node_modules/xml2js": { - "version": "0.4.23", - "resolved": "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz", - "integrity": "sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug==", - "license": "MIT", - "dependencies": { - "sax": ">=0.6.0", - "xmlbuilder": "~11.0.0" - }, - "engines": { - "node": ">=4.0.0" - } - }, - "node_modules/xmlbuilder": { - "version": "11.0.1", - "resolved": "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz", - "integrity": "sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA==", - "license": "MIT", - "engines": { - "node": ">=4.0" - } - }, "node_modules/y18n": { "version": "5.0.8", "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", diff --git a/package.json b/package.json index db93f422..c989d5bd 100644 --- a/package.json +++ b/package.json @@ -50,31 +50,24 @@ "rxjs": "^7.8.2" }, "dependencies": { - "@agility/content-fetch": "^2.0.10", "@agility/content-sync": "^1.2.0", "@agility/management-sdk": "^0.1.38", "ansi-colors": "^4.1.3", - "blessed": "^0.1.81", - "blessed-contrib": "^4.11.0", + "axios": "^0.27.2", "cli-progress": "^3.11.2", "date-fns": "^4.1.0", + "dotenv": "^8.6.0", "form-data": "^4.0.5", - "fuzzy": "^0.1.3", "inquirer": "^8.0.0", - "inquirer-checkbox-plus-prompt": "^1.4.2", - "inquirer-fs-selector": "^1.5.0", - "inquirer-fuzzy-path": "^2.3.0", "inquirer-search-list": "^1.2.6", "keytar": "^7.9.0", - "log-update": "^5.0.1", + "lodash": "^4.17.21", "open": "^8.4.0", - "ora": "^5.4.1", + "proper-lockfile": "^4.1.2", "tsconfig-paths": "^4.2.0", - "wrap-ansi": "^9.0.0", "yargs": "^17.6.2" }, "devDependencies": { - "@types/form-data": "^2.2.1", "@types/inquirer": "^9.0.3", "@types/jest": "^29.5.14", "@types/node": "^18.11.17", diff --git a/src/core/content.ts b/src/core/content.ts deleted file mode 100644 index 206e7a77..00000000 --- a/src/core/content.ts +++ /dev/null @@ -1,160 +0,0 @@ -import * as mgmtApi from "@agility/management-sdk"; -import { fileOperations } from "./fileOperations"; -import * as cliProgress from "cli-progress"; - -export class content { - _options: mgmtApi.Options; - _multibar: cliProgress.MultiBar; - _guid: string; - _locale: string; - _rootPath: string; - _isPreview: boolean; - skippedContentItems: { [key: number]: string }; //format Key -> ContentId, Value ReferenceName of the content. - - constructor(options: mgmtApi.Options, multibar: cliProgress.MultiBar, guid: string, locale: string) { - this._options = options; - this._multibar = multibar; - this._guid = guid; - this._locale = locale; - this._rootPath = "agility-files"; - this._isPreview = true; - this.skippedContentItems = {}; - } - - async updateContentItems(selectedContentItems: string) { - const apiClient = new mgmtApi.ApiClient(this._options); - const fileOperation = new fileOperations(this._guid, this._locale); - const contentItemsArray: mgmtApi.ContentItem[] = []; - - fileOperation.createLogFile("logs", "instancelog"); - - console.log("Updating content items...", selectedContentItems.split(", ")); - const contentItemArr = selectedContentItems.split(","); - - if (contentItemArr && contentItemArr.length > 0) { - // const validBar1 = this._multibar.create(contentItemArr.length, 0); - // validBar1.update(0, { name: "Updating items" }); - - let index = 1; - const successfulItems = []; - const notOnDestination = []; - const notOnSource = []; - const modelMismatch = []; - - for (let i = 0; i < contentItemArr.length; i++) { - const contentItemId = parseInt(contentItemArr[i], 10); - index += 1; - - try { - await apiClient.contentMethods.getContentItem(contentItemId, this._guid, this._locale); - } catch { - notOnDestination.push(contentItemId); - this.skippedContentItems[contentItemId] = contentItemId.toString(); - fileOperation.appendLogFile(`\n There was a problem reading content item ID ${contentItemId}`); - continue; - } - - try { - const file = fileOperation.readFile(`.agility-files/${this._locale}/item/${contentItemId}.json`); - const contentItem = JSON.parse(file) as mgmtApi.ContentItem; - - try { - const containerFile = fileOperation.readFile( - `.agility-files/containers/${this.camelize(contentItem.properties.referenceName)}.json` - ); - const container = JSON.parse(containerFile) as mgmtApi.Container; - - const modelId = container.contentDefinitionID; - const modelFile = fileOperation.readFile(`.agility-files/models/${modelId}.json`); - const model = JSON.parse(modelFile) as mgmtApi.Model; - - const currentModel = await apiClient.modelMethods.getContentModel(modelId, this._guid); - - const modelFields = model.fields.map((field) => ({ name: field.name, type: field.type })); - const currentModelFields = currentModel.fields.map((field) => ({ name: field.name, type: field.type })); - - const missingFields = modelFields.filter( - (field) => - !currentModelFields.some( - (currentField) => currentField.name === field.name && currentField.type === field.type - ) - ); - const extraFields = currentModelFields.filter( - (currentField) => - !modelFields.some((field) => field.name === currentField.name && field.type === currentField.type) - ); - - if (missingFields.length > 0) { - console.log( - `Missing fields in local model: ${missingFields - .map((field) => `${field.name} (${field.type})`) - .join(", ")}` - ); - fileOperation.appendLogFile( - `\n Missing fields in local model: ${missingFields - .map((field) => `${field.name} (${field.type})`) - .join(", ")}` - ); - } - - if (extraFields.length > 0) { - console.log( - `Extra fields in local model: ${extraFields.map((field) => `${field.name} (${field.type})`).join(", ")}` - ); - fileOperation.appendLogFile( - `\n Extra fields in local model: ${extraFields - .map((field) => `${field.name} (${field.type})`) - .join(", ")}` - ); - } - - if (!missingFields.length && !extraFields.length) { - try { - await apiClient.contentMethods.saveContentItem(contentItem, this._guid, this._locale); - } catch { - this.skippedContentItems[contentItemId] = contentItemId.toString(); - fileOperation.appendLogFile(`\n Unable to update content item ID ${contentItemId}`); - continue; - } - - contentItemsArray.push(contentItem); - successfulItems.push(contentItemId); - } else { - modelMismatch.push(contentItemId); - fileOperation.appendLogFile(`\n Model mismatch for content item ID ${contentItemId}`); - continue; - } - } catch (err) { - console.log("Container - > Error", err); - this.skippedContentItems[contentItemId] = contentItemId.toString(); - fileOperation.appendLogFile(`\n Unable to find a container for content item ID ${contentItemId}`); - continue; - } - } catch { - notOnSource.push(contentItemId); - this.skippedContentItems[contentItemId] = contentItemId.toString(); - fileOperation.appendLogFile( - `\n There was a problem reading .agility-files/${this._locale}/item/${contentItemId}.json` - ); - continue; - } - - // validBar1.update(index); - } - - return { - contentItemsArray, - successfulItems, - notOnDestination, - notOnSource, - modelMismatch, - }; - } - } - - camelize(str: string) { - return str - .replace(/(?:^\w|[A-Z]|\b\w)/g, (char, index) => (index === 0 ? char.toLowerCase() : char)) - .replace(/[_\s]+/g, ""); - } -} diff --git a/src/core/index.ts b/src/core/index.ts index 995bd7b2..c79deeb6 100644 --- a/src/core/index.ts +++ b/src/core/index.ts @@ -48,7 +48,6 @@ export { } from "../types"; // Content and data services -export { content } from "./content"; export { assets } from "./assets"; export { fileOperations } from "./fileOperations"; export { getApiClient } from "./state"; diff --git a/src/core/tests/content.test.ts b/src/core/tests/content.test.ts deleted file mode 100644 index ff734e5e..00000000 --- a/src/core/tests/content.test.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { content } from "../content"; - -// content constructor requires mgmtApi.Options and a MultiBar, neither of which we want -// to actually instantiate here. We create a minimal stub to reach camelize(). -function makeContent() { - return new content( - {} as any, // options stub - {} as any, // multibar stub - "test-guid", - "en-us" - ); -} - -// ─── camelize ───────────────────────────────────────────────────────────────── - -describe("content.camelize", () => { - it("lowercases the first character of a PascalCase string", () => { - expect(makeContent().camelize("BlogPost")).toBe("blogPost"); - }); - - it("lowercases first character and preserves remaining PascalCase", () => { - expect(makeContent().camelize("PostList")).toBe("postList"); - }); - - it("handles a single word with all lowercase", () => { - expect(makeContent().camelize("blog")).toBe("blog"); - }); - - it("handles a single word starting with uppercase", () => { - expect(makeContent().camelize("Blog")).toBe("blog"); - }); - - it("removes underscores between words", () => { - expect(makeContent().camelize("hello_world")).toBe("helloworld"); - }); - - it("removes spaces between words", () => { - expect(makeContent().camelize("hello world")).toBe("helloworld"); - }); - - it("handles empty string", () => { - expect(makeContent().camelize("")).toBe(""); - }); - - it("handles already-camelCase input", () => { - expect(makeContent().camelize("myModel")).toBe("myModel"); - }); - - it("handles a multi-word PascalCase string", () => { - expect(makeContent().camelize("HeroBanner")).toBe("heroBanner"); - }); -}); diff --git a/src/lib/content/content-classifier.ts b/src/lib/content/content-classifier.ts deleted file mode 100644 index c728c62d..00000000 --- a/src/lib/content/content-classifier.ts +++ /dev/null @@ -1,282 +0,0 @@ -import * as mgmtApi from "@agility/management-sdk"; - -/** - * Content classification result - */ -export interface ContentClassification { - normalContentItems: mgmtApi.ContentItem[]; - linkedContentItems: mgmtApi.ContentItem[]; - classificationDetails: { - totalItems: number; - normalCount: number; - linkedCount: number; - analysisTime: number; - }; -} - -/** - * Model field analysis cache - */ -interface ModelFieldAnalysis { - hasLinkedContentFields: boolean; - linkedContentFieldNames: string[]; - fieldTypeMap: Map; // fieldName -> fieldType - cachedAt: number; -} - -/** - * Content Classifier - separates content into normal vs linked based on legacy pattern - * - * Based on push_legacy.ts logic: - * - Normal content: No Content fields with linked content references - * - Linked content: Has Content fields with LinkeContentDropdownValueField, SortIDFieldName, contentid, etc. - */ -export class ContentClassifier { - private modelAnalysisCache = new Map(); - private readonly CACHE_TTL = 5 * 60 * 1000; // 5 minutes - - /** - * Classify content items into normal vs linked categories - */ - async classifyContent(contentItems: mgmtApi.ContentItem[], models: mgmtApi.Model[]): Promise { - const startTime = Date.now(); - - const normalContentItems: mgmtApi.ContentItem[] = []; - const linkedContentItems: mgmtApi.ContentItem[] = []; - - // Build model lookup for efficient analysis - const modelLookup = new Map(); - models.forEach((model) => { - modelLookup.set(model.referenceName, model); - }); - - // Classify each content item - for (const contentItem of contentItems) { - const definitionName = contentItem.properties?.definitionName; - if (!definitionName) { - // No model definition - treat as normal content - normalContentItems.push(contentItem); - continue; - } - - const model = modelLookup.get(definitionName); - if (!model) { - // Model not found - treat as normal content - normalContentItems.push(contentItem); - continue; - } - - // Analyze content item against model - const hasLinkedContentReferences = this.hasLinkedContentReferences(contentItem, model); - - if (hasLinkedContentReferences) { - linkedContentItems.push(contentItem); - } else { - normalContentItems.push(contentItem); - } - } - - const analysisTime = Date.now() - startTime; - - return { - normalContentItems, - linkedContentItems, - classificationDetails: { - totalItems: contentItems.length, - normalCount: normalContentItems.length, - linkedCount: linkedContentItems.length, - analysisTime, - }, - }; - } - - /** - * Check if content item has linked content references based on model fields - */ - private hasLinkedContentReferences(contentItem: mgmtApi.ContentItem, model: mgmtApi.Model): boolean { - // Get cached model analysis or create new one - const modelAnalysis = this.getModelAnalysis(model); - - // If model has no Content fields, it can't have linked content - if (!modelAnalysis.hasLinkedContentFields) { - return false; - } - - // Check content item fields for actual linked content references - return this.checkContentFieldsForLinkedReferences(contentItem, modelAnalysis); - } - - /** - * Get or create model field analysis with caching - */ - private getModelAnalysis(model: mgmtApi.Model): ModelFieldAnalysis { - const cacheKey = model.referenceName; - const cached = this.modelAnalysisCache.get(cacheKey); - - // Check cache validity - if (cached && Date.now() - cached.cachedAt < this.CACHE_TTL) { - return cached; - } - - // Analyze model fields - const analysis = this.analyzeModelFields(model); - this.modelAnalysisCache.set(cacheKey, analysis); - - return analysis; - } - - /** - * Analyze model fields to identify Content fields and their settings - */ - private analyzeModelFields(model: mgmtApi.Model): ModelFieldAnalysis { - const linkedContentFieldNames: string[] = []; - const fieldTypeMap = new Map(); - let hasLinkedContentFields = false; - - if (!model.fields) { - return { - hasLinkedContentFields: false, - linkedContentFieldNames: [], - fieldTypeMap, - cachedAt: Date.now(), - }; - } - - model.fields.forEach((field) => { - const fieldName = this.camelize(field.name); - fieldTypeMap.set(fieldName, field.type); - - // Check for Content fields (from legacy push_legacy.ts logic) - if (field.type === "Content") { - hasLinkedContentFields = true; - linkedContentFieldNames.push(fieldName); - } - }); - - return { - hasLinkedContentFields, - linkedContentFieldNames, - fieldTypeMap, - cachedAt: Date.now(), - }; - } - - /** - * Check content item fields for actual linked content references - */ - private checkContentFieldsForLinkedReferences( - contentItem: mgmtApi.ContentItem, - modelAnalysis: ModelFieldAnalysis - ): boolean { - if (!contentItem.fields) { - return false; - } - - // Check each Content field for linked content patterns - for (const fieldName of modelAnalysis.linkedContentFieldNames) { - const fieldValue = contentItem.fields[fieldName]; - - if (!fieldValue) { - continue; - } - - // Check for linked content patterns (from push_legacy.ts) - if (this.hasLinkedContentPatterns(fieldValue)) { - return true; - } - } - - // Also check for direct contentid/contentID references in any object field - return this.hasDirectContentReferences(contentItem.fields); - } - - /** - * Check field value for linked content patterns from legacy logic - */ - private hasLinkedContentPatterns(fieldValue: any): boolean { - if (typeof fieldValue !== "object" || fieldValue === null) { - return false; - } - - // Pattern 1: contentid or contentID reference (legacy: fieldVal.contentid) - if ("contentid" in fieldValue || "contentID" in fieldValue) { - return true; - } - - // Pattern 2: sortids array (legacy: fieldVal.sortids) - if ("sortids" in fieldValue) { - return true; - } - - // Pattern 3: referencename with content references (legacy: fieldVal.referencename) - if ("referencename" in fieldValue) { - return true; - } - - return false; - } - - /** - * Check for direct content ID references in any field - */ - private hasDirectContentReferences(fields: any): boolean { - // Recursively scan for contentid/contentID patterns - return this.scanObjectForContentReferences(fields); - } - - /** - * Recursively scan object for content reference patterns - */ - private scanObjectForContentReferences(obj: any): boolean { - if (typeof obj !== "object" || obj === null) { - return false; - } - - if (Array.isArray(obj)) { - return obj.some((item) => this.scanObjectForContentReferences(item)); - } - - for (const [key, value] of Object.entries(obj)) { - // Direct content reference patterns - if ((key === "contentid" || key === "contentID") && typeof value === "number") { - return true; - } - - // Recursive scan for nested objects - if (this.scanObjectForContentReferences(value)) { - return true; - } - } - - return false; - } - - /** - * Convert field name to camelCase (from legacy logic) - */ - private camelize(str: string): string { - return str - .replace(/(?:^\w|[A-Z]|\b\w)/g, function (word, index) { - return index === 0 ? word.toLowerCase() : word.toUpperCase(); - }) - .replace(/\s+/g, ""); - } - - /** - * Clear model analysis cache - */ - clearCache(): void { - this.modelAnalysisCache.clear(); - } - - /** - * Get classification statistics - */ - getClassificationStats(classification: ContentClassification): string { - const { classificationDetails } = classification; - const normalPercent = Math.round((classificationDetails.normalCount / classificationDetails.totalItems) * 100); - const linkedPercent = Math.round((classificationDetails.linkedCount / classificationDetails.totalItems) * 100); - - return `Content Classification: ${classificationDetails.normalCount} normal (${normalPercent}%) + ${classificationDetails.linkedCount} linked (${linkedPercent}%) = ${classificationDetails.totalItems} total (${classificationDetails.analysisTime}ms)`; - } -} diff --git a/src/lib/content/content-field-mapper.ts b/src/lib/content/content-field-mapper.ts index e37d4836..16e46244 100644 --- a/src/lib/content/content-field-mapper.ts +++ b/src/lib/content/content-field-mapper.ts @@ -2,6 +2,7 @@ import { AssetReferenceExtractor } from "../assets/asset-reference-extractor"; import * as mgmtApi from "@agility/management-sdk"; import { ContentItemMapper } from "lib/mappers/content-item-mapper"; import { AssetMapper } from "lib/mappers/asset-mapper"; +import { getLinkedContentCompanionFields, findFieldKey } from "./linked-content-companion-fields"; export function createContentFieldMapper() { return new ContentFieldMapper(); @@ -73,12 +74,12 @@ export class ContentFieldMapper { // "linkedContentId", HotAndColdNumbersSection's "LinkedContentValue") don't. The model schema is // the only reliable source for the real name, so remap by reading it from context.model instead // of guessing a suffix. - for (const [mainFieldName, valueFieldName] of this.getContentDropdownValueFieldNames(context)) { + for (const [mainFieldName, valueFieldName] of getLinkedContentCompanionFields(context?.model)) { // Self-pointing setting (e.g. GameBanner's own field name): nothing separate to remap — // the mainFieldName pass above (or the sortids/contentid handling) already covers it. if (valueFieldName.toLowerCase() === mainFieldName.toLowerCase()) continue; - const valueFieldKey = this.findFieldKey(fields, valueFieldName); + const valueFieldKey = findFieldKey(fields, valueFieldName); if (!valueFieldKey) continue; // e.g. a sentinel setting like "CREATENEW" that names no real field const rawValue = fields[valueFieldKey]; @@ -313,44 +314,6 @@ export class ContentFieldMapper { return { mappedValue, warnings, errors }; } - /** - * PROD-2431/PROD-2435: read [mainFieldName, companionFieldName] pairs off the model schema's - * Content-typed fields. `settings.LinkeContentDropdownValueField` (Agility's own spelling) names - * the field that actually carries the raw content ID(s) for a linked-content dropdown. Only - * non-empty settings are returned; the caller still has to handle the value naming a field that - * doesn't exist in the payload (a sentinel like "CREATENEW") or naming itself (no separate - * companion to remap). - */ - private getContentDropdownValueFieldNames(context?: ContentFieldMappingContext): Array<[string, string]> { - const modelFields = context?.model?.fields; - if (!Array.isArray(modelFields)) return []; - - const pairs: Array<[string, string]> = []; - for (const field of modelFields) { - // PROD-2442: a "grid" (full-list) Linked Content field's companion selection column is named - // by SortIDFieldName instead of LinkeContentDropdownValueField — the same per-field, no-fixed- - // convention naming problem PROD-2431/2435 already solved for dropdown/checkbox, just under a - // different setting. Fall back to it so that companion also gets remapped. - const valueFieldName: string | undefined = - field?.settings?.LinkeContentDropdownValueField || field?.settings?.SortIDFieldName; - if (field?.name && valueFieldName) { - pairs.push([field.name, valueFieldName]); - } - } - return pairs; - } - - /** - * Look up a field by name in a fields object, case-insensitively — the model schema's field - * name and the payload's actual field key can differ in casing (e.g. schema "LinkedContentValue" - * vs. a payload key camelCased to "linkedContentValue"). - */ - private findFieldKey(fields: any, fieldName: string): string | undefined { - if (fieldName in fields) return fieldName; - const lowerTarget = fieldName.toLowerCase(); - return Object.keys(fields).find((key) => key.toLowerCase() === lowerTarget); - } - /** * PROD-2431: shared remap for a comma-separated list of SOURCE content IDs, used both for a * content-reference field's "sortids" and for a linked-content dropdown's companion selection diff --git a/src/lib/content/index.ts b/src/lib/content/index.ts index 3fe17ff3..7696e3ac 100644 --- a/src/lib/content/index.ts +++ b/src/lib/content/index.ts @@ -1,2 +1 @@ -export * from "./content-classifier"; export * from "./content-field-mapper"; diff --git a/src/lib/content/linked-content-companion-fields.ts b/src/lib/content/linked-content-companion-fields.ts new file mode 100644 index 00000000..8a4e693f --- /dev/null +++ b/src/lib/content/linked-content-companion-fields.ts @@ -0,0 +1,43 @@ +import * as mgmtApi from "@agility/management-sdk"; + +/** + * A Content-typed dropdown/checkbox/searchlistbox field's actual selection, and a full-list + * "grid" field's custom sort order, live in a companion field separate from the one the designer + * sees — named by that field's own model setting (`LinkeContentDropdownValueField` or + * `SortIDFieldName` respectively). Neither has a fixed naming convention (PROD-2431/2435/2442 + * sampled a real target schema: only 4 of 14 dropdown fields used the `_ValueField` + * suffix), so the model schema is the only reliable source for the real name. + * + * Shared by ContentFieldMapper (which remaps the companion's value) and the content-pusher + * utilities that scan a content item's fields for references (which need to recognize the + * companion as carrying a reference at all) — every consumer of this pattern should read it from + * here rather than re-deriving its own naming heuristic. + */ +export function getLinkedContentCompanionFields( + model?: mgmtApi.Model | { fields?: mgmtApi.ModelField[] | any[] } | null +): Array<[mainFieldName: string, companionFieldName: string]> { + const modelFields = model?.fields; + if (!Array.isArray(modelFields)) return []; + + const pairs: Array<[string, string]> = []; + for (const field of modelFields) { + const companionFieldName: string | undefined = + field?.settings?.LinkeContentDropdownValueField || field?.settings?.SortIDFieldName; + if (field?.name && companionFieldName) { + pairs.push([field.name, companionFieldName]); + } + } + return pairs; +} + +/** + * Look up a field by name in a fields object, case-insensitively — the model schema's field name + * and the payload's actual field key can differ in casing (e.g. schema "LinkedContentValue" vs. a + * payload key camelCased to "linkedContentValue"). + */ +export function findFieldKey(fields: any, fieldName: string): string | undefined { + if (!fields || typeof fields !== "object") return undefined; + if (fieldName in fields) return fieldName; + const lowerTarget = fieldName.toLowerCase(); + return Object.keys(fields).find((key) => key.toLowerCase() === lowerTarget); +} diff --git a/src/lib/content/tests/content-classifier.test.ts b/src/lib/content/tests/content-classifier.test.ts deleted file mode 100644 index 32d4aba3..00000000 --- a/src/lib/content/tests/content-classifier.test.ts +++ /dev/null @@ -1,249 +0,0 @@ -import { resetState } from "core/state"; -import { ContentClassifier } from "lib/content/content-classifier"; - -beforeEach(() => { - resetState(); - jest.spyOn(console, "log").mockImplementation(() => {}); - jest.spyOn(console, "warn").mockImplementation(() => {}); - jest.spyOn(console, "error").mockImplementation(() => {}); -}); - -afterEach(() => { - jest.restoreAllMocks(); -}); - -// ─── helpers ────────────────────────────────────────────────────────────────── - -function makeModel(referenceName: string, fields: any[] = []): any { - return { referenceName, fields }; -} - -function makeContentItem(definitionName: string, fields: any = {}): any { - return { - contentID: 1, - properties: { definitionName }, - fields, - }; -} - -// ─── classifyContent ────────────────────────────────────────────────────────── - -describe("ContentClassifier.classifyContent", () => { - let classifier: ContentClassifier; - - beforeEach(() => { - classifier = new ContentClassifier(); - }); - - describe("empty / edge-case inputs", () => { - it("returns empty arrays when no content items are provided", async () => { - const result = await classifier.classifyContent([], []); - expect(result.normalContentItems).toHaveLength(0); - expect(result.linkedContentItems).toHaveLength(0); - expect(result.classificationDetails.totalItems).toBe(0); - }); - - it("treats an item with no definitionName as normal content", async () => { - const item: any = { contentID: 1, properties: {}, fields: {} }; - const result = await classifier.classifyContent([item], []); - expect(result.normalContentItems).toHaveLength(1); - expect(result.linkedContentItems).toHaveLength(0); - }); - - it("treats an item whose model is not found in the models list as normal content", async () => { - const item = makeContentItem("UnknownModel", {}); - const result = await classifier.classifyContent([item], []); - expect(result.normalContentItems).toHaveLength(1); - expect(result.linkedContentItems).toHaveLength(0); - }); - }); - - describe("normal content (no linked references)", () => { - it("classifies an item with no Content-type fields as normal", async () => { - const model = makeModel("BlogPost", [ - { name: "Title", type: "Text" }, - { name: "Body", type: "HTML" }, - ]); - const item = makeContentItem("BlogPost", { title: "Hello", body: "

World

" }); - const result = await classifier.classifyContent([item], [model]); - expect(result.normalContentItems).toHaveLength(1); - expect(result.linkedContentItems).toHaveLength(0); - }); - - it("classifies an item with a Content field but no actual linked-content values as normal", async () => { - const model = makeModel("Article", [ - { name: "Author", type: "Content" }, - { name: "Title", type: "Text" }, - ]); - const item = makeContentItem("Article", { author: null, title: "My Article" }); - const result = await classifier.classifyContent([item], [model]); - expect(result.normalContentItems).toHaveLength(1); - expect(result.linkedContentItems).toHaveLength(0); - }); - - it("classifies an item whose fields object is absent as normal", async () => { - const model = makeModel("Simple", [{ name: "Name", type: "Content" }]); - const item: any = { contentID: 5, properties: { definitionName: "Simple" } }; - const result = await classifier.classifyContent([item], [model]); - expect(result.normalContentItems).toHaveLength(1); - expect(result.linkedContentItems).toHaveLength(0); - }); - }); - - describe("linked content (has linked references)", () => { - it("classifies an item with a contentid pattern in a Content field as linked", async () => { - const model = makeModel("Page", [{ name: "RelatedPost", type: "Content" }]); - const item = makeContentItem("Page", { relatedPost: { contentid: 42 } }); - const result = await classifier.classifyContent([item], [model]); - expect(result.linkedContentItems).toHaveLength(1); - expect(result.normalContentItems).toHaveLength(0); - }); - - it("classifies an item with a contentID pattern in a Content field as linked", async () => { - const model = makeModel("Page", [{ name: "RelatedPost", type: "Content" }]); - const item = makeContentItem("Page", { relatedPost: { contentID: 99 } }); - const result = await classifier.classifyContent([item], [model]); - expect(result.linkedContentItems).toHaveLength(1); - }); - - it("classifies an item with a sortids pattern in a Content field as linked", async () => { - const model = makeModel("Category", [{ name: "Items", type: "Content" }]); - const item = makeContentItem("Category", { items: { sortids: "1,2,3" } }); - const result = await classifier.classifyContent([item], [model]); - expect(result.linkedContentItems).toHaveLength(1); - }); - - it("classifies an item with a referencename pattern in a Content field as linked", async () => { - const model = makeModel("Product", [{ name: "Tags", type: "Content" }]); - const item = makeContentItem("Product", { tags: { referencename: "tag-list" } }); - const result = await classifier.classifyContent([item], [model]); - expect(result.linkedContentItems).toHaveLength(1); - }); - - it("detects direct nested contentid references in a model that has a Content-type field", async () => { - // The direct-scan path is only reached when the model has at least one Content field - const model = makeModel("Widget", [ - { name: "Data", type: "Text" }, - { name: "Placeholder", type: "Content" }, - ]); - const item = makeContentItem("Widget", { - placeholder: null, - data: { nested: { contentid: 7 } }, - }); - const result = await classifier.classifyContent([item], [model]); - expect(result.linkedContentItems).toHaveLength(1); - }); - - it("detects direct nested contentID (numeric) references in a model with a Content-type field", async () => { - // The direct-scan path is only reached when the model has at least one Content field - const model = makeModel("Widget", [{ name: "Placeholder", type: "Content" }]); - const item = makeContentItem("Widget", { - placeholder: null, - extra: { contentID: 15 }, - }); - const result = await classifier.classifyContent([item], [model]); - expect(result.linkedContentItems).toHaveLength(1); - }); - - it("does not flag a string contentID value as a linked reference", async () => { - const model = makeModel("Widget", [{ name: "Data", type: "Text" }]); - const item = makeContentItem("Widget", { - data: { contentID: "not-a-number" }, - }); - const result = await classifier.classifyContent([item], [model]); - expect(result.normalContentItems).toHaveLength(1); - }); - }); - - describe("mixed batches", () => { - it("correctly partitions a mixed batch of normal and linked items", async () => { - const model = makeModel("Post", [{ name: "Related", type: "Content" }]); - const normalItem = makeContentItem("Post", { related: null, title: "plain" }); - const linkedItem = makeContentItem("Post", { related: { contentid: 5 } }); - const result = await classifier.classifyContent([normalItem, linkedItem], [model]); - expect(result.normalContentItems).toHaveLength(1); - expect(result.linkedContentItems).toHaveLength(1); - }); - }); - - describe("classificationDetails accuracy", () => { - it("reports correct counts in classificationDetails", async () => { - const model = makeModel("Post", [{ name: "Link", type: "Content" }]); - const items = [ - makeContentItem("Post", { link: { contentid: 1 } }), - makeContentItem("Post", { link: null }), - makeContentItem("Post", { link: null }), - ]; - const result = await classifier.classifyContent(items, [model]); - expect(result.classificationDetails.totalItems).toBe(3); - expect(result.classificationDetails.linkedCount).toBe(1); - expect(result.classificationDetails.normalCount).toBe(2); - }); - - it("records a non-negative analysisTime", async () => { - const result = await classifier.classifyContent([], []); - expect(result.classificationDetails.analysisTime).toBeGreaterThanOrEqual(0); - }); - }); - - describe("model field caching", () => { - it("produces consistent results when the same model is used for multiple items", async () => { - const model = makeModel("Cached", [{ name: "Ref", type: "Content" }]); - const items = Array.from({ length: 3 }, (_, i) => makeContentItem("Cached", { ref: { contentid: i + 1 } })); - const result = await classifier.classifyContent(items, [model]); - expect(result.linkedContentItems).toHaveLength(3); - }); - }); -}); - -// ─── clearCache ─────────────────────────────────────────────────────────────── - -describe("ContentClassifier.clearCache", () => { - it("does not throw when the cache is empty", () => { - const classifier = new ContentClassifier(); - expect(() => classifier.clearCache()).not.toThrow(); - }); - - it("does not throw after classifying content (cache is populated)", async () => { - const classifier = new ContentClassifier(); - const model = makeModel("M", [{ name: "F", type: "Text" }]); - await classifier.classifyContent([makeContentItem("M", {})], [model]); - expect(() => classifier.clearCache()).not.toThrow(); - }); -}); - -// ─── getClassificationStats ─────────────────────────────────────────────────── - -describe("ContentClassifier.getClassificationStats", () => { - let classifier: ContentClassifier; - - beforeEach(() => { - classifier = new ContentClassifier(); - }); - - it("returns a string containing the normal and linked counts", async () => { - const model = makeModel("P", [{ name: "Link", type: "Content" }]); - const items = [makeContentItem("P", { link: { contentid: 1 } }), makeContentItem("P", { link: null })]; - const classification = await classifier.classifyContent(items, [model]); - const stats = classifier.getClassificationStats(classification); - expect(stats).toContain("1 normal"); - expect(stats).toContain("1 linked"); - expect(stats).toContain("2 total"); - }); - - it("includes percentage values in the stats string", async () => { - const classification = { - normalContentItems: [], - linkedContentItems: [], - classificationDetails: { - totalItems: 4, - normalCount: 3, - linkedCount: 1, - analysisTime: 5, - }, - }; - const stats = classifier.getClassificationStats(classification); - expect(stats).toContain("75%"); - expect(stats).toContain("25%"); - }); -}); diff --git a/src/lib/downloaders/index.ts b/src/lib/downloaders/index.ts deleted file mode 100644 index 3205cc77..00000000 --- a/src/lib/downloaders/index.ts +++ /dev/null @@ -1,11 +0,0 @@ -// Individual downloader modules -export * from "./download-assets"; -export * from "./download-galleries"; -export * from "./download-models"; -export * from "./download-templates"; -export * from "./download-containers"; -export * from "./download-sync-sdk"; - -// Download orchestration modules -export * from "./orchestrate-downloaders"; -export * from "./download-operations-config"; diff --git a/src/lib/getters/filesystem/index.ts b/src/lib/getters/filesystem/index.ts deleted file mode 100644 index b698b18b..00000000 --- a/src/lib/getters/filesystem/index.ts +++ /dev/null @@ -1,7 +0,0 @@ -export * from "./get-containers"; -export * from "./get-galleries"; -export * from "./get-models"; -export * from "./get-templates"; -export * from "./get-pages"; -export * from "./get-content-items"; -export * from "./get-assets"; diff --git a/src/lib/pushers/content-pusher/content-batch-processor.ts b/src/lib/pushers/content-pusher/content-batch-processor.ts index 8ecd5a3f..ecdbf363 100644 --- a/src/lib/pushers/content-pusher/content-batch-processor.ts +++ b/src/lib/pushers/content-pusher/content-batch-processor.ts @@ -415,7 +415,11 @@ export class ContentBatchProcessor { // precise, actionable reason instead of shipping a payload that is guaranteed to fail. const unresolvedRefs = collectUnresolvedContentReferences( contentItem.fields || {}, - this.config.referenceMapper + this.config.referenceMapper, + "", + // PROD-2446: sourceModel carries each field's LinkeContentDropdownValueField/SortIDFieldName + // setting, needed to recognize an unresolved reference living only in a companion field. + sourceModel ); if (unresolvedRefs.length > 0) { const detail = unresolvedRefs diff --git a/src/lib/pushers/content-pusher/util/are-content-dependencies-resolved.ts b/src/lib/pushers/content-pusher/util/are-content-dependencies-resolved.ts deleted file mode 100644 index a5be4270..00000000 --- a/src/lib/pushers/content-pusher/util/are-content-dependencies-resolved.ts +++ /dev/null @@ -1,22 +0,0 @@ -import * as mgmtApi from "@agility/management-sdk"; -import { ContentItemMapper } from "lib/mappers/content-item-mapper"; -import { hasUnresolvedContentReferences } from "./has-unresolved-content-references"; - -export function areContentDependenciesResolved( - contentItem: mgmtApi.ContentItem, - referenceMapper: ContentItemMapper, - models: mgmtApi.Model[] -): boolean { - if (!contentItem.fields) { - return true; // No fields, no dependencies - } - - // Find the model for this content item - const model = models.find((m) => m.referenceName === contentItem.properties?.definitionName); - if (!model) { - return true; // No model, assume resolved - } - - // Check each field for content references - return !hasUnresolvedContentReferences(contentItem.fields, referenceMapper); -} diff --git a/src/lib/pushers/content-pusher/util/collect-content-id-references.ts b/src/lib/pushers/content-pusher/util/collect-content-id-references.ts index d553228d..424d82c5 100644 --- a/src/lib/pushers/content-pusher/util/collect-content-id-references.ts +++ b/src/lib/pushers/content-pusher/util/collect-content-id-references.ts @@ -1,3 +1,5 @@ +import { getLinkedContentCompanionFields, findFieldKey } from "lib/content/linked-content-companion-fields"; + /** * Recursively walks content item fields to find SINGLE-ITEM content references — * `contentid`/`contentID` values and comma-separated `sortids` — and returns the @@ -12,8 +14,14 @@ * Only positive IDs are returned; 0 / -1 mean "no reference selected" and are ignored so * we don't promote items with intentionally-empty linked-content fields. This matches the * `> 0` guard used by collectUnresolvedContentReferences. + * + * PROD-2446: a Content-typed dropdown/checkbox/grid field's reference can live ONLY in a + * companion field (named by the model's LinkeContentDropdownValueField/SortIDFieldName setting — + * see PROD-2431/2435/2442), invisible to the structural walk above since it's a bare string under + * an arbitrary key. Pass `model` so an item that depends on another item solely through such a + * companion field is still recognized as a dependency and promoted to push first. */ -export function collectContentIDReferences(fields: any): number[] { +export function collectContentIDReferences(fields: any, model?: any): number[] { const found: number[] = []; function walk(node: any): void { @@ -50,5 +58,20 @@ export function collectContentIDReferences(fields: any): number[] { } walk(fields); + + // Companion fields are top-level siblings of the main field, not nested inside it. + for (const [, companionFieldName] of getLinkedContentCompanionFields(model)) { + const companionKey = findFieldKey(fields, companionFieldName); + if (!companionKey) continue; + + const companionValue = fields[companionKey]; + if (typeof companionValue !== "string" || !companionValue.trim()) continue; + + for (const part of companionValue.split(",")) { + const id = parseInt(part.trim()); + if (!isNaN(id) && id > 0) found.push(id); + } + } + return found; } diff --git a/src/lib/pushers/content-pusher/util/get-content-item-types.ts b/src/lib/pushers/content-pusher/util/get-content-item-types.ts index b2112254..37fc1a8a 100644 --- a/src/lib/pushers/content-pusher/util/get-content-item-types.ts +++ b/src/lib/pushers/content-pusher/util/get-content-item-types.ts @@ -53,7 +53,7 @@ export function getContentItemTypes( // Find every item this one depends on — whole-list references (by referenceName) // AND single-item references (by contentID) — and mark them linked (pushed first). - const referencedIds = collectReferencedContentIDs(item, itemsByReferenceName, allItemsById); + const referencedIds = collectReferencedContentIDs(item, itemsByReferenceName, allItemsById, modelMapper); if (referencedIds.length > 0) { markReferencedItems( referencedIds, @@ -105,15 +105,18 @@ function buildItemMaps(contentItems: ContentItem[]): { * both reference kinds: * - whole-list references (referencename + fulllist:true) → every item sharing that * referenceName (the full list), looked up via itemsByReferenceName; - * - single-item references (contentid / sortids) → the specific referenced item, only - * when it is present in the current content set (allItemsById). + * - single-item references (contentid / sortids, INCLUDING one living only in a + * LinkeContentDropdownValueField/SortIDFieldName companion field — PROD-2446) → the + * specific referenced item, only when it is present in the current content set + * (allItemsById). * * Returns the referenced items' contentIDs; the referencing item itself is never included. */ function collectReferencedContentIDs( item: ContentItem, itemsByReferenceName: Map, - allItemsById: Map + allItemsById: Map, + modelMapper: ModelMapper ): number[] { const ids: number[] = []; @@ -125,7 +128,8 @@ function collectReferencedContentIDs( } // Single-item references → the specific referenced item, if it is in this push set - for (const contentID of collectContentIDReferences(item.fields || {})) { + const sourceModel = getSourceModel(item, modelMapper); + for (const contentID of collectContentIDReferences(item.fields || {}, sourceModel)) { if (allItemsById.has(contentID)) { ids.push(contentID); } @@ -134,6 +138,18 @@ function collectReferencedContentIDs( return ids; } +/** + * Resolves an item's own source model (by its definitionName), so a Content-typed field's + * companion-field name (LinkeContentDropdownValueField/SortIDFieldName) can be read off it. + * Returns null if unmapped — collectContentIDReferences degrades gracefully to the structural-only + * walk in that case, same as before PROD-2446. + */ +function getSourceModel(item: ContentItem, modelMapper: ModelMapper): any { + if (!item.properties?.definitionName) return null; + const modelMapping = modelMapper.getModelMappingByReferenceName(item.properties.definitionName.toLowerCase(), "source"); + return modelMapping ? modelMapper.getMappedEntity(modelMapping, "source") : null; +} + /** * Recursively marks all items referenced (transitively) by the given contentIDs as linked, * so they are pushed before the items that reference them. Uses a stack-based approach with @@ -170,7 +186,7 @@ function markReferencedItems( normalSet.delete(contentID); // Remove from normal if it was added there // Recursively process this item's own dependency targets - for (const nestedId of collectReferencedContentIDs(item, itemsByReferenceName, allItemsById)) { + for (const nestedId of collectReferencedContentIDs(item, itemsByReferenceName, allItemsById, modelMapper)) { if (!visited.has(nestedId)) { stack.push(nestedId); } diff --git a/src/lib/pushers/content-pusher/util/has-unresolved-content-references.ts b/src/lib/pushers/content-pusher/util/has-unresolved-content-references.ts index cebb906b..6b8d813a 100644 --- a/src/lib/pushers/content-pusher/util/has-unresolved-content-references.ts +++ b/src/lib/pushers/content-pusher/util/has-unresolved-content-references.ts @@ -1,48 +1,5 @@ import { ContentItemMapper } from "lib/mappers/content-item-mapper"; - -/** - * Recursively check for unresolved content references - */ -export function hasUnresolvedContentReferences(obj: any, referenceMapper: ContentItemMapper): boolean { - if (typeof obj !== "object" || obj === null) { - return false; - } - - if (Array.isArray(obj)) { - return obj.some((item) => hasUnresolvedContentReferences(item, referenceMapper)); - } - - for (const [key, value] of Object.entries(obj)) { - // Check for content reference patterns - if ((key === "contentid" || key === "contentID") && typeof value === "number") { - const mappedId = referenceMapper.getContentItemMappingByContentID(value, "source"); - if (!mappedId) { - return true; // Unresolved content reference - } - } - - // Check for comma-separated content IDs in sortids fields - if (key === "sortids" && typeof value === "string") { - const contentIds = value.split(",").filter((id) => id.trim()); - for (const contentIdStr of contentIds) { - const contentId = parseInt(contentIdStr.trim()); - if (!isNaN(contentId)) { - const mappedId = referenceMapper.getContentItemMappingByContentID(contentId, "source"); - if (!mappedId) { - return true; // Unresolved content reference - } - } - } - } - - // Recursive check for nested objects - if (hasUnresolvedContentReferences(value, referenceMapper)) { - return true; - } - } - - return false; -} +import { getLinkedContentCompanionFields, findFieldKey } from "lib/content/linked-content-companion-fields"; export interface UnresolvedContentReference { /** Dotted/indexed path to the offending value within the item's fields (e.g. "menuItems[0].contentid"). */ @@ -55,15 +12,23 @@ export interface UnresolvedContentReference { * Recursively collect every unresolved content reference (a contentID / sortids value with * no source→target mapping) along with the field path where it occurs. * - * Unlike hasUnresolvedContentReferences (which early-exits with a boolean), this walks the - * whole structure so callers can report exactly which field/reference is unmapped. Only - * positive IDs are considered — 0 / -1 mean "no reference selected" and are ignored so we - * don't over-skip items with intentionally empty linked-content fields. + * Walks the whole structure (rather than early-exiting on the first hit) so callers can report + * exactly which field/reference is unmapped. Only positive IDs are considered — 0 / -1 mean "no + * reference selected" and are ignored so we don't over-skip items with intentionally empty + * linked-content fields. + * + * PROD-2446: a Content-typed dropdown/checkbox/grid field's reference can live ONLY in a + * companion field (named by the model's LinkeContentDropdownValueField/SortIDFieldName setting — + * see PROD-2431/2435/2442), invisible to the structural contentid/sortids walk above since it's a + * bare string under an arbitrary key. Pass `model` so this guard can recognize those too — without + * it, an unresolved companion-field reference ships to the target undetected, reproducing the same + * server-side NullReferenceException this guard exists to prevent (PROD-2309). */ export function collectUnresolvedContentReferences( obj: any, referenceMapper: ContentItemMapper, - path = "" + path = "", + model?: any ): UnresolvedContentReference[] { const results: UnresolvedContentReference[] = []; if (typeof obj !== "object" || obj === null) { @@ -72,7 +37,7 @@ export function collectUnresolvedContentReferences( if (Array.isArray(obj)) { obj.forEach((item, index) => { - results.push(...collectUnresolvedContentReferences(item, referenceMapper, `${path}[${index}]`)); + results.push(...collectUnresolvedContentReferences(item, referenceMapper, `${path}[${index}]`, model)); }); return results; } @@ -100,7 +65,27 @@ export function collectUnresolvedContentReferences( } // Recurse into nested objects/arrays - results.push(...collectUnresolvedContentReferences(value, referenceMapper, childPath)); + results.push(...collectUnresolvedContentReferences(value, referenceMapper, childPath, model)); + } + + // PROD-2446: companion fields are top-level siblings of the main field, not nested inside it — + // only check them at the top of the walk (path === ""), not on every recursive call, so a + // companion field's own value never gets misread as if it belonged to some nested object. + if (path === "") { + for (const [, companionFieldName] of getLinkedContentCompanionFields(model)) { + const companionKey = findFieldKey(obj, companionFieldName); + if (!companionKey) continue; + + const companionValue = obj[companionKey]; + if (typeof companionValue !== "string" || !companionValue.trim()) continue; + + for (const idStr of companionValue.split(",")) { + const contentId = parseInt(idStr.trim()); + if (!isNaN(contentId) && contentId > 0 && !referenceMapper.getContentItemMappingByContentID(contentId, "source")) { + results.push({ path: companionKey, contentID: contentId }); + } + } + } } return results; diff --git a/src/lib/pushers/content-pusher/util/tests/are-content-dependencies-resolved.test.ts b/src/lib/pushers/content-pusher/util/tests/are-content-dependencies-resolved.test.ts deleted file mode 100644 index 63f1c747..00000000 --- a/src/lib/pushers/content-pusher/util/tests/are-content-dependencies-resolved.test.ts +++ /dev/null @@ -1,151 +0,0 @@ -import { resetState } from "core/state"; -import { areContentDependenciesResolved } from "../are-content-dependencies-resolved"; - -jest.mock("lib/mappers/content-item-mapper", () => ({ - ContentItemMapper: jest.fn().mockImplementation(() => ({ - getContentItemMappingByContentID: jest.fn().mockReturnValue(null), - })), -})); - -beforeEach(() => { - resetState(); - jest.spyOn(console, "log").mockImplementation(() => {}); - jest.spyOn(console, "warn").mockImplementation(() => {}); - jest.spyOn(console, "error").mockImplementation(() => {}); -}); - -afterEach(() => { - jest.restoreAllMocks(); -}); - -// ─── helpers ────────────────────────────────────────────────────────────────── - -function makeContentItem(overrides: any = {}): any { - return { - contentID: 1, - properties: { definitionName: "BlogPost", referenceName: "blog-post" }, - fields: {}, - ...overrides, - }; -} - -function makeModel(referenceName: string): any { - return { referenceName, fields: [] }; -} - -function makeMapper(resolved: boolean): any { - return { - getContentItemMappingByContentID: jest - .fn() - .mockReturnValue(resolved ? { sourceContentID: 1, targetContentID: 100 } : null), - }; -} - -function makePartialMapper(resolvedIds: number[]): any { - return { - getContentItemMappingByContentID: jest - .fn() - .mockImplementation((id: number) => - resolvedIds.includes(id) ? { sourceContentID: id, targetContentID: id + 1000 } : null - ), - }; -} - -// ─── no fields ──────────────────────────────────────────────────────────────── - -describe("areContentDependenciesResolved — no fields", () => { - it("returns true when fields is absent", () => { - const item = makeContentItem({ fields: undefined }); - expect(areContentDependenciesResolved(item, makeMapper(false), [])).toBe(true); - }); - - it("returns true when fields is null", () => { - const item = makeContentItem({ fields: null }); - expect(areContentDependenciesResolved(item, makeMapper(false), [])).toBe(true); - }); -}); - -// ─── no model found ─────────────────────────────────────────────────────────── - -describe("areContentDependenciesResolved — no model found", () => { - it("returns true when model is not in the models list", () => { - const item = makeContentItem({ fields: { contentid: 5 } }); - const models: any[] = [makeModel("OtherModel")]; - const mapper = makeMapper(false); - expect(areContentDependenciesResolved(item, mapper, models)).toBe(true); - expect(mapper.getContentItemMappingByContentID).not.toHaveBeenCalled(); - }); - - it("returns true when models list is empty", () => { - const item = makeContentItem({ fields: { contentid: 5 } }); - expect(areContentDependenciesResolved(item, makeMapper(false), [])).toBe(true); - }); -}); - -// ─── all references resolved ────────────────────────────────────────────────── - -describe("areContentDependenciesResolved — all references resolved", () => { - it("returns true when contentid field is resolved by mapper", () => { - const item = makeContentItem({ fields: { relatedContent: { contentid: 5 } } }); - const models = [makeModel("BlogPost")]; - expect(areContentDependenciesResolved(item, makeMapper(true), models)).toBe(true); - }); - - it("returns true when fields have no content references", () => { - const item = makeContentItem({ fields: { title: "Hello", body: "World" } }); - const models = [makeModel("BlogPost")]; - expect(areContentDependenciesResolved(item, makeMapper(false), models)).toBe(true); - }); - - it("returns true for empty fields object", () => { - const item = makeContentItem({ fields: {} }); - const models = [makeModel("BlogPost")]; - expect(areContentDependenciesResolved(item, makeMapper(false), models)).toBe(true); - }); -}); - -// ─── unresolved references ──────────────────────────────────────────────────── - -describe("areContentDependenciesResolved — unresolved references", () => { - it("returns false when contentid field is not resolved by mapper", () => { - const item = makeContentItem({ fields: { relatedContent: { contentid: 5 } } }); - const models = [makeModel("BlogPost")]; - expect(areContentDependenciesResolved(item, makeMapper(false), models)).toBe(false); - }); - - it("returns false when sortids contain an unresolved id", () => { - const item = makeContentItem({ fields: { items: { sortids: "10,20,30" } } }); - const models = [makeModel("BlogPost")]; - const mapper = makePartialMapper([10, 30]); - expect(areContentDependenciesResolved(item, mapper, models)).toBe(false); - }); - - it("returns false when a nested contentID is unresolved", () => { - const item = makeContentItem({ - fields: { nested: { deeper: { contentID: 77 } } }, - }); - const models = [makeModel("BlogPost")]; - expect(areContentDependenciesResolved(item, makeMapper(false), models)).toBe(false); - }); -}); - -// ─── model matching ─────────────────────────────────────────────────────────── - -describe("areContentDependenciesResolved — model matching", () => { - it("matches model by definitionName from properties", () => { - const item: any = { - contentID: 1, - properties: { definitionName: "SpecialModel" }, - fields: { link: { contentid: 99 } }, - }; - const models = [makeModel("SpecialModel"), makeModel("OtherModel")]; - expect(areContentDependenciesResolved(item, makeMapper(false), models)).toBe(false); - }); - - it("returns true (assume resolved) when item has no properties", () => { - const item: any = { contentID: 1, fields: { contentid: 5 } }; - const models = [makeModel("BlogPost")]; - // No properties.definitionName → model.find returns undefined → returns true - expect(areContentDependenciesResolved(item, makeMapper(false), models)).toBe(true); - }); -}); diff --git a/src/lib/pushers/content-pusher/util/tests/collect-content-id-references.test.ts b/src/lib/pushers/content-pusher/util/tests/collect-content-id-references.test.ts index b75705a7..72ff05dd 100644 --- a/src/lib/pushers/content-pusher/util/tests/collect-content-id-references.test.ts +++ b/src/lib/pushers/content-pusher/util/tests/collect-content-id-references.test.ts @@ -50,4 +50,36 @@ describe("collectContentIDReferences", () => { // Whole-list refs are handled by collectListReferenceNames, not here. expect(collectContentIDReferences({ items: { referencename: "somelist", fulllist: true } })).toEqual([]); }); + + // PROD-2446: a reference that lives ONLY in a LinkeContentDropdownValueField/SortIDFieldName + // companion field (PROD-2431/2435/2442) is a bare string under an arbitrary key — invisible to + // the structural walk above without the model to name it. + describe("companion-field references (schema-driven, PROD-2446)", () => { + it("collects an id living only in an arbitrarily-named companion field", () => { + const model = { + fields: [{ name: "linkedDrawGameAsset", settings: { LinkeContentDropdownValueField: "linkedContentId" } }], + }; + const fields = { linkedDrawGameAsset: "euro-jackpot", linkedContentId: "11875" }; + expect(collectContentIDReferences(fields, model)).toEqual([11875]); + }); + + it("collects comma-separated ids from a grid field's SortIDFieldName companion", () => { + const model = { + fields: [{ name: "sharedGridSorted", settings: { SortIDFieldName: "sharedGridSorted_SortField" } }], + }; + const fields = { sharedGridSorted: { referencename: "list", fulllist: true }, sharedGridSorted_SortField: "3,7,11" }; + expect(collectContentIDReferences(fields, model).sort((a, b) => a - b)).toEqual([3, 7, 11]); + }); + + it("is a no-op when no model is supplied (back-compat)", () => { + const fields = { linkedDrawGameAsset: "euro-jackpot", linkedContentId: "11875" }; + expect(collectContentIDReferences(fields)).toEqual([]); + }); + + it("tolerates a sentinel setting that names no real field", () => { + const model = { fields: [{ name: "posts", settings: { LinkeContentDropdownValueField: "CREATENEW" } }] }; + const fields = { posts: { referencename: "posts-list", fulllist: true } }; + expect(collectContentIDReferences(fields, model)).toEqual([]); + }); + }); }); diff --git a/src/lib/pushers/content-pusher/util/tests/get-content-item-types.test.ts b/src/lib/pushers/content-pusher/util/tests/get-content-item-types.test.ts index 3d32b016..7bd2c801 100644 --- a/src/lib/pushers/content-pusher/util/tests/get-content-item-types.test.ts +++ b/src/lib/pushers/content-pusher/util/tests/get-content-item-types.test.ts @@ -300,6 +300,32 @@ describe("getContentItemTypes — single-item content references", () => { expect(linkedIds).toContain(mid.contentID); expect(linkedIds).toContain(deep.contentID); }); + + // PROD-2446: a reference living only in a LinkeContentDropdownValueField/SortIDFieldName + // companion field (PROD-2431/2435/2442) is invisible to the structural contentid/sortids walk — + // without the referencing item's own model, the referenced item was never promoted to push-first. + it("promotes an item referenced only through a companion field (PROD-2446)", () => { + const target = makeItem("drawgamesassets", "DrawGameAssetsSchema"); + const playslip = makeItem("playslipsection", "PlaylipSection", { + // main field holds the container reference name, per the LinkedContentDropdown contract — + // the actual selected id lives only in the companion field + linkedDrawGameAsset: "drawgamesassets", + linkedContentId: `${target.contentID}`, + }); + + const opts = makeValidOpts(); + opts.modelMapper.getMappedEntity = jest.fn().mockReturnValue({ + id: 10, + fields: [{ name: "linkedDrawGameAsset", settings: { LinkeContentDropdownValueField: "linkedContentId" } }], + }); + + const result = getContentItemTypes([playslip, target], opts); + + expect(result.linkedContentItems).toHaveLength(1); + expect(result.linkedContentItems[0]).toBe(target); + expect(result.normalContentItems).toHaveLength(1); + expect(result.normalContentItems[0]).toBe(playslip); + }); }); // ─── reference to unknown item ──────────────────────────────────────────────── diff --git a/src/lib/pushers/content-pusher/util/tests/has-unresolved-content-references.test.ts b/src/lib/pushers/content-pusher/util/tests/has-unresolved-content-references.test.ts index d077ccdf..8e69caf6 100644 --- a/src/lib/pushers/content-pusher/util/tests/has-unresolved-content-references.test.ts +++ b/src/lib/pushers/content-pusher/util/tests/has-unresolved-content-references.test.ts @@ -1,8 +1,5 @@ import { resetState } from "core/state"; -import { - hasUnresolvedContentReferences, - collectUnresolvedContentReferences, -} from "../has-unresolved-content-references"; +import { collectUnresolvedContentReferences } from "../has-unresolved-content-references"; beforeEach(() => { resetState(); @@ -35,145 +32,6 @@ function makePartialMapper(resolvedIds: number[]): any { }; } -// ─── non-object primitives ──────────────────────────────────────────────────── - -describe("hasUnresolvedContentReferences — non-object primitives", () => { - it.each([ - ["null", null], - ["a string", "hello"], - ["a number", 42], - ["true", true], - ["undefined", undefined], - ])("returns false for %s", (_label, value) => { - expect(hasUnresolvedContentReferences(value, makeMapper(true))).toBe(false); - }); -}); - -// ─── contentid (lowercase) ──────────────────────────────────────────────────── - -describe("hasUnresolvedContentReferences — contentid key", () => { - it("returns false when contentid is resolved in mapper", () => { - const mapper = makeMapper(true); - expect(hasUnresolvedContentReferences({ contentid: 5 }, mapper)).toBe(false); - expect(mapper.getContentItemMappingByContentID).toHaveBeenCalledWith(5, "source"); - }); - - it("returns true when contentid is not found in mapper", () => { - const mapper = makeMapper(false); - expect(hasUnresolvedContentReferences({ contentid: 5 }, mapper)).toBe(true); - }); - - it("ignores contentid when value is a string (not a number)", () => { - const mapper = makeMapper(false); - expect(hasUnresolvedContentReferences({ contentid: "abc" }, mapper)).toBe(false); - expect(mapper.getContentItemMappingByContentID).not.toHaveBeenCalled(); - }); -}); - -// ─── contentID (camelCase) ──────────────────────────────────────────────────── - -describe("hasUnresolvedContentReferences — contentID key", () => { - it("returns false when contentID is resolved", () => { - const mapper = makeMapper(true); - expect(hasUnresolvedContentReferences({ contentID: 99 }, mapper)).toBe(false); - }); - - it("returns true when contentID is unresolved", () => { - const mapper = makeMapper(false); - expect(hasUnresolvedContentReferences({ contentID: 99 }, mapper)).toBe(true); - }); - - it("ignores string contentID values", () => { - const mapper = makeMapper(false); - expect(hasUnresolvedContentReferences({ contentID: "not-a-number" }, mapper)).toBe(false); - }); -}); - -// ─── sortids ───────────────────────────────────────────────────────────────── - -describe("hasUnresolvedContentReferences — sortids key", () => { - it("returns false when all sortids are resolved", () => { - const mapper = makePartialMapper([1, 2, 3]); - expect(hasUnresolvedContentReferences({ sortids: "1,2,3" }, mapper)).toBe(false); - }); - - it("returns true when at least one sortid is unresolved", () => { - const mapper = makePartialMapper([1, 3]); - expect(hasUnresolvedContentReferences({ sortids: "1,2,3" }, mapper)).toBe(true); - }); - - it("ignores blank entries in sortids", () => { - const mapper = makePartialMapper([1, 2]); - expect(hasUnresolvedContentReferences({ sortids: "1,,2," }, mapper)).toBe(false); - }); - - it("skips NaN entries in sortids", () => { - const mapper = makePartialMapper([]); - expect(hasUnresolvedContentReferences({ sortids: "abc,def" }, mapper)).toBe(false); - expect(mapper.getContentItemMappingByContentID).not.toHaveBeenCalled(); - }); - - it("handles empty sortids string", () => { - const mapper = makeMapper(false); - expect(hasUnresolvedContentReferences({ sortids: "" }, mapper)).toBe(false); - }); -}); - -// ─── nested objects ─────────────────────────────────────────────────────────── - -describe("hasUnresolvedContentReferences — nested objects", () => { - it("returns true when an unresolved contentid is buried in a nested object", () => { - const mapper = makeMapper(false); - const obj = { outer: { inner: { contentid: 10 } } }; - expect(hasUnresolvedContentReferences(obj, mapper)).toBe(true); - }); - - it("returns false when all nested contentids are resolved", () => { - const mapper = makeMapper(true); - const obj = { outer: { inner: { contentid: 10 } } }; - expect(hasUnresolvedContentReferences(obj, mapper)).toBe(false); - }); -}); - -// ─── arrays ────────────────────────────────────────────────────────────────── - -describe("hasUnresolvedContentReferences — arrays", () => { - it("returns true when any array element has an unresolved reference", () => { - const mapper = makePartialMapper([1]); - const arr = [{ contentid: 1 }, { contentid: 99 }]; - expect(hasUnresolvedContentReferences(arr, mapper)).toBe(true); - }); - - it("returns false when all array elements are resolved", () => { - const mapper = makePartialMapper([1, 2]); - const arr = [{ contentid: 1 }, { contentid: 2 }]; - expect(hasUnresolvedContentReferences(arr, mapper)).toBe(false); - }); - - it("returns false for an empty array", () => { - const mapper = makeMapper(false); - expect(hasUnresolvedContentReferences([], mapper)).toBe(false); - }); -}); - -// ─── combination cases ──────────────────────────────────────────────────────── - -describe("hasUnresolvedContentReferences — combination cases", () => { - it("returns false when object has unrelated keys only", () => { - const mapper = makeMapper(false); - expect(hasUnresolvedContentReferences({ title: "Hello", count: 5 }, mapper)).toBe(false); - expect(mapper.getContentItemMappingByContentID).not.toHaveBeenCalled(); - }); - - it("early-exits on first unresolved reference (does not scan the rest)", () => { - const mapper = makeMapper(false); - const obj = { contentid: 1, sortids: "2,3", nested: { contentID: 4 } }; - const result = hasUnresolvedContentReferences(obj, mapper); - expect(result).toBe(true); - expect(mapper.getContentItemMappingByContentID).toHaveBeenCalledTimes(1); - }); -}); - // ─── collectUnresolvedContentReferences ──────────────────────────────────────── describe("collectUnresolvedContentReferences", () => { @@ -222,3 +80,65 @@ describe("collectUnresolvedContentReferences", () => { expect(result).toEqual([]); }); }); + +// ─── companion-field references (schema-driven, PROD-2446) ──────────────────── + +describe("collectUnresolvedContentReferences — companion fields (PROD-2446)", () => { + it("flags an unresolved id living only in an arbitrarily-named companion field", () => { + const model = { + fields: [{ name: "linkedDrawGameAsset", settings: { LinkeContentDropdownValueField: "linkedContentId" } }], + }; + const fields = { linkedDrawGameAsset: "euro-jackpot", linkedContentId: "11875" }; + const result = collectUnresolvedContentReferences(fields, makeMapper(false), "", model); + expect(result).toEqual([{ path: "linkedContentId", contentID: 11875 }]); + }); + + it("does not flag a companion field whose id is resolved", () => { + const model = { + fields: [{ name: "linkedDrawGameAsset", settings: { LinkeContentDropdownValueField: "linkedContentId" } }], + }; + const fields = { linkedDrawGameAsset: "euro-jackpot", linkedContentId: "11875" }; + const result = collectUnresolvedContentReferences(fields, makeMapper(true), "", model); + expect(result).toEqual([]); + }); + + it("flags every unresolved id in a grid field's SortIDFieldName companion", () => { + const model = { + fields: [{ name: "sharedGridSorted", settings: { SortIDFieldName: "sharedGridSorted_SortField" } }], + }; + const mapper = makePartialMapper([13086]); + // Main field itself carries no "sortids" key here, isolating the companion-only path — + // the combined case (both keys populated) is already covered by content-field-mapper.test.ts. + const fields = { + sharedGridSorted: { referencename: "list", fulllist: true }, + sharedGridSorted_SortField: "13086,13087,13088", + }; + const result = collectUnresolvedContentReferences(fields, mapper, "", model); + expect(result).toEqual([ + { path: "sharedGridSorted_SortField", contentID: 13087 }, + { path: "sharedGridSorted_SortField", contentID: 13088 }, + ]); + }); + + it("is a no-op when no model is supplied (back-compat)", () => { + const fields = { linkedDrawGameAsset: "euro-jackpot", linkedContentId: "11875" }; + expect(collectUnresolvedContentReferences(fields, makeMapper(false))).toEqual([]); + }); + + it("only checks companion fields at the top level, not inside nested recursion", () => { + // A field literally named "linkedContentId" nested somewhere else in the payload should not + // be double-counted as the companion for a different, unrelated model field pass. + const model = { + fields: [{ name: "linkedDrawGameAsset", settings: { LinkeContentDropdownValueField: "linkedContentId" } }], + }; + const fields = { + linkedDrawGameAsset: "euro-jackpot", + linkedContentId: "11875", + nested: { linkedContentId: "99999" }, + }; + const result = collectUnresolvedContentReferences(fields, makeMapper(false), "", model); + // top-level companion (11875) flagged once; the nested "linkedContentId" is a plain string + // field with no contentid/contentID/sortids key, so the structural walk doesn't touch it either + expect(result).toEqual([{ path: "linkedContentId", contentID: 11875 }]); + }); +}); diff --git a/src/lib/pushers/index.ts b/src/lib/pushers/index.ts deleted file mode 100644 index 52c5cd6a..00000000 --- a/src/lib/pushers/index.ts +++ /dev/null @@ -1,10 +0,0 @@ -export * from "./asset-pusher"; -export * from "./container-pusher"; -export * from "./content-pusher/content-pusher"; -export * from "./content-pusher/content-pusher"; -export * from "./gallery-pusher"; -export * from "./model-pusher"; -export * from "./orchestrate-pushers"; -export * from "./page-pusher/push-pages"; -export * from "./push-operations-config"; -export * from "./template-pusher"; diff --git a/src/lib/shared/index.ts b/src/lib/shared/index.ts index 7db8265f..41a0d9b0 100644 --- a/src/lib/shared/index.ts +++ b/src/lib/shared/index.ts @@ -5,7 +5,6 @@ export * from "../loggers"; // // ReferenceMapperV2 exports export * from "../pushers/batch-polling"; -export * from "./link-type-detector"; export { GuidDataLoader, GuidEntities, SourceEntities } from "../pushers/guid-data-loader"; export function prettyException(error: any): string { return error.message || error.toString(); diff --git a/src/lib/shared/link-type-detector.ts b/src/lib/shared/link-type-detector.ts deleted file mode 100644 index 5964a68d..00000000 --- a/src/lib/shared/link-type-detector.ts +++ /dev/null @@ -1,181 +0,0 @@ -/** - * Link Type Detection Service - * - * Detects Agility CMS link types from model field configurations to enable - * proper handling of different content linking patterns and eliminate false - * broken chain reports from field configuration misinterpretation. - */ - -export interface LinkTypeDetection { - type: "dropdown" | "searchlistbox" | "grid" | "nested" | "shared" | "unknown"; - strategy: string; - requiresMapping: boolean; - followDependencies: boolean; - isFieldConfiguration?: boolean; // Added to identify field setting strings -} - -export interface ContentFieldAnalysis { - fieldName: string; - linkType: LinkTypeDetection; - contentDefinition: string; - actualContentReferences: string[]; // Real content references, not field settings - fieldConfigurationStrings: string[]; // Field setting strings to ignore -} - -export class LinkTypeDetector { - /** - * Detect link type from a Content field's settings - */ - detectLinkType(field: any): LinkTypeDetection { - if (field.type !== "Content") { - return { - type: "unknown", - strategy: "not-content-field", - requiresMapping: false, - followDependencies: false, - }; - } - - const settings = field.settings; - const renderAs = settings.RenderAs || ""; - const nestedTypeID = settings.LinkedContentNestedTypeID || ""; - const sharedContent = settings.SharedContent || ""; - const contentView = settings.ContentView || ""; - - // 1. DROPDOWN LINKS (Shared Content) - if (renderAs === "dropdown" && sharedContent !== "_newcontent_agility_") { - return { - type: "dropdown", - strategy: "Use ID mapping only, don't follow dependencies", - requiresMapping: true, - followDependencies: false, - }; - } - - // 2. SEARCHLISTBOX LINKS (Filtered Selection) - if (renderAs === "searchlistbox") { - return { - type: "searchlistbox", - strategy: "Reference via contentID in separate field with remapping", - requiresMapping: true, - followDependencies: true, - }; - } - - // 3. GRID LINKS (Multi-item Lists) - if (renderAs === "grid" && nestedTypeID === "1") { - return { - type: "grid", - strategy: "Link to shared list with mapping + optional sorting", - requiresMapping: true, - followDependencies: true, - }; - } - - // 4. NESTED LINKS (Single Item Containers) - if (renderAs === "" && nestedTypeID === "0") { - return { - type: "nested", - strategy: "Create container if missing, link locally", - requiresMapping: true, - followDependencies: true, - }; - } - - // 5. SHARED CONTENT (Specific View Names) - if (contentView !== "_newcontent_agility_" && sharedContent !== "_newcontent_agility_") { - return { - type: "shared", - strategy: "Treat as shared, use content view metadata for context", - requiresMapping: true, - followDependencies: false, - }; - } - - return { - type: "unknown", - strategy: "unhandled-pattern", - requiresMapping: false, - followDependencies: false, - }; - } - - /** - * Analyze all Content fields in a model and extract real references vs field settings - */ - analyzeModelContentFields(model: any): ContentFieldAnalysis[] { - if (!model.fields) return []; - - return model.fields - .filter((field: any) => field.type === "Content") - .map((field: any) => { - const linkType = this.detectLinkType(field); - const settings = field.settings; - - // Identify field configuration strings (NOT content references) - const fieldConfigurationStrings: string[] = []; - if (settings.LinkeContentDropdownValueField) { - fieldConfigurationStrings.push(settings.LinkeContentDropdownValueField); - } - if (settings.LinkeContentDropdownTextField) { - fieldConfigurationStrings.push(settings.LinkeContentDropdownTextField); - } - - // Extract actual content references (depend on link type) - const actualContentReferences: string[] = []; - if (settings.ContentDefinition) { - actualContentReferences.push(settings.ContentDefinition); - } - - return { - fieldName: field.name, - linkType, - contentDefinition: settings.ContentDefinition || "", - actualContentReferences, - fieldConfigurationStrings, - }; - }); - } - - /** - * Check if a reference string is a field configuration (should be ignored) - */ - isFieldConfigurationString(referenceString: string, model: any): boolean { - const analysis = this.analyzeModelContentFields(model); - - return analysis.some((fieldAnalysis) => fieldAnalysis.fieldConfigurationStrings.includes(referenceString)); - } - - /** - * Extract only real content references from a model (filter out field settings) - */ - extractRealContentReferences( - model: any - ): Array<{ fieldName: string; contentDefinition: string; linkType: LinkTypeDetection }> { - const analysis = this.analyzeModelContentFields(model); - - return analysis - .filter((fieldAnalysis) => fieldAnalysis.actualContentReferences.length > 0) - .map((fieldAnalysis) => ({ - fieldName: fieldAnalysis.fieldName, - contentDefinition: fieldAnalysis.contentDefinition, - linkType: fieldAnalysis.linkType, - })); - } - - /** - * Get human-readable description of link type - */ - getLinkTypeDescription(linkType: LinkTypeDetection): string { - const typeDescriptions = { - dropdown: "🔽 Dropdown (Shared Content)", - searchlistbox: "🔍 SearchListBox (Filtered Selection)", - grid: "📋 Grid (Multi-item List)", - nested: "📦 Nested (Single Container)", - shared: "🔗 Shared (Content View)", - unknown: "❓ Unknown Pattern", - }; - - return typeDescriptions[linkType.type] || "❓ Unknown"; - } -} diff --git a/src/lib/shared/tests/link-type-detector.test.ts b/src/lib/shared/tests/link-type-detector.test.ts deleted file mode 100644 index 51eb3fbf..00000000 --- a/src/lib/shared/tests/link-type-detector.test.ts +++ /dev/null @@ -1,323 +0,0 @@ -import { resetState } from "core/state"; -import { LinkTypeDetector } from "../link-type-detector"; - -beforeEach(() => { - resetState(); - jest.spyOn(console, "log").mockImplementation(() => {}); - jest.spyOn(console, "warn").mockImplementation(() => {}); - jest.spyOn(console, "error").mockImplementation(() => {}); -}); - -afterEach(() => { - jest.restoreAllMocks(); -}); - -// ─── detectLinkType ──────────────────────────────────────────────────────────── - -describe("LinkTypeDetector.detectLinkType", () => { - const detector = new LinkTypeDetector(); - - it("returns unknown when field type is not Content", () => { - const result = detector.detectLinkType({ type: "Text", settings: {} }); - expect(result.type).toBe("unknown"); - expect(result.strategy).toBe("not-content-field"); - expect(result.requiresMapping).toBe(false); - expect(result.followDependencies).toBe(false); - }); - - it("detects dropdown type when renderAs is dropdown and SharedContent is not _newcontent_agility_", () => { - const field = { - type: "Content", - settings: { RenderAs: "dropdown", SharedContent: "some-list", LinkedContentNestedTypeID: "", ContentView: "" }, - }; - const result = detector.detectLinkType(field); - expect(result.type).toBe("dropdown"); - expect(result.requiresMapping).toBe(true); - expect(result.followDependencies).toBe(false); - }); - - it("does NOT detect dropdown when SharedContent is _newcontent_agility_", () => { - const field = { - type: "Content", - settings: { - RenderAs: "dropdown", - SharedContent: "_newcontent_agility_", - LinkedContentNestedTypeID: "", - ContentView: "", - }, - }; - const result = detector.detectLinkType(field); - expect(result.type).not.toBe("dropdown"); - }); - - it("detects searchlistbox type when renderAs is searchlistbox", () => { - const field = { - type: "Content", - settings: { RenderAs: "searchlistbox", SharedContent: "", LinkedContentNestedTypeID: "", ContentView: "" }, - }; - const result = detector.detectLinkType(field); - expect(result.type).toBe("searchlistbox"); - expect(result.requiresMapping).toBe(true); - expect(result.followDependencies).toBe(true); - }); - - it("detects grid type when renderAs is grid and nestedTypeID is 1", () => { - const field = { - type: "Content", - settings: { RenderAs: "grid", LinkedContentNestedTypeID: "1", SharedContent: "", ContentView: "" }, - }; - const result = detector.detectLinkType(field); - expect(result.type).toBe("grid"); - expect(result.requiresMapping).toBe(true); - expect(result.followDependencies).toBe(true); - }); - - it("does NOT detect grid when nestedTypeID is not 1", () => { - const field = { - type: "Content", - settings: { RenderAs: "grid", LinkedContentNestedTypeID: "0", SharedContent: "", ContentView: "" }, - }; - const result = detector.detectLinkType(field); - expect(result.type).not.toBe("grid"); - }); - - it("detects nested type when renderAs is empty and nestedTypeID is 0", () => { - const field = { - type: "Content", - settings: { RenderAs: "", LinkedContentNestedTypeID: "0", SharedContent: "", ContentView: "" }, - }; - const result = detector.detectLinkType(field); - expect(result.type).toBe("nested"); - expect(result.requiresMapping).toBe(true); - expect(result.followDependencies).toBe(true); - }); - - it("detects shared type when contentView and sharedContent are not _newcontent_agility_", () => { - const field = { - type: "Content", - settings: { - RenderAs: "some-other", - LinkedContentNestedTypeID: "", - SharedContent: "some-content", - ContentView: "some-view", - }, - }; - const result = detector.detectLinkType(field); - expect(result.type).toBe("shared"); - expect(result.requiresMapping).toBe(true); - expect(result.followDependencies).toBe(false); - }); - - it("returns unknown for unhandled pattern", () => { - const field = { - type: "Content", - settings: { - RenderAs: "other", - LinkedContentNestedTypeID: "5", - SharedContent: "_newcontent_agility_", - ContentView: "_newcontent_agility_", - }, - }; - const result = detector.detectLinkType(field); - expect(result.type).toBe("unknown"); - expect(result.strategy).toBe("unhandled-pattern"); - }); -}); - -// ─── analyzeModelContentFields ───────────────────────────────────────────────── - -describe("LinkTypeDetector.analyzeModelContentFields", () => { - const detector = new LinkTypeDetector(); - - it("returns empty array when model has no fields", () => { - expect(detector.analyzeModelContentFields({})).toEqual([]); - expect(detector.analyzeModelContentFields({ fields: [] })).toEqual([]); - }); - - it("filters out non-Content fields", () => { - const model = { - fields: [ - { type: "Text", name: "title", settings: {} }, - { type: "Number", name: "count", settings: {} }, - ], - }; - expect(detector.analyzeModelContentFields(model)).toHaveLength(0); - }); - - it("includes Content fields with correct fieldName and contentDefinition", () => { - const model = { - fields: [ - { - type: "Content", - name: "relatedArticles", - settings: { - RenderAs: "dropdown", - SharedContent: "articles", - ContentDefinition: "article", - LinkedContentNestedTypeID: "", - ContentView: "", - }, - }, - ], - }; - const result = detector.analyzeModelContentFields(model); - expect(result).toHaveLength(1); - expect(result[0].fieldName).toBe("relatedArticles"); - expect(result[0].contentDefinition).toBe("article"); - expect(result[0].actualContentReferences).toContain("article"); - }); - - it("captures LinkeContentDropdownValueField as fieldConfigurationString", () => { - const model = { - fields: [ - { - type: "Content", - name: "myField", - settings: { - RenderAs: "dropdown", - SharedContent: "some-list", - LinkeContentDropdownValueField: "id", - LinkeContentDropdownTextField: "label", - LinkedContentNestedTypeID: "", - ContentView: "", - ContentDefinition: "myDef", - }, - }, - ], - }; - const result = detector.analyzeModelContentFields(model); - expect(result[0].fieldConfigurationStrings).toContain("id"); - expect(result[0].fieldConfigurationStrings).toContain("label"); - }); - - it("returns empty actualContentReferences when ContentDefinition is missing", () => { - const model = { - fields: [ - { - type: "Content", - name: "myField", - settings: { RenderAs: "", LinkedContentNestedTypeID: "0", SharedContent: "", ContentView: "" }, - }, - ], - }; - const result = detector.analyzeModelContentFields(model); - expect(result[0].actualContentReferences).toHaveLength(0); - expect(result[0].contentDefinition).toBe(""); - }); -}); - -// ─── isFieldConfigurationString ──────────────────────────────────────────────── - -describe("LinkTypeDetector.isFieldConfigurationString", () => { - const detector = new LinkTypeDetector(); - - it("returns true when referenceString is a field configuration string", () => { - const model = { - fields: [ - { - type: "Content", - name: "myField", - settings: { - RenderAs: "dropdown", - SharedContent: "some-list", - LinkeContentDropdownValueField: "itemID", - LinkedContentNestedTypeID: "", - ContentView: "", - ContentDefinition: "def", - }, - }, - ], - }; - expect(detector.isFieldConfigurationString("itemID", model)).toBe(true); - }); - - it("returns false when referenceString is NOT a field configuration string", () => { - const model = { - fields: [ - { - type: "Content", - name: "myField", - settings: { - RenderAs: "dropdown", - SharedContent: "some-list", - LinkeContentDropdownValueField: "itemID", - LinkedContentNestedTypeID: "", - ContentView: "", - ContentDefinition: "myDef", - }, - }, - ], - }; - expect(detector.isFieldConfigurationString("myDef", model)).toBe(false); - }); - - it("returns false for model with no Content fields", () => { - const model = { fields: [{ type: "Text", name: "title", settings: {} }] }; - expect(detector.isFieldConfigurationString("anything", model)).toBe(false); - }); -}); - -// ─── extractRealContentReferences ───────────────────────────────────────────── - -describe("LinkTypeDetector.extractRealContentReferences", () => { - const detector = new LinkTypeDetector(); - - it("returns empty array when no Content fields have ContentDefinition", () => { - const model = { - fields: [ - { - type: "Content", - name: "myField", - settings: { RenderAs: "", LinkedContentNestedTypeID: "0", SharedContent: "", ContentView: "" }, - }, - ], - }; - expect(detector.extractRealContentReferences(model)).toHaveLength(0); - }); - - it("returns references for Content fields with ContentDefinition", () => { - const model = { - fields: [ - { - type: "Content", - name: "hero", - settings: { - RenderAs: "dropdown", - SharedContent: "heroItems", - ContentDefinition: "hero-module", - LinkedContentNestedTypeID: "", - ContentView: "", - }, - }, - ], - }; - const result = detector.extractRealContentReferences(model); - expect(result).toHaveLength(1); - expect(result[0].fieldName).toBe("hero"); - expect(result[0].contentDefinition).toBe("hero-module"); - expect(result[0].linkType).toBeDefined(); - }); -}); - -// ─── getLinkTypeDescription ──────────────────────────────────────────────────── - -describe("LinkTypeDetector.getLinkTypeDescription", () => { - const detector = new LinkTypeDetector(); - - it.each([ - ["dropdown", "Dropdown"], - ["searchlistbox", "SearchListBox"], - ["grid", "Grid"], - ["nested", "Nested"], - ["shared", "Shared"], - ["unknown", "Unknown"], - ] as const)('returns description containing "%s" keyword for type %s', (type, keyword) => { - const result = detector.getLinkTypeDescription({ - type, - strategy: "", - requiresMapping: false, - followDependencies: false, - }); - expect(result).toContain(keyword); - }); -}); diff --git a/src/lib/ui/console/index.ts b/src/lib/ui/console/index.ts deleted file mode 100644 index af24a4b7..00000000 --- a/src/lib/ui/console/index.ts +++ /dev/null @@ -1,25 +0,0 @@ -// Console Manager - Main console redirection and management -export { - ConsoleManager, - type ConsoleMode, - type ConsoleState, - type ConsoleRedirectionHandlers, -} from "./console-manager"; - -// File Logger - Enhanced file logging with structured logging -export { FileLogger, type FileLoggerConfig, type LogEntry } from "./file-logger"; - -// Logging Modes - Mode determination and configuration -export { LoggingModes, type LoggingModeConfig } from "./logging-modes"; - -// Utility functions for common console operations -export { - createConsoleSetup, - cleanupConsoleSetup, - // Remove blessed handlers - no longer supported - createHeadlessConsoleSetup, - createVerboseConsoleSetup, - validateConsoleSetup, - type ConsoleSetupConfig, - type ConsoleSetupResult, -} from "./console-setup-utils"; diff --git a/src/lib/ui/progress/index.ts b/src/lib/ui/progress/index.ts deleted file mode 100644 index 8f5b59fa..00000000 --- a/src/lib/ui/progress/index.ts +++ /dev/null @@ -1,12 +0,0 @@ -// Progress Tracker - Main progress tracking functionality -export { - ProgressTracker, - type ProgressStatus, - type ProgressCallbackType, - type StepStatus, - type ProgressSummary, - type ProgressCallbacks, -} from "./progress-tracker"; - -// Progress Calculator - Mathematical progress calculations and utilities -export { ProgressCalculator, type ProgressStats, type ProgressWindow } from "./progress-calculator"; diff --git a/src/types/comparisonResult.ts b/src/types/comparisonResult.ts deleted file mode 100644 index d3acfa74..00000000 --- a/src/types/comparisonResult.ts +++ /dev/null @@ -1,3 +0,0 @@ -interface ComparisonResult { - [key: string]: any; -} diff --git a/src/types/index.ts b/src/types/index.ts index 2df91fa5..822160f8 100644 --- a/src/types/index.ts +++ b/src/types/index.ts @@ -9,7 +9,6 @@ export * from "./serverUser"; export * from "./websiteListing"; export * from "./websiteUser"; export * from "./cliToken"; -// Note: comparisonResult.ts doesn't export anything, skipping // ReferenceMapperV2 types export * from "./referenceMapperV2"; diff --git a/yarn.lock b/yarn.lock index 8ace5217..2f089c65 100644 --- a/yarn.lock +++ b/yarn.lock @@ -10,11 +10,6 @@ axios "^0.21.1" axios-cache-adapter "^2.4.1" -"@agility/content-fetch@^2.0.10": - version "2.0.10" - resolved "https://registry.npmjs.org/@agility/content-fetch/-/content-fetch-2.0.10.tgz" - integrity sha512-DhEQtd4943M4aQKXuYxDFOKSTbP68CqwMCBxVkPhXAExNyeNNHLt2s3O55pF3OzVAMnIFByw71BLz8lKQmeB3Q== - "@agility/content-sync@^1.2.0": version "1.2.0" resolved "https://registry.npmjs.org/@agility/content-sync/-/content-sync-1.2.0.tgz" @@ -307,11 +302,6 @@ resolved "https://registry.npmjs.org/@bcoe/v8-coverage/-/v8-coverage-0.2.3.tgz" integrity sha512-0hYQ8SB4Db5zvZB4axdMHGwEaQjkZzFjQiN9LVYvIFB2nSUHW9tYpxWriPrWDASIxiaXax83REcLxuSdnGPZtw== -"@colors/colors@1.5.0": - version "1.5.0" - resolved "https://registry.npmjs.org/@colors/colors/-/colors-1.5.0.tgz" - integrity sha512-ooWCrlZP11i8GImSjTHYHLkvFDP48nS4+204nGb1RiX/WXYHmJA2III9/e2DWVabCESdW7hBAEzHRqUn9OUVvQ== - "@cspotcode/source-map-support@^0.8.0": version "0.8.1" resolved "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz" @@ -737,13 +727,6 @@ resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.9.tgz" integrity sha512-GhdPgy1el4/ImP05X05Uw4cw2/M93BCUmnEvWZNStlCzEKME4Fkk+YpoA5OiHNQmoS7Cafb8Xa3Pya8m1Qrzeg== -"@types/form-data@^2.2.1": - version "2.2.1" - resolved "https://registry.npmjs.org/@types/form-data/-/form-data-2.2.1.tgz" - integrity sha512-JAMFhOaHIciYVh8fb5/83nmuO/AHwmto+Hq7a9y8FzLDcC1KCU344XDOMEmahnrTFlHjgh4L0WJFczNIX2GxnQ== - dependencies: - "@types/node" "*" - "@types/graceful-fs@^4.1.3": version "4.1.9" resolved "https://registry.npmjs.org/@types/graceful-fs/-/graceful-fs-4.1.9.tgz" @@ -918,11 +901,6 @@ "@typescript-eslint/types" "8.59.4" eslint-visitor-keys "^5.0.0" -abbrev@1: - version "1.1.1" - resolved "https://registry.npmjs.org/abbrev/-/abbrev-1.1.1.tgz" - integrity sha512-nne9/IiQ/hzIhY6pdDnbBtz7DjPTKrY00P/zvPSm5pOFkl6xuGrGnXn/VtTNNfNtAfZ9/1RtehkszU9qcTii0Q== - acorn-jsx@^5.3.2: version "5.3.2" resolved "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz" @@ -960,60 +938,23 @@ ansi-escapes@^3.0.0: resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== -ansi-escapes@^3.2.0: - version "3.2.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-3.2.0.tgz" - integrity sha512-cBhpre4ma+U0T1oM5fXg7Dy1Jw7zzwv7lt/GoCpr+hDQJoYnKVPLL4dCvSEFMmQurOQvSrwT7SL/DAlhBI97RQ== - -ansi-escapes@^4.2.1, ansi-escapes@^4.3.1: +ansi-escapes@^4.2.1: version "4.3.2" resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-4.3.2.tgz" integrity sha512-gKXj5ALrKWQLsYG9jlTRmR/xKluxHV+Z9QEwNIgCfM1/uwPMCuzVVnh5mwTd+OuBZcwSIMbqssNWRm1lE51QaQ== dependencies: type-fest "^0.21.3" -ansi-escapes@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-5.0.0.tgz" - integrity sha512-5GFMVX8HqE/TB+FuBJGuO5XG0WrsA6ptUqoODaT/n9mmUaZFkqnBueB4leqGBCmrUHnCnC4PCZTCd0E7QQ83bA== - dependencies: - type-fest "^1.0.2" - -ansi-escapes@^6.2.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-escapes/-/ansi-escapes-6.2.1.tgz" - integrity sha512-4nJ3yixlEthEJ9Rk4vPcdBRkZvQZlYyu8j4/Mqz5sgIkddmEnH2Yj2ZrnP9S3tQOvSNRUIgVNF/1yPpRAGNRig== - -ansi-regex@^2.0.0: - version "2.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-2.1.1.tgz" - integrity sha512-TIGnTpdo+E3+pCyAluZvtED5p5wCqLdezCyhPZzKPcxvFplEt4i+W7OONCKgeZFT3+y5NZZfOOS/Bdcanm1MYA== - ansi-regex@^3.0.0: version "3.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-3.0.1.tgz" integrity sha512-+O9Jct8wf++lXxxFc4hc8LsjaSq0HFzzL7cVsw8pRDIPdjKD2mT4ytDZlLuSBZ4cLKZFXIrMGO7DbQCtMJJMKw== -ansi-regex@^4.1.0: - version "4.1.1" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-4.1.1.tgz" - integrity sha512-ILlv4k/3f6vfQ4OoP2AGvirOktlQ98ZEL1k9FaQjxa3L1abBgbuTDAdPOpvbGncC0BTVQrl+OM8xZGK6tWXt7g== - ansi-regex@^5.0.1: version "5.0.1" resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz" integrity sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ== -ansi-regex@^6.0.1: - version "6.1.0" - resolved "https://registry.npmjs.org/ansi-regex/-/ansi-regex-6.1.0.tgz" - integrity sha512-7HSX4QQb4CspciLpVFwyRe79O3xsIZDDLER21kERQ71oaPodF8jL725AgJMFAYbooIqolJoRLuM81SpeUkpkvA== - -ansi-styles@^2.2.1: - version "2.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-2.2.1.tgz" - integrity sha512-kmCevFghRiWM7HB5zTPULl4r9bVFSWjz62MhqizDGUrq2NWuNMQyuv4tHHoKJHs69M/MF64lEcHdYIocrdWQYA== - ansi-styles@^3.2.1: version "3.2.1" resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-3.2.1.tgz" @@ -1033,33 +974,6 @@ ansi-styles@^5.0.0: resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-5.2.0.tgz" integrity sha512-Cxwpt2SfTzTtXcfOlzGEee8O+c+MmUgGrNiBcXnuWxuFJHe6a5Hz7qwhwe5OgaSYI0IJvkLqWX1ASG+cJOkEiA== -ansi-styles@^6.0.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -ansi-styles@^6.1.0: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -ansi-styles@^6.2.1: - version "6.2.1" - resolved "https://registry.npmjs.org/ansi-styles/-/ansi-styles-6.2.1.tgz" - integrity sha512-bN798gFfQX+viw3R7yrGWRqnrN2oRkEkUjjl4JNn4E8GxxbjtG3FbrEIIY3l8/hrwUwIeCZvi4QuOTP4MErVug== - -ansi-term@>=0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/ansi-term/-/ansi-term-0.0.2.tgz" - integrity sha512-jLnGE+n8uAjksTJxiWZf/kcUmXq+cRWSl550B9NmQ8YiqaTM+lILcSe5dHdp8QkJPhaOghDjnMKwyYSMjosgAA== - dependencies: - x256 ">=0.0.1" - -ansicolors@~0.3.2: - version "0.3.2" - resolved "https://registry.npmjs.org/ansicolors/-/ansicolors-0.3.2.tgz" - integrity sha512-QXu7BPrP29VllRxH8GwB7x5iX5qWKAAMLqKQGWTeLWVlNHNOpVMJ91dsxQAIWXpjuW5wqvxu3Jd/nRjrJ+0pqg== - anymatch@^3.0.3: version "3.1.3" resolved "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz" @@ -1205,31 +1119,6 @@ bl@^4.0.3, bl@^4.1.0: inherits "^2.0.4" readable-stream "^3.4.0" -blessed-contrib@^4.11.0: - version "4.11.0" - resolved "https://registry.npmjs.org/blessed-contrib/-/blessed-contrib-4.11.0.tgz" - integrity sha512-P00Xji3xPp53+FdU9f74WpvnOAn/SS0CKLy4vLAf5Ps7FGDOTY711ruJPZb3/7dpFuP+4i7f4a/ZTZdLlKG9WA== - dependencies: - ansi-term ">=0.0.2" - chalk "^1.1.0" - drawille-canvas-blessed-contrib ">=0.1.3" - lodash "~>=4.17.21" - map-canvas ">=0.1.5" - marked "^4.0.12" - marked-terminal "^5.1.1" - memory-streams "^0.1.0" - memorystream "^0.3.1" - picture-tuber "^1.0.1" - sparkline "^0.1.1" - strip-ansi "^3.0.0" - term-canvas "0.0.5" - x256 ">=0.0.1" - -blessed@^0.1.81: - version "0.1.81" - resolved "https://registry.npmjs.org/blessed/-/blessed-0.1.81.tgz" - integrity sha512-LoF5gae+hlmfORcG1M5+5XZi4LBmvlXTzwJWzUlPryN/SJdSflZvROM2TwkT0GMpq7oqT48NRd4GS7BiVBc5OQ== - brace-expansion@^1.1.7: version "1.1.12" resolved "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.12.tgz" @@ -1259,11 +1148,6 @@ braces@^3.0.3: dependencies: fill-range "^7.1.1" -bresenham@0.0.3: - version "0.0.3" - resolved "https://registry.npmjs.org/bresenham/-/bresenham-0.0.3.tgz" - integrity sha512-wbMxoJJM1p3+6G7xEFXYNCJ30h2qkwmVxebkbwIl4OcnWtno5R3UT9VuYLfStlVNAQCmRjkGwjPFdfaPd4iNXw== - browserslist@^4.24.0, "browserslist@>= 4.21.0": version "4.25.1" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.25.1.tgz" @@ -1301,11 +1185,6 @@ buffer@^5.5.0: base64-js "^1.3.1" ieee754 "^1.1.13" -buffers@~0.1.1: - version "0.1.1" - resolved "https://registry.npmjs.org/buffers/-/buffers-0.1.1.tgz" - integrity sha512-9q/rDEGSb/Qsvv2qvzIzdluL5k7AaJOTrw23z9reQthrbF7is4CtlT0DXyO1oei2DCp4uojjzQ7igaSHp1kAEQ== - cache-control-esm@1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/cache-control-esm/-/cache-control-esm-1.0.0.tgz" @@ -1339,25 +1218,6 @@ caniuse-lite@^1.0.30001726: resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001727.tgz" integrity sha512-pB68nIHmbN6L/4C6MH1DokyR3bYqFwjaSs/sWDHGj4CTcFtQUQMuJftVwWkXq7mNWOybD3KhUv3oWHoGxgP14Q== -cardinal@^2.1.1: - version "2.1.1" - resolved "https://registry.npmjs.org/cardinal/-/cardinal-2.1.1.tgz" - integrity sha512-JSr5eOgoEymtYHBjNWyjrMqet9Am2miJhlfKNdqLp6zoeAh0KN5dRAcxlecj5mAJrmQomgiOBj35xHLrFjqBpw== - dependencies: - ansicolors "~0.3.2" - redeyed "~2.1.0" - -chalk@^1.1.0: - version "1.1.3" - resolved "https://registry.npmjs.org/chalk/-/chalk-1.1.3.tgz" - integrity sha512-U3lRVLMSlsCfjqYPbLyVv11M9CPW4I728d6TCKMAOJueEeB9/8o+eSsMnxPJD+Q+K909sdESg7C+tIkoH6on1A== - dependencies: - ansi-styles "^2.2.1" - escape-string-regexp "^1.0.2" - has-ansi "^2.0.0" - strip-ansi "^3.0.0" - supports-color "^2.0.0" - chalk@^2.0.0, chalk@^2.3.0: version "2.4.2" resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" @@ -1367,15 +1227,6 @@ chalk@^2.0.0, chalk@^2.3.0: escape-string-regexp "^1.0.5" supports-color "^5.3.0" -chalk@^2.4.2: - version "2.4.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz" - integrity sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ== - dependencies: - ansi-styles "^3.2.1" - escape-string-regexp "^1.0.5" - supports-color "^5.3.0" - chalk@^4.0.0: version "4.1.2" resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" @@ -1408,27 +1259,6 @@ chalk@^4.1.1: ansi-styles "^4.1.0" supports-color "^7.1.0" -chalk@^4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - -chalk@^5.2.0: - version "5.4.1" - resolved "https://registry.npmjs.org/chalk/-/chalk-5.4.1.tgz" - integrity sha512-zgVZuo2WcZgfUEmsn6eO3kINexW8RAE4maiQ8QNs8CtpPCSyMiYsULR3HQYkm3w8FIA3SberyMJMSldGsW+U3w== - -chalk@4.1.2: - version "4.1.2" - resolved "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz" - integrity sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA== - dependencies: - ansi-styles "^4.1.0" - supports-color "^7.1.0" - char-regex@^1.0.2: version "1.0.2" resolved "https://registry.npmjs.org/char-regex/-/char-regex-1.0.2.tgz" @@ -1449,11 +1279,6 @@ charenc@0.0.2: resolved "https://registry.npmjs.org/charenc/-/charenc-0.0.2.tgz" integrity sha512-yrLQ/yVUFXkzg7EDQsPieE/53+0RlaWTs+wBrvW36cyilJ2SaDWfl4Yj7MtLTXleV9uEKefbAGUPv2/iWSooRA== -charm@~0.1.0: - version "0.1.2" - resolved "https://registry.npmjs.org/charm/-/charm-0.1.2.tgz" - integrity sha512-syedaZ9cPe7r3hoQA9twWYKu5AIyCswN5+szkmPBe9ccdLrj4bYaCnLVPTLd2kgVRc7+zoX4tyPgRnFKCj5YjQ== - chownr@^1.1.1: version "1.1.4" resolved "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz" @@ -1483,13 +1308,6 @@ cli-cursor@^3.1.0: dependencies: restore-cursor "^3.1.0" -cli-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/cli-cursor/-/cli-cursor-4.0.0.tgz" - integrity sha512-VGtlMu3x/4DOtIUwEkRezxUZ2lBacNJCHash0N0WeZDBS+7Ux1dm3XWAgWYxLJFMMdOeXMHXorshEFhbMSGelg== - dependencies: - restore-cursor "^4.0.0" - cli-progress@^3.11.2: version "3.12.0" resolved "https://registry.npmjs.org/cli-progress/-/cli-progress-3.12.0.tgz" @@ -1502,15 +1320,6 @@ cli-spinners@^2.5.0: resolved "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz" integrity sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg== -cli-table3@^0.6.3: - version "0.6.5" - resolved "https://registry.npmjs.org/cli-table3/-/cli-table3-0.6.5.tgz" - integrity sha512-+W/5efTR7y5HRD7gACw9yQjqMVvEMLBHmboM/kPWam+H+Hmyrgjh6YncVKK122YZkXrLudzTuAukUw9FnMf7IQ== - dependencies: - string-width "^4.2.0" - optionalDependencies: - "@colors/colors" "1.5.0" - cli-width@^2.0.0: version "2.2.1" resolved "https://registry.npmjs.org/cli-width/-/cli-width-2.2.1.tgz" @@ -1586,11 +1395,6 @@ convert-source-map@^2.0.0: resolved "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz" integrity sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg== -core-util-is@~1.0.0: - version "1.0.3" - resolved "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz" - integrity sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ== - create-jest@^29.7.0: version "29.7.0" resolved "https://registry.npmjs.org/create-jest/-/create-jest-29.7.0.tgz" @@ -1699,27 +1503,11 @@ diff@^4.0.1: resolved "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz" integrity sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A== -dotenv@^8.2.0: +dotenv@^8.2.0, dotenv@^8.6.0: version "8.6.0" resolved "https://registry.npmjs.org/dotenv/-/dotenv-8.6.0.tgz" integrity sha512-IrPdXQsk2BbzvCBGBOTmmSH5SodmqZNt4ERAZDmW4CT+tL8VtvinqywuANaFu4bOMWki16nqf0e4oC0QIaDr/g== -drawille-blessed-contrib@>=0.0.1: - version "1.0.0" - resolved "https://registry.npmjs.org/drawille-blessed-contrib/-/drawille-blessed-contrib-1.0.0.tgz" - integrity sha512-WnHMgf5en/hVOsFhxLI8ZX0qTJmerOsVjIMQmn4cR1eI8nLGu+L7w5ENbul+lZ6w827A3JakCuernES5xbHLzQ== - -drawille-canvas-blessed-contrib@>=0.0.1, drawille-canvas-blessed-contrib@>=0.1.3: - version "0.1.3" - resolved "https://registry.npmjs.org/drawille-canvas-blessed-contrib/-/drawille-canvas-blessed-contrib-0.1.3.tgz" - integrity sha512-bdDvVJOxlrEoPLifGDPaxIzFh3cD7QH05ePoQ4fwnqfi08ZSxzEhOUpI5Z0/SQMlWgcCQOEtuw0zrwezacXglw== - dependencies: - ansi-term ">=0.0.2" - bresenham "0.0.3" - drawille-blessed-contrib ">=0.0.1" - gl-matrix "^2.1.0" - x256 ">=0.0.1" - dunder-proto@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/dunder-proto/-/dunder-proto-1.0.1.tgz" @@ -1729,11 +1517,6 @@ dunder-proto@^1.0.1: es-errors "^1.3.0" gopd "^1.2.0" -eastasianwidth@^0.2.0: - version "0.2.0" - resolved "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz" - integrity sha512-I88TYZWc9XiYHRQ4/3c5rjjfgkjhLyW2luGIheGERbNQ6OY7yTybanSpDXZa8y7VUP9YmDcYa+eyq4ca7iLqWA== - ejs@^3.1.10: version "3.1.10" resolved "https://registry.npmjs.org/ejs/-/ejs-3.1.10.tgz" @@ -1751,21 +1534,11 @@ emittery@^0.13.1: resolved "https://registry.npmjs.org/emittery/-/emittery-0.13.1.tgz" integrity sha512-DeWwawk6r5yR9jFgnDKYt4sLS0LmHJJi3ZOnb5/JdbYwj3nW+FxQnHIjhBKz8YLC7oRNPVM9NQ47I3CVx34eqQ== -emoji-regex@^10.3.0: - version "10.4.0" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-10.4.0.tgz" - integrity sha512-EC+0oUMY1Rqm4O6LLrgjtYDvcVYTy7chDnM4Q7030tP4Kwj3u/pR6gP9ygnp2CJMK5Gq+9Q2oqmrFJAz01DXjw== - emoji-regex@^8.0.0: version "8.0.0" resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz" integrity sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A== -emoji-regex@^9.2.2: - version "9.2.2" - resolved "https://registry.npmjs.org/emoji-regex/-/emoji-regex-9.2.2.tgz" - integrity sha512-L18DaJsXSUk2+42pv8mLs5jJT2hqFkFE4j21wOmgbUqsZ2hL72NsUU785g9RXgo3s0ZNgVl42TiHp3ZtOv/Vyg== - end-of-stream@^1.1.0, end-of-stream@^1.4.1: version "1.4.5" resolved "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.5.tgz" @@ -1812,7 +1585,7 @@ escalade@^3.1.1, escalade@^3.2.0: resolved "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz" integrity sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA== -escape-string-regexp@^1.0.2, escape-string-regexp@^1.0.5: +escape-string-regexp@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz" integrity sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg== @@ -1899,7 +1672,7 @@ espree@^10.0.1, espree@^10.4.0: acorn-jsx "^5.3.2" eslint-visitor-keys "^4.2.1" -esprima@^4.0.0, esprima@~4.0.0: +esprima@^4.0.0: version "4.0.1" resolved "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz" integrity sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A== @@ -1928,13 +1701,6 @@ esutils@^2.0.2: resolved "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz" integrity sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g== -event-stream@~0.9.8: - version "0.9.8" - resolved "https://registry.npmjs.org/event-stream/-/event-stream-0.9.8.tgz" - integrity sha512-o5h0Mp1bkoR6B0i7pTCAzRy+VzdsRWH997KQD4Psb0EOPoKEIiaRx/EsOdUl7p1Ktjw7aIWvweI/OY1R9XrlUg== - dependencies: - optimist "0.2" - execa@^5.0.0: version "5.1.1" resolved "https://registry.npmjs.org/execa/-/execa-5.1.1.tgz" @@ -2023,7 +1789,7 @@ figures@^2.0.0: dependencies: escape-string-regexp "^1.0.5" -figures@^3.0.0, figures@^3.2.0: +figures@^3.0.0: version "3.2.0" resolved "https://registry.npmjs.org/figures/-/figures-3.2.0.tgz" integrity sha512-yaduQFRKLXYOGgEn6AZau90j3ggSOyiqXU0F9JZfeXYhNa+Jk4X+s45A2zg5jns87GAFa34BBm2kXw4XpNcbdg== @@ -2126,11 +1892,6 @@ get-caller-file@^2.0.5: resolved "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz" integrity sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg== -get-east-asian-width@^1.0.0: - version "1.3.0" - resolved "https://registry.npmjs.org/get-east-asian-width/-/get-east-asian-width-1.3.0.tgz" - integrity sha512-vpeMIQKxczTD/0s2CdEWHcb0eeJe6TFjxb+J5xgX7hScxqrGuyjmv4c1D4A/gelKfyox0gJJwIHF+fLjeaM8kQ== - get-intrinsic@^1.2.6: version "1.3.0" resolved "https://registry.npmjs.org/get-intrinsic/-/get-intrinsic-1.3.0.tgz" @@ -2170,11 +1931,6 @@ github-from-package@0.0.0: resolved "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz" integrity sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw== -gl-matrix@^2.1.0: - version "2.8.1" - resolved "https://registry.npmjs.org/gl-matrix/-/gl-matrix-2.8.1.tgz" - integrity sha512-0YCjVpE3pS5XWlN3J4X7AiAx65+nqAI54LndtVFnQZB6G/FVLkZH8y8V6R3cIoOQR4pUdfwQGd1iwyoXHJ4Qfw== - glob-parent@^6.0.2: version "6.0.2" resolved "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz" @@ -2209,13 +1965,6 @@ graceful-fs@^4.2.4, graceful-fs@^4.2.9: resolved "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz" integrity sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ== -has-ansi@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/has-ansi/-/has-ansi-2.0.0.tgz" - integrity sha512-C8vBJ8DwUCx19vhm7urhTuUsr4/IyP6l4VzNQDv+ryHQObW3TTTp9yB68WpYgRe2bbaGuZ/se74IqFeVnMnLZg== - dependencies: - ansi-regex "^2.0.0" - has-flag@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz" @@ -2245,11 +1994,6 @@ hasown@^2.0.2: dependencies: function-bind "^1.1.2" -here@0.0.2: - version "0.0.2" - resolved "https://registry.npmjs.org/here/-/here-0.0.2.tgz" - integrity sha512-U7VYImCTcPoY27TSmzoiFsmWLEqQFaYNdpsPb9K0dXJhE6kufUqycaz51oR09CW85dDU9iWyy7At8M+p7hb3NQ== - html-escaper@^2.0.0: version "2.0.2" resolved "https://registry.npmjs.org/html-escaper/-/html-escaper-2.0.2.tgz" @@ -2311,7 +2055,7 @@ inflight@^1.0.4: once "^1.3.0" wrappy "1" -inherits@^2.0.3, inherits@^2.0.4, inherits@~2.0.1, inherits@2: +inherits@^2.0.3, inherits@^2.0.4, inherits@2: version "2.0.4" resolved "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz" integrity sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ== @@ -2321,49 +2065,6 @@ ini@~1.3.0: resolved "https://registry.npmjs.org/ini/-/ini-1.3.8.tgz" integrity sha512-JV/yugV2uzW5iMRSiZAyDtQd+nxtUnjeLt0acNdw98kKLrvuRVyB80tsREOE7yvGVgalhZ6RNXCmEHkUKBKxew== -inquirer-autocomplete-prompt@^1.0.2: - version "1.4.0" - resolved "https://registry.npmjs.org/inquirer-autocomplete-prompt/-/inquirer-autocomplete-prompt-1.4.0.tgz" - integrity sha512-qHgHyJmbULt4hI+kCmwX92MnSxDs/Yhdt4wPA30qnoa01OF6uTXV8yvH4hKXgdaTNmkZ9D01MHjqKYEuJN+ONw== - dependencies: - ansi-escapes "^4.3.1" - chalk "^4.0.0" - figures "^3.2.0" - run-async "^2.4.0" - rxjs "^6.6.2" - -inquirer-checkbox-plus-prompt@^1.4.2: - version "1.4.2" - resolved "https://registry.npmjs.org/inquirer-checkbox-plus-prompt/-/inquirer-checkbox-plus-prompt-1.4.2.tgz" - integrity sha512-W8/NL9x5A81Oq9ZfbYW5c1LuwtAhc/oB/u9YZZejna0pqrajj27XhnUHygJV0Vn5TvcDy1VJcD2Ld9kTk40dvg== - dependencies: - chalk "4.1.2" - cli-cursor "^3.1.0" - figures "^3.0.0" - lodash "^4.17.5" - rxjs "^6.6.7" - -inquirer-fs-selector@^1.5.0: - version "1.5.0" - resolved "https://registry.npmjs.org/inquirer-fs-selector/-/inquirer-fs-selector-1.5.0.tgz" - integrity sha512-mteT9/8cYqv6QvoZQXRLIkzONe7tFPl1AFo/Tg3SpYk1scCVfJay/yqRR/kgLKLr23vuSYoq/MuF5GThmNxciQ== - dependencies: - chalk "^4.1.2" - cli-cursor "^3.1.0" - figures "^3.2.0" - rx-lite "^4.0.8" - -inquirer-fuzzy-path@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/inquirer-fuzzy-path/-/inquirer-fuzzy-path-2.3.0.tgz" - integrity sha512-zfHC/97GSkxKKM7IctZM22x1sVi+FYBh9oaHTmI7Er/GKFpNykUgtviTmqqpiFQs5yJoSowxbT0PHy6N+H+QRg== - dependencies: - ansi-styles "^3.2.1" - fuzzy "^0.1.3" - inquirer "^6.0.0" - inquirer-autocomplete-prompt "^1.0.2" - strip-ansi "^4.0.0" - inquirer-search-list@^1.2.6: version "1.2.6" resolved "https://registry.npmjs.org/inquirer-search-list/-/inquirer-search-list-1.2.6.tgz" @@ -2394,7 +2095,7 @@ inquirer@^3.3.0: strip-ansi "^4.0.0" through "^2.3.6" -"inquirer@^5.0.0 || ^6.0.0 || ^7.0.0 || ^8.0.0", inquirer@^8.0.0, "inquirer@< 9.x", "inquirer@>=5 <=8": +inquirer@^8.0.0: version "8.2.6" resolved "https://registry.npmjs.org/inquirer/-/inquirer-8.2.6.tgz" integrity sha512-M1WuAmb7pn9zdFRtQYk26ZBoY043Sse0wVDdk4Bppr+JOXyQYybdtvK+l9wUibhtjdjvtoiNy8tk+EgsYIUqKg== @@ -2415,25 +2116,6 @@ inquirer@^3.3.0: through "^2.3.6" wrap-ansi "^6.0.1" -inquirer@^6.0.0: - version "6.5.2" - resolved "https://registry.npmjs.org/inquirer/-/inquirer-6.5.2.tgz" - integrity sha512-cntlB5ghuB0iuO65Ovoi8ogLHiWGs/5yNrtUcKjFhSSiVeAIVpD7koaSU9RM8mpXw5YDi9RdYXGQMaOURB7ycQ== - dependencies: - ansi-escapes "^3.2.0" - chalk "^2.4.2" - cli-cursor "^2.1.0" - cli-width "^2.0.0" - external-editor "^3.0.3" - figures "^2.0.0" - lodash "^4.17.12" - mute-stream "0.0.7" - run-async "^2.2.0" - rxjs "^6.4.0" - string-width "^2.1.0" - strip-ansi "^5.1.0" - through "^2.3.6" - is-arrayish@^0.2.1: version "0.2.1" resolved "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz" @@ -2471,11 +2153,6 @@ is-fullwidth-code-point@^3.0.0: resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-3.0.0.tgz" integrity sha512-zymm5+u+sCsSWyD9qNaejV3DFvhCKclKdizYaJUuHA83RLjb7nSuGnddCHGv0hk+KY7BMAlsWeK4Ueg6EV6XQg== -is-fullwidth-code-point@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/is-fullwidth-code-point/-/is-fullwidth-code-point-4.0.0.tgz" - integrity sha512-O4L094N2/dZ7xqVdrXhh9r1KODPJpFms8B5sGdJLPy664AgvXsreZUyCQQNItZRDlYug4xStLjNp/sz3HvBowQ== - is-generator-fn@^2.0.0: version "2.1.0" resolved "https://registry.npmjs.org/is-generator-fn/-/is-generator-fn-2.1.0.tgz" @@ -2515,11 +2192,6 @@ is-wsl@^2.2.0: dependencies: is-docker "^2.0.0" -isarray@0.0.1: - version "0.0.1" - resolved "https://registry.npmjs.org/isarray/-/isarray-0.0.1.tgz" - integrity sha512-D2S+3GLxWH+uhrNEcoh/fnmYeP8E8/zHl644d/jdA0g2uyXvy3sb0qxotE+ne0LtccHknQzWwZEzhak7oJ0COQ== - isexe@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz" @@ -3058,7 +2730,7 @@ lodash.merge@^4.6.2: resolved "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz" integrity sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ== -lodash@^4.17.12, lodash@^4.17.21, lodash@^4.17.5, lodash@^4.3.0, lodash@~>=4.17.21: +lodash@^4.17.21, lodash@^4.3.0: version "4.17.21" resolved "https://registry.npmjs.org/lodash/-/lodash-4.17.21.tgz" integrity sha512-v2kDEe57lecTulaDIuNTPy3Ry4gLGJ6Z1O3vE1krgXZNrsQ+LFTGHVxVjcXPs17LhbZVGedAJv8XZ1tvj5FvSg== @@ -3071,17 +2743,6 @@ log-symbols@^4.1.0: chalk "^4.1.0" is-unicode-supported "^0.1.0" -log-update@^5.0.1: - version "5.0.1" - resolved "https://registry.npmjs.org/log-update/-/log-update-5.0.1.tgz" - integrity sha512-5UtUDQ/6edw4ofyljDNcOVJQ4c7OjDro4h3y8e1GQL5iYElYclVHJ3zeWchylvMaKnDbDilC8irOVyexnA/Slw== - dependencies: - ansi-escapes "^5.0.0" - cli-cursor "^4.0.0" - slice-ansi "^5.0.0" - strip-ansi "^7.0.1" - wrap-ansi "^8.0.1" - lru-cache@^5.1.1: version "5.1.1" resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz" @@ -3108,31 +2769,6 @@ makeerror@1.0.12: dependencies: tmpl "1.0.5" -map-canvas@>=0.1.5: - version "0.1.5" - resolved "https://registry.npmjs.org/map-canvas/-/map-canvas-0.1.5.tgz" - integrity sha512-f7M3sOuL9+up0NCOZbb1rQpWDLZwR/ftCiNbyscjl9LUUEwrRaoumH4sz6swgs58lF21DQ0hsYOCw5C6Zz7hbg== - dependencies: - drawille-canvas-blessed-contrib ">=0.0.1" - xml2js "^0.4.5" - -marked-terminal@^5.1.1: - version "5.2.0" - resolved "https://registry.npmjs.org/marked-terminal/-/marked-terminal-5.2.0.tgz" - integrity sha512-Piv6yNwAQXGFjZSaiNljyNFw7jKDdGrw70FSbtxEyldLsyeuV5ZHm/1wW++kWbrOF1VPnUgYOhB2oLL0ZpnekA== - dependencies: - ansi-escapes "^6.2.0" - cardinal "^2.1.1" - chalk "^5.2.0" - cli-table3 "^0.6.3" - node-emoji "^1.11.0" - supports-hyperlinks "^2.3.0" - -"marked@^1.0.0 || ^2.0.0 || ^3.0.0 || ^4.0.0 || ^5.0.0", marked@^4.0.12: - version "4.3.0" - resolved "https://registry.npmjs.org/marked/-/marked-4.3.0.tgz" - integrity sha512-PRsaiG84bK+AMvxziE/lCFss8juXjNaWzVbN5tXAm4XjeaS9NAHhop+PjQxz2A9h8Q4M/xGmzP8vqNwy6JeK0A== - math-intrinsics@^1.1.0: version "1.1.0" resolved "https://registry.npmjs.org/math-intrinsics/-/math-intrinsics-1.1.0.tgz" @@ -3147,18 +2783,6 @@ md5@^2.2.1: crypt "0.0.2" is-buffer "~1.1.6" -memory-streams@^0.1.0: - version "0.1.3" - resolved "https://registry.npmjs.org/memory-streams/-/memory-streams-0.1.3.tgz" - integrity sha512-qVQ/CjkMyMInPaaRMrwWNDvf6boRZXaT/DbQeMYcCWuXPEBf1v8qChOc9OlEVQp2uOvRXa1Qu30fLmKhY6NipA== - dependencies: - readable-stream "~1.0.2" - -memorystream@^0.3.1: - version "0.3.1" - resolved "https://registry.npmjs.org/memorystream/-/memorystream-0.3.1.tgz" - integrity sha512-S3UwM3yj5mtUSEfP41UZmt/0SCoVYUcU1rkXv+BQ5Ig8ndL4sPoJNBUJERafdPb5jjHJGuMgytgKvKIf58XNBw== - merge-stream@^2.0.0: version "2.0.0" resolved "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz" @@ -3267,13 +2891,6 @@ node-addon-api@^4.3.0: resolved "https://registry.npmjs.org/node-addon-api/-/node-addon-api-4.3.0.tgz" integrity sha512-73sE9+3UaLYYFmDsFZnqCInzPyh3MqIwZO9cw58yIqAZhONrrabrYyYe3TuIqtIiOuTXVhsGau8hcrhhwSsDIQ== -node-emoji@^1.11.0: - version "1.11.0" - resolved "https://registry.npmjs.org/node-emoji/-/node-emoji-1.11.0.tgz" - integrity sha512-wo2DpQkQp7Sjm2A0cq+sN7EHKO6Sl0ctXeBdFZrL9T9+UywORbufTcTZxom8YqpLQt/FqNMUkOpkZrJVYSKD3A== - dependencies: - lodash "^4.17.21" - node-int64@^0.4.0: version "0.4.0" resolved "https://registry.npmjs.org/node-int64/-/node-int64-0.4.0.tgz" @@ -3284,13 +2901,6 @@ node-releases@^2.0.19: resolved "https://registry.npmjs.org/node-releases/-/node-releases-2.0.19.tgz" integrity sha512-xxOWJsBKtzAq7DY0J+DTzuz58K8e7sJbdgwkbMWQe8UYB6ekmsQ45q0M/tJDsGaZmbC+l7n57UV8Hl5tHxO9uw== -nopt@~2.1.2: - version "2.1.2" - resolved "https://registry.npmjs.org/nopt/-/nopt-2.1.2.tgz" - integrity sha512-x8vXm7BZ2jE1Txrxh/hO74HTuYZQEbo8edoRcANgdZ4+PCV+pbjd/xdummkmjjC7LU5EjPzlu8zEq/oxWylnKA== - dependencies: - abbrev "1" - normalize-path@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz" @@ -3333,20 +2943,6 @@ open@^8.4.0: is-docker "^2.1.1" is-wsl "^2.2.0" -optimist@~0.3.4: - version "0.3.7" - resolved "https://registry.npmjs.org/optimist/-/optimist-0.3.7.tgz" - integrity sha512-TCx0dXQzVtSCg2OgY/bO9hjM9cV4XYx09TVK+s3+FhkjT6LovsLe+pPMzpWf+6yXK/hUizs2gUoTw3jHM0VaTQ== - dependencies: - wordwrap "~0.0.2" - -optimist@0.2: - version "0.2.8" - resolved "https://registry.npmjs.org/optimist/-/optimist-0.2.8.tgz" - integrity sha512-Wy7E3cQDpqsTIFyW7m22hSevyTLxw850ahYv7FWsw4G6MIKVTZ8NSA95KBrQ95a4SMsMr1UGUUnwEFKhVaSzIg== - dependencies: - wordwrap ">=0.0.1 <0.1.0" - optionator@^0.9.3: version "0.9.4" resolved "https://registry.npmjs.org/optionator/-/optionator-0.9.4.tgz" @@ -3464,18 +3060,6 @@ picomatch@^2.0.4, picomatch@^2.2.3, picomatch@^2.3.1: resolved "https://registry.npmjs.org/picomatch/-/picomatch-4.0.4.tgz" integrity sha512-QP88BAKvMam/3NxH6vj2o21R6MjxZUAd6nlwAS/pnGvN9IVLocLHxGYIzFhg6fUQ+5th6P4dv4eW9jX3DSIj7A== -picture-tuber@^1.0.1: - version "1.0.2" - resolved "https://registry.npmjs.org/picture-tuber/-/picture-tuber-1.0.2.tgz" - integrity sha512-49/xq+wzbwDeI32aPvwQJldM8pr7dKDRuR76IjztrkmiCkAQDaWFJzkmfVqCHmt/iFoPFhHmI9L0oKhthrTOQw== - dependencies: - buffers "~0.1.1" - charm "~0.1.0" - event-stream "~0.9.8" - optimist "~0.3.4" - png-js "~0.1.0" - x256 "~0.0.1" - pirates@^4.0.4: version "4.0.7" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.7.tgz" @@ -3488,11 +3072,6 @@ pkg-dir@^4.2.0: dependencies: find-up "^4.0.0" -png-js@~0.1.0: - version "0.1.1" - resolved "https://registry.npmjs.org/png-js/-/png-js-0.1.1.tgz" - integrity sha512-NTtk2SyfjBm+xYl2/VZJBhFnTQ4kU5qWC7VC4/iGbrgiU4FuB4xC+74erxADYJIqZICOR1HCvRA7EBHkpjTg9g== - prebuild-install@^7.0.1: version "7.1.3" resolved "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.3.tgz" @@ -3598,23 +3177,6 @@ readable-stream@^3.4.0: string_decoder "^1.1.1" util-deprecate "^1.0.1" -readable-stream@~1.0.2: - version "1.0.34" - resolved "https://registry.npmjs.org/readable-stream/-/readable-stream-1.0.34.tgz" - integrity sha512-ok1qVCJuRkNmvebYikljxJA/UEsKwLl2nI1OmaqAu4/UE+h0wKCHok4XkL/gvi39OacXvw59RJUOFUkDib2rHg== - dependencies: - core-util-is "~1.0.0" - inherits "~2.0.1" - isarray "0.0.1" - string_decoder "~0.10.x" - -redeyed@~2.1.0: - version "2.1.1" - resolved "https://registry.npmjs.org/redeyed/-/redeyed-2.1.1.tgz" - integrity sha512-FNpGGo1DycYAdnrKFxCMmKYgo/mILAqtRYbkdQD8Ep/Hk2PQ5+aEAEx+IU713RTDmuBaH0c8P5ZozurNu5ObRQ== - dependencies: - esprima "~4.0.0" - require-directory@^2.1.1: version "2.1.1" resolved "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz" @@ -3667,14 +3229,6 @@ restore-cursor@^3.1.0: onetime "^5.1.0" signal-exit "^3.0.2" -restore-cursor@^4.0.0: - version "4.0.0" - resolved "https://registry.npmjs.org/restore-cursor/-/restore-cursor-4.0.0.tgz" - integrity sha512-I9fPXU9geO9bHOt9pHHOhOkYerIMsmVaWB0rA2AI9ERh/+x/i7MV5HKBNrg+ljO5eoPVgCcnFuRjJ9uH6I/3eg== - dependencies: - onetime "^5.1.0" - signal-exit "^3.0.2" - retry@^0.12.0: version "0.12.0" resolved "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz" @@ -3697,7 +3251,7 @@ rx-lite@*, rx-lite@^4.0.8: resolved "https://registry.npmjs.org/rx-lite/-/rx-lite-4.0.8.tgz" integrity sha512-Cun9QucwK6MIrp3mry/Y7hqD1oFqTYLQ4pGxaHTjIdaFDWRGGLikqp6u8LcWJnzpoALg9hap+JGk8sFIUuEGNA== -rxjs@^7.8.2: +rxjs@^7.5.5, rxjs@^7.8.2: version "7.8.2" resolved "https://registry.npmjs.org/rxjs/-/rxjs-7.8.2.tgz" integrity sha512-dhKf903U/PQZY6boNNtAGdWbG85WAbjT/1xYoZIC7FAY0yWapOBQVsVrDl58W86//e1VpMNBtRV4MaXfdMySFA== @@ -3714,11 +3268,6 @@ safe-buffer@^5.0.1, safe-buffer@~5.2.0: resolved "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz" integrity sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg== -sax@>=0.6.0: - version "1.4.1" - resolved "https://registry.npmjs.org/sax/-/sax-1.4.1.tgz" - integrity sha512-+aWOz7yVScEGoKNd4PA10LZ8sk0A/z5+nXQG5giUO5rprX9jgYsTdov9qCchZiPIZezbZH+jRut8nPodFAX4Jg== - semver@^6.3.0, semver@^6.3.1: version "6.3.1" resolved "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz" @@ -3790,14 +3339,6 @@ slash@^3.0.0: resolved "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz" integrity sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q== -slice-ansi@^5.0.0: - version "5.0.0" - resolved "https://registry.npmjs.org/slice-ansi/-/slice-ansi-5.0.0.tgz" - integrity sha512-FC+lgizVPfie0kkhqUScwRu1O/lF6NOgJmlCgK+/LYxDCTk8sGelYaHDhFcDN+Sn3Cv+3VSa4Byeo+IMCzpMgQ== - dependencies: - ansi-styles "^6.0.0" - is-fullwidth-code-point "^4.0.0" - source-map-support@0.5.13: version "0.5.13" resolved "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.13.tgz" @@ -3811,14 +3352,6 @@ source-map@^0.6.0, source-map@^0.6.1: resolved "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz" integrity sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g== -sparkline@^0.1.1: - version "0.1.2" - resolved "https://registry.npmjs.org/sparkline/-/sparkline-0.1.2.tgz" - integrity sha512-t//aVOiWt9fi/e22ea1vXVWBDX+gp18y+Ch9sKqmHl828bRfvP2VtfTJVEcgWFBQHd0yDPNQRiHdqzCvbcYSDA== - dependencies: - here "0.0.2" - nopt "~2.1.2" - sprintf-js@~1.0.2: version "1.0.3" resolved "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.0.3.tgz" @@ -3838,11 +3371,6 @@ string_decoder@^1.1.1: dependencies: safe-buffer "~5.2.0" -string_decoder@~0.10.x: - version "0.10.31" - resolved "https://registry.npmjs.org/string_decoder/-/string_decoder-0.10.31.tgz" - integrity sha512-ev2QzSzWPYmy9GuqfIVildA4OdcGLeFZQrq5ys6RtiuF+RQQiZWr8TZNyAcuVXyQRYfEO+MsoB/1BuQVhOJuoQ== - string-length@^4.0.1: version "4.0.2" resolved "https://registry.npmjs.org/string-length/-/string-length-4.0.2.tgz" @@ -3868,31 +3396,6 @@ string-width@^4.1.0, string-width@^4.2.0, string-width@^4.2.3: is-fullwidth-code-point "^3.0.0" strip-ansi "^6.0.1" -string-width@^5.0.1: - version "5.1.2" - resolved "https://registry.npmjs.org/string-width/-/string-width-5.1.2.tgz" - integrity sha512-HnLOCR3vjcY8beoNLtcjZ5/nxn2afmME6lhrDrebokqMap+XbeW8n9TXpPDOqdGK5qcI3oT0GKTW6wC7EMiVqA== - dependencies: - eastasianwidth "^0.2.0" - emoji-regex "^9.2.2" - strip-ansi "^7.0.1" - -string-width@^7.0.0: - version "7.2.0" - resolved "https://registry.npmjs.org/string-width/-/string-width-7.2.0.tgz" - integrity sha512-tsaTIkKW9b4N+AEj+SVA+WhJzV7/zMhcSu78mLKWSk7cXMOSHsBKFWUs0fWwq8QyK3MgJBQRX6Gbi4kYbdvGkQ== - dependencies: - emoji-regex "^10.3.0" - get-east-asian-width "^1.0.0" - strip-ansi "^7.1.0" - -strip-ansi@^3.0.0: - version "3.0.1" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-3.0.1.tgz" - integrity sha512-VhumSSbBqDTP8p2ZLKj40UjBCV4+v8bUSEpUb4KjRgWk9pbqGF4REFj6KEagidb2f/M6AzC0EmFyDNGaw9OCzg== - dependencies: - ansi-regex "^2.0.0" - strip-ansi@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-4.0.0.tgz" @@ -3900,13 +3403,6 @@ strip-ansi@^4.0.0: dependencies: ansi-regex "^3.0.0" -strip-ansi@^5.1.0: - version "5.2.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-5.2.0.tgz" - integrity sha512-DuRs1gKbBqsMKIZlrffwlug8MHkcnpjs5VPmL1PAh+mA30U0DTotfDZ0d2UUsXpPmPmMMJ6W773MaA3J+lbiWA== - dependencies: - ansi-regex "^4.1.0" - strip-ansi@^6.0.0, strip-ansi@^6.0.1: version "6.0.1" resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz" @@ -3921,20 +3417,6 @@ strip-ansi@^6.0.1: dependencies: ansi-regex "^5.0.1" -strip-ansi@^7.0.1: - version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - -strip-ansi@^7.1.0: - version "7.1.0" - resolved "https://registry.npmjs.org/strip-ansi/-/strip-ansi-7.1.0.tgz" - integrity sha512-iq6eVVI64nQQTRYq2KtEg2d2uU7LElhTJwsH4YzIHZshxlgZms/wIc4VoDQTlG/IvVIrBKG06CrZnp0qv7hkcQ== - dependencies: - ansi-regex "^6.0.1" - strip-bom@^3.0.0: version "3.0.0" resolved "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz" @@ -3960,11 +3442,6 @@ strip-json-comments@~2.0.1: resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz" integrity sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ== -supports-color@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-2.0.0.tgz" - integrity sha512-KKNVtd6pCYgPIKU4cp2733HWYCpplQhddZLBUryaAHou723x+FRzQ5Df824Fj+IyyuiQTRoub4SnIFfIcrp70g== - supports-color@^5.3.0: version "5.5.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz" @@ -3972,13 +3449,6 @@ supports-color@^5.3.0: dependencies: has-flag "^3.0.0" -supports-color@^7.0.0: - version "7.2.0" - resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" - integrity sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw== - dependencies: - has-flag "^4.0.0" - supports-color@^7.1.0: version "7.2.0" resolved "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz" @@ -3993,14 +3463,6 @@ supports-color@^8.0.0: dependencies: has-flag "^4.0.0" -supports-hyperlinks@^2.3.0: - version "2.3.0" - resolved "https://registry.npmjs.org/supports-hyperlinks/-/supports-hyperlinks-2.3.0.tgz" - integrity sha512-RpsAZlpWcDwOPQA22aCH4J0t7L8JmAvsCxfOSEwm7cQs3LshN36QaTkwd70DnBOXDWGssw2eUoc8CaRWT0XunA== - dependencies: - has-flag "^4.0.0" - supports-color "^7.0.0" - supports-preserve-symlinks-flag@^1.0.0: version "1.0.0" resolved "https://registry.npmjs.org/supports-preserve-symlinks-flag/-/supports-preserve-symlinks-flag-1.0.0.tgz" @@ -4027,11 +3489,6 @@ tar-stream@^2.1.4: inherits "^2.0.3" readable-stream "^3.1.1" -term-canvas@0.0.5: - version "0.0.5" - resolved "https://registry.npmjs.org/term-canvas/-/term-canvas-0.0.5.tgz" - integrity sha512-eZ3rIWi5yLnKiUcsW8P79fKyooaLmyLWAGqBhFspqMxRNUiB4GmHHk5AzQ4LxvFbJILaXqQZLwbbATLOhCFwkw== - test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz" @@ -4150,11 +3607,6 @@ type-fest@^0.21.3: resolved "https://registry.npmjs.org/type-fest/-/type-fest-0.21.3.tgz" integrity sha512-t0rzBq87m3fVcduHDUFhKmyyX+9eo6WQjZvf51Ea/M0Q7+T374Jp1aUiyUl0GKxp8M/OETVHSDvmkyPgvX+X2w== -type-fest@^1.0.2: - version "1.4.0" - resolved "https://registry.npmjs.org/type-fest/-/type-fest-1.4.0.tgz" - integrity sha512-yGSza74xk0UG8k+pLh5oeoYirvIiWo5t0/o3zHHAO2tRDiZcxWP7fywNlXhqb6/r6sWvwi+RsyQMWhVLe4BVuA== - type-fest@^4.41.0: version "4.41.0" resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.41.0.tgz" @@ -4230,11 +3682,6 @@ word-wrap@^1.2.5: resolved "https://registry.npmjs.org/word-wrap/-/word-wrap-1.2.5.tgz" integrity sha512-BN22B5eaMMI9UMtjrGd5g5eCYPpCPDUy0FJXbYsaT5zYxjFOckS53SQDE3pWkVoWpHXVb3BrYcEN4Twa55B5cA== -"wordwrap@>=0.0.1 <0.1.0", wordwrap@~0.0.2: - version "0.0.3" - resolved "https://registry.npmjs.org/wordwrap/-/wordwrap-0.0.3.tgz" - integrity sha512-1tMA907+V4QmxV7dbRvb4/8MaRALK6q9Abid3ndMYnbyo8piisCmeONVqVSXqQA3KaP4SLt5b7ud6E2sqP8TFw== - wrap-ansi@^6.0.1: version "6.2.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-6.2.0.tgz" @@ -4253,24 +3700,6 @@ wrap-ansi@^7.0.0: string-width "^4.1.0" strip-ansi "^6.0.0" -wrap-ansi@^8.0.1: - version "8.1.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-8.1.0.tgz" - integrity sha512-si7QWI6zUMq56bESFvagtmzMdGOtoxfR+Sez11Mobfc7tm+VkUckk9bW2UeffTGVUbOksxmSw0AA2gs8g71NCQ== - dependencies: - ansi-styles "^6.1.0" - string-width "^5.0.1" - strip-ansi "^7.0.1" - -wrap-ansi@^9.0.0: - version "9.0.0" - resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-9.0.0.tgz" - integrity sha512-G8ura3S+3Z2G+mkgNRq8dqaFZAuxfsxpBB8OCTGRTCtp+l/v9nbFNmCUP1BZMts3G1142MsZfn6eeUKrr4PD1Q== - dependencies: - ansi-styles "^6.2.1" - string-width "^7.0.0" - strip-ansi "^7.1.0" - wrappy@1: version "1.0.2" resolved "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz" @@ -4284,24 +3713,6 @@ write-file-atomic@^4.0.2: imurmurhash "^0.1.4" signal-exit "^3.0.7" -x256@>=0.0.1, x256@~0.0.1: - version "0.0.2" - resolved "https://registry.npmjs.org/x256/-/x256-0.0.2.tgz" - integrity sha512-ZsIH+sheoF8YG9YG+QKEEIdtqpHRA9FYuD7MqhfyB1kayXU43RUNBFSxBEnF8ywSUxdg+8no4+bPr5qLbyxKgA== - -xml2js@^0.4.5: - version "0.4.23" - resolved "https://registry.npmjs.org/xml2js/-/xml2js-0.4.23.tgz" - integrity sha512-ySPiMjM0+pLDftHgXY4By0uswI3SPKLDw/i3UXbnO8M/p28zqexCUoPmQFrYD+/1BzhGJSs2i1ERWKJAtiLrug== - dependencies: - sax ">=0.6.0" - xmlbuilder "~11.0.0" - -xmlbuilder@~11.0.0: - version "11.0.1" - resolved "https://registry.npmjs.org/xmlbuilder/-/xmlbuilder-11.0.1.tgz" - integrity sha512-fDlsI/kFEx7gLvbecc0/ohLG50fugQp8ryHzMTuW9vSa1GJ0XYWKnhsUx7oie3G98+r56aTQIUB4kht42R3JvA== - y18n@^5.0.5: version "5.0.8" resolved "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz"