From 4b068efd7641896db977ec042225eb57f14ca540 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev Date: Fri, 14 Jun 2024 22:33:12 +0400 Subject: [PATCH 01/24] Init dog package --- apps/dog/package.json | 20 + apps/dog/tsconfig.json | 17 + package-lock.json | 1769 +++++++++++++++++++++++++++++++++++++++- 3 files changed, 1773 insertions(+), 33 deletions(-) create mode 100644 apps/dog/package.json create mode 100644 apps/dog/tsconfig.json diff --git a/apps/dog/package.json b/apps/dog/package.json new file mode 100644 index 0000000..8e4cc6b --- /dev/null +++ b/apps/dog/package.json @@ -0,0 +1,20 @@ +{ + "name": "@d0rich/dog", + "version": "0.3.0", + "publishConfig": { + "access": "public" + }, + "type": "module", + "scripts": { + "build": "", + "run:web": "node" + }, + "dependencies": { + "@backroad/backroad": "^1.4.0-alpha.5", + "node-html-to-image": "^4.0.0", + "png-to-ico": "^2.1.8" + }, + "devDependencies": { + "typescript": "^5.4.5" + } +} diff --git a/apps/dog/tsconfig.json b/apps/dog/tsconfig.json new file mode 100644 index 0000000..dbb8ea1 --- /dev/null +++ b/apps/dog/tsconfig.json @@ -0,0 +1,17 @@ +{ + + "compilerOptions": { + "moduleResolution": "node", + "outDir": "./dist", + "target": "ESNext", + "module": "ESNext", + "noEmitOnError": true, + "allowSyntheticDefaultImports": true, + "esModuleInterop": true, + "forceConsistentCasingInFileNames": true, + "strict": true, + "skipLibCheck": true + }, + "include": ["**/*.ts"], + "exclude": ["node_modules"] +} diff --git a/package-lock.json b/package-lock.json index d035d60..8a1a589 100644 --- a/package-lock.json +++ b/package-lock.json @@ -202,6 +202,18 @@ "vue-gtag": "^2.0.1" } }, + "apps/dog": { + "name": "@d0rich/dog", + "version": "0.3.0", + "dependencies": { + "@backroad/backroad": "^1.4.0-alpha.5", + "node-html-to-image": "^4.0.0", + "png-to-ico": "^2.1.8" + }, + "devDependencies": { + "typescript": "^5.4.5" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "devOptional": true, @@ -931,7 +943,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", - "dev": true, "license": "MIT", "dependencies": { "regenerator-runtime": "^0.14.0" @@ -1007,6 +1018,50 @@ "node": ">=6.9.0" } }, + "node_modules/@backroad/backroad": { + "version": "1.4.0-alpha.5", + "resolved": "https://registry.npmjs.org/@backroad/backroad/-/backroad-1.4.0-alpha.5.tgz", + "integrity": "sha512-uhOqzca08WWtEZRbmtgpcNTW6l2z4KMPafRyAc58TPz7l4EcmHU0shGbTPIUHYflhGYJYbwQNfrg9d0wL7lAPA==", + "dependencies": { + "@backroad/core": "1.4.0-alpha.5", + "@tanstack/react-table": "^8.10.6", + "express": "^4.18.1", + "fast-json-stable-stringify": "^2.1.0", + "formidable": "^3.5.1", + "lodash": "^4.17.21", + "react": "18.2.0", + "react-chartjs-2": "^5.2.0", + "react-dropzone": "^14.2.3", + "react-ga4": "^2.1.0", + "react-select": "^5.7.7", + "socket.io": "^4.7.2", + "superjson": "^1.13.1", + "tslib": "^2.3.0" + } + }, + "node_modules/@backroad/backroad/node_modules/react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@backroad/core": { + "version": "1.4.0-alpha.5", + "resolved": "https://registry.npmjs.org/@backroad/core/-/core-1.4.0-alpha.5.tgz", + "integrity": "sha512-B8XtU8AMyihi5F6E0BxZc0j8jIbgojuC81g5iJUUvLpg78hZtjrxTotVZXxqy3hWFljYTHF4scmRqQvtwhJchw==", + "dependencies": { + "react-chartjs-2": "^5.2.0", + "react-select": "^5.7.7", + "socket.io": "^4.7.2", + "tslib": "^2.3.0" + } + }, "node_modules/@braintree/sanitize-url": { "version": "6.0.4", "dev": true, @@ -2096,6 +2151,10 @@ "postcss-selector-parser": "^6.0.13" } }, + "node_modules/@d0rich/dog": { + "resolved": "apps/dog", + "link": true + }, "node_modules/@d0rich/esprit-design": { "resolved": "packages/esprit-design", "link": true @@ -2108,6 +2167,147 @@ "resolved": "packages/nuxt-design-system", "link": true }, + "node_modules/@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "license": "MIT", + "dependencies": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==", + "license": "MIT" + }, + "node_modules/@emotion/babel-plugin/node_modules/source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==", + "license": "BSD-3-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/@emotion/babel-plugin/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "license": "MIT", + "dependencies": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + } + }, + "node_modules/@emotion/cache/node_modules/stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==", + "license": "MIT" + }, + "node_modules/@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==", + "license": "MIT" + }, + "node_modules/@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==", + "license": "MIT" + }, + "node_modules/@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + }, + "peerDependencies": { + "react": ">=16.8.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, + "node_modules/@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "license": "MIT", + "dependencies": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "node_modules/@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==", + "license": "MIT" + }, + "node_modules/@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==", + "license": "MIT" + }, + "node_modules/@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "license": "MIT", + "peerDependencies": { + "react": ">=16.8.0" + } + }, + "node_modules/@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==", + "license": "MIT" + }, + "node_modules/@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==", + "license": "MIT" + }, "node_modules/@es-joy/jsdoccomment": { "version": "0.43.1", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz", @@ -2576,7 +2776,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/utils": "^0.2.0" } @@ -2586,7 +2785,6 @@ "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz", "integrity": "sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==", "license": "MIT", - "peer": true, "dependencies": { "@floating-ui/core": "^1.1.0" } @@ -2595,8 +2793,7 @@ "version": "0.2.2", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==", - "license": "MIT", - "peer": true + "license": "MIT" }, "node_modules/@humanwhocodes/config-array": { "version": "0.11.14", @@ -2845,6 +3042,13 @@ "node": ">= 12" } }, + "node_modules/@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", + "license": "MIT", + "peer": true + }, "node_modules/@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -6495,6 +6699,39 @@ "node": ">=4" } }, + "node_modules/@tanstack/react-table": { + "version": "8.17.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.17.3.tgz", + "integrity": "sha512-5gwg5SvPD3lNAXPuJJz1fOCEZYk9/GeBFH3w/hCgnfyszOIzwkwgp5I7Q4MJtn0WECp84b5STQUDdmvGi8m3nA==", + "license": "MIT", + "dependencies": { + "@tanstack/table-core": "8.17.3" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + }, + "peerDependencies": { + "react": ">=16.8", + "react-dom": ">=16.8" + } + }, + "node_modules/@tanstack/table-core": { + "version": "8.17.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.17.3.tgz", + "integrity": "sha512-mPBodDGVL+fl6d90wUREepHa/7lhsghg2A3vFpakEhrhtbIlgNAZiMr7ccTgak5qbHqF14Fwy+W1yFWQt+WmYQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "type": "github", + "url": "https://github.com/sponsors/tannerlinsley" + } + }, "node_modules/@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", @@ -6589,6 +6826,21 @@ "integrity": "sha512-71EHMl70TPWIAsFuHd85NHq6S6T2OOjiisPTrH7RgcjzpJpPh4RQJv7PvVvIxc6PIp8CLV7F9B+TdjcAES5vcA==", "license": "MIT" }, + "node_modules/@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==", + "license": "MIT" + }, + "node_modules/@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/d3-scale": { "version": "4.0.6", "dev": true, @@ -6699,6 +6951,37 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==", + "license": "MIT" + }, + "node_modules/@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==", + "license": "MIT" + }, + "node_modules/@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "license": "MIT", + "dependencies": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "node_modules/@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "license": "MIT", + "dependencies": { + "@types/react": "*" + } + }, "node_modules/@types/resolve": { "version": "1.20.2", "license": "MIT" @@ -8914,6 +9197,12 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==", + "license": "MIT" + }, "node_modules/array-union": { "version": "2.1.0", "dev": true, @@ -8970,6 +9259,12 @@ "node": ">=0.10.0" } }, + "node_modules/asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==", + "license": "MIT" + }, "node_modules/assert": { "version": "2.1.0", "license": "MIT", @@ -9054,6 +9349,15 @@ "node": ">= 4.0.0" } }, + "node_modules/attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, "node_modules/autoprefixer": { "version": "10.4.19", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", @@ -9110,6 +9414,37 @@ "version": "1.6.4", "license": "ISC" }, + "node_modules/babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "engines": { + "node": ">=10", + "npm": ">=6" + } + }, + "node_modules/babel-plugin-macros/node_modules/cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "license": "MIT", + "dependencies": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/bail": { "version": "2.0.2", "license": "MIT", @@ -9190,6 +9525,15 @@ ], "license": "MIT" }, + "node_modules/base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==", + "license": "MIT", + "engines": { + "node": "^4.5.0 || >= 5.9" + } + }, "node_modules/basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", @@ -9243,6 +9587,45 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8", + "npm": "1.2.8000 || >= 1.4.16" + } + }, + "node_modules/body-parser/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/body-parser/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, "node_modules/boolbase": { "version": "1.0.0", "license": "ISC" @@ -9369,6 +9752,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/c12": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/c12/-/c12-1.11.1.tgz", @@ -9727,6 +10119,19 @@ "dev": true, "license": "MIT" }, + "node_modules/chart.js": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", + "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", + "license": "MIT", + "peer": true, + "dependencies": { + "@kurkle/color": "^0.3.0" + }, + "engines": { + "pnpm": ">=8" + } + }, "node_modules/chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -10134,12 +10539,27 @@ "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", "license": "MIT" }, + "node_modules/cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/cookie-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.1.0.tgz", "integrity": "sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==", "license": "MIT" }, + "node_modules/cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==", + "license": "MIT" + }, "node_modules/cookies": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", @@ -10153,6 +10573,21 @@ "node": ">= 0.8" } }, + "node_modules/copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "license": "MIT", + "dependencies": { + "is-what": "^4.1.8" + }, + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/core-js-compat": { "version": "3.37.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", @@ -10173,6 +10608,19 @@ "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==", "license": "MIT" }, + "node_modules/cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "license": "MIT", + "dependencies": { + "object-assign": "^4", + "vary": "^1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/cose-base": { "version": "1.0.3", "dev": true, @@ -11419,6 +11867,16 @@ "license": "BSD-3-Clause", "peer": true }, + "node_modules/dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "license": "ISC", + "dependencies": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "node_modules/didyoumean": { "version": "1.2.2", "license": "Apache-2.0" @@ -11445,6 +11903,16 @@ "version": "1.1.3", "license": "MIT" }, + "node_modules/dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "node_modules/dom-serializer": { "version": "2.0.0", "license": "MIT", @@ -11622,6 +12090,27 @@ "once": "^1.4.0" } }, + "node_modules/engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "license": "MIT", + "dependencies": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "engines": { + "node": ">=10.2.0" + } + }, "node_modules/engine.io-client": { "version": "6.5.2", "license": "MIT", @@ -11659,6 +12148,36 @@ "node": ">=10.0.0" } }, + "node_modules/engine.io/node_modules/cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, + "node_modules/engine.io/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/enhanced-resolve": { "version": "5.15.0", "license": "MIT", @@ -12243,7 +12762,6 @@ }, "node_modules/escape-string-regexp": { "version": "4.0.0", - "devOptional": true, "license": "MIT", "engines": { "node": ">=10" @@ -13084,6 +13602,69 @@ "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==", "license": "Apache-2.0" }, + "node_modules/express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "engines": { + "node": ">= 0.10.0" + } + }, + "node_modules/express/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/express/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/express/node_modules/path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==", + "license": "MIT" + }, "node_modules/extend": { "version": "3.0.2", "license": "MIT" @@ -13193,7 +13774,6 @@ }, "node_modules/fast-json-stable-stringify": { "version": "2.1.0", - "devOptional": true, "license": "MIT" }, "node_modules/fast-levenshtein": { @@ -13228,6 +13808,18 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/file-selector": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "license": "MIT", + "dependencies": { + "tslib": "^2.4.0" + }, + "engines": { + "node": ">= 12" + } + }, "node_modules/file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -13244,6 +13836,45 @@ "node": ">=8" } }, + "node_modules/finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "license": "MIT", + "dependencies": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, + "node_modules/finalhandler/node_modules/debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "license": "MIT", + "dependencies": { + "ms": "2.0.0" + } + }, + "node_modules/finalhandler/node_modules/ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==", + "license": "MIT" + }, + "node_modules/find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==", + "license": "MIT" + }, "node_modules/find-up": { "version": "5.0.0", "license": "MIT", @@ -13360,6 +13991,29 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/formidable": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "license": "MIT", + "dependencies": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0" + }, + "funding": { + "url": "https://ko-fi.com/tunnckoCore/commissions" + } + }, + "node_modules/forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==", + "license": "MIT", + "engines": { + "node": ">= 0.6" + } + }, "node_modules/fraction.js": { "version": "4.3.7", "license": "MIT", @@ -14120,6 +14774,24 @@ "dev": true, "license": "MIT" }, + "node_modules/hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "license": "BSD-3-Clause", + "dependencies": { + "react-is": "^16.7.0" + } + }, "node_modules/hookable": { "version": "5.5.3", "license": "MIT" @@ -14276,7 +14948,6 @@ }, "node_modules/iconv-lite": { "version": "0.4.24", - "dev": true, "license": "MIT", "dependencies": { "safer-buffer": ">= 2.1.2 < 3" @@ -14458,6 +15129,15 @@ "url": "https://opencollective.com/ioredis" } }, + "node_modules/ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==", + "license": "MIT", + "engines": { + "node": ">= 0.10" + } + }, "node_modules/iron-webcrypto": { "version": "1.0.0", "license": "MIT", @@ -14964,6 +15644,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==", + "license": "MIT", + "engines": { + "node": ">=12.13" + }, + "funding": { + "url": "https://github.com/sponsors/mesqueeb" + } + }, "node_modules/is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -15635,6 +16327,18 @@ "url": "https://github.com/sponsors/wooorm" } }, + "node_modules/loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "license": "MIT", + "dependencies": { + "js-tokens": "^3.0.0 || ^4.0.0" + }, + "bin": { + "loose-envify": "cli.js" + } + }, "node_modules/lower-case": { "version": "2.0.2", "license": "MIT", @@ -16974,6 +17678,18 @@ "node": ">= 0.6" } }, + "node_modules/memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==", + "license": "MIT" + }, + "node_modules/merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==", + "license": "MIT" + }, "node_modules/merge-stream": { "version": "2.0.0", "license": "MIT" @@ -19917,7 +20633,6 @@ "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true, "license": "MIT", "funding": { "url": "https://github.com/sponsors/ljharb" @@ -20671,6 +21386,8 @@ }, "node_modules/png-to-ico": { "version": "2.1.8", + "resolved": "https://registry.npmjs.org/png-to-ico/-/png-to-ico-2.1.8.tgz", + "integrity": "sha512-Nf+IIn/cZ/DIZVdGveJp86NG5uNib1ZXMiDd/8x32HCTeKSvgpyg6D/6tUBn1QO/zybzoMK0/mc3QRgAyXdv9w==", "license": "MIT", "dependencies": { "@types/node": "^17.0.36", @@ -21415,6 +22132,17 @@ "node": ">= 6" } }, + "node_modules/prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "license": "MIT", + "dependencies": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "node_modules/property-information": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", @@ -21431,6 +22159,19 @@ "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==", "license": "MIT" }, + "node_modules/proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "license": "MIT", + "dependencies": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/proxy-agent": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", @@ -21553,6 +22294,21 @@ } } }, + "node_modules/qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "license": "BSD-3-Clause", + "dependencies": { + "side-channel": "^1.0.4" + }, + "engines": { + "node": ">=0.6" + }, + "funding": { + "url": "https://github.com/sponsors/ljharb" + } + }, "node_modules/queue-microtask": { "version": "1.2.3", "funding": [ @@ -21605,6 +22361,21 @@ "node": ">= 0.6" } }, + "node_modules/raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "license": "MIT", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/rc9": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", @@ -21615,6 +22386,109 @@ "destr": "^2.0.3" } }, + "node_modules/react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/react-chartjs-2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", + "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "license": "MIT", + "peerDependencies": { + "chart.js": "^4.1.1", + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + }, + "peerDependencies": { + "react": "^18.3.1" + } + }, + "node_modules/react-dropzone": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", + "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "license": "MIT", + "dependencies": { + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", + "prop-types": "^15.8.1" + }, + "engines": { + "node": ">= 10.13" + }, + "peerDependencies": { + "react": ">= 16.8 || 18.0.0" + } + }, + "node_modules/react-ga4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz", + "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ==", + "license": "MIT" + }, + "node_modules/react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==", + "license": "MIT" + }, + "node_modules/react-select": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", + "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", + "license": "MIT", + "dependencies": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + }, + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0", + "react-dom": "^16.8.0 || ^17.0.0 || ^18.0.0" + } + }, + "node_modules/react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "license": "BSD-3-Clause", + "dependencies": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + }, + "peerDependencies": { + "react": ">=16.6.0", + "react-dom": ">=16.6.0" + } + }, "node_modules/read-cache": { "version": "1.0.0", "license": "MIT", @@ -21888,7 +22762,6 @@ "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true, "license": "MIT" }, "node_modules/regexp-ast-analysis": { @@ -22776,13 +23649,22 @@ }, "node_modules/safer-buffer": { "version": "2.1.2", - "devOptional": true, "license": "MIT" }, "node_modules/sax": { "version": "1.3.0", "license": "ISC" }, + "node_modules/scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "license": "MIT", + "peer": true, + "dependencies": { + "loose-envify": "^1.1.0" + } + }, "node_modules/scslre": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", @@ -23004,7 +23886,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, "license": "MIT", "dependencies": { "call-bind": "^1.0.7", @@ -23287,6 +24168,55 @@ "tslib": "^2.0.3" } }, + "node_modules/socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "license": "MIT", + "dependencies": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + }, + "engines": { + "node": ">=10.2.0" + } + }, + "node_modules/socket.io-adapter": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "license": "MIT", + "dependencies": { + "debug": "~4.3.4", + "ws": "~8.11.0" + } + }, + "node_modules/socket.io-adapter/node_modules/ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": "^5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, "node_modules/socket.io-client": { "version": "4.7.5", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", @@ -23911,6 +24841,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/superjson": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-1.13.3.tgz", + "integrity": "sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==", + "license": "MIT", + "dependencies": { + "copy-anything": "^3.0.2" + }, + "engines": { + "node": ">=10" + } + }, "node_modules/supports-color": { "version": "7.2.0", "license": "MIT", @@ -25687,6 +26629,15 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==", + "license": "MIT", + "engines": { + "node": ">= 0.8" + } + }, "node_modules/unplugin": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz", @@ -25925,6 +26876,20 @@ "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==", "license": "MIT" }, + "node_modules/use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "license": "MIT", + "peerDependencies": { + "react": "^16.8.0 || ^17.0.0 || ^18.0.0" + }, + "peerDependenciesMeta": { + "@types/react": { + "optional": true + } + } + }, "node_modules/util": { "version": "0.12.5", "license": "MIT", @@ -25940,6 +26905,15 @@ "version": "1.0.2", "license": "MIT" }, + "node_modules/utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, "node_modules/uuid": { "version": "9.0.1", "dev": true, @@ -27086,6 +28060,15 @@ "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", "license": "ISC" }, + "node_modules/yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==", + "license": "ISC", + "engines": { + "node": ">= 6" + } + }, "node_modules/yargs": { "version": "17.7.2", "license": "MIT", @@ -27247,7 +28230,7 @@ } }, "packages/d0xigen": { - "version": "0.2.9", + "version": "0.3.0", "dependencies": { "@d0rich/nuxt-content-mermaid": "*", "@d0rich/nuxt-design-system": "*", @@ -27271,7 +28254,7 @@ }, "packages/esprit-design": { "name": "@d0rich/esprit-design", - "version": "0.2.3", + "version": "0.3.0", "dependencies": { "@iconify/vue": "^4.1.2", "gsap": "^3.12.5", @@ -27464,7 +28447,7 @@ }, "packages/nuxt-content-mermaid": { "name": "@d0rich/nuxt-content-mermaid", - "version": "0.2.0", + "version": "0.3.0", "devDependencies": { "@nuxt/content": "^2.12.1", "@nuxtjs/color-mode": "^3.4.1", @@ -27475,7 +28458,7 @@ }, "packages/nuxt-design-system": { "name": "@d0rich/nuxt-design-system", - "version": "0.8.4", + "version": "0.9.0", "bundleDependencies": [ "@d0rich/esprit-design" ], @@ -27971,7 +28954,6 @@ "version": "7.24.7", "resolved": "https://registry.npmjs.org/@babel/runtime/-/runtime-7.24.7.tgz", "integrity": "sha512-UwgBRMjJP+xv857DCngvqXI3Iq6J4v0wXmwc6sapg+zyhbwmQX67LUEFrkK5tbyJ30jGuG3ZvWpBiB9LCy1kWw==", - "dev": true, "requires": { "regenerator-runtime": "^0.14.0" } @@ -28025,6 +29007,48 @@ "to-fast-properties": "^2.0.0" } }, + "@backroad/backroad": { + "version": "1.4.0-alpha.5", + "resolved": "https://registry.npmjs.org/@backroad/backroad/-/backroad-1.4.0-alpha.5.tgz", + "integrity": "sha512-uhOqzca08WWtEZRbmtgpcNTW6l2z4KMPafRyAc58TPz7l4EcmHU0shGbTPIUHYflhGYJYbwQNfrg9d0wL7lAPA==", + "requires": { + "@backroad/core": "1.4.0-alpha.5", + "@tanstack/react-table": "^8.10.6", + "express": "^4.18.1", + "fast-json-stable-stringify": "^2.1.0", + "formidable": "^3.5.1", + "lodash": "^4.17.21", + "react": "18.2.0", + "react-chartjs-2": "^5.2.0", + "react-dropzone": "^14.2.3", + "react-ga4": "^2.1.0", + "react-select": "^5.7.7", + "socket.io": "^4.7.2", + "superjson": "^1.13.1", + "tslib": "^2.3.0" + }, + "dependencies": { + "react": { + "version": "18.2.0", + "resolved": "https://registry.npmjs.org/react/-/react-18.2.0.tgz", + "integrity": "sha512-/3IjMdb2L9QbBdWiW5e3P2/npwMBaU9mHCSCUzNln0ZCYbcfTsGbTJrU/kGemdH2IWmB2ioZ+zkxtmq6g09fGQ==", + "requires": { + "loose-envify": "^1.1.0" + } + } + } + }, + "@backroad/core": { + "version": "1.4.0-alpha.5", + "resolved": "https://registry.npmjs.org/@backroad/core/-/core-1.4.0-alpha.5.tgz", + "integrity": "sha512-B8XtU8AMyihi5F6E0BxZc0j8jIbgojuC81g5iJUUvLpg78hZtjrxTotVZXxqy3hWFljYTHF4scmRqQvtwhJchw==", + "requires": { + "react-chartjs-2": "^5.2.0", + "react-select": "^5.7.7", + "socket.io": "^4.7.2", + "tslib": "^2.3.0" + } + }, "@braintree/sanitize-url": { "version": "6.0.4", "dev": true @@ -28807,6 +29831,15 @@ "integrity": "sha512-a7cxGcJ2wIlMFLlh8z2ONm+715QkPHiyJcxwQlKOz/03GPw1COpfhcmC9wm4xlZfp//jWHNNMwzjtqHXVWU9KA==", "requires": {} }, + "@d0rich/dog": { + "version": "file:apps/dog", + "requires": { + "@backroad/backroad": "^1.4.0-alpha.5", + "node-html-to-image": "^4.0.0", + "png-to-ico": "^2.1.8", + "typescript": "^5.4.5" + } + }, "@d0rich/esprit-design": { "version": "file:packages/esprit-design", "requires": { @@ -28941,6 +29974,123 @@ "nuxt-icon": "^0.6.10" } }, + "@emotion/babel-plugin": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/babel-plugin/-/babel-plugin-11.11.0.tgz", + "integrity": "sha512-m4HEDZleaaCH+XgDDsPF15Ht6wTLsgDTeR3WYj9Q/k76JtWhrJjcP4+/XlG8LGT/Rol9qUfOIztXeA84ATpqPQ==", + "requires": { + "@babel/helper-module-imports": "^7.16.7", + "@babel/runtime": "^7.18.3", + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/serialize": "^1.1.2", + "babel-plugin-macros": "^3.1.0", + "convert-source-map": "^1.5.0", + "escape-string-regexp": "^4.0.0", + "find-root": "^1.1.0", + "source-map": "^0.5.7", + "stylis": "4.2.0" + }, + "dependencies": { + "convert-source-map": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-1.9.0.tgz", + "integrity": "sha512-ASFBup0Mz1uyiIjANan1jzLQami9z1PoYSZCiiYW2FczPbenXc45FZdBZLzOT+r6+iciuEModtmCti+hjaAk0A==" + }, + "source-map": { + "version": "0.5.7", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.5.7.tgz", + "integrity": "sha512-LbrmJOMUSdEVxIKvdcJzQC+nQhe8FUZQTXQy6+I75skNgn3OoQ0DZA8YnFa7gp8tqtL3KPf1kmo0R5DoApeSGQ==" + }, + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + } + } + }, + "@emotion/cache": { + "version": "11.11.0", + "resolved": "https://registry.npmjs.org/@emotion/cache/-/cache-11.11.0.tgz", + "integrity": "sha512-P34z9ssTCBi3e9EI1ZsWpNHcfY1r09ZO0rZbRO2ob3ZQMnFI35jB536qoXbkdesr5EUhYi22anuEJuyxifaqAQ==", + "requires": { + "@emotion/memoize": "^0.8.1", + "@emotion/sheet": "^1.2.2", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "stylis": "4.2.0" + }, + "dependencies": { + "stylis": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/stylis/-/stylis-4.2.0.tgz", + "integrity": "sha512-Orov6g6BB1sDfYgzWfTHDOxamtX1bE/zo104Dh9e6fqJ3PooipYyfJ0pUmrZO2wAvO8YbEyeFrkV91XTsGMSrw==" + } + } + }, + "@emotion/hash": { + "version": "0.9.1", + "resolved": "https://registry.npmjs.org/@emotion/hash/-/hash-0.9.1.tgz", + "integrity": "sha512-gJB6HLm5rYwSLI6PQa+X1t5CFGrv1J1TWG+sOyMCeKz2ojaj6Fnl/rZEspogG+cvqbt4AE/2eIyD2QfLKTBNlQ==" + }, + "@emotion/memoize": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/memoize/-/memoize-0.8.1.tgz", + "integrity": "sha512-W2P2c/VRW1/1tLox0mVUalvnWXxavmv/Oum2aPsRcoDJuob75FC3Y8FbpfLwUegRcxINtGUMPq0tFCvYNTBXNA==" + }, + "@emotion/react": { + "version": "11.11.4", + "resolved": "https://registry.npmjs.org/@emotion/react/-/react-11.11.4.tgz", + "integrity": "sha512-t8AjMlF0gHpvvxk5mAtCqR4vmxiGHCeJBaQO6gncUSdklELOgtwjerNY2yuJNfwnc6vi16U/+uMF+afIawJ9iw==", + "requires": { + "@babel/runtime": "^7.18.3", + "@emotion/babel-plugin": "^11.11.0", + "@emotion/cache": "^11.11.0", + "@emotion/serialize": "^1.1.3", + "@emotion/use-insertion-effect-with-fallbacks": "^1.0.1", + "@emotion/utils": "^1.2.1", + "@emotion/weak-memoize": "^0.3.1", + "hoist-non-react-statics": "^3.3.1" + } + }, + "@emotion/serialize": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/@emotion/serialize/-/serialize-1.1.4.tgz", + "integrity": "sha512-RIN04MBT8g+FnDwgvIUi8czvr1LU1alUMI05LekWB5DGyTm8cCBMCRpq3GqaiyEDRptEXOyXnvZ58GZYu4kBxQ==", + "requires": { + "@emotion/hash": "^0.9.1", + "@emotion/memoize": "^0.8.1", + "@emotion/unitless": "^0.8.1", + "@emotion/utils": "^1.2.1", + "csstype": "^3.0.2" + } + }, + "@emotion/sheet": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/@emotion/sheet/-/sheet-1.2.2.tgz", + "integrity": "sha512-0QBtGvaqtWi+nx6doRwDdBIzhNdZrXUppvTM4dtZZWEGTXL/XE/yJxLMGlDT1Gt+UHH5IX1n+jkXyytE/av7OA==" + }, + "@emotion/unitless": { + "version": "0.8.1", + "resolved": "https://registry.npmjs.org/@emotion/unitless/-/unitless-0.8.1.tgz", + "integrity": "sha512-KOEGMu6dmJZtpadb476IsZBclKvILjopjUii3V+7MnXIQCYh8W3NgNcgwo21n9LXZX6EDIKvqfjYxXebDwxKmQ==" + }, + "@emotion/use-insertion-effect-with-fallbacks": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/@emotion/use-insertion-effect-with-fallbacks/-/use-insertion-effect-with-fallbacks-1.0.1.tgz", + "integrity": "sha512-jT/qyKZ9rzLErtrjGgdkMBn2OP8wl0G3sQlBb3YPryvKHsjvINUhVaPFfP+fpBcOkmrVOVEEHQFJ7nbj2TH2gw==", + "requires": {} + }, + "@emotion/utils": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/@emotion/utils/-/utils-1.2.1.tgz", + "integrity": "sha512-Y2tGf3I+XVnajdItskUCn6LX+VUDmP6lTL4fcqsXAv43dnlbZiuW4MWQW38rW/BVWSE7Q/7+XQocmpnRYILUmg==" + }, + "@emotion/weak-memoize": { + "version": "0.3.1", + "resolved": "https://registry.npmjs.org/@emotion/weak-memoize/-/weak-memoize-0.3.1.tgz", + "integrity": "sha512-EsBwpc7hBUJWAsNPBmJy4hxWx12v6bshQsldrVmjxJoc3isbxhOrF2IcCpaXxfvq03NwkI7sbsOLXbYuqF/8Ww==" + }, "@es-joy/jsdoccomment": { "version": "0.43.1", "resolved": "https://registry.npmjs.org/@es-joy/jsdoccomment/-/jsdoccomment-0.43.1.tgz", @@ -29142,7 +30292,6 @@ "version": "1.6.2", "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", - "peer": true, "requires": { "@floating-ui/utils": "^0.2.0" } @@ -29151,7 +30300,6 @@ "version": "1.1.1", "resolved": "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.1.1.tgz", "integrity": "sha512-TpIO93+DIujg3g7SykEAGZMDtbJRrmnYRCNYSjJlvIbGhBjRSNTLVbNeDQBrzy9qDgUbiWdc7KA0uZHZ2tJmiw==", - "peer": true, "requires": { "@floating-ui/core": "^1.1.0" } @@ -29159,8 +30307,7 @@ "@floating-ui/utils": { "version": "0.2.2", "resolved": "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.2.tgz", - "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==", - "peer": true + "integrity": "sha512-J4yDIIthosAsRZ5CPYP/jQvUAQtlZTTD/4suA08/FEnlxqW3sKS9iAhgsa9VYLZ6vDHn/ixJgIqRQPotoBjxIw==" }, "@humanwhocodes/config-array": { "version": "0.11.14", @@ -29322,6 +30469,12 @@ "path-to-regexp": "^6.2.1" } }, + "@kurkle/color": { + "version": "0.3.2", + "resolved": "https://registry.npmjs.org/@kurkle/color/-/color-0.3.2.tgz", + "integrity": "sha512-fuscdXJ9G1qb7W8VdHi+IwRqij3lBkosAm4ydQtEmbY58OzHXqQhvlxqEkoz0yssNVn38bcpRWgA9PP+OGoisw==", + "peer": true + }, "@kwsites/file-exists": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/@kwsites/file-exists/-/file-exists-1.1.1.tgz", @@ -31636,6 +32789,19 @@ } } }, + "@tanstack/react-table": { + "version": "8.17.3", + "resolved": "https://registry.npmjs.org/@tanstack/react-table/-/react-table-8.17.3.tgz", + "integrity": "sha512-5gwg5SvPD3lNAXPuJJz1fOCEZYk9/GeBFH3w/hCgnfyszOIzwkwgp5I7Q4MJtn0WECp84b5STQUDdmvGi8m3nA==", + "requires": { + "@tanstack/table-core": "8.17.3" + } + }, + "@tanstack/table-core": { + "version": "8.17.3", + "resolved": "https://registry.npmjs.org/@tanstack/table-core/-/table-core-8.17.3.tgz", + "integrity": "sha512-mPBodDGVL+fl6d90wUREepHa/7lhsghg2A3vFpakEhrhtbIlgNAZiMr7ccTgak5qbHqF14Fwy+W1yFWQt+WmYQ==" + }, "@tootallnate/quickjs-emscripten": { "version": "0.23.0", "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", @@ -31705,6 +32871,19 @@ "resolved": "https://registry.npmjs.org/@types/aws-lambda/-/aws-lambda-8.10.138.tgz", "integrity": "sha512-71EHMl70TPWIAsFuHd85NHq6S6T2OOjiisPTrH7RgcjzpJpPh4RQJv7PvVvIxc6PIp8CLV7F9B+TdjcAES5vcA==" }, + "@types/cookie": { + "version": "0.4.1", + "resolved": "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz", + "integrity": "sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q==" + }, + "@types/cors": { + "version": "2.8.17", + "resolved": "https://registry.npmjs.org/@types/cors/-/cors-2.8.17.tgz", + "integrity": "sha512-8CGDvrBj1zgo2qE+oS3pOCyYNqCPryMWY2bGfwA0dcfopWGgxs+78df0Rs3rc9THP4JkOhLsAa+15VdpAqkcUA==", + "requires": { + "@types/node": "*" + } + }, "@types/d3-scale": { "version": "4.0.6", "dev": true, @@ -31798,6 +32977,33 @@ "version": "2.4.3", "dev": true }, + "@types/parse-json": { + "version": "4.0.2", + "resolved": "https://registry.npmjs.org/@types/parse-json/-/parse-json-4.0.2.tgz", + "integrity": "sha512-dISoDXWWQwUquiKsyZ4Ng+HX2KsPL7LyHKHQwgGFEA3IaKac4Obd+h2a/a6waisAoepJlBcx9paWqjA8/HVjCw==" + }, + "@types/prop-types": { + "version": "15.7.12", + "resolved": "https://registry.npmjs.org/@types/prop-types/-/prop-types-15.7.12.tgz", + "integrity": "sha512-5zvhXYtRNRluoE/jAp4GVsSduVUzNWKkOZrCDBWYtE7biZywwdC2AcEzg+cSMLFRfVgeAFqpfNabiPjxFddV1Q==" + }, + "@types/react": { + "version": "18.3.3", + "resolved": "https://registry.npmjs.org/@types/react/-/react-18.3.3.tgz", + "integrity": "sha512-hti/R0pS0q1/xx+TsI73XIqk26eBsISZ2R0wUijXIngRK9R/e7Xw/cXVxQK7R5JjW+SV4zGcn5hXjudkN/pLIw==", + "requires": { + "@types/prop-types": "*", + "csstype": "^3.0.2" + } + }, + "@types/react-transition-group": { + "version": "4.4.10", + "resolved": "https://registry.npmjs.org/@types/react-transition-group/-/react-transition-group-4.4.10.tgz", + "integrity": "sha512-hT/+s0VQs2ojCX823m60m5f0sL5idt9SO6Tj6Dg+rdphGPIeJbJ6CxvBYkgkGKrYeDjvIpKTR38UzmtHJOGW3Q==", + "requires": { + "@types/react": "*" + } + }, "@types/resolve": { "version": "1.20.2" }, @@ -33187,6 +34393,11 @@ "is-array-buffer": "^3.0.4" } }, + "array-flatten": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", + "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + }, "array-union": { "version": "2.1.0", "dev": true @@ -33221,6 +34432,11 @@ "version": "1.0.1", "dev": true }, + "asap": { + "version": "2.0.6", + "resolved": "https://registry.npmjs.org/asap/-/asap-2.0.6.tgz", + "integrity": "sha512-BSHWgDSAiKs50o2Re8ppvp3seVHXSRM44cdSsT9FfNEUUZLOGWVCsiWaRPWM1Znn+mqZ1OfVZ3z3DWEzSp7hRA==" + }, "assert": { "version": "2.1.0", "requires": { @@ -33284,6 +34500,11 @@ "resolved": "https://registry.npmjs.org/at-least-node/-/at-least-node-1.0.0.tgz", "integrity": "sha512-+q/t7Ekv1EDY2l6Gda6LLiX14rU9TV20Wa3ofeQmwPFZbOMo9DXrLbOjFaaclkXKWidIaopwAObQDqwWtGUjqg==" }, + "attr-accept": { + "version": "2.2.2", + "resolved": "https://registry.npmjs.org/attr-accept/-/attr-accept-2.2.2.tgz", + "integrity": "sha512-7prDjvt9HmqiZ0cl5CRjtS84sEyhsHP2coDkaZKRKVfCDo9s7iw7ChVmar78Gu9pC4SoR/28wFu/G5JJhTnqEg==" + }, "autoprefixer": { "version": "10.4.19", "resolved": "https://registry.npmjs.org/autoprefixer/-/autoprefixer-10.4.19.tgz", @@ -33308,6 +34529,30 @@ "b4a": { "version": "1.6.4" }, + "babel-plugin-macros": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/babel-plugin-macros/-/babel-plugin-macros-3.1.0.tgz", + "integrity": "sha512-Cg7TFGpIr01vOQNODXOOaGz2NpCU5gl8x1qJFbb6hbZxR7XrcE2vtbAsTAbJ7/xwJtUuJEw8K8Zr/AE0LHlesg==", + "requires": { + "@babel/runtime": "^7.12.5", + "cosmiconfig": "^7.0.0", + "resolve": "^1.19.0" + }, + "dependencies": { + "cosmiconfig": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-7.1.0.tgz", + "integrity": "sha512-AdmX6xUzdNASswsFtmwSt7Vj8po9IuqXm0UXz7QKPuEUmPB4XyjGfaAr2PSuELMwkRMVH1EpIkX5bTZGRB3eCA==", + "requires": { + "@types/parse-json": "^4.0.0", + "import-fresh": "^3.2.1", + "parse-json": "^5.0.0", + "path-type": "^4.0.0", + "yaml": "^1.10.0" + } + } + } + }, "bail": { "version": "2.0.2" }, @@ -33362,6 +34607,11 @@ "base64-js": { "version": "1.5.1" }, + "base64id": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/base64id/-/base64id-2.0.0.tgz", + "integrity": "sha512-lGe34o6EHj9y3Kts9R4ZYs/Gr+6N7MCaMlIFA3F1R2O5/m7K06AxfSeO5530PEERE6/WyEg3lsuyw4GHlPZHog==" + }, "basic-ftp": { "version": "5.0.5", "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", @@ -33397,6 +34647,40 @@ "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz", "integrity": "sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==" }, + "body-parser": { + "version": "1.20.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", + "integrity": "sha512-ml9pReCu3M61kGlqoTm2umSXTlRTuGTx0bfYj+uIUKKYycG5NtSbeetV3faSU6R7ajOPw0g/J1PvK4qNy7s5bA==", + "requires": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "2.6.9", + "depd": "2.0.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "2.5.2", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, "boolbase": { "version": "1.0.0" }, @@ -33460,6 +34744,11 @@ "run-applescript": "^7.0.0" } }, + "bytes": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.2.tgz", + "integrity": "sha512-/Nf7TyzTx6S3yRJObOAV7956r8cr2+Oj8AC5dt8wSP3BQAoeX58NoHyCU8P8zGkNXStjTSi6fzO6F0pBdcYbEg==" + }, "c12": { "version": "1.11.1", "resolved": "https://registry.npmjs.org/c12/-/c12-1.11.1.tgz", @@ -33681,6 +34970,15 @@ "version": "0.7.0", "dev": true }, + "chart.js": { + "version": "4.4.3", + "resolved": "https://registry.npmjs.org/chart.js/-/chart.js-4.4.3.tgz", + "integrity": "sha512-qK1gkGSRYcJzqrrzdR6a+I0vQ4/R+SoODXyAjscQ/4mzuNzySaMCd+hyVxitSY1+L2fjPD1Gbn+ibNqRmwQeLw==", + "peer": true, + "requires": { + "@kurkle/color": "^0.3.0" + } + }, "chokidar": { "version": "3.6.0", "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", @@ -33946,11 +35244,21 @@ "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, + "cookie": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", + "integrity": "sha512-U71cyTamuh1CRNCfpGY6to28lxvNwPG4Guz/EVjgf3Jmzv0vlDp1atT9eS5dDjMYHucpHbWns6Lwf3BKz6svdw==" + }, "cookie-es": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.1.0.tgz", "integrity": "sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==" }, + "cookie-signature": { + "version": "1.0.6", + "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", + "integrity": "sha512-QADzlaHc8icV8I7vbaJXJwod9HWYp8uCqf1xa4OfNu1T7JVxQIrUgOWtHdNDtPiywmFbiS12VjotIXLrKM3orQ==" + }, "cookies": { "version": "0.9.1", "resolved": "https://registry.npmjs.org/cookies/-/cookies-0.9.1.tgz", @@ -33960,6 +35268,14 @@ "keygrip": "~1.1.0" } }, + "copy-anything": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/copy-anything/-/copy-anything-3.0.5.tgz", + "integrity": "sha512-yCEafptTtb4bk7GLEQoM8KVJpxAfdBJYaXyzQEgQQQgYrZiDp8SJmGKlYza6CYjEDNstAdNdKA3UuoULlEbS6w==", + "requires": { + "is-what": "^4.1.8" + } + }, "core-js-compat": { "version": "3.37.1", "resolved": "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.37.1.tgz", @@ -33974,6 +35290,15 @@ "resolved": "https://registry.npmjs.org/core-util-is/-/core-util-is-1.0.3.tgz", "integrity": "sha512-ZQBvi1DcpJ4GDqanjucZ2Hj3wEO5pZDS89BWbkcrvdxksJorwUDDZamX9ldFkp9aw2lmBDLgkObEA4DWNJ9FYQ==" }, + "cors": { + "version": "2.8.5", + "resolved": "https://registry.npmjs.org/cors/-/cors-2.8.5.tgz", + "integrity": "sha512-KIHbLJqu73RGr/hnbrO9uBeixNGuvSQjul/jdFvS/KFSIH1hWVd1ng7zOHx+YrEfInLG7q4n6GHQ9cDtxv/P6g==", + "requires": { + "object-assign": "^4", + "vary": "^1" + } + }, "cose-base": { "version": "1.0.3", "dev": true, @@ -34892,6 +36217,15 @@ "integrity": "sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg==", "peer": true }, + "dezalgo": { + "version": "1.0.4", + "resolved": "https://registry.npmjs.org/dezalgo/-/dezalgo-1.0.4.tgz", + "integrity": "sha512-rXSP0bf+5n0Qonsb+SVVfNfIsimO4HEtmnIpPHY8Q1UCzKlQrDMfdobr8nJOOsRgWCyMRqeSBQzmWUMq7zvVig==", + "requires": { + "asap": "^2.0.0", + "wrappy": "1" + } + }, "didyoumean": { "version": "1.2.2" }, @@ -34908,6 +36242,15 @@ "dlv": { "version": "1.1.3" }, + "dom-helpers": { + "version": "5.2.1", + "resolved": "https://registry.npmjs.org/dom-helpers/-/dom-helpers-5.2.1.tgz", + "integrity": "sha512-nRCa7CK3VTrM2NmGkIy4cbK7IZlgBE/PYMn55rrXefr5xXDP0LdtfPnblFDoVdcAfslJ7or6iqAUnx0CCGIWQA==", + "requires": { + "@babel/runtime": "^7.8.7", + "csstype": "^3.0.2" + } + }, "dom-serializer": { "version": "2.0.0", "requires": { @@ -35022,6 +36365,36 @@ "once": "^1.4.0" } }, + "engine.io": { + "version": "6.5.4", + "resolved": "https://registry.npmjs.org/engine.io/-/engine.io-6.5.4.tgz", + "integrity": "sha512-KdVSDKhVKyOi+r5uEabrDLZw2qXStVvCsEB/LN3mw4WFi6Gx50jTyuxYVCwAAC0U46FdnzP/ScKRBTXb/NiEOg==", + "requires": { + "@types/cookie": "^0.4.1", + "@types/cors": "^2.8.12", + "@types/node": ">=10.0.0", + "accepts": "~1.3.4", + "base64id": "2.0.0", + "cookie": "~0.4.1", + "cors": "~2.8.5", + "debug": "~4.3.1", + "engine.io-parser": "~5.2.1", + "ws": "~8.11.0" + }, + "dependencies": { + "cookie": { + "version": "0.4.2", + "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.2.tgz", + "integrity": "sha512-aSWTXFzaKWkvHO1Ny/s+ePFpvKsPnjc551iI41v3ny/ow6tBG5Vd+FuqGNhh1LxOmVzOlGUriIlOaokOvhaStA==" + }, + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, "engine.io-client": { "version": "6.5.2", "requires": { @@ -35347,8 +36720,7 @@ "version": "1.0.3" }, "escape-string-regexp": { - "version": "4.0.0", - "devOptional": true + "version": "4.0.0" }, "escodegen": { "version": "2.1.0", @@ -35868,6 +37240,64 @@ "resolved": "https://registry.npmjs.org/exponential-backoff/-/exponential-backoff-3.1.1.tgz", "integrity": "sha512-dX7e/LHVJ6W3DE1MHWi9S1EYzDESENfLrYohG2G++ovZrYOkm4Knwa0mc1cn84xJOR4KEU0WSchhLbd0UklbHw==" }, + "express": { + "version": "4.19.2", + "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", + "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "requires": { + "accepts": "~1.3.8", + "array-flatten": "1.1.1", + "body-parser": "1.20.2", + "content-disposition": "0.5.4", + "content-type": "~1.0.4", + "cookie": "0.6.0", + "cookie-signature": "1.0.6", + "debug": "2.6.9", + "depd": "2.0.0", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "etag": "~1.8.1", + "finalhandler": "1.2.0", + "fresh": "0.5.2", + "http-errors": "2.0.0", + "merge-descriptors": "1.0.1", + "methods": "~1.1.2", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "path-to-regexp": "0.1.7", + "proxy-addr": "~2.0.7", + "qs": "6.11.0", + "range-parser": "~1.2.1", + "safe-buffer": "5.2.1", + "send": "0.18.0", + "serve-static": "1.15.0", + "setprototypeof": "1.2.0", + "statuses": "2.0.1", + "type-is": "~1.6.18", + "utils-merge": "1.0.1", + "vary": "~1.1.2" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + }, + "path-to-regexp": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", + "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + } + } + }, "extend": { "version": "3.0.2" }, @@ -35946,8 +37376,7 @@ } }, "fast-json-stable-stringify": { - "version": "2.1.0", - "devOptional": true + "version": "2.1.0" }, "fast-levenshtein": { "version": "2.0.6", @@ -35974,6 +37403,14 @@ "flat-cache": "^3.0.4" } }, + "file-selector": { + "version": "0.6.0", + "resolved": "https://registry.npmjs.org/file-selector/-/file-selector-0.6.0.tgz", + "integrity": "sha512-QlZ5yJC0VxHxQQsQhXvBaC7VRJ2uaxTf+Tfpu4Z/OcVQJVpZO+DGU0rkoVW5ce2SccxugvpBJoMvUs59iILYdw==", + "requires": { + "tslib": "^2.4.0" + } + }, "file-uri-to-path": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/file-uri-to-path/-/file-uri-to-path-1.0.0.tgz", @@ -35985,6 +37422,40 @@ "to-regex-range": "^5.0.1" } }, + "finalhandler": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.2.0.tgz", + "integrity": "sha512-5uXcUVftlQMFnWC9qu/svkWv3GTd2PfUhK/3PLkYNAe7FbqJMt3515HaxE6eRL74GdsriiwujiawdaB1BpEISg==", + "requires": { + "debug": "2.6.9", + "encodeurl": "~1.0.2", + "escape-html": "~1.0.3", + "on-finished": "2.4.1", + "parseurl": "~1.3.3", + "statuses": "2.0.1", + "unpipe": "~1.0.0" + }, + "dependencies": { + "debug": { + "version": "2.6.9", + "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", + "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "requires": { + "ms": "2.0.0" + } + }, + "ms": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", + "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" + } + } + }, + "find-root": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/find-root/-/find-root-1.1.0.tgz", + "integrity": "sha512-NKfW6bec6GfKc0SGx1e07QZY9PE99u0Bft/0rzSD5k3sO/vwkVUpDUKVm5Gpp5Ue3YfShPFTX2070tDs5kB9Ng==" + }, "find-up": { "version": "5.0.0", "requires": { @@ -36057,6 +37528,21 @@ } } }, + "formidable": { + "version": "3.5.1", + "resolved": "https://registry.npmjs.org/formidable/-/formidable-3.5.1.tgz", + "integrity": "sha512-WJWKelbRHN41m5dumb0/k8TeAx7Id/y3a+Z7QfhxP/htI9Js5zYaEDtG8uMgG0vM0lOlqnmjE99/kfpOYi/0Og==", + "requires": { + "dezalgo": "^1.0.4", + "hexoid": "^1.0.0", + "once": "^1.4.0" + } + }, + "forwarded": { + "version": "0.2.0", + "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.2.0.tgz", + "integrity": "sha512-buRG0fpBtRHSTCOASe6hD258tEubFoRLb4ZNA6NxMVHNw2gOcwHo9wyablzMzOA5z9xA9L1KNjk/Nt6MT9aYow==" + }, "fraction.js": { "version": "4.3.7" }, @@ -36547,6 +38033,19 @@ "version": "0.2.7", "dev": true }, + "hexoid": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/hexoid/-/hexoid-1.0.0.tgz", + "integrity": "sha512-QFLV0taWQOZtvIRIAdBChesmogZrtuXvVWsFHZTk2SU+anspqZ2vMnoLg7IE1+Uk16N19APic1BuF8bC8c2m5g==" + }, + "hoist-non-react-statics": { + "version": "3.3.2", + "resolved": "https://registry.npmjs.org/hoist-non-react-statics/-/hoist-non-react-statics-3.3.2.tgz", + "integrity": "sha512-/gGivxi8JPKWNm/W0jSmzcMPpfpPLc3dY/6GxhX2hQ9iGj3aDfklV4ET7NjKpSinLpJ5vafa9iiGIEZg10SfBw==", + "requires": { + "react-is": "^16.7.0" + } + }, "hookable": { "version": "5.5.3" }, @@ -36651,7 +38150,6 @@ }, "iconv-lite": { "version": "0.4.24", - "dev": true, "requires": { "safer-buffer": ">= 2.1.2 < 3" } @@ -36758,6 +38256,11 @@ "standard-as-callback": "^2.1.0" } }, + "ipaddr.js": { + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.1.tgz", + "integrity": "sha512-0KI/607xoxSToH7GjN1FfSbLoU0+btTicjsQSWQlh/hZykN8KpmMf7uYwPW3R+akZ6R/w18ZlXSHBYXiYUPO3g==" + }, "iron-webcrypto": { "version": "1.0.0" }, @@ -37026,6 +38529,11 @@ "call-bind": "^1.0.2" } }, + "is-what": { + "version": "4.1.16", + "resolved": "https://registry.npmjs.org/is-what/-/is-what-4.1.16.tgz", + "integrity": "sha512-ZhMwEosbFJkA0YhFnNDgTM4ZxDRsS6HqTo7qsZM08fehyRYIYa0yHu5R6mgo1n/8MgaPBXiPimPD77baVFYg+A==" + }, "is-windows": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/is-windows/-/is-windows-1.0.2.tgz", @@ -37503,6 +39011,14 @@ "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", "integrity": "sha512-9Ri+o0JYgehTaVBBDoMqIl8GXtbWg711O3srftcHhZ0dqnETqLaoIK0x17fUw9rFSlK/0NlsKe0Ahhyl5pXE2g==" }, + "loose-envify": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/loose-envify/-/loose-envify-1.4.0.tgz", + "integrity": "sha512-lyuxPGr/Wfhrlem2CL/UcnUc1zcqKAImBDzukY7Y5F/yQiNdko6+fRLevlw1HgMySw7f611UIY408EtxRSoK3Q==", + "requires": { + "js-tokens": "^3.0.0 || ^4.0.0" + } + }, "lower-case": { "version": "2.0.2", "requires": { @@ -38261,6 +39777,16 @@ "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", "integrity": "sha512-dq+qelQ9akHpcOl/gUVRTxVIOkAJ1wR3QAvb4RsVjS8oVoFjDGTc679wJYmUmknUF5HwMLOgb5O+a3KxfWapPQ==" }, + "memoize-one": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/memoize-one/-/memoize-one-6.0.0.tgz", + "integrity": "sha512-rkpe71W0N0c0Xz6QD0eJETuWAJGnJ9afsl1srmwPrI+yBCkge5EycXXbYRyvL29zZVUWQCY7InPRCv3GDXuZNw==" + }, + "merge-descriptors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", + "integrity": "sha512-cCi6g3/Zr1iqQi6ySbseM1Xvooa98N0w31jzUYrXPX2xqObmFGHJ0tQ5u74H3mVh7wLouTseZyYIq39g8cNp1w==" + }, "merge-stream": { "version": "2.0.0" }, @@ -39939,8 +41465,7 @@ "object-inspect": { "version": "1.13.1", "resolved": "https://registry.npmjs.org/object-inspect/-/object-inspect-1.13.1.tgz", - "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==", - "dev": true + "integrity": "sha512-5qoj1RUiKOMsCCNLV1CBiPYE10sziTsnmNxkAI/rZhiD63CF7IqdFGC/XzjWjpSgLf0LxXX3bDFIh0E18f6UhQ==" }, "object-is": { "version": "1.1.5", @@ -40433,6 +41958,8 @@ }, "png-to-ico": { "version": "2.1.8", + "resolved": "https://registry.npmjs.org/png-to-ico/-/png-to-ico-2.1.8.tgz", + "integrity": "sha512-Nf+IIn/cZ/DIZVdGveJp86NG5uNib1ZXMiDd/8x32HCTeKSvgpyg6D/6tUBn1QO/zybzoMK0/mc3QRgAyXdv9w==", "requires": { "@types/node": "^17.0.36", "minimist": "^1.2.6", @@ -40829,6 +42356,16 @@ "sisteransi": "^1.0.5" } }, + "prop-types": { + "version": "15.8.1", + "resolved": "https://registry.npmjs.org/prop-types/-/prop-types-15.8.1.tgz", + "integrity": "sha512-oj87CgZICdulUohogVAR7AjlC0327U4el4L6eAvOqCeudMDVU0NThNaV+b9Df4dXgSP1gXMTnPdhfe/2qDH5cg==", + "requires": { + "loose-envify": "^1.4.0", + "object-assign": "^4.1.1", + "react-is": "^16.13.1" + } + }, "property-information": { "version": "6.5.0", "resolved": "https://registry.npmjs.org/property-information/-/property-information-6.5.0.tgz", @@ -40839,6 +42376,15 @@ "resolved": "https://registry.npmjs.org/protocols/-/protocols-2.0.1.tgz", "integrity": "sha512-/XJ368cyBJ7fzLMwLKv1e4vLxOju2MNAIokcr7meSaNcVbWz/CPcW22cP04mwxOErdA5mwjA8Q6w/cdAQxVn7Q==" }, + "proxy-addr": { + "version": "2.0.7", + "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.7.tgz", + "integrity": "sha512-llQsMLSUDUPT44jdrU/O37qlnifitDP+ZwrmmZcoSKyLKvtZxpyV0n2/bD/N4tBAAZ/gJEdZU7KMraoK1+XYAg==", + "requires": { + "forwarded": "0.2.0", + "ipaddr.js": "1.9.1" + } + }, "proxy-agent": { "version": "6.4.0", "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", @@ -40925,6 +42471,14 @@ } } }, + "qs": { + "version": "6.11.0", + "resolved": "https://registry.npmjs.org/qs/-/qs-6.11.0.tgz", + "integrity": "sha512-MvjoMCJwEarSbUYk5O+nmoSzSutSsTwF85zcHPQ9OrlFoZOYIjaqBAJIqIXjptyD5vThxGq52Xu/MaJzRkIk4Q==", + "requires": { + "side-channel": "^1.0.4" + } + }, "queue-microtask": { "version": "1.2.3" }, @@ -40951,6 +42505,17 @@ "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" }, + "raw-body": { + "version": "2.5.2", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.5.2.tgz", + "integrity": "sha512-8zGqypfENjCIqGhgXToC8aB2r7YrBX+AQAfIPs/Mlk+BtPTztOvTS01NRW/3Eh60J+a48lt8qsCzirQ6loCVfA==", + "requires": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.4.24", + "unpipe": "1.0.0" + } + }, "rc9": { "version": "2.1.2", "resolved": "https://registry.npmjs.org/rc9/-/rc9-2.1.2.tgz", @@ -40960,6 +42525,78 @@ "destr": "^2.0.3" } }, + "react": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react/-/react-18.3.1.tgz", + "integrity": "sha512-wS+hAgJShR0KhEvPJArfuPVN1+Hz1t0Y6n5jLrGQbkb4urgPE/0Rve+1kMB1v/oWgHgm4WIcV+i7F2pTVj+2iQ==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, + "react-chartjs-2": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/react-chartjs-2/-/react-chartjs-2-5.2.0.tgz", + "integrity": "sha512-98iN5aguJyVSxp5U3CblRLH67J8gkfyGNbiK3c+l1QI/G4irHMPQw44aEPmjVag+YKTyQ260NcF82GTQ3bdscA==", + "requires": {} + }, + "react-dom": { + "version": "18.3.1", + "resolved": "https://registry.npmjs.org/react-dom/-/react-dom-18.3.1.tgz", + "integrity": "sha512-5m4nQKp+rZRb09LNH59GM4BxTh9251/ylbKIbpe7TpGxfJ+9kv6BLkLBXIjjspbgbnIBNqlI23tRnTWT0snUIw==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0", + "scheduler": "^0.23.2" + } + }, + "react-dropzone": { + "version": "14.2.3", + "resolved": "https://registry.npmjs.org/react-dropzone/-/react-dropzone-14.2.3.tgz", + "integrity": "sha512-O3om8I+PkFKbxCukfIR3QAGftYXDZfOE2N1mr/7qebQJHs7U+/RSL/9xomJNpRg9kM5h9soQSdf0Gc7OHF5Fug==", + "requires": { + "attr-accept": "^2.2.2", + "file-selector": "^0.6.0", + "prop-types": "^15.8.1" + } + }, + "react-ga4": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/react-ga4/-/react-ga4-2.1.0.tgz", + "integrity": "sha512-ZKS7PGNFqqMd3PJ6+C2Jtz/o1iU9ggiy8Y8nUeksgVuvNISbmrQtJiZNvC/TjDsqD0QlU5Wkgs7i+w9+OjHhhQ==" + }, + "react-is": { + "version": "16.13.1", + "resolved": "https://registry.npmjs.org/react-is/-/react-is-16.13.1.tgz", + "integrity": "sha512-24e6ynE2H+OKt4kqsOvNd8kBpV65zoxbA4BVsEOB3ARVWQki/DHzaUoC5KuON/BiccDaCCTZBuOcfZs70kR8bQ==" + }, + "react-select": { + "version": "5.8.0", + "resolved": "https://registry.npmjs.org/react-select/-/react-select-5.8.0.tgz", + "integrity": "sha512-TfjLDo58XrhP6VG5M/Mi56Us0Yt8X7xD6cDybC7yoRMUNm7BGO7qk8J0TLQOua/prb8vUOtsfnXZwfm30HGsAA==", + "requires": { + "@babel/runtime": "^7.12.0", + "@emotion/cache": "^11.4.0", + "@emotion/react": "^11.8.1", + "@floating-ui/dom": "^1.0.1", + "@types/react-transition-group": "^4.4.0", + "memoize-one": "^6.0.0", + "prop-types": "^15.6.0", + "react-transition-group": "^4.3.0", + "use-isomorphic-layout-effect": "^1.1.2" + } + }, + "react-transition-group": { + "version": "4.4.5", + "resolved": "https://registry.npmjs.org/react-transition-group/-/react-transition-group-4.4.5.tgz", + "integrity": "sha512-pZcd1MCJoiKiBR2NRxeCRg13uCXbydPnmB4EOeRrY7480qNWO8IIgQG6zlDkm6uRMsURXPuKq0GWtiM59a5Q6g==", + "requires": { + "@babel/runtime": "^7.5.5", + "dom-helpers": "^5.0.1", + "loose-envify": "^1.4.0", + "prop-types": "^15.6.2" + } + }, "read-cache": { "version": "1.0.0", "requires": { @@ -41152,8 +42789,7 @@ "regenerator-runtime": { "version": "0.14.1", "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.14.1.tgz", - "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==", - "dev": true + "integrity": "sha512-dYnhHh0nJoMfnkZs6GmmhFknAGRrLznOu5nc9ML+EJxGvrx6H7teuevqVqCuPcPK//3eDrrjQhehXVx9cnkGdw==" }, "regexp-ast-analysis": { "version": "0.7.1", @@ -41688,12 +43324,20 @@ } }, "safer-buffer": { - "version": "2.1.2", - "devOptional": true + "version": "2.1.2" }, "sax": { "version": "1.3.0" }, + "scheduler": { + "version": "0.23.2", + "resolved": "https://registry.npmjs.org/scheduler/-/scheduler-0.23.2.tgz", + "integrity": "sha512-UOShsPwz7NrMUqhR6t0hWjFduvOzbtv7toDH1/hIrfRNIDBnnBWd0CwJTGvTpngVlmwGCdP9/Zl/tVrDqcuYzQ==", + "peer": true, + "requires": { + "loose-envify": "^1.1.0" + } + }, "scslre": { "version": "0.3.0", "resolved": "https://registry.npmjs.org/scslre/-/scslre-0.3.0.tgz", @@ -41861,7 +43505,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/side-channel/-/side-channel-1.0.6.tgz", "integrity": "sha512-fDW/EZ6Q9RiO8eFG8Hj+7u/oW+XrPTIChwCOM2+th2A6OblDtYYIpve9m+KvI9Z4C9qSEXlaGR6bTEYHReuglA==", - "dev": true, "requires": { "call-bind": "^1.0.7", "es-errors": "^1.3.0", @@ -42051,6 +43694,37 @@ "tslib": "^2.0.3" } }, + "socket.io": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/socket.io/-/socket.io-4.7.5.tgz", + "integrity": "sha512-DmeAkF6cwM9jSfmp6Dr/5/mfMwb5Z5qRrSXLpo3Fq5SqyU8CMF15jIN4ZhfSwu35ksM1qmHZDQ/DK5XTccSTvA==", + "requires": { + "accepts": "~1.3.4", + "base64id": "~2.0.0", + "cors": "~2.8.5", + "debug": "~4.3.2", + "engine.io": "~6.5.2", + "socket.io-adapter": "~2.5.2", + "socket.io-parser": "~4.2.4" + } + }, + "socket.io-adapter": { + "version": "2.5.4", + "resolved": "https://registry.npmjs.org/socket.io-adapter/-/socket.io-adapter-2.5.4.tgz", + "integrity": "sha512-wDNHGXGewWAjQPt3pyeYBtpWSq9cLE5UW1ZUPL/2eGK9jtse/FpXib7epSTsz0Q0m+6sg6Y4KtcFTlah1bdOVg==", + "requires": { + "debug": "~4.3.4", + "ws": "~8.11.0" + }, + "dependencies": { + "ws": { + "version": "8.11.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.11.0.tgz", + "integrity": "sha512-HPG3wQd9sNQoT9xHyNCXoDUa+Xw/VevmY9FoHyQ+g+rrMn4j6FB4np7Z0OhdTgjx6MgQLK7jwSy1YecU1+4Asg==", + "requires": {} + } + } + }, "socket.io-client": { "version": "4.7.5", "resolved": "https://registry.npmjs.org/socket.io-client/-/socket.io-client-4.7.5.tgz", @@ -42475,6 +44149,14 @@ } } }, + "superjson": { + "version": "1.13.3", + "resolved": "https://registry.npmjs.org/superjson/-/superjson-1.13.3.tgz", + "integrity": "sha512-mJiVjfd2vokfDxsQPOwJ/PtanO87LhpYY88ubI5dUB1Ab58Txbyje3+jpm+/83R/fevaq/107NNhtYBLuoTrFg==", + "requires": { + "copy-anything": "^3.0.2" + } + }, "supports-color": { "version": "7.2.0", "requires": { @@ -43522,6 +45204,11 @@ } } }, + "unpipe": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", + "integrity": "sha512-pjy2bYhSsufwWlKwPc+l3cN7+wuJlK6uz0YdJEOlQDbl6jo/YlPi4mb8agUkVC8BF7V8NuzeyPNqRksA3hztKQ==" + }, "unplugin": { "version": "1.10.1", "resolved": "https://registry.npmjs.org/unplugin/-/unplugin-1.10.1.tgz", @@ -43650,6 +45337,12 @@ "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-8.0.2.tgz", "integrity": "sha512-Qp95D4TPJl1kC9SKigDcqgyM2VDVO4RiJc2d4qe5GrYm+zbIQCWWKAFaJNQ4BhdFeDGwBmAxqJBwWSJDb9T3BQ==" }, + "use-isomorphic-layout-effect": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/use-isomorphic-layout-effect/-/use-isomorphic-layout-effect-1.1.2.tgz", + "integrity": "sha512-49L8yCO3iGT/ZF9QttjwLF/ZD9Iwto5LnH5LmEdk/6cFmXddqi2ulF0edxTwjj+7mqvpVVGQWvbXZdn32wRSHA==", + "requires": {} + }, "util": { "version": "0.12.5", "requires": { @@ -43663,6 +45356,11 @@ "util-deprecate": { "version": "1.0.2" }, + "utils-merge": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", + "integrity": "sha512-pMZTvIkT1d+TFGvDOqodOclx0QWkkgi6Tdoa8gC8ffGAAqz9pzPTZWAybbsHHoED/ztMtkv/VoYTYyShUn81hA==" + }, "uuid": { "version": "9.0.1", "dev": true @@ -44353,6 +46051,11 @@ "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, + "yaml": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/yaml/-/yaml-1.10.2.tgz", + "integrity": "sha512-r3vXyErRCYJ7wg28yvBY5VSoAF8ZvlcW9/BwUzEtUsjvX/DKs24dIkuwjtuprwJJHsbyUbLApepYTR1BN4uHrg==" + }, "yargs": { "version": "17.7.2", "requires": { From 07796cf9d8195bab5d10a6482a0d37998eea494c Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev Date: Sat, 15 Jun 2024 08:36:26 +0400 Subject: [PATCH 02/24] Move image generation logic --- .../dog}/assets/templates/background.svg | 0 .../dog}/assets/templates/favicon.html | 0 .../dog}/assets/templates/favicon.svg | 0 .../dog}/assets/templates/og-image.html | 0 apps/dog/package.json | 8 +- apps/dog/src/generators/favicon.ts | 38 +++++ apps/dog/src/generators/og-image.ts | 33 +++++ apps/dog/src/main.ts | 16 +++ apps/dog/src/storage.ts | 7 + package-lock.json | 135 +++++++++++++++++- packages/d0xigen/app.config.ts | 2 +- 11 files changed, 233 insertions(+), 6 deletions(-) rename {packages/d0xigen/server => apps/dog}/assets/templates/background.svg (100%) rename {packages/d0xigen/server => apps/dog}/assets/templates/favicon.html (100%) rename {packages/d0xigen/server => apps/dog}/assets/templates/favicon.svg (100%) rename {packages/d0xigen/server => apps/dog}/assets/templates/og-image.html (100%) create mode 100644 apps/dog/src/generators/favicon.ts create mode 100644 apps/dog/src/generators/og-image.ts create mode 100644 apps/dog/src/main.ts create mode 100644 apps/dog/src/storage.ts diff --git a/packages/d0xigen/server/assets/templates/background.svg b/apps/dog/assets/templates/background.svg similarity index 100% rename from packages/d0xigen/server/assets/templates/background.svg rename to apps/dog/assets/templates/background.svg diff --git a/packages/d0xigen/server/assets/templates/favicon.html b/apps/dog/assets/templates/favicon.html similarity index 100% rename from packages/d0xigen/server/assets/templates/favicon.html rename to apps/dog/assets/templates/favicon.html diff --git a/packages/d0xigen/server/assets/templates/favicon.svg b/apps/dog/assets/templates/favicon.svg similarity index 100% rename from packages/d0xigen/server/assets/templates/favicon.svg rename to apps/dog/assets/templates/favicon.svg diff --git a/packages/d0xigen/server/assets/templates/og-image.html b/apps/dog/assets/templates/og-image.html similarity index 100% rename from packages/d0xigen/server/assets/templates/og-image.html rename to apps/dog/assets/templates/og-image.html diff --git a/apps/dog/package.json b/apps/dog/package.json index 8e4cc6b..d38a477 100644 --- a/apps/dog/package.json +++ b/apps/dog/package.json @@ -4,17 +4,19 @@ "publishConfig": { "access": "public" }, - "type": "module", "scripts": { - "build": "", + "dev": "tsx watch ./src/main.ts", + "build": "tsc", "run:web": "node" }, "dependencies": { "@backroad/backroad": "^1.4.0-alpha.5", "node-html-to-image": "^4.0.0", - "png-to-ico": "^2.1.8" + "png-to-ico": "^2.1.8", + "unstorage": "^1.10.2" }, "devDependencies": { + "tsx": "^4.15.4", "typescript": "^5.4.5" } } diff --git a/apps/dog/src/generators/favicon.ts b/apps/dog/src/generators/favicon.ts new file mode 100644 index 0000000..9060a2c --- /dev/null +++ b/apps/dog/src/generators/favicon.ts @@ -0,0 +1,38 @@ +import nodeHtmlToImage from 'node-html-to-image' +import pngToIco from 'png-to-ico' +import { storage } from '../storage' + +export interface FaviconOptions { + title: string +} + +export async function getFaviconHtml(options: FaviconOptions) { + const template = await storage.getItem('templates:favicon.html') + if (!template) { + throw new Error('Missing favicon HTML template') + } + const background = await storage.getItem('templates:favicon.svg') + if (!background) { + throw new Error('Missing favicon SVG background') + } + return template + .toString() + .replace('{{background}}', background.toString()) + .replace('{{signature}}', options.title[0]) +} + +export async function getFaviconPng(options: FaviconOptions) { + const html = await getFaviconHtml(options) + const png = await nodeHtmlToImage({ + html, + waitUntil: 'networkidle0', + type: 'png', + transparent: true + }) + return png +} + +export async function getFaviconIco(options: FaviconOptions) { + const ico = await pngToIco(await getFaviconPng(options)) + return ico +} diff --git a/apps/dog/src/generators/og-image.ts b/apps/dog/src/generators/og-image.ts new file mode 100644 index 0000000..969a219 --- /dev/null +++ b/apps/dog/src/generators/og-image.ts @@ -0,0 +1,33 @@ +import nodeHtmlToImage from 'node-html-to-image' +import { storage } from '../storage' + +export interface OgImageOptions { + title: string + description: string +} + +export async function getOgImageHtml(options: OgImageOptions) { + const template = await storage.getItem('templates:og-image.html') + if (!template) { + throw new Error('Missing og:image HTML template') + } + const background = await storage.getItem('templates:background.svg') + if (!background) { + throw new Error('Missing og:image SVG background') + } + return template + .toString() + .replace('{{background}}', background.toString()) + .replace('{{title}}', options.title) + .replace('{{description}}', options.description) +} + +export async function getOgImageJpeg(options: OgImageOptions) { + const html = await getOgImageHtml(options) + const image = await nodeHtmlToImage({ + html, + waitUntil: 'networkidle0', + type: 'jpeg' + }) + return image +} diff --git a/apps/dog/src/main.ts b/apps/dog/src/main.ts new file mode 100644 index 0000000..1dec31e --- /dev/null +++ b/apps/dog/src/main.ts @@ -0,0 +1,16 @@ +import { run } from '@backroad/backroad'; + +run((br) => { + br.write({ + body: `# Generate images for OG`, + }); + const [col1, col2] = br.columns({ columns: 2 }); + const title = col1.textInput({ + label: 'Title', + placeholder: 'My awesome docs', + }); + const description = col1.textInput({ + label: 'Description', + placeholder: '💪Understand the power of d0xigen', + }); +}); diff --git a/apps/dog/src/storage.ts b/apps/dog/src/storage.ts new file mode 100644 index 0000000..929b110 --- /dev/null +++ b/apps/dog/src/storage.ts @@ -0,0 +1,7 @@ +import path from 'path'; +import { createStorage } from "unstorage"; +import fsDriver from "unstorage/drivers/fs"; + +export const storage = createStorage({ + driver: fsDriver({ base: path.resolve(__dirname, "../assets/") }), +}); diff --git a/package-lock.json b/package-lock.json index 8a1a589..0d0e11d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -208,9 +208,11 @@ "dependencies": { "@backroad/backroad": "^1.4.0-alpha.5", "node-html-to-image": "^4.0.0", - "png-to-ico": "^2.1.8" + "png-to-ico": "^2.1.8", + "unstorage": "^1.10.2" }, "devDependencies": { + "tsx": "^4.15.4", "typescript": "^5.4.5" } }, @@ -25402,6 +25404,82 @@ "node": ">=0.6.x" } }, + "node_modules/tsx": { + "version": "4.15.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.4.tgz", + "integrity": "sha512-d++FLCwJLrXaBFtRcqdPBzu6FiVOJ2j+UsvUZPtoTrnYtCGU5CEW7iHXtNZfA2fcRTvJFWPqA6SWBuB0GSva9w==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.21.4", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/tsx/node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/tsx/node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, "node_modules/tty-table": { "version": "4.2.3", "dev": true, @@ -29837,7 +29915,9 @@ "@backroad/backroad": "^1.4.0-alpha.5", "node-html-to-image": "^4.0.0", "png-to-ico": "^2.1.8", - "typescript": "^5.4.5" + "tsx": "^4.15.4", + "typescript": "^5.4.5", + "unstorage": "^1.10.2" } }, "@d0rich/esprit-design": { @@ -44499,6 +44579,57 @@ "resolved": "https://registry.npmjs.org/tsscmp/-/tsscmp-1.0.6.tgz", "integrity": "sha512-LxhtAkPDTkVCMQjt2h6eBVY28KCjikZqZfMcC15YBeNjkgUpdCfBu5HoiOTDu86v6smE8yOjyEktJ8hlbANHQA==" }, + "tsx": { + "version": "4.15.4", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.4.tgz", + "integrity": "sha512-d++FLCwJLrXaBFtRcqdPBzu6FiVOJ2j+UsvUZPtoTrnYtCGU5CEW7iHXtNZfA2fcRTvJFWPqA6SWBuB0GSva9w==", + "dev": true, + "requires": { + "esbuild": "~0.21.4", + "fsevents": "~2.3.3", + "get-tsconfig": "^4.7.5" + }, + "dependencies": { + "@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "dev": true, + "optional": true + }, + "esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "requires": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + } + } + }, "tty-table": { "version": "4.2.3", "dev": true, diff --git a/packages/d0xigen/app.config.ts b/packages/d0xigen/app.config.ts index 5cd53c5..4dd198f 100644 --- a/packages/d0xigen/app.config.ts +++ b/packages/d0xigen/app.config.ts @@ -39,7 +39,7 @@ export default defineAppConfig({ title: 'd0xigen', description: 'My awesome docs', url: 'https://d0rich.me', - author: 'Nikolay Dorofeev', + author: 'Nikolai Dorofeev', social: { github: undefined }, From 9a8e8c17384d6a25785ca4baed0c163795c58eae Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev Date: Sat, 15 Jun 2024 08:40:42 +0400 Subject: [PATCH 03/24] Remove image generation from d0xigen --- .changeset/tasty-spies-shop.md | 5 +++ package-lock.json | 4 -- packages/d0xigen/nuxt.config.ts | 2 - packages/d0xigen/package.json | 2 - packages/d0xigen/server/routes/favicon.ico.ts | 3 -- .../d0xigen/server/routes/og/image.jpg.ts | 3 -- packages/d0xigen/server/utils/favicon.ts | 45 ------------------- packages/d0xigen/server/utils/og-image.ts | 35 --------------- 8 files changed, 5 insertions(+), 94 deletions(-) create mode 100644 .changeset/tasty-spies-shop.md delete mode 100644 packages/d0xigen/server/routes/favicon.ico.ts delete mode 100644 packages/d0xigen/server/routes/og/image.jpg.ts delete mode 100644 packages/d0xigen/server/utils/favicon.ts delete mode 100644 packages/d0xigen/server/utils/og-image.ts diff --git a/.changeset/tasty-spies-shop.md b/.changeset/tasty-spies-shop.md new file mode 100644 index 0000000..e30f110 --- /dev/null +++ b/.changeset/tasty-spies-shop.md @@ -0,0 +1,5 @@ +--- +'d0xigen': minor +--- + +Remove image generations. Now it will be available via @d0rich/dog diff --git a/package-lock.json b/package-lock.json index 0d0e11d..092f84d 100644 --- a/package-lock.json +++ b/package-lock.json @@ -28317,9 +28317,7 @@ "@vueuse/core": "^10.11.0", "dateformat": "^5.0.3", "gsap": "^3.12.5", - "node-html-to-image": "^4.0.0", "nuxt": "^3.12.1", - "png-to-ico": "^2.1.8", "rehype-external-links": "^3.0.0", "remark-simple-plantuml": "npm:@akebifiky/remark-simple-plantuml@^1.0.2", "sitemap": "^8.0.0", @@ -35773,9 +35771,7 @@ "@vueuse/core": "^10.11.0", "dateformat": "^5.0.3", "gsap": "^3.12.5", - "node-html-to-image": "^4.0.0", "nuxt": "^3.12.1", - "png-to-ico": "^2.1.8", "rehype-external-links": "^3.0.0", "remark-simple-plantuml": "npm:@akebifiky/remark-simple-plantuml@^1.0.2", "sitemap": "^8.0.0", diff --git a/packages/d0xigen/nuxt.config.ts b/packages/d0xigen/nuxt.config.ts index ddea16d..16d6d5f 100644 --- a/packages/d0xigen/nuxt.config.ts +++ b/packages/d0xigen/nuxt.config.ts @@ -21,8 +21,6 @@ export default defineNuxtConfig({ '/', '/sitemap.xml', '/robots.txt', - '/favicon.ico', - '/og/image.jpg', '/CNAME', '/_d0rich/meta.json' ] diff --git a/packages/d0xigen/package.json b/packages/d0xigen/package.json index 1d3985f..86dd48f 100644 --- a/packages/d0xigen/package.json +++ b/packages/d0xigen/package.json @@ -38,9 +38,7 @@ "@vueuse/core": "^10.11.0", "dateformat": "^5.0.3", "gsap": "^3.12.5", - "node-html-to-image": "^4.0.0", "nuxt": "^3.12.1", - "png-to-ico": "^2.1.8", "rehype-external-links": "^3.0.0", "remark-simple-plantuml": "npm:@akebifiky/remark-simple-plantuml@^1.0.2", "sitemap": "^8.0.0", diff --git a/packages/d0xigen/server/routes/favicon.ico.ts b/packages/d0xigen/server/routes/favicon.ico.ts deleted file mode 100644 index c2a4e87..0000000 --- a/packages/d0xigen/server/routes/favicon.ico.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { getFaviconIco } from '../utils/favicon' - -export default defineEventHandler(() => getFaviconIco()) diff --git a/packages/d0xigen/server/routes/og/image.jpg.ts b/packages/d0xigen/server/routes/og/image.jpg.ts deleted file mode 100644 index 932c1a2..0000000 --- a/packages/d0xigen/server/routes/og/image.jpg.ts +++ /dev/null @@ -1,3 +0,0 @@ -import { getOgImageJpeg } from '../../utils/og-image' - -export default defineEventHandler(() => getOgImageJpeg()) diff --git a/packages/d0xigen/server/utils/favicon.ts b/packages/d0xigen/server/utils/favicon.ts deleted file mode 100644 index 7e5a107..0000000 --- a/packages/d0xigen/server/utils/favicon.ts +++ /dev/null @@ -1,45 +0,0 @@ -import nodeHtmlToImage from 'node-html-to-image' -import pngToIco from 'png-to-ico' - -const bufferCache = new Map() - -export async function getFaviconHtml() { - const appConfig = useAppConfig() - const storage = useStorage('assets:server') - const template = await storage.getItem('templates:favicon.html') - if (!template) { - throw new Error('Missing favicon HTML template') - } - const background = await storage.getItem('templates:favicon.svg') - if (!background) { - throw new Error('Missing favicon SVG background') - } - return template - .toString() - .replace('{{background}}', background.toString()) - .replace('{{signature}}', appConfig.d0xigen.title[0]) -} - -export async function getFaviconPng() { - if (bufferCache.has('favicon.png')) { - return bufferCache.get('favicon.png')! - } - const html = await getFaviconHtml() - const png = await nodeHtmlToImage({ - html, - waitUntil: 'networkidle0', - type: 'png', - transparent: true - }) - bufferCache.set('favicon.png', png as Buffer) - return png -} - -export async function getFaviconIco() { - if (bufferCache.has('favicon.ico')) { - return bufferCache.get('favicon.ico')! - } - const ico = await pngToIco(await getFaviconPng()) - bufferCache.set('favicon.ico', ico as Buffer) - return ico -} diff --git a/packages/d0xigen/server/utils/og-image.ts b/packages/d0xigen/server/utils/og-image.ts deleted file mode 100644 index 00fea74..0000000 --- a/packages/d0xigen/server/utils/og-image.ts +++ /dev/null @@ -1,35 +0,0 @@ -import nodeHtmlToImage from 'node-html-to-image' - -const bufferCache = new Map() - -export async function getOgImageHtml() { - const appConfig = useAppConfig() - const storage = useStorage('assets:server') - const template = await storage.getItem('templates:og-image.html') - if (!template) { - throw new Error('Missing og:image HTML template') - } - const background = await storage.getItem('templates:background.svg') - if (!background) { - throw new Error('Missing og:image SVG background') - } - return template - .toString() - .replace('{{background}}', background.toString()) - .replace('{{title}}', appConfig.d0xigen.title) - .replace('{{description}}', appConfig.d0xigen.description) -} - -export async function getOgImageJpeg() { - if (bufferCache.has('og-image.jpeg')) { - return bufferCache.get('og-image.jpeg')! - } - const html = await getOgImageHtml() - const image = await nodeHtmlToImage({ - html, - waitUntil: 'networkidle0', - type: 'jpeg' - }) - bufferCache.set('og-image.jpeg', image as Buffer) - return image -} From b338db515319b3fde78449a623e80ce855cdd83e Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev Date: Sat, 15 Jun 2024 10:18:35 +0400 Subject: [PATCH 04/24] Somehow generate images using backroad --- apps/d0rich.me/package.json | 1 - apps/dog/.gitignore | 1 + apps/dog/src/generators/favicon.ts | 6 +- apps/dog/src/generators/index.ts | 2 + apps/dog/src/generators/og-image.ts | 7 +- apps/dog/src/main.ts | 42 +- apps/dog/src/script.ts | 11 + apps/dog/src/storage.ts | 6 +- apps/dog/src/utils/bufferToImgSrc.ts | 4 + package-lock.json | 1057 ++++++-------------------- 10 files changed, 293 insertions(+), 844 deletions(-) create mode 100644 apps/dog/.gitignore create mode 100644 apps/dog/src/generators/index.ts create mode 100644 apps/dog/src/script.ts create mode 100644 apps/dog/src/utils/bufferToImgSrc.ts diff --git a/apps/d0rich.me/package.json b/apps/d0rich.me/package.json index 4aabb5f..e11f7eb 100644 --- a/apps/d0rich.me/package.json +++ b/apps/d0rich.me/package.json @@ -22,7 +22,6 @@ "mobile-detect": "^1.4.5", "node-html-parser": "^6.1.13", "octokit": "^4.0.2", - "puppeteer": "^21.11.0", "rehype-external-links": "^3.0.0", "remark-simple-plantuml": "npm:@akebifiky/remark-simple-plantuml@^1.0.2", "sitemap": "^8.0.0", diff --git a/apps/dog/.gitignore b/apps/dog/.gitignore new file mode 100644 index 0000000..d36977d --- /dev/null +++ b/apps/dog/.gitignore @@ -0,0 +1 @@ +.tmp diff --git a/apps/dog/src/generators/favicon.ts b/apps/dog/src/generators/favicon.ts index 9060a2c..dc00bcc 100644 --- a/apps/dog/src/generators/favicon.ts +++ b/apps/dog/src/generators/favicon.ts @@ -1,17 +1,17 @@ import nodeHtmlToImage from 'node-html-to-image' import pngToIco from 'png-to-ico' -import { storage } from '../storage' +import { assetsStorage } from '../storage' export interface FaviconOptions { title: string } export async function getFaviconHtml(options: FaviconOptions) { - const template = await storage.getItem('templates:favicon.html') + const template = await assetsStorage.getItem('templates:favicon.html') if (!template) { throw new Error('Missing favicon HTML template') } - const background = await storage.getItem('templates:favicon.svg') + const background = await assetsStorage.getItem('templates:favicon.svg') if (!background) { throw new Error('Missing favicon SVG background') } diff --git a/apps/dog/src/generators/index.ts b/apps/dog/src/generators/index.ts new file mode 100644 index 0000000..3604c31 --- /dev/null +++ b/apps/dog/src/generators/index.ts @@ -0,0 +1,2 @@ +export * from './favicon'; +export * from './og-image'; diff --git a/apps/dog/src/generators/og-image.ts b/apps/dog/src/generators/og-image.ts index 969a219..143c24a 100644 --- a/apps/dog/src/generators/og-image.ts +++ b/apps/dog/src/generators/og-image.ts @@ -1,5 +1,5 @@ import nodeHtmlToImage from 'node-html-to-image' -import { storage } from '../storage' +import { assetsStorage } from '../storage' export interface OgImageOptions { title: string @@ -7,11 +7,11 @@ export interface OgImageOptions { } export async function getOgImageHtml(options: OgImageOptions) { - const template = await storage.getItem('templates:og-image.html') + const template = await assetsStorage.getItem('templates:og-image.html') if (!template) { throw new Error('Missing og:image HTML template') } - const background = await storage.getItem('templates:background.svg') + const background = await assetsStorage.getItem('templates:background.svg') if (!background) { throw new Error('Missing og:image SVG background') } @@ -26,7 +26,6 @@ export async function getOgImageJpeg(options: OgImageOptions) { const html = await getOgImageHtml(options) const image = await nodeHtmlToImage({ html, - waitUntil: 'networkidle0', type: 'jpeg' }) return image diff --git a/apps/dog/src/main.ts b/apps/dog/src/main.ts index 1dec31e..61c0b09 100644 --- a/apps/dog/src/main.ts +++ b/apps/dog/src/main.ts @@ -1,9 +1,20 @@ import { run } from '@backroad/backroad'; +import { getFaviconIco, getOgImageJpeg } from './generators'; +import { bufferToImgSrc } from './utils/bufferToImgSrc' run((br) => { - br.write({ - body: `# Generate images for OG`, + br.title({ + label: '🐶Dog', }); + br.write({ + body: ` +# 🐶Dog: Generate OG images + +[backroad](https://backroad.sudomakes.art/) doesn't support a lot of usefull features yet. + +You need to reaload page in order to see the generated images. +You might want to use CLI instead. +`}); const [col1, col2] = br.columns({ columns: 2 }); const title = col1.textInput({ label: 'Title', @@ -13,4 +24,29 @@ run((br) => { label: 'Description', placeholder: '💪Understand the power of d0xigen', }); -}); + const faviconSrc = br.getOrDefault('favicon', null); + const ogImageSrc = br.getOrDefault('ogImage', null); + const generate = col1.button({ + label: 'Generate' + }) + if (faviconSrc) { + col2.image({ + src: faviconSrc, + label: 'Favicon', + }); + } + if (ogImageSrc) { + col2.image({ + src: ogImageSrc, + label: 'OG Image', + }); + } + if (generate) { + br.setValue('favicon', null) + br.setValue('ogImage', null) + getOgImageJpeg({ title, description}) + .then(res => br.setValue('ogImage', bufferToImgSrc(res as Buffer))) + getFaviconIco({ title }) + .then(res => br.setValue('favicon', bufferToImgSrc(res, 'ico'))) + } +}, {server: { port: 8080}}); diff --git a/apps/dog/src/script.ts b/apps/dog/src/script.ts new file mode 100644 index 0000000..75d0b5f --- /dev/null +++ b/apps/dog/src/script.ts @@ -0,0 +1,11 @@ +import { tmpStorage } from "./storage"; +import { getFaviconIco, getOgImageJpeg } from "./generators"; + +async function main() { + const favicon = await getFaviconIco({ title: 'D' }) + await tmpStorage.setItemRaw('favicon.ico', favicon) + const ogImage = await getOgImageJpeg({ title: 'Dog', description: 'Generate OG images' }) + await tmpStorage.setItemRaw('og-image.jpeg', ogImage) +} + +main() diff --git a/apps/dog/src/storage.ts b/apps/dog/src/storage.ts index 929b110..2d2a4d8 100644 --- a/apps/dog/src/storage.ts +++ b/apps/dog/src/storage.ts @@ -2,6 +2,10 @@ import path from 'path'; import { createStorage } from "unstorage"; import fsDriver from "unstorage/drivers/fs"; -export const storage = createStorage({ +export const assetsStorage = createStorage({ driver: fsDriver({ base: path.resolve(__dirname, "../assets/") }), }); + +export const tmpStorage = createStorage({ + driver: fsDriver({ base: path.resolve(__dirname, "../.tmp/") }), +}); diff --git a/apps/dog/src/utils/bufferToImgSrc.ts b/apps/dog/src/utils/bufferToImgSrc.ts new file mode 100644 index 0000000..42ee40f --- /dev/null +++ b/apps/dog/src/utils/bufferToImgSrc.ts @@ -0,0 +1,4 @@ +export function bufferToImgSrc(buffer: Buffer, ext: 'png' | 'ico' = 'png'): string { + const str = `data:image/${ext};base64, ` + buffer.toString('base64'); + return str; +} diff --git a/package-lock.json b/package-lock.json index 092f84d..510f9a8 100644 --- a/package-lock.json +++ b/package-lock.json @@ -33,7 +33,6 @@ "mobile-detect": "^1.4.5", "node-html-parser": "^6.1.13", "octokit": "^4.0.2", - "puppeteer": "^21.11.0", "rehype-external-links": "^3.0.0", "remark-simple-plantuml": "npm:@akebifiky/remark-simple-plantuml@^1.0.2", "sitemap": "^8.0.0", @@ -48,148 +47,6 @@ "nuxt": "^3.12.1" } }, - "apps/d0rich.me/node_modules/@puppeteer/browsers": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.1.tgz", - "integrity": "sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==", - "license": "Apache-2.0", - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.1", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - } - }, - "apps/d0rich.me/node_modules/chromium-bidi": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.8.tgz", - "integrity": "sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==", - "license": "Apache-2.0", - "dependencies": { - "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "apps/d0rich.me/node_modules/devtools-protocol": { - "version": "0.0.1232444", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz", - "integrity": "sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==", - "license": "BSD-3-Clause" - }, - "apps/d0rich.me/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "apps/d0rich.me/node_modules/proxy-agent": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", - "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - }, - "engines": { - "node": ">= 14" - } - }, - "apps/d0rich.me/node_modules/puppeteer": { - "version": "21.11.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.11.0.tgz", - "integrity": "sha512-9jTHuYe22TD3sNxy0nEIzC7ZrlRnDgeX3xPkbS7PnbdwYjl2o/z/YuCrRBwezdKpbTDTJ4VqIggzNyeRcKq3cg==", - "deprecated": "< 22.6.4 is no longer supported", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "1.9.1", - "cosmiconfig": "9.0.0", - "puppeteer-core": "21.11.0" - }, - "bin": { - "puppeteer": "lib/esm/puppeteer/node/cli.js" - }, - "engines": { - "node": ">=16.13.2" - } - }, - "apps/d0rich.me/node_modules/puppeteer-core": { - "version": "21.11.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.11.0.tgz", - "integrity": "sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==", - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "1.9.1", - "chromium-bidi": "0.5.8", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1232444", - "ws": "8.16.0" - }, - "engines": { - "node": ">=16.13.2" - } - }, - "apps/d0rich.me/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "license": "MIT", - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "apps/d0rich.me/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "license": "MIT" - }, - "apps/d0rich.me/node_modules/ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, "apps/d0xigen.d0rich.me": { "dependencies": { "d0xigen": "*" @@ -5792,55 +5649,42 @@ "license": "MIT" }, "node_modules/@puppeteer/browsers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.3.tgz", - "integrity": "sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==", + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.5.0.tgz", + "integrity": "sha512-za318PweGINh5LnHSph7C4xhs0tmRjCD8EPpzcKlw4nzSPhnULj+LTG3+TGefZvW1ti5gjw2JkdQvQsivBeZlg==", "license": "Apache-2.0", - "peer": true, "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", "progress": "2.0.3", - "proxy-agent": "6.4.0", - "semver": "7.6.0", - "tar-fs": "3.0.5", + "proxy-agent": "6.3.0", + "tar-fs": "3.0.4", "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" + "yargs": "17.7.1" }, "bin": { "browsers": "lib/cjs/main-cli.js" }, "engines": { - "node": ">=18" - } - }, - "node_modules/@puppeteer/browsers/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "peer": true, - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" + "node": ">=16.3.0" } }, - "node_modules/@puppeteer/browsers/node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "license": "ISC", - "peer": true, + "node_modules/@puppeteer/browsers/node_modules/yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", + "license": "MIT", "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" + "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": ">=10" + "node": ">=12" } }, "node_modules/@rollup/plugin-alias": { @@ -7011,7 +6855,9 @@ "license": "MIT" }, "node_modules/@types/yauzl": { - "version": "2.10.2", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "license": "MIT", "optional": true, "dependencies": { @@ -9466,49 +9312,6 @@ "license": "Apache-2.0", "optional": true }, - "node_modules/bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" - } - }, - "node_modules/bare-os": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.3.0.tgz", - "integrity": "sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==", - "license": "Apache-2.0", - "optional": true, - "peer": true - }, - "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "bare-os": "^2.1.0" - } - }, - "node_modules/bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", - "license": "Apache-2.0", - "optional": true, - "peer": true, - "dependencies": { - "streamx": "^2.18.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "funding": [ @@ -9698,6 +9501,8 @@ }, "node_modules/buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "funding": [ { "type": "github", @@ -9720,6 +9525,8 @@ }, "node_modules/buffer-crc32": { "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", "license": "MIT", "engines": { "node": "*" @@ -10182,27 +9989,17 @@ "license": "(BSD-3-Clause AND Apache-2.0)" }, "node_modules/chromium-bidi": { - "version": "0.5.23", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.23.tgz", - "integrity": "sha512-1o/gLU9wDqbN5nL2MtfjykjOuighGXc3/hnWueO1haiEoFgX8h5vbvcA4tgdQfjw1mkZ1OEF4x/+HVeqEX6NoA==", + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.20.tgz", + "integrity": "sha512-ruHgVZFEv00mAQMz1tQjfjdG63jiPWrQPF6HLlX2ucqLqVTJoWngeBEKHaJ6n1swV/HSvgnBNbtTRIlcVyW3Fw==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0", - "zod": "3.23.8" + "mitt": "3.0.1" }, "peerDependencies": { "devtools-protocol": "*" } }, - "node_modules/chromium-bidi/node_modules/urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "license": "MIT", - "peer": true - }, "node_modules/ci-info": { "version": "3.9.0", "resolved": "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz", @@ -10632,29 +10429,21 @@ } }, "node_modules/cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "license": "MIT", "dependencies": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", + "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "parse-json": "^5.0.0", + "path-type": "^4.0.0" }, "engines": { "node": ">=14" }, "funding": { "url": "https://github.com/sponsors/d-fischer" - }, - "peerDependencies": { - "typescript": ">=4.9.5" - }, - "peerDependenciesMeta": { - "typescript": { - "optional": true - } } }, "node_modules/crc-32": { @@ -11863,11 +11652,10 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1299070", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz", - "integrity": "sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg==", - "license": "BSD-3-Clause", - "peer": true + "version": "0.0.1147663", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", + "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", + "license": "BSD-3-Clause" }, "node_modules/dezalgo": { "version": "1.0.4", @@ -12087,6 +11875,8 @@ }, "node_modules/end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "license": "MIT", "dependencies": { "once": "^1.4.0" @@ -13705,6 +13495,8 @@ }, "node_modules/extract-zip": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "license": "BSD-2-Clause", "dependencies": { "debug": "^4.1.1", @@ -13723,6 +13515,8 @@ }, "node_modules/extract-zip/node_modules/get-stream": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "license": "MIT", "dependencies": { "pump": "^3.0.0" @@ -13792,6 +13586,8 @@ }, "node_modules/fd-slicer": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "license": "MIT", "dependencies": { "pend": "~1.2.0" @@ -14456,6 +14252,8 @@ }, "node_modules/handlebars": { "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "license": "MIT", "dependencies": { "minimist": "^1.2.5", @@ -19095,6 +18893,8 @@ }, "node_modules/neo-async": { "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==", "license": "MIT" }, "node_modules/netmask": { @@ -19961,174 +19761,6 @@ "puppeteer-cluster": "^0.23.0" } }, - "node_modules/node-html-to-image/node_modules/@puppeteer/browsers": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.5.0.tgz", - "integrity": "sha512-za318PweGINh5LnHSph7C4xhs0tmRjCD8EPpzcKlw4nzSPhnULj+LTG3+TGefZvW1ti5gjw2JkdQvQsivBeZlg==", - "license": "Apache-2.0", - "dependencies": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - }, - "bin": { - "browsers": "lib/cjs/main-cli.js" - }, - "engines": { - "node": ">=16.3.0" - } - }, - "node_modules/node-html-to-image/node_modules/chromium-bidi": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.20.tgz", - "integrity": "sha512-ruHgVZFEv00mAQMz1tQjfjdG63jiPWrQPF6HLlX2ucqLqVTJoWngeBEKHaJ6n1swV/HSvgnBNbtTRIlcVyW3Fw==", - "license": "Apache-2.0", - "dependencies": { - "mitt": "3.0.1" - }, - "peerDependencies": { - "devtools-protocol": "*" - } - }, - "node_modules/node-html-to-image/node_modules/cosmiconfig": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", - "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", - "license": "MIT", - "dependencies": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - }, - "engines": { - "node": ">=14" - }, - "funding": { - "url": "https://github.com/sponsors/d-fischer" - } - }, - "node_modules/node-html-to-image/node_modules/devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==", - "license": "BSD-3-Clause" - }, - "node_modules/node-html-to-image/node_modules/lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "license": "ISC", - "engines": { - "node": ">=12" - } - }, - "node_modules/node-html-to-image/node_modules/proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", - "license": "MIT", - "dependencies": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" - }, - "engines": { - "node": ">= 14" - } - }, - "node_modules/node-html-to-image/node_modules/puppeteer": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.0.1.tgz", - "integrity": "sha512-KTjmSdPZ6bMkq3EbAzAUhcB3gMDXvdwd6912rxG9hNtjwRJzHSA568vh6vIbO2WQeNmozRdt1LtiUMLSWfeMrg==", - "deprecated": "< 22.6.4 is no longer supported", - "hasInstallScript": true, - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "1.5.0", - "cosmiconfig": "8.2.0", - "puppeteer-core": "21.0.1" - }, - "engines": { - "node": ">=16.3.0" - } - }, - "node_modules/node-html-to-image/node_modules/puppeteer-core": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.0.1.tgz", - "integrity": "sha512-E8eWLGhaZZpa7dYe/58qGX7SLb4mTg42NP5M7B+ibPrncgNjTOQa9x1sFIlTn1chF/BmoZqOcMIvwuxcb/9XzQ==", - "license": "Apache-2.0", - "dependencies": { - "@puppeteer/browsers": "1.5.0", - "chromium-bidi": "0.4.20", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - }, - "engines": { - "node": ">=16.3.0" - } - }, - "node_modules/node-html-to-image/node_modules/tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "license": "MIT", - "dependencies": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "node_modules/node-html-to-image/node_modules/ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "license": "MIT", - "engines": { - "node": ">=10.0.0" - }, - "peerDependencies": { - "bufferutil": "^4.0.1", - "utf-8-validate": ">=5.0.2" - }, - "peerDependenciesMeta": { - "bufferutil": { - "optional": true - }, - "utf-8-validate": { - "optional": true - } - } - }, - "node_modules/node-html-to-image/node_modules/yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "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/node-releases": { "version": "2.0.14", "resolved": "https://registry.npmjs.org/node-releases/-/node-releases-2.0.14.tgz", @@ -21197,6 +20829,8 @@ }, "node_modules/pend": { "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", "license": "MIT" }, "node_modules/perfect-debounce": { @@ -22097,6 +21731,8 @@ }, "node_modules/progress": { "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", "license": "MIT", "engines": { "node": ">=0.4.0" @@ -22175,20 +21811,19 @@ } }, "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", + "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", "license": "MIT", - "peer": true, "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", + "pac-proxy-agent": "^7.0.0", "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" + "socks-proxy-agent": "^8.0.1" }, "engines": { "node": ">= 14" @@ -22199,13 +21834,14 @@ "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", "license": "ISC", - "peer": true, "engines": { "node": ">=12" } }, "node_modules/proxy-from-env": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", "license": "MIT" }, "node_modules/pseudomap": { @@ -22217,6 +21853,8 @@ }, "node_modules/pump": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "license": "MIT", "dependencies": { "end-of-stream": "^1.1.0", @@ -22232,27 +21870,25 @@ } }, "node_modules/puppeteer": { - "version": "22.11.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.11.0.tgz", - "integrity": "sha512-U5U0Dx5Tsd/ec39BmflhcSFIK9UnZxGQfyUzvQVHivt6gIi6RgJqYL9MJaU90OG6tTz65XqzN4wF0ZyDyY0NuA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.0.1.tgz", + "integrity": "sha512-KTjmSdPZ6bMkq3EbAzAUhcB3gMDXvdwd6912rxG9hNtjwRJzHSA568vh6vIbO2WQeNmozRdt1LtiUMLSWfeMrg==", + "deprecated": "< 22.6.4 is no longer supported", "hasInstallScript": true, "license": "Apache-2.0", - "peer": true, "dependencies": { - "@puppeteer/browsers": "2.2.3", - "cosmiconfig": "9.0.0", - "devtools-protocol": "0.0.1299070", - "puppeteer-core": "22.11.0" - }, - "bin": { - "puppeteer": "lib/esm/puppeteer/node/cli.js" + "@puppeteer/browsers": "1.5.0", + "cosmiconfig": "8.2.0", + "puppeteer-core": "21.0.1" }, "engines": { - "node": ">=18" + "node": ">=16.3.0" } }, "node_modules/puppeteer-cluster": { "version": "0.23.0", + "resolved": "https://registry.npmjs.org/puppeteer-cluster/-/puppeteer-cluster-0.23.0.tgz", + "integrity": "sha512-108terIWDzPrQopmoYSPd5yDoy3FGJ2dNnoGMkGYPs6xtkdhgaECwpfZkzaRToMQPZibUOz0/dSSGgPEdXEhkQ==", "license": "MIT", "dependencies": { "debug": "^4.3.3" @@ -22262,36 +21898,39 @@ } }, "node_modules/puppeteer-core": { - "version": "22.11.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.11.0.tgz", - "integrity": "sha512-57YUjhRoSpZWg9lCssWsgzM1/X/1jQnkKbbspbeW0bhZTt3TD4WdNXEYI7KrFFnSvx21tyHhfWW0zlxzbwYSAA==", + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.0.1.tgz", + "integrity": "sha512-E8eWLGhaZZpa7dYe/58qGX7SLb4mTg42NP5M7B+ibPrncgNjTOQa9x1sFIlTn1chF/BmoZqOcMIvwuxcb/9XzQ==", "license": "Apache-2.0", - "peer": true, "dependencies": { - "@puppeteer/browsers": "2.2.3", - "chromium-bidi": "0.5.23", - "debug": "4.3.5", - "devtools-protocol": "0.0.1299070", - "ws": "8.17.0" + "@puppeteer/browsers": "1.5.0", + "chromium-bidi": "0.4.20", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1147663", + "ws": "8.13.0" }, "engines": { - "node": ">=18" + "node": ">=16.3.0" } }, - "node_modules/puppeteer-core/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "node_modules/puppeteer-core/node_modules/ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", "license": "MIT", - "peer": true, - "dependencies": { - "ms": "2.1.2" - }, "engines": { - "node": ">=6.0" + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" }, "peerDependenciesMeta": { - "supports-color": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { "optional": true } } @@ -25111,18 +24750,14 @@ } }, "node_modules/tar-fs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", - "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", "license": "MIT", - "peer": true, "dependencies": { + "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" } }, "node_modules/tar-stream": { @@ -25234,6 +24869,8 @@ }, "node_modules/through": { "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", "license": "MIT" }, "node_modules/tiny-invariant": { @@ -25758,7 +25395,9 @@ "license": "MIT" }, "node_modules/uglify-js": { - "version": "3.17.4", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", + "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", "license": "BSD-2-Clause", "optional": true, "bin": { @@ -26317,6 +25956,8 @@ }, "node_modules/unbzip2-stream": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "license": "MIT", "dependencies": { "buffer": "^5.2.1", @@ -28053,6 +27694,8 @@ }, "node_modules/wordwrap": { "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==", "license": "MIT" }, "node_modules/wrap-ansi": { @@ -28172,6 +27815,8 @@ }, "node_modules/yauzl": { "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "license": "MIT", "dependencies": { "buffer-crc32": "~0.2.3", @@ -28287,16 +27932,6 @@ "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } }, - "node_modules/zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "license": "MIT", - "peer": true, - "funding": { - "url": "https://github.com/sponsors/colinhacks" - } - }, "node_modules/zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", @@ -32318,37 +31953,31 @@ "integrity": "sha512-j7P6Rgr3mmtdkeDGTe0E/aYyWEWVtc5yFXtHCRHs28/jptDEWfaVOc5T7cblqy1XKPPfCxJc/8DwQ5YgLOZOVQ==" }, "@puppeteer/browsers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.3.tgz", - "integrity": "sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==", - "peer": true, + "version": "1.5.0", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.5.0.tgz", + "integrity": "sha512-za318PweGINh5LnHSph7C4xhs0tmRjCD8EPpzcKlw4nzSPhnULj+LTG3+TGefZvW1ti5gjw2JkdQvQsivBeZlg==", "requires": { "debug": "4.3.4", "extract-zip": "2.0.1", "progress": "2.0.3", - "proxy-agent": "6.4.0", - "semver": "7.6.0", - "tar-fs": "3.0.5", + "proxy-agent": "6.3.0", + "tar-fs": "3.0.4", "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" + "yargs": "17.7.1" }, "dependencies": { - "lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "peer": true, - "requires": { - "yallist": "^4.0.0" - } - }, - "semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "peer": true, + "yargs": { + "version": "17.7.1", + "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", + "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", "requires": { - "lru-cache": "^6.0.0" + "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" } } } @@ -33104,7 +32733,9 @@ "version": "0.0.20" }, "@types/yauzl": { - "version": "2.10.2", + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", "optional": true, "requires": { "@types/node": "*" @@ -34643,45 +34274,6 @@ "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", "optional": true }, - "bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", - "optional": true, - "peer": true, - "requires": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" - } - }, - "bare-os": { - "version": "2.3.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.3.0.tgz", - "integrity": "sha512-oPb8oMM1xZbhRQBngTgpcQ5gXw6kjOaRsSWsIeNyRxGed2w/ARyP7ScBYpWR1qfX2E5rS3gBw6OWcSQo+s+kUg==", - "optional": true, - "peer": true - }, - "bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", - "optional": true, - "peer": true, - "requires": { - "bare-os": "^2.1.0" - } - }, - "bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", - "optional": true, - "peer": true, - "requires": { - "streamx": "^2.18.0" - } - }, "base64-js": { "version": "1.5.1" }, @@ -34800,13 +34392,17 @@ }, "buffer": { "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", "requires": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" } }, "buffer-crc32": { - "version": "0.2.13" + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==" }, "buffer-from": { "version": "1.1.2" @@ -35089,22 +34685,11 @@ "version": "2.4.2" }, "chromium-bidi": { - "version": "0.5.23", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.23.tgz", - "integrity": "sha512-1o/gLU9wDqbN5nL2MtfjykjOuighGXc3/hnWueO1haiEoFgX8h5vbvcA4tgdQfjw1mkZ1OEF4x/+HVeqEX6NoA==", - "peer": true, + "version": "0.4.20", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.20.tgz", + "integrity": "sha512-ruHgVZFEv00mAQMz1tQjfjdG63jiPWrQPF6HLlX2ucqLqVTJoWngeBEKHaJ6n1swV/HSvgnBNbtTRIlcVyW3Fw==", "requires": { - "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0", - "zod": "3.23.8" - }, - "dependencies": { - "urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", - "peer": true - } + "mitt": "3.0.1" } }, "ci-info": { @@ -35385,14 +34970,14 @@ } }, "cosmiconfig": { - "version": "9.0.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", - "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "version": "8.2.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", + "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", "requires": { - "env-paths": "^2.2.1", - "import-fresh": "^3.3.0", + "import-fresh": "^3.2.1", "js-yaml": "^4.1.0", - "parse-json": "^5.2.0" + "parse-json": "^5.0.0", + "path-type": "^4.0.0" } }, "crc-32": { @@ -35657,107 +35242,12 @@ "node-html-parser": "^6.1.13", "nuxt": "^3.12.1", "octokit": "^4.0.2", - "puppeteer": "^21.11.0", "rehype-external-links": "^3.0.0", "remark-simple-plantuml": "npm:@akebifiky/remark-simple-plantuml@^1.0.2", "sitemap": "^8.0.0", "unist-util-visit": "^5.0.0", "vue-disqus": "^5.1.0", "vue-gtag": "^2.0.1" - }, - "dependencies": { - "@puppeteer/browsers": { - "version": "1.9.1", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.1.tgz", - "integrity": "sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==", - "requires": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.1", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.2" - } - }, - "chromium-bidi": { - "version": "0.5.8", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.8.tgz", - "integrity": "sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==", - "requires": { - "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0" - } - }, - "devtools-protocol": { - "version": "0.0.1232444", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz", - "integrity": "sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==" - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" - }, - "proxy-agent": { - "version": "6.3.1", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", - "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", - "requires": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.2", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" - } - }, - "puppeteer": { - "version": "21.11.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.11.0.tgz", - "integrity": "sha512-9jTHuYe22TD3sNxy0nEIzC7ZrlRnDgeX3xPkbS7PnbdwYjl2o/z/YuCrRBwezdKpbTDTJ4VqIggzNyeRcKq3cg==", - "requires": { - "@puppeteer/browsers": "1.9.1", - "cosmiconfig": "9.0.0", - "puppeteer-core": "21.11.0" - } - }, - "puppeteer-core": { - "version": "21.11.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.11.0.tgz", - "integrity": "sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==", - "requires": { - "@puppeteer/browsers": "1.9.1", - "chromium-bidi": "0.5.8", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1232444", - "ws": "8.16.0" - } - }, - "tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "requires": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "urlpattern-polyfill": { - "version": "10.0.0", - "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", - "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==" - }, - "ws": { - "version": "8.16.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", - "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", - "requires": {} - } } }, "d0xigen": { @@ -36288,10 +35778,9 @@ } }, "devtools-protocol": { - "version": "0.0.1299070", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz", - "integrity": "sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg==", - "peer": true + "version": "0.0.1147663", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", + "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==" }, "dezalgo": { "version": "1.0.4", @@ -36437,6 +35926,8 @@ }, "end-of-stream": { "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", "requires": { "once": "^1.4.0" } @@ -37405,6 +36896,8 @@ }, "extract-zip": { "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", "requires": { "@types/yauzl": "^2.9.1", "debug": "^4.1.1", @@ -37414,6 +36907,8 @@ "dependencies": { "get-stream": { "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", "requires": { "pump": "^3.0.0" } @@ -37466,6 +36961,8 @@ }, "fd-slicer": { "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", "requires": { "pend": "~1.2.0" } @@ -37903,6 +37400,8 @@ }, "handlebars": { "version": "4.7.8", + "resolved": "https://registry.npmjs.org/handlebars/-/handlebars-4.7.8.tgz", + "integrity": "sha512-vafaFqs8MZkRrSX7sFVUdo3ap/eNiLnb4IakshzvP56X5Nr1iGKAIqdX6tMlm6HcNRIkr6AxO5jFEoJzzpT8aQ==", "requires": { "minimist": "^1.2.5", "neo-async": "^2.6.2", @@ -40622,7 +40121,9 @@ "version": "0.6.3" }, "neo-async": { - "version": "2.6.2" + "version": "2.6.2", + "resolved": "https://registry.npmjs.org/neo-async/-/neo-async-2.6.2.tgz", + "integrity": "sha512-Yd3UES5mWCSqR+qNT93S3UoYUkqAZ9lLg8a7g9rimsWmYGK8cVToA4/sF3RrshdyV3sAGMXVUmpMYOw+dLpOuw==" }, "netmask": { "version": "2.0.2", @@ -41085,119 +40586,6 @@ "handlebars": "4.7.8", "puppeteer": "21.0.1", "puppeteer-cluster": "^0.23.0" - }, - "dependencies": { - "@puppeteer/browsers": { - "version": "1.5.0", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.5.0.tgz", - "integrity": "sha512-za318PweGINh5LnHSph7C4xhs0tmRjCD8EPpzcKlw4nzSPhnULj+LTG3+TGefZvW1ti5gjw2JkdQvQsivBeZlg==", - "requires": { - "debug": "4.3.4", - "extract-zip": "2.0.1", - "progress": "2.0.3", - "proxy-agent": "6.3.0", - "tar-fs": "3.0.4", - "unbzip2-stream": "1.4.3", - "yargs": "17.7.1" - } - }, - "chromium-bidi": { - "version": "0.4.20", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.4.20.tgz", - "integrity": "sha512-ruHgVZFEv00mAQMz1tQjfjdG63jiPWrQPF6HLlX2ucqLqVTJoWngeBEKHaJ6n1swV/HSvgnBNbtTRIlcVyW3Fw==", - "requires": { - "mitt": "3.0.1" - } - }, - "cosmiconfig": { - "version": "8.2.0", - "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-8.2.0.tgz", - "integrity": "sha512-3rTMnFJA1tCOPwRxtgF4wd7Ab2qvDbL8jX+3smjIbS4HlZBagTlpERbdN7iAbWlrfxE3M8c27kTwTawQ7st+OQ==", - "requires": { - "import-fresh": "^3.2.1", - "js-yaml": "^4.1.0", - "parse-json": "^5.0.0", - "path-type": "^4.0.0" - } - }, - "devtools-protocol": { - "version": "0.0.1147663", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1147663.tgz", - "integrity": "sha512-hyWmRrexdhbZ1tcJUGpO95ivbRhWXz++F4Ko+n21AY5PNln2ovoJw+8ZMNDTtip+CNFQfrtLVh/w4009dXO/eQ==" - }, - "lru-cache": { - "version": "7.18.3", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" - }, - "proxy-agent": { - "version": "6.3.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", - "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", - "requires": { - "agent-base": "^7.0.2", - "debug": "^4.3.4", - "http-proxy-agent": "^7.0.0", - "https-proxy-agent": "^7.0.0", - "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.0", - "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.1" - } - }, - "puppeteer": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.0.1.tgz", - "integrity": "sha512-KTjmSdPZ6bMkq3EbAzAUhcB3gMDXvdwd6912rxG9hNtjwRJzHSA568vh6vIbO2WQeNmozRdt1LtiUMLSWfeMrg==", - "requires": { - "@puppeteer/browsers": "1.5.0", - "cosmiconfig": "8.2.0", - "puppeteer-core": "21.0.1" - } - }, - "puppeteer-core": { - "version": "21.0.1", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.0.1.tgz", - "integrity": "sha512-E8eWLGhaZZpa7dYe/58qGX7SLb4mTg42NP5M7B+ibPrncgNjTOQa9x1sFIlTn1chF/BmoZqOcMIvwuxcb/9XzQ==", - "requires": { - "@puppeteer/browsers": "1.5.0", - "chromium-bidi": "0.4.20", - "cross-fetch": "4.0.0", - "debug": "4.3.4", - "devtools-protocol": "0.0.1147663", - "ws": "8.13.0" - } - }, - "tar-fs": { - "version": "3.0.4", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", - "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", - "requires": { - "mkdirp-classic": "^0.5.2", - "pump": "^3.0.0", - "tar-stream": "^3.1.5" - } - }, - "ws": { - "version": "8.13.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", - "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", - "requires": {} - }, - "yargs": { - "version": "17.7.1", - "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.1.tgz", - "integrity": "sha512-cwiTb08Xuv5fqF4AovYacTFNxk62th7LKJ6BL9IGUpTJrWoU7/7WdQGTP2SjKf1dUNBGzDd28p/Yfs/GI6JrLw==", - "requires": { - "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" - } - } } }, "node-releases": { @@ -41920,7 +41308,9 @@ "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==" }, "pend": { - "version": "1.2.0" + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==" }, "perfect-debounce": { "version": "1.0.0" @@ -42407,7 +41797,9 @@ "integrity": "sha512-3ouUOpQhtgrbOa17J7+uxOTpITYWaGP7/AhoR3+A+/1e9skrzelGi/dXzEYyvbxubEF6Wn2ypscTKiKJFFn1ag==" }, "progress": { - "version": "2.0.3" + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==" }, "promise-inflight": { "version": "1.0.1", @@ -42462,31 +41854,31 @@ } }, "proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", - "peer": true, + "version": "6.3.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.0.tgz", + "integrity": "sha512-0LdR757eTj/JfuU7TL2YCuAZnxWXu3tkJbg4Oq3geW/qFNT/32T0sp2HnZ9O0lMR4q3vwAt0+xCA8SR0WAD0og==", "requires": { "agent-base": "^7.0.2", "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.0", "lru-cache": "^7.14.1", - "pac-proxy-agent": "^7.0.1", + "pac-proxy-agent": "^7.0.0", "proxy-from-env": "^1.1.0", - "socks-proxy-agent": "^8.0.2" + "socks-proxy-agent": "^8.0.1" }, "dependencies": { "lru-cache": { "version": "7.18.3", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", - "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", - "peer": true + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==" } } }, "proxy-from-env": { - "version": "1.1.0" + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==" }, "pseudomap": { "version": "1.0.2", @@ -42496,6 +41888,8 @@ }, "pump": { "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", "requires": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -42506,44 +41900,41 @@ "devOptional": true }, "puppeteer": { - "version": "22.11.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.11.0.tgz", - "integrity": "sha512-U5U0Dx5Tsd/ec39BmflhcSFIK9UnZxGQfyUzvQVHivt6gIi6RgJqYL9MJaU90OG6tTz65XqzN4wF0ZyDyY0NuA==", - "peer": true, + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.0.1.tgz", + "integrity": "sha512-KTjmSdPZ6bMkq3EbAzAUhcB3gMDXvdwd6912rxG9hNtjwRJzHSA568vh6vIbO2WQeNmozRdt1LtiUMLSWfeMrg==", "requires": { - "@puppeteer/browsers": "2.2.3", - "cosmiconfig": "9.0.0", - "devtools-protocol": "0.0.1299070", - "puppeteer-core": "22.11.0" + "@puppeteer/browsers": "1.5.0", + "cosmiconfig": "8.2.0", + "puppeteer-core": "21.0.1" } }, "puppeteer-cluster": { "version": "0.23.0", + "resolved": "https://registry.npmjs.org/puppeteer-cluster/-/puppeteer-cluster-0.23.0.tgz", + "integrity": "sha512-108terIWDzPrQopmoYSPd5yDoy3FGJ2dNnoGMkGYPs6xtkdhgaECwpfZkzaRToMQPZibUOz0/dSSGgPEdXEhkQ==", "requires": { "debug": "^4.3.3" } }, "puppeteer-core": { - "version": "22.11.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.11.0.tgz", - "integrity": "sha512-57YUjhRoSpZWg9lCssWsgzM1/X/1jQnkKbbspbeW0bhZTt3TD4WdNXEYI7KrFFnSvx21tyHhfWW0zlxzbwYSAA==", - "peer": true, + "version": "21.0.1", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.0.1.tgz", + "integrity": "sha512-E8eWLGhaZZpa7dYe/58qGX7SLb4mTg42NP5M7B+ibPrncgNjTOQa9x1sFIlTn1chF/BmoZqOcMIvwuxcb/9XzQ==", "requires": { - "@puppeteer/browsers": "2.2.3", - "chromium-bidi": "0.5.23", - "debug": "4.3.5", - "devtools-protocol": "0.0.1299070", - "ws": "8.17.0" + "@puppeteer/browsers": "1.5.0", + "chromium-bidi": "0.4.20", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1147663", + "ws": "8.13.0" }, "dependencies": { - "debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "peer": true, - "requires": { - "ms": "2.1.2" - } + "ws": { + "version": "8.13.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.13.0.tgz", + "integrity": "sha512-x9vcZYTrFPC7aSIbj7sRCYo7L/Xb8Iy+pW0ng0wt2vCJv7M9HOMy0UoN3rr+IFC7hb7vXoqS+P9ktyLLLhO+LA==", + "requires": {} } } }, @@ -44419,13 +43810,11 @@ } }, "tar-fs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", - "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", - "peer": true, + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", "requires": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0", + "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^3.1.5" } @@ -44481,7 +43870,9 @@ } }, "through": { - "version": "2.3.8" + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==" }, "tiny-invariant": { "version": "1.3.3", @@ -44796,7 +44187,9 @@ "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==" }, "uglify-js": { - "version": "3.17.4", + "version": "3.18.0", + "resolved": "https://registry.npmjs.org/uglify-js/-/uglify-js-3.18.0.tgz", + "integrity": "sha512-SyVVbcNBCk0dzr9XL/R/ySrmYf0s372K6/hFklzgcp2lBFyXtw4I7BOdDjlLhE1aVqaI/SHWXWmYdlZxuyF38A==", "optional": true }, "ultrahtml": { @@ -45065,6 +44458,8 @@ }, "unbzip2-stream": { "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", "requires": { "buffer": "^5.2.1", "through": "^2.3.8" @@ -46133,7 +45528,9 @@ } }, "wordwrap": { - "version": "1.0.0" + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/wordwrap/-/wordwrap-1.0.0.tgz", + "integrity": "sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q==" }, "wrap-ansi": { "version": "6.2.0", @@ -46200,6 +45597,8 @@ }, "yauzl": { "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", "requires": { "buffer-crc32": "~0.2.3", "fd-slicer": "~1.1.0" @@ -46265,12 +45664,6 @@ } } }, - "zod": { - "version": "3.23.8", - "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", - "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", - "peer": true - }, "zwitch": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/zwitch/-/zwitch-2.0.4.tgz", From 6f8b246f0c10237984df2a6bb38806be26152186 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev Date: Sat, 15 Jun 2024 15:54:34 +0400 Subject: [PATCH 05/24] Make it run --- apps/dog/package.json | 9 +- apps/dog/src/{script.ts => cli.ts} | 4 +- apps/dog/src/generators/favicon.ts | 2 +- apps/dog/src/generators/index.ts | 4 +- apps/dog/src/generators/og-image.ts | 2 +- apps/dog/src/{main.ts => web.ts} | 6 +- apps/dog/tsconfig.json | 13 +- package-lock.json | 445 ++++++++++++++++++++++++++-- 8 files changed, 441 insertions(+), 44 deletions(-) rename apps/dog/src/{script.ts => cli.ts} (71%) rename apps/dog/src/{main.ts => web.ts} (89%) diff --git a/apps/dog/package.json b/apps/dog/package.json index d38a477..6fee375 100644 --- a/apps/dog/package.json +++ b/apps/dog/package.json @@ -1,16 +1,19 @@ { "name": "@d0rich/dog", - "version": "0.3.0", + "version": "0.1.0", "publishConfig": { "access": "public" }, "scripts": { - "dev": "tsx watch ./src/main.ts", "build": "tsc", - "run:web": "node" + "dev:web": "tsx watch ./src/web.ts", + "run:web": "node ./dist/web.js" }, "dependencies": { "@backroad/backroad": "^1.4.0-alpha.5", + "@types/node": "^20.14.2", + "commander": "^12.1.0", + "inquirer": "^9.2.23", "node-html-to-image": "^4.0.0", "png-to-ico": "^2.1.8", "unstorage": "^1.10.2" diff --git a/apps/dog/src/script.ts b/apps/dog/src/cli.ts similarity index 71% rename from apps/dog/src/script.ts rename to apps/dog/src/cli.ts index 75d0b5f..12c6c54 100644 --- a/apps/dog/src/script.ts +++ b/apps/dog/src/cli.ts @@ -1,5 +1,5 @@ -import { tmpStorage } from "./storage"; -import { getFaviconIco, getOgImageJpeg } from "./generators"; +import { tmpStorage } from "./storage.js"; +import { getFaviconIco, getOgImageJpeg } from "./generators/index.js"; async function main() { const favicon = await getFaviconIco({ title: 'D' }) diff --git a/apps/dog/src/generators/favicon.ts b/apps/dog/src/generators/favicon.ts index dc00bcc..2414854 100644 --- a/apps/dog/src/generators/favicon.ts +++ b/apps/dog/src/generators/favicon.ts @@ -1,6 +1,6 @@ import nodeHtmlToImage from 'node-html-to-image' import pngToIco from 'png-to-ico' -import { assetsStorage } from '../storage' +import { assetsStorage } from '../storage.js' export interface FaviconOptions { title: string diff --git a/apps/dog/src/generators/index.ts b/apps/dog/src/generators/index.ts index 3604c31..ad06b41 100644 --- a/apps/dog/src/generators/index.ts +++ b/apps/dog/src/generators/index.ts @@ -1,2 +1,2 @@ -export * from './favicon'; -export * from './og-image'; +export * from './favicon.js'; +export * from './og-image.js'; diff --git a/apps/dog/src/generators/og-image.ts b/apps/dog/src/generators/og-image.ts index 143c24a..a92decb 100644 --- a/apps/dog/src/generators/og-image.ts +++ b/apps/dog/src/generators/og-image.ts @@ -1,5 +1,5 @@ import nodeHtmlToImage from 'node-html-to-image' -import { assetsStorage } from '../storage' +import { assetsStorage } from '../storage.js' export interface OgImageOptions { title: string diff --git a/apps/dog/src/main.ts b/apps/dog/src/web.ts similarity index 89% rename from apps/dog/src/main.ts rename to apps/dog/src/web.ts index 61c0b09..6a3ea65 100644 --- a/apps/dog/src/main.ts +++ b/apps/dog/src/web.ts @@ -1,6 +1,6 @@ import { run } from '@backroad/backroad'; -import { getFaviconIco, getOgImageJpeg } from './generators'; -import { bufferToImgSrc } from './utils/bufferToImgSrc' +import { getFaviconIco, getOgImageJpeg } from './generators/index.js'; +import { bufferToImgSrc } from './utils/bufferToImgSrc.js' run((br) => { br.title({ @@ -49,4 +49,4 @@ You might want to use CLI instead. getFaviconIco({ title }) .then(res => br.setValue('favicon', bufferToImgSrc(res, 'ico'))) } -}, {server: { port: 8080}}); +}); diff --git a/apps/dog/tsconfig.json b/apps/dog/tsconfig.json index dbb8ea1..8396807 100644 --- a/apps/dog/tsconfig.json +++ b/apps/dog/tsconfig.json @@ -1,16 +1,17 @@ { "compilerOptions": { - "moduleResolution": "node", "outDir": "./dist", + "baseUrl": "./src", + "rootDir": "./src", + "declaration": false, "target": "ESNext", - "module": "ESNext", - "noEmitOnError": true, - "allowSyntheticDefaultImports": true, + "module": "CommonJS", "esModuleInterop": true, - "forceConsistentCasingInFileNames": true, + "allowSyntheticDefaultImports": true, "strict": true, - "skipLibCheck": true + "skipLibCheck": true, + "lib": ["ESNext"], }, "include": ["**/*.ts"], "exclude": ["node_modules"] diff --git a/package-lock.json b/package-lock.json index 510f9a8..56162c4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -61,9 +61,12 @@ }, "apps/dog": { "name": "@d0rich/dog", - "version": "0.3.0", + "version": "0.1.0", "dependencies": { "@backroad/backroad": "^1.4.0-alpha.5", + "@types/node": "^20.14.2", + "commander": "^12.1.0", + "inquirer": "^9.2.23", "node-html-to-image": "^4.0.0", "png-to-ico": "^2.1.8", "unstorage": "^1.10.2" @@ -73,6 +76,24 @@ "typescript": "^5.4.5" } }, + "apps/dog/node_modules/@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "apps/dog/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "devOptional": true, @@ -2751,6 +2772,15 @@ "vue": ">=3" } }, + "node_modules/@inquirer/figures": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", + "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==", + "license": "MIT", + "engines": { + "node": ">=18" + } + }, "node_modules/@ioredis/commands": { "version": "1.2.0", "license": "MIT" @@ -2923,6 +2953,18 @@ "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==", "license": "MIT" }, + "node_modules/@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "license": "MIT", + "dependencies": { + "call-bind": "^1.0.7" + }, + "engines": { + "node": ">= 0.4" + } + }, "node_modules/@manypkg/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", @@ -9392,6 +9434,17 @@ "url": "https://github.com/sponsors/antfu" } }, + "node_modules/bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "license": "MIT", + "dependencies": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "node_modules/body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -9925,7 +9978,6 @@ }, "node_modules/chardet": { "version": "0.7.0", - "dev": true, "license": "MIT" }, "node_modules/chart.js": { @@ -10059,6 +10111,39 @@ "node": "*" } }, + "node_modules/cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "license": "MIT", + "dependencies": { + "restore-cursor": "^3.1.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==", + "license": "MIT", + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==", + "license": "ISC", + "engines": { + "node": ">= 12" + } + }, "node_modules/clipboardy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", @@ -10120,7 +10205,6 @@ }, "node_modules/clone": { "version": "1.0.4", - "dev": true, "license": "MIT", "engines": { "node": ">=0.8" @@ -11481,7 +11565,6 @@ }, "node_modules/defaults": { "version": "1.0.4", - "dev": true, "license": "MIT", "dependencies": { "clone": "^1.0.2" @@ -13470,7 +13553,6 @@ }, "node_modules/external-editor": { "version": "3.1.0", - "dev": true, "license": "MIT", "dependencies": { "chardet": "^0.7.0", @@ -14884,6 +14966,44 @@ "node": "^14.17.0 || ^16.13.0 || >=18.0.0" } }, + "node_modules/inquirer": { + "version": "9.2.23", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.23.tgz", + "integrity": "sha512-kod5s+FBPIDM2xiy9fu+6wdU/SkK5le5GS9lh4FEBjBHqiMgD9lLFbCbuqFNAjNL2ZOy9Wd9F694IOzN9pZHBA==", + "license": "MIT", + "dependencies": { + "@inquirer/figures": "^1.0.3", + "@ljharb/through": "^2.3.13", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/inquirer/node_modules/chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==", + "license": "MIT", + "engines": { + "node": "^12.17.0 || ^14.13 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/chalk/chalk?sponsor=1" + } + }, "node_modules/internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -15231,6 +15351,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, "node_modules/is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -15433,6 +15562,18 @@ "url": "https://github.com/sponsors/ljharb" } }, + "node_modules/is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==", + "license": "MIT", + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/is-weakref": { "version": "1.0.2", "dev": true, @@ -16117,6 +16258,22 @@ "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==", "license": "MIT" }, + "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/longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -18852,6 +19009,15 @@ "dev": true, "license": "MIT" }, + "node_modules/mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==", + "license": "ISC", + "engines": { + "node": "^14.17.0 || ^16.13.0 || >=18.0.0" + } + }, "node_modules/mz": { "version": "2.7.0", "license": "MIT", @@ -20461,9 +20627,31 @@ "node": ">= 0.8.0" } }, + "node_modules/ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "license": "MIT", + "dependencies": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + }, + "engines": { + "node": ">=10" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/os-tmpdir": { "version": "1.0.2", - "dev": true, "license": "MIT", "engines": { "node": ">=0.10.0" @@ -23074,6 +23262,43 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, + "node_modules/restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "license": "MIT", + "dependencies": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/restore-cursor/node_modules/mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/restore-cursor/node_modules/onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^2.1.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, "node_modules/retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -23196,6 +23421,15 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, "node_modules/run-parallel": { "version": "1.2.0", "funding": [ @@ -23222,6 +23456,15 @@ "dev": true, "license": "BSD-3-Clause" }, + "node_modules/rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "license": "Apache-2.0", + "dependencies": { + "tslib": "^2.1.0" + } + }, "node_modules/sade": { "version": "1.8.1", "dev": true, @@ -24885,7 +25128,6 @@ }, "node_modules/tmp": { "version": "0.0.33", - "dev": true, "license": "MIT", "dependencies": { "os-tmpdir": "~1.0.2" @@ -26009,9 +26251,7 @@ "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "license": "MIT", - "optional": true, - "peer": true + "license": "MIT" }, "node_modules/unenv": { "version": "1.9.0", @@ -27573,7 +27813,6 @@ }, "node_modules/wcwidth": { "version": "1.0.1", - "dev": true, "license": "MIT", "dependencies": { "defaults": "^1.0.3" @@ -27700,7 +27939,6 @@ }, "node_modules/wrap-ansi": { "version": "6.2.0", - "dev": true, "license": "MIT", "dependencies": { "ansi-styles": "^4.0.0", @@ -29546,11 +29784,29 @@ "version": "file:apps/dog", "requires": { "@backroad/backroad": "^1.4.0-alpha.5", + "@types/node": "^20.14.2", + "commander": "^12.1.0", + "inquirer": "^9.2.23", "node-html-to-image": "^4.0.0", "png-to-ico": "^2.1.8", "tsx": "^4.15.4", "typescript": "^5.4.5", "unstorage": "^1.10.2" + }, + "dependencies": { + "@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "requires": { + "undici-types": "~5.26.4" + } + }, + "commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==" + } } }, "@d0rich/esprit-design": { @@ -30089,6 +30345,11 @@ "@iconify/types": "^2.0.0" } }, + "@inquirer/figures": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/@inquirer/figures/-/figures-1.0.3.tgz", + "integrity": "sha512-ErXXzENMH5pJt5/ssXV0DfWUZqly8nGzf0UcBV9xTnP+KyffE2mqyxIMBrZ8ijQck2nU0TQm40EQB53YreyWHw==" + }, "@ioredis/commands": { "version": "1.2.0" }, @@ -30201,6 +30462,14 @@ "resolved": "https://registry.npmjs.org/@kwsites/promise-deferred/-/promise-deferred-1.1.1.tgz", "integrity": "sha512-GaHYm+c0O9MjZRu0ongGBRbinu8gVAMd2UZjji6jVmqKtZluZnptXGWhz1E8j8D2HJ3f/yMxKAUC0b+57wncIw==" }, + "@ljharb/through": { + "version": "2.3.13", + "resolved": "https://registry.npmjs.org/@ljharb/through/-/through-2.3.13.tgz", + "integrity": "sha512-/gKJun8NNiWGZJkGzI/Ragc53cOdcLNdzjLaIa+GEjguQs0ulsurx8WN0jijdK9yPqDvziX995sMRLyLt1uZMQ==", + "requires": { + "call-bind": "^1.0.7" + } + }, "@manypkg/find-root": { "version": "1.1.0", "resolved": "https://registry.npmjs.org/@manypkg/find-root/-/find-root-1.1.0.tgz", @@ -34317,6 +34586,16 @@ "resolved": "https://registry.npmjs.org/birpc/-/birpc-0.2.17.tgz", "integrity": "sha512-+hkTxhot+dWsLpp3gia5AkVHIsKlZybNT5gIYiDlNzJrmYPcTM9k5/w2uaj3IPpd7LlEYpmCj4Jj1nC41VhDFg==" }, + "bl": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", + "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", + "requires": { + "buffer": "^5.5.0", + "inherits": "^2.0.4", + "readable-stream": "^3.4.0" + } + }, "body-parser": { "version": "1.20.2", "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.20.2.tgz", @@ -34641,8 +34920,7 @@ "integrity": "sha512-iBZ4F4wRbyORVsu0jPV7gXkOsGYjGHPmAyv+HiHG8gi5PtC9KI2j1+v8/tlibRvjoWX027ypmG/n0HtO5t7unw==" }, "chardet": { - "version": "0.7.0", - "dev": true + "version": "0.7.0" }, "chart.js": { "version": "4.4.3", @@ -34727,6 +35005,24 @@ "resolved": "https://registry.npmjs.org/clear/-/clear-0.1.0.tgz", "integrity": "sha512-qMjRnoL+JDPJHeLePZJuao6+8orzHMGP04A8CdwCNsKhRbOnKRjefxONR7bwILT3MHecxKBjHkKL/tkZ8r4Uzw==" }, + "cli-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/cli-cursor/-/cli-cursor-3.1.0.tgz", + "integrity": "sha512-I/zHAwsKf9FqGoXM4WWRACob9+SNukZTd94DWF57E4toouRulbCxcUh6RKUEOQlYTHJnzkPMySvPNaaSLNfLZw==", + "requires": { + "restore-cursor": "^3.1.0" + } + }, + "cli-spinners": { + "version": "2.9.2", + "resolved": "https://registry.npmjs.org/cli-spinners/-/cli-spinners-2.9.2.tgz", + "integrity": "sha512-ywqV+5MmyL4E7ybXgKys4DugZbX0FC6LnwrhjuykIjnK9k8OQacQ7axGKnjDXWNhns0xot3bZI5h55H8yo9cJg==" + }, + "cli-width": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/cli-width/-/cli-width-4.1.0.tgz", + "integrity": "sha512-ouuZd4/dm2Sw5Gmqy6bGyNNNe1qt9RpmxveLSO7KcgsTnU7RXfsw+/bukWGo1abgBiMAic068rclZsO4IWmmxQ==" + }, "clipboardy": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", @@ -34766,8 +35062,7 @@ } }, "clone": { - "version": "1.0.4", - "dev": true + "version": "1.0.4" }, "cluster-key-slot": { "version": "1.1.2" @@ -35672,7 +35967,6 @@ }, "defaults": { "version": "1.0.4", - "dev": true, "requires": { "clone": "^1.0.2" } @@ -36876,7 +37170,6 @@ }, "external-editor": { "version": "3.1.0", - "dev": true, "requires": { "chardet": "^0.7.0", "iconv-lite": "^0.4.24", @@ -37802,6 +38095,35 @@ "resolved": "https://registry.npmjs.org/ini/-/ini-4.1.1.tgz", "integrity": "sha512-QQnnxNyfvmHFIsj7gkPcYymR8Jdw/o7mp5ZFihxn6h8Ci6fh3Dx4E1gPjpQEpIuPo9XVNY/ZUwh4BPMjGyL01g==" }, + "inquirer": { + "version": "9.2.23", + "resolved": "https://registry.npmjs.org/inquirer/-/inquirer-9.2.23.tgz", + "integrity": "sha512-kod5s+FBPIDM2xiy9fu+6wdU/SkK5le5GS9lh4FEBjBHqiMgD9lLFbCbuqFNAjNL2ZOy9Wd9F694IOzN9pZHBA==", + "requires": { + "@inquirer/figures": "^1.0.3", + "@ljharb/through": "^2.3.13", + "ansi-escapes": "^4.3.2", + "chalk": "^5.3.0", + "cli-cursor": "^3.1.0", + "cli-width": "^4.1.0", + "external-editor": "^3.1.0", + "lodash": "^4.17.21", + "mute-stream": "1.0.0", + "ora": "^5.4.1", + "run-async": "^3.0.0", + "rxjs": "^7.8.1", + "string-width": "^4.2.3", + "strip-ansi": "^6.0.1", + "wrap-ansi": "^6.2.0" + }, + "dependencies": { + "chalk": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/chalk/-/chalk-5.3.0.tgz", + "integrity": "sha512-dLitG79d+GV1Nb/VYcCDFivJeK1hiukt9QjRNVOsUtTy1rR1YJsmpGGTZ3qJos+uw7WmWF4wUwBd9jxjocFC2w==" + } + } + }, "internal-slot": { "version": "1.0.7", "resolved": "https://registry.npmjs.org/internal-slot/-/internal-slot-1.0.7.tgz", @@ -37985,6 +38307,11 @@ } } }, + "is-interactive": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-interactive/-/is-interactive-1.0.0.tgz", + "integrity": "sha512-2HvIEKRoqS62guEC+qBjpvRubdX910WCMuJTZ+I9yvqKU2/12eSL549HMwtabb4oupdj2sMP50k+XJfB/8JE6w==" + }, "is-lambda": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/is-lambda/-/is-lambda-1.0.1.tgz", @@ -38097,6 +38424,11 @@ "which-typed-array": "^1.1.14" } }, + "is-unicode-supported": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/is-unicode-supported/-/is-unicode-supported-0.1.0.tgz", + "integrity": "sha512-knxG2q4UC3u8stRGyAVJCOdxFmv5DZiRcdlIaAQXAbSfJya+OhopNotLQrstBhququ4ZpuKbDc/8S6mgXgPFPw==" + }, "is-weakref": { "version": "1.0.2", "dev": true, @@ -38581,6 +38913,15 @@ "resolved": "https://registry.npmjs.org/lodash.uniq/-/lodash.uniq-4.5.0.tgz", "integrity": "sha512-xfBaXQd9ryd9dlSDvnvI0lvxfLJlYAZzXomUYzLKtUeOQvOP5piqAWuGtrhWeqaXK9hhoM/iyJc5AV+XfsX3HQ==" }, + "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==", + "requires": { + "chalk": "^4.1.0", + "is-unicode-supported": "^0.1.0" + } + }, "longest-streak": { "version": "3.1.0", "resolved": "https://registry.npmjs.org/longest-streak/-/longest-streak-3.1.0.tgz", @@ -40100,6 +40441,11 @@ "version": "0.3.1", "dev": true }, + "mute-stream": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/mute-stream/-/mute-stream-1.0.0.tgz", + "integrity": "sha512-avsJQhyd+680gKXyG/sQc0nXaC6rBkPOfyHYcFb9+hdkqQkR9bdnkJ0AMZhke0oesPqIO+mFFJ+IdBc7mst4IA==" + }, "mz": { "version": "2.7.0", "requires": { @@ -41056,9 +41402,24 @@ "type-check": "^0.4.0" } }, + "ora": { + "version": "5.4.1", + "resolved": "https://registry.npmjs.org/ora/-/ora-5.4.1.tgz", + "integrity": "sha512-5b6Y85tPxZZ7QytO+BQzysW31HJku27cRIlkbAXaNx+BdcVi+LlRFmVXzeF6a7JCwJpyw5c4b+YSVImQIrBpuQ==", + "requires": { + "bl": "^4.1.0", + "chalk": "^4.1.0", + "cli-cursor": "^3.1.0", + "cli-spinners": "^2.5.0", + "is-interactive": "^1.0.0", + "is-unicode-supported": "^0.1.0", + "log-symbols": "^4.1.0", + "strip-ansi": "^6.0.0", + "wcwidth": "^1.0.1" + } + }, "os-tmpdir": { - "version": "1.0.2", - "dev": true + "version": "1.0.2" }, "outdent": { "version": "0.5.0", @@ -42688,6 +43049,30 @@ "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", "dev": true }, + "restore-cursor": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/restore-cursor/-/restore-cursor-3.1.0.tgz", + "integrity": "sha512-l+sSefzHpj5qimhFSE5a8nufZYAM3sBSVMAPtYkmC+4EH2anSGaEMXSD0izRQbu9nfyQ9y5JrVmp7E8oZrUjvA==", + "requires": { + "onetime": "^5.1.0", + "signal-exit": "^3.0.2" + }, + "dependencies": { + "mimic-fn": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-2.1.0.tgz", + "integrity": "sha512-OqbOk5oEQeAZ8WXWydlu9HJjz9WVdEIvamMCcXmuqUYjTknH/sqsWvhQ3vgwKFRR1HpjvNBKQ37nbJgYzGqGcg==" + }, + "onetime": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-5.1.2.tgz", + "integrity": "sha512-kbpaSSGJTWdAY5KPVeMOKXSrPtr8C8C7wodJbcsd51jRnmD+GZu8Y0VoU6Dm5Z4vWr0Ig/1NKuWRKf7j5aaYSg==", + "requires": { + "mimic-fn": "^2.1.0" + } + } + } + }, "retry": { "version": "0.12.0", "resolved": "https://registry.npmjs.org/retry/-/retry-0.12.0.tgz", @@ -42747,6 +43132,11 @@ "resolved": "https://registry.npmjs.org/run-applescript/-/run-applescript-7.0.0.tgz", "integrity": "sha512-9by4Ij99JUr/MCFBUkDKLWK3G9HVXmabKz9U5MlIAIuvuzkiOicRYs8XJLxX+xahD+mLiiCYDqF9dKAgtzKP1A==" }, + "run-async": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/run-async/-/run-async-3.0.0.tgz", + "integrity": "sha512-540WwVDOMxA6dN6We19EcT9sc3hkXPw5mzRNGM3FkdN/vtE9NFvj5lFAPNwUDmJjXidm3v7TC1cTE7t17Ulm1Q==" + }, "run-parallel": { "version": "1.2.0", "requires": { @@ -42757,6 +43147,14 @@ "version": "1.3.3", "dev": true }, + "rxjs": { + "version": "7.8.1", + "resolved": "https://registry.npmjs.org/rxjs/-/rxjs-7.8.1.tgz", + "integrity": "sha512-AA3TVj+0A2iuIoQkWEK/tqFjBq2j+6PO6Y0zJcvzLAFhEFIO3HL0vls9hWLncZbAAbK0mar7oZ4V079I/qPMxg==", + "requires": { + "tslib": "^2.1.0" + } + }, "sade": { "version": "1.8.1", "dev": true, @@ -43884,7 +44282,6 @@ }, "tmp": { "version": "0.0.33", - "dev": true, "requires": { "os-tmpdir": "~1.0.2" } @@ -44499,9 +44896,7 @@ "undici-types": { "version": "5.26.5", "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", - "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", - "optional": true, - "peer": true + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==" }, "unenv": { "version": "1.9.0", @@ -45446,7 +45841,6 @@ }, "wcwidth": { "version": "1.0.1", - "dev": true, "requires": { "defaults": "^1.0.3" } @@ -45534,7 +45928,6 @@ }, "wrap-ansi": { "version": "6.2.0", - "dev": true, "requires": { "ansi-styles": "^4.0.0", "string-width": "^4.1.0", From a9271783b539b7f61e2bde7b4f522b2c5dae12ca Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev Date: Sat, 15 Jun 2024 16:48:14 +0400 Subject: [PATCH 06/24] CLI generation --- apps/d0xigen.d0rich.me/app.config.ts | 2 +- apps/d0xigen.d0rich.me/public/favicon.ico | Bin 0 -> 285478 bytes apps/d0xigen.d0rich.me/public/og/image.jpeg | Bin 0 -> 74975 bytes apps/dog/package.json | 3 ++ apps/dog/src/cli.ts | 48 +++++++++++++++++--- apps/dog/src/storage.ts | 4 ++ apps/dog/tsconfig.json | 2 +- package-lock.json | 45 ++++++++++++++++++ 8 files changed, 95 insertions(+), 9 deletions(-) create mode 100644 apps/d0xigen.d0rich.me/public/favicon.ico create mode 100644 apps/d0xigen.d0rich.me/public/og/image.jpeg diff --git a/apps/d0xigen.d0rich.me/app.config.ts b/apps/d0xigen.d0rich.me/app.config.ts index e4f0186..255f900 100644 --- a/apps/d0xigen.d0rich.me/app.config.ts +++ b/apps/d0xigen.d0rich.me/app.config.ts @@ -1,7 +1,7 @@ export default defineAppConfig({ d0xigen: { title: 'd0xigen', - description: '🌬🕮 Docs to breath life into your project', + description: '🌬📓 Docs to breath life into your project', url: 'https://d0xigen.d0rich.me', author: 'Nikolay Dorofeev', social: { diff --git a/apps/d0xigen.d0rich.me/public/favicon.ico b/apps/d0xigen.d0rich.me/public/favicon.ico new file mode 100644 index 0000000000000000000000000000000000000000..122d63273f816aa33432c0851a9752d24aa04484 GIT binary patch literal 285478 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 J-?Xs={vV6VR8ar` literal 0 HcmV?d00001 diff --git a/apps/d0xigen.d0rich.me/public/og/image.jpeg b/apps/d0xigen.d0rich.me/public/og/image.jpeg new file mode 100644 index 0000000000000000000000000000000000000000..61b1e4fac347ef37ba69f99ff32d1f4a4b67eb50 GIT binary patch literal 74975 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

=7}eMEoG~x4vt3%5EpmH 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 literal 0 HcmV?d00001 diff --git a/apps/dog/package.json b/apps/dog/package.json index 6fee375..2c22cc1 100644 --- a/apps/dog/package.json +++ b/apps/dog/package.json @@ -1,9 +1,11 @@ { "name": "@d0rich/dog", + "description": "A CLI tool to generate favicons and app icons for your web app", "version": "0.1.0", "publishConfig": { "access": "public" }, + "bin": "./dist/cli.js", "scripts": { "build": "tsc", "dev:web": "tsx watch ./src/web.ts", @@ -19,6 +21,7 @@ "unstorage": "^1.10.2" }, "devDependencies": { + "@types/inquirer": "^9.0.7", "tsx": "^4.15.4", "typescript": "^5.4.5" } diff --git a/apps/dog/src/cli.ts b/apps/dog/src/cli.ts index 12c6c54..b42403c 100644 --- a/apps/dog/src/cli.ts +++ b/apps/dog/src/cli.ts @@ -1,11 +1,45 @@ -import { tmpStorage } from "./storage.js"; +#!/usr/bin/env node +import fs from "fs"; +import path from 'path'; +import { tmpStorage, workingStorage } from "./storage.js"; import { getFaviconIco, getOgImageJpeg } from "./generators/index.js"; +import { program } from "commander"; -async function main() { - const favicon = await getFaviconIco({ title: 'D' }) - await tmpStorage.setItemRaw('favicon.ico', favicon) - const ogImage = await getOgImageJpeg({ title: 'Dog', description: 'Generate OG images' }) - await tmpStorage.setItemRaw('og-image.jpeg', ogImage) +const packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, "../package.json/"), 'utf8')); + +program + .version(packageJson.version) + .description(packageJson.description) + +interface GenOptions { + title?: string; + description?: string; } -main() +program.command('gen') + .description('Generate images') + .option('-t, --title ', 'Title', undefined) + .option('-d, --description <description>', 'Description', undefined) + .action(async (options: GenOptions) => { + const { default: inquirer } = await import('inquirer'); + const title: string = options.title || (await inquirer.prompt({ + type: 'input', + name: 'title', + message: 'Title' + })).title; + console.log(`🐶 Title: ${title}`) + const description: string = options.description || (await inquirer.prompt({ + type: 'input', + name: 'description', + message: 'Description' + })).description; + console.log(`🐶 Description: ${description}`) + console.log('🐶 Generating images...') + const favicon = await getFaviconIco({ title }) + const ogImage = await getOgImageJpeg({ title, description }) + await workingStorage.setItemRaw('favicon.ico', favicon) + await workingStorage.setItemRaw('og:image.jpeg', ogImage) + console.log('🐶 Done, wuaff! Check out \'.dog\' directory') + }) + +program.parse(); diff --git a/apps/dog/src/storage.ts b/apps/dog/src/storage.ts index 2d2a4d8..6275459 100644 --- a/apps/dog/src/storage.ts +++ b/apps/dog/src/storage.ts @@ -9,3 +9,7 @@ export const assetsStorage = createStorage({ export const tmpStorage = createStorage({ driver: fsDriver({ base: path.resolve(__dirname, "../.tmp/") }), }); + +export const workingStorage = createStorage({ + driver: fsDriver({ base: '.dog' }), +}); diff --git a/apps/dog/tsconfig.json b/apps/dog/tsconfig.json index 8396807..0720ff8 100644 --- a/apps/dog/tsconfig.json +++ b/apps/dog/tsconfig.json @@ -6,7 +6,7 @@ "rootDir": "./src", "declaration": false, "target": "ESNext", - "module": "CommonJS", + "module": "Node16", "esModuleInterop": true, "allowSyntheticDefaultImports": true, "strict": true, diff --git a/package-lock.json b/package-lock.json index 56162c4..d094e99 100644 --- a/package-lock.json +++ b/package-lock.json @@ -71,7 +71,11 @@ "png-to-ico": "^2.1.8", "unstorage": "^1.10.2" }, + "bin": { + "dog": "dist/cli.js" + }, "devDependencies": { + "@types/inquirer": "^9.0.7", "tsx": "^4.15.4", "typescript": "^5.4.5" } @@ -6796,6 +6800,17 @@ "@types/node": "*" } }, + "node_modules/@types/inquirer": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", + "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, "node_modules/@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -6886,6 +6901,16 @@ "dev": true, "license": "MIT" }, + "node_modules/@types/through": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "dev": true, + "license": "MIT", + "dependencies": { + "@types/node": "*" + } + }, "node_modules/@types/unist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", @@ -29784,6 +29809,7 @@ "version": "file:apps/dog", "requires": { "@backroad/backroad": "^1.4.0-alpha.5", + "@types/inquirer": "^9.0.7", "@types/node": "^20.14.2", "commander": "^12.1.0", "inquirer": "^9.2.23", @@ -32918,6 +32944,16 @@ "@types/node": "*" } }, + "@types/inquirer": { + "version": "9.0.7", + "resolved": "https://registry.npmjs.org/@types/inquirer/-/inquirer-9.0.7.tgz", + "integrity": "sha512-Q0zyBupO6NxGRZut/JdmqYKOnN95Eg5V8Csg3PGKkP+FnvsUZx1jAyK7fztIszxxMuoBA6E3KXWvdZVXIpx60g==", + "dev": true, + "requires": { + "@types/through": "*", + "rxjs": "^7.2.0" + } + }, "@types/json-schema": { "version": "7.0.15", "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", @@ -32993,6 +33029,15 @@ "version": "7.5.4", "dev": true }, + "@types/through": { + "version": "0.0.33", + "resolved": "https://registry.npmjs.org/@types/through/-/through-0.0.33.tgz", + "integrity": "sha512-HsJ+z3QuETzP3cswwtzt2vEIiHBk/dCcHGhbmG5X3ecnwFD/lPrMpliGXxSCg03L9AhrdwA4Oz/qfspkDW+xGQ==", + "dev": true, + "requires": { + "@types/node": "*" + } + }, "@types/unist": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/@types/unist/-/unist-3.0.2.tgz", From c0eab13d09a07103d76da5860177bed54e9589fa Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 16:57:54 +0400 Subject: [PATCH 07/24] Run web from CLI --- apps/dog/package.json | 4 +-- apps/dog/src/cli.ts | 11 +++++++-- apps/dog/src/runWeb.ts | 3 +++ apps/dog/src/web.ts | 52 --------------------------------------- apps/dog/src/webApp.ts | 55 ++++++++++++++++++++++++++++++++++++++++++ 5 files changed, 69 insertions(+), 56 deletions(-) create mode 100644 apps/dog/src/runWeb.ts delete mode 100644 apps/dog/src/web.ts create mode 100644 apps/dog/src/webApp.ts diff --git a/apps/dog/package.json b/apps/dog/package.json index 2c22cc1..a30f887 100644 --- a/apps/dog/package.json +++ b/apps/dog/package.json @@ -8,8 +8,8 @@ "bin": "./dist/cli.js", "scripts": { "build": "tsc", - "dev:web": "tsx watch ./src/web.ts", - "run:web": "node ./dist/web.js" + "dev:web": "tsx watch ./src/runWeb.ts", + "run:web": "node ./dist/runWeb.js" }, "dependencies": { "@backroad/backroad": "^1.4.0-alpha.5", diff --git a/apps/dog/src/cli.ts b/apps/dog/src/cli.ts index b42403c..e207364 100644 --- a/apps/dog/src/cli.ts +++ b/apps/dog/src/cli.ts @@ -1,7 +1,8 @@ #!/usr/bin/env node import fs from "fs"; import path from 'path'; -import { tmpStorage, workingStorage } from "./storage.js"; +import { runWebGenerator } from './webApp'; +import { workingStorage } from "./storage.js"; import { getFaviconIco, getOgImageJpeg } from "./generators/index.js"; import { program } from "commander"; @@ -16,7 +17,7 @@ interface GenOptions { description?: string; } -program.command('gen') +program.command('gen', { isDefault: true }) .description('Generate images') .option('-t, --title <title>', 'Title', undefined) .option('-d, --description <description>', 'Description', undefined) @@ -42,4 +43,10 @@ program.command('gen') console.log('🐶 Done, wuaff! Check out \'.dog\' directory') }) +program.command('web') + .description('Run web generator') + .action(() => { + runWebGenerator(); + }) + program.parse(); diff --git a/apps/dog/src/runWeb.ts b/apps/dog/src/runWeb.ts new file mode 100644 index 0000000..c48dc7f --- /dev/null +++ b/apps/dog/src/runWeb.ts @@ -0,0 +1,3 @@ +import { runWebGenerator } from './webApp'; + +runWebGenerator(); diff --git a/apps/dog/src/web.ts b/apps/dog/src/web.ts deleted file mode 100644 index 6a3ea65..0000000 --- a/apps/dog/src/web.ts +++ /dev/null @@ -1,52 +0,0 @@ -import { run } from '@backroad/backroad'; -import { getFaviconIco, getOgImageJpeg } from './generators/index.js'; -import { bufferToImgSrc } from './utils/bufferToImgSrc.js' - -run((br) => { - br.title({ - label: '🐶Dog', - }); - br.write({ - body: ` -# 🐶Dog: Generate OG images - -[backroad](https://backroad.sudomakes.art/) doesn't support a lot of usefull features yet. - -You need to reaload page in order to see the generated images. -You might want to use CLI instead. -`}); - const [col1, col2] = br.columns({ columns: 2 }); - const title = col1.textInput({ - label: 'Title', - placeholder: 'My awesome docs', - }); - const description = col1.textInput({ - label: 'Description', - placeholder: '💪Understand the power of d0xigen', - }); - const faviconSrc = br.getOrDefault('favicon', null); - const ogImageSrc = br.getOrDefault('ogImage', null); - const generate = col1.button({ - label: 'Generate' - }) - if (faviconSrc) { - col2.image({ - src: faviconSrc, - label: 'Favicon', - }); - } - if (ogImageSrc) { - col2.image({ - src: ogImageSrc, - label: 'OG Image', - }); - } - if (generate) { - br.setValue('favicon', null) - br.setValue('ogImage', null) - getOgImageJpeg({ title, description}) - .then(res => br.setValue('ogImage', bufferToImgSrc(res as Buffer))) - getFaviconIco({ title }) - .then(res => br.setValue('favicon', bufferToImgSrc(res, 'ico'))) - } -}); diff --git a/apps/dog/src/webApp.ts b/apps/dog/src/webApp.ts new file mode 100644 index 0000000..a199d95 --- /dev/null +++ b/apps/dog/src/webApp.ts @@ -0,0 +1,55 @@ +import { run } from '@backroad/backroad'; +import { getFaviconIco, getOgImageJpeg } from './generators/index.js'; +import { bufferToImgSrc } from './utils/bufferToImgSrc.js' + +export function runWebGenerator() { + + run((br) => { + br.title({ + label: '🐶Dog', + }); + br.write({ + body: ` +# 🐶Dog: Generate OG images + +[backroad](https://backroad.sudomakes.art/) doesn't support a lot of usefull features yet. + +You need to reaload page in order to see the generated images. +You might want to use CLI instead. +`}); + const [col1, col2] = br.columns({ columns: 2 }); + const title = col1.textInput({ + label: 'Title', + placeholder: 'My awesome docs', + }); + const description = col1.textInput({ + label: 'Description', + placeholder: '💪Understand the power of d0xigen', + }); + const faviconSrc = br.getOrDefault('favicon', null); + const ogImageSrc = br.getOrDefault('ogImage', null); + const generate = col1.button({ + label: 'Generate' + }) + if (faviconSrc) { + col2.image({ + src: faviconSrc, + label: 'Favicon', + }); + } + if (ogImageSrc) { + col2.image({ + src: ogImageSrc, + label: 'OG Image', + }); + } + if (generate) { + br.setValue('favicon', null) + br.setValue('ogImage', null) + getOgImageJpeg({ title, description}) + .then(res => br.setValue('ogImage', bufferToImgSrc(res as Buffer))) + getFaviconIco({ title }) + .then(res => br.setValue('favicon', bufferToImgSrc(res, 'ico'))) + } + }); +} From 2232a720f06d3e66c1af5f5ff656a2f0115cd591 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 17:37:07 +0400 Subject: [PATCH 08/24] Rename jpeg to jpg --- .../public/og/{image.jpeg => image.jpg} | Bin apps/dog/src/cli.ts | 2 +- 2 files changed, 1 insertion(+), 1 deletion(-) rename apps/d0xigen.d0rich.me/public/og/{image.jpeg => image.jpg} (100%) diff --git a/apps/d0xigen.d0rich.me/public/og/image.jpeg b/apps/d0xigen.d0rich.me/public/og/image.jpg similarity index 100% rename from apps/d0xigen.d0rich.me/public/og/image.jpeg rename to apps/d0xigen.d0rich.me/public/og/image.jpg diff --git a/apps/dog/src/cli.ts b/apps/dog/src/cli.ts index e207364..145376e 100644 --- a/apps/dog/src/cli.ts +++ b/apps/dog/src/cli.ts @@ -39,7 +39,7 @@ program.command('gen', { isDefault: true }) const favicon = await getFaviconIco({ title }) const ogImage = await getOgImageJpeg({ title, description }) await workingStorage.setItemRaw('favicon.ico', favicon) - await workingStorage.setItemRaw('og:image.jpeg', ogImage) + await workingStorage.setItemRaw('og:image.jpg', ogImage) console.log('🐶 Done, wuaff! Check out \'.dog\' directory') }) From 875579b99f3fb03a8db816af51514c611e0fcefe Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 17:37:51 +0400 Subject: [PATCH 09/24] Update plugin recommendations --- .vscode/extensions.json | 1 - 1 file changed, 1 deletion(-) diff --git a/.vscode/extensions.json b/.vscode/extensions.json index ca40ae8..3e79a11 100644 --- a/.vscode/extensions.json +++ b/.vscode/extensions.json @@ -1,6 +1,5 @@ { "recommendations": [ - "vue.vscode-typescript-vue-plugin", "vue.volar", "nuxt.mdc", "bradlc.vscode-tailwindcss", From 208671b33c60bf7c3e34d288e3be8d4f3db9d66a Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 17:49:36 +0400 Subject: [PATCH 10/24] Update netlify configuration --- apps/d0rich.me/netlify.toml | 3 +++ apps/d0xigen.d0rich.me/netlify.toml | 3 +++ apps/design.d0rich.me/netlify.toml | 3 +++ 3 files changed, 9 insertions(+) diff --git a/apps/d0rich.me/netlify.toml b/apps/d0rich.me/netlify.toml index 8f5d5eb..4d3fa87 100644 --- a/apps/d0rich.me/netlify.toml +++ b/apps/d0rich.me/netlify.toml @@ -1,2 +1,5 @@ [build] + base = "/" + publish = "apps/d0rich.me/dist" ignore = "node apps/d0rich.me/ignore-build.mjs" + command = "npm run generate --workspace=d0rich.me" diff --git a/apps/d0xigen.d0rich.me/netlify.toml b/apps/d0xigen.d0rich.me/netlify.toml index 0d6ca3d..732b4dd 100644 --- a/apps/d0xigen.d0rich.me/netlify.toml +++ b/apps/d0xigen.d0rich.me/netlify.toml @@ -1,2 +1,5 @@ [build] + base = "/" + publish = "apps/d0xigen.d0rich.me/dist" ignore = "node apps/d0xigen.d0rich.me/ignore-build.mjs" + command = "npm run generate --workspace=d0xigen.d0rich.me" diff --git a/apps/design.d0rich.me/netlify.toml b/apps/design.d0rich.me/netlify.toml index fb7219e..cbd1fcb 100644 --- a/apps/design.d0rich.me/netlify.toml +++ b/apps/design.d0rich.me/netlify.toml @@ -1,2 +1,5 @@ [build] + base = "/" + publish = "apps/design.d0rich.me/dist" ignore = "node apps/design.d0rich.me/ignore-build.mjs" + command = "npm run generate --workspace=design.d0rich.me" From 1e64d976bb8138f090d36a695023dcd4fa24f024 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 17:53:43 +0400 Subject: [PATCH 11/24] Create utils folder --- package.json | 3 ++- {apps => utils}/dog/.gitignore | 0 {apps => utils}/dog/assets/templates/background.svg | 0 {apps => utils}/dog/assets/templates/favicon.html | 0 {apps => utils}/dog/assets/templates/favicon.svg | 0 {apps => utils}/dog/assets/templates/og-image.html | 0 {apps => utils}/dog/package.json | 0 {apps => utils}/dog/src/cli.ts | 0 {apps => utils}/dog/src/generators/favicon.ts | 0 {apps => utils}/dog/src/generators/index.ts | 0 {apps => utils}/dog/src/generators/og-image.ts | 0 {apps => utils}/dog/src/runWeb.ts | 0 {apps => utils}/dog/src/storage.ts | 0 {apps => utils}/dog/src/utils/bufferToImgSrc.ts | 0 {apps => utils}/dog/src/webApp.ts | 0 {apps => utils}/dog/tsconfig.json | 0 16 files changed, 2 insertions(+), 1 deletion(-) rename {apps => utils}/dog/.gitignore (100%) rename {apps => utils}/dog/assets/templates/background.svg (100%) rename {apps => utils}/dog/assets/templates/favicon.html (100%) rename {apps => utils}/dog/assets/templates/favicon.svg (100%) rename {apps => utils}/dog/assets/templates/og-image.html (100%) rename {apps => utils}/dog/package.json (100%) rename {apps => utils}/dog/src/cli.ts (100%) rename {apps => utils}/dog/src/generators/favicon.ts (100%) rename {apps => utils}/dog/src/generators/index.ts (100%) rename {apps => utils}/dog/src/generators/og-image.ts (100%) rename {apps => utils}/dog/src/runWeb.ts (100%) rename {apps => utils}/dog/src/storage.ts (100%) rename {apps => utils}/dog/src/utils/bufferToImgSrc.ts (100%) rename {apps => utils}/dog/src/webApp.ts (100%) rename {apps => utils}/dog/tsconfig.json (100%) diff --git a/package.json b/package.json index 9402315..cd07928 100644 --- a/package.json +++ b/package.json @@ -3,7 +3,8 @@ "private": true, "workspaces": [ "apps/*", - "packages/*" + "packages/*", + "utils/*" ], "packageManager": "npm@10.8.1", "scripts": { diff --git a/apps/dog/.gitignore b/utils/dog/.gitignore similarity index 100% rename from apps/dog/.gitignore rename to utils/dog/.gitignore diff --git a/apps/dog/assets/templates/background.svg b/utils/dog/assets/templates/background.svg similarity index 100% rename from apps/dog/assets/templates/background.svg rename to utils/dog/assets/templates/background.svg diff --git a/apps/dog/assets/templates/favicon.html b/utils/dog/assets/templates/favicon.html similarity index 100% rename from apps/dog/assets/templates/favicon.html rename to utils/dog/assets/templates/favicon.html diff --git a/apps/dog/assets/templates/favicon.svg b/utils/dog/assets/templates/favicon.svg similarity index 100% rename from apps/dog/assets/templates/favicon.svg rename to utils/dog/assets/templates/favicon.svg diff --git a/apps/dog/assets/templates/og-image.html b/utils/dog/assets/templates/og-image.html similarity index 100% rename from apps/dog/assets/templates/og-image.html rename to utils/dog/assets/templates/og-image.html diff --git a/apps/dog/package.json b/utils/dog/package.json similarity index 100% rename from apps/dog/package.json rename to utils/dog/package.json diff --git a/apps/dog/src/cli.ts b/utils/dog/src/cli.ts similarity index 100% rename from apps/dog/src/cli.ts rename to utils/dog/src/cli.ts diff --git a/apps/dog/src/generators/favicon.ts b/utils/dog/src/generators/favicon.ts similarity index 100% rename from apps/dog/src/generators/favicon.ts rename to utils/dog/src/generators/favicon.ts diff --git a/apps/dog/src/generators/index.ts b/utils/dog/src/generators/index.ts similarity index 100% rename from apps/dog/src/generators/index.ts rename to utils/dog/src/generators/index.ts diff --git a/apps/dog/src/generators/og-image.ts b/utils/dog/src/generators/og-image.ts similarity index 100% rename from apps/dog/src/generators/og-image.ts rename to utils/dog/src/generators/og-image.ts diff --git a/apps/dog/src/runWeb.ts b/utils/dog/src/runWeb.ts similarity index 100% rename from apps/dog/src/runWeb.ts rename to utils/dog/src/runWeb.ts diff --git a/apps/dog/src/storage.ts b/utils/dog/src/storage.ts similarity index 100% rename from apps/dog/src/storage.ts rename to utils/dog/src/storage.ts diff --git a/apps/dog/src/utils/bufferToImgSrc.ts b/utils/dog/src/utils/bufferToImgSrc.ts similarity index 100% rename from apps/dog/src/utils/bufferToImgSrc.ts rename to utils/dog/src/utils/bufferToImgSrc.ts diff --git a/apps/dog/src/webApp.ts b/utils/dog/src/webApp.ts similarity index 100% rename from apps/dog/src/webApp.ts rename to utils/dog/src/webApp.ts diff --git a/apps/dog/tsconfig.json b/utils/dog/tsconfig.json similarity index 100% rename from apps/dog/tsconfig.json rename to utils/dog/tsconfig.json From 9a6d6a3d92c144a922b86bb95cd21353570f2f14 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 19:11:02 +0400 Subject: [PATCH 12/24] Prepare pdf CDN script --- apps/d0rich.me/nuxt.config.ts | 4 +- .../server/routes/api/resume/[type].pdf.ts | 21 - .../server/routes/api/resume/list.json.ts | 12 + apps/d0rich.me/server/utils/puppeteer.ts | 68 - cdn/package-lock.json | 3012 +++++++++++++++++ cdn/package.json | 19 + cdn/src/features/resume/collectResumeList.ts | 8 + cdn/src/features/resume/getResumePdf.ts | 27 + cdn/src/features/resume/saveAllResume.ts | 13 + cdn/src/main.ts | 11 + cdn/src/models/ResumeList.ts | 8 + cdn/src/store/browser.ts | 14 + cdn/src/store/dist.ts | 6 + 13 files changed, 3131 insertions(+), 92 deletions(-) delete mode 100644 apps/d0rich.me/server/routes/api/resume/[type].pdf.ts create mode 100644 apps/d0rich.me/server/routes/api/resume/list.json.ts delete mode 100644 apps/d0rich.me/server/utils/puppeteer.ts create mode 100644 cdn/package-lock.json create mode 100644 cdn/package.json create mode 100644 cdn/src/features/resume/collectResumeList.ts create mode 100644 cdn/src/features/resume/getResumePdf.ts create mode 100644 cdn/src/features/resume/saveAllResume.ts create mode 100644 cdn/src/main.ts create mode 100644 cdn/src/models/ResumeList.ts create mode 100644 cdn/src/store/browser.ts create mode 100644 cdn/src/store/dist.ts diff --git a/apps/d0rich.me/nuxt.config.ts b/apps/d0rich.me/nuxt.config.ts index 2832a3e..89f8820 100644 --- a/apps/d0rich.me/nuxt.config.ts +++ b/apps/d0rich.me/nuxt.config.ts @@ -27,9 +27,7 @@ export default defineNuxtConfig({ routes: [ '/', '/sitemap.xml', - '/api/resume/Nikolai_Dorofeev-Fullstack_Developer.pdf', - '/api/resume/Nikolai_Dorofeev-Backend_Developer.pdf', - '/api/resume/Nikolai_Dorofeev-Frontend_Developer.pdf' + '/api/resume/list.json', ] } }, diff --git a/apps/d0rich.me/server/routes/api/resume/[type].pdf.ts b/apps/d0rich.me/server/routes/api/resume/[type].pdf.ts deleted file mode 100644 index ba5aff1..0000000 --- a/apps/d0rich.me/server/routes/api/resume/[type].pdf.ts +++ /dev/null @@ -1,21 +0,0 @@ -import { serverQueryContent } from '#content/server' -import { savePdf } from '~~/server/utils/puppeteer' - -// Add required routes to prerender in nuxt.config.ts -export default defineEventHandler(async (event) => { - const fileName = getRouterParam(event, 'type.pdf') - if (!fileName) throw new Error('File name not found') - const spec = fileName - .replace('.pdf', '') - .replace('Nikolai_Dorofeev-', '') - .replaceAll('_', ' ') - const resume = await serverQueryContent(event, '/resume/leads') - .where({ - title: spec - }) - .only('_path' as const) - .findOne() - if (!resume._path) throw new Error('Resume not found') - const pdf = await savePdf(resume._path.replace('/resume/leads', '/resume')) - return pdf -}) diff --git a/apps/d0rich.me/server/routes/api/resume/list.json.ts b/apps/d0rich.me/server/routes/api/resume/list.json.ts new file mode 100644 index 0000000..81321f1 --- /dev/null +++ b/apps/d0rich.me/server/routes/api/resume/list.json.ts @@ -0,0 +1,12 @@ +import { serverQueryContent } from '#content/server' + +// Add required routes to prerender in nuxt.config.ts +export default defineEventHandler(async (event) => { + const resumeList = await serverQueryContent(event, '/resume/leads') + .only(['_path' as const, 'title' as const]) + .find() + return resumeList.map((resume) => ({ + title: resume.title, + path: resume._path + })) +}) diff --git a/apps/d0rich.me/server/utils/puppeteer.ts b/apps/d0rich.me/server/utils/puppeteer.ts deleted file mode 100644 index 4db459b..0000000 --- a/apps/d0rich.me/server/utils/puppeteer.ts +++ /dev/null @@ -1,68 +0,0 @@ -import * as fs from 'fs' -import { parse } from 'node-html-parser' -import { launch } from 'puppeteer' - -export async function fetchPageWithCss(path: string) { - const html = await $fetch<string>(path) - const parsedHtml = parse(html) - const head = parsedHtml.querySelector('head') - if (!head) throw new Error('<head> tag is not found') - const cssRels = head.querySelectorAll('link') - for (const cssRel of cssRels) { - const href = cssRel.getAttribute('href') - if (!href?.endsWith('.css')) continue - const style = fs.readFileSync('./.nuxt/dist/client' + href, { - encoding: 'utf-8' - }) - head.appendChild(parse(`<style>${style}</style>`)) - } - // Add Roboto Slab from Google fonts - head.appendChild( - parse('<link rel="preconnect" href="https://fonts.googleapis.com">') - ) - head.appendChild( - parse( - '<link rel="preconnect" href="https://fonts.gstatic.com" crossorigin>' - ) - ) - head.appendChild( - parse( - '<link href="https://fonts.googleapis.com/css2?family=Roboto+Slab:wght@100;200;300;400;500;600;700;800;900&display=swap" rel="stylesheet">' - ) - ) - return parsedHtml.toString() -} - -export async function savePdf(path: string) { - const browser = await launch({ headless: true }) - const page = await browser.newPage() - if (useRuntimeConfig().public.isDev) { - // If in development mode - await page.goto('http://localhost:3000' + path, { - waitUntil: 'networkidle0' - }) - } else { - // If prerender - await page.setContent(await fetchPageWithCss(path), { - waitUntil: ['domcontentloaded', 'networkidle0'] - }) - } - await page.emulateMediaType('print') - await page.evaluate(() => { - const html = document.querySelector('html') - if (html) { - html.className = 'light' - html.querySelectorAll('a').forEach((a) => { - const href = a.getAttribute('href') - if (!href) return - if (href.startsWith('/')) a.href = 'https://d0rich.me' + href - }) - } - }) - const pdf = await page.pdf({ - printBackground: true, - format: 'A4' - }) - await browser.close() - return pdf -} diff --git a/cdn/package-lock.json b/cdn/package-lock.json new file mode 100644 index 0000000..cf2494d --- /dev/null +++ b/cdn/package-lock.json @@ -0,0 +1,3012 @@ +{ + "name": "cdn", + "version": "1.0.0", + "lockfileVersion": 3, + "requires": true, + "packages": { + "": { + "name": "cdn", + "version": "1.0.0", + "license": "ISC", + "dependencies": { + "ofetch": "^1.3.4", + "puppeteer": "^22.11.0", + "unstorage": "^1.10.2", + "zod": "^3.23.8" + }, + "devDependencies": { + "tsx": "^4.15.5", + "typescript": "^5.4.5" + } + }, + "node_modules/@babel/code-frame": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.7.tgz", + "integrity": "sha512-BcYH1CVJBO9tvyIZ2jVeXgSIMvGZ2FDRvDdOIVQyuklNKSsx+eppDEBq/g47Ayw+RqNFE+URvOShmf+f/qwAlA==", + "license": "MIT", + "dependencies": { + "@babel/highlight": "^7.24.7", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/helper-validator-identifier": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.24.7.tgz", + "integrity": "sha512-rR+PBcQ1SMQDDyF6X0wxtG8QyLCgUB0eRAGguqRLfkCA87l7yAP7ehq8SNj96OOGTO8OBV70KhuFYcIkHXOg0w==", + "license": "MIT", + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@babel/highlight": { + "version": "7.24.7", + "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.7.tgz", + "integrity": "sha512-EStJpq4OuY8xYfhGVXngigBJRWxftKX9ksiGDnmlY3o7B/V7KIAc9X4oiK87uPJSc/vs5L869bem5fhZa8caZw==", + "license": "MIT", + "dependencies": { + "@babel/helper-validator-identifier": "^7.24.7", + "chalk": "^2.4.2", + "js-tokens": "^4.0.0", + "picocolors": "^1.0.0" + }, + "engines": { + "node": ">=6.9.0" + } + }, + "node_modules/@esbuild/aix-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/aix-ppc64/-/aix-ppc64-0.21.5.tgz", + "integrity": "sha512-1SDgH6ZSPTlggy1yI6+Dbkiz8xzpHJEVAlF/AM1tHPLsf5STom9rwtjE4hKAF20FfXXNTFqEYXyJNWh1GiZedQ==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "aix" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm/-/android-arm-0.21.5.tgz", + "integrity": "sha512-vCPvzSjpPHEi1siZdlvAlsPxXl7WbOVUBBAowWug4rJHb68Ox8KualB+1ocNvT5fjv6wpkX6o/iEpbDrf68zcg==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-arm64/-/android-arm64-0.21.5.tgz", + "integrity": "sha512-c0uX9VAUBQ7dTDCjq+wdyGLowMdtR/GoC2U5IYk/7D1H1JYC0qseD7+11iMP2mRLN9RcCMRcjC4YMclCzGwS/A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/android-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/android-x64/-/android-x64-0.21.5.tgz", + "integrity": "sha512-D7aPRUUNHRBwHxzxRvp856rjUHRFW1SdQATKXH2hqA0kAZb1hKmi02OpYRacl0TxIGz/ZmXWlbZgjwWYaCakTA==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-arm64/-/darwin-arm64-0.21.5.tgz", + "integrity": "sha512-DwqXqZyuk5AiWWf3UfLiRDJ5EDd49zg6O9wclZ7kUMv2WRFr4HKjXp/5t8JZ11QbQfUS6/cRCKGwYhtNAY88kQ==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/darwin-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/darwin-x64/-/darwin-x64-0.21.5.tgz", + "integrity": "sha512-se/JjF8NlmKVG4kNIuyWMV/22ZaerB+qaSi5MdrXtd6R08kvs2qCN4C09miupktDitvh8jRFflwGFBQcxZRjbw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-arm64/-/freebsd-arm64-0.21.5.tgz", + "integrity": "sha512-5JcRxxRDUJLX8JXp/wcBCy3pENnCgBR9bN6JsY4OmhfUtIHe3ZW0mawA7+RDAcMLrMIZaf03NlQiX9DGyB8h4g==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/freebsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/freebsd-x64/-/freebsd-x64-0.21.5.tgz", + "integrity": "sha512-J95kNBj1zkbMXtHVH29bBriQygMXqoVQOQYA+ISs0/2l3T9/kj42ow2mpqerRBxDJnmkUDCaQT/dfNXWX/ZZCQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm/-/linux-arm-0.21.5.tgz", + "integrity": "sha512-bPb5AHZtbeNGjCKVZ9UGqGwo8EUu4cLq68E95A53KlxAPRmUyYv2D6F0uUI65XisGOL1hBP5mTronbgo+0bFcA==", + "cpu": [ + "arm" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-arm64/-/linux-arm64-0.21.5.tgz", + "integrity": "sha512-ibKvmyYzKsBeX8d8I7MH/TMfWDXBF3db4qM6sy+7re0YXya+K1cem3on9XgdT2EQGMu4hQyZhan7TeQ8XkGp4Q==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ia32/-/linux-ia32-0.21.5.tgz", + "integrity": "sha512-YvjXDqLRqPDl2dvRODYmmhz4rPeVKYvppfGYKSNGdyZkA01046pLWyRKKI3ax8fbJoK5QbxblURkwK/MWY18Tg==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-loong64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-loong64/-/linux-loong64-0.21.5.tgz", + "integrity": "sha512-uHf1BmMG8qEvzdrzAqg2SIG/02+4/DHB6a9Kbya0XDvwDEKCoC8ZRWI5JJvNdUjtciBGFQ5PuBlpEOXQj+JQSg==", + "cpu": [ + "loong64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-mips64el": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-mips64el/-/linux-mips64el-0.21.5.tgz", + "integrity": "sha512-IajOmO+KJK23bj52dFSNCMsz1QP1DqM6cwLUv3W1QwyxkyIWecfafnI555fvSGqEKwjMXVLokcV5ygHW5b3Jbg==", + "cpu": [ + "mips64el" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-ppc64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-ppc64/-/linux-ppc64-0.21.5.tgz", + "integrity": "sha512-1hHV/Z4OEfMwpLO8rp7CvlhBDnjsC3CttJXIhBi+5Aj5r+MBvy4egg7wCbe//hSsT+RvDAG7s81tAvpL2XAE4w==", + "cpu": [ + "ppc64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-riscv64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-riscv64/-/linux-riscv64-0.21.5.tgz", + "integrity": "sha512-2HdXDMd9GMgTGrPWnJzP2ALSokE/0O5HhTUvWIbD3YdjME8JwvSCnNGBnTThKGEB91OZhzrJ4qIIxk/SBmyDDA==", + "cpu": [ + "riscv64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-s390x": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-s390x/-/linux-s390x-0.21.5.tgz", + "integrity": "sha512-zus5sxzqBJD3eXxwvjN1yQkRepANgxE9lgOW2qLnmr8ikMTphkjgXu1HR01K4FJg8h1kEEDAqDcZQtbrRnB41A==", + "cpu": [ + "s390x" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/linux-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/linux-x64/-/linux-x64-0.21.5.tgz", + "integrity": "sha512-1rYdTpyv03iycF1+BhzrzQJCdOuAOtaqHTWJZCWvijKD2N5Xu0TtVC8/+1faWqcP9iBCWOmjmhoH94dH82BxPQ==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/netbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/netbsd-x64/-/netbsd-x64-0.21.5.tgz", + "integrity": "sha512-Woi2MXzXjMULccIwMnLciyZH4nCIMpWQAs049KEeMvOcNADVxo0UBIQPfSmxB3CWKedngg7sWZdLvLczpe0tLg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "netbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/openbsd-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/openbsd-x64/-/openbsd-x64-0.21.5.tgz", + "integrity": "sha512-HLNNw99xsvx12lFBUwoT8EVCsSvRNDVxNpjZ7bPn947b8gJPzeHWyNVhFsaerc0n3TsbOINvRP2byTZ5LKezow==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "openbsd" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/sunos-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/sunos-x64/-/sunos-x64-0.21.5.tgz", + "integrity": "sha512-6+gjmFpfy0BHU5Tpptkuh8+uw3mnrvgs+dSPQXQOv3ekbordwnzTVEb4qnIvQcYXq6gzkyTnoZ9dZG+D4garKg==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "sunos" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-arm64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-arm64/-/win32-arm64-0.21.5.tgz", + "integrity": "sha512-Z0gOTd75VvXqyq7nsl93zwahcTROgqvuAcYDUr+vOv8uHhNSKROyU961kgtCD1e95IqPKSQKH7tBTslnS3tA8A==", + "cpu": [ + "arm64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-ia32": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-ia32/-/win32-ia32-0.21.5.tgz", + "integrity": "sha512-SWXFF1CL2RVNMaVs+BBClwtfZSvDgtL//G/smwAc5oVK/UPu2Gu9tIaRgFmYFFKrmg3SyAjSrElf0TiJ1v8fYA==", + "cpu": [ + "ia32" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@esbuild/win32-x64": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/@esbuild/win32-x64/-/win32-x64-0.21.5.tgz", + "integrity": "sha512-tQd/1efJuzPC6rCFwEvLtci/xNFcTZknmXs98FYDfGE4wP9ClFV98nyKrzJKVPMhdDnjzLhdUyMX4PsQAPjwIw==", + "cpu": [ + "x64" + ], + "dev": true, + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">=12" + } + }, + "node_modules/@parcel/watcher": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher/-/watcher-2.4.1.tgz", + "integrity": "sha512-HNjmfLQEVRZmHRET336f20H/8kOozUGwk7yajvsonjNxbj2wBTK1WsQuHkD5yYh9RxFGL2EyDHryOihOwUoKDA==", + "license": "MIT", + "dependencies": { + "detect-libc": "^1.0.3", + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "node-addon-api": "^7.0.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + }, + "optionalDependencies": { + "@parcel/watcher-android-arm64": "2.4.1", + "@parcel/watcher-darwin-arm64": "2.4.1", + "@parcel/watcher-darwin-x64": "2.4.1", + "@parcel/watcher-freebsd-x64": "2.4.1", + "@parcel/watcher-linux-arm-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-glibc": "2.4.1", + "@parcel/watcher-linux-arm64-musl": "2.4.1", + "@parcel/watcher-linux-x64-glibc": "2.4.1", + "@parcel/watcher-linux-x64-musl": "2.4.1", + "@parcel/watcher-win32-arm64": "2.4.1", + "@parcel/watcher-win32-ia32": "2.4.1", + "@parcel/watcher-win32-x64": "2.4.1" + } + }, + "node_modules/@parcel/watcher-android-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-android-arm64/-/watcher-android-arm64-2.4.1.tgz", + "integrity": "sha512-LOi/WTbbh3aTn2RYddrO8pnapixAziFl6SMxHM69r3tvdSm94JtCenaKgk1GRg5FJ5wpMCpHeW+7yqPlvZv7kg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "android" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-arm64/-/watcher-darwin-arm64-2.4.1.tgz", + "integrity": "sha512-ln41eihm5YXIY043vBrrHfn94SIBlqOWmoROhsMVTSXGh0QahKGy77tfEywQ7v3NywyxBBkGIfrWRHm0hsKtzA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-darwin-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-darwin-x64/-/watcher-darwin-x64-2.4.1.tgz", + "integrity": "sha512-yrw81BRLjjtHyDu7J61oPuSoeYWR3lDElcPGJyOvIXmor6DEo7/G2u1o7I38cwlcoBHQFULqF6nesIX3tsEXMg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-freebsd-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-freebsd-x64/-/watcher-freebsd-x64-2.4.1.tgz", + "integrity": "sha512-TJa3Pex/gX3CWIx/Co8k+ykNdDCLx+TuZj3f3h7eOjgpdKM+Mnix37RYsYU4LHhiYJz3DK5nFCCra81p6g050w==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "freebsd" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm-glibc/-/watcher-linux-arm-glibc-2.4.1.tgz", + "integrity": "sha512-4rVYDlsMEYfa537BRXxJ5UF4ddNwnr2/1O4MHM5PjI9cvV2qymvhwZSFgXqbS8YoTk5i/JR0L0JDs69BUn45YA==", + "cpu": [ + "arm" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-glibc/-/watcher-linux-arm64-glibc-2.4.1.tgz", + "integrity": "sha512-BJ7mH985OADVLpbrzCLgrJ3TOpiZggE9FMblfO65PlOCdG++xJpKUJ0Aol74ZUIYfb8WsRlUdgrZxKkz3zXWYA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-arm64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-arm64-musl/-/watcher-linux-arm64-musl-2.4.1.tgz", + "integrity": "sha512-p4Xb7JGq3MLgAfYhslU2SjoV9G0kI0Xry0kuxeG/41UfpjHGOhv7UoUDAz/jb1u2elbhazy4rRBL8PegPJFBhA==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-glibc": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-glibc/-/watcher-linux-x64-glibc-2.4.1.tgz", + "integrity": "sha512-s9O3fByZ/2pyYDPoLM6zt92yu6P4E39a03zvO0qCHOTjxmt3GHRMLuRZEWhWLASTMSrrnVNWdVI/+pUElJBBBg==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-linux-x64-musl": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-linux-x64-musl/-/watcher-linux-x64-musl-2.4.1.tgz", + "integrity": "sha512-L2nZTYR1myLNST0O632g0Dx9LyMNHrn6TOt76sYxWLdff3cB22/GZX2UPtJnaqQPdCRoszoY5rcOj4oMTtp5fQ==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "linux" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-wasm": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-wasm/-/watcher-wasm-2.4.1.tgz", + "integrity": "sha512-/ZR0RxqxU/xxDGzbzosMjh4W6NdYFMqq2nvo2b8SLi7rsl/4jkL8S5stIikorNkdR50oVDvqb/3JT05WM+CRRA==", + "bundleDependencies": [ + "napi-wasm" + ], + "license": "MIT", + "dependencies": { + "is-glob": "^4.0.3", + "micromatch": "^4.0.5", + "napi-wasm": "^1.1.0" + }, + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-wasm/node_modules/napi-wasm": { + "version": "1.1.0", + "inBundle": true, + "license": "MIT" + }, + "node_modules/@parcel/watcher-win32-arm64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-arm64/-/watcher-win32-arm64-2.4.1.tgz", + "integrity": "sha512-Uq2BPp5GWhrq/lcuItCHoqxjULU1QYEcyjSO5jqqOK8RNFDBQnenMMx4gAl3v8GiWa59E9+uDM7yZ6LxwUIfRg==", + "cpu": [ + "arm64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-ia32": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-ia32/-/watcher-win32-ia32-2.4.1.tgz", + "integrity": "sha512-maNRit5QQV2kgHFSYwftmPBxiuK5u4DXjbXx7q6eKjq5dsLXZ4FJiVvlcw35QXzk0KrUecJmuVFbj4uV9oYrcw==", + "cpu": [ + "ia32" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@parcel/watcher-win32-x64": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/@parcel/watcher-win32-x64/-/watcher-win32-x64-2.4.1.tgz", + "integrity": "sha512-+DvS92F9ezicfswqrvIRM2njcYJbd5mb9CUgtrHCHmvn7pPPa+nMDRu1o1bYYz/l5IB2NVGNJWiH7h1E58IF2A==", + "cpu": [ + "x64" + ], + "license": "MIT", + "optional": true, + "os": [ + "win32" + ], + "engines": { + "node": ">= 10.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/parcel" + } + }, + "node_modules/@puppeteer/browsers": { + "version": "2.2.3", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.3.tgz", + "integrity": "sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==", + "license": "Apache-2.0", + "dependencies": { + "debug": "4.3.4", + "extract-zip": "2.0.1", + "progress": "2.0.3", + "proxy-agent": "6.4.0", + "semver": "7.6.0", + "tar-fs": "3.0.5", + "unbzip2-stream": "1.4.3", + "yargs": "17.7.2" + }, + "bin": { + "browsers": "lib/cjs/main-cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/@tootallnate/quickjs-emscripten": { + "version": "0.23.0", + "resolved": "https://registry.npmjs.org/@tootallnate/quickjs-emscripten/-/quickjs-emscripten-0.23.0.tgz", + "integrity": "sha512-C5Mc6rdnsaJDjO3UpGW/CQTHtCKaYlScZTly4JIu97Jxo/odCiH0ITnDXSJPTOrEKk/ycSZ0AOgTmkDtkOsvIA==", + "license": "MIT" + }, + "node_modules/@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "node_modules/@types/yauzl": { + "version": "2.10.3", + "resolved": "https://registry.npmjs.org/@types/yauzl/-/yauzl-2.10.3.tgz", + "integrity": "sha512-oJoftv0LSuaDZE3Le4DbKX+KS9G36NzOeSap90UIK0yMA/NhKJhqlSGtNDORNRaIbQfzjXDrQa0ytJ6mNRGz/Q==", + "license": "MIT", + "optional": true, + "dependencies": { + "@types/node": "*" + } + }, + "node_modules/acorn": { + "version": "8.12.0", + "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.12.0.tgz", + "integrity": "sha512-RTvkC4w+KNXrM39/lWCUaG0IbRkWdCv7W/IOW9oU6SawyxulvkQy5HQPVTKxEjczcUvapcrw3cFx/60VN/NRNw==", + "license": "MIT", + "bin": { + "acorn": "bin/acorn" + }, + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/agent-base": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/agent-base/-/agent-base-7.1.1.tgz", + "integrity": "sha512-H0TSyFNDMomMNJQBn8wFV5YC/2eJ+VXECwOadZJT554xP6cODZHPX3H9QMQECxvrgiSOP1pHjy1sMWQVYJOUOA==", + "license": "MIT", + "dependencies": { + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/ansi-regex": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", + "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "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/anymatch": { + "version": "3.1.3", + "resolved": "https://registry.npmjs.org/anymatch/-/anymatch-3.1.3.tgz", + "integrity": "sha512-KMReFUr0B4t+D+OBkjR3KYqvocp2XaSzO55UcB6mgQMd3KbcE+mWTyvVV7D/zsdEbNnV6acZUutkiHQXvTr1Rw==", + "license": "ISC", + "dependencies": { + "normalize-path": "^3.0.0", + "picomatch": "^2.0.4" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/argparse": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/argparse/-/argparse-2.0.1.tgz", + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==", + "license": "Python-2.0" + }, + "node_modules/ast-types": { + "version": "0.13.4", + "resolved": "https://registry.npmjs.org/ast-types/-/ast-types-0.13.4.tgz", + "integrity": "sha512-x1FCFnFifvYDDzTaLII71vG5uvDwgtmDTEVWAxrgeiR8VjMONcCXJx7E+USjDtHlwFmt9MysbqgF9b9Vjr6w+w==", + "license": "MIT", + "dependencies": { + "tslib": "^2.0.1" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/b4a": { + "version": "1.6.6", + "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", + "license": "Apache-2.0" + }, + "node_modules/bare-events": { + "version": "2.4.2", + "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.4.2.tgz", + "integrity": "sha512-qMKFd2qG/36aA4GwvKq8MxnPgCQAmBWmSyLWsJcbn8v03wvIPQ/hG1Ms8bPzndZxMDoHpxez5VOS+gC9Yi24/Q==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-fs": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", + "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-events": "^2.0.0", + "bare-path": "^2.0.0", + "bare-stream": "^2.0.0" + } + }, + "node_modules/bare-os": { + "version": "2.4.0", + "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", + "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", + "license": "Apache-2.0", + "optional": true + }, + "node_modules/bare-path": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", + "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "bare-os": "^2.1.0" + } + }, + "node_modules/bare-stream": { + "version": "2.1.3", + "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", + "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", + "license": "Apache-2.0", + "optional": true, + "dependencies": { + "streamx": "^2.18.0" + } + }, + "node_modules/base64-js": { + "version": "1.5.1", + "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", + "integrity": "sha512-AKpaYlHn8t4SVbOHCy+b5+KKgvR4vrsD8vbvrbiQJps7fKDTkjkDry6ji0rUJjC0kzbNePLwzxq8iypo41qeWA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT" + }, + "node_modules/basic-ftp": { + "version": "5.0.5", + "resolved": "https://registry.npmjs.org/basic-ftp/-/basic-ftp-5.0.5.tgz", + "integrity": "sha512-4Bcg1P8xhUuqcii/S0Z9wiHIrQVPMermM1any+MX5GeGD7faD3/msQUDGLol9wOcz4/jbg/WJnGqoJF6LiBdtg==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/binary-extensions": { + "version": "2.3.0", + "resolved": "https://registry.npmjs.org/binary-extensions/-/binary-extensions-2.3.0.tgz", + "integrity": "sha512-Ceh+7ox5qe7LJuLHoY0feh3pHuUDHAcRUeyL2VYghZwfpkNIy/+8Ocg0a3UuSoYzavmylwuLWQOf3hl0jjMMIw==", + "license": "MIT", + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/braces": { + "version": "3.0.3", + "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.3.tgz", + "integrity": "sha512-yQbXgO/OSZVD2IsiLlro+7Hf6Q18EJrKSEsdoMzKePKXct3gvD8oLcOQdIzGupr5Fj+EDe8gO/lxc1BzfMpxvA==", + "license": "MIT", + "dependencies": { + "fill-range": "^7.1.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/buffer": { + "version": "5.7.1", + "resolved": "https://registry.npmjs.org/buffer/-/buffer-5.7.1.tgz", + "integrity": "sha512-EHcyIPBQ4BSGlvjB16k5KgAJ27CIsHY/2JBmCRReo48y9rQ3MaUzWX3KVlBa4U7MyX02HdVj0K7C3WaB3ju7FQ==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "MIT", + "dependencies": { + "base64-js": "^1.3.1", + "ieee754": "^1.1.13" + } + }, + "node_modules/buffer-crc32": { + "version": "0.2.13", + "resolved": "https://registry.npmjs.org/buffer-crc32/-/buffer-crc32-0.2.13.tgz", + "integrity": "sha512-VO9Ht/+p3SN7SKWqcrgEzjGbRSJYTx+Q1pTQC0wrWqHx0vpJraQ6GtHx8tvcg1rlK1byhU5gccxgOgj7B0TDkQ==", + "license": "MIT", + "engines": { + "node": "*" + } + }, + "node_modules/callsites": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", + "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "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/chokidar": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/chokidar/-/chokidar-3.6.0.tgz", + "integrity": "sha512-7VT13fmjotKpGipCW9JEQAusEPE+Ei8nl6/g4FBAmIm0GOOLMua9NDDo/DWp0ZAxCr3cPq5ZpBqmPAQgDda2Pw==", + "license": "MIT", + "dependencies": { + "anymatch": "~3.1.2", + "braces": "~3.0.2", + "glob-parent": "~5.1.2", + "is-binary-path": "~2.1.0", + "is-glob": "~4.0.1", + "normalize-path": "~3.0.0", + "readdirp": "~3.6.0" + }, + "engines": { + "node": ">= 8.10.0" + }, + "funding": { + "url": "https://paulmillr.com/funding/" + }, + "optionalDependencies": { + "fsevents": "~2.3.2" + } + }, + "node_modules/chromium-bidi": { + "version": "0.5.23", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.23.tgz", + "integrity": "sha512-1o/gLU9wDqbN5nL2MtfjykjOuighGXc3/hnWueO1haiEoFgX8h5vbvcA4tgdQfjw1mkZ1OEF4x/+HVeqEX6NoA==", + "license": "Apache-2.0", + "dependencies": { + "mitt": "3.0.1", + "urlpattern-polyfill": "10.0.0", + "zod": "3.23.8" + }, + "peerDependencies": { + "devtools-protocol": "*" + } + }, + "node_modules/citty": { + "version": "0.1.6", + "resolved": "https://registry.npmjs.org/citty/-/citty-0.1.6.tgz", + "integrity": "sha512-tskPPKEs8D2KPafUypv2gxwJP8h/OaJmC82QQGGDQcHvXX43xF2VDACcJVmZ0EuSxkpO9Kc4MlrA3q0+FG58AQ==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3" + } + }, + "node_modules/clipboardy": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/clipboardy/-/clipboardy-4.0.0.tgz", + "integrity": "sha512-5mOlNS0mhX0707P2I0aZ2V/cmHUEO/fL7VFLqszkhUsxt7RwnmrInf/eEQKlf5GzvYeHIjT+Ov1HRfNmymlG0w==", + "license": "MIT", + "dependencies": { + "execa": "^8.0.1", + "is-wsl": "^3.1.0", + "is64bit": "^2.0.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/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/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/confbox": { + "version": "0.1.7", + "resolved": "https://registry.npmjs.org/confbox/-/confbox-0.1.7.tgz", + "integrity": "sha512-uJcB/FKZtBMCJpK8MQji6bJHgu1tixKPxRLeGkNzBoOZzpnZUJm0jm2/sBDWcuBx1dYgxV4JU+g5hmNxCyAmdA==", + "license": "MIT" + }, + "node_modules/consola": { + "version": "3.2.3", + "resolved": "https://registry.npmjs.org/consola/-/consola-3.2.3.tgz", + "integrity": "sha512-I5qxpzLv+sJhTVEoLYNcTW+bThDCPsit0vLNKShZx6rLtpilNpmmeTPaeqJb9ZE9dV3DGaeby6Vuhrw38WjeyQ==", + "license": "MIT", + "engines": { + "node": "^14.18.0 || >=16.10.0" + } + }, + "node_modules/cookie-es": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/cookie-es/-/cookie-es-1.1.0.tgz", + "integrity": "sha512-L2rLOcK0wzWSfSDA33YR+PUHDG10a8px7rUHKWbGLP4YfbsMed2KFUw5fczvDPbT98DDe3LEzviswl810apTEw==", + "license": "MIT" + }, + "node_modules/cosmiconfig": { + "version": "9.0.0", + "resolved": "https://registry.npmjs.org/cosmiconfig/-/cosmiconfig-9.0.0.tgz", + "integrity": "sha512-itvL5h8RETACmOTFc4UfIyB2RfEHi71Ax6E/PivVxq9NseKbOWpeyHEOIbmAw1rs8Ak0VursQNww7lf7YtUwzg==", + "license": "MIT", + "dependencies": { + "env-paths": "^2.2.1", + "import-fresh": "^3.3.0", + "js-yaml": "^4.1.0", + "parse-json": "^5.2.0" + }, + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/d-fischer" + }, + "peerDependencies": { + "typescript": ">=4.9.5" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/cross-spawn": { + "version": "7.0.3", + "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", + "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", + "license": "MIT", + "dependencies": { + "path-key": "^3.1.0", + "shebang-command": "^2.0.0", + "which": "^2.0.1" + }, + "engines": { + "node": ">= 8" + } + }, + "node_modules/crossws": { + "version": "0.2.4", + "resolved": "https://registry.npmjs.org/crossws/-/crossws-0.2.4.tgz", + "integrity": "sha512-DAxroI2uSOgUKLz00NX6A8U/8EE3SZHmIND+10jkVSaypvyt57J5JEOxAQOL6lQxyzi/wZbTIwssU1uy69h5Vg==", + "license": "MIT", + "peerDependencies": { + "uWebSockets.js": "*" + }, + "peerDependenciesMeta": { + "uWebSockets.js": { + "optional": true + } + } + }, + "node_modules/data-uri-to-buffer": { + "version": "6.0.2", + "resolved": "https://registry.npmjs.org/data-uri-to-buffer/-/data-uri-to-buffer-6.0.2.tgz", + "integrity": "sha512-7hvf7/GW8e86rW0ptuwS3OcBGDjIi6SZva7hCyWC0yYry2cOPmLIjXAUHI6DK2HsnwJd9ifmt57i8eV2n4YNpw==", + "license": "MIT", + "engines": { + "node": ">= 14" + } + }, + "node_modules/debug": { + "version": "4.3.4", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", + "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/defu": { + "version": "6.1.4", + "resolved": "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz", + "integrity": "sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg==", + "license": "MIT" + }, + "node_modules/degenerator": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/degenerator/-/degenerator-5.0.1.tgz", + "integrity": "sha512-TllpMR/t0M5sqCXfj85i4XaAzxmS5tVA16dqvdkMwGmzI+dXLXnw3J+3Vdv7VKw+ThlTMboK6i9rnZ6Nntj5CQ==", + "license": "MIT", + "dependencies": { + "ast-types": "^0.13.4", + "escodegen": "^2.1.0", + "esprima": "^4.0.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/destr": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/destr/-/destr-2.0.3.tgz", + "integrity": "sha512-2N3BOUU4gYMpTP24s5rF5iP7BDr7uNTCs4ozw3kf/eKfvWSIu93GEBi5m427YoyJoeOzQ5smuu4nNAPGb8idSQ==", + "license": "MIT" + }, + "node_modules/detect-libc": { + "version": "1.0.3", + "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-1.0.3.tgz", + "integrity": "sha512-pGjwhsmsp4kL2RTz08wcOlGN83otlqHeD/Z5T8GXZB+/YcpQ/dgo+lbU8ZsGxV0HIvqqxo9l7mqYwyYMD9bKDg==", + "license": "Apache-2.0", + "bin": { + "detect-libc": "bin/detect-libc.js" + }, + "engines": { + "node": ">=0.10" + } + }, + "node_modules/devtools-protocol": { + "version": "0.0.1299070", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz", + "integrity": "sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg==", + "license": "BSD-3-Clause" + }, + "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==", + "license": "MIT" + }, + "node_modules/end-of-stream": { + "version": "1.4.4", + "resolved": "https://registry.npmjs.org/end-of-stream/-/end-of-stream-1.4.4.tgz", + "integrity": "sha512-+uw1inIHVPQoaVuHzRyXd21icM+cnt4CzD5rW+NC1wjOUSTOs+Te7FOv7AhN7vS9x/oIyhLP5PR1H+phQAHu5Q==", + "license": "MIT", + "dependencies": { + "once": "^1.4.0" + } + }, + "node_modules/env-paths": { + "version": "2.2.1", + "resolved": "https://registry.npmjs.org/env-paths/-/env-paths-2.2.1.tgz", + "integrity": "sha512-+h1lkLKhZMTYjog1VEpJNG7NZJWcuc2DDk/qsqSTRRCOXiLjeQ1d1/udrUGhqMxUgAlwKNZ0cf2uqan5GLuS2A==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/error-ex": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/error-ex/-/error-ex-1.3.2.tgz", + "integrity": "sha512-7dFHNmqeFSEt2ZBsCriorKnn3Z2pj+fd9kmI6QoWw4//DL+icEBfc0U7qJCisqrTsKTjw4fNFy2pW9OqStD84g==", + "license": "MIT", + "dependencies": { + "is-arrayish": "^0.2.1" + } + }, + "node_modules/esbuild": { + "version": "0.21.5", + "resolved": "https://registry.npmjs.org/esbuild/-/esbuild-0.21.5.tgz", + "integrity": "sha512-mg3OPMV4hXywwpoDxu3Qda5xCKQi+vCTZq8S9J/EpkhB2HzKXq4SNFZE3+NK93JYxc8VMSep+lOUSC/RVKaBqw==", + "dev": true, + "hasInstallScript": true, + "license": "MIT", + "bin": { + "esbuild": "bin/esbuild" + }, + "engines": { + "node": ">=12" + }, + "optionalDependencies": { + "@esbuild/aix-ppc64": "0.21.5", + "@esbuild/android-arm": "0.21.5", + "@esbuild/android-arm64": "0.21.5", + "@esbuild/android-x64": "0.21.5", + "@esbuild/darwin-arm64": "0.21.5", + "@esbuild/darwin-x64": "0.21.5", + "@esbuild/freebsd-arm64": "0.21.5", + "@esbuild/freebsd-x64": "0.21.5", + "@esbuild/linux-arm": "0.21.5", + "@esbuild/linux-arm64": "0.21.5", + "@esbuild/linux-ia32": "0.21.5", + "@esbuild/linux-loong64": "0.21.5", + "@esbuild/linux-mips64el": "0.21.5", + "@esbuild/linux-ppc64": "0.21.5", + "@esbuild/linux-riscv64": "0.21.5", + "@esbuild/linux-s390x": "0.21.5", + "@esbuild/linux-x64": "0.21.5", + "@esbuild/netbsd-x64": "0.21.5", + "@esbuild/openbsd-x64": "0.21.5", + "@esbuild/sunos-x64": "0.21.5", + "@esbuild/win32-arm64": "0.21.5", + "@esbuild/win32-ia32": "0.21.5", + "@esbuild/win32-x64": "0.21.5" + } + }, + "node_modules/escalade": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/escalade/-/escalade-3.1.2.tgz", + "integrity": "sha512-ErCHMCae19vR8vQGe50xIsVomy19rg6gFu3+r3jkEO46suLMWBksvVyoGgQV+jOfl84ZSOSlmv6Gxa89PmTGmA==", + "license": "MIT", + "engines": { + "node": ">=6" + } + }, + "node_modules/escape-string-regexp": { + "version": "1.0.5", + "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", + "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", + "license": "MIT", + "engines": { + "node": ">=0.8.0" + } + }, + "node_modules/escodegen": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/escodegen/-/escodegen-2.1.0.tgz", + "integrity": "sha512-2NlIDTwUWJN0mRPQOdtQBzbUHvdGY2P1VXSyU83Q3xKxM7WHX2Ql8dKq782Q9TgQUNOLEzEYu9bzLNj1q88I5w==", + "license": "BSD-2-Clause", + "dependencies": { + "esprima": "^4.0.1", + "estraverse": "^5.2.0", + "esutils": "^2.0.2" + }, + "bin": { + "escodegen": "bin/escodegen.js", + "esgenerate": "bin/esgenerate.js" + }, + "engines": { + "node": ">=6.0" + }, + "optionalDependencies": { + "source-map": "~0.6.1" + } + }, + "node_modules/esprima": { + "version": "4.0.1", + "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", + "integrity": "sha512-eGuFFw7Upda+g4p+QHvnW0RyTX/SVeJBDM/gCtMARO0cLuT2HcEKnTPvhjV6aGeqrCB/sbNop0Kszm0jsaWU4A==", + "license": "BSD-2-Clause", + "bin": { + "esparse": "bin/esparse.js", + "esvalidate": "bin/esvalidate.js" + }, + "engines": { + "node": ">=4" + } + }, + "node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=4.0" + } + }, + "node_modules/esutils": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/esutils/-/esutils-2.0.3.tgz", + "integrity": "sha512-kVscqXk4OCp68SZ0dkgEKVi6/8ij300KBWTJq32P/dYeWTSwK41WyTxalN1eRmA5Z9UU/LX9D7FWSmV9SAYx6g==", + "license": "BSD-2-Clause", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/execa": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/execa/-/execa-8.0.1.tgz", + "integrity": "sha512-VyhnebXciFV2DESc+p6B+y0LjSm0krU4OgJN44qFAhBY0TJ+1V61tYD2+wHusZ6F9n5K+vl8k0sTy7PEfV4qpg==", + "license": "MIT", + "dependencies": { + "cross-spawn": "^7.0.3", + "get-stream": "^8.0.1", + "human-signals": "^5.0.0", + "is-stream": "^3.0.0", + "merge-stream": "^2.0.0", + "npm-run-path": "^5.1.0", + "onetime": "^6.0.0", + "signal-exit": "^4.1.0", + "strip-final-newline": "^3.0.0" + }, + "engines": { + "node": ">=16.17" + }, + "funding": { + "url": "https://github.com/sindresorhus/execa?sponsor=1" + } + }, + "node_modules/execa/node_modules/get-stream": { + "version": "8.0.1", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-8.0.1.tgz", + "integrity": "sha512-VaUJspBffn/LMCJVoMvSAdmscJyS1auj5Zulnn5UoYcY531UWmdwhRWkcGKnGU93m5HSXP9LP2usOryrBtQowA==", + "license": "MIT", + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/extract-zip": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/extract-zip/-/extract-zip-2.0.1.tgz", + "integrity": "sha512-GDhU9ntwuKyGXdZBUgTIe+vXnWj0fppUEtMDL0+idd5Sta8TGpHssn/eusA9mrPr9qNDym6SxAYZjNvCn/9RBg==", + "license": "BSD-2-Clause", + "dependencies": { + "debug": "^4.1.1", + "get-stream": "^5.1.0", + "yauzl": "^2.10.0" + }, + "bin": { + "extract-zip": "cli.js" + }, + "engines": { + "node": ">= 10.17.0" + }, + "optionalDependencies": { + "@types/yauzl": "^2.9.1" + } + }, + "node_modules/fast-fifo": { + "version": "1.3.2", + "resolved": "https://registry.npmjs.org/fast-fifo/-/fast-fifo-1.3.2.tgz", + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==", + "license": "MIT" + }, + "node_modules/fd-slicer": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/fd-slicer/-/fd-slicer-1.1.0.tgz", + "integrity": "sha512-cE1qsB/VwyQozZ+q1dGxR8LBYNZeofhEdUNGSMbQD3Gw2lAzX9Zb3uIU6Ebc/Fmyjo9AWWfnn0AUCHqtevs/8g==", + "license": "MIT", + "dependencies": { + "pend": "~1.2.0" + } + }, + "node_modules/fill-range": { + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.1.1.tgz", + "integrity": "sha512-YsGpe3WHLK8ZYi4tWDg2Jy3ebRz2rXowDxnld4bkQB00cc/1Zw9AWnC0i9ztDJitivtQvaI9KaLyKrc+hBW0yg==", + "license": "MIT", + "dependencies": { + "to-regex-range": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/fs-extra": { + "version": "11.2.0", + "resolved": "https://registry.npmjs.org/fs-extra/-/fs-extra-11.2.0.tgz", + "integrity": "sha512-PmDi3uwK5nFuXh7XDTlVnS17xJS7vW36is2+w3xcv8SVxiB4NyATf4ctkVY5bkSjX0Y4nbvZCq1/EjtEyr9ktw==", + "license": "MIT", + "dependencies": { + "graceful-fs": "^4.2.0", + "jsonfile": "^6.0.1", + "universalify": "^2.0.0" + }, + "engines": { + "node": ">=14.14" + } + }, + "node_modules/fsevents": { + "version": "2.3.3", + "resolved": "https://registry.npmjs.org/fsevents/-/fsevents-2.3.3.tgz", + "integrity": "sha512-5xoDfX+fL7faATnagmWPpbFtwh/R77WmMMqqHGS65C3vvB0YHrgF+B1YmZ3441tMj5n63k0212XNoJwzlhffQw==", + "hasInstallScript": true, + "license": "MIT", + "optional": true, + "os": [ + "darwin" + ], + "engines": { + "node": "^8.16.0 || ^10.6.0 || >=11.0.0" + } + }, + "node_modules/get-caller-file": { + "version": "2.0.5", + "resolved": "https://registry.npmjs.org/get-caller-file/-/get-caller-file-2.0.5.tgz", + "integrity": "sha512-DyFP3BM/3YHTQOCUL/w0OZHR0lpKeGrxotcHWcqNEdnltqFwXVfhEBQ94eIo34AfQpo0rGki4cyIiftY06h2Fg==", + "license": "ISC", + "engines": { + "node": "6.* || 8.* || >= 10.*" + } + }, + "node_modules/get-port-please": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/get-port-please/-/get-port-please-3.1.2.tgz", + "integrity": "sha512-Gxc29eLs1fbn6LQ4jSU4vXjlwyZhF5HsGuMAa7gqBP4Rw4yxxltyDUuF5MBclFzDTXO+ACchGQoeela4DSfzdQ==", + "license": "MIT" + }, + "node_modules/get-stream": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/get-stream/-/get-stream-5.2.0.tgz", + "integrity": "sha512-nBF+F1rAZVCu/p7rjzgA+Yb4lfYXrpl7a6VmJrU8wF9I1CKvP/QwPNZHnOlwbTkY6dvtFIzFMSyQXbLoTQPRpA==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/get-tsconfig": { + "version": "4.7.5", + "resolved": "https://registry.npmjs.org/get-tsconfig/-/get-tsconfig-4.7.5.tgz", + "integrity": "sha512-ZCuZCnlqNzjb4QprAzXKdpp/gh6KTxSJuw3IBsPnV/7fV4NxC9ckB+vPTt8w7fJA0TaSD7c55BR47JD6MEDyDw==", + "dev": true, + "license": "MIT", + "dependencies": { + "resolve-pkg-maps": "^1.0.0" + }, + "funding": { + "url": "https://github.com/privatenumber/get-tsconfig?sponsor=1" + } + }, + "node_modules/get-uri": { + "version": "6.0.3", + "resolved": "https://registry.npmjs.org/get-uri/-/get-uri-6.0.3.tgz", + "integrity": "sha512-BzUrJBS9EcUb4cFol8r4W3v1cPsSyajLSthNkz5BxbpDcHN5tIrM10E2eNvfnvBn3DaT3DUgx0OpsBKkaOpanw==", + "license": "MIT", + "dependencies": { + "basic-ftp": "^5.0.2", + "data-uri-to-buffer": "^6.0.2", + "debug": "^4.3.4", + "fs-extra": "^11.2.0" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/glob-parent": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", + "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", + "license": "ISC", + "dependencies": { + "is-glob": "^4.0.1" + }, + "engines": { + "node": ">= 6" + } + }, + "node_modules/graceful-fs": { + "version": "4.2.11", + "resolved": "https://registry.npmjs.org/graceful-fs/-/graceful-fs-4.2.11.tgz", + "integrity": "sha512-RbJ5/jmFcNNCcDV5o9eTnBLJ/HszWV0P73bc+Ff4nS/rJj+YaS6IGyiOL0VoBYX+l1Wrl3k63h/KrH+nhJ0XvQ==", + "license": "ISC" + }, + "node_modules/h3": { + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/h3/-/h3-1.11.1.tgz", + "integrity": "sha512-AbaH6IDnZN6nmbnJOH72y3c5Wwh9P97soSVdGSBbcDACRdkC0FEWf25pzx4f/NuOCK6quHmW18yF2Wx+G4Zi1A==", + "license": "MIT", + "dependencies": { + "cookie-es": "^1.0.0", + "crossws": "^0.2.2", + "defu": "^6.1.4", + "destr": "^2.0.3", + "iron-webcrypto": "^1.0.0", + "ohash": "^1.1.3", + "radix3": "^1.1.0", + "ufo": "^1.4.0", + "uncrypto": "^0.1.3", + "unenv": "^1.9.0" + } + }, + "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/http-proxy-agent": { + "version": "7.0.2", + "resolved": "https://registry.npmjs.org/http-proxy-agent/-/http-proxy-agent-7.0.2.tgz", + "integrity": "sha512-T1gkAiYYDWYx3V5Bmyu7HcfcvL7mUrTWiM6yOfa3PIphViJ/gFPbvidQ+veqSOHci/PxBcDabeUNCzpOODJZig==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.0", + "debug": "^4.3.4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/http-shutdown": { + "version": "1.2.2", + "resolved": "https://registry.npmjs.org/http-shutdown/-/http-shutdown-1.2.2.tgz", + "integrity": "sha512-S9wWkJ/VSY9/k4qcjG318bqJNruzE4HySUhFYknwmu6LBP97KLLfwNf+n4V1BHurvFNkSKLFnK/RsuUnRTf9Vw==", + "license": "MIT", + "engines": { + "iojs": ">= 1.0.0", + "node": ">= 0.12.0" + } + }, + "node_modules/https-proxy-agent": { + "version": "7.0.4", + "resolved": "https://registry.npmjs.org/https-proxy-agent/-/https-proxy-agent-7.0.4.tgz", + "integrity": "sha512-wlwpilI7YdjSkWaQ/7omYBMTliDcmCN8OLihO6I9B86g06lMyAoqgoDpV0XqoaPOKj+0DIdAvnsWfyAAhmimcg==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "4" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/human-signals": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/human-signals/-/human-signals-5.0.0.tgz", + "integrity": "sha512-AXcZb6vzzrFAUE61HnN4mpLqd/cSIwNQjtNWR0euPm6y0iqx3G4gOXaIDdtdDwZmhwe82LA6+zinmW4UBWVePQ==", + "license": "Apache-2.0", + "engines": { + "node": ">=16.17.0" + } + }, + "node_modules/ieee754": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/ieee754/-/ieee754-1.2.1.tgz", + "integrity": "sha512-dcyqhDvX1C46lXZcVqCpK+FtMRQVdIMN6/Df5js2zouUsqG7I6sFxitIC+7KYK29KdXOLHdu9zL4sFnoVQnqaA==", + "funding": [ + { + "type": "github", + "url": "https://github.com/sponsors/feross" + }, + { + "type": "patreon", + "url": "https://www.patreon.com/feross" + }, + { + "type": "consulting", + "url": "https://feross.org/support" + } + ], + "license": "BSD-3-Clause" + }, + "node_modules/import-fresh": { + "version": "3.3.0", + "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", + "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", + "license": "MIT", + "dependencies": { + "parent-module": "^1.0.0", + "resolve-from": "^4.0.0" + }, + "engines": { + "node": ">=6" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ip-address": { + "version": "9.0.5", + "resolved": "https://registry.npmjs.org/ip-address/-/ip-address-9.0.5.tgz", + "integrity": "sha512-zHtQzGojZXTwZTHQqra+ETKd4Sn3vgi7uBmlPoXVWZqYvuKmtI0l/VZTjqGmJY9x88GGOaZ9+G9ES8hC4T4X8g==", + "license": "MIT", + "dependencies": { + "jsbn": "1.1.0", + "sprintf-js": "^1.1.3" + }, + "engines": { + "node": ">= 12" + } + }, + "node_modules/iron-webcrypto": { + "version": "1.2.1", + "resolved": "https://registry.npmjs.org/iron-webcrypto/-/iron-webcrypto-1.2.1.tgz", + "integrity": "sha512-feOM6FaSr6rEABp/eDfVseKyTMDt+KGpeB35SkVn9Tyn0CqvVsY3EwI0v5i8nMHyJnzCIQf7nsy3p41TPkJZhg==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/brc-dd" + } + }, + "node_modules/is-arrayish": { + "version": "0.2.1", + "resolved": "https://registry.npmjs.org/is-arrayish/-/is-arrayish-0.2.1.tgz", + "integrity": "sha512-zz06S8t0ozoDXMG+ube26zeCTNXcKIPJZJi8hBrF4idCLms4CG9QtK7qBl1boi5ODzFpjswb5JPmHCbMpjaYzg==", + "license": "MIT" + }, + "node_modules/is-binary-path": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/is-binary-path/-/is-binary-path-2.1.0.tgz", + "integrity": "sha512-ZMERYes6pDydyuGidse7OsHxtbI7WVeUEozgR/g7rd0xUimYNlvZRE/K2MgZTjWy725IfelLeVcEM97mmtRGXw==", + "license": "MIT", + "dependencies": { + "binary-extensions": "^2.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/is-docker": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-docker/-/is-docker-3.0.0.tgz", + "integrity": "sha512-eljcgEDlEns/7AXFosB5K/2nCM4P7FQPkGc/DWLy5rmFEWvZayGrik1d9/QIY5nJ4f9YsVvBkA6kJpHn9rISdQ==", + "license": "MIT", + "bin": { + "is-docker": "cli.js" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-extglob": { + "version": "2.1.1", + "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", + "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-fullwidth-code-point": { + "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==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/is-glob": { + "version": "4.0.3", + "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", + "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", + "license": "MIT", + "dependencies": { + "is-extglob": "^2.1.1" + }, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/is-inside-container": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/is-inside-container/-/is-inside-container-1.0.0.tgz", + "integrity": "sha512-KIYLCCJghfHZxqjYBE7rEy0OBuTd5xCHS7tHVgvCLkx7StIoaxwNW3hCALgEUjFfeRk+MG/Qxmp/vtETEF3tRA==", + "license": "MIT", + "dependencies": { + "is-docker": "^3.0.0" + }, + "bin": { + "is-inside-container": "cli.js" + }, + "engines": { + "node": ">=14.16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-number": { + "version": "7.0.0", + "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", + "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", + "license": "MIT", + "engines": { + "node": ">=0.12.0" + } + }, + "node_modules/is-stream": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", + "integrity": "sha512-LnQR4bZ9IADDRSkvpqMGvt/tEJWclzklNgSw48V5EAaAeDd6qGvN8ei6k5p0tvxSR171VmGyHuTiAOfxAbr8kA==", + "license": "MIT", + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is-wsl": { + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/is-wsl/-/is-wsl-3.1.0.tgz", + "integrity": "sha512-UcVfVfaK4Sc4m7X3dUSoHoozQGBEFeDC+zVo06t98xe8CzHSZZBekNXH+tu0NalHolcJ/QAGqS46Hef7QXBIMw==", + "license": "MIT", + "dependencies": { + "is-inside-container": "^1.0.0" + }, + "engines": { + "node": ">=16" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/is64bit": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/is64bit/-/is64bit-2.0.0.tgz", + "integrity": "sha512-jv+8jaWCl0g2lSBkNSVXdzfBA0npK1HGC2KtWM9FumFRoGS94g3NbCCLVnCYHLjp4GrW2KZeeSTMo5ddtznmGw==", + "license": "MIT", + "dependencies": { + "system-architecture": "^0.1.0" + }, + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/isexe": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", + "license": "ISC" + }, + "node_modules/jiti": { + "version": "1.21.6", + "resolved": "https://registry.npmjs.org/jiti/-/jiti-1.21.6.tgz", + "integrity": "sha512-2yTgeWTWzMWkHu6Jp9NKgePDaYHbntiwvYuuJLbbN9vl7DC9DvXKOB2BC3ZZ92D3cvV/aflH0osDfwpHepQ53w==", + "license": "MIT", + "bin": { + "jiti": "bin/jiti.js" + } + }, + "node_modules/js-tokens": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz", + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==", + "license": "MIT" + }, + "node_modules/js-yaml": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/js-yaml/-/js-yaml-4.1.0.tgz", + "integrity": "sha512-wpxZs9NoxZaJESJGIZTyDEaYpl0FKSA+FB9aJiyemKhMwkxQg63h4T1KJgUGHpTqPDNRcmmYLugrRjJlBtWvRA==", + "license": "MIT", + "dependencies": { + "argparse": "^2.0.1" + }, + "bin": { + "js-yaml": "bin/js-yaml.js" + } + }, + "node_modules/jsbn": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/jsbn/-/jsbn-1.1.0.tgz", + "integrity": "sha512-4bYVV3aAMtDTTu4+xsDYa6sy9GyJ69/amsu9sYF2zqjiEoZA5xJi3BrfX3uY+/IekIu7MwdObdbDWpoZdBv3/A==", + "license": "MIT" + }, + "node_modules/json-parse-even-better-errors": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/json-parse-even-better-errors/-/json-parse-even-better-errors-2.3.1.tgz", + "integrity": "sha512-xyFwyhro/JEof6Ghe2iz2NcXoj2sloNsWr/XsERDK/oiPCfaNhl5ONfp+jQdAZRQQ0IJWNzH9zIZF7li91kh2w==", + "license": "MIT" + }, + "node_modules/jsonfile": { + "version": "6.1.0", + "resolved": "https://registry.npmjs.org/jsonfile/-/jsonfile-6.1.0.tgz", + "integrity": "sha512-5dgndWOriYSm5cnYaJNhalLNDKOqFwyDB/rr1E9ZsGciGvKPs8R2xYGCacuf3z6K1YKDz182fd+fY3cn3pMqXQ==", + "license": "MIT", + "dependencies": { + "universalify": "^2.0.0" + }, + "optionalDependencies": { + "graceful-fs": "^4.1.6" + } + }, + "node_modules/lines-and-columns": { + "version": "1.2.4", + "resolved": "https://registry.npmjs.org/lines-and-columns/-/lines-and-columns-1.2.4.tgz", + "integrity": "sha512-7ylylesZQ/PV29jhEDl3Ufjo6ZX7gCqJr5F7PKrqc93v7fzSymt1BpwEU8nAUXs8qzzvqhbjhK5QZg6Mt/HkBg==", + "license": "MIT" + }, + "node_modules/listhen": { + "version": "1.7.2", + "resolved": "https://registry.npmjs.org/listhen/-/listhen-1.7.2.tgz", + "integrity": "sha512-7/HamOm5YD9Wb7CFgAZkKgVPA96WwhcTQoqtm2VTZGVbVVn3IWKRBTgrU7cchA3Q8k9iCsG8Osoi9GX4JsGM9g==", + "license": "MIT", + "dependencies": { + "@parcel/watcher": "^2.4.1", + "@parcel/watcher-wasm": "^2.4.1", + "citty": "^0.1.6", + "clipboardy": "^4.0.0", + "consola": "^3.2.3", + "crossws": "^0.2.0", + "defu": "^6.1.4", + "get-port-please": "^3.1.2", + "h3": "^1.10.2", + "http-shutdown": "^1.2.2", + "jiti": "^1.21.0", + "mlly": "^1.6.1", + "node-forge": "^1.3.1", + "pathe": "^1.1.2", + "std-env": "^3.7.0", + "ufo": "^1.4.0", + "untun": "^0.1.3", + "uqr": "^0.1.2" + }, + "bin": { + "listen": "bin/listhen.mjs", + "listhen": "bin/listhen.mjs" + } + }, + "node_modules/lru-cache": { + "version": "7.18.3", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-7.18.3.tgz", + "integrity": "sha512-jumlc0BIUrS3qJGgIkWZsyfAM7NCWiBcCDhnd+3NNM5KbBmLTgHVfWBcg6W+rLUsIpzpERPsvwUP7CckAQSOoA==", + "license": "ISC", + "engines": { + "node": ">=12" + } + }, + "node_modules/merge-stream": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/merge-stream/-/merge-stream-2.0.0.tgz", + "integrity": "sha512-abv/qOcuPfk3URPfDzmZU1LKmuw8kT+0nIHvKrKgFrwifol/doWcdA4ZqsWQ8ENrFKkd67Mfpo/LovbIUsbt3w==", + "license": "MIT" + }, + "node_modules/micromatch": { + "version": "4.0.7", + "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.7.tgz", + "integrity": "sha512-LPP/3KorzCwBxfeUuZmaR6bG2kdeHSbe0P2tY3FLRU4vYrjYz5hI4QZwV0njUx3jeuKe67YukQ1LSPZBKDqO/Q==", + "license": "MIT", + "dependencies": { + "braces": "^3.0.3", + "picomatch": "^2.3.1" + }, + "engines": { + "node": ">=8.6" + } + }, + "node_modules/mime": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-3.0.0.tgz", + "integrity": "sha512-jSCU7/VB1loIWBZe14aEYHU/+1UMEHoaO7qxCOVJOw9GgH72VAWppxNcjU+x9a2k3GSIBXNKxXQFqRvvZ7vr3A==", + "license": "MIT", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=10.0.0" + } + }, + "node_modules/mimic-fn": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/mimic-fn/-/mimic-fn-4.0.0.tgz", + "integrity": "sha512-vqiC06CuhBTUdZH+RYl8sFrL096vA45Ok5ISO6sE/Mr1jRbGH4Csnhi8f3wKVl7x8mO4Au7Ir9D3Oyv1VYMFJw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/mitt": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/mitt/-/mitt-3.0.1.tgz", + "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", + "license": "MIT" + }, + "node_modules/mlly": { + "version": "1.7.1", + "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", + "integrity": "sha512-rrVRZRELyQzrIUAVMHxP97kv+G786pHmOKzuFII8zDYahFBS7qnHh2AlYSl1GAHhaMPCz6/oHjVMcfFYgFYHgA==", + "license": "MIT", + "dependencies": { + "acorn": "^8.11.3", + "pathe": "^1.1.2", + "pkg-types": "^1.1.1", + "ufo": "^1.5.3" + } + }, + "node_modules/mri": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/mri/-/mri-1.2.0.tgz", + "integrity": "sha512-tzzskb3bG8LvYGFF/mDTpq3jpI6Q9wc3LEmBaghu+DdCssd1FakN7Bc0hVNmEyGq1bq3RgfkCb3cmQLpNPOroA==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/ms": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.2.tgz", + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==", + "license": "MIT" + }, + "node_modules/netmask": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/netmask/-/netmask-2.0.2.tgz", + "integrity": "sha512-dBpDMdxv9Irdq66304OLfEmQ9tbNRFnFTuZiLo+bD+r332bBmMJ8GBLXklIXXgxd3+v9+KUnZaUR5PJMa75Gsg==", + "license": "MIT", + "engines": { + "node": ">= 0.4.0" + } + }, + "node_modules/node-addon-api": { + "version": "7.1.0", + "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-7.1.0.tgz", + "integrity": "sha512-mNcltoe1R8o7STTegSOHdnJNN7s5EUvhoS7ShnTHDyOSd+8H+UdWODq6qSv67PjC8Zc5JRT8+oLAMCr0SIXw7g==", + "license": "MIT", + "engines": { + "node": "^16 || ^18 || >= 20" + } + }, + "node_modules/node-fetch-native": { + "version": "1.6.4", + "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", + "integrity": "sha512-IhOigYzAKHd244OC0JIMIUrjzctirCmPkaIfhDeGcEETWof5zKYUW7e7MYvChGWh/4CJeXEgsRyGzuF334rOOQ==", + "license": "MIT" + }, + "node_modules/node-forge": { + "version": "1.3.1", + "resolved": "https://registry.npmjs.org/node-forge/-/node-forge-1.3.1.tgz", + "integrity": "sha512-dPEtOeMvF9VMcYV/1Wb8CPoVAXtp6MKMlcbAt4ddqmGqUJ6fQZFXkNZNkNlfevtNkGtaSoXf/vNNNSvgrdXwtA==", + "license": "(BSD-3-Clause OR GPL-2.0)", + "engines": { + "node": ">= 6.13.0" + } + }, + "node_modules/normalize-path": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/normalize-path/-/normalize-path-3.0.0.tgz", + "integrity": "sha512-6eZs5Ls3WtCisHWp9S2GUy8dqkpGi4BVSz3GaqiE6ezub0512ESztXUwUB6C6IKbQkY2Pnb/mD4WYojCRwcwLA==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/npm-run-path": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/npm-run-path/-/npm-run-path-5.3.0.tgz", + "integrity": "sha512-ppwTtiJZq0O/ai0z7yfudtBpWIoxM8yE6nHi1X47eFR2EWORqfbu6CnPlNsjeN683eT0qG6H/Pyf9fCcvjnnnQ==", + "license": "MIT", + "dependencies": { + "path-key": "^4.0.0" + }, + "engines": { + "node": "^12.20.0 || ^14.13.1 || >=16.0.0" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/npm-run-path/node_modules/path-key": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-4.0.0.tgz", + "integrity": "sha512-haREypq7xkM7ErfgIyA0z+Bj4AGKlMSdlQE2jvJo6huWD1EdkKYV+G/T4nq0YEF2vgTT8kqMFKo1uHn950r4SQ==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/ofetch": { + "version": "1.3.4", + "resolved": "https://registry.npmjs.org/ofetch/-/ofetch-1.3.4.tgz", + "integrity": "sha512-KLIET85ik3vhEfS+3fDlc/BAZiAp+43QEC/yCo5zkNoY2YaKvNkOaFr/6wCFgFH1kuYQM5pMNi0Tg8koiIemtw==", + "license": "MIT", + "dependencies": { + "destr": "^2.0.3", + "node-fetch-native": "^1.6.3", + "ufo": "^1.5.3" + } + }, + "node_modules/ohash": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/ohash/-/ohash-1.1.3.tgz", + "integrity": "sha512-zuHHiGTYTA1sYJ/wZN+t5HKZaH23i4yI1HMwbuXm24Nid7Dv0KcuRlKoNKS9UNfAVSBlnGLcuQrnOKWOZoEGaw==", + "license": "MIT" + }, + "node_modules/once": { + "version": "1.4.0", + "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", + "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", + "license": "ISC", + "dependencies": { + "wrappy": "1" + } + }, + "node_modules/onetime": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/onetime/-/onetime-6.0.0.tgz", + "integrity": "sha512-1FlR+gjXK7X+AsAHso35MnyN5KqGwJRi/31ft6x0M194ht7S+rWAvd7PHss9xSKMzE0asv1pyIHaJYq+BbacAQ==", + "license": "MIT", + "dependencies": { + "mimic-fn": "^4.0.0" + }, + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/pac-proxy-agent": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-proxy-agent/-/pac-proxy-agent-7.0.1.tgz", + "integrity": "sha512-ASV8yU4LLKBAjqIPMbrgtaKIvxQri/yh2OpI+S6hVa9JRkUI3Y3NPFbfngDtY7oFtSMD3w31Xns89mDa3Feo5A==", + "license": "MIT", + "dependencies": { + "@tootallnate/quickjs-emscripten": "^0.23.0", + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "get-uri": "^6.0.1", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", + "pac-resolver": "^7.0.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/pac-resolver": { + "version": "7.0.1", + "resolved": "https://registry.npmjs.org/pac-resolver/-/pac-resolver-7.0.1.tgz", + "integrity": "sha512-5NPgf87AT2STgwa2ntRMr45jTKrYBGkVU36yT0ig/n/GMAa3oPqhZfIQ2kMEimReg0+t9kZViDVZ83qfVUlckg==", + "license": "MIT", + "dependencies": { + "degenerator": "^5.0.0", + "netmask": "^2.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/parent-module": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/parent-module/-/parent-module-1.0.1.tgz", + "integrity": "sha512-GQ2EWRpQV8/o+Aw8YqtfZZPfNRWZYkbidE9k5rpl/hC3vtHHBfGm2Ifi6qWV+coDGkrUKZAxE3Lot5kcsRlh+g==", + "license": "MIT", + "dependencies": { + "callsites": "^3.0.0" + }, + "engines": { + "node": ">=6" + } + }, + "node_modules/parse-json": { + "version": "5.2.0", + "resolved": "https://registry.npmjs.org/parse-json/-/parse-json-5.2.0.tgz", + "integrity": "sha512-ayCKvm/phCGxOkYRSCM82iDwct8/EonSEgCSxWxD7ve6jHggsFl4fZVQBPRNgQoKiuV/odhFrGzQXZwbifC8Rg==", + "license": "MIT", + "dependencies": { + "@babel/code-frame": "^7.0.0", + "error-ex": "^1.3.1", + "json-parse-even-better-errors": "^2.3.0", + "lines-and-columns": "^1.1.6" + }, + "engines": { + "node": ">=8" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/path-key": { + "version": "3.1.1", + "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", + "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/pathe": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz", + "integrity": "sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ==", + "license": "MIT" + }, + "node_modules/pend": { + "version": "1.2.0", + "resolved": "https://registry.npmjs.org/pend/-/pend-1.2.0.tgz", + "integrity": "sha512-F3asv42UuXchdzt+xXqfW1OGlVBe+mxa2mqI0pg5yAHZPvFmY3Y6drSf/GQ1A86WgWEN9Kzh/WrgKa6iGcHXLg==", + "license": "MIT" + }, + "node_modules/picocolors": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", + "license": "ISC" + }, + "node_modules/picomatch": { + "version": "2.3.1", + "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", + "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", + "license": "MIT", + "engines": { + "node": ">=8.6" + }, + "funding": { + "url": "https://github.com/sponsors/jonschlinkert" + } + }, + "node_modules/pkg-types": { + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", + "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", + "license": "MIT", + "dependencies": { + "confbox": "^0.1.7", + "mlly": "^1.7.0", + "pathe": "^1.1.2" + } + }, + "node_modules/progress": { + "version": "2.0.3", + "resolved": "https://registry.npmjs.org/progress/-/progress-2.0.3.tgz", + "integrity": "sha512-7PiHtLll5LdnKIMw100I+8xJXR5gW2QwWYkT6iJva0bXitZKa/XMrSbdmg3r2Xnaidz9Qumd0VPaMrZlF9V9sA==", + "license": "MIT", + "engines": { + "node": ">=0.4.0" + } + }, + "node_modules/proxy-agent": { + "version": "6.4.0", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", + "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.0.2", + "debug": "^4.3.4", + "http-proxy-agent": "^7.0.1", + "https-proxy-agent": "^7.0.3", + "lru-cache": "^7.14.1", + "pac-proxy-agent": "^7.0.1", + "proxy-from-env": "^1.1.0", + "socks-proxy-agent": "^8.0.2" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/proxy-from-env": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/proxy-from-env/-/proxy-from-env-1.1.0.tgz", + "integrity": "sha512-D+zkORCbA9f1tdWRK0RaCR3GPv50cMxcrz4X8k5LTSUD1Dkw47mKJEZQNunItRTkWwgtaUSo1RVFRIG9ZXiFYg==", + "license": "MIT" + }, + "node_modules/pump": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", + "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", + "license": "MIT", + "dependencies": { + "end-of-stream": "^1.1.0", + "once": "^1.3.1" + } + }, + "node_modules/puppeteer": { + "version": "22.11.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.11.0.tgz", + "integrity": "sha512-U5U0Dx5Tsd/ec39BmflhcSFIK9UnZxGQfyUzvQVHivt6gIi6RgJqYL9MJaU90OG6tTz65XqzN4wF0ZyDyY0NuA==", + "hasInstallScript": true, + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.2.3", + "cosmiconfig": "9.0.0", + "devtools-protocol": "0.0.1299070", + "puppeteer-core": "22.11.0" + }, + "bin": { + "puppeteer": "lib/esm/puppeteer/node/cli.js" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core": { + "version": "22.11.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.11.0.tgz", + "integrity": "sha512-57YUjhRoSpZWg9lCssWsgzM1/X/1jQnkKbbspbeW0bhZTt3TD4WdNXEYI7KrFFnSvx21tyHhfWW0zlxzbwYSAA==", + "license": "Apache-2.0", + "dependencies": { + "@puppeteer/browsers": "2.2.3", + "chromium-bidi": "0.5.23", + "debug": "4.3.5", + "devtools-protocol": "0.0.1299070", + "ws": "8.17.0" + }, + "engines": { + "node": ">=18" + } + }, + "node_modules/puppeteer-core/node_modules/debug": { + "version": "4.3.5", + "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", + "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", + "license": "MIT", + "dependencies": { + "ms": "2.1.2" + }, + "engines": { + "node": ">=6.0" + }, + "peerDependenciesMeta": { + "supports-color": { + "optional": true + } + } + }, + "node_modules/queue-tick": { + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/queue-tick/-/queue-tick-1.0.1.tgz", + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==", + "license": "MIT" + }, + "node_modules/radix3": { + "version": "1.1.2", + "resolved": "https://registry.npmjs.org/radix3/-/radix3-1.1.2.tgz", + "integrity": "sha512-b484I/7b8rDEdSDKckSSBA8knMpcdsXudlE/LNL639wFoHKwLbEkQFZHWEYwDC0wa0FKUcCY+GAF73Z7wxNVFA==", + "license": "MIT" + }, + "node_modules/readdirp": { + "version": "3.6.0", + "resolved": "https://registry.npmjs.org/readdirp/-/readdirp-3.6.0.tgz", + "integrity": "sha512-hOS089on8RduqdbhvQ5Z37A0ESjsqz6qnRcffsMU3495FuTdqSm+7bhJ29JvIOsBDEEnan5DPu9t3To9VRlMzA==", + "license": "MIT", + "dependencies": { + "picomatch": "^2.2.1" + }, + "engines": { + "node": ">=8.10.0" + } + }, + "node_modules/require-directory": { + "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==", + "license": "MIT", + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/resolve-from": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", + "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", + "license": "MIT", + "engines": { + "node": ">=4" + } + }, + "node_modules/resolve-pkg-maps": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/resolve-pkg-maps/-/resolve-pkg-maps-1.0.0.tgz", + "integrity": "sha512-seS2Tj26TBVOC2NIc2rOe2y2ZO7efxITtLZcGSOnHHNOQ7CkiUBfw0Iw2ck6xkIhPwLhKNLS8BO+hEpngQlqzw==", + "dev": true, + "license": "MIT", + "funding": { + "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" + } + }, + "node_modules/semver": { + "version": "7.6.0", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", + "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", + "license": "ISC", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/semver/node_modules/lru-cache": { + "version": "6.0.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", + "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", + "license": "ISC", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/shebang-command": { + "version": "2.0.0", + "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", + "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", + "license": "MIT", + "dependencies": { + "shebang-regex": "^3.0.0" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/shebang-regex": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", + "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", + "license": "MIT", + "engines": { + "node": ">=8" + } + }, + "node_modules/signal-exit": { + "version": "4.1.0", + "resolved": "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz", + "integrity": "sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw==", + "license": "ISC", + "engines": { + "node": ">=14" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/smart-buffer": { + "version": "4.2.0", + "resolved": "https://registry.npmjs.org/smart-buffer/-/smart-buffer-4.2.0.tgz", + "integrity": "sha512-94hK0Hh8rPqQl2xXc3HsaBoOXKV20MToPkcXvwbISWLEs+64sBq5kFgn2kJDHb1Pry9yrP0dxrCI9RRci7RXKg==", + "license": "MIT", + "engines": { + "node": ">= 6.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks": { + "version": "2.8.3", + "resolved": "https://registry.npmjs.org/socks/-/socks-2.8.3.tgz", + "integrity": "sha512-l5x7VUUWbjVFbafGLxPWkYsHIhEvmF85tbIeFZWc8ZPtoMyybuEhL7Jye/ooC4/d48FgOjSJXgsF/AJPYCW8Zw==", + "license": "MIT", + "dependencies": { + "ip-address": "^9.0.5", + "smart-buffer": "^4.2.0" + }, + "engines": { + "node": ">= 10.0.0", + "npm": ">= 3.0.0" + } + }, + "node_modules/socks-proxy-agent": { + "version": "8.0.3", + "resolved": "https://registry.npmjs.org/socks-proxy-agent/-/socks-proxy-agent-8.0.3.tgz", + "integrity": "sha512-VNegTZKhuGq5vSD6XNKlbqWhyt/40CgoEw8XxD6dhnm8Jq9IEa3nIa4HwnM8XOqU0CdB0BwWVXusqiFXfHB3+A==", + "license": "MIT", + "dependencies": { + "agent-base": "^7.1.1", + "debug": "^4.3.4", + "socks": "^2.7.1" + }, + "engines": { + "node": ">= 14" + } + }, + "node_modules/source-map": { + "version": "0.6.1", + "resolved": "https://registry.npmjs.org/source-map/-/source-map-0.6.1.tgz", + "integrity": "sha512-UjgapumWlbMhkBgzT7Ykc5YXUT46F0iKu8SGXq0bcwP5dz/h0Plj6enJqjz1Zbq2l5WaqYnrVbwWOWMyF3F47g==", + "license": "BSD-3-Clause", + "optional": true, + "engines": { + "node": ">=0.10.0" + } + }, + "node_modules/sprintf-js": { + "version": "1.1.3", + "resolved": "https://registry.npmjs.org/sprintf-js/-/sprintf-js-1.1.3.tgz", + "integrity": "sha512-Oo+0REFV59/rz3gfJNKQiBlwfHaSESl1pcGyABQsnnIfWOFt6JNj5gCog2U6MLZ//IGYD+nA8nI+mTShREReaA==", + "license": "BSD-3-Clause" + }, + "node_modules/std-env": { + "version": "3.7.0", + "resolved": "https://registry.npmjs.org/std-env/-/std-env-3.7.0.tgz", + "integrity": "sha512-JPbdCEQLj1w5GilpiHAx3qJvFndqybBysA3qUOnznweH4QbNYUsW/ea8QzSrnh0vNsezMMw5bcVool8lM0gwzg==", + "license": "MIT" + }, + "node_modules/streamx": { + "version": "2.18.0", + "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.18.0.tgz", + "integrity": "sha512-LLUC1TWdjVdn1weXGcSxyTR3T4+acB6tVGXT95y0nGbca4t4o/ng1wKAGTljm9VicuCVLvRlqFYXYy5GwgM7sQ==", + "license": "MIT", + "dependencies": { + "fast-fifo": "^1.3.2", + "queue-tick": "^1.0.1", + "text-decoder": "^1.1.0" + }, + "optionalDependencies": { + "bare-events": "^2.2.0" + } + }, + "node_modules/string-width": { + "version": "4.2.3", + "resolved": "https://registry.npmjs.org/string-width/-/string-width-4.2.3.tgz", + "integrity": "sha512-wKyQRQpjJ0sIp62ErSZdGsjMJWsap5oRNihHhu6G7JVO/9jIB6UyevL+tXuOqrng8j/cxKTWyWUwvSTriiZz/g==", + "license": "MIT", + "dependencies": { + "emoji-regex": "^8.0.0", + "is-fullwidth-code-point": "^3.0.0", + "strip-ansi": "^6.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-ansi": { + "version": "6.0.1", + "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", + "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", + "license": "MIT", + "dependencies": { + "ansi-regex": "^5.0.1" + }, + "engines": { + "node": ">=8" + } + }, + "node_modules/strip-final-newline": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/strip-final-newline/-/strip-final-newline-3.0.0.tgz", + "integrity": "sha512-dOESqjYr96iWYylGObzd39EuNTa5VJxyvVAEm5Jnh7KGo75V43Hk1odPQkNDyXNmUR6k+gEiDVXnjB8HJ3crXw==", + "license": "MIT", + "engines": { + "node": ">=12" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "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/system-architecture": { + "version": "0.1.0", + "resolved": "https://registry.npmjs.org/system-architecture/-/system-architecture-0.1.0.tgz", + "integrity": "sha512-ulAk51I9UVUyJgxlv9M6lFot2WP3e7t8Kz9+IS6D4rVba1tR9kON+Ey69f+1R4Q8cd45Lod6a4IcJIxnzGc/zA==", + "license": "MIT", + "engines": { + "node": ">=18" + }, + "funding": { + "url": "https://github.com/sponsors/sindresorhus" + } + }, + "node_modules/tar-fs": { + "version": "3.0.5", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", + "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "license": "MIT", + "dependencies": { + "pump": "^3.0.0", + "tar-stream": "^3.1.5" + }, + "optionalDependencies": { + "bare-fs": "^2.1.1", + "bare-path": "^2.1.0" + } + }, + "node_modules/tar-stream": { + "version": "3.1.7", + "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", + "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", + "license": "MIT", + "dependencies": { + "b4a": "^1.6.4", + "fast-fifo": "^1.2.0", + "streamx": "^2.15.0" + } + }, + "node_modules/text-decoder": { + "version": "1.1.0", + "resolved": "https://registry.npmjs.org/text-decoder/-/text-decoder-1.1.0.tgz", + "integrity": "sha512-TmLJNj6UgX8xcUZo4UDStGQtDiTzF7BzWlzn9g7UWrjkpHr5uJTK1ld16wZ3LXb2vb6jH8qU89dW5whuMdXYdw==", + "license": "Apache-2.0", + "dependencies": { + "b4a": "^1.6.4" + } + }, + "node_modules/through": { + "version": "2.3.8", + "resolved": "https://registry.npmjs.org/through/-/through-2.3.8.tgz", + "integrity": "sha512-w89qg7PI8wAdvX60bMDP+bFoD5Dvhm9oLheFp5O4a2QF0cSBGsBX4qZmadPMvVqlLJBBci+WqGGOAPvcDeNSVg==", + "license": "MIT" + }, + "node_modules/to-regex-range": { + "version": "5.0.1", + "resolved": "https://registry.npmjs.org/to-regex-range/-/to-regex-range-5.0.1.tgz", + "integrity": "sha512-65P7iz6X5yEr1cwcgvQxbbIw7Uk3gOy5dIdtZ4rDveLqhrdJP+Li/Hx6tyK0NEb+2GCyneCMJiGqrADCSNk8sQ==", + "license": "MIT", + "dependencies": { + "is-number": "^7.0.0" + }, + "engines": { + "node": ">=8.0" + } + }, + "node_modules/tslib": { + "version": "2.6.3", + "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", + "integrity": "sha512-xNvxJEOUiWPGhUuUdQgAJPKOOJfGnIyKySOc09XkKsgdUV/3E2zvwZYdejjmRgPCgcym1juLH3226yA7sEFJKQ==", + "license": "0BSD" + }, + "node_modules/tsx": { + "version": "4.15.5", + "resolved": "https://registry.npmjs.org/tsx/-/tsx-4.15.5.tgz", + "integrity": "sha512-iKi8jQ2VBmZ2kU/FkGkL2OSHBHsazsUzsdC/W/RwhKIEsIoZ1alCclZHP5jGfNHEaEWUJFM1GquzCf+4db3b0w==", + "dev": true, + "license": "MIT", + "dependencies": { + "esbuild": "~0.21.4", + "get-tsconfig": "^4.7.5" + }, + "bin": { + "tsx": "dist/cli.mjs" + }, + "engines": { + "node": ">=18.0.0" + }, + "optionalDependencies": { + "fsevents": "~2.3.3" + } + }, + "node_modules/typescript": { + "version": "5.4.5", + "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.5.tgz", + "integrity": "sha512-vcI4UpRgg81oIRUFwR0WSIHKt11nJ7SAVlYNIu+QpqeyXP+gpQJy/Z4+F0aGxSE4MqwjyXvW/TzgkLAx2AGHwQ==", + "devOptional": true, + "license": "Apache-2.0", + "bin": { + "tsc": "bin/tsc", + "tsserver": "bin/tsserver" + }, + "engines": { + "node": ">=14.17" + } + }, + "node_modules/ufo": { + "version": "1.5.3", + "resolved": "https://registry.npmjs.org/ufo/-/ufo-1.5.3.tgz", + "integrity": "sha512-Y7HYmWaFwPUmkoQCUIAYpKqkOf+SbVj/2fJJZ4RJMCfZp0rTGwRbzQD+HghfnhKOjL9E01okqz+ncJskGYfBNw==", + "license": "MIT" + }, + "node_modules/unbzip2-stream": { + "version": "1.4.3", + "resolved": "https://registry.npmjs.org/unbzip2-stream/-/unbzip2-stream-1.4.3.tgz", + "integrity": "sha512-mlExGW4w71ebDJviH16lQLtZS32VKqsSfk80GCfUlwT/4/hNRFsoscrF/c++9xinkMzECL1uL9DDwXqFWkruPg==", + "license": "MIT", + "dependencies": { + "buffer": "^5.2.1", + "through": "^2.3.8" + } + }, + "node_modules/uncrypto": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/uncrypto/-/uncrypto-0.1.3.tgz", + "integrity": "sha512-Ql87qFHB3s/De2ClA9e0gsnS6zXG27SkTiSJwjCc9MebbfapQfuPzumMIUMi38ezPZVNFcHI9sUIepeQfw8J8Q==", + "license": "MIT" + }, + "node_modules/undici-types": { + "version": "5.26.5", + "resolved": "https://registry.npmjs.org/undici-types/-/undici-types-5.26.5.tgz", + "integrity": "sha512-JlCMO+ehdEIKqlFxk6IfVoAUVmgz7cU7zD/h9XZ0qzeosSHmUJVOzSQvvYSYWXkFXC+IfLKSIffhv0sVZup6pA==", + "license": "MIT", + "optional": true + }, + "node_modules/unenv": { + "version": "1.9.0", + "resolved": "https://registry.npmjs.org/unenv/-/unenv-1.9.0.tgz", + "integrity": "sha512-QKnFNznRxmbOF1hDgzpqrlIf6NC5sbZ2OJ+5Wl3OX8uM+LUJXbj4TXvLJCtwbPTmbMHCLIz6JLKNinNsMShK9g==", + "license": "MIT", + "dependencies": { + "consola": "^3.2.3", + "defu": "^6.1.3", + "mime": "^3.0.0", + "node-fetch-native": "^1.6.1", + "pathe": "^1.1.1" + } + }, + "node_modules/universalify": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/universalify/-/universalify-2.0.1.tgz", + "integrity": "sha512-gptHNQghINnc/vTGIk0SOFGFNXw7JVrlRUtConJRlvaw6DuX0wO5Jeko9sWrMBhh+PsYAZ7oXAiOnf/UKogyiw==", + "license": "MIT", + "engines": { + "node": ">= 10.0.0" + } + }, + "node_modules/unstorage": { + "version": "1.10.2", + "resolved": "https://registry.npmjs.org/unstorage/-/unstorage-1.10.2.tgz", + "integrity": "sha512-cULBcwDqrS8UhlIysUJs2Dk0Mmt8h7B0E6mtR+relW9nZvsf/u4SkAYyNliPiPW7XtFNb5u3IUMkxGxFTTRTgQ==", + "license": "MIT", + "dependencies": { + "anymatch": "^3.1.3", + "chokidar": "^3.6.0", + "destr": "^2.0.3", + "h3": "^1.11.1", + "listhen": "^1.7.2", + "lru-cache": "^10.2.0", + "mri": "^1.2.0", + "node-fetch-native": "^1.6.2", + "ofetch": "^1.3.3", + "ufo": "^1.4.0" + }, + "peerDependencies": { + "@azure/app-configuration": "^1.5.0", + "@azure/cosmos": "^4.0.0", + "@azure/data-tables": "^13.2.2", + "@azure/identity": "^4.0.1", + "@azure/keyvault-secrets": "^4.8.0", + "@azure/storage-blob": "^12.17.0", + "@capacitor/preferences": "^5.0.7", + "@netlify/blobs": "^6.5.0 || ^7.0.0", + "@planetscale/database": "^1.16.0", + "@upstash/redis": "^1.28.4", + "@vercel/kv": "^1.0.1", + "idb-keyval": "^6.2.1", + "ioredis": "^5.3.2" + }, + "peerDependenciesMeta": { + "@azure/app-configuration": { + "optional": true + }, + "@azure/cosmos": { + "optional": true + }, + "@azure/data-tables": { + "optional": true + }, + "@azure/identity": { + "optional": true + }, + "@azure/keyvault-secrets": { + "optional": true + }, + "@azure/storage-blob": { + "optional": true + }, + "@capacitor/preferences": { + "optional": true + }, + "@netlify/blobs": { + "optional": true + }, + "@planetscale/database": { + "optional": true + }, + "@upstash/redis": { + "optional": true + }, + "@vercel/kv": { + "optional": true + }, + "idb-keyval": { + "optional": true + }, + "ioredis": { + "optional": true + } + } + }, + "node_modules/unstorage/node_modules/lru-cache": { + "version": "10.2.2", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.2.tgz", + "integrity": "sha512-9hp3Vp2/hFQUiIwKo8XCeFVnrg8Pk3TYNPIR7tJADKi5YfcF7vEaK7avFHTlSy3kOKYaJQaalfEo6YuXdceBOQ==", + "license": "ISC", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/untun": { + "version": "0.1.3", + "resolved": "https://registry.npmjs.org/untun/-/untun-0.1.3.tgz", + "integrity": "sha512-4luGP9LMYszMRZwsvyUd9MrxgEGZdZuZgpVQHEEX0lCYFESasVRvZd0EYpCkOIbJKHMuv0LskpXc/8Un+MJzEQ==", + "license": "MIT", + "dependencies": { + "citty": "^0.1.5", + "consola": "^3.2.3", + "pathe": "^1.1.1" + }, + "bin": { + "untun": "bin/untun.mjs" + } + }, + "node_modules/uqr": { + "version": "0.1.2", + "resolved": "https://registry.npmjs.org/uqr/-/uqr-0.1.2.tgz", + "integrity": "sha512-MJu7ypHq6QasgF5YRTjqscSzQp/W11zoUk6kvmlH+fmWEs63Y0Eib13hYFwAzagRJcVY8WVnlV+eBDUGMJ5IbA==", + "license": "MIT" + }, + "node_modules/urlpattern-polyfill": { + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/urlpattern-polyfill/-/urlpattern-polyfill-10.0.0.tgz", + "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", + "license": "MIT" + }, + "node_modules/which": { + "version": "2.0.2", + "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", + "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", + "license": "ISC", + "dependencies": { + "isexe": "^2.0.0" + }, + "bin": { + "node-which": "bin/node-which" + }, + "engines": { + "node": ">= 8" + } + }, + "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/wrap-ansi/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/wrap-ansi/node_modules/color-convert": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", + "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", + "license": "MIT", + "dependencies": { + "color-name": "~1.1.4" + }, + "engines": { + "node": ">=7.0.0" + } + }, + "node_modules/wrap-ansi/node_modules/color-name": { + "version": "1.1.4", + "resolved": "https://registry.npmjs.org/color-name/-/color-name-1.1.4.tgz", + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==", + "license": "MIT" + }, + "node_modules/wrappy": { + "version": "1.0.2", + "resolved": "https://registry.npmjs.org/wrappy/-/wrappy-1.0.2.tgz", + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==", + "license": "ISC" + }, + "node_modules/ws": { + "version": "8.17.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", + "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "license": "MIT", + "engines": { + "node": ">=10.0.0" + }, + "peerDependencies": { + "bufferutil": "^4.0.1", + "utf-8-validate": ">=5.0.2" + }, + "peerDependenciesMeta": { + "bufferutil": { + "optional": true + }, + "utf-8-validate": { + "optional": true + } + } + }, + "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/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", + "license": "ISC" + }, + "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/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/yauzl": { + "version": "2.10.0", + "resolved": "https://registry.npmjs.org/yauzl/-/yauzl-2.10.0.tgz", + "integrity": "sha512-p4a9I6X6nu6IhoGmBqAcbJy1mlC4j27vEPZX9F4L4/vZT3Lyq1VkFHw/V/PUcB9Buo+DG3iHkT0x3Qya58zc3g==", + "license": "MIT", + "dependencies": { + "buffer-crc32": "~0.2.3", + "fd-slicer": "~1.1.0" + } + }, + "node_modules/zod": { + "version": "3.23.8", + "resolved": "https://registry.npmjs.org/zod/-/zod-3.23.8.tgz", + "integrity": "sha512-XBx9AXhXktjUqnepgTiE5flcKIYWi/rme0Eaj+5Y0lftuGBq+jyRu/md4WnuxqgP1ubdpNCsYEYPxrzVHD8d6g==", + "license": "MIT", + "funding": { + "url": "https://github.com/sponsors/colinhacks" + } + } + } +} diff --git a/cdn/package.json b/cdn/package.json new file mode 100644 index 0000000..1328606 --- /dev/null +++ b/cdn/package.json @@ -0,0 +1,19 @@ +{ + "name": "cdn", + "version": "1.0.0", + "private": true, + "type": "module", + "scripts": { + "build": "tsx ./src/main.ts" + }, + "dependencies": { + "ofetch": "^1.3.4", + "puppeteer": "^22.11.0", + "unstorage": "^1.10.2", + "zod": "^3.23.8" + }, + "devDependencies": { + "tsx": "^4.15.5", + "typescript": "^5.4.5" + } +} diff --git a/cdn/src/features/resume/collectResumeList.ts b/cdn/src/features/resume/collectResumeList.ts new file mode 100644 index 0000000..0159305 --- /dev/null +++ b/cdn/src/features/resume/collectResumeList.ts @@ -0,0 +1,8 @@ +import { TypeOf } from "zod"; +import { ofetch } from "ofetch"; +import { ResumeListSchema } from "../../models/ResumeList"; + +export async function collectResumeList() { + const response = await ofetch<TypeOf<typeof ResumeListSchema>>("https://d0rich.me/api/resume/list"); + return ResumeListSchema.parse(response); +} diff --git a/cdn/src/features/resume/getResumePdf.ts b/cdn/src/features/resume/getResumePdf.ts new file mode 100644 index 0000000..3b3dcd9 --- /dev/null +++ b/cdn/src/features/resume/getResumePdf.ts @@ -0,0 +1,27 @@ +import { BrowserStore } from '../../store/browser' + +export async function getResumePdf(path: string) { + const browser = await BrowserStore.getBrowser() + const page = await browser.newPage() + await page.goto('http://d0rich.me' + path, { + waitUntil: 'networkidle0' + }) + await page.emulateMediaType('print') + await page.evaluate(() => { + const html = document.querySelector('html') + if (html) { + html.className = 'light' + html.querySelectorAll('a').forEach((a) => { + const href = a.getAttribute('href') + if (!href) return + if (href.startsWith('/')) a.href = 'https://d0rich.me' + href + }) + } + }) + const pdf = await page.pdf({ + printBackground: true, + format: 'A4' + }) + await page.close() + return pdf +} diff --git a/cdn/src/features/resume/saveAllResume.ts b/cdn/src/features/resume/saveAllResume.ts new file mode 100644 index 0000000..3ce7681 --- /dev/null +++ b/cdn/src/features/resume/saveAllResume.ts @@ -0,0 +1,13 @@ +import {collectResumeList} from './collectResumeList' +import { getResumePdf } from './getResumePdf' +import { dist } from '../../store/dist' + +export async function saveAllResume() { + const resumeList = await collectResumeList() + await Promise.all( + resumeList.map(async (resume) => { + const pdf = await getResumePdf(resume.path) + await dist.setItemRaw(`resume:${resume.title}.pdf`, pdf) + }) + ) +} diff --git a/cdn/src/main.ts b/cdn/src/main.ts new file mode 100644 index 0000000..85c3b26 --- /dev/null +++ b/cdn/src/main.ts @@ -0,0 +1,11 @@ +import { BrowserStore } from "./store/browser"; +import { saveAllResume } from "./features/resume/saveAllResume"; + + +async function main() { + const browser = await BrowserStore.getBrowser() + await saveAllResume() + await browser.close() +} + +main() diff --git a/cdn/src/models/ResumeList.ts b/cdn/src/models/ResumeList.ts new file mode 100644 index 0000000..c7ce027 --- /dev/null +++ b/cdn/src/models/ResumeList.ts @@ -0,0 +1,8 @@ +import {z} from 'zod'; + +export const ResumeSchema = z.object({ + title: z.string(), + path: z.string() +}); + +export const ResumeListSchema = z.array(ResumeSchema); diff --git a/cdn/src/store/browser.ts b/cdn/src/store/browser.ts new file mode 100644 index 0000000..94552d9 --- /dev/null +++ b/cdn/src/store/browser.ts @@ -0,0 +1,14 @@ +import { launch, type Browser } from "puppeteer"; + +export class BrowserStore { + private static browser: Browser | Promise<Browser> = launch(); + + private constructor() {} + + static async getBrowser(): Promise<Browser> { + if (BrowserStore.browser instanceof Promise) { + BrowserStore.browser = await BrowserStore.browser; + } + return BrowserStore.browser; + } +} diff --git a/cdn/src/store/dist.ts b/cdn/src/store/dist.ts new file mode 100644 index 0000000..abf818b --- /dev/null +++ b/cdn/src/store/dist.ts @@ -0,0 +1,6 @@ +import { createStorage } from "unstorage"; +import fsDriver from "unstorage/drivers/fs"; + +export const dist = createStorage({ + driver: fsDriver({ base: "./dist" }), +}); From 94cb7cb4118486d82f97f6b8c2dfe063c4ec9d60 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 19:15:51 +0400 Subject: [PATCH 13/24] Lintfix --- apps/d0rich.me/nuxt.config.ts | 6 +- cdn/package-lock.json | 1 - cdn/src/features/resume/collectResumeList.ts | 12 ++-- cdn/src/features/resume/saveAllResume.ts | 2 +- cdn/src/main.ts | 5 +- cdn/src/models/ResumeList.ts | 6 +- cdn/src/store/browser.ts | 8 +-- cdn/src/store/dist.ts | 8 +-- package-lock.json | 64 +++++++++++++------ utils/dog/src/cli.ts | 67 ++++++++++++-------- utils/dog/src/generators/index.ts | 4 +- utils/dog/src/runWeb.ts | 4 +- utils/dog/src/storage.ts | 18 +++--- utils/dog/src/utils/bufferToImgSrc.ts | 9 ++- utils/dog/src/webApp.ts | 46 +++++++------- utils/dog/tsconfig.json | 3 +- 16 files changed, 148 insertions(+), 115 deletions(-) diff --git a/apps/d0rich.me/nuxt.config.ts b/apps/d0rich.me/nuxt.config.ts index 89f8820..bd19c02 100644 --- a/apps/d0rich.me/nuxt.config.ts +++ b/apps/d0rich.me/nuxt.config.ts @@ -24,11 +24,7 @@ export default defineNuxtConfig({ modules: ['@nuxthq/studio', '@nuxt/content'], nitro: { prerender: { - routes: [ - '/', - '/sitemap.xml', - '/api/resume/list.json', - ] + routes: ['/', '/sitemap.xml', '/api/resume/list.json'] } }, content: { diff --git a/cdn/package-lock.json b/cdn/package-lock.json index cf2494d..4545fa3 100644 --- a/cdn/package-lock.json +++ b/cdn/package-lock.json @@ -7,7 +7,6 @@ "": { "name": "cdn", "version": "1.0.0", - "license": "ISC", "dependencies": { "ofetch": "^1.3.4", "puppeteer": "^22.11.0", diff --git a/cdn/src/features/resume/collectResumeList.ts b/cdn/src/features/resume/collectResumeList.ts index 0159305..c98bed3 100644 --- a/cdn/src/features/resume/collectResumeList.ts +++ b/cdn/src/features/resume/collectResumeList.ts @@ -1,8 +1,10 @@ -import { TypeOf } from "zod"; -import { ofetch } from "ofetch"; -import { ResumeListSchema } from "../../models/ResumeList"; +import { TypeOf } from 'zod' +import { ofetch } from 'ofetch' +import { ResumeListSchema } from '../../models/ResumeList' export async function collectResumeList() { - const response = await ofetch<TypeOf<typeof ResumeListSchema>>("https://d0rich.me/api/resume/list"); - return ResumeListSchema.parse(response); + const response = await ofetch<TypeOf<typeof ResumeListSchema>>( + 'https://d0rich.me/api/resume/list' + ) + return ResumeListSchema.parse(response) } diff --git a/cdn/src/features/resume/saveAllResume.ts b/cdn/src/features/resume/saveAllResume.ts index 3ce7681..7f71a49 100644 --- a/cdn/src/features/resume/saveAllResume.ts +++ b/cdn/src/features/resume/saveAllResume.ts @@ -1,4 +1,4 @@ -import {collectResumeList} from './collectResumeList' +import { collectResumeList } from './collectResumeList' import { getResumePdf } from './getResumePdf' import { dist } from '../../store/dist' diff --git a/cdn/src/main.ts b/cdn/src/main.ts index 85c3b26..c2bb936 100644 --- a/cdn/src/main.ts +++ b/cdn/src/main.ts @@ -1,6 +1,5 @@ -import { BrowserStore } from "./store/browser"; -import { saveAllResume } from "./features/resume/saveAllResume"; - +import { BrowserStore } from './store/browser' +import { saveAllResume } from './features/resume/saveAllResume' async function main() { const browser = await BrowserStore.getBrowser() diff --git a/cdn/src/models/ResumeList.ts b/cdn/src/models/ResumeList.ts index c7ce027..5e5e327 100644 --- a/cdn/src/models/ResumeList.ts +++ b/cdn/src/models/ResumeList.ts @@ -1,8 +1,8 @@ -import {z} from 'zod'; +import { z } from 'zod' export const ResumeSchema = z.object({ title: z.string(), path: z.string() -}); +}) -export const ResumeListSchema = z.array(ResumeSchema); +export const ResumeListSchema = z.array(ResumeSchema) diff --git a/cdn/src/store/browser.ts b/cdn/src/store/browser.ts index 94552d9..6b20b56 100644 --- a/cdn/src/store/browser.ts +++ b/cdn/src/store/browser.ts @@ -1,14 +1,14 @@ -import { launch, type Browser } from "puppeteer"; +import { launch, type Browser } from 'puppeteer' export class BrowserStore { - private static browser: Browser | Promise<Browser> = launch(); + private static browser: Browser | Promise<Browser> = launch() private constructor() {} static async getBrowser(): Promise<Browser> { if (BrowserStore.browser instanceof Promise) { - BrowserStore.browser = await BrowserStore.browser; + BrowserStore.browser = await BrowserStore.browser } - return BrowserStore.browser; + return BrowserStore.browser } } diff --git a/cdn/src/store/dist.ts b/cdn/src/store/dist.ts index abf818b..3a8f54d 100644 --- a/cdn/src/store/dist.ts +++ b/cdn/src/store/dist.ts @@ -1,6 +1,6 @@ -import { createStorage } from "unstorage"; -import fsDriver from "unstorage/drivers/fs"; +import { createStorage } from 'unstorage' +import fsDriver from 'unstorage/drivers/fs' export const dist = createStorage({ - driver: fsDriver({ base: "./dist" }), -}); + driver: fsDriver({ base: './dist' }) +}) diff --git a/package-lock.json b/package-lock.json index d094e99..553821c 100644 --- a/package-lock.json +++ b/package-lock.json @@ -7,7 +7,8 @@ "name": "esprit", "workspaces": [ "apps/*", - "packages/*" + "packages/*", + "utils/*" ], "devDependencies": { "@changesets/cli": "^2.27.5", @@ -62,6 +63,7 @@ "apps/dog": { "name": "@d0rich/dog", "version": "0.1.0", + "extraneous": true, "dependencies": { "@backroad/backroad": "^1.4.0-alpha.5", "@types/node": "^20.14.2", @@ -80,24 +82,6 @@ "typescript": "^5.4.5" } }, - "apps/dog/node_modules/@types/node": { - "version": "20.14.2", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", - "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", - "license": "MIT", - "dependencies": { - "undici-types": "~5.26.4" - } - }, - "apps/dog/node_modules/commander": { - "version": "12.1.0", - "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", - "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", - "license": "MIT", - "engines": { - "node": ">=18" - } - }, "node_modules/@aashutoshrathi/word-wrap": { "version": "1.2.6", "devOptional": true, @@ -2036,7 +2020,7 @@ } }, "node_modules/@d0rich/dog": { - "resolved": "apps/dog", + "resolved": "utils/dog", "link": true }, "node_modules/@d0rich/esprit-design": { @@ -28447,6 +28431,44 @@ "devDependencies": { "nuxt": "^3.12.1" } + }, + "utils/dog": { + "version": "0.1.0", + "dependencies": { + "@backroad/backroad": "^1.4.0-alpha.5", + "@types/node": "^20.14.2", + "commander": "^12.1.0", + "inquirer": "^9.2.23", + "node-html-to-image": "^4.0.0", + "png-to-ico": "^2.1.8", + "unstorage": "^1.10.2" + }, + "bin": { + "dog": "dist/cli.js" + }, + "devDependencies": { + "@types/inquirer": "^9.0.7", + "tsx": "^4.15.4", + "typescript": "^5.4.5" + } + }, + "utils/dog/node_modules/@types/node": { + "version": "20.14.2", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.14.2.tgz", + "integrity": "sha512-xyu6WAMVwv6AKFLB+e/7ySZVr/0zLCzOa7rSpq6jNwpqOrUbcACDWC+53d4n2QHOnDou0fbIsg8wZu/sxrnI4Q==", + "license": "MIT", + "dependencies": { + "undici-types": "~5.26.4" + } + }, + "utils/dog/node_modules/commander": { + "version": "12.1.0", + "resolved": "https://registry.npmjs.org/commander/-/commander-12.1.0.tgz", + "integrity": "sha512-Vw8qHK3bZM9y/P10u3Vib8o/DdkvA2OtPtZvD871QKjy74Wj1WSKFILMPRPSdUSx5RFK1arlJzEtA4PkFgnbuA==", + "license": "MIT", + "engines": { + "node": ">=18" + } } }, "dependencies": { @@ -29806,7 +29828,7 @@ "requires": {} }, "@d0rich/dog": { - "version": "file:apps/dog", + "version": "file:utils/dog", "requires": { "@backroad/backroad": "^1.4.0-alpha.5", "@types/inquirer": "^9.0.7", diff --git a/utils/dog/src/cli.ts b/utils/dog/src/cli.ts index 145376e..508768d 100644 --- a/utils/dog/src/cli.ts +++ b/utils/dog/src/cli.ts @@ -1,52 +1,63 @@ #!/usr/bin/env node -import fs from "fs"; -import path from 'path'; -import { runWebGenerator } from './webApp'; -import { workingStorage } from "./storage.js"; -import { getFaviconIco, getOgImageJpeg } from "./generators/index.js"; -import { program } from "commander"; +import fs from 'fs' +import path from 'path' +import { runWebGenerator } from './webApp' +import { workingStorage } from './storage.js' +import { getFaviconIco, getOgImageJpeg } from './generators/index.js' +import chalk from 'chalk' +import { program } from 'commander' -const packageJson = JSON.parse(fs.readFileSync(path.resolve(__dirname, "../package.json/"), 'utf8')); +const packageJson = JSON.parse( + fs.readFileSync(path.resolve(__dirname, '../package.json/'), 'utf8') +) -program - .version(packageJson.version) - .description(packageJson.description) +program.version(packageJson.version).description(packageJson.description) interface GenOptions { - title?: string; - description?: string; + title?: string + description?: string } -program.command('gen', { isDefault: true }) +program + .command('gen', { isDefault: true }) .description('Generate images') .option('-t, --title <title>', 'Title', undefined) .option('-d, --description <description>', 'Description', undefined) .action(async (options: GenOptions) => { - const { default: inquirer } = await import('inquirer'); - const title: string = options.title || (await inquirer.prompt({ - type: 'input', - name: 'title', - message: 'Title' - })).title; + const { default: inquirer } = await import('inquirer') + const title: string = + options.title || + ( + await inquirer.prompt({ + type: 'input', + name: 'title', + message: 'Title' + }) + ).title console.log(`🐶 Title: ${title}`) - const description: string = options.description || (await inquirer.prompt({ - type: 'input', - name: 'description', - message: 'Description' - })).description; + const description: string = + options.description || + ( + await inquirer.prompt({ + type: 'input', + name: 'description', + message: 'Description' + }) + ).description console.log(`🐶 Description: ${description}`) console.log('🐶 Generating images...') const favicon = await getFaviconIco({ title }) const ogImage = await getOgImageJpeg({ title, description }) await workingStorage.setItemRaw('favicon.ico', favicon) await workingStorage.setItemRaw('og:image.jpg', ogImage) - console.log('🐶 Done, wuaff! Check out \'.dog\' directory') + console.log(`🐶 Done, wuaff! Check out ${chalk.yellow('.dog')} directory`) }) -program.command('web') +program + .command('web') .description('Run web generator') .action(() => { - runWebGenerator(); + runWebGenerator() }) -program.parse(); +program.parse() diff --git a/utils/dog/src/generators/index.ts b/utils/dog/src/generators/index.ts index ad06b41..5c06403 100644 --- a/utils/dog/src/generators/index.ts +++ b/utils/dog/src/generators/index.ts @@ -1,2 +1,2 @@ -export * from './favicon.js'; -export * from './og-image.js'; +export * from './favicon.js' +export * from './og-image.js' diff --git a/utils/dog/src/runWeb.ts b/utils/dog/src/runWeb.ts index c48dc7f..174d5ef 100644 --- a/utils/dog/src/runWeb.ts +++ b/utils/dog/src/runWeb.ts @@ -1,3 +1,3 @@ -import { runWebGenerator } from './webApp'; +import { runWebGenerator } from './webApp' -runWebGenerator(); +runWebGenerator() diff --git a/utils/dog/src/storage.ts b/utils/dog/src/storage.ts index 6275459..ffa8da4 100644 --- a/utils/dog/src/storage.ts +++ b/utils/dog/src/storage.ts @@ -1,15 +1,15 @@ -import path from 'path'; -import { createStorage } from "unstorage"; -import fsDriver from "unstorage/drivers/fs"; +import path from 'path' +import { createStorage } from 'unstorage' +import fsDriver from 'unstorage/drivers/fs' export const assetsStorage = createStorage({ - driver: fsDriver({ base: path.resolve(__dirname, "../assets/") }), -}); + driver: fsDriver({ base: path.resolve(__dirname, '../assets/') }) +}) export const tmpStorage = createStorage({ - driver: fsDriver({ base: path.resolve(__dirname, "../.tmp/") }), -}); + driver: fsDriver({ base: path.resolve(__dirname, '../.tmp/') }) +}) export const workingStorage = createStorage({ - driver: fsDriver({ base: '.dog' }), -}); + driver: fsDriver({ base: '.dog' }) +}) diff --git a/utils/dog/src/utils/bufferToImgSrc.ts b/utils/dog/src/utils/bufferToImgSrc.ts index 42ee40f..f5dfdab 100644 --- a/utils/dog/src/utils/bufferToImgSrc.ts +++ b/utils/dog/src/utils/bufferToImgSrc.ts @@ -1,4 +1,7 @@ -export function bufferToImgSrc(buffer: Buffer, ext: 'png' | 'ico' = 'png'): string { - const str = `data:image/${ext};base64, ` + buffer.toString('base64'); - return str; +export function bufferToImgSrc( + buffer: Buffer, + ext: 'png' | 'ico' = 'png' +): string { + const str = `data:image/${ext};base64, ` + buffer.toString('base64') + return str } diff --git a/utils/dog/src/webApp.ts b/utils/dog/src/webApp.ts index a199d95..9e82296 100644 --- a/utils/dog/src/webApp.ts +++ b/utils/dog/src/webApp.ts @@ -1,13 +1,12 @@ -import { run } from '@backroad/backroad'; -import { getFaviconIco, getOgImageJpeg } from './generators/index.js'; +import { run } from '@backroad/backroad' +import { getFaviconIco, getOgImageJpeg } from './generators/index.js' import { bufferToImgSrc } from './utils/bufferToImgSrc.js' export function runWebGenerator() { - run((br) => { br.title({ - label: '🐶Dog', - }); + label: '🐶Dog' + }) br.write({ body: ` # 🐶Dog: Generate OG images @@ -16,40 +15,43 @@ export function runWebGenerator() { You need to reaload page in order to see the generated images. You might want to use CLI instead. -`}); - const [col1, col2] = br.columns({ columns: 2 }); +` + }) + const [col1, col2] = br.columns({ columns: 2 }) const title = col1.textInput({ label: 'Title', - placeholder: 'My awesome docs', - }); + placeholder: 'My awesome docs' + }) const description = col1.textInput({ label: 'Description', - placeholder: '💪Understand the power of d0xigen', - }); - const faviconSrc = br.getOrDefault('favicon', null); - const ogImageSrc = br.getOrDefault('ogImage', null); + placeholder: '💪Understand the power of d0xigen' + }) + const faviconSrc = br.getOrDefault('favicon', null) + const ogImageSrc = br.getOrDefault('ogImage', null) const generate = col1.button({ label: 'Generate' }) if (faviconSrc) { col2.image({ src: faviconSrc, - label: 'Favicon', - }); + label: 'Favicon' + }) } if (ogImageSrc) { col2.image({ src: ogImageSrc, - label: 'OG Image', - }); + label: 'OG Image' + }) } if (generate) { br.setValue('favicon', null) br.setValue('ogImage', null) - getOgImageJpeg({ title, description}) - .then(res => br.setValue('ogImage', bufferToImgSrc(res as Buffer))) - getFaviconIco({ title }) - .then(res => br.setValue('favicon', bufferToImgSrc(res, 'ico'))) + getOgImageJpeg({ title, description }).then((res) => + br.setValue('ogImage', bufferToImgSrc(res as Buffer)) + ) + getFaviconIco({ title }).then((res) => + br.setValue('favicon', bufferToImgSrc(res, 'ico')) + ) } - }); + }) } diff --git a/utils/dog/tsconfig.json b/utils/dog/tsconfig.json index 0720ff8..ba10953 100644 --- a/utils/dog/tsconfig.json +++ b/utils/dog/tsconfig.json @@ -1,5 +1,4 @@ { - "compilerOptions": { "outDir": "./dist", "baseUrl": "./src", @@ -11,7 +10,7 @@ "allowSyntheticDefaultImports": true, "strict": true, "skipLibCheck": true, - "lib": ["ESNext"], + "lib": ["ESNext"] }, "include": ["**/*.ts"], "exclude": ["node_modules"] From 859dc57fa74a9c01ea9c81fe955dc87c393b4b76 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 19:19:55 +0400 Subject: [PATCH 14/24] Fix resume paths --- apps/d0rich.me/server/routes/api/resume/list.json.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/d0rich.me/server/routes/api/resume/list.json.ts b/apps/d0rich.me/server/routes/api/resume/list.json.ts index 81321f1..ae4e3b9 100644 --- a/apps/d0rich.me/server/routes/api/resume/list.json.ts +++ b/apps/d0rich.me/server/routes/api/resume/list.json.ts @@ -7,6 +7,6 @@ export default defineEventHandler(async (event) => { .find() return resumeList.map((resume) => ({ title: resume.title, - path: resume._path + path: resume._path?.replace('/resume/leads/', '/resume/'), })) }) From 841d0f88d91fe4b9a48a31d4c95785a2eb6af758 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 19:21:05 +0400 Subject: [PATCH 15/24] Fix resume paths --- apps/d0rich.me/server/routes/api/resume/list.json.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/d0rich.me/server/routes/api/resume/list.json.ts b/apps/d0rich.me/server/routes/api/resume/list.json.ts index ae4e3b9..793bb42 100644 --- a/apps/d0rich.me/server/routes/api/resume/list.json.ts +++ b/apps/d0rich.me/server/routes/api/resume/list.json.ts @@ -7,6 +7,6 @@ export default defineEventHandler(async (event) => { .find() return resumeList.map((resume) => ({ title: resume.title, - path: resume._path?.replace('/resume/leads/', '/resume/'), + path: resume._path?.replace('/resume/leads', '/resume'), })) }) From 6745db0ada2a840b08fc0a6f16f1c18db46ab288 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 19:23:01 +0400 Subject: [PATCH 16/24] lintfix --- apps/d0rich.me/server/routes/api/resume/list.json.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/apps/d0rich.me/server/routes/api/resume/list.json.ts b/apps/d0rich.me/server/routes/api/resume/list.json.ts index 793bb42..47c9fc8 100644 --- a/apps/d0rich.me/server/routes/api/resume/list.json.ts +++ b/apps/d0rich.me/server/routes/api/resume/list.json.ts @@ -7,6 +7,6 @@ export default defineEventHandler(async (event) => { .find() return resumeList.map((resume) => ({ title: resume.title, - path: resume._path?.replace('/resume/leads', '/resume'), + path: resume._path?.replace('/resume/leads', '/resume') })) }) From ef4dc438751b9056c684e964d29f7eb4b4d0e8bc Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 19:25:47 +0400 Subject: [PATCH 17/24] Uninstall node-html-parser --- apps/d0rich.me/package.json | 1 - package-lock.json | 22 +--------------------- 2 files changed, 1 insertion(+), 22 deletions(-) diff --git a/apps/d0rich.me/package.json b/apps/d0rich.me/package.json index e11f7eb..56b5874 100644 --- a/apps/d0rich.me/package.json +++ b/apps/d0rich.me/package.json @@ -20,7 +20,6 @@ "dateformat": "^5.0.3", "gsap": "^3.12.5", "mobile-detect": "^1.4.5", - "node-html-parser": "^6.1.13", "octokit": "^4.0.2", "rehype-external-links": "^3.0.0", "remark-simple-plantuml": "npm:@akebifiky/remark-simple-plantuml@^1.0.2", diff --git a/package-lock.json b/package-lock.json index 553821c..091eaab 100644 --- a/package-lock.json +++ b/package-lock.json @@ -32,7 +32,6 @@ "dateformat": "^5.0.3", "gsap": "^3.12.5", "mobile-detect": "^1.4.5", - "node-html-parser": "^6.1.13", "octokit": "^4.0.2", "rehype-external-links": "^3.0.0", "remark-simple-plantuml": "npm:@akebifiky/remark-simple-plantuml@^1.0.2", @@ -19915,16 +19914,6 @@ "node": "^16.13.0 || >=18.0.0" } }, - "node_modules/node-html-parser": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", - "license": "MIT", - "dependencies": { - "css-select": "^5.1.0", - "he": "1.2.0" - } - }, "node_modules/node-html-to-image": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/node-html-to-image/-/node-html-to-image-4.0.0.tgz", @@ -28433,6 +28422,7 @@ } }, "utils/dog": { + "name": "@d0rich/dog", "version": "0.1.0", "dependencies": { "@backroad/backroad": "^1.4.0-alpha.5", @@ -35601,7 +35591,6 @@ "dateformat": "^5.0.3", "gsap": "^3.12.5", "mobile-detect": "^1.4.5", - "node-html-parser": "^6.1.13", "nuxt": "^3.12.1", "octokit": "^4.0.2", "rehype-external-links": "^3.0.0", @@ -40982,15 +40971,6 @@ "resolved": "https://registry.npmjs.org/node-gyp-build/-/node-gyp-build-4.8.1.tgz", "integrity": "sha512-OSs33Z9yWr148JZcbZd5WiAXhh/n9z8TxQcdMhIOlpN9AhWpLfvVFO73+m77bBABQMaY9XSvIa+qk0jlI7Gcaw==" }, - "node-html-parser": { - "version": "6.1.13", - "resolved": "https://registry.npmjs.org/node-html-parser/-/node-html-parser-6.1.13.tgz", - "integrity": "sha512-qIsTMOY4C/dAa5Q5vsobRpOOvPfC4pB61UVW2uSwZNUp0QU/jCekTal1vMmbO0DgdHeLUJpv/ARmDqErVxA3Sg==", - "requires": { - "css-select": "^5.1.0", - "he": "1.2.0" - } - }, "node-html-to-image": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/node-html-to-image/-/node-html-to-image-4.0.0.tgz", From 7e439b6553f3fe729be915a0a54f91b2f317a88a Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sat, 15 Jun 2024 19:31:10 +0400 Subject: [PATCH 18/24] =?UTF-8?q?Resume=20->=20Resum=C3=A9?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- apps/d0rich.me/components/layouts/DHeader.vue | 2 +- apps/d0rich.me/pages/resume/[type].vue | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/apps/d0rich.me/components/layouts/DHeader.vue b/apps/d0rich.me/components/layouts/DHeader.vue index a5ad0f2..e817fbf 100644 --- a/apps/d0rich.me/components/layouts/DHeader.vue +++ b/apps/d0rich.me/components/layouts/DHeader.vue @@ -15,7 +15,7 @@ <DBtn to="/"> Dorich </DBtn> <DBtn to="/projects/"> Projects </DBtn> <DBtn to="/blog/"> Blog </DBtn> - <DBtn to="/resume/"> Resume </DBtn> + <DBtn to="/resume/"> Resumé </DBtn> </div> </DShape> </header> diff --git a/apps/d0rich.me/pages/resume/[type].vue b/apps/d0rich.me/pages/resume/[type].vue index 93f7b6b..67de1a9 100644 --- a/apps/d0rich.me/pages/resume/[type].vue +++ b/apps/d0rich.me/pages/resume/[type].vue @@ -42,7 +42,7 @@ const { data: resumeList } = useAsyncData( <div> <AsyncSafeSeoWithOg v-if="data" - :title="`Resume: ${data.lead.title}`" + :title="`Resumé: ${data.lead.title}`" :description="data.lead.description" /> <DevOnly> From a6e1e7b671f2cce183fbbcc526e64399dbddf07e Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sun, 16 Jun 2024 09:00:18 +0400 Subject: [PATCH 19/24] Generate PDF --- cdn/package-lock.json | 237 ++++++++----------- cdn/package.json | 3 +- cdn/src/config.ts | 5 + cdn/src/features/resume/collectResumeList.ts | 8 +- cdn/src/features/resume/getResumePdf.ts | 21 +- cdn/src/features/resume/saveAllResume.ts | 6 +- 6 files changed, 132 insertions(+), 148 deletions(-) create mode 100644 cdn/src/config.ts diff --git a/cdn/package-lock.json b/cdn/package-lock.json index 4545fa3..aef3f0c 100644 --- a/cdn/package-lock.json +++ b/cdn/package-lock.json @@ -8,8 +8,9 @@ "name": "cdn", "version": "1.0.0", "dependencies": { + "consola": "^3.2.3", "ofetch": "^1.3.4", - "puppeteer": "^22.11.0", + "puppeteer": "^21.11.0", "unstorage": "^1.10.2", "zod": "^3.23.8" }, @@ -746,17 +747,16 @@ } }, "node_modules/@puppeteer/browsers": { - "version": "2.2.3", - "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-2.2.3.tgz", - "integrity": "sha512-bJ0UBsk0ESOs6RFcLXOt99a3yTDcOKlzfjad+rhFwdaG1Lu/Wzq58GHYCDTlZ9z6mldf4g+NTb+TXEfe0PpnsQ==", + "version": "1.9.1", + "resolved": "https://registry.npmjs.org/@puppeteer/browsers/-/browsers-1.9.1.tgz", + "integrity": "sha512-PuvK6xZzGhKPvlx3fpfdM2kYY3P/hB1URtK8wA7XUJ6prn6pp22zvJHu48th0SGcHL9SutbPHrFuQgfXTFobWA==", "license": "Apache-2.0", "dependencies": { "debug": "4.3.4", "extract-zip": "2.0.1", "progress": "2.0.3", - "proxy-agent": "6.4.0", - "semver": "7.6.0", - "tar-fs": "3.0.5", + "proxy-agent": "6.3.1", + "tar-fs": "3.0.4", "unbzip2-stream": "1.4.3", "yargs": "17.7.2" }, @@ -764,7 +764,7 @@ "browsers": "lib/cjs/main-cli.js" }, "engines": { - "node": ">=18" + "node": ">=16.3.0" } }, "node_modules/@tootallnate/quickjs-emscripten": { @@ -882,45 +882,6 @@ "license": "Apache-2.0", "optional": true }, - "node_modules/bare-fs": { - "version": "2.3.1", - "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.3.1.tgz", - "integrity": "sha512-W/Hfxc/6VehXlsgFtbB5B4xFcsCl+pAh30cYhoFyXErf6oGrwjh8SwiPAdHgpmWonKuYpZgGywN0SXt7dgsADA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-events": "^2.0.0", - "bare-path": "^2.0.0", - "bare-stream": "^2.0.0" - } - }, - "node_modules/bare-os": { - "version": "2.4.0", - "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.4.0.tgz", - "integrity": "sha512-v8DTT08AS/G0F9xrhyLtepoo9EJBJ85FRSMbu1pQUlAf6A8T0tEEQGMVObWeqpjhSPXsE0VGlluFBJu2fdoTNg==", - "license": "Apache-2.0", - "optional": true - }, - "node_modules/bare-path": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.3.tgz", - "integrity": "sha512-lh/eITfU8hrj9Ru5quUp0Io1kJWIk1bTjzo7JH1P5dWmQ2EL4hFUlfI8FonAhSlgIfhn63p84CDY/x+PisgcXA==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "bare-os": "^2.1.0" - } - }, - "node_modules/bare-stream": { - "version": "2.1.3", - "resolved": "https://registry.npmjs.org/bare-stream/-/bare-stream-2.1.3.tgz", - "integrity": "sha512-tiDAH9H/kP+tvNO5sczyn9ZAA7utrSMobyDchsnyyXBuUe2FSQWbxhtuHB8jwpHYYevVo2UJpcmvvjrbHboUUQ==", - "license": "Apache-2.0", - "optional": true, - "dependencies": { - "streamx": "^2.18.0" - } - }, "node_modules/base64-js": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/base64-js/-/base64-js-1.5.1.tgz", @@ -1055,14 +1016,13 @@ } }, "node_modules/chromium-bidi": { - "version": "0.5.23", - "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.23.tgz", - "integrity": "sha512-1o/gLU9wDqbN5nL2MtfjykjOuighGXc3/hnWueO1haiEoFgX8h5vbvcA4tgdQfjw1mkZ1OEF4x/+HVeqEX6NoA==", + "version": "0.5.8", + "resolved": "https://registry.npmjs.org/chromium-bidi/-/chromium-bidi-0.5.8.tgz", + "integrity": "sha512-blqh+1cEQbHBKmok3rVJkBlBxt9beKBgOsxbFgs7UJcoVbbeZ+K7+6liAsjgpc8l1Xd55cQUy14fXZdGSb4zIw==", "license": "Apache-2.0", "dependencies": { "mitt": "3.0.1", - "urlpattern-polyfill": "10.0.0", - "zod": "3.23.8" + "urlpattern-polyfill": "10.0.0" }, "peerDependencies": { "devtools-protocol": "*" @@ -1170,6 +1130,15 @@ } } }, + "node_modules/cross-fetch": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/cross-fetch/-/cross-fetch-4.0.0.tgz", + "integrity": "sha512-e4a5N8lVvuLgAWgnCrLr2PP0YyDOTHa9H/Rj54dirp61qXnNq46m82bRhNqIA5VccJtWBvPTFRV3TtvHUKPB1g==", + "license": "MIT", + "dependencies": { + "node-fetch": "^2.6.12" + } + }, "node_modules/cross-spawn": { "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", @@ -1263,9 +1232,9 @@ } }, "node_modules/devtools-protocol": { - "version": "0.0.1299070", - "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1299070.tgz", - "integrity": "sha512-+qtL3eX50qsJ7c+qVyagqi7AWMoQCBGNfoyJZMwm/NSXVqLYbuitrWEEIzxfUmTNy7//Xe8yhMmQ+elj3uAqSg==", + "version": "0.0.1232444", + "resolved": "https://registry.npmjs.org/devtools-protocol/-/devtools-protocol-0.0.1232444.tgz", + "integrity": "sha512-pM27vqEfxSxRkTMnF+XCmxSEb6duO5R+t8A9DEEJgy4Wz2RVanje2mmj99B6A3zv2r/qGfYlOvYznUhuokizmg==", "license": "BSD-3-Clause" }, "node_modules/emoji-regex": { @@ -2009,6 +1978,12 @@ "integrity": "sha512-vKivATfr97l2/QBCYAkXYDbrIWPM2IIKEl7YPhjCvKlG3kE2gm+uBo6nEXK3M5/Ffh/FLpKExzOQ3JJoJGFKBw==", "license": "MIT" }, + "node_modules/mkdirp-classic": { + "version": "0.5.3", + "resolved": "https://registry.npmjs.org/mkdirp-classic/-/mkdirp-classic-0.5.3.tgz", + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==", + "license": "MIT" + }, "node_modules/mlly": { "version": "1.7.1", "resolved": "https://registry.npmjs.org/mlly/-/mlly-1.7.1.tgz", @@ -2054,6 +2029,26 @@ "node": "^16 || ^18 || >= 20" } }, + "node_modules/node-fetch": { + "version": "2.7.0", + "resolved": "https://registry.npmjs.org/node-fetch/-/node-fetch-2.7.0.tgz", + "integrity": "sha512-c4FRfUm/dbcWZ7U+1Wq0AwCyFL+3nt2bEw05wfxSz+DWpWsitgmSgYmy2dQdWyKC1694ELPqMs/YzUSNozLt8A==", + "license": "MIT", + "dependencies": { + "whatwg-url": "^5.0.0" + }, + "engines": { + "node": "4.x || >=6.0.0" + }, + "peerDependencies": { + "encoding": "^0.1.0" + }, + "peerDependenciesMeta": { + "encoding": { + "optional": true + } + } + }, "node_modules/node-fetch-native": { "version": "1.6.4", "resolved": "https://registry.npmjs.org/node-fetch-native/-/node-fetch-native-1.6.4.tgz", @@ -2268,15 +2263,15 @@ } }, "node_modules/proxy-agent": { - "version": "6.4.0", - "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.4.0.tgz", - "integrity": "sha512-u0piLU+nCOHMgGjRbimiXmA9kM/L9EHh3zL81xCdp7m+Y2pHIsnmbdDoEDoAz5geaonNR6q6+yOPQs6n4T6sBQ==", + "version": "6.3.1", + "resolved": "https://registry.npmjs.org/proxy-agent/-/proxy-agent-6.3.1.tgz", + "integrity": "sha512-Rb5RVBy1iyqOtNl15Cw/llpeLH8bsb37gM1FUfKQ+Wck6xHlbAhWGUFiTRHtkjqGTA5pSHz6+0hrPW/oECihPQ==", "license": "MIT", "dependencies": { "agent-base": "^7.0.2", "debug": "^4.3.4", - "http-proxy-agent": "^7.0.1", - "https-proxy-agent": "^7.0.3", + "http-proxy-agent": "^7.0.0", + "https-proxy-agent": "^7.0.2", "lru-cache": "^7.14.1", "pac-proxy-agent": "^7.0.1", "proxy-from-env": "^1.1.0", @@ -2303,55 +2298,39 @@ } }, "node_modules/puppeteer": { - "version": "22.11.0", - "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-22.11.0.tgz", - "integrity": "sha512-U5U0Dx5Tsd/ec39BmflhcSFIK9UnZxGQfyUzvQVHivt6gIi6RgJqYL9MJaU90OG6tTz65XqzN4wF0ZyDyY0NuA==", + "version": "21.11.0", + "resolved": "https://registry.npmjs.org/puppeteer/-/puppeteer-21.11.0.tgz", + "integrity": "sha512-9jTHuYe22TD3sNxy0nEIzC7ZrlRnDgeX3xPkbS7PnbdwYjl2o/z/YuCrRBwezdKpbTDTJ4VqIggzNyeRcKq3cg==", + "deprecated": "< 22.6.4 is no longer supported", "hasInstallScript": true, "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.2.3", + "@puppeteer/browsers": "1.9.1", "cosmiconfig": "9.0.0", - "devtools-protocol": "0.0.1299070", - "puppeteer-core": "22.11.0" + "puppeteer-core": "21.11.0" }, "bin": { "puppeteer": "lib/esm/puppeteer/node/cli.js" }, "engines": { - "node": ">=18" + "node": ">=16.13.2" } }, "node_modules/puppeteer-core": { - "version": "22.11.0", - "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-22.11.0.tgz", - "integrity": "sha512-57YUjhRoSpZWg9lCssWsgzM1/X/1jQnkKbbspbeW0bhZTt3TD4WdNXEYI7KrFFnSvx21tyHhfWW0zlxzbwYSAA==", + "version": "21.11.0", + "resolved": "https://registry.npmjs.org/puppeteer-core/-/puppeteer-core-21.11.0.tgz", + "integrity": "sha512-ArbnyA3U5SGHokEvkfWjW+O8hOxV1RSJxOgriX/3A4xZRqixt9ZFHD0yPgZQF05Qj0oAqi8H/7stDorjoHY90Q==", "license": "Apache-2.0", "dependencies": { - "@puppeteer/browsers": "2.2.3", - "chromium-bidi": "0.5.23", - "debug": "4.3.5", - "devtools-protocol": "0.0.1299070", - "ws": "8.17.0" - }, - "engines": { - "node": ">=18" - } - }, - "node_modules/puppeteer-core/node_modules/debug": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.5.tgz", - "integrity": "sha512-pt0bNEmneDIvdL1Xsd9oDQ/wrQRkXDT4AUWlNZNPKvW5x/jyO9VFXkJUP07vQ2upmw5PlaITaPKc31jK13V+jg==", - "license": "MIT", - "dependencies": { - "ms": "2.1.2" + "@puppeteer/browsers": "1.9.1", + "chromium-bidi": "0.5.8", + "cross-fetch": "4.0.0", + "debug": "4.3.4", + "devtools-protocol": "0.0.1232444", + "ws": "8.16.0" }, "engines": { - "node": ">=6.0" - }, - "peerDependenciesMeta": { - "supports-color": { - "optional": true - } + "node": ">=16.13.2" } }, "node_modules/queue-tick": { @@ -2406,33 +2385,6 @@ "url": "https://github.com/privatenumber/resolve-pkg-maps?sponsor=1" } }, - "node_modules/semver": { - "version": "7.6.0", - "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.0.tgz", - "integrity": "sha512-EnwXhrlwXMk9gKu5/flx5sv/an57AkRplG3hTK68W7FRDN+k+OWBj65M7719OkA82XLBxrcX0KSHj+X5COhOVg==", - "license": "ISC", - "dependencies": { - "lru-cache": "^6.0.0" - }, - "bin": { - "semver": "bin/semver.js" - }, - "engines": { - "node": ">=10" - } - }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "license": "ISC", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/shebang-command": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", @@ -2603,17 +2555,14 @@ } }, "node_modules/tar-fs": { - "version": "3.0.5", - "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", - "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", + "version": "3.0.4", + "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.4.tgz", + "integrity": "sha512-5AFQU8b9qLfZCX9zp2duONhPmZv0hGYiBPJsyUdqMjzq/mqVpy/rEUSeHk1+YitmxugaptgBh5oDGU3VsAJq4w==", "license": "MIT", "dependencies": { + "mkdirp-classic": "^0.5.2", "pump": "^3.0.0", "tar-stream": "^3.1.5" - }, - "optionalDependencies": { - "bare-fs": "^2.1.1", - "bare-path": "^2.1.0" } }, "node_modules/tar-stream": { @@ -2654,6 +2603,12 @@ "node": ">=8.0" } }, + "node_modules/tr46": { + "version": "0.0.3", + "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", + "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==", + "license": "MIT" + }, "node_modules/tslib": { "version": "2.6.3", "resolved": "https://registry.npmjs.org/tslib/-/tslib-2.6.3.tgz", @@ -2854,6 +2809,22 @@ "integrity": "sha512-H/A06tKD7sS1O1X2SshBVeA5FLycRpjqiBeqGKmBwBDBy28EnRjORxTNe269KSSr5un5qyWi1iL61wLxpd+ZOg==", "license": "MIT" }, + "node_modules/webidl-conversions": { + "version": "3.0.1", + "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", + "integrity": "sha512-2JAn3z8AR6rjK8Sm8orRC0h/bcl/DqL7tRPdGZ4I1CjdF+EaMLmYxBHyXuKL849eucPFhvBoxMsflfOb8kxaeQ==", + "license": "BSD-2-Clause" + }, + "node_modules/whatwg-url": { + "version": "5.0.0", + "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", + "integrity": "sha512-saE57nupxk6v3HY35+jzBwYa0rKSy0XR8JSxZPwgLr7ys0IBzhGviA1/TUGJLmSVqs8pb9AnvICXEuOHLprYTw==", + "license": "MIT", + "dependencies": { + "tr46": "~0.0.3", + "webidl-conversions": "^3.0.0" + } + }, "node_modules/which": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", @@ -2926,9 +2897,9 @@ "license": "ISC" }, "node_modules/ws": { - "version": "8.17.0", - "resolved": "https://registry.npmjs.org/ws/-/ws-8.17.0.tgz", - "integrity": "sha512-uJq6108EgZMAl20KagGkzCKfMEjxmKvZHG7Tlq0Z6nOky7YF7aq4mOx6xK8TJ/i1LeK4Qus7INktacctDgY8Ow==", + "version": "8.16.0", + "resolved": "https://registry.npmjs.org/ws/-/ws-8.16.0.tgz", + "integrity": "sha512-HS0c//TP7Ina87TfiPUz1rQzMhHrl/SG2guqRcTOIUYD2q8uhUdNHZYJUaQ8aTGPzCh+c6oawMKW35nFl1dxyQ==", "license": "MIT", "engines": { "node": ">=10.0.0" @@ -2955,12 +2926,6 @@ "node": ">=10" } }, - "node_modules/yallist": { - "version": "4.0.0", - "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "license": "ISC" - }, "node_modules/yargs": { "version": "17.7.2", "resolved": "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz", diff --git a/cdn/package.json b/cdn/package.json index 1328606..33bdab8 100644 --- a/cdn/package.json +++ b/cdn/package.json @@ -7,8 +7,9 @@ "build": "tsx ./src/main.ts" }, "dependencies": { + "consola": "^3.2.3", "ofetch": "^1.3.4", - "puppeteer": "^22.11.0", + "puppeteer": "^21.11.0", "unstorage": "^1.10.2", "zod": "^3.23.8" }, diff --git a/cdn/src/config.ts b/cdn/src/config.ts new file mode 100644 index 0000000..92fe337 --- /dev/null +++ b/cdn/src/config.ts @@ -0,0 +1,5 @@ +import consola from "consola" + +export const config = { + MAIN_BASE_URL: 'https://deploy-preview-16--d0rich-me.netlify.app' //'https://d0rich.me', +} diff --git a/cdn/src/features/resume/collectResumeList.ts b/cdn/src/features/resume/collectResumeList.ts index c98bed3..47c5a7e 100644 --- a/cdn/src/features/resume/collectResumeList.ts +++ b/cdn/src/features/resume/collectResumeList.ts @@ -1,10 +1,14 @@ import { TypeOf } from 'zod' import { ofetch } from 'ofetch' import { ResumeListSchema } from '../../models/ResumeList' +import { config } from '../../config' +import {consola} from 'consola' export async function collectResumeList() { const response = await ofetch<TypeOf<typeof ResumeListSchema>>( - 'https://d0rich.me/api/resume/list' + `${config.MAIN_BASE_URL}/api/resume/list.json` ) - return ResumeListSchema.parse(response) + const list = ResumeListSchema.parse(response) + consola.info('Resume list collected: ', list) + return list } diff --git a/cdn/src/features/resume/getResumePdf.ts b/cdn/src/features/resume/getResumePdf.ts index 3b3dcd9..8c83d5b 100644 --- a/cdn/src/features/resume/getResumePdf.ts +++ b/cdn/src/features/resume/getResumePdf.ts @@ -1,27 +1,32 @@ import { BrowserStore } from '../../store/browser' +import { config } from '../../config' +import { consola } from 'consola' export async function getResumePdf(path: string) { const browser = await BrowserStore.getBrowser() const page = await browser.newPage() - await page.goto('http://d0rich.me' + path, { - waitUntil: 'networkidle0' + await page.goto(config.MAIN_BASE_URL + path, { + waitUntil: 'domcontentloaded' }) + consola.debug('Page loaded: ', config.MAIN_BASE_URL + path) await page.emulateMediaType('print') + consola.debug('Emulated media type: print') await page.evaluate(() => { const html = document.querySelector('html') if (html) { html.className = 'light' - html.querySelectorAll('a').forEach((a) => { - const href = a.getAttribute('href') - if (!href) return - if (href.startsWith('/')) a.href = 'https://d0rich.me' + href - }) } }) + consola.debug('Page evaluated') const pdf = await page.pdf({ printBackground: true, - format: 'A4' + format: 'A4', + margin: { + top: '1cm', + bottom: '1cm' + } }) + consola.debug('PDF generated') await page.close() return pdf } diff --git a/cdn/src/features/resume/saveAllResume.ts b/cdn/src/features/resume/saveAllResume.ts index 7f71a49..499bd84 100644 --- a/cdn/src/features/resume/saveAllResume.ts +++ b/cdn/src/features/resume/saveAllResume.ts @@ -1,13 +1,17 @@ import { collectResumeList } from './collectResumeList' import { getResumePdf } from './getResumePdf' import { dist } from '../../store/dist' +import { consola } from 'consola' export async function saveAllResume() { const resumeList = await collectResumeList() await Promise.all( resumeList.map(async (resume) => { + consola.info('Saving resume: ', resume.title) + const fileName = `Nikolai_Dorofeev-${resume.title.trim().replace(' ', '_')}.pdf` const pdf = await getResumePdf(resume.path) - await dist.setItemRaw(`resume:${resume.title}.pdf`, pdf) + await dist.setItemRaw(`resume:${fileName}`, pdf) + consola.success('Resume saved: ', fileName) }) ) } From 860700468da47af1c29d933171ed2c7581b776e0 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sun, 16 Jun 2024 09:13:52 +0400 Subject: [PATCH 20/24] CDN build workflow --- .github/workflows/cdn.build.yaml | 30 ++++++++++++++++++++++++++++++ 1 file changed, 30 insertions(+) create mode 100644 .github/workflows/cdn.build.yaml diff --git a/.github/workflows/cdn.build.yaml b/.github/workflows/cdn.build.yaml new file mode 100644 index 0000000..ef84f1f --- /dev/null +++ b/.github/workflows/cdn.build.yaml @@ -0,0 +1,30 @@ +name: Build CDN +on: + push: + branches: + - main + schedule: + - cron: '0 0 * * 0' + workflow_dispatch: + +jobs: + build: + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v2 + - name: Install Node.js + uses: actions/setup-node@v2 + with: + node-version: '20' + - name: Install dependencies + working-directory: ./cdn + run: npm ci + - name: Build + working-directory: ./cdn + run: npm run build + - name: Deploy + uses: peaceiris/actions-gh-pages@v3 + with: + github_token: ${{ secrets.GITHUB_TOKEN }} + publish_dir: ./cdn/dist + publish_branch: cdn From 8e95cb1406bdbabf0988da6c96203452d78c2d15 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sun, 16 Jun 2024 09:18:34 +0400 Subject: [PATCH 21/24] Redirect PDF link to CDN --- apps/d0rich.me/pages/resume/[type].vue | 6 ++---- cdn/src/config.ts | 2 -- cdn/src/features/resume/collectResumeList.ts | 2 +- 3 files changed, 3 insertions(+), 7 deletions(-) diff --git a/apps/d0rich.me/pages/resume/[type].vue b/apps/d0rich.me/pages/resume/[type].vue index 67de1a9..acc767a 100644 --- a/apps/d0rich.me/pages/resume/[type].vue +++ b/apps/d0rich.me/pages/resume/[type].vue @@ -16,10 +16,8 @@ const { data, error } = useFetch<ResumeData>('/api/resume/data', { }) const printResumeLink = computed(() => { - return `/api/resume/Nikolai_Dorofeev-${data.value?.lead.title?.replaceAll( - ' ', - '_' - )}.pdf` + const specialization = data.value?.lead.title?.replaceAll(' ', '_') + return `https://cdn.d0rich.me/resume/Nikolai_Dorofeev-${specialization}.pdf` }) const { data: resumeList } = useAsyncData( diff --git a/cdn/src/config.ts b/cdn/src/config.ts index 92fe337..8a07b41 100644 --- a/cdn/src/config.ts +++ b/cdn/src/config.ts @@ -1,5 +1,3 @@ -import consola from "consola" - export const config = { MAIN_BASE_URL: 'https://deploy-preview-16--d0rich-me.netlify.app' //'https://d0rich.me', } diff --git a/cdn/src/features/resume/collectResumeList.ts b/cdn/src/features/resume/collectResumeList.ts index 47c5a7e..f4cb666 100644 --- a/cdn/src/features/resume/collectResumeList.ts +++ b/cdn/src/features/resume/collectResumeList.ts @@ -2,7 +2,7 @@ import { TypeOf } from 'zod' import { ofetch } from 'ofetch' import { ResumeListSchema } from '../../models/ResumeList' import { config } from '../../config' -import {consola} from 'consola' +import { consola } from 'consola' export async function collectResumeList() { const response = await ofetch<TypeOf<typeof ResumeListSchema>>( From 7735ddd46aa57b7d1a7c20c2fa15ed3e0a1a2c84 Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sun, 16 Jun 2024 09:40:33 +0400 Subject: [PATCH 22/24] Fix resume print view --- .../components/resume/CertificatesCard.vue | 8 ++++++-- apps/d0rich.me/components/resume/ProjectNote.vue | 2 +- apps/d0rich.me/components/resume/ProjectsCard.vue | 8 ++++++-- apps/d0rich.me/components/resume/TimeNote.vue | 8 +++++--- apps/d0rich.me/pages/resume/[type].vue | 13 +++++++------ 5 files changed, 25 insertions(+), 14 deletions(-) diff --git a/apps/d0rich.me/components/resume/CertificatesCard.vue b/apps/d0rich.me/components/resume/CertificatesCard.vue index 584b41d..1330437 100644 --- a/apps/d0rich.me/components/resume/CertificatesCard.vue +++ b/apps/d0rich.me/components/resume/CertificatesCard.vue @@ -7,9 +7,13 @@ defineProps<{ </script> <template> - <DCard dense class="break-inside-avoid"> + <DCard dense class=""> <ul class="resume-sertificates-card__list"> - <li v-for="cert in cerificates" :key="cert._id"> + <li + v-for="cert in cerificates" + :key="cert._id" + class="break-inside-avoid" + > {{ cert.title }} (<NuxtLink class="resume-sertificates-card__place" diff --git a/apps/d0rich.me/components/resume/ProjectNote.vue b/apps/d0rich.me/components/resume/ProjectNote.vue index cc8590f..1b24e18 100644 --- a/apps/d0rich.me/components/resume/ProjectNote.vue +++ b/apps/d0rich.me/components/resume/ProjectNote.vue @@ -7,7 +7,7 @@ defineProps<{ </script> <template> - <DCard class="break-inside-avoid"> + <DCard class=""> <DCardTitle> {{ project.title }} <template #extra> diff --git a/apps/d0rich.me/components/resume/ProjectsCard.vue b/apps/d0rich.me/components/resume/ProjectsCard.vue index 5aea451..86c392e 100644 --- a/apps/d0rich.me/components/resume/ProjectsCard.vue +++ b/apps/d0rich.me/components/resume/ProjectsCard.vue @@ -7,9 +7,13 @@ defineProps<{ </script> <template> - <DCard dense class="break-inside-avoid"> + <DCard dense> <ul class="resume-projects-card__list"> - <li v-for="project in projects" :key="project.url"> + <li + v-for="project in projects" + :key="project.url" + class="break-inside-avoid" + > <NuxtLink class="resume-projects-card__place" :href="addTrailingSlash(project.url)" diff --git a/apps/d0rich.me/components/resume/TimeNote.vue b/apps/d0rich.me/components/resume/TimeNote.vue index 11cb2f1..f1b2f9d 100644 --- a/apps/d0rich.me/components/resume/TimeNote.vue +++ b/apps/d0rich.me/components/resume/TimeNote.vue @@ -18,7 +18,7 @@ defineProps<{ </script> <template> - <DCard class="break-inside-avoid"> + <DCard class=""> <DCardTitle> {{ timenote.title }} <template #extra> @@ -26,13 +26,15 @@ defineProps<{ :is="timenote.place.link ? 'a' : 'span'" :href="timenote.place.link" target="_blank" - class="timenote__place-link" + class="timenote__place-link print:ml-2" > {{ timenote.place.title }} </Component> </template> </DCardTitle> - <p class="text-blue-600 dark:text-blue-300 print:text-sm"> + <p + class="text-blue-600 dark:text-blue-300 print:text-sm break-inside-avoid" + > <time :datetime="timenote.daterange.start"> {{ dateToMonthYear(timenote.daterange.start) }} </time> diff --git a/apps/d0rich.me/pages/resume/[type].vue b/apps/d0rich.me/pages/resume/[type].vue index acc767a..678eb07 100644 --- a/apps/d0rich.me/pages/resume/[type].vue +++ b/apps/d0rich.me/pages/resume/[type].vue @@ -108,7 +108,7 @@ const { data: resumeList } = useAsyncData( }" > <div class="print:order-2"> - <section id="languages" class="break-inside-avoid"> + <section id="languages" class=""> <h2 class="resume-page__section-title">Languages</h2> <ContentRenderer :value="data.languages" @@ -116,7 +116,7 @@ const { data: resumeList } = useAsyncData( class="resume-page__prose-content" /> </section> - <section id="skills" class="break-inside-avoid"> + <section id="skills" class=""> <h2 class="resume-page__section-title">Skills</h2> <TransitionGroup name="skills-list" @@ -131,12 +131,13 @@ const { data: resumeList } = useAsyncData( v-for="skillset in data.skills" :key="skillset._id" :value="skillset" + class="break-inside-avoid" /> </TransitionGroup> </section> </div> <div> - <section id="work-experience" class="break-inside-avoid"> + <section id="work-experience" class=""> <h2 class="resume-page__section-title">Work Experience</h2> <ResumeTimeNote v-for="workPlace in data.work" @@ -146,16 +147,16 @@ const { data: resumeList } = useAsyncData( /> </section> <div class="grid md:grid-cols-2 gap-x-20 print:block"> - <section id="projects" class="break-inside-avoid"> + <section id="projects" class=""> <h2 class="resume-page__section-title">Projects</h2> <ResumeProjectsCard :projects="data.projects" /> </section> - <section id="certificates" class="break-inside-avoid"> + <section id="certificates" class=""> <h2 class="resume-page__section-title">Certificates</h2> <ResumeCertificatesCard :cerificates="data.certificates" /> </section> </div> - <section id="education" class="break-inside-avoid"> + <section id="education" class=""> <h2 class="resume-page__section-title">Education</h2> <ResumeTimeNote v-for="eduPlace in data.education" From 3f8f0e716c9316982f16e803f60ea42d4cfe868f Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sun, 16 Jun 2024 09:42:46 +0400 Subject: [PATCH 23/24] Change CDN build trigger --- .github/workflows/cdn.build.yaml | 6 ++---- 1 file changed, 2 insertions(+), 4 deletions(-) diff --git a/.github/workflows/cdn.build.yaml b/.github/workflows/cdn.build.yaml index ef84f1f..6e282a5 100644 --- a/.github/workflows/cdn.build.yaml +++ b/.github/workflows/cdn.build.yaml @@ -1,10 +1,8 @@ name: Build CDN on: - push: - branches: - - main schedule: - - cron: '0 0 * * 0' + # Run every day + - cron: '0 0 * * *' workflow_dispatch: jobs: From 3e6893a029af2610f39b30619fc9a2e2bc4f644b Mon Sep 17 00:00:00 2001 From: Nikolai Dorofeev <d0rich.connect@gmail.com> Date: Sun, 16 Jun 2024 09:53:14 +0400 Subject: [PATCH 24/24] Prepare dog for publishing --- .changeset/silly-hounds-sit.md | 5 +++++ utils/dog/package.json | 28 ++++++++++++++++++++++++++-- 2 files changed, 31 insertions(+), 2 deletions(-) create mode 100644 .changeset/silly-hounds-sit.md diff --git a/.changeset/silly-hounds-sit.md b/.changeset/silly-hounds-sit.md new file mode 100644 index 0000000..96dffa5 --- /dev/null +++ b/.changeset/silly-hounds-sit.md @@ -0,0 +1,5 @@ +--- +'@d0rich/dog': minor +--- + +Implement OG images generator CLI and web UI diff --git a/utils/dog/package.json b/utils/dog/package.json index a30f887..de9c44d 100644 --- a/utils/dog/package.json +++ b/utils/dog/package.json @@ -1,11 +1,35 @@ { "name": "@d0rich/dog", "description": "A CLI tool to generate favicons and app icons for your web app", - "version": "0.1.0", + "version": "0.0.1", "publishConfig": { "access": "public" }, - "bin": "./dist/cli.js", + "author": { + "name": "Nikolai Dorofeev", + "email": "dorich2000@gmail.com", + "url": "https://d0rich.me/" + }, + "keywords": [ + "cli", + "favicon", + "icon", + "web", + "app", + "generator" + ], + "repository": { + "type": "git", + "url": "https://github.com/d0rich/esprit", + "directory": "utils/dog" + }, + "bin": { + "dog": "./dist/cli.js" + }, + "files": [ + "dist", + "assets" + ], "scripts": { "build": "tsc", "dev:web": "tsx watch ./src/runWeb.ts",