diff --git a/package-lock.json b/package-lock.json index 5eaf065..6696508 100644 --- a/package-lock.json +++ b/package-lock.json @@ -14,19 +14,20 @@ "@hotwired/turbo": "^8.0.2", "@koa/router": "^12.0.1", "@playwright/test": "^1.36.1", - "@sealcode/jdd": "^0.2.18", - "@sealcode/sealgen": "^0.12.13", + "@sealcode/jdd": "^0.3.0", + "@sealcode/sealgen": "^0.13.0", "@sealcode/ts-predicates": "^0.4.3", "@types/kill-port": "^2.0.0", "get-port": "^7.0.0", "js-convert-case": "^4.2.0", + "koa-responsive-image-router": "^0.2.18", "locreq": "^3.0.0", "multiple-scripts-tmux": "^1.0.4", "nodemon": "^3.0.1", "object-path": "^0.11.8", "sealious": "^0.17.48", "stimulus": "^2.0.0", - "tempstream": "^0.3.12", + "tempstream": "^0.3.15", "unplugin-auto-import": "^0.17.5", "vitest": "^1.1.0" }, @@ -36,6 +37,7 @@ "@types/node": "^20.8.4", "@types/object-path": "^0.11.4", "@types/tedious": "^4.0.7", + "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "^5.10.0", "@typescript-eslint/parser": "^5.10.2", "@vitest/coverage-istanbul": "^1.1.0", @@ -375,6 +377,7 @@ "version": "0.8.1", "resolved": "https://registry.npmjs.org/@cspotcode/source-map-support/-/source-map-support-0.8.1.tgz", "integrity": "sha512-IchNf6dN4tHoMFIn/7OE8LWZ19Y6q/67Bmf6vnGREv8RSbBVb9LPJxEcnwrcwX6ixSvaiGoomAUvu4YSxXrVgw==", + "dev": true, "dependencies": { "@jridgewell/trace-mapping": "0.3.9" }, @@ -386,6 +389,7 @@ "version": "0.3.9", "resolved": "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.9.tgz", "integrity": "sha512-3Belt6tdc8bPgAtbcmdtNJlirVoTmEb5e2gC94PnkwEW9jI6CAHUeoG85tjWP5WquqfavoMtMwiG4P926ZKKuQ==", + "dev": true, "dependencies": { "@jridgewell/resolve-uri": "^3.0.3", "@jridgewell/sourcemap-codec": "^1.4.10" @@ -1303,13 +1307,17 @@ } }, "node_modules/@sealcode/jdd": { - "version": "0.2.18", - "resolved": "https://registry.npmjs.org/@sealcode/jdd/-/jdd-0.2.18.tgz", - "integrity": "sha512-1+kG7mBgnGB53K5QoQ8ggwgnaQ7xtgR3rfFpv+Dv/hRTu0VsPPf+FvXX8od1zM/XWHuglFEhs+tFwsLHrAQbjw==", + "version": "0.3.0", + "resolved": "https://registry.npmjs.org/@sealcode/jdd/-/jdd-0.3.0.tgz", + "integrity": "sha512-yybF+4ykSrGWgWUV3ss8hMQS0Ma55Of+Gw+uuJwZINSAxAqdXT1/h4pDbezDMVQTgFvn1TfQne/qXzc/LjCdFA==", "dependencies": { "@sealcode/ts-predicates": "^0.5.3", + "koa-responsive-image-router": "^0.2.15", + "locreq": "^2.4.1", "marked": "^12.0.0", - "tempstream": "^0.3.4" + "mime-types": "^2.1.35", + "tempstream": "^0.3.4", + "uuid": "^9.0.1" } }, "node_modules/@sealcode/jdd/node_modules/@sealcode/ts-predicates": { @@ -1317,6 +1325,19 @@ "resolved": "https://registry.npmjs.org/@sealcode/ts-predicates/-/ts-predicates-0.5.3.tgz", "integrity": "sha512-EZI7e8EY8gI1pw2bKdevjl+fBJbcSlpNkCZ8XoEOV3cHakPujiT6M4l775RDkfxJSbLX7jhOBkhgPNDfmCpZbg==" }, + "node_modules/@sealcode/jdd/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" + }, + "node_modules/@sealcode/jdd/node_modules/locreq": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/locreq/-/locreq-2.4.1.tgz", + "integrity": "sha512-Itfhlus87Q9GcQKEK5LXZngD5YpUbANC9mr5UFghLSBIg6gVVG21AWX45+JVyaqBxILQkB+dBW0i2KlSVzGfeQ==", + "dependencies": { + "@types/node": "^14.14.16" + } + }, "node_modules/@sealcode/jdd/node_modules/marked": { "version": "12.0.0", "resolved": "https://registry.npmjs.org/marked/-/marked-12.0.0.tgz", @@ -1329,9 +1350,9 @@ } }, "node_modules/@sealcode/sealgen": { - "version": "0.12.13", - "resolved": "https://registry.npmjs.org/@sealcode/sealgen/-/sealgen-0.12.13.tgz", - "integrity": "sha512-NWI+dcW/C/NppzYLQecO5EFPL54OK3bfk288R85m1y9Q29pV3Vd/3me/zxmlwChkn2dSybI6ER8fNgQxoaoX4Q==", + "version": "0.13.0", + "resolved": "https://registry.npmjs.org/@sealcode/sealgen/-/sealgen-0.13.0.tgz", + "integrity": "sha512-hyrz9dTErolnS0qhNnuxqgBmrduMMHUbJB4XwfRmZzxKQBbiqcYpKd946v82xK8SBUC5sA3NDfDg/1axI7mriw==", "dependencies": { "@koa/router": "^12.0.1", "@sealcode/ts-predicates": "^0.4.3", @@ -1780,22 +1801,26 @@ "node_modules/@tsconfig/node10": { "version": "1.0.9", "resolved": "https://registry.npmjs.org/@tsconfig/node10/-/node10-1.0.9.tgz", - "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==" + "integrity": "sha512-jNsYVVxU8v5g43Erja32laIDHXeoNvFEpX33OK4d6hljo3jDhCBDhx5dhCCTMWUojscpAagGiRkBKxpdl9fxqA==", + "dev": true }, "node_modules/@tsconfig/node12": { "version": "1.0.11", "resolved": "https://registry.npmjs.org/@tsconfig/node12/-/node12-1.0.11.tgz", - "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==" + "integrity": "sha512-cqefuRsh12pWyGsIoBKJA9luFu3mRxCA+ORZvA4ktLSzIuCUtWVxGIuXigEwO5/ywWFMZ2QEGKWvkZG1zDMTag==", + "dev": true }, "node_modules/@tsconfig/node14": { "version": "1.0.3", "resolved": "https://registry.npmjs.org/@tsconfig/node14/-/node14-1.0.3.tgz", - "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==" + "integrity": "sha512-ysT8mhdixWK6Hw3i1V2AeRqZ5WfXg1G43mqoYlM2nc6388Fq5jcXyr5mRsqViLx/GJYdoL0bfXD8nmF+Zn/Iow==", + "dev": true }, "node_modules/@tsconfig/node16": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/@tsconfig/node16/-/node16-1.0.4.tgz", - "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==" + "integrity": "sha512-vxhUy4J8lyeyinH7Azl1pdd43GJhZH/tP2weN8TntQblOY+A0XbT8DJk1/oCPuOOyg/Ja757rG0CgHcWC8OfMA==", + "dev": true }, "node_modules/@types/accepts": { "version": "1.3.7", @@ -2074,6 +2099,11 @@ "resolved": "https://registry.npmjs.org/@types/mjml-core/-/mjml-core-4.7.4.tgz", "integrity": "sha512-hajbYITLm/wJU99Of50Dmn/k4ok+mrhJs4qDdnveJsINdiNJhQd+03C6Kt09vF9biB23cEI4pPeLrJNYfIZf7g==" }, + "node_modules/@types/mocha": { + "version": "9.1.1", + "resolved": "https://registry.npmjs.org/@types/mocha/-/mocha-9.1.1.tgz", + "integrity": "sha512-Z61JK7DKDtdKTWwLeElSEBcWGRLY8g95ic5FoQqI9CMx0ns/Ghep3B4DfcEimiKMvtamNVULVNKEsiwV3aQmXw==" + }, "node_modules/@types/mongodb": { "version": "3.6.20", "resolved": "https://registry.npmjs.org/@types/mongodb/-/mongodb-3.6.20.tgz", @@ -2150,18 +2180,6 @@ "resolved": "https://registry.npmjs.org/@types/shortid/-/shortid-0.0.29.tgz", "integrity": "sha512-9BCYD9btg2CY4kPcpMQ+vCR8U6V8f/KvixYD5ZbxoWlkhddNF5IeZMVL3p+QFUkg+Hb+kPAG9Jgk4bnnF1v/Fw==" }, - "node_modules/@types/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/@types/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-xevGOReSYGM7g/kUBZzPqCrR/KYAo+F0yiPc85WFTJa0MSLtyFTVTU6cJu/aV4mid7IffDIWqo69THF2o4JiEQ==", - "peer": true - }, - "node_modules/@types/strip-json-comments": { - "version": "0.0.30", - "resolved": "https://registry.npmjs.org/@types/strip-json-comments/-/strip-json-comments-0.0.30.tgz", - "integrity": "sha512-7NQmHra/JILCd1QqpSzl8+mJRc8ZHz3uDm8YV1Ks9IhK0epEiTw8aIErbvH9PI+6XbqhyIQy3462nEsn7UVzjQ==", - "peer": true - }, "node_modules/@types/tedious": { "version": "4.0.14", "resolved": "https://registry.npmjs.org/@types/tedious/-/tedious-4.0.14.tgz", @@ -2172,9 +2190,10 @@ } }, "node_modules/@types/uuid": { - "version": "8.3.4", - "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", - "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + "version": "9.0.8", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz", + "integrity": "sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA==", + "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { "version": "5.62.0", @@ -3101,7 +3120,8 @@ "node_modules/arg": { "version": "4.1.3", "resolved": "https://registry.npmjs.org/arg/-/arg-4.1.3.tgz", - "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==" + "integrity": "sha512-58S9QDqG0Xx27YwPSt9fJxivjYl432YCwfDMfZ+71RAqUrZef7LrKQZ3LHLOwCS4FLNBplP533Zx895SeOCHvA==", + "dev": true }, "node_modules/argparse": { "version": "1.0.10", @@ -3158,8 +3178,7 @@ "node_modules/b4a": { "version": "1.6.6", "resolved": "https://registry.npmjs.org/b4a/-/b4a-1.6.6.tgz", - "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==", - "peer": true + "integrity": "sha512-5Tk1HLk6b6ctmjIkAcU/Ujv/1WqiDl0F0JdRCR80VsOcUlHcu7pWeWRlOqQLHfDEsVx9YH/aif5AG4ehoCtTmg==" }, "node_modules/balanced-match": { "version": "1.0.2", @@ -3170,15 +3189,13 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/bare-events/-/bare-events-2.2.0.tgz", "integrity": "sha512-Yyyqff4PIFfSuthCZqLlPISTWHmnQxoPuAvkmgzsJEmG3CesdIv6Xweayl0JkCZJSB2yYIdJyEz97tpxNhgjbg==", - "optional": true, - "peer": true + "optional": true }, "node_modules/bare-fs": { "version": "2.1.3", "resolved": "https://registry.npmjs.org/bare-fs/-/bare-fs-2.1.3.tgz", "integrity": "sha512-Oa7F0QJV7We0mtKq7Tk246uiBrl7vun64cPEsJOEwv2vHjnVL9yO7aH3643aSrd4rXfVe7yhJ9LHZywQQAXKFQ==", "optional": true, - "peer": true, "dependencies": { "bare-events": "^2.0.0", "bare-os": "^2.0.0", @@ -3190,15 +3207,13 @@ "version": "2.1.2", "resolved": "https://registry.npmjs.org/bare-os/-/bare-os-2.1.2.tgz", "integrity": "sha512-slQjOn78Q8itnzomNAamiKo5MDpEpV3JnoNZ93lyynaFh6paWcU+5c0GVcZ7EYIJC2unN2JGdF1qupdscYl0Yg==", - "optional": true, - "peer": true + "optional": true }, "node_modules/bare-path": { "version": "2.1.0", "resolved": "https://registry.npmjs.org/bare-path/-/bare-path-2.1.0.tgz", "integrity": "sha512-DIIg7ts8bdRKwJRJrUMy/PICEaQZaPGZ26lsSx9MJSwIhSrcdHn7/C8W+XmnG/rKi6BaRcz+JO00CjZteybDtw==", "optional": true, - "peer": true, "dependencies": { "bare-os": "^2.1.0" } @@ -3220,14 +3235,12 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/better-queue": { "version": "3.8.12", "resolved": "https://registry.npmjs.org/better-queue/-/better-queue-3.8.12.tgz", "integrity": "sha512-D9KZ+Us+2AyaCz693/9AyjTg0s8hEmkiM/MB3i09cs4MdK1KgTSGJluXRYmOulR69oLZVo2XDFtqsExDt8oiLA==", - "peer": true, "dependencies": { "better-queue-memory": "^1.0.1", "node-eta": "^0.9.0", @@ -3237,21 +3250,7 @@ "node_modules/better-queue-memory": { "version": "1.0.4", "resolved": "https://registry.npmjs.org/better-queue-memory/-/better-queue-memory-1.0.4.tgz", - "integrity": "sha512-SWg5wFIShYffEmJpI6LgbL8/3Dqhku7xI1oEiy6FroP9DbcZlG0ZDjxvPdP9t7hTGW40IpIcC6zVoGT1oxjOuA==", - "peer": true - }, - "node_modules/better-queue/node_modules/uuid": { - "version": "9.0.1", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", - "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", - "funding": [ - "https://github.com/sponsors/broofa", - "https://github.com/sponsors/ctavan" - ], - "peer": true, - "bin": { - "uuid": "dist/bin/uuid" - } + "integrity": "sha512-SWg5wFIShYffEmJpI6LgbL8/3Dqhku7xI1oEiy6FroP9DbcZlG0ZDjxvPdP9t7hTGW40IpIcC6zVoGT1oxjOuA==" }, "node_modules/big.js": { "version": "5.2.2", @@ -3375,7 +3374,6 @@ "url": "https://feross.org/support" } ], - "peer": true, "dependencies": { "base64-js": "^1.3.1", "ieee754": "^1.1.13" @@ -3385,6 +3383,7 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/buffer-from/-/buffer-from-1.1.2.tgz", "integrity": "sha512-E+XQCRwSbaaiChtv6k6Dwgc+bx+Bs6vuKJHHl5kox/BaKbhiXzqQOwK4cO22yElGp2OCmjwVhT3HmxgyPGnJfQ==", + "devOptional": true, "peer": true }, "node_modules/bytes": { @@ -3618,8 +3617,7 @@ "node_modules/chownr": { "version": "1.1.4", "resolved": "https://registry.npmjs.org/chownr/-/chownr-1.1.4.tgz", - "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==", - "peer": true + "integrity": "sha512-jJ0bqzaylmJtVnNgzTeSOs8DPavpbYgEr/b0YL8/2GO3xJEhInFmhKMUnEJQjZumK7KXGFhUy89PrsJWlakBVg==" }, "node_modules/chrome-trace-event": { "version": "1.0.3", @@ -3860,7 +3858,8 @@ "node_modules/create-require": { "version": "1.1.1", "resolved": "https://registry.npmjs.org/create-require/-/create-require-1.1.1.tgz", - "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==" + "integrity": "sha512-dcKFX3jn0MpIaXjisoRvexIJVEKzaq7z2rZKxf+MSr9TkdmHmsU4m2lcLojrj/FHl8mk5VxMmYA+ftRkP/3oKQ==", + "dev": true }, "node_modules/cron": { "version": "2.4.4", @@ -3918,6 +3917,11 @@ "url": "https://github.com/sponsors/fb55" } }, + "node_modules/cuint": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/cuint/-/cuint-0.2.2.tgz", + "integrity": "sha512-d4ZVpCW31eWwCMe1YT3ur7mUDnTXbgwyzaL320DrcRT45rfjYxkt5QWLrmOJ+/UEAI2+fQgKe/fCjR8l4TpRgw==" + }, "node_modules/debug": { "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", @@ -3947,7 +3951,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/decompress-response/-/decompress-response-6.0.0.tgz", "integrity": "sha512-aW35yZM6Bb/4oJlZncMH2LCoZtJXTRxES17vE3hoRiowU2kWHaJKFkSBDnDR+cm9J+9QhXmREyIfv0pji9ejCQ==", - "peer": true, "dependencies": { "mimic-response": "^3.1.0" }, @@ -3978,7 +3981,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/deep-extend/-/deep-extend-0.6.0.tgz", "integrity": "sha512-LOHxIOaPYdHlJRtCQfDIVZtfw/ufM8+rVj649RIHzcm/vGwQRXFt6OPqIFWsm2XEMrNIEtWR64sY1LEKD2vAOA==", - "peer": true, "engines": { "node": ">=4.0.0" } @@ -4073,7 +4075,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/detect-libc/-/detect-libc-2.0.2.tgz", "integrity": "sha512-UX6sGumvvqSaXgdKGUsgZWqcUyIXZ/vZTrlRT/iobiKhGL0zL4d3osHj3uqllWJK+i+sixDS/3COVEOFbupFyw==", - "peer": true, "engines": { "node": ">=8" } @@ -4087,6 +4088,7 @@ "version": "4.0.2", "resolved": "https://registry.npmjs.org/diff/-/diff-4.0.2.tgz", "integrity": "sha512-58lmxKSA4BNyLz+HHMUzlOEpg09FV+ev6ZMe3vJihgdxzgcwZ8VoEEPmALCZG9LmqfVoNMMKpttIYTVG6uDY7A==", + "dev": true, "engines": { "node": ">=0.3.1" } @@ -4185,15 +4187,6 @@ "node": ">=8" } }, - "node_modules/dynamic-dedupe": { - "version": "0.3.0", - "resolved": "https://registry.npmjs.org/dynamic-dedupe/-/dynamic-dedupe-0.3.0.tgz", - "integrity": "sha512-ssuANeD+z97meYOqd50e04Ze5qp4bPqo8cCkI4TRjZkzAUgIDTrXV1R8QCdINpiI+hw14+rYazvTRdQrz0/rFQ==", - "peer": true, - "dependencies": { - "xtend": "^4.0.0" - } - }, "node_modules/eastasianwidth": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/eastasianwidth/-/eastasianwidth-0.2.0.tgz", @@ -4323,7 +4316,6 @@ "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==", - "peer": true, "dependencies": { "once": "^1.4.0" } @@ -4942,7 +4934,6 @@ "version": "2.0.3", "resolved": "https://registry.npmjs.org/expand-template/-/expand-template-2.0.3.tgz", "integrity": "sha512-XYfuKMvj4O35f/pOXLObndIRvyQ+/+6AhODh+OKWj9S9498pHHn/IMszH+gt0fBCRWMNfk1ZSp5x3AifmnI2vg==", - "peer": true, "engines": { "node": ">=6" } @@ -4962,8 +4953,7 @@ "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==", - "peer": true + "integrity": "sha512-/d9sfos4yxzpwkDkuN7k2SqFKtYNmCTzgfEpz82x34IM9/zc8KGxQoXg1liNC/izpRM/MBdt44Nmx41ZWqk+FQ==" }, "node_modules/fast-glob": { "version": "3.3.2", @@ -5029,6 +5019,27 @@ "node": ">=8" } }, + "node_modules/filru": { + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/filru/-/filru-2.1.0.tgz", + "integrity": "sha512-rcVnKdKbZxaQfrKbN6D8HDR0UGjC4Y7cA/xARjcyTp25kds9PiGWpwTx85Z86of/cOA3Wp5h7k7rnZmMN9oUqQ==", + "dependencies": { + "debug": "^3.1.0", + "mkdirp": "^0.5.1", + "xxhashjs": "^0.2.1" + }, + "engines": { + "node": ">=6.4.0" + } + }, + "node_modules/filru/node_modules/debug": { + "version": "3.2.7", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.2.7.tgz", + "integrity": "sha512-CFjzYYAi4ThfiQvizrFQevTTXHtnCqWfe7x1AhgEscTz6ZbLbfoLRLPugTQyBth6f8ZERVUSyWHFD/7Wu4t1XQ==", + "dependencies": { + "ms": "^2.1.1" + } + }, "node_modules/find-cache-dir": { "version": "3.3.2", "resolved": "https://registry.npmjs.org/find-cache-dir/-/find-cache-dir-3.3.2.tgz", @@ -5181,8 +5192,7 @@ "node_modules/fs-constants": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs-constants/-/fs-constants-1.0.0.tgz", - "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==", - "peer": true + "integrity": "sha512-y6OAwoSIf7FyjMIv94u+b5rdheZEjzR63GTyZJm5qh4Bi+2YgwLCcI/fPFZkL5PSixOt6ZNKm+w+Hfp/Bciwow==" }, "node_modules/fs-extra": { "version": "8.1.0", @@ -5307,8 +5317,7 @@ "node_modules/github-from-package": { "version": "0.0.0", "resolved": "https://registry.npmjs.org/github-from-package/-/github-from-package-0.0.0.tgz", - "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==", - "peer": true + "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" }, "node_modules/glob": { "version": "7.2.3", @@ -5685,8 +5694,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/ignore": { "version": "5.3.0", @@ -6000,6 +6008,15 @@ "node": ">=8" } }, + "node_modules/istanbul-lib-processinfo/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "dev": true, + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/istanbul-lib-report": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/istanbul-lib-report/-/istanbul-lib-report-3.0.1.tgz", @@ -6449,20 +6466,25 @@ } }, "node_modules/koa-responsive-image-router": { - "version": "0.2.6", - "resolved": "https://registry.npmjs.org/koa-responsive-image-router/-/koa-responsive-image-router-0.2.6.tgz", - "integrity": "sha512-yRN2PWNKICAjX1Ah9ktnZ2tWbC1tx62oy/V/6IWwmdHdMAuJXvVSZ4P2DX3NNcT9X9VlHLjOZ8FNnm3A+FOrkg==", - "peer": true, + "version": "0.2.18", + "resolved": "https://registry.npmjs.org/koa-responsive-image-router/-/koa-responsive-image-router-0.2.18.tgz", + "integrity": "sha512-cHQOd52QA/rgIcGVhJPwXSk3gwWeyYxJTqp2/M+oHUKLF48YoibuAF8LnDkwOXgv7pM5wEkr/wNcRLtzvoJF0w==", "dependencies": { "@koa/router": "^10.0.0", "@sealcode/ts-predicates": "^0.5.3", + "@types/mocha": "^9.0.0", "better-queue": "^3.8.12", + "filru": "^2.1.0", "koa": "^2.13.1", "koa-router": "^10.0.0", + "locreq": "^2.4.1", + "lru-cache": "^10.0.1", "multiple-scripts-tmux": "^1.1.2", + "node-cache": "^5.1.2", + "object-fit-math": "^1.0.0", + "object-hash": "^3.0.0", "sharp": "^0.32.5", - "smartcrop-sharp": "^2.0.8", - "ts-node-dev": "^2.0.0" + "smartcrop-sharp": "^2.0.8" } }, "node_modules/koa-responsive-image-router/node_modules/@koa/router": { @@ -6470,7 +6492,6 @@ "resolved": "https://registry.npmjs.org/@koa/router/-/router-10.1.1.tgz", "integrity": "sha512-ORNjq5z4EmQPriKbR0ER3k4Gh7YGNhWDL7JBW+8wXDrHLbWYKYSJaOJ9aN06npF5tbTxe2JBOsurpJDAvjiXKw==", "deprecated": "**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173", - "peer": true, "dependencies": { "debug": "^4.1.1", "http-errors": "^1.7.3", @@ -6485,14 +6506,17 @@ "node_modules/koa-responsive-image-router/node_modules/@sealcode/ts-predicates": { "version": "0.5.3", "resolved": "https://registry.npmjs.org/@sealcode/ts-predicates/-/ts-predicates-0.5.3.tgz", - "integrity": "sha512-EZI7e8EY8gI1pw2bKdevjl+fBJbcSlpNkCZ8XoEOV3cHakPujiT6M4l775RDkfxJSbLX7jhOBkhgPNDfmCpZbg==", - "peer": true + "integrity": "sha512-EZI7e8EY8gI1pw2bKdevjl+fBJbcSlpNkCZ8XoEOV3cHakPujiT6M4l775RDkfxJSbLX7jhOBkhgPNDfmCpZbg==" + }, + "node_modules/koa-responsive-image-router/node_modules/@types/node": { + "version": "14.18.63", + "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", + "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" }, "node_modules/koa-responsive-image-router/node_modules/depd": { "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "peer": true, "engines": { "node": ">= 0.6" } @@ -6501,7 +6525,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "peer": true, "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -6513,11 +6536,34 @@ "node": ">= 0.6" } }, + "node_modules/koa-responsive-image-router/node_modules/locreq": { + "version": "2.4.1", + "resolved": "https://registry.npmjs.org/locreq/-/locreq-2.4.1.tgz", + "integrity": "sha512-Itfhlus87Q9GcQKEK5LXZngD5YpUbANC9mr5UFghLSBIg6gVVG21AWX45+JVyaqBxILQkB+dBW0i2KlSVzGfeQ==", + "dependencies": { + "@types/node": "^14.14.16" + } + }, + "node_modules/koa-responsive-image-router/node_modules/lru-cache": { + "version": "10.2.0", + "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz", + "integrity": "sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q==", + "engines": { + "node": "14 || >=16.14" + } + }, + "node_modules/koa-responsive-image-router/node_modules/object-hash": { + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-3.0.0.tgz", + "integrity": "sha512-RSn9F68PjH9HqtltsSnqYC1XXoWe9Bju5+213R98cNGttag9q9yAOTzdbsqvIa7aNm5WffBZFpWYr2aWrklWAw==", + "engines": { + "node": ">= 6" + } + }, "node_modules/koa-responsive-image-router/node_modules/statuses": { "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "peer": true, "engines": { "node": ">= 0.6" } @@ -6527,7 +6573,6 @@ "resolved": "https://registry.npmjs.org/koa-router/-/koa-router-10.1.1.tgz", "integrity": "sha512-z/OzxVjf5NyuNO3t9nJpx7e1oR3FSBAauiwXtMQu4ppcnuNZzTaQ4p21P8A6r2Es8uJJM339oc4oVW+qX7SqnQ==", "deprecated": "**IMPORTANT 10x+ PERFORMANCE UPGRADE**: Please upgrade to v12.0.1+ as we have fixed an issue with debuglog causing 10x slower router benchmark performance, see https://github.com/koajs/router/pull/173", - "peer": true, "dependencies": { "debug": "^4.1.1", "http-errors": "^1.7.3", @@ -6543,7 +6588,6 @@ "version": "1.1.2", "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", "integrity": "sha512-7emPTl6Dpo6JRXOXjLRxck+FlLRX5847cLKEn00PLAgc3g2hTZZgr+e4c2v6QpSmLeFP3n5yUo7ft6avBK/5jQ==", - "peer": true, "engines": { "node": ">= 0.6" } @@ -6552,7 +6596,6 @@ "version": "1.8.1", "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.8.1.tgz", "integrity": "sha512-Kpk9Sm7NmI+RHhnj6OIWDI1d6fIoFAtFt9RLaTMRlg/8w49juAStsrBgp0Dp4OdxdVbRIeKhtCUvoi/RuAhO4g==", - "peer": true, "dependencies": { "depd": "~1.1.2", "inherits": "2.0.4", @@ -6568,7 +6611,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", "integrity": "sha512-OpZ3zP+jT1PI7I8nemJX4AKmAX070ZkYPVWV/AaKTJl+tXCTGyVdC1a4SL8RUQYEwk/f34ZX8UTykN68FwrqAA==", - "peer": true, "engines": { "node": ">= 0.6" } @@ -6878,7 +6920,8 @@ "node_modules/make-error": { "version": "1.3.6", "resolved": "https://registry.npmjs.org/make-error/-/make-error-1.3.6.tgz", - "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==" + "integrity": "sha512-s8UhlNe7vPKomQhC1qFelMokr/Sc3AgNbso3n74mVPA5LTZwkB9NlXf4XPamLxJE8h0gh73rM94xvwRT2CVInw==", + "dev": true }, "node_modules/marked": { "version": "1.0.0", @@ -6984,17 +7027,6 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "2.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", - "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4.0.0" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -7029,7 +7061,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/mimic-response/-/mimic-response-3.1.0.tgz", "integrity": "sha512-z0yWI+4FDrrweS8Zmt4Ej5HdJmky15+L2e6Wgn3+iK5fWzb6T3fhNFq2+MeTRb064c6Wr4N/wv0DzQTjNzHNGQ==", - "peer": true, "engines": { "node": ">=10" }, @@ -7555,22 +7586,20 @@ } }, "node_modules/mkdirp": { - "version": "1.0.4", - "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-1.0.4.tgz", - "integrity": "sha512-vVqVZQyf3WLx2Shd0qJ9xuvqgAyKPLAiqITEtqW0oIUjzo3PePDd6fW9iFz30ef7Ysp/oiWqbhszeGWW2T6Gzw==", - "peer": true, + "version": "0.5.6", + "resolved": "https://registry.npmjs.org/mkdirp/-/mkdirp-0.5.6.tgz", + "integrity": "sha512-FP+p8RB8OWpF3YZBCrP5gtADmtXApB5AMLn+vdyA+PyxCjrCs00mjyUozssO33cwDeT3wNGdLxJ5M//YqtHAJw==", + "dependencies": { + "minimist": "^1.2.6" + }, "bin": { "mkdirp": "bin/cmd.js" - }, - "engines": { - "node": ">=10" } }, "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==", - "peer": true + "integrity": "sha512-gKLcREMhtuZRwRAfqP3RFW+TK4JqApVBtOIftVgjuABpAtpxhPGaDcfvbhNvD0B8iD1oUr/txX35NjcaY6Ns/A==" }, "node_modules/mlly": { "version": "1.4.2", @@ -7702,8 +7731,7 @@ "node_modules/napi-build-utils": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/napi-build-utils/-/napi-build-utils-1.0.2.tgz", - "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==", - "peer": true + "integrity": "sha512-ONmRUqK7zj7DWX0D9ADe03wbwOBZxNAfF20PlGfCWQcD3+/MakShIHrMqx9YwPTfxDdF1zLeL+RGZiR9kGMLdg==" }, "node_modules/natural-compare": { "version": "1.4.0", @@ -7742,7 +7770,6 @@ "version": "3.54.0", "resolved": "https://registry.npmjs.org/node-abi/-/node-abi-3.54.0.tgz", "integrity": "sha512-p7eGEiQil0YUV3ItH4/tBb781L5impVmmx2E9FRKF7d18XXzp4PGT2tdYMFY6wQqgxD0IwNZOiSJ0/K0fSi/OA==", - "peer": true, "dependencies": { "semver": "^7.3.5" }, @@ -7754,7 +7781,6 @@ "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, "dependencies": { "yallist": "^4.0.0" }, @@ -7766,7 +7792,6 @@ "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, "dependencies": { "lru-cache": "^6.0.0" }, @@ -7780,20 +7805,36 @@ "node_modules/node-abi/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "peer": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/node-addon-api": { "version": "6.1.0", "resolved": "https://registry.npmjs.org/node-addon-api/-/node-addon-api-6.1.0.tgz", - "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==", - "peer": true + "integrity": "sha512-+eawOlIgy680F0kBzPUNFhMZGtJ1YmqM6l4+Crf4IkImjYrO/mqPwRMh352g23uIaQKFItcQ64I7KMaJxHgAVA==" + }, + "node_modules/node-cache": { + "version": "5.1.2", + "resolved": "https://registry.npmjs.org/node-cache/-/node-cache-5.1.2.tgz", + "integrity": "sha512-t1QzWwnk4sjLWaQAS8CHgOJ+RAfmHpxFWmc36IWTiWHQfs0w5JDMBS1b1ZxQteo0vVVuWJvIUKHDkkeK7vIGCg==", + "dependencies": { + "clone": "2.x" + }, + "engines": { + "node": ">= 8.0.0" + } + }, + "node_modules/node-cache/node_modules/clone": { + "version": "2.1.2", + "resolved": "https://registry.npmjs.org/clone/-/clone-2.1.2.tgz", + "integrity": "sha512-3Pe/CF1Nn94hyhIYpjtiLhdCoEoz0DqQ+988E9gmeEdQZlojxnOb74wctFyuwWQHzqyf9X7C7MG8juUpqBJT8w==", + "engines": { + "node": ">=0.8" + } }, "node_modules/node-eta": { "version": "0.9.0", "resolved": "https://registry.npmjs.org/node-eta/-/node-eta-0.9.0.tgz", - "integrity": "sha512-mTCTZk29tmX1OGfVkPt63H3c3VqXrI2Kvua98S7iUIB/Gbp0MNw05YtUomxQIxnnKMyRIIuY9izPcFixzhSBrA==", - "peer": true + "integrity": "sha512-mTCTZk29tmX1OGfVkPt63H3c3VqXrI2Kvua98S7iUIB/Gbp0MNw05YtUomxQIxnnKMyRIIuY9izPcFixzhSBrA==" }, "node_modules/node-fetch": { "version": "2.7.0", @@ -8167,6 +8208,11 @@ "node": ">=6" } }, + "node_modules/object-fit-math": { + "version": "1.0.0", + "resolved": "https://registry.npmjs.org/object-fit-math/-/object-fit-math-1.0.0.tgz", + "integrity": "sha512-SqsfEKO6OoHR1K3r5E7JpJoloN6Wd5zPZr0QAo0DAI/zjpadPNcajoUhNvrGUcDHDaF8LEQKCgiiz0+p7lVGeg==" + }, "node_modules/object-hash": { "version": "2.2.0", "resolved": "https://registry.npmjs.org/object-hash/-/object-hash-2.2.0.tgz", @@ -8578,7 +8624,6 @@ "version": "7.1.1", "resolved": "https://registry.npmjs.org/prebuild-install/-/prebuild-install-7.1.1.tgz", "integrity": "sha512-jAXscXWMcCK8GgCoHOfIr0ODh5ai8mj63L2nWrjuAgXE6tDyYGnx4/8o/rCgU+B4JSyZBKbeZqzhtwtC3ovxjw==", - "peer": true, "dependencies": { "detect-libc": "^2.0.0", "expand-template": "^2.0.3", @@ -8604,7 +8649,6 @@ "version": "4.1.0", "resolved": "https://registry.npmjs.org/bl/-/bl-4.1.0.tgz", "integrity": "sha512-1W07cM9gS6DcLperZfFSj+bWLtaPGSOHWhPiGzXmvVJbRLdG82sH/Kn8EtW1VqWVA54AKf2h5k5BbnIbwF3h6w==", - "peer": true, "dependencies": { "buffer": "^5.5.0", "inherits": "^2.0.4", @@ -8615,7 +8659,6 @@ "version": "3.6.2", "resolved": "https://registry.npmjs.org/readable-stream/-/readable-stream-3.6.2.tgz", "integrity": "sha512-9u/sniCrY3D5WdsERHzHE4G2YCXqoG5FTHUiCC4SIbr6XcLZBY05ya9EKjYek9O5xOAwjGq+1JdGBAS7Q9ScoA==", - "peer": true, "dependencies": { "inherits": "^2.0.3", "string_decoder": "^1.1.1", @@ -8629,7 +8672,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-2.1.1.tgz", "integrity": "sha512-V0r2Y9scmbDRLCNex/+hYzvp/zyYjvFbHPNgVTKfQvVrb6guiE/fxP+XblDNR011utopbkex2nM4dHNV6GDsng==", - "peer": true, "dependencies": { "chownr": "^1.1.1", "mkdirp-classic": "^0.5.2", @@ -8641,7 +8683,6 @@ "version": "2.2.0", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-2.2.0.tgz", "integrity": "sha512-ujeqbceABgwMZxEJnk2HDY2DlnUZ+9oEcb1KzTVfYHio0UE6dG71n60d8D2I4qNvleWrrXpmjpt7vZeF1LnMZQ==", - "peer": true, "dependencies": { "bl": "^4.0.3", "end-of-stream": "^1.4.1", @@ -8789,7 +8830,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/pump/-/pump-3.0.0.tgz", "integrity": "sha512-LwZy+p3SFs1Pytd/jYct4wpv49HiYCqd9Rlc5ZVdk0V+8Yzv6jR5Blk3TRmPL1ft69TxP0IMZGJ+WPFU2BFhww==", - "peer": true, "dependencies": { "end-of-stream": "^1.1.0", "once": "^1.3.1" @@ -8840,8 +8880,7 @@ "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==", - "peer": true + "integrity": "sha512-kJt5qhMxoszgU/62PLP1CJytzd2NKetjSRnyuj31fDd3Rlcz3fzlFdFLD1SItunPwyqEOkca6GbV612BWfaBag==" }, "node_modules/randombytes": { "version": "2.1.0", @@ -8871,7 +8910,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/rc/-/rc-1.2.8.tgz", "integrity": "sha512-y3bGgqKj3QBdxLbLkomlohkvsA8gdAiUQlSBJnBhfn+BPxg4bc62d8TcBW15wavDfgexCgccckhcZvywyQYPOw==", - "peer": true, "dependencies": { "deep-extend": "^0.6.0", "ini": "~1.3.0", @@ -8886,7 +8924,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "peer": true, "engines": { "node": ">=0.10.0" } @@ -9412,6 +9449,11 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-13.13.52.tgz", "integrity": "sha512-s3nugnZumCC//n4moGGe6tkNMyYEdaDBitVjwPxXmR5lnMG5dHePinH2EdxkG3Rh1ghFHHixAG4NJhpJW1rthQ==" }, + "node_modules/sealious/node_modules/@types/uuid": { + "version": "8.3.4", + "resolved": "https://registry.npmjs.org/@types/uuid/-/uuid-8.3.4.tgz", + "integrity": "sha512-c/I8ZRb51j+pYGAu5CrFMRxqZ2ke4y2grEBO5AUjgSkSk+qT2Ea+OdWElz/OiMf5MNpn2b17kuVBwZLQJXzihw==" + }, "node_modules/sealious/node_modules/ansi-styles": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/ansi-styles/-/ansi-styles-4.3.0.tgz", @@ -9518,6 +9560,17 @@ "resolved": "https://registry.npmjs.org/@types/node/-/node-14.18.63.tgz", "integrity": "sha512-fAtCfv4jJg+ExtXhvCkCqUKZ+4ok/JQk01qDKhL5BDDoS3AxKXhV5/MAVUZyQnSEd2GT92fkgZl0pz0Q0AzcIQ==" }, + "node_modules/sealious/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/sealious/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", @@ -9534,6 +9587,14 @@ "node": ">=8" } }, + "node_modules/sealious/node_modules/uuid": { + "version": "8.3.2", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", + "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "bin": { + "uuid": "dist/bin/uuid" + } + }, "node_modules/semver": { "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", @@ -9582,7 +9643,6 @@ "resolved": "https://registry.npmjs.org/sharp/-/sharp-0.32.6.tgz", "integrity": "sha512-KyLTWwgcR9Oe4d9HwCwNM2l7+J0dUQwn/yf7S0EnTtb0eVS4RxO0eUSvxPtzT4F3SY+C4K6fqdv/DO27sJ/v/w==", "hasInstallScript": true, - "peer": true, "dependencies": { "color": "^4.2.3", "detect-libc": "^2.0.2", @@ -9604,7 +9664,6 @@ "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, "dependencies": { "yallist": "^4.0.0" }, @@ -9616,7 +9675,6 @@ "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, "dependencies": { "lru-cache": "^6.0.0" }, @@ -9630,8 +9688,7 @@ "node_modules/sharp/node_modules/yallist": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", - "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==", - "peer": true + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" }, "node_modules/shebang-command": { "version": "2.0.0", @@ -9726,8 +9783,7 @@ "type": "consulting", "url": "https://feross.org/support" } - ], - "peer": true + ] }, "node_modules/simple-get": { "version": "4.0.1", @@ -9747,7 +9803,6 @@ "url": "https://feross.org/support" } ], - "peer": true, "dependencies": { "decompress-response": "^6.0.0", "once": "^1.3.1", @@ -9901,14 +9956,12 @@ "node_modules/smartcrop": { "version": "2.0.5", "resolved": "https://registry.npmjs.org/smartcrop/-/smartcrop-2.0.5.tgz", - "integrity": "sha512-aXoHTM8XlC51g96kgZkYxZ2mx09/ibOrIVLiUNOFozV/MHmFSgEr1/5CKVBoFD5vd+re2wSy0xra21CyjRITzA==", - "peer": true + "integrity": "sha512-aXoHTM8XlC51g96kgZkYxZ2mx09/ibOrIVLiUNOFozV/MHmFSgEr1/5CKVBoFD5vd+re2wSy0xra21CyjRITzA==" }, "node_modules/smartcrop-sharp": { "version": "2.0.8", "resolved": "https://registry.npmjs.org/smartcrop-sharp/-/smartcrop-sharp-2.0.8.tgz", "integrity": "sha512-0rpK/ddGAx7ou6YqqvJRkw/xyR4qgqmJeUQ2EWDnN3hSuJUk4InPGE6Sa45+TYOfGEEQJrchjF1ujBPMhoe9iA==", - "peer": true, "dependencies": { "smartcrop": "^2.0.5" }, @@ -9936,6 +9989,7 @@ "version": "0.5.21", "resolved": "https://registry.npmjs.org/source-map-support/-/source-map-support-0.5.21.tgz", "integrity": "sha512-uBHU3L3czsIyYXKX88fdrGovxdSCoTGDRZ6SYXtSRxLZUzHg5P/66Ht6uoUlHu9EZod+inXhKo3qQgwXUT/y1w==", + "devOptional": true, "peer": true, "dependencies": { "buffer-from": "^1.0.0", @@ -10020,7 +10074,6 @@ "version": "2.15.8", "resolved": "https://registry.npmjs.org/streamx/-/streamx-2.15.8.tgz", "integrity": "sha512-6pwMeMY/SuISiRsuS8TeIrAzyFbG5gGPHFQsYjUr/pbBadaL1PCWmzKw+CHZSwainfvcF6Si6cVLq4XTEwswFQ==", - "peer": true, "dependencies": { "fast-fifo": "^1.1.0", "queue-tick": "^1.0.1" @@ -10237,7 +10290,6 @@ "version": "3.0.5", "resolved": "https://registry.npmjs.org/tar-fs/-/tar-fs-3.0.5.tgz", "integrity": "sha512-JOgGAmZyMgbqpLwct7ZV8VzkEB6pxXFBVErLtb+XCOqzc6w1xiWKI9GVd6bwk68EX7eJ4DWmfXVmq8K2ziZTGg==", - "peer": true, "dependencies": { "pump": "^3.0.0", "tar-stream": "^3.1.5" @@ -10251,7 +10303,6 @@ "version": "3.1.7", "resolved": "https://registry.npmjs.org/tar-stream/-/tar-stream-3.1.7.tgz", "integrity": "sha512-qJj60CXt7IU1Ffyc3NJMjh6EkuCFej46zUqJ4J7pqYlThyd9bO0XBTmcOIhSzZJVWfsLks0+nle/j538YAW9RQ==", - "peer": true, "dependencies": { "b4a": "^1.6.4", "fast-fifo": "^1.2.0", @@ -10259,9 +10310,9 @@ } }, "node_modules/tempstream": { - "version": "0.3.12", - "resolved": "https://registry.npmjs.org/tempstream/-/tempstream-0.3.12.tgz", - "integrity": "sha512-4nQTVB7AJeCDv/u3fRGL5eFpPeKLXRZVgGwzOwxxH4NecG5uoA3NveFbCiP4DiqBAMmub6q41xKYpvB0u9nU5Q==", + "version": "0.3.15", + "resolved": "https://registry.npmjs.org/tempstream/-/tempstream-0.3.15.tgz", + "integrity": "sha512-L6h9OMBCS31wJkgg1KBm9cDSGvxxiyoba8vu/x36/SQd19WpBk4Mz/gAYFUn4pvekPsW2GkOmDk4ftgD/wcnMQ==", "dependencies": { "classnames": "^2.5.1" } @@ -10454,15 +10505,6 @@ "resolved": "https://registry.npmjs.org/tr46/-/tr46-0.0.3.tgz", "integrity": "sha512-N3WMsuqV66lT30CrXNbEjx4GEwlow3v6rr4mCcv6prnfwhS01rkgyFdjPNBYd9br7LpXV1+Emh01fHnq2Gdgrw==" }, - "node_modules/tree-kill": { - "version": "1.2.2", - "resolved": "https://registry.npmjs.org/tree-kill/-/tree-kill-1.2.2.tgz", - "integrity": "sha512-L0Orpi8qGpRG//Nd+H90vFB+3iHnue1zSSGmNOOCh1GLJ7rUKVwV2HvijphGQS2UmhUZewS9VgvxYIdgr+fG1A==", - "peer": true, - "bin": { - "tree-kill": "cli.js" - } - }, "node_modules/ts-loader": { "version": "8.4.0", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-8.4.0.tgz", @@ -10590,6 +10632,7 @@ "version": "10.9.2", "resolved": "https://registry.npmjs.org/ts-node/-/ts-node-10.9.2.tgz", "integrity": "sha512-f0FFpIdcHgn8zcPSbf1dRevwt047YMnaiJM3u2w2RewrB+fob/zePZcrOyQoLMMO7aBIddLcQIEK5dYjkLnGrQ==", + "dev": true, "dependencies": { "@cspotcode/source-map-support": "^0.8.0", "@tsconfig/node10": "^1.0.7", @@ -10628,56 +10671,11 @@ } } }, - "node_modules/ts-node-dev": { - "version": "2.0.0", - "resolved": "https://registry.npmjs.org/ts-node-dev/-/ts-node-dev-2.0.0.tgz", - "integrity": "sha512-ywMrhCfH6M75yftYvrvNarLEY+SUXtUvU8/0Z6llrHQVBx12GiFk5sStF8UdfE/yfzk9IAq7O5EEbTQsxlBI8w==", - "peer": true, - "dependencies": { - "chokidar": "^3.5.1", - "dynamic-dedupe": "^0.3.0", - "minimist": "^1.2.6", - "mkdirp": "^1.0.4", - "resolve": "^1.0.0", - "rimraf": "^2.6.1", - "source-map-support": "^0.5.12", - "tree-kill": "^1.2.2", - "ts-node": "^10.4.0", - "tsconfig": "^7.0.0" - }, - "bin": { - "ts-node-dev": "lib/bin.js", - "tsnd": "lib/bin.js" - }, - "engines": { - "node": ">=0.8.0" - }, - "peerDependencies": { - "node-notifier": "*", - "typescript": "*" - }, - "peerDependenciesMeta": { - "node-notifier": { - "optional": true - } - } - }, - "node_modules/ts-node-dev/node_modules/rimraf": { - "version": "2.7.1", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-2.7.1.tgz", - "integrity": "sha512-uWjbaKIK3T1OSVptzX7Nl6PvQ3qAGtKEtVRjRuazjfL3Bx5eI409VZSqgND+4UNnmzLVdPj9FqFJNPqBZFve4w==", - "peer": true, - "dependencies": { - "glob": "^7.1.3" - }, - "bin": { - "rimraf": "bin.js" - } - }, "node_modules/ts-node/node_modules/acorn": { "version": "8.11.3", "resolved": "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz", "integrity": "sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg==", + "dev": true, "bin": { "acorn": "bin/acorn" }, @@ -10685,36 +10683,6 @@ "node": ">=0.4.0" } }, - "node_modules/tsconfig": { - "version": "7.0.0", - "resolved": "https://registry.npmjs.org/tsconfig/-/tsconfig-7.0.0.tgz", - "integrity": "sha512-vZXmzPrL+EmC4T/4rVlT2jNVMWCi/O4DIiSj3UHg1OE5kCKbk4mfrXc6dZksLgRM/TZlKnousKH9bbTazUWRRw==", - "peer": true, - "dependencies": { - "@types/strip-bom": "^3.0.0", - "@types/strip-json-comments": "0.0.30", - "strip-bom": "^3.0.0", - "strip-json-comments": "^2.0.0" - } - }, - "node_modules/tsconfig/node_modules/strip-bom": { - "version": "3.0.0", - "resolved": "https://registry.npmjs.org/strip-bom/-/strip-bom-3.0.0.tgz", - "integrity": "sha512-vavAMRXOgBVNF6nyEEmL3DBK19iRpDcoIwW+swQ+CbGiu7lju6t+JklA1MHweoWtadgt4ISVUsXLyDq34ddcwA==", - "peer": true, - "engines": { - "node": ">=4" - } - }, - "node_modules/tsconfig/node_modules/strip-json-comments": { - "version": "2.0.1", - "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-2.0.1.tgz", - "integrity": "sha512-4gB8na07fecVVkOI6Rs4e7T6NOTki5EmL7TUduTs6bu3EdnSycntVJ4re8kgZA+wx9IueI2Y11bfbgwtzuE0KQ==", - "peer": true, - "engines": { - "node": ">=0.10.0" - } - }, "node_modules/tslib": { "version": "1.14.1", "resolved": "https://registry.npmjs.org/tslib/-/tslib-1.14.1.tgz", @@ -10748,7 +10716,6 @@ "version": "0.6.0", "resolved": "https://registry.npmjs.org/tunnel-agent/-/tunnel-agent-0.6.0.tgz", "integrity": "sha512-McnNiV1l8RYeY8tBgEpuodCC1mLUdbSN+CYBL7kJsJNInOP8UjDDEwdk6Mw60vdLLrr5NHKZhMAOSrR2NZuQ+w==", - "peer": true, "dependencies": { "safe-buffer": "^5.0.1" }, @@ -11073,9 +11040,13 @@ "integrity": "sha512-EPD5q1uXyFxJpCrLnCc1nHnq3gOa6DZBocAIiI2TaSCA7VCJ1UJDMagCzIkXNsUYfD1daK//LTEQ8xiIbrHtcw==" }, "node_modules/uuid": { - "version": "8.3.2", - "resolved": "https://registry.npmjs.org/uuid/-/uuid-8.3.2.tgz", - "integrity": "sha512-+NYs2QeMWy+GWFOEm9xnn6HCDp0l7QBD7ml8zLUmJ+93Q5NF0NocErnwkTkXVFNiX3/fpC6afS8Dhb/gz7R7eg==", + "version": "9.0.1", + "resolved": "https://registry.npmjs.org/uuid/-/uuid-9.0.1.tgz", + "integrity": "sha512-b+1eJOlsR9K8HJpow9Ok3fiWOWSIcIzXodvv0rQjVoOVNpWMpxf1wZNpt4y9h10odCNrqnYp1OBzRktckBe3sA==", + "funding": [ + "https://github.com/sponsors/broofa", + "https://github.com/sponsors/ctavan" + ], "bin": { "uuid": "dist/bin/uuid" } @@ -11089,7 +11060,8 @@ "node_modules/v8-compile-cache-lib": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/v8-compile-cache-lib/-/v8-compile-cache-lib-3.0.1.tgz", - "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==" + "integrity": "sha512-wa7YjyUGfNZngI/vtK0UHAN+lgDCxBPCylVXGp0zu59Fz5aiGtNXaq3DhIov063MorB+VfufLh3JlF2KdTK3xg==", + "dev": true }, "node_modules/v8-to-istanbul": { "version": "9.2.0", @@ -11523,6 +11495,17 @@ "url": "https://github.com/fb55/htmlparser2?sponsor=1" } }, + "node_modules/web-resource-inliner/node_modules/mime": { + "version": "2.6.0", + "resolved": "https://registry.npmjs.org/mime/-/mime-2.6.0.tgz", + "integrity": "sha512-USPkMeET31rOMiarsBNIHZKLGgvKc/LrjofAnBlOttf5ajRvqiRA8QsenbcooctK6d6Ts6aqZXBA+XbkKthiQg==", + "bin": { + "mime": "cli.js" + }, + "engines": { + "node": ">=4.0.0" + } + }, "node_modules/webidl-conversions": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/webidl-conversions/-/webidl-conversions-3.0.1.tgz", @@ -11857,13 +11840,12 @@ } } }, - "node_modules/xtend": { - "version": "4.0.2", - "resolved": "https://registry.npmjs.org/xtend/-/xtend-4.0.2.tgz", - "integrity": "sha512-LKYU1iAXJXUgAXn9URjiu+MWhyUXHsvfp7mcuYm9dSUKK0/CjtrUwFAxD82/mCWbtLsGjFIad0wIsod4zrTAEQ==", - "peer": true, - "engines": { - "node": ">=0.4" + "node_modules/xxhashjs": { + "version": "0.2.2", + "resolved": "https://registry.npmjs.org/xxhashjs/-/xxhashjs-0.2.2.tgz", + "integrity": "sha512-AkTuIuVTET12tpsVIQo+ZU6f/qDmKuRUcjaqR+OIvm+aCBsZ95i7UVY5WJ9TMsSaZ0DA2WxoZ4acu0sPH+OKAw==", + "dependencies": { + "cuint": "^0.2.2" } }, "node_modules/y18n": { @@ -11937,6 +11919,7 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/yn/-/yn-3.1.1.tgz", "integrity": "sha512-Ux4ygGWsu2c7isFWe8Yu1YluJmqVhxqK2cLXNQA5AcC3QfbGNpM7fu0Y8b/z16pXLnFxZYvWhd3fhBY9DLmC6Q==", + "dev": true, "engines": { "node": ">=6" } diff --git a/package.json b/package.json index a4c1403..5afdaaf 100644 --- a/package.json +++ b/package.json @@ -6,7 +6,7 @@ "type": "module", "scripts": { "start": "docker-compose up -d db && node .", - "typecheck:back": "npx tsc --noEmit --target es6 --lib es2015,dom -p src/back", + "typecheck:back": "npx tsc --noEmit --target es6 --lib es2021,dom -p src/back", "typecheck:front": "npx tsc --noEmit --target es6 --lib es2015,dom -p src/front", "build": "sealgen build", "watch": "multiple-scripts-tmux -p watch", @@ -35,19 +35,20 @@ "@hotwired/turbo": "^8.0.2", "@koa/router": "^12.0.1", "@playwright/test": "^1.36.1", - "@sealcode/jdd": "^0.2.18", - "@sealcode/sealgen": "^0.12.13", + "@sealcode/jdd": "^0.3.0", + "@sealcode/sealgen": "^0.13.0", "@sealcode/ts-predicates": "^0.4.3", "@types/kill-port": "^2.0.0", "get-port": "^7.0.0", "js-convert-case": "^4.2.0", + "koa-responsive-image-router": "^0.2.18", "locreq": "^3.0.0", "multiple-scripts-tmux": "^1.0.4", "nodemon": "^3.0.1", "object-path": "^0.11.8", "sealious": "^0.17.48", "stimulus": "^2.0.0", - "tempstream": "^0.3.12", + "tempstream": "^0.3.15", "unplugin-auto-import": "^0.17.5", "vitest": "^1.1.0" }, @@ -57,6 +58,7 @@ "@types/node": "^20.8.4", "@types/object-path": "^0.11.4", "@types/tedious": "^4.0.7", + "@types/uuid": "^9.0.8", "@typescript-eslint/eslint-plugin": "^5.10.0", "@typescript-eslint/parser": "^5.10.2", "@vitest/coverage-istanbul": "^1.1.0", diff --git a/src/back/config.ts b/src/back/config.ts index 1d3ce90..424ff4d 100644 --- a/src/back/config.ts +++ b/src/back/config.ts @@ -1,3 +1,6 @@ +import _locreq from "locreq"; +import { module_dirname } from "./util.js"; +const locreq = _locreq(module_dirname(import.meta.url)); export const SEALIOUS_SANITY = Boolean(process.env.SEALIOUS_SANITY); export const PORT = process.env.SEALIOUS_PORT ? parseInt(process.env.SEALIOUS_PORT) @@ -16,3 +19,8 @@ export const MAILCATCHER_API_PORT = parseInt( ); export const MAILER = process.env.SEALIOUS_MAILER; export const DEFAULT_HTML_LANG = "pl"; + +export const IMAGE_CACHE_FS_DIR = + process.env.IMAGE_CACHE_FS_DIR || locreq.resolve("cache/images"); +export const SMARTCROP_CACHE_FS_DIR = + process.env.IMAGE_CACHE_FS_DIR || locreq.resolve("cache/smartcrop"); diff --git a/src/back/index.ts b/src/back/index.ts index ea1509c..1687cbd 100644 --- a/src/back/index.ts +++ b/src/back/index.ts @@ -1,5 +1,7 @@ import kill from "kill-port"; +import type { KoaResponsiveImageRouter } from "koa-responsive-image-router"; import _locreq from "locreq"; +import { FlatTemplatable } from "tempstream"; import TheApp from "./app.js"; import { PORT, SEALIOUS_SANITY } from "./config.js"; import { mainRouter } from "./routes/index.js"; diff --git a/src/back/jdd-components/components.ts b/src/back/jdd-components/components.ts index c63b7a9..f34e64b 100644 --- a/src/back/jdd-components/components.ts +++ b/src/back/jdd-components/components.ts @@ -3,5 +3,8 @@ import { Registry } from "@sealcode/jdd"; export const registry = new Registry(); +import { ImageDemo } from "./image-demo/image-demo.jdd.js"; +registry.add("image-demo", ImageDemo); + import { NiceBox } from "./nice-box/nice-box.jdd.js"; registry.add("nice-box", NiceBox); diff --git a/src/back/jdd-components/image-demo/image-demo.jdd.tsx b/src/back/jdd-components/image-demo/image-demo.jdd.tsx index c5799a7..2f72ac3 100644 --- a/src/back/jdd-components/image-demo/image-demo.jdd.tsx +++ b/src/back/jdd-components/image-demo/image-demo.jdd.tsx @@ -29,17 +29,20 @@ export class ImageDemo extends Component { return (

