diff --git a/package-lock.json b/package-lock.json index 31184db..d8925a7 100644 --- a/package-lock.json +++ b/package-lock.json @@ -10,9 +10,12 @@ "dependencies": { "@adobe/aio-sdk": "^6", "cheerio": "^1.0.0", + "commander": "^13.1.0", "handlebars": "^4.7.8", "node-fetch": "^2.6.0", - "striptags": "^3.2.0" + "striptags": "^3.2.0", + "vega": "^5.30.0", + "vega-lite": "^5.23.0" }, "devDependencies": { "@eslint/js": "^9.17.0", @@ -3086,7 +3089,12 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/@types/estree/-/estree-1.0.6.tgz", "integrity": "sha512-AYnb1nQyY49te+VRAVgmzfcgjYS91mY5P0TKUDCLEM+gNnA+3T6rWITXRLYCpahpqSQbN5cE+gHpnPyXjHWxcw==", - "dev": true, + "license": "MIT" + }, + "node_modules/@types/geojson": { + "version": "7946.0.4", + "resolved": "https://registry.npmjs.org/@types/geojson/-/geojson-7946.0.4.tgz", + "integrity": "sha512-MHmwBtCb7OCv1DSivz2UNJXPGU/1btAWRKlqJ2saEhVJkpkvqHMMaOpKg0v4sAbDWSQekHGvPVMM8nQ+Jen03Q==", "license": "MIT" }, "node_modules/@types/graceful-fs": { @@ -3406,7 +3414,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3415,7 +3422,6 @@ "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", "integrity": "sha512-zbB9rCJAT1rbjiVDb2hqKFHNYLxgtk8NURxZ3IZwD3F6NtxbXZQCnnSi1Lkx+IDohdPlFp222wVALIheZJQSEg==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -4150,7 +4156,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -4205,6 +4210,15 @@ "node": ">= 0.8" } }, + "node_modules/commander": { + "version": "13.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-13.1.0.tgz", + "integrity": "sha512-/rFeCpNJQbhSZjGVwO9RFV3xPqbnERS8MmIQzCtD/zl6gpJuV/bMLuN92oG3F7d8oDEHHRrujSXNUr8fpjntKw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", @@ -4334,6 +4348,260 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/d3-array": { + "version": "3.2.4", + "resolved": "https://registry.npmjs.org/d3-array/-/d3-array-3.2.4.tgz", + "integrity": "sha512-tdQAmyA18i4J7wprpYq8ClcxZy3SC31QMeByyCFyRt7BVHdREQZ5lpzoe5mFEYZUWe+oq8HBvk9JjpibyEV4Jg==", + "license": "ISC", + "dependencies": { + "internmap": "1 - 2" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-color": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-color/-/d3-color-3.1.0.tgz", + "integrity": "sha512-zg/chbXyeBtMQ1LbD/WSoW2DpC3I0mpmPdW+ynRTj/x2DAWYrIY7qeZIHidozwV24m4iavr15lNwIwLxRmOxhA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-delaunay": { + "version": "6.0.4", + "resolved": "https://registry.npmjs.org/d3-delaunay/-/d3-delaunay-6.0.4.tgz", + "integrity": "sha512-mdjtIZ1XLAM8bm/hx3WwjfHt6Sggek7qH043O8KEjDXN40xi3vx/6pYSVTwLjEgiXQTbvaouWKynLBiUZ6SK6A==", + "license": "ISC", + "dependencies": { + "delaunator": "5" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dispatch": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dispatch/-/d3-dispatch-3.0.1.tgz", + "integrity": "sha512-rzUyPU/S7rwUflMyLc1ETDeBj0NRuHKKAcvukozwhshr6g6c5d8zh4c2gQjY2bZ0dXeGLWc1PF174P2tVvKhfg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-dsv/-/d3-dsv-3.0.1.tgz", + "integrity": "sha512-UG6OvdI5afDIFP9w4G0mNq50dSOsXHJaRE8arAS5o9ApWnIElp8GZw1Dun8vP8OyHOZ/QJUKUJwxiiCCnUwm+Q==", + "license": "ISC", + "dependencies": { + "commander": "7", + "iconv-lite": "0.6", + "rw": "1" + }, + "bin": { + "csv2json": "bin/dsv2json.js", + "csv2tsv": "bin/dsv2dsv.js", + "dsv2dsv": "bin/dsv2dsv.js", + "dsv2json": "bin/dsv2json.js", + "json2csv": "bin/json2dsv.js", + "json2dsv": "bin/json2dsv.js", + "json2tsv": "bin/json2dsv.js", + "tsv2csv": "bin/dsv2dsv.js", + "tsv2json": "bin/dsv2json.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-dsv/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-force": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/d3-force/-/d3-force-3.0.0.tgz", + "integrity": "sha512-zxV/SsA+U4yte8051P4ECydjD/S+qeYtnaIyAs9tgHCqfguma/aAQDjo85A9Z6EKhBirHRJHXIgJUlffT4wdLg==", + "license": "ISC", + "dependencies": { + "d3-dispatch": "1 - 3", + "d3-quadtree": "1 - 3", + "d3-timer": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-format": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-format/-/d3-format-3.1.0.tgz", + "integrity": "sha512-YyUI6AEuY/Wpt8KWLgZHsIU86atmikuoOmCfommt0LYHiQSPjvX2AcFc38PX0CBpr2RCyZhjex+NS/LPOv6YqA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/d3-geo/-/d3-geo-3.1.1.tgz", + "integrity": "sha512-637ln3gXKXOwhalDzinUgY83KzNWZRKbYubaG+fGVuc/dxO64RRljtCTnf5ecMyE1RIdtqpkVcq0IbtU2S8j2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2.5.0 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-projection": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/d3-geo-projection/-/d3-geo-projection-4.0.0.tgz", + "integrity": "sha512-p0bK60CEzph1iqmnxut7d/1kyTmm3UWtPlwdkM31AU+LW+BXazd5zJdoCn7VFxNCHXRngPHRnsNn5uGjLRGndg==", + "license": "ISC", + "dependencies": { + "commander": "7", + "d3-array": "1 - 3", + "d3-geo": "1.12.0 - 3" + }, + "bin": { + "geo2svg": "bin/geo2svg.js", + "geograticule": "bin/geograticule.js", + "geoproject": "bin/geoproject.js", + "geoquantize": "bin/geoquantize.js", + "geostitch": "bin/geostitch.js" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-geo-projection/node_modules/commander": { + "version": "7.2.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-7.2.0.tgz", + "integrity": "sha512-QrWXB+ZQSVPmIWIhtEO9H+gwHaMGYiF5ChvoJ+K9ZGHG/sVsa6yiesAD1GC/x46sET00Xlwo1u49RVVVzvcSkw==", + "license": "MIT", + "engines": { + "node": ">= 10" + } + }, + "node_modules/d3-hierarchy": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/d3-hierarchy/-/d3-hierarchy-3.1.2.tgz", + "integrity": "sha512-FX/9frcub54beBdugHjDCdikxThEqjnR93Qt7PvQTOHxyiNCAlvMrHhclk3cD5VeAaq9fxmfRp+CnWw9rEMBuA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-interpolate": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-interpolate/-/d3-interpolate-3.0.1.tgz", + "integrity": "sha512-3bYs1rOD33uo8aqJfKP3JWPAibgw8Zm2+L9vBKEHJ2Rg+viTR7o5Mmv5mZcieN+FRYaAOWX5SJATX6k1PWz72g==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-path": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-path/-/d3-path-3.1.0.tgz", + "integrity": "sha512-p3KP5HCf/bvjBSSKuXid6Zqijx7wIfNW+J/maPs+iwR35at5JCbLUT0LzF1cnjbCHWhqzQTIN2Jpe8pRebIEFQ==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-quadtree": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-quadtree/-/d3-quadtree-3.0.1.tgz", + "integrity": "sha512-04xDrxQTDTCFwP5H6hRhsRcb9xxv2RzkcsygFzmkSIOJy3PeRJP7sNk3VRIbKXcog561P9oU0/rVH6vDROAgUw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/d3-scale/-/d3-scale-4.0.2.tgz", + "integrity": "sha512-GZW464g1SH7ag3Y7hXjf8RoUuAFIqklOAq3MRl4OaWabTFJY9PN/E1YklhXLh+OQ3fM9yS2nOkCoS+WLZ6kvxQ==", + "license": "ISC", + "dependencies": { + "d3-array": "2.10.0 - 3", + "d3-format": "1 - 3", + "d3-interpolate": "1.2.0 - 3", + "d3-time": "2.1.1 - 3", + "d3-time-format": "2 - 4" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-scale-chromatic": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-scale-chromatic/-/d3-scale-chromatic-3.1.0.tgz", + "integrity": "sha512-A3s5PWiZ9YCXFye1o246KoscMWqf8BsD9eRiJ3He7C9OBaxKhAd5TFCdEx/7VbKtxxTsu//1mMJFrEt572cEyQ==", + "license": "ISC", + "dependencies": { + "d3-color": "1 - 3", + "d3-interpolate": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-shape": { + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/d3-shape/-/d3-shape-3.2.0.tgz", + "integrity": "sha512-SaLBuwGm3MOViRq2ABk3eLoxwZELpH6zhl3FbAoJ7Vm1gofKx6El1Ib5z23NUEhF9AsGl7y+dzLe5Cw2AArGTA==", + "license": "ISC", + "dependencies": { + "d3-path": "^3.1.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/d3-time/-/d3-time-3.1.0.tgz", + "integrity": "sha512-VqKjzBLejbSMT4IgbmVgDjpkYrNWUYJnbCGo874u7MMKIWsILRX+OpX/gTk8MqjpT1A/c6HY2dCA77ZN0lkQ2Q==", + "license": "ISC", + "dependencies": { + "d3-array": "2 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-time-format": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/d3-time-format/-/d3-time-format-4.1.0.tgz", + "integrity": "sha512-dJxPBlzC7NugB2PDLwo9Q8JiTR3M3e4/XANkreKSUxF8vvXKqm1Yfq4Q5dl8budlunRVlUUaDUgFt7eA8D6NLg==", + "license": "ISC", + "dependencies": { + "d3-time": "1 - 3" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/d3-timer": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/d3-timer/-/d3-timer-3.0.1.tgz", + "integrity": "sha512-ndfJ/JxxMd3nw31uyKoY2naivF+r29V+Lc0svZxe1JvvIRmi8hUsrMvdOwgS1o6uBHmiz91geQ0ylPP0aj1VUA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/data-view-buffer": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/data-view-buffer/-/data-view-buffer-1.0.2.tgz", @@ -4512,6 +4780,15 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/delaunator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/delaunator/-/delaunator-5.0.1.tgz", + "integrity": "sha512-8nvh+XBe96aCESrGOqMp/84b13H9cdKbG5P2ejQCh4d4sK9RL4371qou9drQjMhvnPmhWl5hnmqbEE0fXr9Xnw==", + "license": "ISC", + "dependencies": { + "robust-predicates": "^3.0.2" + } + }, "node_modules/delayed-stream": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/delayed-stream/-/delayed-stream-1.0.0.tgz", @@ -4681,8 +4958,7 @@ "node_modules/emoji-regex": { "version": "8.0.0", "resolved": "https://registry.npmjs.org/emoji-regex/-/emoji-regex-8.0.0.tgz", - "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==", - "dev": true + "integrity": "sha512-MSjYzcWNOA0ewAHpz0MxpYFvwg6yjy1NG3xteoqz644VCo/RPgnr1/GGt+ic3iJTzQ8Eu3TdM14SawnVUmGE6A==" }, "node_modules/enabled": { "version": "2.0.0", @@ -4861,7 +5137,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.2.0.tgz", "integrity": "sha512-WUj2qlxaQtO4g6Pq5c29GTcWGDyd8itL8zTlipgECz3JesAiiOKotd8JU6otB3PACgG6xkJUyVhboMS+bje/jA==", - "dev": true, "engines": { "node": ">=6" } @@ -5515,7 +5790,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", - "dev": true, "engines": { "node": "6.* || 8.* || >= 10.*" } @@ -6003,6 +6277,15 @@ "node": ">= 0.4" } }, + "node_modules/internmap": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/internmap/-/internmap-2.0.3.tgz", + "integrity": "sha512-5Hh7Y1wQbvY5ooGgPbDaL5iYLAPzMTUrjMulskHLH6wnv/A+1q5rgEaiuqEjB+oxGXIVZs1FF+R/KPN3ZSQYYg==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, "node_modules/is-array-buffer": { "version": "3.0.5", "resolved": "https://registry.npmjs.org/is-array-buffer/-/is-array-buffer-3.0.5.tgz", @@ -6167,7 +6450,6 @@ "version": "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==", - "dev": true, "engines": { "node": ">=8" } @@ -7184,6 +7466,12 @@ "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", "dev": true }, + "node_modules/json-stringify-pretty-compact": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/json-stringify-pretty-compact/-/json-stringify-pretty-compact-4.0.0.tgz", + "integrity": "sha512-3CNZ2DnrpByG9Nqj6Xo8vqbjT4F6N+tb4Gb28ESAZjYZ5yqvmc56J+/kuIwkaAMOyblTQhUW7PxMkUb8Q36N3Q==", + "license": "MIT" + }, "node_modules/json5": { "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", @@ -8691,7 +8979,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/require-directory/-/require-directory-2.1.1.tgz", "integrity": "sha512-fGxEI7+wsG9xrvdjsrlmL22OMTTiHRwAMroiEeMgq8gzoLC/PQr7RsRDSTLUg/bZAZtF+TVIkHc6/4RIKrui+Q==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -8807,6 +9094,12 @@ "node": ">=0.10.0" } }, + "node_modules/robust-predicates": { + "version": "3.0.2", + "resolved": "https://registry.npmjs.org/robust-predicates/-/robust-predicates-3.0.2.tgz", + "integrity": "sha512-IXgzBWvWQwE6PrDI05OvmXUIruQTcoMDzRsOd5CDvHCVLcLHMTSYvOK5Cm46kWqlV3yAbuSpBZdJ5oP5OUoStg==", + "license": "Unlicense" + }, "node_modules/run-parallel": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", @@ -8830,6 +9123,12 @@ "queue-microtask": "^1.2.2" } }, + "node_modules/rw": { + "version": "1.3.3", + "resolved": "https://registry.npmjs.org/rw/-/rw-1.3.3.tgz", + "integrity": "sha512-PdhdWy89SiZogBLaw42zdeqtRJ//zFd2PgQavcICDUgJT5oW10QCRKbJ6bg4r0/UY2M6BWd5tkxuGFRvCkgfHQ==", + "license": "BSD-3-Clause" + }, "node_modules/rxjs": { "version": "7.8.1", "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", @@ -9311,7 +9610,6 @@ "version": "4.2.3", "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", - "dev": true, "dependencies": { "emoji-regex": "^8.0.0", "is-fullwidth-code-point": "^3.0.0", @@ -9378,7 +9676,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -9540,6 +9837,26 @@ "node": ">=8.0" } }, + "node_modules/topojson-client": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/topojson-client/-/topojson-client-3.1.0.tgz", + "integrity": "sha512-605uxS6bcYxGXw9qi62XyrV6Q3xwbndjachmNxu8HWTtVPxZfEJN9fd/SZS1Q54Sn2y0TMyMxFj/cJINqGHrKw==", + "license": "ISC", + "dependencies": { + "commander": "2" + }, + "bin": { + "topo2geo": "bin/topo2geo", + "topomerge": "bin/topomerge", + "topoquantize": "bin/topoquantize" + } + }, + "node_modules/topojson-client/node_modules/commander": { + "version": "2.20.3", + "resolved": "https://registry.npmjs.org/commander/-/commander-2.20.3.tgz", + "integrity": "sha512-GpVkmM8vF2vQUkj2LvZmD35JxeJOLCwJ9cUkugyk2nuhbv3+mJvpLYYt+0+USMxE+oj+ey/lJEnhZw75x/OMcQ==", + "license": "MIT" + }, "node_modules/tough-cookie": { "version": "4.1.4", "resolved": "https://registry.npmjs.org/tough-cookie/-/tough-cookie-4.1.4.tgz", @@ -10028,6 +10345,473 @@ "resolved": "https://registry.npmjs.org/valid-url/-/valid-url-1.0.9.tgz", "integrity": "sha512-QQDsV8OnSf5Uc30CKSwG9lnhMPe6exHtTXLRYX8uMwKENy640pU+2BgBL0LRbDh/eYRahNCS7aewCx0wf3NYVA==" }, + "node_modules/vega": { + "version": "5.30.0", + "resolved": "https://registry.npmjs.org/vega/-/vega-5.30.0.tgz", + "integrity": "sha512-ZGoC8LdfEUV0LlXIuz7hup9jxuQYhSaWek2M7r9dEHAPbPrzSQvKXZ0BbsJbrarM100TGRpTVN/l1AFxCwDkWw==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-crossfilter": "~4.1.2", + "vega-dataflow": "~5.7.6", + "vega-encode": "~4.10.1", + "vega-event-selector": "~3.0.1", + "vega-expression": "~5.1.1", + "vega-force": "~4.2.1", + "vega-format": "~1.1.2", + "vega-functions": "~5.15.0", + "vega-geo": "~4.4.2", + "vega-hierarchy": "~4.1.2", + "vega-label": "~1.3.0", + "vega-loader": "~4.5.2", + "vega-parser": "~6.4.0", + "vega-projection": "~1.6.1", + "vega-regression": "~1.3.0", + "vega-runtime": "~6.2.0", + "vega-scale": "~7.4.1", + "vega-scenegraph": "~4.13.0", + "vega-statistics": "~1.9.0", + "vega-time": "~2.1.2", + "vega-transforms": "~4.12.0", + "vega-typings": "~1.3.1", + "vega-util": "~1.17.2", + "vega-view": "~5.13.0", + "vega-view-transforms": "~4.6.0", + "vega-voronoi": "~4.2.3", + "vega-wordcloud": "~4.1.5" + } + }, + "node_modules/vega-canvas": { + "version": "1.2.7", + "resolved": "https://registry.npmjs.org/vega-canvas/-/vega-canvas-1.2.7.tgz", + "integrity": "sha512-OkJ9CACVcN9R5Pi9uF6MZBF06pO6qFpDYHWSKBJsdHP5o724KrsgR6UvbnXFH82FdsiTOff/HqjuaG8C7FL+9Q==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-crossfilter": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vega-crossfilter/-/vega-crossfilter-4.1.2.tgz", + "integrity": "sha512-J7KVEXkpfRJBfRvwLxn5vNCzQCNkrnzmDvkvwhuiwT4gPm5sk7MK5TuUP8GCl/iKYw+kWeVXEtrVHwWtug+bcQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.6", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-dataflow": { + "version": "5.7.6", + "resolved": "https://registry.npmjs.org/vega-dataflow/-/vega-dataflow-5.7.6.tgz", + "integrity": "sha512-9Md8+5iUC1MVKPKDyZ7pCEHk6I9am+DgaMzZqo/27O/KI4f23/WQXPyuI8jbNmc/mkm340P0TKREmzL5M7+2Dg==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-format": "^1.1.2", + "vega-loader": "^4.5.2", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-encode": { + "version": "4.10.1", + "resolved": "https://registry.npmjs.org/vega-encode/-/vega-encode-4.10.1.tgz", + "integrity": "sha512-d25nVKZDrg109rC65M8uxE+7iUrTxktaqgK4fU3XZBgpWlh1K4UbU5nDag7kiHVVN4tKqwgd+synEotra9TiVQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "vega-dataflow": "^5.7.6", + "vega-scale": "^7.4.1", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-event-selector": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/vega-event-selector/-/vega-event-selector-3.0.1.tgz", + "integrity": "sha512-K5zd7s5tjr1LiOOkjGpcVls8GsH/f2CWCrWcpKy74gTCp+llCdwz0Enqo013ZlGaRNjfgD/o1caJRt3GSaec4A==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-expression": { + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/vega-expression/-/vega-expression-5.1.1.tgz", + "integrity": "sha512-zv9L1Hm0KHE9M7mldHyz8sXbGu3KmC0Cdk7qfHkcTNS75Jpsem6jkbu6ZAwx5cNUeW91AxUQOu77r4mygq2wUQ==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/estree": "^1.0.0", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-force": { + "version": "4.2.1", + "resolved": "https://registry.npmjs.org/vega-force/-/vega-force-4.2.1.tgz", + "integrity": "sha512-2BcuuqFr77vcCyKfcpedNFeYMxi+XEFCrlgLWNx7YV0PI8pdP5y/yPkzyuE9Tb894+KkRAvfQHZRAshcnFNcMw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-force": "^3.0.0", + "vega-dataflow": "^5.7.6", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-format": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/vega-format/-/vega-format-1.1.2.tgz", + "integrity": "sha512-0kUfAj0dg0U6GcEY0Kp6LiSTCZ8l8jl1qVdQyToMyKmtZg/q56qsiJQZy3WWRr1MtWkTIZL71xSJXgjwjeUaAw==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-format": "^3.1.0", + "d3-time-format": "^4.1.0", + "vega-time": "^2.1.2", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-functions": { + "version": "5.15.0", + "resolved": "https://registry.npmjs.org/vega-functions/-/vega-functions-5.15.0.tgz", + "integrity": "sha512-pCqmm5efd+3M65jrJGxEy3UGuRksmK6DnWijoSNocnxdCBxez+yqUUVX9o2pN8VxMe3648vZnR9/Vk5CXqRvIQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-color": "^3.1.0", + "d3-geo": "^3.1.0", + "vega-dataflow": "^5.7.6", + "vega-expression": "^5.1.1", + "vega-scale": "^7.4.1", + "vega-scenegraph": "^4.13.0", + "vega-selections": "^5.4.2", + "vega-statistics": "^1.9.0", + "vega-time": "^2.1.2", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-geo": { + "version": "4.4.2", + "resolved": "https://registry.npmjs.org/vega-geo/-/vega-geo-4.4.2.tgz", + "integrity": "sha512-unuV/UxUHf6UJu6GYxMZonC3SZlMfFXYLOkgEsRSvmsMPt3+CVv8FmG88dXNRUJUrdROrJepgecqx0jOwMSnGA==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-color": "^3.1.0", + "d3-geo": "^3.1.0", + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.6", + "vega-projection": "^1.6.1", + "vega-statistics": "^1.9.0", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-hierarchy": { + "version": "4.1.2", + "resolved": "https://registry.npmjs.org/vega-hierarchy/-/vega-hierarchy-4.1.2.tgz", + "integrity": "sha512-m+xDtT5092YPSnV0rdTLW+AWmoCb+A54JQ66MUJwiDBpKxvfKnTiQeuiWDU2YudjUoXZN9EBOcI6QHF8H2Lu2A==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-hierarchy": "^3.1.2", + "vega-dataflow": "^5.7.6", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-label": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vega-label/-/vega-label-1.3.0.tgz", + "integrity": "sha512-EfSFSCWAwVPsklM5g0gUEuohALgryuGC/SKMmsOH7dYT/bywmLBZhLVbrE+IHJAUauoGrMhYw1mqnXL/0giJBg==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.6", + "vega-scenegraph": "^4.13.0", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-lite": { + "version": "5.23.0", + "resolved": "https://registry.npmjs.org/vega-lite/-/vega-lite-5.23.0.tgz", + "integrity": "sha512-l4J6+AWE3DIjvovEoHl2LdtCUkfm4zs8Xxx7INwZEAv+XVb6kR6vIN1gt3t2gN2gs/y4DYTs/RPoTeYAuEg6mA==", + "license": "BSD-3-Clause", + "dependencies": { + "json-stringify-pretty-compact": "~4.0.0", + "tslib": "~2.8.1", + "vega-event-selector": "~3.0.1", + "vega-expression": "~5.1.1", + "vega-util": "~1.17.2", + "yargs": "~17.7.2" + }, + "bin": { + "vl2pdf": "bin/vl2pdf", + "vl2png": "bin/vl2png", + "vl2svg": "bin/vl2svg", + "vl2vg": "bin/vl2vg" + }, + "engines": { + "node": ">=18" + }, + "peerDependencies": { + "vega": "^5.24.0" + } + }, + "node_modules/vega-lite/node_modules/cliui": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/cliui/-/cliui-8.0.1.tgz", + "integrity": "sha512-BSeNnyus75C4//NQ9gQt1/csTXyo/8Sb+afLAkzAptFuMsod9HFokGNudZpi/oQV73hnVK+sR+5PVRMd+Dr7YQ==", + "license": "ISC", + "dependencies": { + "string-width": "^4.2.0", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^7.0.0" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-lite/node_modules/wrap-ansi": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz", + "integrity": "sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q==", + "license": "MIT", + "dependencies": { + "ansi-styles": "^4.0.0", + "string-width": "^4.1.0", + "strip-ansi": "^6.0.0" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/chalk/wrap-ansi?sponsor=1" + } + }, + "node_modules/vega-lite/node_modules/y18n": { + "version": "5.0.8", + "resolved": "https://registry.npmjs.org/y18n/-/y18n-5.0.8.tgz", + "integrity": "sha512-0pfFzegeDWJHJIAmTLRP2DwHjdF5s7jo9tuztdQxAhINCdvS+3nGINqPd00AphqJR/0LhANUS6/+7SCb98YOfA==", + "license": "ISC", + "engines": { + "node": ">=10" + } + }, + "node_modules/vega-lite/node_modules/yargs": { + "version": "17.7.2", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", + "integrity": "sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w==", + "license": "MIT", + "dependencies": { + "cliui": "^8.0.1", + "escalade": "^3.1.1", + "get-caller-file": "^2.0.5", + "require-directory": "^2.1.1", + "string-width": "^4.2.3", + "y18n": "^5.0.5", + "yargs-parser": "^21.1.1" + }, + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-lite/node_modules/yargs-parser": { + "version": "21.1.1", + "resolved": "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz", + "integrity": "sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/vega-loader": { + "version": "4.5.2", + "resolved": "https://registry.npmjs.org/vega-loader/-/vega-loader-4.5.2.tgz", + "integrity": "sha512-ktIdGz3DRIS3XfTP9lJ6oMT5cKwC86nQkjUbXZbOtwXQFVNE2xVWBuH13GP6FKUZxg5hJCMtb5v/e/fwTvhKsQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-dsv": "^3.0.1", + "node-fetch": "^2.6.7", + "topojson-client": "^3.1.0", + "vega-format": "^1.1.2", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-parser": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/vega-parser/-/vega-parser-6.4.0.tgz", + "integrity": "sha512-/hFIJs0yITxfvLIfhhcpUrcbKvu4UZYoMGmly5PSsbgo60oAsVQW8ZbX2Ji3iNFqZJh1ifoX/P0j+9wep1OISw==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-dataflow": "^5.7.6", + "vega-event-selector": "^3.0.1", + "vega-functions": "^5.15.0", + "vega-scale": "^7.4.1", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-projection": { + "version": "1.6.1", + "resolved": "https://registry.npmjs.org/vega-projection/-/vega-projection-1.6.1.tgz", + "integrity": "sha512-sqfnAAHumU7MWU1tQN3b6HNgKGF3legek0uLHhjLKcDJQxEc7kwcD18txFz2ffQks6d5j+AUhBiq4GARWf0DEQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-geo": "^3.1.0", + "d3-geo-projection": "^4.0.0", + "vega-scale": "^7.4.1" + } + }, + "node_modules/vega-regression": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/vega-regression/-/vega-regression-1.3.0.tgz", + "integrity": "sha512-gxOQfmV7Ft/MYKpXDEo09WZyBuKOBqxqDRWay9KtfGq/E0Y4vbTPsWLv2cB1ToPJdKE6XSN6Re9tCIw5M/yMUg==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.6", + "vega-statistics": "^1.9.0", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-runtime": { + "version": "6.2.0", + "resolved": "https://registry.npmjs.org/vega-runtime/-/vega-runtime-6.2.0.tgz", + "integrity": "sha512-30UXbujWjKNd5aeP+oeHuwFmzuyVYlBj4aDy9+AjfWLECu8wJt4K01vwegcaGPdCWcPLVIv4Oa9Lob4mcXn5KQ==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-dataflow": "^5.7.6", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-scale": { + "version": "7.4.1", + "resolved": "https://registry.npmjs.org/vega-scale/-/vega-scale-7.4.1.tgz", + "integrity": "sha512-dArA28DbV/M92O2QvswnzCmQ4bq9WwLKUoyhqFYWCltmDwkmvX7yhqiFLFMWPItIm7mi4Qyoygby6r4DKd1X2A==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-interpolate": "^3.0.1", + "d3-scale": "^4.0.2", + "d3-scale-chromatic": "^3.1.0", + "vega-time": "^2.1.2", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-scenegraph": { + "version": "4.13.0", + "resolved": "https://registry.npmjs.org/vega-scenegraph/-/vega-scenegraph-4.13.0.tgz", + "integrity": "sha512-nfl45XtuqB5CxyIZJ+bbJ+dofzosPCRlmF+eUQo+0J23NkNXsTzur+1krJDSdhcw0SOYs4sbYRoMz1cpuOM4+Q==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-path": "^3.1.0", + "d3-shape": "^3.2.0", + "vega-canvas": "^1.2.7", + "vega-loader": "^4.5.2", + "vega-scale": "^7.4.1", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-selections": { + "version": "5.4.2", + "resolved": "https://registry.npmjs.org/vega-selections/-/vega-selections-5.4.2.tgz", + "integrity": "sha512-99FUhYmg0jOJr2/K4TcEURmJRkuibrCDc8KBUX7qcQEITzrZ5R6a4QE+sarCvbb3hi8aA9GV2oyST6MQeA9mgQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "3.2.4", + "vega-expression": "^5.0.1", + "vega-util": "^1.17.1" + } + }, + "node_modules/vega-statistics": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/vega-statistics/-/vega-statistics-1.9.0.tgz", + "integrity": "sha512-GAqS7mkatpXcMCQKWtFu1eMUKLUymjInU0O8kXshWaQrVWjPIO2lllZ1VNhdgE0qGj4oOIRRS11kzuijLshGXQ==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2" + } + }, + "node_modules/vega-time": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/vega-time/-/vega-time-2.1.2.tgz", + "integrity": "sha512-6rXc6JdDt8MnCRy6UzUCsa6EeFycPDmvioMddLfKw38OYCV8pRQC5nw44gyddOwXgUTJLiCtn/sp53P0iA542A==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-time": "^3.1.0", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-transforms": { + "version": "4.12.0", + "resolved": "https://registry.npmjs.org/vega-transforms/-/vega-transforms-4.12.0.tgz", + "integrity": "sha512-bh/2Qbj85O70mjfLRgPKAsABArgSUP0k+GjmaY54zukIRxoGxKju+85nigeX/aR/INpEqNWif+5lL+NvmyWA5w==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "vega-dataflow": "^5.7.6", + "vega-statistics": "^1.9.0", + "vega-time": "^2.1.2", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-typings": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/vega-typings/-/vega-typings-1.3.1.tgz", + "integrity": "sha512-j9Sdgmvowz09jkMgTFGVfiv7ycuRP/TQkdHRPXIYwt3RDgPQn7inyFcJ8C8ABFt4MiMWdjOwbneF6KWW8TRXIw==", + "license": "BSD-3-Clause", + "dependencies": { + "@types/geojson": "7946.0.4", + "vega-event-selector": "^3.0.1", + "vega-expression": "^5.1.1", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-util": { + "version": "1.17.2", + "resolved": "https://registry.npmjs.org/vega-util/-/vega-util-1.17.2.tgz", + "integrity": "sha512-omNmGiZBdjm/jnHjZlywyYqafscDdHaELHx1q96n5UOz/FlO9JO99P4B3jZg391EFG8dqhWjQilSf2JH6F1mIw==", + "license": "BSD-3-Clause" + }, + "node_modules/vega-view": { + "version": "5.13.0", + "resolved": "https://registry.npmjs.org/vega-view/-/vega-view-5.13.0.tgz", + "integrity": "sha512-ZPAAQ3iYz6YrQjJoDT+0bcxJkXt9PKF5v4OO7Omw8PFhkIv++jFXeKlQTW1bBtyQ92dkdGGHv5lYY67Djqjf3A==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-array": "^3.2.2", + "d3-timer": "^3.0.1", + "vega-dataflow": "^5.7.6", + "vega-format": "^1.1.2", + "vega-functions": "^5.15.0", + "vega-runtime": "^6.2.0", + "vega-scenegraph": "^4.13.0", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-view-transforms": { + "version": "4.6.0", + "resolved": "https://registry.npmjs.org/vega-view-transforms/-/vega-view-transforms-4.6.0.tgz", + "integrity": "sha512-z3z66aJTA3ZRo4oBY4iBXnn+A4KqBGZT/UrlKDbm+7Ec+Ip+hK2tF8Kmhp/WNcMsDZoUWFqLJgR2VgOgvJk9RA==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-dataflow": "^5.7.6", + "vega-scenegraph": "^4.13.0", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-voronoi": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/vega-voronoi/-/vega-voronoi-4.2.3.tgz", + "integrity": "sha512-aYYYM+3UGqwsOx+TkVtF1IZfguy0H7AN79dR8H0nONRIc+vhk/lbnlkgwY2nSzEu0EZ4b5wZxeGoDBEVmdDEcg==", + "license": "BSD-3-Clause", + "dependencies": { + "d3-delaunay": "^6.0.2", + "vega-dataflow": "^5.7.6", + "vega-util": "^1.17.2" + } + }, + "node_modules/vega-wordcloud": { + "version": "4.1.5", + "resolved": "https://registry.npmjs.org/vega-wordcloud/-/vega-wordcloud-4.1.5.tgz", + "integrity": "sha512-p+qXU3cb9VeWzJ/HEdax0TX2mqDJcSbrCIfo2d/EalOXGkvfSLKobsmMQ8DxPbtVp0uhnpvfCGDyMJw+AzcI2A==", + "license": "BSD-3-Clause", + "dependencies": { + "vega-canvas": "^1.2.7", + "vega-dataflow": "^5.7.6", + "vega-scale": "^7.4.1", + "vega-statistics": "^1.9.0", + "vega-util": "^1.17.2" + } + }, "node_modules/walker": { "version": "1.0.8", "resolved": "https://registry.npmjs.org/walker/-/walker-1.0.8.tgz", diff --git a/package.json b/package.json index 025cc7a..1f87c38 100644 --- a/package.json +++ b/package.json @@ -5,18 +5,21 @@ "dependencies": { "@adobe/aio-sdk": "^6", "cheerio": "^1.0.0", + "commander": "^13.1.0", "handlebars": "^4.7.8", "node-fetch": "^2.6.0", - "striptags": "^3.2.0" + "striptags": "^3.2.0", + "vega": "^5.30.0", + "vega-lite": "^5.23.0" }, "devDependencies": { "@eslint/js": "^9.17.0", "@openwhisk/wskdebug": "^1.3.0", "eslint": "^9.17.0", - "msw": "^2.7.0", "eslint-plugin-jest": "^28.10.0", "globals": "^15.14.0", - "jest": "^29" + "jest": "^29", + "msw": "^2.7.0" }, "scripts": { "test": "jest --passWithNoTests ./test", diff --git a/tools/README.md b/tools/README.md index 49493c5..ffe160f 100644 --- a/tools/README.md +++ b/tools/README.md @@ -91,9 +91,15 @@ This script is used to download and display poller statistics from Adobe I/O Run AIO_RUNTIME_AUTH= ``` -2. Run the script using Node.js: - ```bash - node download-poller-stats.js +2. Usage: + ``` + Usage: node download-poller-stats.js [options] + + Options: + -d, --date Select data for a specific day. If not provided, defaults to today's date + -c, --chart Generate a chart from the data, showing latency distribution and + correlation with other factors. In addition, generate a JSON file with corresponding data series. + -h, --help Display help for cli tool + -f, --file The filename to save the records to; JSON and CSV formats are supported. ``` -3. The script will output the poller statistics in CSV format. diff --git a/tools/download-poller-stats.js b/tools/download-poller-stats.js index b6d5ffb..a86fe98 100644 --- a/tools/download-poller-stats.js +++ b/tools/download-poller-stats.js @@ -12,13 +12,16 @@ governing permissions and limitations under the License. require('dotenv').config(); const openwhisk = require('openwhisk'); -const { exit } = require('process'); +const { exit, env } = require('process'); +const { program } = require('commander'); +const vega = require('vega'); +const vegaLite = require('vega-lite'); +const fs = require('fs'); const { - AIO_RUNTIME_NAMESPACE, - AIO_RUNTIME_AUTH, -// eslint-disable-next-line no-undef -} = process.env; + AIO_RUNTIME_NAMESPACE, + AIO_RUNTIME_AUTH, +} = env; if (!AIO_RUNTIME_NAMESPACE || !AIO_RUNTIME_AUTH) { console.log('Missing required environment variables AIO_RUNTIME_AUTH and AIO_RUNTIME_NAMESPACE'); @@ -33,13 +36,107 @@ const ow = openwhisk({ namespace: AIO_RUNTIME_NAMESPACE, }); +function generateChart(rawData, filename) { + // eslint-disable-next-line no-unused-vars + const processedData = rawData.flatMap(([id, startDate, duration, state, failed, ignored, published, unpublished, previewDuration]) => [ + { date: startDate, value: failed, metric: 'Failed', type: 'count' }, + { date: startDate, value: published, metric: 'Published', type: 'count' }, + { date: startDate, value: unpublished, metric: 'Unpublished', type: 'count' }, + { date: startDate, value: duration, metric: 'Duration', type: 'duration' } + ]); + + const spec = { + "$schema": "https://vega.github.io/schema/vega-lite/v5.json", + "width": 4096, + "height": 2048, + "data": { "values": processedData }, + "encoding": { + "x": { + "field": "date", + "type": "temporal", + "axis": { "title": "Date" } + } + }, + "layer": [ + { + "transform": [{ "filter": "datum.type === 'count'" }], + "mark": "line", + "encoding": { + "y": { + "field": "value", + "type": "quantitative", + "axis": { "title": "Count" } + }, + "color": { + "field": "metric", + "type": "nominal", + "legend": { "title": "Metrics (Count)" }, + "scale": { + "domain": ["Failed", "Published", "Unpublished"], + "range": ["#ff0000", "#00ff00", "#0000ff"] + } + } + } + }, + { + "transform": [{ "filter": "datum.type === 'duration'" }], + "mark": { + "type": "line", + "strokeDash": [4, 4] + }, + "encoding": { + "y": { + "field": "value", + "type": "quantitative", + "axis": { "title": "Duration (ms)" }, + "scale": { "zero": true } + }, + "color": { + "field": "metric", + "type": "nominal", + "scale": { + "domain": ["Duration"], + "range": ["#FFA500"] + }, + "legend": { "title": "Duration" } + } + } + } + ], + "resolve": { + "scale": { + "y": "independent", + "color": "independent" // Add this to resolve color scale conflicts + } + } + }; + + + const vegaSpec = vegaLite.compile(spec).spec; + const view = new vega.View(vega.parse(vegaSpec), { renderer: 'none' }); + + const format = filename.split('.').pop(); + + if (format === 'svg') { + view.toSVG() + .then(function (svg) { + fs.writeFileSync(filename, svg); + console.log('Chart has been generated successfully as SVG!'); + }) + .catch(console.error); + } else { + console.error('Invalid file format. Please choose either png or svg.'); + exit(1); + } +} + async function* listActivations() { const { activations } = await ow.activations.list({ count: true, ...opts }); for (let limit = 50, skip = 0, retry = true; skip < activations; skip += limit) { let activations; try { activations = await ow.activations.list({ limit, skip, ...opts }); - } catch(e) { + } catch (e) { if (retry) { // retry only once retry = false; @@ -47,16 +144,65 @@ async function* listActivations() { } throw e; } - + for (const activation of activations) { yield activation; } } } -console.log('activationId,startDate,duration,state,failed,ignored,published,unpublished,previewDuration'); +async function downloadActivations() { + program + .option('-d, --date ', 'Select data for a specific day') + .option('-c, --chart ', 'Generate a chart from the data, showing latency distribution and correlation with other factors. Generates JSON file with corresponding data series.') + .option('-h, --help', 'Display help for cli') + .option('-f, --file ', 'The filename to save the records, JSON and CSV formats are supported.'); + + program.parse(process.argv); + const options = program.opts(); + + if (options.help) { + program.help(); + } + + // Defaults to today + const targetDate = new Date(); + targetDate.setHours(0, 0, 0, 0); + + if (options.date) { + const parsedDate = new Date(options.date); + if (isNaN(parsedDate)) { + console.log('Invalid date format. Please use YYYY-MM-DD.'); + exit(1); + } + targetDate.setTime(parsedDate.getTime()); + } + + let filename = options.file; + + if (!filename) { + filename = `poller-stats-${targetDate.getFullYear()}-${targetDate.getMonth() < 10 ? '0' : ''}${targetDate.getMonth() + 1}` + + `-${targetDate.getDate() < 10 ? '0' : ''}${targetDate.getDate()}.json`; + } + + let format = filename.split('.').pop(); + + if (options.chart && format !== 'json') { + // force JSON format for chart data + format = 'json'; + } + + console.log(`Saving activations to ${filename}...`); + + if (format === 'json') { + fs.writeFileSync(filename, '['); + } else if (format === 'csv') { + fs.writeFileSync(filename, 'activationId,startDate,duration,state,failed,ignored,published,unpublished,previewDuration\n'); + } else { + console.error('Invalid file format. Please choose either csv or json.'); + exit(1); + } -async function dumpActivations() { for await (const activation of listActivations()) { const { name, duration, activationId, start } = activation; @@ -64,19 +210,23 @@ async function dumpActivations() { const startDate = new Date(start) .toISOString() .replace('T', ' ') - .replace(/\.\d+Z$/,''); + .replace(/\.\d+Z$/, ''); + + const activationDate = new Date(startDate); let result; try { - result = await ow.activations.result({ name: activationId }); - // eslint-disable-next-line no-unused-vars - } catch(e) { + result = await ow.activations.result({ name: activationId }); + // eslint-disable-next-line no-unused-vars + } catch (e) { // ignore and retry result = await ow.activations.result({ name: activationId }); } - // skip skipped - if (!result?.result || result.result.state === 'skipped') { + // skip skipped and activations before today, if requested + if (!result?.result || + result.result.state === 'skipped' || + activationDate.toDateString() !== targetDate.toDateString()) { continue; } @@ -84,7 +234,7 @@ async function dumpActivations() { const { failed, ignored, published, unpublished } = status; const { previewDuration } = timings; - console.log([ + const columns = [ activationId, startDate, duration, @@ -94,9 +244,27 @@ async function dumpActivations() { published, unpublished, previewDuration?.avg || 0 - ].join(',')); + ]; + + if (format === 'json') { + fs.appendFileSync(filename, JSON.stringify(columns) + ','); + } else { + fs.appendFileSync(filename, `${columns.join(',')}\n`); + } } } + if (format === 'json') { + // remove trailing comma + const data = fs + .readFileSync(filename, 'utf8') + .replace(/,$/, ''); + fs.writeFileSync(filename, data); + fs.appendFileSync(filename, ']'); + } + + if (options.chart) { + generateChart(JSON.parse(fs.readFileSync(filename)), options.chart); + } } -dumpActivations(); +downloadActivations();