Image with alt text

- {" " || - render_image(image_with_alt.image, { - container: { width: 200, height: 200 }, - alt: image_with_alt.alt, - })} + {render_image(image_with_alt.image, { + container: { width: 200, height: 200 }, + alt: image_with_alt.alt, + })}

Multiple images

{multiple_images.map((image) => render_image(image, { - container: { width: 200, height: 200, objectFit: "cover" }, + container: { + width: 200, + height: 200, + objectFit: "cover", + }, }) )}
diff --git a/src/back/jdd-components/nice-box/nice-box.jdd.tsx b/src/back/jdd-components/nice-box/nice-box.jdd.tsx index 236fb37..3ce063e 100644 --- a/src/back/jdd-components/nice-box/nice-box.jdd.tsx +++ b/src/back/jdd-components/nice-box/nice-box.jdd.tsx @@ -5,10 +5,17 @@ import { ExtractStructuredComponentArgumentsValues, JDDContext, } from "@sealcode/jdd"; +import { Readable } from "stream"; const component_arguments = { title: new ComponentArguments.ShortText(), content: new ComponentArguments.Markdown(), + images: new ComponentArguments.List( + new ComponentArguments.Structured({ + image: new ComponentArguments.Image(), + alt: new ComponentArguments.ShortText(), + }) + ), } as const; export class NiceBox extends Component { @@ -16,17 +23,28 @@ export class NiceBox extends Component { return component_arguments; } - toHTML( + async toHTML( { title, content, + images, }: ExtractStructuredComponentArgumentsValues, - { render_markdown }: JDDContext - ): FlatTemplatable { + { render_markdown, decode_file, render_image }: JDDContext + ): Promise { return (

{title}

{render_markdown(content)}
+ {images.map((image) => + render_image(image.image, { + container: { + width: 200, + height: 200, + objectFit: "contain", + }, + alt: image?.alt || "", + }) + )}
); } diff --git a/src/back/routes/components.sreact.tsx b/src/back/routes/components.sreact.tsx index 3cf2266..29bb709 100644 --- a/src/back/routes/components.sreact.tsx +++ b/src/back/routes/components.sreact.tsx @@ -1,82 +1,157 @@ -import { TempstreamJSX, Templatable, FlatTemplatable, tempstream } from "tempstream"; -import { BaseContext } from "koa"; -import { StatefulPage } from "@sealcode/sealgen"; -import html from "../html.js"; -import { registry } from "../jdd-components/components.js"; import { ComponentArgument, - Enum, List, render, simpleJDDContext, Structured, } from "@sealcode/jdd"; -import objectPath from "object-path"; +import { StateAndMetadata, StatefulPage, to_base64 } from "@sealcode/sealgen"; +import { hasFieldOfType, hasShape, is, predicates } from "@sealcode/ts-predicates"; +import { BaseContext } from "koa"; +import { Templatable, TempstreamJSX } from "tempstream"; +import html from "../html.js"; +import { registry } from "../jdd-components/components.js"; +import { ComponentInput } from "./component-preview/component-input.js"; +import { ComponentPreviewActions } from "./component-preview/component-preview-actions.js"; +import { jdd_context } from "./jdd-context.js"; export const actionName = "Components"; -const actions = { - add_array_item: ( - state: State, - _: Record, - arg_path: string[], - empty_value: unknown - ) => { - const args = state.args; - objectPath.insert( - args, - arg_path, - empty_value, - ((objectPath.get(args, arg_path) as unknown[]) || []).length - ); - return { - ...state, - args, - }; - }, - remove_array_item: ( - state: State, - _: Record, - arg_path: string[], - index_to_remove: number - ) => { - const args = state.args; - objectPath.del(args, [...arg_path, index_to_remove]); - return { - ...state, - args, - }; - }, - change_component: (state: State, inputs: Record) => { - const component_name = inputs.component; - const component = registry.get(component_name); - return { - ...state, - component: component_name, - args: component?.getExampleValues() || {}, - }; - }, - randomize_args: (state: State, inputs: Record) => { - const component_name = inputs.component; - const component = registry.get(component_name); - return { - ...state, - args: component?.getExampleValues() || {}, - }; - }, -} as const; +function id(_: any, __: any, x: X): X { + return x; +} -type State = { +async function encodeSealiousFile(maybe_file: Record) { + if (maybe_file?.getDataPath) { + return simpleJDDContext.encode_file( + { + type: "path", + // asserting that this is an instance of sealious' FileFromPath + path: (maybe_file as unknown as { data: { path: string } }).data + .path as string, + }, + false + ); + } +} + +const componentArgToRequestProcessor = { + list: async function (arg, arg_name, value: unknown) { + if ( + !is(value, predicates.array(predicates.object)) && + !is(value, predicates.object) + ) { + throw new Error(`$.${arg_name} is not a list or object`); + } + const values = Array.isArray(value) ? value : Object.values(value); + const nested_arg_type = (arg as List>).item_type; + let array_result: Array = await Promise.all( + values.map((value, index) => { + return ( + componentArgToRequestProcessor[nested_arg_type.getTypeName()] || id + )(nested_arg_type, `${arg_name}[${index}]`, value); + }) + ); + if (nested_arg_type.getTypeName() != "list") { + array_result = array_result.flat(); + } + return array_result; + }, + structured: async function (arg, arg_name, value) { + if (!is(value, predicates.object)) { + throw new Error(`${arg_name} is not an object`); + } + let result = Object.fromEntries( + await Promise.all( + Object.entries(value).map(async ([obj_key, obj_value]) => { + const nested_arg_type: ComponentArgument = ( + arg as Structured>> + ).structure[obj_key]; + if (!nested_arg_type) { + return [obj_key, null]; + } + const new_value = await ( + componentArgToRequestProcessor[nested_arg_type.getTypeName()] || + id + )(arg, `${arg_name}[${obj_key}]`, obj_value); + return [obj_key, new_value]; + }) + ) + ); + + // if we're in a list and any of the values return an array, we will multiply the object + if (arg.hasParent("list")) { + const keys_with_unexpected_arrays = Object.entries(result) + .filter(([key, value]) => { + const nested_arg_type: ComponentArgument = ( + arg as Structured>> + ).structure[key]; + return ( + nested_arg_type.getTypeName() !== "list" && Array.isArray(value) + ); + }) + .map(([key]) => key); + + if (keys_with_unexpected_arrays.length > 1) { + throw new Error( + "Multiplying on multiple fields at the same time is not implemented yet" + ); + } + if (keys_with_unexpected_arrays.length == 1) { + const key = keys_with_unexpected_arrays[0]; + const old_result = result; + result = (old_result[key] as Array).map((value) => ({ + ...old_result, + [key]: value, + })); + } + } + return result; + }, + image: async function (arg, _, value: unknown) { + if ( + !hasShape( + { + new: predicates.maybe(predicates.array(predicates.object)), + old: predicates.string, + }, + value + ) + ) { + return null; + } + const files = (value.new || []).filter((e) => e); + if (files.length == 0) { + return value.old; + } else if (files.length == 1) { + return encodeSealiousFile(files[0]); + } else if (arg.hasParent("list")) { + return Promise.all(files.map(encodeSealiousFile)); + } + }, +} as Record< + string, + (arg: ComponentArgument, arg_name: string, value: unknown) => Promise +>; + +export type ComponentPreviewState = { component: string; - args: Record; + component_args: Record; }; -export default new (class ComponentsPage extends StatefulPage { - actions = actions; +export default new (class ComponentsPage extends StatefulPage< + ComponentPreviewState, + typeof ComponentPreviewActions +> { + actions = ComponentPreviewActions; - getInitialState() { + async getInitialState() { const [component_name, component] = Object.entries(registry.getAll())[0]; - return { component: component_name, args: component.getExampleValues() }; + const initial_state = { + component: component_name, + component_args: await component.getExampleValues(jdd_context), + }; + return initial_state; } wrapInLayout(ctx: BaseContext, content: Templatable): Templatable { @@ -88,149 +163,68 @@ export default new (class ComponentsPage extends StatefulPage( - state: State, - arg_path: string[], - arg: List>, - value: T[] = [] - ): FlatTemplatable { + wrapInForm(state: ComponentPreviewState, content: Templatable): Templatable { + // overwriting this method in order to add enctype to form return ( -
- {arg_path.at(-1)} - {value.map((e, i) => ( -
- {this.renderArgumentInput( - state, - [...arg_path, i.toString()], - arg.item_type, - e - )} - {this.makeActionButton( - state, - { action: "remove_array_item", label: "❌" }, - arg_path, - i - )} -
- ))} - {this.makeActionButton( - state, - { - action: "add_array_item", - label: "➕", - }, - arg_path, - arg.item_type.getExampleValue() - )} -
+
+ + {content} +
); } - renderStructuredArgument< - T extends Structured>> - >( - state: State, - arg_path: string[], - arg: T, - value: Record - ): FlatTemplatable { - return ( -
- {arg_path.at(-1)} - {Object.entries(arg.structure).map(([arg_name, arg]) => ( -
- {this.renderArgumentInput( - state, - [...arg_path, arg_name], - arg, - (value as Record)[arg_name] - )} -
- ))} -
- ); + async preprocessRequestBody< + T extends StateAndMetadata + >(values: Record): Promise { + let old_component = hasFieldOfType(values, "component", predicates.string) + ? values.component + : null; + + const new_component = hasShape( + { $: predicates.shape({ component: predicates.string }) }, + values + ) + ? values.$.component + : null; + + const component_name = new_component || old_component; + if (!component_name) { + throw new Error("Unspecified component name"); + } + const component = registry.get(component_name); + if (!component) { + throw new Error(`Unknown component: ${component_name}`); + } + if ( + !hasShape( + { $: predicates.shape({ component_args: predicates.object }) }, + values + ) + ) { + // no component args to overwrite + return values as T; + } + for (const [arg_name, arg] of Object.entries(component.getArguments())) { + let value = values.$.component_args[arg_name]; + if (value) { + const new_value = await ( + componentArgToRequestProcessor[arg.getTypeName()] || id + )(arg, arg_name, value); + values.$.component_args[arg_name] = new_value; + } + } + return values as T; } - printArgPath(path: string[]): string { - return path.map((e) => `[${e}]`).join(""); - } - - renderEnumArgument>( - state: State, - arg_path: string[], - arg: T, - value: string - ): FlatTemplatable { - return ( -
- -
- ); - } - - renderArgumentInput( - state: State, - arg_path: string[], - arg: ComponentArgument, - value: T - ): FlatTemplatable { - if (value === undefined) { - value = arg.getEmptyValue(); - } - if (arg instanceof List) { - return this.renderListArgument(state, arg_path, arg, value as T[]); - } - - if (arg instanceof Structured) { - return this.renderStructuredArgument( - state, - arg_path, - arg, - value as Record - ); - } - - if (arg instanceof Enum) { - return this.renderEnumArgument(state, arg_path, arg, value as string); - } - return ( -
- -
- ); - } - - render(ctx: BaseContext, state: State, inputs: Record) { + render( + ctx: BaseContext, + state: ComponentPreviewState, + inputs: Record + ) { const all_components = registry.getAll(); const component = registry.get(state.component) || Object.values(all_components)[0]; @@ -253,19 +247,26 @@ export default new (class ComponentsPage extends StatefulPage Parameters - {Object.entries(component.getArguments()).map(([arg_name, arg]) => - this.renderArgumentInput( - state, - [arg_name], - arg, - state.args[arg_name] === undefined - ? arg.getExampleValue() - : state.args[arg_name] + {Object.entries(component.getArguments()).map( + async ([arg_name, arg]) => ( + ) )} -
{JSON.stringify(state)}
+ {JSON.stringify(state)}
{ @@ -307,18 +308,30 @@ export default new (class ComponentsPage extends StatefulPagePreview {render( registry, - [{ component_name: state.component, args: state.args }], - simpleJDDContext + [ + { + component_name: state.component, + args: state.component_args, + }, + ], + jdd_context )} { /* HTML */ `` } diff --git a/src/back/routes/index.ts b/src/back/routes/index.ts index 02c88d7..ddad45c 100644 --- a/src/back/routes/index.ts +++ b/src/back/routes/index.ts @@ -1,5 +1,6 @@ import Router from "@koa/router"; import { Middlewares } from "sealious"; +import { imageRouter, RESPONSIVE_IMAGES_URL_PATH } from "../image-router.js"; import { MainView } from "./common/main-view.js"; import mountAutoRoutes from "./routes.js"; @@ -15,5 +16,7 @@ export const mainRouter = (router: Router): void => { ctx.body = { status: ctx.$app.status, started_at }; }); + router.use(RESPONSIVE_IMAGES_URL_PATH, imageRouter.getRoutes()); + mountAutoRoutes(router); }; diff --git a/src/back/tsconfig.json b/src/back/tsconfig.json index 76b174f..ebd9c0b 100644 --- a/src/back/tsconfig.json +++ b/src/back/tsconfig.json @@ -7,7 +7,7 @@ "strictNullChecks": true, "target": "ES2019", "esModuleInterop": true, - "lib": ["es6", "esnext"], + "lib": ["es2021"], "outDir": "../../dist/back", "keyofStringsOnly": true, "jsx": "react", diff --git a/src/front/index.ts b/src/front/index.ts index c09f1b3..38689b2 100644 --- a/src/front/index.ts +++ b/src/front/index.ts @@ -1,8 +1,10 @@ import * as Turbo from "@hotwired/turbo"; import { Application } from "stimulus"; +import InputImagePreview from "./controllers/input-image-preview"; import TaskController from "./controllers/task-controller"; export { Turbo }; const application = Application.start(); application.register("task", TaskController); +application.register("input-image-preview", InputImagePreview); diff --git a/src/includes.css b/src/includes.css index b0cd784..c56a2d5 100644 --- a/src/includes.css +++ b/src/includes.css @@ -1,6 +1,7 @@ /* DO NOT EDIT! This file is generated automaticaly with npx sealgen generate-css-includes */ @import "../node_modules/@sealcode/sealgen/src/forms/forms.css"; +@import "back/jdd-components/image-demo/image-demo.css"; @import "back/routes/common/ui/input.css"; @import "back/routes/components.css"; @import "colors.css";