diff --git a/.babelrc b/.babelrc new file mode 100644 index 0000000..ea53e4c --- /dev/null +++ b/.babelrc @@ -0,0 +1,4 @@ +{ + "presets": ["@babel/preset-env", "@babel/preset-typescript"], + "plugins": ["@babel/plugin-transform-optional-chaining"] +} \ No newline at end of file diff --git a/.eslintrc.json b/.eslintrc.json new file mode 100644 index 0000000..6c00e1d --- /dev/null +++ b/.eslintrc.json @@ -0,0 +1,21 @@ +{ + "plugins": ["@typescript-eslint"], + "extends": ["eslint:recommended", "plugin:@typescript-eslint/recommended", "google"], + "parser": "@babel/eslint-parser", + "globals": { + "window": true, + "$": true, + "jQuery": true + }, + "env": { + "browser": true + }, + "rules": { + "no-undef": "off", + "getter-return": "off", + "indent": "off", + "no-unused-vars": "off", + "new-cap": "off", + "@typescript-eslint/no-unused-vars": "off" + } +} \ No newline at end of file diff --git a/README.md b/README.md index b75d455..2a73906 100644 --- a/README.md +++ b/README.md @@ -161,14 +161,14 @@ window.AprilJokes.settings = { variants: { adj: { ...window.AprilJokes.settings.stupid_title.variants.adj, - ...BuildStupdiTitleVariant(true, "скромный, шутливый, !грубый"), - ...BuildStupdiTitleVariant(false, "скромная, шутливая, !грубая"), + ...BuildStupidTitleVariant(true, "скромный, шутливый, !грубый"), + ...BuildStupidTitleVariant(false, "скромная, шутливая, !грубая"), }, - noun: { ...window.AprilJokes.settings.stupid_title.variants.noun }, - verb: { ...window.AprilJokes.settings.stupid_title.variants.verb }, - place: { ...window.AprilJokes.settings.stupid_title.variants.place }, - adv: { ...window.AprilJokes.settings.stupid_title.variants.adv }, - p: { ...window.AprilJokes.settings.stupid_title.variants.p }, + noun: {...window.AprilJokes.settings.stupid_title.variants.noun}, + verb: {...window.AprilJokes.settings.stupid_title.variants.verb}, + place: {...window.AprilJokes.settings.stupid_title.variants.place}, + adv: {...window.AprilJokes.settings.stupid_title.variants.adv}, + p: {...window.AprilJokes.settings.stupid_title.variants.p}, }, // ... }, diff --git a/package-lock.json b/package-lock.json index 3b3f9c2..cf08658 100644 --- a/package-lock.json +++ b/package-lock.json @@ -9,13 +9,15 @@ "version": "1.0.0", "license": "https://forumd.ru/viewtopic.php?id=5751#rule", "dependencies": { + "@babel/eslint-parser": "^7.24.1", + "@typescript-eslint/eslint-plugin": "^7.3.1", "cursor-effects": "^1.0.11", "jquery": "^3.6.4", "webpack-utf8-bom": "^1.4.0" }, "devDependencies": { "@babel/cli": "^7.21.0", - "@babel/core": "^7.21.3", + "@babel/core": "^7.24.3", "@babel/preset-env": "^7.20.2", "@babel/preset-typescript": "^7.21.0", "@types/jquery": "^3.5.16", @@ -48,7 +50,6 @@ "version": "1.2.6", "resolved": "https://registry.npmjs.org/@aashutoshrathi/word-wrap/-/word-wrap-1.2.6.tgz", "integrity": "sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -57,7 +58,6 @@ "version": "2.3.0", "resolved": "https://registry.npmjs.org/@ampproject/remapping/-/remapping-2.3.0.tgz", "integrity": "sha512-30iZtAPgz+LTIYoeivqYo853f02jBYSd5uGnGpkFV0M3xOt9aN73erkgYAmZU43x4VfqcnLxW9Kpg3R5LC4YYw==", - "dev": true, "dependencies": { "@jridgewell/gen-mapping": "^0.3.5", "@jridgewell/trace-mapping": "^0.3.24" @@ -99,7 +99,6 @@ "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.24.2.tgz", "integrity": "sha512-y5+tLQyV8pg3fsiln67BVLD1P13Eg4lh5RW9mF0zUuvLrv9uIQ4MCL+CRT+FTsBlBjcIan6PGsLcBN0m3ClUyQ==", - "dev": true, "dependencies": { "@babel/highlight": "^7.24.2", "picocolors": "^1.0.0" @@ -112,7 +111,6 @@ "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.24.1.tgz", "integrity": "sha512-Pc65opHDliVpRHuKfzI+gSA4zcgr65O4cl64fFJIWEEh8JoHIHh0Oez1Eo8Arz8zq/JhgKodQaxEwUPRtZylVA==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -121,7 +119,6 @@ "version": "7.24.3", "resolved": "https://registry.npmjs.org/@babel/core/-/core-7.24.3.tgz", "integrity": "sha512-5FcvN1JHw2sHJChotgx8Ek0lyuh4kCKelgMTTqhYJJtloNvUfpAFMeNQUtdlIaktwrSV9LtCdqwk48wL2wBacQ==", - "dev": true, "dependencies": { "@ampproject/remapping": "^2.2.0", "@babel/code-frame": "^7.24.2", @@ -147,11 +144,27 @@ "url": "https://opencollective.com/babel" } }, + "node_modules/@babel/eslint-parser": { + "version": "7.24.1", + "resolved": "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.24.1.tgz", + "integrity": "sha512-d5guuzMlPeDfZIbpQ8+g1NaCNuAGBBGNECh0HVqz1sjOeVLh2CEaifuOysCH18URW6R7pqXINvf5PaR/dC6jLQ==", + "dependencies": { + "@nicolo-ribaudo/eslint-scope-5-internals": "5.1.1-v1", + "eslint-visitor-keys": "^2.1.0", + "semver": "^6.3.1" + }, + "engines": { + "node": "^10.13.0 || ^12.13.0 || >=14.0.0" + }, + "peerDependencies": { + "@babel/core": "^7.11.0", + "eslint": "^7.5.0 || ^8.0.0" + } + }, "node_modules/@babel/generator": { "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/generator/-/generator-7.24.1.tgz", "integrity": "sha512-DfCRfZsBcrPEHUfuBMgbJ1Ut01Y/itOs+hY2nFLgqsqXd52/iSiVq5TITtUasIUgm+IIKdY2/1I7auiQOEeC9A==", - "dev": true, "dependencies": { "@babel/types": "^7.24.0", "@jridgewell/gen-mapping": "^0.3.5", @@ -190,7 +203,6 @@ "version": "7.23.6", "resolved": "https://registry.npmjs.org/@babel/helper-compilation-targets/-/helper-compilation-targets-7.23.6.tgz", "integrity": "sha512-9JB548GZoQVmzrFgp8o7KxdgkTGm6xs9DW0o/Pim72UDjzr5ObUQ6ZzYPqA+g9OTS2bBQoctLJrky0RDCAWRgQ==", - "dev": true, "dependencies": { "@babel/compat-data": "^7.23.5", "@babel/helper-validator-option": "^7.23.5", @@ -262,7 +274,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz", "integrity": "sha512-zfedSIzFhat/gFhWfHtgWvlec0nqB9YEIVrpuwjruLlXfUSnA8cJB0miHKwqDnQ7d32aKo2xt88/xZptwxbfhA==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -271,7 +282,6 @@ "version": "7.23.0", "resolved": "https://registry.npmjs.org/@babel/helper-function-name/-/helper-function-name-7.23.0.tgz", "integrity": "sha512-OErEqsrxjZTJciZ4Oo+eoZqeW9UIiOcuYKRJA4ZAgV9myA+pOXhhmpfNCKjEH/auVfEYVFJ6y1Tc4r0eIApqiw==", - "dev": true, "dependencies": { "@babel/template": "^7.22.15", "@babel/types": "^7.23.0" @@ -284,7 +294,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-hoist-variables/-/helper-hoist-variables-7.22.5.tgz", "integrity": "sha512-wGjk9QZVzvknA6yKIUURb8zY3grXCcOZt+/7Wcy8O2uctxhplmUPkOdlgoNhmdVee2c92JXbf1xpMtVNbfoxRw==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -308,7 +317,6 @@ "version": "7.24.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-imports/-/helper-module-imports-7.24.3.tgz", "integrity": "sha512-viKb0F9f2s0BCS22QSF308z/+1YWKV/76mwt61NBzS5izMzDPwdq1pTrzf+Li3npBWX9KdQbkeCt1jSAM7lZqg==", - "dev": true, "dependencies": { "@babel/types": "^7.24.0" }, @@ -320,7 +328,6 @@ "version": "7.23.3", "resolved": "https://registry.npmjs.org/@babel/helper-module-transforms/-/helper-module-transforms-7.23.3.tgz", "integrity": "sha512-7bBs4ED9OmswdfDzpz4MpWgSrV7FXlc3zIagvLFjS5H+Mk7Snr21vQ6QwrsoCGMfNC4e4LQPdoULEt4ykz0SRQ==", - "dev": true, "dependencies": { "@babel/helper-environment-visitor": "^7.22.20", "@babel/helper-module-imports": "^7.22.15", @@ -394,7 +401,6 @@ "version": "7.22.5", "resolved": "https://registry.npmjs.org/@babel/helper-simple-access/-/helper-simple-access-7.22.5.tgz", "integrity": "sha512-n0H99E/K+Bika3++WNL17POvo4rKWZ7lZEp1Q+fStVbUi8nxPQEBOlTmCOxW/0JsS56SKKQ+ojAe2pHKJHN35w==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -418,7 +424,6 @@ "version": "7.22.6", "resolved": "https://registry.npmjs.org/@babel/helper-split-export-declaration/-/helper-split-export-declaration-7.22.6.tgz", "integrity": "sha512-AsUnxuLhRYsisFiaJwvp1QF+I3KjD5FOxut14q/GzovUe6orHLesW2C7d754kRm53h5gqrz6sFl6sxc4BVtE/g==", - "dev": true, "dependencies": { "@babel/types": "^7.22.5" }, @@ -430,7 +435,6 @@ "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/helper-string-parser/-/helper-string-parser-7.24.1.tgz", "integrity": "sha512-2ofRCjnnA9y+wk8b9IAREroeUP02KHp431N2mhKniy2yKIDKpbrHv9eXwm8cBeWQYcJmzv5qKCu65P47eCF7CQ==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -439,7 +443,6 @@ "version": "7.22.20", "resolved": "https://registry.npmjs.org/@babel/helper-validator-identifier/-/helper-validator-identifier-7.22.20.tgz", "integrity": "sha512-Y4OZ+ytlatR8AI+8KZfKuL5urKp7qey08ha31L8b3BwewJAoJamTzyvxPR/5D+KkdJCGPq/+8TukHBlY10FX9A==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -448,7 +451,6 @@ "version": "7.23.5", "resolved": "https://registry.npmjs.org/@babel/helper-validator-option/-/helper-validator-option-7.23.5.tgz", "integrity": "sha512-85ttAOMLsr53VgXkTbkx8oA6YTfT4q7/HzXSLEYmjcSTJPMPQtvq1BD79Byep5xMUYbGRzEpDsjUf3dyp54IKw==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -471,7 +473,6 @@ "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/helpers/-/helpers-7.24.1.tgz", "integrity": "sha512-BpU09QqEe6ZCHuIHFphEFgvNSrubve1FtyMton26ekZ85gRGi6LrTF7zArARp2YvyFxloeiRmtSCq5sjh1WqIg==", - "dev": true, "dependencies": { "@babel/template": "^7.24.0", "@babel/traverse": "^7.24.1", @@ -485,7 +486,6 @@ "version": "7.24.2", "resolved": "https://registry.npmjs.org/@babel/highlight/-/highlight-7.24.2.tgz", "integrity": "sha512-Yac1ao4flkTxTteCDZLEvdxg2fZfz1v8M4QpaGypq/WPDqg3ijHYbDfs+LG5hvzSoqaSZ9/Z9lKSP3CjZjv+pA==", - "dev": true, "dependencies": { "@babel/helper-validator-identifier": "^7.22.20", "chalk": "^2.4.2", @@ -500,7 +500,6 @@ "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/parser/-/parser-7.24.1.tgz", "integrity": "sha512-Zo9c7N3xdOIQrNip7Lc9wvRPzlRtovHVE4lkz8WEDr7uYh/GMQhSiIgFxGIArRHYdJE5kxtZjAf8rT0xhdLCzg==", - "dev": true, "bin": { "parser": "bin/babel-parser.js" }, @@ -1771,7 +1770,6 @@ "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/template/-/template-7.24.0.tgz", "integrity": "sha512-Bkf2q8lMB0AFpX0NFEqSbx1OkTHf0f+0j82mkw+ZpzBnkk7e9Ql0891vlfgi+kHwOk8tQjiQHpqh4LaSa0fKEA==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.23.5", "@babel/parser": "^7.24.0", @@ -1785,7 +1783,6 @@ "version": "7.24.1", "resolved": "https://registry.npmjs.org/@babel/traverse/-/traverse-7.24.1.tgz", "integrity": "sha512-xuU6o9m68KeqZbQuDt2TcKSxUw/mrsvavlEqQ1leZ/B+C9tk6E4sRWy97WaXgvq5E+nU3cXMxv3WKOCanVMCmQ==", - "dev": true, "dependencies": { "@babel/code-frame": "^7.24.1", "@babel/generator": "^7.24.1", @@ -1806,7 +1803,6 @@ "version": "7.24.0", "resolved": "https://registry.npmjs.org/@babel/types/-/types-7.24.0.tgz", "integrity": "sha512-+j7a5c253RfKh8iABBhywc8NSfP5LURe7Uh4qpsh6jc+aLJguvmIUBdjSdEMQv2bENrCR5MfRdjGo7vzS/ob7w==", - "dev": true, "dependencies": { "@babel/helper-string-parser": "^7.23.4", "@babel/helper-validator-identifier": "^7.22.20", @@ -1829,7 +1825,6 @@ "version": "4.4.0", "resolved": "https://registry.npmjs.org/@eslint-community/eslint-utils/-/eslint-utils-4.4.0.tgz", "integrity": "sha512-1/sA4dwrzBAyeUoQ6oxahHKmrZvsnLCg4RfxW3ZFGGmQkSNQPFNLV9CUEFQP1x9EYXHTo5p6xdhZM1Ne9p/AfA==", - "dev": true, "dependencies": { "eslint-visitor-keys": "^3.3.0" }, @@ -1840,11 +1835,21 @@ "eslint": "^6.0.0 || ^7.0.0 || >=8.0.0" } }, + "node_modules/@eslint-community/eslint-utils/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@eslint-community/regexpp": { "version": "4.10.0", "resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.10.0.tgz", "integrity": "sha512-Cu96Sd2By9mCNTx2iyKOmq10v22jUVQv0lQnlGNy16oE9589yE+QADPbrMGCkA51cKZSg3Pu/aTJVTGfL/qjUA==", - "dev": true, "engines": { "node": "^12.0.0 || ^14.0.0 || >=16.0.0" } @@ -1853,7 +1858,6 @@ "version": "2.1.4", "resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.4.tgz", "integrity": "sha512-269Z39MS6wVJtsoUl10L60WdkhJVdPG24Q4eZTH3nnF6lpvSShEK3wQjDX9JRWAUPvPh7COouPpU9IrqaZFvtQ==", - "dev": true, "dependencies": { "ajv": "^6.12.4", "debug": "^4.3.2", @@ -1876,7 +1880,6 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -1891,7 +1894,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -1903,7 +1905,6 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", "integrity": "sha512-Ys+3g2TaW7gADOJzPt83SJtCDhMjndcDMFVQ/Tj9iA1BfJzFKD9mAUXT3OenpuPHbI6P/myECxRJrofUsDx/5g==", - "dev": true, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" } @@ -1918,7 +1919,6 @@ "version": "0.11.14", "resolved": "https://registry.npmjs.org/@humanwhocodes/config-array/-/config-array-0.11.14.tgz", "integrity": "sha512-3T8LkOmg45BV5FICb15QQMsyUSWrQ8AygVfC7ZG32zOalnqrilm018ZVCw0eapXux8FtA33q8PSRSstjee3jSg==", - "dev": true, "dependencies": { "@humanwhocodes/object-schema": "^2.0.2", "debug": "^4.3.1", @@ -1932,7 +1932,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", "integrity": "sha512-bxveV4V8v5Yb4ncFTT3rPSgZBOpCkjfK0y4oVVVJwIuDVBRMDXrPyXRL988i5ap9m9bnyEEjWfm5WkBmtffLfA==", - "dev": true, "engines": { "node": ">=12.22" }, @@ -1944,8 +1943,7 @@ "node_modules/@humanwhocodes/object-schema": { "version": "2.0.2", "resolved": "https://registry.npmjs.org/@humanwhocodes/object-schema/-/object-schema-2.0.2.tgz", - "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==", - "dev": true + "integrity": "sha512-6EwiSjwWYP7pTckG6I5eyFANjPhmPjUX9JRLUSfNPC7FX7zK9gyZAfUEaECL6ALTpGX5AjnBq3C9XmVWPitNpw==" }, "node_modules/@isaacs/cliui": { "version": "8.0.2", @@ -2120,11 +2118,18 @@ "dev": true, "optional": true }, + "node_modules/@nicolo-ribaudo/eslint-scope-5-internals": { + "version": "5.1.1-v1", + "resolved": "https://registry.npmjs.org/@nicolo-ribaudo/eslint-scope-5-internals/-/eslint-scope-5-internals-5.1.1-v1.tgz", + "integrity": "sha512-54/JRvkLIzzDWshCWfuhadfrfZVPiElY8Fcgmg1HroEly/EDSszzhBAsarCux+D/kOslTRquNzuyGSmUSTTHGg==", + "dependencies": { + "eslint-scope": "5.1.1" + } + }, "node_modules/@nodelib/fs.scandir": { "version": "2.1.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.scandir/-/fs.scandir-2.1.5.tgz", "integrity": "sha512-vq24Bq3ym5HEQm2NKCr3yXDwjc7vTsEThRDnkp2DK9p1uqLR+DHurm/NOTo0KG7HYHU7eppKZj3MyqYuMBf62g==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "2.0.5", "run-parallel": "^1.1.9" @@ -2137,7 +2142,6 @@ "version": "2.0.5", "resolved": "https://registry.npmjs.org/@nodelib/fs.stat/-/fs.stat-2.0.5.tgz", "integrity": "sha512-RkhPPp2zrqDAQA/2jNhnztcPAlv64XdhIp7a7454A5ovI7Bukxgt7MX7udwAu3zg1DcpPU0rz3VV1SeaqvY4+A==", - "dev": true, "engines": { "node": ">= 8" } @@ -2146,7 +2150,6 @@ "version": "1.2.8", "resolved": "https://registry.npmjs.org/@nodelib/fs.walk/-/fs.walk-1.2.8.tgz", "integrity": "sha512-oGB+UxlgWcgQkgwo8GcEGwemoTFt3FIO9ababBmaGwXIoBKZ+GTy0pP185beGg7Llih/NSHSV2XAs1lnznocSg==", - "dev": true, "dependencies": { "@nodelib/fs.scandir": "2.1.5", "fastq": "^1.6.0" @@ -3145,6 +3148,11 @@ "integrity": "sha512-37i+OaWTh9qeK4LSHPsyRC7NahnGotNuZvjLSgcPzblpHB3rrCJxAOgI5gCdKm7coonsaX1Of0ILiTcnZjbfxA==", "dev": true }, + "node_modules/@types/semver": { + "version": "7.5.8", + "resolved": "https://registry.npmjs.org/@types/semver/-/semver-7.5.8.tgz", + "integrity": "sha512-I8EUhyrgfLrcTkzV3TSsGyl1tSuPrEDzr0yd5m90UgNxQkyDXULk3b6MlQqTCpZpNtWe1K0hzclnZkTcLBe2UQ==" + }, "node_modules/@types/sizzle": { "version": "2.3.8", "resolved": "https://registry.npmjs.org/@types/sizzle/-/sizzle-2.3.8.tgz", @@ -3161,11 +3169,316 @@ "@types/node": "*" } }, + "node_modules/@typescript-eslint/eslint-plugin": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.3.1.tgz", + "integrity": "sha512-STEDMVQGww5lhCuNXVSQfbfuNII5E08QWkvAw5Qwf+bj2WT+JkG1uc+5/vXA3AOYMDHVOSpL+9rcbEUiHIm2dw==", + "dependencies": { + "@eslint-community/regexpp": "^4.5.1", + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/type-utils": "7.3.1", + "@typescript-eslint/utils": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", + "debug": "^4.3.4", + "graphemer": "^1.4.0", + "ignore": "^5.2.4", + "natural-compare": "^1.4.0", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "@typescript-eslint/parser": "^7.0.0", + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/eslint-plugin/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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/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==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/eslint-plugin/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@typescript-eslint/parser": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.3.1.tgz", + "integrity": "sha512-Rq49+pq7viTRCH48XAbTA+wdLRrB/3sRq4Lpk0oGDm0VmnjBrAOVXH/Laalmwsv2VpekiEfVFwJYVk6/e8uvQw==", + "peer": true, + "dependencies": { + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/typescript-estree": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", + "debug": "^4.3.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/scope-manager": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.3.1.tgz", + "integrity": "sha512-fVS6fPxldsKY2nFvyT7IP78UO1/I2huG+AYu5AMjCT9wtl6JFiDnsv4uad4jQ0GTFzcUV5HShVeN96/17bTBag==", + "dependencies": { + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/type-utils": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.3.1.tgz", + "integrity": "sha512-iFhaysxFsMDQlzJn+vr3OrxN8NmdQkHks4WaqD4QBnt5hsq234wcYdyQ9uquzJJIDAj5W4wQne3yEsYA6OmXGw==", + "dependencies": { + "@typescript-eslint/typescript-estree": "7.3.1", + "@typescript-eslint/utils": "7.3.1", + "debug": "^4.3.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/types": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.3.1.tgz", + "integrity": "sha512-2tUf3uWggBDl4S4183nivWQ2HqceOZh1U4hhu4p1tPiIJoRRXrab7Y+Y0p+dozYwZVvLPRI6r5wKe9kToF9FIw==", + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/typescript-estree": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.3.1.tgz", + "integrity": "sha512-tLpuqM46LVkduWP7JO7yVoWshpJuJzxDOPYIVWUUZbW+4dBpgGeUdl/fQkhuV0A8eGnphYw3pp8d2EnvPOfxmQ==", + "dependencies": { + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/visitor-keys": "7.3.1", + "debug": "^4.3.4", + "globby": "^11.1.0", + "is-glob": "^4.0.3", + "minimatch": "9.0.3", + "semver": "^7.5.4", + "ts-api-utils": "^1.0.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependenciesMeta": { + "typescript": { + "optional": true + } + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/brace-expansion": { + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dependencies": { + "balanced-match": "^1.0.0" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { + "version": "9.0.3", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.3.tgz", + "integrity": "sha512-RHiac9mvaRw0x3AYRgDC1CxAP7HTcNrrECeA8YYJeWnpo+2Q5CegtZjaotWTWxDG3UeGA1coE05iH1mPjT/2mg==", + "dependencies": { + "brace-expansion": "^2.0.1" + }, + "engines": { + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" + } + }, + "node_modules/@typescript-eslint/typescript-estree/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==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/typescript-estree/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@typescript-eslint/utils": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.3.1.tgz", + "integrity": "sha512-jIERm/6bYQ9HkynYlNZvXpzmXWZGhMbrOvq3jJzOSOlKXsVjrrolzWBjDW6/TvT5Q3WqaN4EkmcfdQwi9tDjBQ==", + "dependencies": { + "@eslint-community/eslint-utils": "^4.4.0", + "@types/json-schema": "^7.0.12", + "@types/semver": "^7.5.0", + "@typescript-eslint/scope-manager": "7.3.1", + "@typescript-eslint/types": "7.3.1", + "@typescript-eslint/typescript-estree": "7.3.1", + "semver": "^7.5.4" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + }, + "peerDependencies": { + "eslint": "^8.56.0" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dependencies": { + "yallist": "^4.0.0" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/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==", + "dependencies": { + "lru-cache": "^6.0.0" + }, + "bin": { + "semver": "bin/semver.js" + }, + "engines": { + "node": ">=10" + } + }, + "node_modules/@typescript-eslint/utils/node_modules/yallist": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/yallist/-/yallist-4.0.0.tgz", + "integrity": "sha512-3wdGidZyq5PB084XLES5TpOSRA3wjXAlIWMhum2kRcv/41Sn2emQ0dycQW4uZXLejwKvg6EsvbdlVL+FYEct7A==" + }, + "node_modules/@typescript-eslint/visitor-keys": { + "version": "7.3.1", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.3.1.tgz", + "integrity": "sha512-9RMXwQF8knsZvfv9tdi+4D/j7dMG28X/wMJ8Jj6eOHyHWwDW4ngQJcqEczSsqIKKjFiLFr40Mnr7a5ulDD3vmw==", + "dependencies": { + "@typescript-eslint/types": "7.3.1", + "eslint-visitor-keys": "^3.4.1" + }, + "engines": { + "node": "^18.18.0 || >=20.0.0" + }, + "funding": { + "type": "opencollective", + "url": "https://opencollective.com/typescript-eslint" + } + }, + "node_modules/@typescript-eslint/visitor-keys/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/@ungap/structured-clone": { "version": "1.2.0", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", - "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==", - "dev": true + "integrity": "sha512-zuVdFrMJiuCDQUMCzQaD6KL28MjnqqN8XnAqiEq9PNm/hCPTSGfrXCOfwj1ow4LFb/tNymJPwsNbVePc1xFqrQ==" }, "node_modules/@webassemblyjs/ast": { "version": "1.12.1", @@ -3416,7 +3729,6 @@ "version": "5.3.2", "resolved": "https://registry.npmjs.org/acorn-jsx/-/acorn-jsx-5.3.2.tgz", "integrity": "sha512-rq9s+JNhf0IChjtDXxllJ7g41oZk5SlXtp0LHwyA5cejwn7vKmKp4pPri6YEePv2PU65sAsegbXtIinmDFDXgQ==", - "dev": true, "peerDependencies": { "acorn": "^6.0.0 || ^7.0.0 || ^8.0.0" } @@ -3553,7 +3865,6 @@ "version": "5.0.1", "resolved": "https://registry.npmjs.org/ansi-regex/-/ansi-regex-5.0.1.tgz", "integrity": "sha512-quJQXlTSUGL2LH9SUXo8VwsY4soanhgo6LNSm84E1LBcE8s3O0wpdiRzyR9z/ZZJMlMWv37qOOb9pdJlMUEKFQ==", - "dev": true, "engines": { "node": ">=8" } @@ -3562,7 +3873,6 @@ "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==", - "dev": true, "dependencies": { "color-convert": "^1.9.0" }, @@ -3625,8 +3935,7 @@ "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==", - "dev": true + "integrity": "sha512-8+9WqebbFzpX9OR+Wa6O29asIogeRMzcGtAINdpMHHyAg10f05aSFVBbcEqGf/PXw1EjAZ+q2/bEBg3DvurK3Q==" }, "node_modules/array-back": { "version": "6.2.2", @@ -3668,7 +3977,6 @@ "version": "2.1.0", "resolved": "https://registry.npmjs.org/array-union/-/array-union-2.1.0.tgz", "integrity": "sha512-HGyxoOTYUyCM6stUe6EJgnd4EoewAI7zMdfqO+kGjnlZmBDz/cR5pf8r/cR4Wq60sL/p0IkcjUEEPwS3GFrIyw==", - "dev": true, "engines": { "node": ">=8" } @@ -3808,8 +4116,7 @@ "node_modules/balanced-match": { "version": "1.0.2", "resolved": "https://registry.npmjs.org/balanced-match/-/balanced-match-1.0.2.tgz", - "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==", - "dev": true + "integrity": "sha512-3oSeUO0TMV67hN1AmbXsK4yaqU7tjiHlbxRDZOpH0KW9+CeX4bRAaX0Anxt0tx2MrpRpWwQaPwIlISEJhYU5Pw==" }, "node_modules/base64-js": { "version": "1.5.1", @@ -3952,7 +4259,6 @@ "version": "1.1.11", "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", - "dev": true, "dependencies": { "balanced-match": "^1.0.0", "concat-map": "0.0.1" @@ -3962,7 +4268,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/braces/-/braces-3.0.2.tgz", "integrity": "sha512-b8um+L1RzM3WDSzvhm6gIz1yfTbBt6YTlcEKAvsmqCZZFw46z626lVj9j1yEPW33H5H+lBQpZMP1k8l+78Ha0A==", - "dev": true, "dependencies": { "fill-range": "^7.0.1" }, @@ -4358,7 +4663,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/callsites/-/callsites-3.1.0.tgz", "integrity": "sha512-P8BjAsXvZS+VIDUI11hHCQEv74YT67YUi5JJFNWIqL235sBmjX4+qx9Muvls5ivyNENctx46xQLQ3aTuE7ssaQ==", - "dev": true, "engines": { "node": ">=6" } @@ -4408,7 +4712,6 @@ "version": "2.4.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-2.4.2.tgz", "integrity": "sha512-Mti+f9lpJNcwF4tWV8/OrTTtF1gZi+f8FqlyAdouralcFWFQWF2+NgCHShjkCb+IFBLq9buZwE1xckQU4peSuQ==", - "dev": true, "dependencies": { "ansi-styles": "^3.2.1", "escape-string-regexp": "^1.0.5", @@ -4637,7 +4940,6 @@ "version": "1.9.3", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-1.9.3.tgz", "integrity": "sha512-QfAUtd+vFdAtFQcC8CCyYt1fYWxSqAiK2cSD6zDB8N3cpsEBAvRxp9zOGg6G/SHHJYAT88/az/IuDGALsNVbGg==", - "dev": true, "dependencies": { "color-name": "1.1.3" } @@ -4645,8 +4947,7 @@ "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==", - "dev": true + "integrity": "sha512-72fSenhMw2HZMTVHeCA9KCmpEIbzWiQsjN+BHcBbS9vr1mtt+vJjPdksIBNUmKAW8TFUDPJK5SUU3QhE9NEXDw==" }, "node_modules/color-support": { "version": "1.1.3", @@ -4811,8 +5112,7 @@ "node_modules/concat-map": { "version": "0.0.1", "resolved": "https://registry.npmjs.org/concat-map/-/concat-map-0.0.1.tgz", - "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==", - "dev": true + "integrity": "sha512-/Srv4dswyQNBfohGpz9o6Yb3Gz3SrUDqBH5rTuhGR7ahtlbYKnVxw2bCFMRljaA7EXHaXZ8wsHdodFvbkhKmqg==" }, "node_modules/concat-stream": { "version": "1.6.2", @@ -4868,8 +5168,7 @@ "node_modules/convert-source-map": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/convert-source-map/-/convert-source-map-2.0.0.tgz", - "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==", - "dev": true + "integrity": "sha512-Kvp459HrV2FEJ1CAsi1Ku+MY3kasH19TFykTz2xWmMeq6bk2NU3XXvfJ+Q61m0xktWwt+1HSYf3JZsTms3aRJg==" }, "node_modules/core-js-compat": { "version": "3.36.1", @@ -4937,7 +5236,6 @@ "version": "7.0.3", "resolved": "https://registry.npmjs.org/cross-spawn/-/cross-spawn-7.0.3.tgz", "integrity": "sha512-iRDPJKUPVEND7dHPO8rkbOnPpyDygcDFtWjpeWNCgy8WP2rXcxXL8TskReQl6OrB2G7+UJrags1q15Fudc7G6w==", - "dev": true, "dependencies": { "path-key": "^3.1.0", "shebang-command": "^2.0.0", @@ -5002,7 +5300,6 @@ "version": "4.3.4", "resolved": "https://registry.npmjs.org/debug/-/debug-4.3.4.tgz", "integrity": "sha512-PRWFHuSU3eDtQJPvnNY7Jcket1j0t5OuOsFzPPzsekD52Zl8qUfFIPEiswXqIvHWGVHOgX+7G/vCNNhehwxfkQ==", - "dev": true, "dependencies": { "ms": "2.1.2" }, @@ -5037,8 +5334,7 @@ "node_modules/deep-is": { "version": "0.1.4", "resolved": "https://registry.npmjs.org/deep-is/-/deep-is-0.1.4.tgz", - "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==", - "dev": true + "integrity": "sha512-oIPzksmTg4/MriiaYGO+okXDT7ztn/w3Eptv/+gSIdMdKsJo0u4CfYNFJPy+4SKMuCqGw2wxnA+URMg3t8a/bQ==" }, "node_modules/defaults": { "version": "1.0.4", @@ -5207,7 +5503,6 @@ "version": "3.0.1", "resolved": "https://registry.npmjs.org/dir-glob/-/dir-glob-3.0.1.tgz", "integrity": "sha512-WkrWp9GR4KXfKGYzOLmTuGVi1UWFfws377n9cc55/tb6DuqyF6pcQ5AbiHEshaDpY9v6oaSr2XCDidGmMwdzIA==", - "dev": true, "dependencies": { "path-type": "^4.0.0" }, @@ -5242,7 +5537,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/doctrine/-/doctrine-3.0.0.tgz", "integrity": "sha512-yS+Q5i3hBf7GBkd4KG8a7eBNNWNGLTaEwwYWUijIYM7zrlYDM0BFXHjjPWlWZ1Rg7UaddZeIDmi9jF3HmqiQ2w==", - "dev": true, "dependencies": { "esutils": "^2.0.2" }, @@ -5452,7 +5746,6 @@ "version": "1.0.5", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-1.0.5.tgz", "integrity": "sha512-vbRorB5FUQWvla16U8R/qgaFIya2qGzwDrNmCZuYKrbdSUMG6I1ZCGQRefkRVhuOkIGVne7BQ35DSfo1qvJqFg==", - "dev": true, "engines": { "node": ">=0.8.0" } @@ -5461,7 +5754,6 @@ "version": "8.57.0", "resolved": "https://registry.npmjs.org/eslint/-/eslint-8.57.0.tgz", "integrity": "sha512-dZ6+mexnaTIbSBZWgou51U6OmzIhYM2VcNdtiTtI7qPNZm35Akpr0f6vtw3w1Kmn5PYo+tZVfh13WrhpS6oLqQ==", - "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.2.0", "@eslint-community/regexpp": "^4.6.1", @@ -5525,38 +5817,29 @@ } }, "node_modules/eslint-scope": { - "version": "7.2.2", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", - "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", - "dev": true, + "version": "5.1.1", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", + "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", "dependencies": { "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" + "estraverse": "^4.1.1" }, "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=8.0.0" } }, "node_modules/eslint-visitor-keys": { - "version": "3.4.3", - "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", - "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", - "dev": true, + "version": "2.1.0", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-2.1.0.tgz", + "integrity": "sha512-0rSmRBzXgDzIsD6mGdJgevzgezI534Cer5L/vyMX0kHzT/jiB43jRhd9YUlMGYLQy2zprNmoT8qasCGtY+QaKw==", "engines": { - "node": "^12.22.0 || ^14.17.0 || >=16.0.0" - }, - "funding": { - "url": "https://opencollective.com/eslint" + "node": ">=10" } }, "node_modules/eslint/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==", - "dev": true, "dependencies": { "color-convert": "^2.0.1" }, @@ -5571,7 +5854,6 @@ "version": "4.1.2", "resolved": "https://registry.npmjs.org/chalk/-/chalk-4.1.2.tgz", "integrity": "sha512-oKnbhFyRIXpUuez8iBMmyEa4nbj4IOQyuhc/wy9kY7/WVPcwIO9VA668Pu8RkO7+0G76SLROeyw9CpQ061i4mA==", - "dev": true, "dependencies": { "ansi-styles": "^4.1.0", "supports-color": "^7.1.0" @@ -5587,7 +5869,6 @@ "version": "2.0.1", "resolved": "https://registry.npmjs.org/color-convert/-/color-convert-2.0.1.tgz", "integrity": "sha512-RRECPsj7iu/xb5oKYcsFHSppFNnsj/52OVTRKb4zP5onXwVF3zVmmToNcOfGC+CRDpfK/U584fMg38ZHCaElKQ==", - "dev": true, "dependencies": { "color-name": "~1.1.4" }, @@ -5598,14 +5879,12 @@ "node_modules/eslint/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==", - "dev": true + "integrity": "sha512-dOy+3AuW3a2wNbZHIuMZpTcgjGuLU/uBL/ubcZF9OXbDo8ff4O8yVp5Bf0efS8uEoYo5q4Fx7dY9OgQGXgAsQA==" }, "node_modules/eslint/node_modules/escape-string-regexp": { "version": "4.0.0", "resolved": "https://registry.npmjs.org/escape-string-regexp/-/escape-string-regexp-4.0.0.tgz", "integrity": "sha512-TtpcNJ3XAzx3Gq8sWRzJaVajRs0uVxA2YAkdb1jm2YkPz4G6egUFAyA3n5vtEIZefPk5Wa4UXbKuS5fKkJWdgA==", - "dev": true, "engines": { "node": ">=10" }, @@ -5613,11 +5892,44 @@ "url": "https://github.com/sponsors/sindresorhus" } }, + "node_modules/eslint/node_modules/eslint-scope": { + "version": "7.2.2", + "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.2.tgz", + "integrity": "sha512-dOt21O7lTMhDM+X9mB4GX+DZrZtCUJPL/wlcTqxyrx5IvO0IYtILdtrQGQp+8n5S0gwSVmOf9NQrjMOgfQZlIg==", + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, + "node_modules/eslint/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/eslint/node_modules/glob-parent": { "version": "6.0.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-6.0.2.tgz", "integrity": "sha512-XxwI8EOhVQgWp6iDL+3b0r86f4d6AX6zSU55HfB4ydCEuXLXc5FcYeOu+nnGftS4TEju/11rt4KJPTMgbfmv4A==", - "dev": true, "dependencies": { "is-glob": "^4.0.3" }, @@ -5629,7 +5941,6 @@ "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", "integrity": "sha512-AhO5QUcj8llrbG09iWhPU2B204J1xnPeL8kQmVorSsy+Sjj1sk8gIyh6cUocGmH4L0UuhAJy+hJMRA4mgA4mFQ==", - "dev": true, "dependencies": { "type-fest": "^0.20.2" }, @@ -5644,7 +5955,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz", "integrity": "sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -5653,7 +5963,6 @@ "version": "7.2.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-7.2.0.tgz", "integrity": "sha512-qpCAvRl9stuOHveKsn7HncJRvv501qIacKzQlO/+Lwxc9+0q2wLyv4Dfvt80/DPn2pqOBsJdDiogXGR9+OvwRw==", - "dev": true, "dependencies": { "has-flag": "^4.0.0" }, @@ -5665,7 +5974,6 @@ "version": "0.20.2", "resolved": "https://registry.npmjs.org/type-fest/-/type-fest-0.20.2.tgz", "integrity": "sha512-Ne+eE4r0/iWnpAxD852z3A+N0Bt5RN//NjJwRd2VFHEmrywxf5vsZlh4R6lixl6B+wz/8d+maTSAkN1FIkI3LQ==", - "dev": true, "engines": { "node": ">=10" }, @@ -5677,7 +5985,6 @@ "version": "9.6.1", "resolved": "https://registry.npmjs.org/espree/-/espree-9.6.1.tgz", "integrity": "sha512-oruZaFkjorTpF32kDSI5/75ViwGeZginGGy2NoOSg3Q9bnwlnmDm4HLnkl0RE3n+njDXR037aY1+x58Z/zFdwQ==", - "dev": true, "dependencies": { "acorn": "^8.9.0", "acorn-jsx": "^5.3.2", @@ -5690,6 +5997,17 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/espree/node_modules/eslint-visitor-keys": { + "version": "3.4.3", + "resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.3.tgz", + "integrity": "sha512-wpc+LXeiyiisxPlEkUzU6svyS1frIO3Mgxj1fdy7Pm8Ygzguax2N3Fa/D/ag1WqbOprdI+uY6wMUl8/a2G+iag==", + "engines": { + "node": "^12.22.0 || ^14.17.0 || >=16.0.0" + }, + "funding": { + "url": "https://opencollective.com/eslint" + } + }, "node_modules/esprima": { "version": "4.0.1", "resolved": "https://registry.npmjs.org/esprima/-/esprima-4.0.1.tgz", @@ -5707,7 +6025,6 @@ "version": "1.5.0", "resolved": "https://registry.npmjs.org/esquery/-/esquery-1.5.0.tgz", "integrity": "sha512-YQLXUplAwJgCydQ78IMJywZCceoqk1oH01OERdSAJc/7U2AylwjhSCLDEtqwg811idIS/9fIU5GjG73IgjKMVg==", - "dev": true, "dependencies": { "estraverse": "^5.1.0" }, @@ -5715,6 +6032,14 @@ "node": ">=0.10" } }, + "node_modules/esquery/node_modules/estraverse": { + "version": "5.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", + "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", + "engines": { + "node": ">=4.0" + } + }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -5726,7 +6051,7 @@ "node": ">=4.0" } }, - "node_modules/estraverse": { + "node_modules/esrecurse/node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -5734,11 +6059,18 @@ "node": ">=4.0" } }, + "node_modules/estraverse": { + "version": "4.3.0", + "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", + "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", + "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==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -5873,7 +6205,6 @@ "version": "3.3.2", "resolved": "https://registry.npmjs.org/fast-glob/-/fast-glob-3.3.2.tgz", "integrity": "sha512-oX2ruAFQwf/Orj8m737Y5adxDQO0LAB7/S5MnxCdTNDd4p6BsyIVsv9JQsATbTSq8KHRpLwIHbVlUNatxd+1Ow==", - "dev": true, "dependencies": { "@nodelib/fs.stat": "^2.0.2", "@nodelib/fs.walk": "^1.2.3", @@ -5893,8 +6224,7 @@ "node_modules/fast-levenshtein": { "version": "2.0.6", "resolved": "https://registry.npmjs.org/fast-levenshtein/-/fast-levenshtein-2.0.6.tgz", - "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==", - "dev": true + "integrity": "sha512-DCXu6Ifhqcks7TZKY3Hxp3y6qphY5SJZmrWMDrKcERSOXWQdMhU9Ig/PYrzyw/ul9jOIyh0N4M0tbC5hodg8dw==" }, "node_modules/fast-safe-stringify": { "version": "2.1.1", @@ -5915,7 +6245,6 @@ "version": "1.17.1", "resolved": "https://registry.npmjs.org/fastq/-/fastq-1.17.1.tgz", "integrity": "sha512-sRVD3lWVIXWg6By68ZN7vho9a1pQcN/WBFaAAsDDFzlJjvoGx0P8z7V1t72grFJfJhu3YPZBuu25f7Kaw2jN1w==", - "dev": true, "dependencies": { "reusify": "^1.0.4" } @@ -5939,7 +6268,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/file-entry-cache/-/file-entry-cache-6.0.1.tgz", "integrity": "sha512-7Gps/XWymbLk2QLYK4NzpMOrYjMhdIxXuIvy2QBsLE6ljuodKvdkWs/cpyJJ3CVIVpH0Oi1Hvg1ovbMzLdFBBg==", - "dev": true, "dependencies": { "flat-cache": "^3.0.4" }, @@ -6003,7 +6331,6 @@ "version": "7.0.1", "resolved": "https://registry.npmjs.org/fill-range/-/fill-range-7.0.1.tgz", "integrity": "sha512-qOo9F+dMUmC2Lcb4BbVvnKJxTPjCm+RRpe4gDuGrzkL7mEVl/djYSu2OdQ2Pa302N4oqkSg9ir6jaLWJ2USVpQ==", - "dev": true, "dependencies": { "to-regex-range": "^5.0.1" }, @@ -6036,7 +6363,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/find-up/-/find-up-5.0.0.tgz", "integrity": "sha512-78/PXT1wlLLDgTzDs7sjq9hzz0vXD+zn+7wypEe4fXQxCmdmqfGsEPQxmiCSQI3ajFV91bVSsvNtrJRiW6nGng==", - "dev": true, "dependencies": { "locate-path": "^6.0.0", "path-exists": "^4.0.0" @@ -6123,7 +6449,6 @@ "version": "3.2.0", "resolved": "https://registry.npmjs.org/flat-cache/-/flat-cache-3.2.0.tgz", "integrity": "sha512-CYcENa+FtcUKLmhhqyctpclsq7QF38pKjZHsGNiSQF5r4FtoKDWabFDl3hzaEQMvT1LHEysw5twgLvpYYb4vbw==", - "dev": true, "dependencies": { "flatted": "^3.2.9", "keyv": "^4.5.3", @@ -6136,8 +6461,7 @@ "node_modules/flatted": { "version": "3.3.1", "resolved": "https://registry.npmjs.org/flatted/-/flatted-3.3.1.tgz", - "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==", - "dev": true + "integrity": "sha512-X8cqMLLie7KsNUDSdzeN8FYK9rEt4Dt67OsG/DNGnYTSDBG4uFAJFBnUeiV+zCVAvwFy56IjM9sH51jVaEhNxw==" }, "node_modules/for-each": { "version": "0.3.3", @@ -6227,8 +6551,7 @@ "node_modules/fs.realpath": { "version": "1.0.0", "resolved": "https://registry.npmjs.org/fs.realpath/-/fs.realpath-1.0.0.tgz", - "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==", - "dev": true + "integrity": "sha512-OO0pH2lK6a0hZnAdau5ItzHPI6pUlvI7jMVnxUQRtw4owF2wk8lOSabtGDCTP4Ggrg2MbGnWO9X8K1t4+fGMDw==" }, "node_modules/fsevents": { "version": "2.3.3", @@ -6277,7 +6600,6 @@ "version": "1.0.0-beta.2", "resolved": "https://registry.npmjs.org/gensync/-/gensync-1.0.0-beta.2.tgz", "integrity": "sha512-3hN7NaskYvMDLQY55gnW3NQ+mesEAepTqlg+VEbj7zzqEMBVNhzcGYYeqFo/TlYz6eQiFcp1HcsCZO+nGgS8zg==", - "dev": true, "engines": { "node": ">=6.9.0" } @@ -6347,7 +6669,6 @@ "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", "integrity": "sha512-nFR0zLpU2YCaRxwoCJvL6UvCH2JFyFVIvwTLsIf21AuHlMskA1hhTdk+LlYJtOlYt9v6dvszD2BGRqBL+iQK9Q==", - "dev": true, "dependencies": { "fs.realpath": "^1.0.0", "inflight": "^1.0.4", @@ -6367,7 +6688,6 @@ "version": "5.1.2", "resolved": "https://registry.npmjs.org/glob-parent/-/glob-parent-5.1.2.tgz", "integrity": "sha512-AOIgSQCepiJYwP3ARnGx+5VnTu2HBYdzbGP45eLw1vr3zB3vZLeyed1sC9hnbcOc9/SrMyM5RPQrkGz4aS9Zow==", - "dev": true, "dependencies": { "is-glob": "^4.0.1" }, @@ -6426,7 +6746,6 @@ "version": "11.12.0", "resolved": "https://registry.npmjs.org/globals/-/globals-11.12.0.tgz", "integrity": "sha512-WOBp/EEGUiIsJSp7wcv/y6MO+lV9UoncWqxuFfm8eBwzWNgyfBd6Gz+IeKQ9jCmyhoH99g15M3T+QaVHFjizVA==", - "dev": true, "engines": { "node": ">=4" } @@ -6435,7 +6754,6 @@ "version": "11.1.0", "resolved": "https://registry.npmjs.org/globby/-/globby-11.1.0.tgz", "integrity": "sha512-jhIXaOzy1sb8IyocaruWSn1TjmnBVs8Ayhcy83rmxNJ8q2uWKCAj3CnJY+KpGSXCueAPc0i05kVvVKtP1t9S3g==", - "dev": true, "dependencies": { "array-union": "^2.1.0", "dir-glob": "^3.0.1", @@ -6455,7 +6773,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/slash/-/slash-3.0.0.tgz", "integrity": "sha512-g9Q1haeby36OSStwb4ntCGGGaKsaVSjQ68fBxoQcutl5fS1vuY18H3wSt3jFyFtrkx+Kz0V1G85A4MyAdDMi2Q==", - "dev": true, "engines": { "node": ">=8" } @@ -6480,8 +6797,7 @@ "node_modules/graphemer": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/graphemer/-/graphemer-1.4.0.tgz", - "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==", - "dev": true + "integrity": "sha512-EtKwoO6kxCL9WO5xipiHTZlSzBm7WLT627TqC/uVRd0HKmq8NXyebnNYxDoBi7wt8eTWrUrKXCOVaFq9x1kgag==" }, "node_modules/grouped-queue": { "version": "2.0.0", @@ -6957,7 +7273,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/has-flag/-/has-flag-3.0.0.tgz", "integrity": "sha512-sKJf1+ceQBr4SMkvQnBDNDtf4TXpVhVGateu0t918bl30FnbE2m4vNLX+VWe/dpjlb+HugGYzW7uQXH98HPEYw==", - "dev": true, "engines": { "node": ">=4" } @@ -7268,7 +7583,6 @@ "version": "5.3.1", "resolved": "https://registry.npmjs.org/ignore/-/ignore-5.3.1.tgz", "integrity": "sha512-5Fytz/IraMjqpwfd34ke28PTVMjZjJG2MPn5t7OE4eUCUNf8BAa7b5WUS9/Qvr6mwOQS7Mk6vdsMno5he+T8Xw==", - "dev": true, "engines": { "node": ">= 4" } @@ -7289,7 +7603,6 @@ "version": "3.3.0", "resolved": "https://registry.npmjs.org/import-fresh/-/import-fresh-3.3.0.tgz", "integrity": "sha512-veYYhQa+D1QBKznvhUHxb8faxlrwUnxseDAbAp457E0wLNio2bOSKnjYDhMj+YiAq61xrMGhQk9iXVk5FzgQMw==", - "dev": true, "dependencies": { "parent-module": "^1.0.0", "resolve-from": "^4.0.0" @@ -7324,7 +7637,6 @@ "version": "0.1.4", "resolved": "https://registry.npmjs.org/imurmurhash/-/imurmurhash-0.1.4.tgz", "integrity": "sha512-JmXMZ6wuvDmLiHEml9ykzqO6lwFbof0GG4IkcGaENdCRDDmMVnny7s5HsIgHCbaq0w2MyPhDqkhTUgS2LU2PHA==", - "dev": true, "engines": { "node": ">=0.8.19" } @@ -7348,7 +7660,6 @@ "version": "1.0.6", "resolved": "https://registry.npmjs.org/inflight/-/inflight-1.0.6.tgz", "integrity": "sha512-k92I/b08q4wvFscXCLvqfsHCrjrF7yiXsQuIVvVE7N82W3+aqpzuUdBbfhWcy/FZR3/4IgflMgKLOsvPDrGCJA==", - "dev": true, "dependencies": { "once": "^1.3.0", "wrappy": "1" @@ -7357,8 +7668,7 @@ "node_modules/inherits": { "version": "2.0.4", "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.4.tgz", - "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==", - "dev": true + "integrity": "sha512-k/vGaX4/Yla3WzyMCvTQOXYeIHvqOKtnqBduzTHpzpQZzAskKMhZ2K+EnBiSM9zGSoIFeMpXKxa4dYeZIQqewQ==" }, "node_modules/ini": { "version": "1.3.8", @@ -7592,7 +7902,6 @@ "version": "2.1.1", "resolved": "https://registry.npmjs.org/is-extglob/-/is-extglob-2.1.1.tgz", "integrity": "sha512-SbKbANkN603Vi4jEZv49LeVJMn4yGwsbzZworEoyEiutsN3nJYdbO36zfhGJ6QEDpOZIFkDtnq5JRxmvl3jsoQ==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -7625,7 +7934,6 @@ "version": "4.0.3", "resolved": "https://registry.npmjs.org/is-glob/-/is-glob-4.0.3.tgz", "integrity": "sha512-xelSayHH36ZgE7ZWhli7pW34hNbNl8Ojv5KVmkJD4hBdD3th8Tfk9vYasLM+mXWOZhFkgZfxhLSnrwRr4elSSg==", - "dev": true, "dependencies": { "is-extglob": "^2.1.1" }, @@ -7652,7 +7960,6 @@ "version": "7.0.0", "resolved": "https://registry.npmjs.org/is-number/-/is-number-7.0.0.tgz", "integrity": "sha512-41Cifkg6e8TylSpdtTpeLVMqvSBEVzTttHvERD741+pnZ8ANv0004MRL43QKPDlK9cGvNp6NZWZUBlbGXYxxng==", - "dev": true, "engines": { "node": ">=0.12.0" } @@ -7661,7 +7968,6 @@ "version": "3.0.3", "resolved": "https://registry.npmjs.org/is-path-inside/-/is-path-inside-3.0.3.tgz", "integrity": "sha512-Fd4gABb+ycGAmKou8eMftCupSir5lRxqf4aD/vd0cD2qc4HL07OjCeuHMr8Ro4CoMaeCKDB0/ECBOVWjTwUvPQ==", - "dev": true, "engines": { "node": ">=8" } @@ -7798,8 +8104,7 @@ "node_modules/isexe": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/isexe/-/isexe-2.0.0.tgz", - "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==", - "dev": true + "integrity": "sha512-RHxMLp9lnKHGHRng9QFhRCMbYAcVpn69smSGcq3f36xjgVVWThj4qqLbTLlq7Ssj8B+fIQ1EuCEGI2lKsyQeIw==" }, "node_modules/isobject": { "version": "3.0.1", @@ -7965,14 +8270,12 @@ "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==", - "dev": true + "integrity": "sha512-RdJUflcE3cUzKiMqQgsCu06FPu9UdIJO0beYbPhHN4k6apgJtifcoCtT9bcxOpYBtpD2kCM6Sbzg4CausW/PKQ==" }, "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==", - "dev": true, "dependencies": { "argparse": "^2.0.1" }, @@ -8150,7 +8453,6 @@ "version": "2.5.2", "resolved": "https://registry.npmjs.org/jsesc/-/jsesc-2.5.2.tgz", "integrity": "sha512-OYu7XEzjkCQ3C5Ps3QIZsQfNpqoJyZZA99wd9aWd05NCtC5pWOkShK2mkL6HXQR6/Cy2lbNdPlZBpuQHXE63gA==", - "dev": true, "bin": { "jsesc": "bin/jsesc" }, @@ -8161,8 +8463,7 @@ "node_modules/json-buffer": { "version": "3.0.1", "resolved": "https://registry.npmjs.org/json-buffer/-/json-buffer-3.0.1.tgz", - "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==", - "dev": true + "integrity": "sha512-4bV5BfR2mqfQTJm+V5tPPdf+ZpuhiIvTuAB5g8kcrXOZpTT/QwwVRWBywX1ozr6lEuPdbHxwaJlm9G6mI2sfSQ==" }, "node_modules/json-parse-even-better-errors": { "version": "2.3.1", @@ -8177,8 +8478,7 @@ "node_modules/json-stable-stringify-without-jsonify": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/json-stable-stringify-without-jsonify/-/json-stable-stringify-without-jsonify-1.0.1.tgz", - "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==", - "dev": true + "integrity": "sha512-Bdboy+l7tA3OGW6FjyFHWkP5LuByj1Tk33Ljyq0axyzdk9//JSi2u3fP1QSmd1KNwq6VOKYGlAu87CisVir6Pw==" }, "node_modules/json-stringify-nice": { "version": "1.1.4", @@ -8193,7 +8493,6 @@ "version": "2.2.3", "resolved": "https://registry.npmjs.org/json5/-/json5-2.2.3.tgz", "integrity": "sha512-XmOWe7eyHYH14cLdVPoyg+GOH3rYX++KpzrylJwSW98t3Nk+U8XOl8FWKOgwtzdb8lXGf6zYwDUzeHMWfxasyg==", - "dev": true, "bin": { "json5": "lib/cli.js" }, @@ -8242,7 +8541,6 @@ "version": "4.5.4", "resolved": "https://registry.npmjs.org/keyv/-/keyv-4.5.4.tgz", "integrity": "sha512-oxVHkHR/EJf2CNXnWxRLW6mg7JyCCUcG0DtEGmL2ctUo1PNTin1PUil+r/+4r5MpVgC/fn1kjsx7mjSujKqIpw==", - "dev": true, "dependencies": { "json-buffer": "3.0.1" } @@ -8279,7 +8577,6 @@ "version": "0.4.1", "resolved": "https://registry.npmjs.org/levn/-/levn-0.4.1.tgz", "integrity": "sha512-+bT2uH4E5LGE7h/n3evcS/sQlJXCpIp6ym8OWJ5eV6+67Dsql/LaaT7qJBAt2rzfoa/5QBGBhxDix1dMt2kQKQ==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1", "type-check": "~0.4.0" @@ -8401,7 +8698,6 @@ "version": "6.0.0", "resolved": "https://registry.npmjs.org/locate-path/-/locate-path-6.0.0.tgz", "integrity": "sha512-iPZK6eYjbxRu3uB4/WZ3EsEIMJFMqAoopl3R+zuq0UjcAm/MO6KCweDgPfP3elTztoKP3KtnVHxTn2NHBSDVUw==", - "dev": true, "dependencies": { "p-locate": "^5.0.0" }, @@ -8439,8 +8735,7 @@ "node_modules/lodash.merge": { "version": "4.6.2", "resolved": "https://registry.npmjs.org/lodash.merge/-/lodash.merge-4.6.2.tgz", - "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==", - "dev": true + "integrity": "sha512-0KpjqXRVvrYyCsX1swR/XTK0va6VQkQM6MNo7PqW77ByjAhoARA8EfrP1N4+KlKj8YS0ZUCtRT/YUuhyYDujIQ==" }, "node_modules/lodash.omit": { "version": "4.5.0", @@ -8553,7 +8848,6 @@ "version": "5.1.1", "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-5.1.1.tgz", "integrity": "sha512-KpNARQA3Iwv+jTA0utUVVbrh+Jlrr1Fv0e56GGzAFOXN7dk/FviaDW8LHmK52DlcH4WP2n6gI8vN1aesBFgo9w==", - "dev": true, "dependencies": { "yallist": "^3.0.2" } @@ -8902,7 +9196,6 @@ "version": "1.4.1", "resolved": "https://registry.npmjs.org/merge2/-/merge2-1.4.1.tgz", "integrity": "sha512-8q7VEgMJW4J8tcfVPy8g09NcQwZdbwFEqhe/WZkoIzjn/3TGDwtOCYtXGxA3O8tPzpczCCDgv+P2P5y00ZJOOg==", - "dev": true, "engines": { "node": ">= 8" } @@ -8911,7 +9204,6 @@ "version": "4.0.5", "resolved": "https://registry.npmjs.org/micromatch/-/micromatch-4.0.5.tgz", "integrity": "sha512-DMy+ERcEW2q8Z2Po+WNXuw3c5YaUSFjAO5GsJqfEl7UjvtIuFKO6ZrKvcItdy98dwFI2N1tg3zNIdKaQT+aNdA==", - "dev": true, "dependencies": { "braces": "^3.0.2", "picomatch": "^2.3.1" @@ -8983,7 +9275,6 @@ "version": "3.1.2", "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", - "dev": true, "dependencies": { "brace-expansion": "^1.1.7" }, @@ -9182,8 +9473,7 @@ "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==", - "dev": true + "integrity": "sha512-sGkPx+VjMtmA6MX27oA4FBFELFCZZ4S4XqeGOXCv68tT+jb3vk/RyaKWP0PTKyWtmLSM0b+adUTEvbs1PEaH2w==" }, "node_modules/multimatch": { "version": "5.0.0", @@ -9213,8 +9503,7 @@ "node_modules/natural-compare": { "version": "1.4.0", "resolved": "https://registry.npmjs.org/natural-compare/-/natural-compare-1.4.0.tgz", - "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==", - "dev": true + "integrity": "sha512-OWND8ei3VtNC9h7V60qff3SVobHr996CTwgxubgyQYEpg290h9J0buyECNNJexkFm5sOajh5G116RYA1c8ZMSw==" }, "node_modules/negotiator": { "version": "0.6.3", @@ -10016,7 +10305,6 @@ "version": "1.4.0", "resolved": "https://registry.npmjs.org/once/-/once-1.4.0.tgz", "integrity": "sha512-lNaJgI+2Q5URQBkccEKHTQOPaXdUxnZZElQTZY0MFUAuaEqe1E+Nyvgdz/aIyNi6Z9MzO5dv1H8n58/GELp3+w==", - "dev": true, "dependencies": { "wrappy": "1" } @@ -10040,7 +10328,6 @@ "version": "0.9.3", "resolved": "https://registry.npmjs.org/optionator/-/optionator-0.9.3.tgz", "integrity": "sha512-JjCoypp+jKn1ttEFExxhetCKeJt9zhAgAve5FXHixTvFDW/5aEktX9bufBKLRRMdU7bNtpLfcGu94B3cdEJgjg==", - "dev": true, "dependencies": { "@aashutoshrathi/word-wrap": "^1.2.3", "deep-is": "^0.1.3", @@ -10202,7 +10489,6 @@ "version": "3.1.0", "resolved": "https://registry.npmjs.org/p-limit/-/p-limit-3.1.0.tgz", "integrity": "sha512-TYOanM3wGwNGsZN2cVTYPArw454xnXj5qmWF1bEoAc4+cU/ol7GVh7odevjp1FNHduHc3KZMcFduxU5Xc6uJRQ==", - "dev": true, "dependencies": { "yocto-queue": "^0.1.0" }, @@ -10217,7 +10503,6 @@ "version": "5.0.0", "resolved": "https://registry.npmjs.org/p-locate/-/p-locate-5.0.0.tgz", "integrity": "sha512-LaNjtRWUBY++zB5nE/NwcaoMylSPk+S+ZHNB1TzdbMJMny6dynpAGt7X/tl/QYq3TIeE6nxHppbo2LGymrG5Pw==", - "dev": true, "dependencies": { "p-limit": "^3.0.2" }, @@ -10346,7 +10631,6 @@ "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==", - "dev": true, "dependencies": { "callsites": "^3.0.0" }, @@ -10461,7 +10745,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-exists/-/path-exists-4.0.0.tgz", "integrity": "sha512-ak9Qy5Q7jYb2Wwcey5Fpvg2KoAc/ZIhLSLOSBmRmygPsGwkVVt0fZa0qrtMz+m6tJTAHfZQ8FnmB4MG4LWy7/w==", - "dev": true, "engines": { "node": ">=8" } @@ -10470,7 +10753,6 @@ "version": "1.0.1", "resolved": "https://registry.npmjs.org/path-is-absolute/-/path-is-absolute-1.0.1.tgz", "integrity": "sha512-AVbw3UJ2e9bq64vSaS9Am0fje1Pa8pbGqTTsmXfaIiMpnr5DlDhfJOuLj9Sf95ZPVDAUerDfEk88MPmPe7UCQg==", - "dev": true, "engines": { "node": ">=0.10.0" } @@ -10479,7 +10761,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/path-key/-/path-key-3.1.1.tgz", "integrity": "sha512-ojmeN0qd+y0jszEtoY48r0Peq5dwMEkIlCOu6Q5f41lfkswXuKtYrhgoTpLnyIcHm24Uhqx+5Tqm2InSwLhE6Q==", - "dev": true, "engines": { "node": ">=8" } @@ -10558,7 +10839,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz", "integrity": "sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw==", - "dev": true, "engines": { "node": ">=8" } @@ -10588,7 +10868,6 @@ "version": "2.3.1", "resolved": "https://registry.npmjs.org/picomatch/-/picomatch-2.3.1.tgz", "integrity": "sha512-JU3teHTNjmE2VCGFzuY8EXzCDVwEqB2a8fsIvwaStHhAWJEeVd1o1QD80CU6+ZdEXXSLbSsuLwJjkCBWqRQUVA==", - "dev": true, "engines": { "node": ">=8.6" }, @@ -10697,7 +10976,6 @@ "version": "1.2.1", "resolved": "https://registry.npmjs.org/prelude-ls/-/prelude-ls-1.2.1.tgz", "integrity": "sha512-vkcDPrRZo1QZLbn5RLGPpg/WmIQ65qoWWhcGKf/b5eplkkarX0m9z8ppCat4mlOqUsWpyNuYgO3VRyrYHSzX5g==", - "dev": true, "engines": { "node": ">= 0.8.0" } @@ -10841,7 +11119,6 @@ "version": "1.2.3", "resolved": "https://registry.npmjs.org/queue-microtask/-/queue-microtask-1.2.3.tgz", "integrity": "sha512-NuaNSa6flKT5JaSYQzJok04JzTL1CA6aGhv5rfLW3PgqA+M2ChpZQnAC8h8i4ZFkBS8X5RqkDBHA7r4hej3K9A==", - "dev": true, "funding": [ { "type": "github", @@ -11501,7 +11778,6 @@ "version": "4.0.0", "resolved": "https://registry.npmjs.org/resolve-from/-/resolve-from-4.0.0.tgz", "integrity": "sha512-pb/MYmXstAkysRFx8piNI1tGFNQIFA3vkE3Gq4EuA1dF6gHp/+vgZqsCGJapvy8N3Q+4o7FwvquPJcnZ7RYy4g==", - "dev": true, "engines": { "node": ">=4" } @@ -11532,7 +11808,6 @@ "version": "1.0.4", "resolved": "https://registry.npmjs.org/reusify/-/reusify-1.0.4.tgz", "integrity": "sha512-U9nH88a3fc/ekCF1l0/UP1IosiuIjyTh7hBvXVMHYgVcfGvt897Xguj2UOLDeI5BG2m7/uwyaLVT6fbtCwTyzw==", - "dev": true, "engines": { "iojs": ">=1.0.0", "node": ">=0.10.0" @@ -11542,7 +11817,6 @@ "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", "integrity": "sha512-JZkJMZkAGFFPP2YqXZXPbMlMBgsxzE8ILs4lMIX/2o0L9UBw9O/Y3o6wFw/i9YLapcUJWwqbi3kdxIPdC62TIA==", - "dev": true, "dependencies": { "glob": "^7.1.3" }, @@ -11576,7 +11850,6 @@ "version": "1.2.0", "resolved": "https://registry.npmjs.org/run-parallel/-/run-parallel-1.2.0.tgz", "integrity": "sha512-5l4VyZR86LZ/lDxZTR6jqL8AFE2S0IFLMP26AbjsLVADxHdhB/c0GUsH+y39UfCi3dzz8OlQuPmnaJOMoDHQBA==", - "dev": true, "funding": [ { "type": "github", @@ -11659,7 +11932,6 @@ "version": "6.3.1", "resolved": "https://registry.npmjs.org/semver/-/semver-6.3.1.tgz", "integrity": "sha512-BR7VvDCVHO+q2xBEWskxS6DJE1qRnb7DxzUrogb71CWoSficBxYsiAGd+Kl0mmq/MprG9yArRkyrQxTO6XjMzA==", - "dev": true, "bin": { "semver": "bin/semver.js" } @@ -11733,7 +12005,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/shebang-command/-/shebang-command-2.0.0.tgz", "integrity": "sha512-kHxr2zZpYtdmrN1qDjrrX/Z1rR1kG8Dx+gkpK1G4eXmvXswmcE1hTWBWYUzlraYw1/yZp6YuDY77YtvbN0dmDA==", - "dev": true, "dependencies": { "shebang-regex": "^3.0.0" }, @@ -11745,7 +12016,6 @@ "version": "3.0.0", "resolved": "https://registry.npmjs.org/shebang-regex/-/shebang-regex-3.0.0.tgz", "integrity": "sha512-7++dFhtcx3353uBaq8DDR4NuxBetBzC7ZQOhmTQInHEd6bSrXdiEyzCvG07Z44UYdLShWUyXt5M/yhz8ekcb1A==", - "dev": true, "engines": { "node": ">=8" } @@ -12461,7 +12731,6 @@ "version": "6.0.1", "resolved": "https://registry.npmjs.org/strip-ansi/-/strip-ansi-6.0.1.tgz", "integrity": "sha512-Y38VPSHcqkFrCpFnQ9vuSXmquuv5oXOKpGeT6aGrr3o3Gc9AlVa6JBfUSOCnbxGGZF+/0ooI7KrPuUSztUdU5A==", - "dev": true, "dependencies": { "ansi-regex": "^5.0.1" }, @@ -12532,7 +12801,6 @@ "version": "3.1.1", "resolved": "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz", "integrity": "sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig==", - "dev": true, "engines": { "node": ">=8" }, @@ -12553,7 +12821,6 @@ "version": "5.5.0", "resolved": "https://registry.npmjs.org/supports-color/-/supports-color-5.5.0.tgz", "integrity": "sha512-QjVjwdXIt408MIiAqCX4oUKsgU2EqAGzs2Ppkm4aQYbjm+ZEWEcW4SfFNTr4uMNZma0ey4f5lgLrkB0aX0QMow==", - "dev": true, "dependencies": { "has-flag": "^3.0.0" }, @@ -12739,8 +13006,7 @@ "node_modules/text-table": { "version": "0.2.0", "resolved": "https://registry.npmjs.org/text-table/-/text-table-0.2.0.tgz", - "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==", - "dev": true + "integrity": "sha512-N+8UisAXDGk8PFXP4HAzVR9nbfmVJ3zYLAWiTIoqC5v5isinhr+r5uaO8+7r3BMfuNIufIsA7RdpVgacC2cSpw==" }, "node_modules/textextensions": { "version": "5.16.0", @@ -12798,7 +13064,6 @@ "version": "2.0.0", "resolved": "https://registry.npmjs.org/to-fast-properties/-/to-fast-properties-2.0.0.tgz", "integrity": "sha512-/OaKK0xYrs3DmxRYqL/yDc+FxFUVYhDlXMhRmv3z915w2HF1tnN1omB354j8VUGO/hbRzyD6Y3sA7v7GS/ceog==", - "dev": true, "engines": { "node": ">=4" } @@ -12807,7 +13072,6 @@ "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==", - "dev": true, "dependencies": { "is-number": "^7.0.0" }, @@ -12827,6 +13091,17 @@ "integrity": "sha512-whw60l7r+8ZU8Tu/Uc2yxtc4ZTZbR/PF3u1IPNKGQ6p8EICLb3Z2lAgoqw9bqYd8IkgnsaOcLzYHFckjqNsf0g==", "dev": true }, + "node_modules/ts-api-utils": { + "version": "1.3.0", + "resolved": "https://registry.npmjs.org/ts-api-utils/-/ts-api-utils-1.3.0.tgz", + "integrity": "sha512-UQMIo7pb8WRomKR1/+MFVLTroIvDVtMX3K6OUir8ynLyzB8Jeriont2bTAtmNPa1ekAgN7YPDyf6V+ygrdU+eQ==", + "engines": { + "node": ">=16" + }, + "peerDependencies": { + "typescript": ">=4.2.0" + } + }, "node_modules/ts-loader": { "version": "9.5.1", "resolved": "https://registry.npmjs.org/ts-loader/-/ts-loader-9.5.1.tgz", @@ -13333,7 +13608,6 @@ "version": "0.4.0", "resolved": "https://registry.npmjs.org/type-check/-/type-check-0.4.0.tgz", "integrity": "sha512-XleUoc9uwGXqjWwXaUTZAmzMcFZ5858QA2vvx1Ur5xIcixXIP+8LnFDgRplU30us6teqdlskFfu+ae4K79Ooew==", - "dev": true, "dependencies": { "prelude-ls": "^1.2.1" }, @@ -13363,7 +13637,6 @@ "version": "5.4.2", "resolved": "https://registry.npmjs.org/typescript/-/typescript-5.4.2.tgz", "integrity": "sha512-+2/g0Fds1ERlP6JsakQQDXjZdZMM+rqpamFZJEKh4kwTIn3iDkgKtby0CeNd5ATNZ4Ry1ax15TMx0W2V+miizQ==", - "dev": true, "bin": { "tsc": "bin/tsc", "tsserver": "bin/tsserver" @@ -13926,26 +14199,6 @@ "webpack": "^4.x.x || ^5.0.0" } }, - "node_modules/webpack/node_modules/eslint-scope": { - "version": "5.1.1", - "resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-5.1.1.tgz", - "integrity": "sha512-2NxwbF/hZ0KpepYN0cNbo+FN6XoK7GaHlQhgx/hIZl6Va0bF45RQOOwhLIy8lQDbuCiadSLCBnH2CFYquit5bw==", - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^4.1.1" - }, - "engines": { - "node": ">=8.0.0" - } - }, - "node_modules/webpack/node_modules/estraverse": { - "version": "4.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-4.3.0.tgz", - "integrity": "sha512-39nnKffWz8xN1BU/2c79n9nB9HDzo0niYUqx6xyqUnyoAnQyyWpOTdZEeiCch8BBu515t4wp9ZmgVfVhn9EBpw==", - "engines": { - "node": ">=4.0" - } - }, "node_modules/whatwg-url": { "version": "5.0.0", "resolved": "https://registry.npmjs.org/whatwg-url/-/whatwg-url-5.0.0.tgz", @@ -13960,7 +14213,6 @@ "version": "2.0.2", "resolved": "https://registry.npmjs.org/which/-/which-2.0.2.tgz", "integrity": "sha512-BLI3Tl1TW3Pvl70l3yq3Y64i+awpwXqsGBYWkkqMtnbXgrMD+yj7rhW0kuEDxzJaYXGjEW5ogapKNMEKNMjibA==", - "dev": true, "dependencies": { "isexe": "^2.0.0" }, @@ -14147,8 +14399,7 @@ "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==", - "dev": true + "integrity": "sha512-l4Sp/DRseor9wL6EvV2+TuQn63dMkPjZ/sp9XkghTEbV9KlPS1xUsZ3u7/IQO4wxtcFB4bgpQPRcR3QCvezPcQ==" }, "node_modules/write-file-atomic": { "version": "4.0.2", @@ -14181,8 +14432,7 @@ "node_modules/yallist": { "version": "3.1.1", "resolved": "https://registry.npmjs.org/yallist/-/yallist-3.1.1.tgz", - "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==", - "dev": true + "integrity": "sha512-a4UGQaWPH59mOXUYnAG2ewncQS4i4F43Tv3JoAM+s2VDAmS9NsK8GpDMLrCHPksFT7h3K6TOoUNn2pb7RoXx4g==" }, "node_modules/yeoman-environment": { "version": "3.19.3", @@ -15422,7 +15672,6 @@ "version": "0.1.0", "resolved": "https://registry.npmjs.org/yocto-queue/-/yocto-queue-0.1.0.tgz", "integrity": "sha512-rVksvsnNCdJ/ohGc6xgPwyN8eheCxsiLM8mxuE/t/mOVqJewPuO1miLpTHQiRgTKCLexL4MeAFVagts7HmNZ2Q==", - "dev": true, "engines": { "node": ">=10" }, diff --git a/package.json b/package.json index 3ab2694..c71caa5 100644 --- a/package.json +++ b/package.json @@ -1,5 +1,5 @@ { - "version": "1.0.0", + "version": "1.1.0", "name": "mybb-april-fools", "description": "Система первоапрельских розыгрышей для форумов MyBB", "homepage": "https://forumd.ru/viewtopic.php?id=7372", @@ -11,7 +11,7 @@ "license": "https://forumd.ru/viewtopic.php?id=5751#rule", "devDependencies": { "@babel/cli": "^7.21.0", - "@babel/core": "^7.21.3", + "@babel/core": "^7.24.3", "@babel/preset-env": "^7.20.2", "@babel/preset-typescript": "^7.21.0", "@types/jquery": "^3.5.16", @@ -46,6 +46,8 @@ "watch": "webpack --watch" }, "dependencies": { + "@babel/eslint-parser": "^7.24.1", + "@typescript-eslint/eslint-plugin": "^7.3.1", "cursor-effects": "^1.0.11", "jquery": "^3.6.4", "webpack-utf8-bom": "^1.4.0" diff --git a/src/common.ts b/src/common.ts index 4d5a4cb..1ca4a14 100644 --- a/src/common.ts +++ b/src/common.ts @@ -1,14 +1,25 @@ -import $ from "jquery"; +import $ from 'jquery'; /** * Получение всех элементов, являющимися TextNode. - * Используется некоторыми шутками для уменьшения влияния на существующее DOM-дерево. + * Используется некоторыми шутками для уменьшения + * влияния на существующее DOM-дерево. + * + * @param {HTMLElement | JQuery | JQuery.Selector} root + * Элемет, у которого необходимо найти текстовые ноды + * + * @return {JQuery} */ export function getTextNodes( - root: any -): JQuery { - return $(root) - .find("*") - .contents() - .filter((_, node) => node.nodeType === Node.TEXT_NODE); + root: HTMLElement | JQuery | JQuery.Selector, +) + : JQuery { + // Это очень странный код, но надо успокоить ESLint + const $root = (typeof root === 'string') ? $(root) : $(root); + + return $root. + find('*'). + contents(). + filter((_, node) => node.nodeType === Node.TEXT_NODE); } + diff --git a/src/data/stupid_title_variants.ts b/src/data/stupid_title_variants.ts index 7868214..9d16c6c 100644 --- a/src/data/stupid_title_variants.ts +++ b/src/data/stupid_title_variants.ts @@ -1,56 +1,70 @@ import { StupidTitleVariants, - BuildStupdiTitleVariant, -} from "../jokes/stupid_title"; + BuildStupidTitleVariant, +} from '../jokes/stupid_title'; + +/** + * Метод, генерирующий стандартный список слов + * @param {StupidTitleVariants} vars + */ export function StupidTitleDefaultVariants(vars: StupidTitleVariants) { vars.adj = { - ...BuildStupdiTitleVariant( + ...BuildStupidTitleVariant( true, - "адекватный,$адский,активный,алчный,%ангельский,банальный,безнадёжный,$бесполезный,былой,верный,виртуальный,вкусный,воспитанный,выгодный,выходной,гигантский,$глупый,гордый,грамотный,громадный,грубый,далекий,двуличный,деятельный,доброжелательный,$жалкий,жёсткий,жестокий,$жирный,заинтересованный,запасной,застенчивый,знакомый,иностранный,истинный,конструктивный,креативный,ласковый,любимый,мелочный,^мирный,мстительный,небесный,невозможный,независимый,низкий,нужный,объективный,обыкновенный,опрятный,^оригинальный,особенный,острый,откровенный,открытый,пестрый,повседневный,подземный,пожилой,показательный,последний,посторонний,провинциальный,пышный,робкий,родной,самовлюблённый,северный,седой,семейный,серьёзный,сногсшибательный,^солнечный,спокойный,суровый,терпеливый,уверенный в себе,ударный,^удачливый,формальный,хладнокровный,целый,чистый,чрезвычайный,чужой,южный" + // eslint-disable-next-line max-len + 'адекватный,$адский,активный,алчный,%ангельский,банальный,безнадёжный,$бесполезный,былой,верный,виртуальный,вкусный,воспитанный,выгодный,выходной,гигантский,$глупый,гордый,грамотный,громадный,грубый,далекий,двуличный,деятельный,доброжелательный,$жалкий,жёсткий,жестокий,$жирный,заинтересованный,запасной,застенчивый,знакомый,иностранный,истинный,конструктивный,креативный,ласковый,любимый,мелочный,^мирный,мстительный,небесный,невозможный,независимый,низкий,нужный,объективный,обыкновенный,опрятный,^оригинальный,особенный,острый,откровенный,открытый,пестрый,повседневный,подземный,пожилой,показательный,последний,посторонний,провинциальный,пышный,робкий,родной,самовлюблённый,северный,седой,семейный,серьёзный,сногсшибательный,^солнечный,спокойный,суровый,терпеливый,уверенный в себе,ударный,^удачливый,формальный,хладнокровный,целый,чистый,чрезвычайный,чужой,южный' ), - ...BuildStupdiTitleVariant( + ...BuildStupidTitleVariant( false, - "адекватная,$адская,активная,алчная,%ангельская,банальная,безнадёжная,$бесполезная,былая,верная,виртуальная,вкусная,воспитанная,выгодная,выходная,гигантская,$глупая,гордая,грамотная,громадная,грубая,далекая,двуличная,деятельная,доброжелательная,$жалкая,жёсткая,жестокая,$жирная,заинтересованная,запасная,застенчивая,знакомая,иностранная,истинная,конструктивная,креативная,ласковая,любимая,мелочная,^мирная,мстительная,небесная,невозможная,независимая,низкая,нужная,объективная,обыкновенная,опрятная,^оригинальная,особенная,острая,откровенная,открытая,пестрая,повседневная,подземная,пожилая,показательная,последняя,посторонняя,провинциальная,пышная,робкая,родная,самовлюблённая,северная,седая,семейная,серьезная,сногсшибательная,^солнечная,спокаяная,суровая,терпеливая,уверенная в себе,ударная,^удачливая,формальная,хладнокровная,целая,чистая,чрезвычайная,чужая,южная" + // eslint-disable-next-line max-len + 'адекватная,$адская,активная,алчная,%ангельская,банальная,безнадёжная,$бесполезная,былая,верная,виртуальная,вкусная,воспитанная,выгодная,выходная,гигантская,$глупая,гордая,грамотная,громадная,грубая,далекая,двуличная,деятельная,доброжелательная,$жалкая,жёсткая,жестокая,$жирная,заинтересованная,запасная,застенчивая,знакомая,иностранная,истинная,конструктивная,креативная,ласковая,любимая,мелочная,^мирная,мстительная,небесная,невозможная,независимая,низкая,нужная,объективная,обыкновенная,опрятная,^оригинальная,особенная,острая,откровенная,открытая,пестрая,повседневная,подземная,пожилая,показательная,последняя,посторонняя,провинциальная,пышная,робкая,родная,самовлюблённая,северная,седая,семейная,серьезная,сногсшибательная,^солнечная,спокаяная,суровая,терпеливая,уверенная в себе,ударная,^удачливая,формальная,хладнокровная,целая,чистая,чрезвычайная,чужая,южная' ), ...vars.adj, }; vars.noun = { - ...BuildStupdiTitleVariant( + ...BuildStupidTitleVariant( true, - "актёр,$балбес,бард,басурманин,борец,бродяга,бруталище,волк,дворф,%дед,%дедушка,джентльмен,диван,динозавр,дракон,ёж,%ёжик,жук,зайц,$злоумышленник,зомби,карасик,кентавр,кит,кот,кролик,кулак,лев,ледник,лесоруб,%мальчег,мальчик,манекен,массажист,мачо,монах,монстр,наследник,ниндзя,носорог,одиночка,организм,орёл,отец,принц,проказник,пузырь,$раб,рыцарь,спортсмен,сурикат,сын,%сынок,тигр,товарищ,хоббит,эльф" + // eslint-disable-next-line max-len + 'актёр,$балбес,бард,басурманин,борец,бродяга,бруталище,волк,дворф,%дед,%дедушка,джентльмен,диван,динозавр,дракон,ёж,%ёжик,жук,зайц,$злоумышленник,зомби,карасик,кентавр,кит,кот,кролик,кулак,лев,ледник,лесоруб,%мальчег,мальчик,манекен,массажист,мачо,монах,монстр,наследник,ниндзя,носорог,одиночка,организм,орёл,отец,принц,проказник,пузырь,$раб,рыцарь,спортсмен,сурикат,сын,%сынок,тигр,товарищ,хоббит,эльф' ), - ...BuildStupdiTitleVariant( + ...BuildStupidTitleVariant( false, - "актриса,акула,$бабка,бабочка,%бабушка,бактерия,белочка,бусинка,валькирия,$ведьма,волторна,волчица,горгулья,дворфиха,девочка,деревяшка,детка,%деффачка,%дочка,дочь,заноза,$злоумышленница,знаменитость,каруселька,килька,конфетка,косточка,кошка,красотка,крышка,леди,$личинка,львица,мать,машина,милашка,монашка,мышь,наследница,орлица,панда,пиранья,принцесса,простуда,$рабыня,русалочка,рыбка,рыбка,скамеечка,спортсменка,тигрица,травка,черепашка,чертовка,эльфийка" + // eslint-disable-next-line max-len + 'актриса,акула,$бабка,бабочка,%бабушка,бактерия,белочка,бусинка,валькирия,$ведьма,волторна,волчица,горгулья,дворфиха,девочка,деревяшка,детка,%деффачка,%дочка,дочь,заноза,$злоумышленница,знаменитость,каруселька,килька,конфетка,косточка,кошка,красотка,крышка,леди,$личинка,львица,мать,машина,милашка,монашка,мышь,наследница,орлица,панда,пиранья,принцесса,простуда,$рабыня,русалочка,рыбка,рыбка,скамеечка,спортсменка,тигрица,травка,черепашка,чертовка,эльфийка' ), ...vars.noun, }; vars.verb = { - ...BuildStupdiTitleVariant( + ...BuildStupidTitleVariant( null, - "бежит,берёт и делает,болеет,встаёт,говорит,думает,забывает,замирает,заходит,идёт,%имеет план и придерживается его,ловит,меняется,молчит,нарушает,оглядывается,орёт,освобождает,отвечает,отказаться куда-то идти,отказывается,отказывается вставать,отказывается что-то делать,оформляет,плывёт,поглядывает,поздравляет,поздравляет,получает,прибывает,приказывает,просыпается,прощает,работает,радуется,скрывается,снимает,снимает,снимается в сериале,снимается в фильме,собирается,соединяет,спрашивает,тянет,указывает,учит,читает,что-то скрывает,чувствует опасность,шепчет" + // eslint-disable-next-line max-len + 'бежит,берёт и делает,болеет,встаёт,говорит,думает,забывает,замирает,заходит,идёт,%имеет план и придерживается его,ловит,меняется,молчит,нарушает,оглядывается,орёт,освобождает,отвечает,отказаться куда-то идти,отказывается,отказывается вставать,отказывается что-то делать,оформляет,плывёт,поглядывает,поздравляет,поздравляет,получает,прибывает,приказывает,просыпается,прощает,работает,радуется,скрывается,снимает,снимает,снимается в сериале,снимается в фильме,собирается,соединяет,спрашивает,тянет,указывает,учит,читает,что-то скрывает,чувствует опасность,шепчет' ), - ...BuildStupdiTitleVariant( + ...BuildStupidTitleVariant( true, - "взял и сделал,додумался,женился,женится,заработался,не спал,не успел,обиделся,познал дзен,присел,проснулся,скрылся,смог,успел" + // eslint-disable-next-line max-len + 'взял и сделал,додумался,женился,женится,заработался,не спал,не успел,обиделся,познал дзен,присел,проснулся,скрылся,смог,успел' ), - ...BuildStupdiTitleVariant( + ...BuildStupidTitleVariant( false, - "взяла и сделала,выходит замуж,вышла замуж,додумалась,заработалась,не спала,не успела,обиделась,познала дзен,присела,проснулась,скрылась,смогла,успела" + // eslint-disable-next-line max-len + 'взяла и сделала,выходит замуж,вышла замуж,додумалась,заработалась,не спала,не успела,обиделась,познала дзен,присела,проснулась,скрылась,смогла,успела' ), ...vars.verb, }; vars.place = { - ...BuildStupdiTitleVariant( + ...BuildStupidTitleVariant( null, - "в джунглях,в квартире,в космосе,в лесу,в очереди,в пустыне,в театре,%в тёплой и уютной квартире,в филармонии,где-то,на заснеженной вершине,на конференции,на пляже,на форуме,под водой,под дождём,%под проливным дождём" + // eslint-disable-next-line max-len + 'в джунглях,в квартире,в космосе,в лесу,в очереди,в пустыне,в театре,%в тёплой и уютной квартире,в филармонии,где-то,на заснеженной вершине,на конференции,на пляже,на форуме,под водой,под дождём,%под проливным дождём' ), ...vars.place, }; vars.adv = { - ...BuildStupdiTitleVariant( + ...BuildStupidTitleVariant( null, - "безрассудно,быстро,внезапно,вновь,$грубо,грустно,медленно,%молниеносно,немедленно,опять,осмысленно,позже,предсказуемо,расчётливо,регулярно,счастливо,уже,уныло" + // eslint-disable-next-line max-len + 'безрассудно,быстро,внезапно,вновь,$грубо,грустно,медленно,%молниеносно,немедленно,опять,осмысленно,позже,предсказуемо,расчётливо,регулярно,счастливо,уже,уныло' ), ...vars.adv, }; diff --git a/src/html/styles.html b/src/html/styles.html index 50fe776..52b128a 100644 --- a/src/html/styles.html +++ b/src/html/styles.html @@ -35,7 +35,6 @@ } .april-fools__joke:before { display: block; - content: ""; flex: 0 0 2ch; text-align: center; content: "✔"; diff --git a/src/html/window.html b/src/html/window.html index 8e41faa..2ee83b4 100644 --- a/src/html/window.html +++ b/src/html/window.html @@ -15,9 +15,9 @@ style="display: none" /> diff --git a/src/joke.ts b/src/joke.ts index c0686c5..abaa8f9 100644 --- a/src/joke.ts +++ b/src/joke.ts @@ -47,7 +47,7 @@ export abstract class Joke { /** * Запись новых настроек * - * @param settings + * @param {JokeSettings} settings */ set settings(settings: T) { for (const entry of Object.entries(settings)) { @@ -55,17 +55,18 @@ export abstract class Joke { const value = entry[1]; switch (id) { - case "name": - case "title": + case 'name': + case 'title': this.title = value; break; - case "description": + case 'description': this.description = value; break; default: - (this._settings)[id] = value; + // eslint-disable-next-line + (this._settings as any)[id] = value; } } } @@ -74,7 +75,7 @@ export abstract class Joke { * Проверка вероятности * * @param {number} chance Вероятность срабатывания - * @returns {boolean} Флаг срабатывания (true - сработало) + * @return {boolean} Флаг срабатывания (true - сработало) */ check(chance: number): boolean { return Math.random() < 0.01 * chance; @@ -96,7 +97,7 @@ export abstract class Joke { /** * Переключить блокировку шутки - * @param value Новое значение + * @param {boolean | null} [value] Новое значение */ toggle(value: boolean | null = null) { this.settings.enabled = value === null ? !this.settings.enabled : value; @@ -111,7 +112,7 @@ export abstract class Joke { /** * Объект, описывающий шутку, которая может быть остановлена */ -export abstract class StopableJoke extends Joke { +export abstract class StoppableJoke extends Joke { /** * Остановка шутки, если возможно */ diff --git a/src/joker.ts b/src/joker.ts index 1764092..70dae58 100644 --- a/src/joker.ts +++ b/src/joker.ts @@ -1,6 +1,6 @@ -import { stat } from "fs"; -import { Joke, JokeSettings, StopableJoke } from "./joke"; -import { JokerUI } from "./ui"; +import './types/mybb.d.ts'; +import {Joke, JokeSettings, StoppableJoke} from './joke'; +import {JokerUI} from './ui'; /** * Блок обработки перво-апрельских шуток @@ -9,58 +9,14 @@ import { JokerUI } from "./ui"; */ export class JokerClass { ui: JokerUI = new JokerUI(this); - /** - * Проверка вероятности - * - * @param {number} chance Вероятность срабатывания - * @returns {boolean} Флаг срабатывания (true - сработало) + * Общие настройки системы */ - check(chance: number): boolean { - return Math.random() < 0.01 * chance; - } - + core_settings = new CoreSettings(); /** - * Добавление шутки - * - * @param joke Объект шутки + * Перечисление всех шуток */ - add(joke: Joke): void { - this.jokes[joke.id] = joke; - } - - /** - * Регистрация новой шутки - * - * @param id Идентификатор шутки - * @param handler Метод, выполняющий шутку - * @param settings Объект настроек шутки - */ - addCustom( - id: string, - handler: Function, - settings: JokeSettings | null = null - ): Joke { - const joke = new (class extends Joke { - id = id; - - title = "Пользовательская шутка"; - - description = "Для шутки не определено описание"; - - _settings = new JokeSettings(); - - start() { - handler.call(this, this.settings); - } - })(); - - joke.settings = settings; - - this.add(joke); - - return joke; - } + jokes: JokeMap = {}; /** * Получение полного списка настроек @@ -68,7 +24,7 @@ export class JokerClass { get settings(): SettingsMap { const result: SettingsMap = {}; - result["core"] = this.core_settings; + result['core'] = this.core_settings; for (const entries of Object.entries(this.jokes)) { const id = entries[0]; @@ -83,19 +39,75 @@ export class JokerClass { /** * Запись новых настроек * - * @param settings + * @param {SettingsMap} settings */ set settings(settings: SettingsMap) { for (const entry of Object.entries(settings)) { const id = entry[0]; const jokeSettings = entry[1]; const targetSettings = - id === "core" ? this.core_settings : this.jokes[id].settings; + id === 'core' ? this.core_settings : this.jokes[id].settings; Object.assign(targetSettings, jokeSettings); } } + /** + * Проверка вероятности + * + * @param {number} chance Вероятность срабатывания + * @return {boolean} Флаг срабатывания (true - сработало) + */ + check(chance: number): boolean { + return Math.random() < 0.01 * chance; + } + + /** + * Добавление шутки + * + * @param {Joke} joke Объект шутки + */ + add(joke: Joke): void { + this.jokes[joke.id] = joke; + } + + /** + * Регистрация новой шутки + * + * @param {string} id Идентификатор шутки + * @param {JokeHandler} handler Метод, выполняющий шутку + * @param {JokeSettings | null} [settings] Объект настроек шутки + * @return {Joke} Объект шутки + */ + addCustom( + id: string, + handler: JokeHandler, + settings: JokeSettings | null = null, + ): Joke { + const joke = new (class extends Joke { + id = id; + + title = 'Пользовательская шутка'; + + description = 'Для шутки не определено описание'; + + _settings = new JokeSettings(); + + /** + * Метод запуска шутки + */ + start() { + handler.call(this, this.settings); + } + })(); + + joke.settings = settings; + + this.add(joke); + + return joke; + } + /** * Разблокировать систему */ @@ -130,12 +142,15 @@ export class JokerClass { /** * Переключение шутки + * + * @param {string} jokeId ID шутки для переключения + * @param {boolean} state Новое состояние */ - toggleJoke(joke_id: string, state: boolean) { - const joke = this.jokes[joke_id]; + toggleJoke(jokeId: string, state: boolean) { + const joke = this.jokes[jokeId]; joke.settings.enabled = state; - if (joke instanceof StopableJoke && !state) { + if (joke instanceof StoppableJoke && !state) { joke.stop(); } @@ -146,23 +161,23 @@ export class JokerClass { * Сохранение пользовательских настроек */ saveUserStates() { - const states: any = {}; + const states: { [key in string]: boolean } = {}; for (const key of Object.keys(this.jokes)) { states[key] = this.jokes[key].settings.enabled; } fetch( - "/api.php?" + + '/api.php?' + $.param({ - method: "storage.set", - user_id: (window).UserID, - key: "april-fools", - token: (window).ForumAPITicket, + method: 'storage.set', + user_id: window.UserID, + key: 'april-fools', + token: window.ForumAPITicket, value: JSON.stringify(states), timer: 24 * 60, - }) - ); + }), + ).then((_) => {}); } /** @@ -170,12 +185,12 @@ export class JokerClass { */ async loadUserStates() { const response = await fetch( - "/api.php?" + + '/api.php?' + $.param({ - method: "storage.get", - user_id: (window).UserID, - key: "april-fools", - }) + method: 'storage.get', + user_id: window.UserID, + key: 'april-fools', + }), ); const json = await response.json(); @@ -183,22 +198,25 @@ export class JokerClass { return; } - const data = JSON.parse(json.response.storage.data["april-fools"]); + const data = JSON.parse(json.response.storage.data['april-fools']); for (const key of Object.keys(this.jokes)) { this.jokes[key].settings.enabled = data[key]; } } + /** + * Отчистка настроек пользователя + */ async clearUserStates() { await fetch( - "/api.php?" + + '/api.php?' + $.param({ - method: "storage.delete", - user_id: (window).UserID, - key: "april-fools", - token: (window).ForumAPITicket, - }) + method: 'storage.delete', + user_id: window.UserID, + key: 'april-fools', + token: window.ForumAPITicket, + }), ); return; @@ -207,17 +225,15 @@ export class JokerClass { /** * Запуск шутки * - * @param id - * @param {boolean} forced + * @param {string} jokeId ID шутки для запуска + * @param {boolean} [forced] Принудительный запуск */ - start(id: string, forced: boolean = false) { - if (!(id in this.jokes)) return; + start(jokeId: string, forced: boolean = false) { + if (!(jokeId in this.jokes)) return; - const joke = this.jokes[id]; + const joke = this.jokes[jokeId]; - if ( - !forced && - (!joke.settings.enabled || !this.check(joke.settings.chance)) + if (!forced && (!joke.settings.enabled || !this.check(joke.settings.chance)) ) { return; } @@ -227,6 +243,8 @@ export class JokerClass { /** * Запуск всех шуток + * + * @param {boolean} [forced] Принудительный запуск */ startAll(forced: boolean = false): void { for (const key of Object.keys(this.jokes)) { @@ -234,12 +252,17 @@ export class JokerClass { } } + /** + * Стандартная проверка 1 апреля + * + * @return {boolean} Флаг, должна ли запускаться система + */ regularCheck(): boolean { if (!this.core_settings.enabled) { return false; } - if (this.core_settings.testers.indexOf((window).UserID) >= 0) { + if (this.core_settings.testers.indexOf(window.UserID) >= 0) { return true; } @@ -254,6 +277,9 @@ export class JokerClass { return this.check(this.core_settings.chance); } + /** + * Стандартный запуск 1 апреля + */ async regularStart() { if (!this.regularCheck()) { return; @@ -263,23 +289,15 @@ export class JokerClass { this.ui.show(); this.startAll(); } - - /** - * Общие настройки системы - */ - core_settings = new CoreSettings(); - - /** - * Перечисление всех шуток - */ - jokes: JokeMap = {}; } +type JokeHandler = () => void; + /** * Объект хранения шуток */ interface JokeMap { - [key: string]: Joke; + [key: string]: Joke< JokeSettings>; } /** @@ -289,9 +307,15 @@ interface SettingsMap { [key: string]: JokeSettings; } +/** + * Общие правила системы + */ class CoreSettings implements JokeSettings { chance = 100; enabled = true; + /** + * Список пользователей-тестировщиков + */ testers: number[] = []; } diff --git a/src/jokes/carnival.ts b/src/jokes/carnival.ts index 516baf6..66e0f72 100644 --- a/src/jokes/carnival.ts +++ b/src/jokes/carnival.ts @@ -1,6 +1,5 @@ -import { Joke, JokeSettings, StopableJoke } from "../joke"; -import $ from "jquery"; -import { JokerClass } from "../joker"; +import {Joke, JokeSettings} from '../joke'; +import $ from 'jquery'; /** * **Карнавал** @@ -10,14 +9,17 @@ import { JokerClass } from "../joker"; * @author Kozhilya */ export class CarnivalJoke extends Joke { - id = "carnival"; + id = 'carnival'; - title = "Карнавал"; + title = 'Карнавал'; - description = "Аватарки приобретают интересные цвета"; + description = 'Аватарки приобретают интересные цвета'; _settings = new CarnivalJokeSettings(); + /** + * Запуск шутки + */ start(): void { $(this.settings.selector).each((_, elem) => { const filters: string[] = []; @@ -29,19 +31,22 @@ export class CarnivalJoke extends Joke { filters.push( entry[0].replace( - "{0}", + '{0}', Math.round(Math.random() * entry[1]).toString() ) ); } if (filters.length > 0) { - $(elem).css({ filter: filters.join(" ") }); + $(elem).css({filter: filters.join(' ')}); } }); } } +/** + * Класс настроек для шутки "Карнавал" + */ export class CarnivalJokeSettings implements JokeSettings { enabled: boolean = true; @@ -61,10 +66,10 @@ export class CarnivalJokeSettings implements JokeSettings { * Список фильтров и диапозона случайных параметров */ variants: CarnivalJokeFilters = { - "sepia({0}%)": 100, - "saturate({0}%)": 100, - "hue-rotate({0}deg)": 360, - "invert({0}%)": 100, + 'sepia({0}%)': 100, + 'saturate({0}%)': 100, + 'hue-rotate({0}deg)': 360, + 'invert({0}%)': 100, }; } diff --git a/src/jokes/crazy_letters.ts b/src/jokes/crazy_letters.ts index 1ed54cd..3f98ace 100644 --- a/src/jokes/crazy_letters.ts +++ b/src/jokes/crazy_letters.ts @@ -1,5 +1,5 @@ -import { Joke, JokeSettings, StopableJoke } from "../joke"; -import $ from "jquery"; +import {Joke, JokeSettings} from '../joke'; +import $ from 'jquery'; /** * **Мама, Я сОшЛа С уМа!** @@ -9,21 +9,24 @@ import $ from "jquery"; * @author Kozhilya */ export class CrazyLettersJoke extends Joke { - id = "crazy_letters"; + id = 'crazy_letters'; - title = "Мама, Я сОшЛа С уМа!"; + title = 'Мама, Я сОшЛа С уМа!'; - description = "иМеНа ЗаБоРчИкОм"; + description = 'иМеНа ЗаБоРчИкОм'; _settings = new CrazyLettersJokeSettings(); + /** + * Запуск шутки + */ start(): void { $(this.settings.selector).each((_, elem) => { - let text = $(this).text(); - let result = ""; + const text = $(elem).text(); + let result = ''; for (let i = 0; i < text.length; i++) { - result += text[i][i % 2 ? "toLowerCase" : "toUpperCase"](); + result += text[i][i % 2 ? 'toLowerCase' : 'toUpperCase'](); } $(this).text(result); @@ -31,6 +34,9 @@ export class CrazyLettersJoke extends Joke { } } +/** + * Класс настроек для шутки "Мама, Я сОшЛа С уМа!" + */ export class CrazyLettersJokeSettings implements JokeSettings { enabled: boolean = true; @@ -39,5 +45,5 @@ export class CrazyLettersJokeSettings implements JokeSettings { /** * Селектор всех элементов, которые будут затронуты */ - selector: string = ".pa-author a"; + selector: string = '.pa-author a'; } diff --git a/src/jokes/cursor.ts b/src/jokes/cursor.ts index 6ad026b..18a707a 100644 --- a/src/jokes/cursor.ts +++ b/src/jokes/cursor.ts @@ -1,8 +1,8 @@ -import { Joke, JokeSettings, StopableJoke } from "../joke"; -import $ from "jquery"; -import { Interface } from "readline"; -// import * as cursor_effects from "cursor-effects"; -const cursor_effects = require("cursor-effects"); + +import {JokeSettings, StoppableJoke} from '../joke'; + +// eslint-disable-next-line @typescript-eslint/no-var-requires +import * as CursorEffectsLib from 'cursor-effects'; /** * **Красивый курсор** @@ -12,16 +12,17 @@ const cursor_effects = require("cursor-effects"); * @author Tim Holman * @link https://tholman.com/cursor-effects/ */ -export class CursorEffectsJoke extends StopableJoke { - id = "cursor_effects"; +export class CursorEffectsJoke extends + StoppableJoke { + id = 'cursor_effects'; - title = "Красивый курсор"; + title = 'Красивый курсор'; - description = "Эффекты, следующие за курсором"; + description = 'Эффекты, следующие за курсором'; _settings = new CursorEffectsJokeSettings(); - active_cursor_effect: any; + active_cursor_effect: CursorEffectsLib.CursorEffectResult; /** * Разблокировать все варианты курсоров @@ -41,11 +42,21 @@ export class CursorEffectsJoke extends StopableJoke { } } + /** + * Получение веса отдельного эффекта + * @param {CursorEffectsEnum} effect Тип эффекта + * @return {number} Значение веса + * @private + */ private weight(effect: CursorEffectsEnum): number { const s = this.settings.effects[effect]; return s.enabled ? s.weight : 0; } + /** + * Получение случайного эффекта + * @return {CursorEffectsEnum} + */ getRandomEffect(): CursorEffectsEnum { const elements = Object.values(CursorEffectsEnum).map( (e) => e @@ -64,9 +75,12 @@ export class CursorEffectsJoke extends StopableJoke { } } - throw new Error("Тебя быть тут не должно..."); + throw new Error('Тебя быть тут не должно...'); } + /** + * Запуск шутки + */ start(): void { const effect = this.getRandomEffect(); const settings = this.settings.effects[effect]; @@ -74,65 +88,77 @@ export class CursorEffectsJoke extends StopableJoke { this.active_cursor_effect = resolveCursorEffectsEnum(effect, settings); } + /** + * Остановка шутки + */ stop(): void { this.active_cursor_effect.destroy(); } } enum CursorEffectsEnum { - Rainbow = "rainbow", - FairyDust = "fairy_dust", - SpringyEmoji = "springy_emoji", - Emoji = "emoji", - Ghost = "ghost", - Trailing = "trailing", - TextFlag = "text_flag", - FollowingDot = "following_dot", - Bubbles = "bubbles", - Snowflake = "snowflake", - Clock = "clock", + Rainbow = 'rainbow', + FairyDust = 'fairy_dust', + SpringyEmoji = 'springy_emoji', + Emoji = 'emoji', + Ghost = 'ghost', + Trailing = 'trailing', + TextFlag = 'text_flag', + FollowingDot = 'following_dot', + Bubbles = 'bubbles', + Snowflake = 'snowflake', + Clock = 'clock', } +/** + * Получение эффекта + * @param {CursorEffectsEnum | string} effect Тип эффекта + * @param {CursorEffectsSetting} options Настройки эффекта + * @return {CursorEffectsLib.CursorEffectResult} + */ function resolveCursorEffectsEnum( effect: CursorEffectsEnum | string, options: CursorEffectsSetting -): any { +): CursorEffectsLib.CursorEffectResult { switch (effect) { case CursorEffectsEnum.Rainbow: - return cursor_effects.rainbowCursor(options); + return CursorEffectsLib.rainbowCursor(options); case CursorEffectsEnum.FairyDust: - return cursor_effects.fairyDustCursor(options); + return CursorEffectsLib.fairyDustCursor(options); case CursorEffectsEnum.SpringyEmoji: - return cursor_effects.springyEmojiCursor(options); + return CursorEffectsLib.springyEmojiCursor(options); case CursorEffectsEnum.Emoji: - return cursor_effects.emojiCursor(options); + return CursorEffectsLib.emojiCursor(options); case CursorEffectsEnum.Ghost: - return cursor_effects.ghostCursor(options); + return CursorEffectsLib.ghostCursor(options); case CursorEffectsEnum.Trailing: - return cursor_effects.trailingCursor(options); + return CursorEffectsLib.trailingCursor(options); case CursorEffectsEnum.TextFlag: - return cursor_effects.textFlag(options); + return CursorEffectsLib.textFlag(options); case CursorEffectsEnum.FollowingDot: - return cursor_effects.followingDotCursor(options); + return CursorEffectsLib.followingDotCursor(options); case CursorEffectsEnum.Bubbles: - return cursor_effects.bubbleCursor(options); + return CursorEffectsLib.bubbleCursor(options); case CursorEffectsEnum.Snowflake: - return cursor_effects.snowflakeCursor(options); + return CursorEffectsLib.snowflakeCursor(options); case CursorEffectsEnum.Clock: - return cursor_effects.clockCursor(options); + return CursorEffectsLib.clockCursor(options); } } +/** + * Класс настроек для шутки "Красивый курсор" + */ export class CursorEffectsJokeSettings implements JokeSettings { enabled: boolean = true; @@ -143,7 +169,7 @@ export class CursorEffectsJokeSettings implements JokeSettings { * Радужный след за курсором */ [CursorEffectsEnum.Rainbow]: - new (class extends DefaultCursorEffectsSetting { + new (class extends CursorEffectsSetting { /** * Длина полосы */ @@ -158,13 +184,13 @@ export class CursorEffectsJokeSettings implements JokeSettings { * Цвета полос (сверху вниз) */ colors: string[] = [ - "#9400D3", - "#4B0082", - "#0000FF", - "#00FF00", - "#FFFF00", - "#FF7F00", - "#FF0000", + '#9400D3', + '#4B0082', + '#0000FF', + '#00FF00', + '#FFFF00', + '#FF7F00', + '#FF0000', ]; })(), @@ -172,44 +198,44 @@ export class CursorEffectsJokeSettings implements JokeSettings { * Цепочка из эмодзи "на резинке" под курсором */ [CursorEffectsEnum.SpringyEmoji]: - new (class extends DefaultCursorEffectsSetting { + new (class extends CursorEffectsSetting { /** * Висящий эмодзи */ - emoji: string = "🤪"; + emoji: string = '🤪'; })(), /** * Падающие от курсора эмодзи */ - [CursorEffectsEnum.Emoji]: new (class extends DefaultCursorEffectsSetting { + [CursorEffectsEnum.Emoji]: new (class extends CursorEffectsSetting { /** * Падающие эмодзи */ - emoji: string[] = ["🔥", "🐬", "🦆"]; + emoji: string[] = ['🔥', '🐬', '🦆']; })(), /** * Падающие от курсора пылинки */ [CursorEffectsEnum.FairyDust]: - new (class extends DefaultCursorEffectsSetting { + new (class extends CursorEffectsSetting { /** * Цвет пылинок */ - colors: string[] = ["#ff0000", "#00ff00", "#0000ff"]; + colors: string[] = ['#ff0000', '#00ff00', '#0000ff']; })(), /** * След "зависших" курсоров */ - [CursorEffectsEnum.Ghost]: new DefaultCursorEffectsSetting(), + [CursorEffectsEnum.Ghost]: new CursorEffectsSetting(), /** * След курсоров "на резинке" */ [CursorEffectsEnum.Trailing]: - new (class extends DefaultCursorEffectsSetting { + new (class extends CursorEffectsSetting { /** * Количество элементов */ @@ -231,21 +257,21 @@ export class CursorEffectsJokeSettings implements JokeSettings { * Текст, развивающийся флагом от курсора */ [CursorEffectsEnum.TextFlag]: - new (class extends DefaultCursorEffectsSetting { + new (class extends CursorEffectsSetting { /** * Отображаемый текст */ - text: string = "С днём смеха!"; + text: string = 'С днём смеха!'; /** * Цвет текста */ - color: string = "#000000"; + color: string = '#000000'; /** * Шрифт текста */ - font: string = "monospace"; + font: string = 'monospace'; /** * Размер текста @@ -267,17 +293,17 @@ export class CursorEffectsJokeSettings implements JokeSettings { * Точка, преследующая курсор */ [CursorEffectsEnum.FollowingDot]: - new (class extends DefaultCursorEffectsSetting { + new (class extends CursorEffectsSetting { /** * Цвет догоняющей точки */ - color: string = "#323232a6"; + color: string = '#323232a6'; })(), /** * Пузырьки от курсора */ - [CursorEffectsEnum.Bubbles]: new DefaultCursorEffectsSetting(), + [CursorEffectsEnum.Bubbles]: new CursorEffectsSetting(), /** * Снежинки, летящие от курсора @@ -285,47 +311,53 @@ export class CursorEffectsJokeSettings implements JokeSettings { * Отключено, потому что сейчас не зима :D */ [CursorEffectsEnum.Snowflake]: - new (class extends DefaultCursorEffectsSetting { + new (class extends CursorEffectsSetting { weight: number = 0; })(), /** * Циферблат вокруг курсора */ - [CursorEffectsEnum.Clock]: new (class extends DefaultCursorEffectsSetting { + [CursorEffectsEnum.Clock]: new (class extends CursorEffectsSetting { /** * Цвет даты */ - dateColor: string = "blue"; + dateColor: string = 'blue'; /** * Цвет циферблата */ - faceColor: string = "black"; + faceColor: string = 'black'; /** * Цвет секундной стрелки */ - secondsColor: string = "red"; + secondsColor: string = 'red'; /** * Цвет минутной стрелки */ - minutesColor: string = "black"; + minutesColor: string = 'black'; /** * Цвет часовой стрелки */ - hoursColor: string = "black"; + hoursColor: string = 'black'; })(), }; } -interface CursorEffectsSetting { - [key: string]: any; +/** + * Восстановление класса CursorEffectsLib.DefaultOptions + */ +class DefaultOptions { + readonly element?: HTMLElement; } -class DefaultCursorEffectsSetting implements CursorEffectsSetting { +/** + * Класс настроек для курсора + */ +class CursorEffectsSetting extends DefaultOptions { /** * Флаг возможности срабатывания */ diff --git a/src/jokes/humanitarian_hell.ts b/src/jokes/humanitarian_hell.ts index 4925d4f..958cc9b 100644 --- a/src/jokes/humanitarian_hell.ts +++ b/src/jokes/humanitarian_hell.ts @@ -1,6 +1,5 @@ -import { Joke, JokeSettings, StopableJoke } from "../joke"; -import { getTextNodes } from "../common"; -import $ from "jquery"; +import {Joke, JokeSettings} from '../joke'; +import {getTextNodes} from '../common'; /** * **Ад гуманитария** @@ -10,20 +9,29 @@ import $ from "jquery"; * @author Kozhilya */ export class HumanitarianHellJoke extends Joke { - id = "humanitarian_hell"; + id = 'humanitarian_hell'; - title = "Ад гуманитария"; + title = 'Ад гуманитария'; description = 'Все "тся" заменяются на "ться", а все "ться" на "тся"'; _settings = new HumanitarianHellJokeSettings(); + /** + * Обработка текста + * + * @param {string} text Входная строка + * @return {string} Итоговая строка + */ processText(text: string): string { - return text.replace(/(ть?ся)/g, function (fnd) { - return fnd.indexOf("ь") > 0 ? "тся" : "ться"; + return text.replace(/(ть?ся)/g, function(fnd) { + return fnd.indexOf('ь') > 0 ? 'тся' : 'ться'; }); } + /** + * Запуск шутки + */ start(): void { const textNodes = getTextNodes(this.settings.selector); @@ -33,6 +41,9 @@ export class HumanitarianHellJoke extends Joke { } } +/** + * Класс настроек для шутки "Ад гуманитария" + */ export class HumanitarianHellJokeSettings implements JokeSettings { enabled: boolean = true; @@ -41,5 +52,5 @@ export class HumanitarianHellJokeSettings implements JokeSettings { /** * Селектор всех элементов, которые будут затронуты */ - selector: string = ".post-content"; + selector: HTMLElement | JQuery | string = '.post-content'; } diff --git a/src/jokes/letter_chaos.ts b/src/jokes/letter_chaos.ts index 3f955eb..be29bca 100644 --- a/src/jokes/letter_chaos.ts +++ b/src/jokes/letter_chaos.ts @@ -1,7 +1,5 @@ -import { Joke, JokeSettings, StopableJoke } from "../joke"; -import { getTextNodes } from "../common"; -import $ from "jquery"; -import { JokerClass } from "../joker"; +import {Joke, JokeSettings} from '../joke'; +import {getTextNodes} from '../common'; /** * **Буквенный хаос** @@ -11,26 +9,29 @@ import { JokerClass } from "../joker"; * @author Kozhilya */ export class LetterChaosJoke extends Joke { - id = "letter_chaos"; + id = 'letter_chaos'; - title = "Буквенный хаос"; + title = 'Буквенный хаос'; + + description = 'Все буквы в словах, кроме первой и последней, перемешены'; - description = "Все буквы в словах, кроме первой и последней, перемешены"; - _settings = new LetterChaosJokeSettings(); punctuationSymbols: string[] | null = null; + /** + * Перемешивание букв в словах + * @param {string} word + * @return {string} + * @private + */ private shuffleLetters(word: string): string { - // Check if the word has two or more letters if (word.length < 3 || !this.check(this.settings.shuffle_chance)) { return word; } - // Split the word into an array of characters - const characters = word.split(""); + const characters = word.split(''); - // Shuffle the characters between the first and last letters const middleCharacters = characters.slice(1, -1); for (let i = middleCharacters.length - 1; i > 0; i--) { const j = Math.floor(Math.random() * (i + 1)); @@ -40,28 +41,38 @@ export class LetterChaosJoke extends Joke { ]; } - // Join the shuffled characters back into a word return [ characters[0], ...middleCharacters, characters[characters.length - 1], - ].join(""); + ].join(''); } - private processNode(node: any) { + /** + * Обработка текстовой ноды + * @param {Text} node + * @private + */ + private processNode(node: Text) { node.textContent = node.textContent?.replace( /([А-Яа-яA-Za-z]+)/gm, - (_: any, word: string) => this.shuffleLetters(word) + (_: string, word: string) => this.shuffleLetters(word) ); } + /** + * Запуск шутки + */ start(): void { const textNodes = getTextNodes(this.settings.selector); - textNodes.each((_, node) => this.processNode(node)); + textNodes.each((_, node) => this.processNode(node as Text)); } } +/** + * Класс настроек для шутки "Буквенный хаос" + */ export class LetterChaosJokeSettings implements JokeSettings { enabled: boolean = true; @@ -70,7 +81,7 @@ export class LetterChaosJokeSettings implements JokeSettings { /** * Селектор всех элементов, которые будут затронуты */ - selector: string = ".post-content"; + selector: string = '.post-content'; /** * Вероятность того, что буквы будут перемешаны diff --git a/src/jokes/mirror.ts b/src/jokes/mirror.ts index 8c62688..4dc07d4 100644 --- a/src/jokes/mirror.ts +++ b/src/jokes/mirror.ts @@ -1,5 +1,5 @@ -import { Joke, JokeSettings, StopableJoke } from "../joke"; -import $ from "jquery"; +import {Joke, JokeSettings} from '../joke'; +import $ from 'jquery'; /** * **Зеркало** @@ -9,26 +9,32 @@ import $ from "jquery"; * @author Kozhilya */ export class MirrorJoke extends Joke { - id = "mirror"; + id = 'mirror'; - title = "Зеркало"; + title = 'Зеркало'; - description = "Элементы форума отражаются (по крайней мере, пытаются)"; + description = 'Элементы форума отражаются (по крайней мере, пытаются)'; _settings = new MirrorJokeSettings(); + /** + * Запуск шутки + */ start(): void { - $(".post, .post h3, .post-links, .post-author, .post-content") - .css("transform", "scaleX(-1)") - .css("-moz-transform", "scaleX(-1)") - .css("-moz-transform", "scaleX(-1)") - .css("filter", "FlipH") - .css("-ms-filter", '"FlipH"'); - $(".post-links, .post-links ul, .post h3 span").css("margin-left", "0"); - $(".post h3 span").css("margin-right", "25em"); + $('.post, .post h3, .post-links, .post-author, .post-content') + .css('transform', 'scaleX(-1)') + .css('-moz-transform', 'scaleX(-1)') + .css('-moz-transform', 'scaleX(-1)') + .css('filter', 'FlipH') + .css('-ms-filter', '"FlipH"'); + $('.post-links, .post-links ul, .post h3 span').css('margin-left', '0'); + $('.post h3 span').css('margin-right', '25em'); } } +/** + * Класс настроек для шутки "Зеркало" + */ export class MirrorJokeSettings implements JokeSettings { enabled: boolean = false; diff --git a/src/jokes/shake.ts b/src/jokes/shake.ts index 62e6375..978e887 100644 --- a/src/jokes/shake.ts +++ b/src/jokes/shake.ts @@ -1,5 +1,5 @@ -import { Joke, JokeSettings, StopableJoke } from "../joke"; -import $ from "jquery"; +import {JokeSettings, StoppableJoke} from '../joke'; +import $ from 'jquery'; /** * **Форумо-трясение** @@ -8,73 +8,88 @@ import $ from "jquery"; * * @author Kozhilya */ -export class ShakeJoke extends StopableJoke { - id = "shake"; +export class ShakeJoke extends StoppableJoke { + id = 'shake'; - title = "Форумо-трясение"; + title = 'Форумо-трясение'; - description = "Страница форума начинает трястись"; + description = 'Страница форума начинает трястись'; _settings = new ShakeJokeSettings(); - private interval_id: NodeJS.Timer; + private intervalId: NodeJS.Timeout; private items: JQuery; - private data_name: string = "april-fools-shake"; + private dataName: string = 'april-fools-shake'; + /** + * Выбор случайной амплитуды + * @param {number} a + * @return {number} + */ rand(a: number): number { return a + this.settings.force * (Math.random() * 2 - 1); } + /** + * Запуск шутки + */ start(): void { this.items = $(this.settings.selector); this.items.each((_, elem) => { - let data: ShakeJokeMargin = {}; + const data: ShakeJokeMargin = {}; this.settings.directions.forEach((d) => { - data[d] = parseInt($(elem).css("margin-" + d)); + data[d] = parseInt($(elem).css('margin-' + d)); }); - $(elem).data(this.data_name, data); + $(elem).data(this.dataName, data); }); - this.interval_id = setInterval(() => { + this.intervalId = setInterval(() => { this.items.each((_, elem) => { - const data: ShakeJokeMargin = $(elem).data(this.data_name); + const data: ShakeJokeMargin = $(elem).data(this.dataName); for (const entry of Object.entries(data)) { - $(elem).css("margin-" + entry[0], this.rand(entry[1])); + $(elem).css('margin-' + entry[0], this.rand(entry[1])); } }); }, this.settings.interval); } + /** + * Остновка шутки + */ stop(): void { - clearInterval(this.interval_id); + clearInterval(this.intervalId); this.items.each((_, elem) => { - let data: ShakeJokeMargin = {}; + const data: ShakeJokeMargin = {}; this.settings.directions.forEach((d) => { - $(elem).css("margin-" + d, data[d]); + $(elem).css('margin-' + d, data[d]); }); - $(elem).data(this.data_name, data); + $(elem).data(this.dataName, data); }); } } +/** + * Класс настроек для шутки "Форумо-трясение" + */ export class ShakeJokeSettings implements JokeSettings { enabled: boolean = false; chance: number = 1; /** - * Направление тряски (тряска происходит путём изменения перечисленных направлений margin на значение ±force от стандартного значения) + * Направление тряски (тряска происходит путём изменения перечисленных + * направлений margin на значение ±force от стандартного значения) */ - directions: string[] = ["top", "left", "bottom", "left"]; + directions: string[] = ['top', 'left', 'bottom', 'left']; /** * Сила тряски - насколько отклоняется элемент от стандартного значения @@ -84,7 +99,7 @@ export class ShakeJokeSettings implements JokeSettings { /** * Селектор всех элементов, которые будут трястись */ - selector: string = "[id^=pun]"; + selector: string = '[id^=pun]'; /** * Частота тряски diff --git a/src/jokes/stupid_title.ts b/src/jokes/stupid_title.ts index 97b8019..d4ecade 100644 --- a/src/jokes/stupid_title.ts +++ b/src/jokes/stupid_title.ts @@ -1,6 +1,6 @@ -import { Joke, JokeSettings, StopableJoke } from "../joke"; -import $ from "jquery"; -import { StupidTitleDefaultVariants } from "../data/stupid_title_variants"; +import {Joke, JokeSettings} from '../joke'; +import $ from 'jquery'; +import {StupidTitleDefaultVariants} from '../data/stupid_title_variants'; /** * **Глупые статусы** @@ -10,30 +10,35 @@ import { StupidTitleDefaultVariants } from "../data/stupid_title_variants"; * @author Kozhilya */ export class StupidTitleJoke extends Joke { - id = "stupid_title"; + id = 'stupid_title'; - title = "Глупые статусы"; + title = 'Глупые статусы'; - description = "Каждому пользователю даётся новый глупый статус"; + description = 'Каждому пользователю даётся новый глупый статус'; _settings = new StupidTitleJokeSettings(); - private loadedGenders: any = null; + private loadedGenders: { [key in string]: boolean } = null; + private variantsGenerated = false; + private seed = 0; + /** + * Загрузка полов, если они не определены + */ async loadGenders(): Promise { - const names = $(".pa-author a") - .map((_, elem) => elem.innerText) - .toArray() - .reduce((arr: string[], name: string) => { - if (arr.indexOf(name) < 0) { - arr.push(name); - } - return arr; - }, []); + const names = $('.pa-author a'). + map((_, elem) => elem.innerText). + toArray(). + reduce((arr: string[], name: string) => { + if (arr.indexOf(name) < 0) { + arr.push(name); + } + return arr; + }, []); const url = - "/api.php?" + - $.param({ method: "users.get", fields: "username,sex", username: names }); + '/api.php?' + + $.param({method: 'users.get', fields: 'username,sex', username: names}); const response = await fetch(url); const json = await response.json(); @@ -43,15 +48,21 @@ export class StupidTitleJoke extends Joke { return; } - json.response.users.forEach((element: any) => { - if (element.sex === "0") { - return; - } + json.response?.users.forEach( + (element: { username: string, sex: string }) => { + if (element.sex === '0') { + return; + } - this.loadedGenders[element.username] = element.sex === "1"; - }); + this.loadedGenders[element.username] = element.sex === '1'; + }); } + /** + * Разрешение пола по имени + * @param {string} name + * @return {boolean} + */ resolveGender(name: string): boolean { if (this.settings.gender_resolver !== null) { return !!this.settings.gender_resolver.call(this, name); @@ -62,11 +73,12 @@ export class StupidTitleJoke extends Joke { } this.resetSeed(); - return this.selectRandom(name, { m: 1, f: 1 }) === "m"; + return this.selectRandom(name, {m: 1, f: 1}) === 'm'; } - private variantsGenerated = false; - + /** + * Запуск шутки + */ async start(): Promise { if (!this.variantsGenerated) { StupidTitleDefaultVariants(this.settings.variants); @@ -75,10 +87,10 @@ export class StupidTitleJoke extends Joke { await this.loadGenders(); - const cache: any = {}; + const cache: {[key in string]: string} = {}; - $(".post-author").each((_, root) => { - const name = $(".pa-author a", root).text(); + $('.post-author').each((_, root) => { + const name = $('.pa-author a', root).text(); if (!name) { return; } @@ -88,40 +100,68 @@ export class StupidTitleJoke extends Joke { cache[name] = this.generatePhrase(name); } - $(".pa-title", root).text(cache[name]); + $('.pa-title', root).text(cache[name]); }); } - private prng(name: string, seed: number, limit: number): number { - /* - https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js + /** + * Сгенерировать фразу + * @param {string} name Имя, кому необходимо сгенерировать фразу + * @return {string} Итоговая фраза + */ + generatePhrase(name: string): string { + const gender = this.resolveGender(name); + const phrase = this.selectRandom(name, this.settings.schemas); - cyrb53 (c) 2018 bryc (github.com/bryc) - A fast and simple hash function with decent collision resistance. - Largely inspired by MurmurHash2/3, but with a focus on speed/simplicity. - Public domain. Attribution appreciated. - */ - let h1 = 0xdeadbeef ^ seed, - h2 = 0x41c6ce57 ^ seed; + return this.capitalizeFirst( + phrase.replace(/\{(.+?)}/g, (_, type: string) => { + const variants = this.buildVariants(type, gender); + + return this.selectRandom(name, variants); + }), + ); + } + + /** + * Функция хеширования + * + * https://github.com/bryc/code/blob/master/jshash/experimental/cyrb53.js + * + * cyrb53 (c) 2018 bryc (github.com/bryc) + * A fast and simple hash function with decent collision resistance. + * Largely inspired by MurmurHash2/3, but with a focus on speed/simplicity. + * Public domain. Attribution appreciated. + * + * @param {string} name Имя + * @param {number} seed Зерно случайности + * @param {limit} limit Максимальное значение + * @return {number} Хеш-значение + * @private + */ + private prng(name: string, seed: number, limit: number): number { + let h1 = 0xdeadbeef ^ seed; + let h2 = 0x41c6ce57 ^ seed; for (let i = 0, ch; i < name.length; i++) { ch = name.charCodeAt(i); h1 = Math.imul(h1 ^ ch, 2654435761); h2 = Math.imul(h2 ^ ch, 1597334677); } h1 = - Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ - Math.imul(h2 ^ (h2 >>> 13), 3266489909); + Math.imul(h1 ^ (h1 >>> 16), 2246822507) ^ + Math.imul(h2 ^ (h2 >>> 13), 3266489909); h2 = - Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ - Math.imul(h1 ^ (h1 >>> 13), 3266489909); + Math.imul(h2 ^ (h2 >>> 16), 2246822507) ^ + Math.imul(h1 ^ (h1 >>> 13), 3266489909); const value = 4294967296 * (2097151 & h2) + (h1 >>> 0); return Math.floor(Math.pow(Math.sin(value), 2) * limit) % limit; } - private seed = 0; - + /** + * Сброс зерна случайности + * @private + */ private resetSeed(): void { const date = new Date(); const time = date.getUTCHours() * 60 + date.getUTCMinutes(); @@ -134,14 +174,21 @@ export class StupidTitleJoke extends Joke { this.seed = Math.floor(time / this.settings.change_frequency); } + /** + * Выбор случайного слова + * @param {string} name + * @param {StupidTitleWeightedVariants} variants + * @return {string} + * @private + */ private selectRandom( - name: string, - variants: StupidTitleWeightedVariants + name: string, + variants: StupidTitleWeightedVariants, ): string { const elements = Object.keys(variants); const totalWeight = elements.reduce( - (sum, element) => sum + variants[element], - 0 + (sum, element) => sum + variants[element], + 0, ); const randomWeight = this.prng(name, this.seed++, totalWeight); @@ -153,12 +200,19 @@ export class StupidTitleJoke extends Joke { } } - throw new Error("Тебя быть тут не должно..."); + throw new Error('Тебя быть тут не должно...'); } + /** + * Выбор случайной фразы + * @param {string} type + * @param {boolean} gender + * @return {StupidTitleWeightedVariants} + * @private + */ private buildVariants( - type: string, - gender: boolean + type: string, + gender: boolean, ): StupidTitleWeightedVariants { const result: StupidTitleWeightedVariants = {}; const variants: StupidTitleVariant = this.settings.variants[type]; @@ -181,24 +235,27 @@ export class StupidTitleJoke extends Joke { return result; } + /** + * Сделать первую буква слова заглавной + * @param {string} str Слово + * @return {string} Исправленное слово + * @private + */ private capitalizeFirst(str: string): string { return str.charAt(0).toUpperCase() + str.slice(1); } - - generatePhrase(name: string): string { - const gender = this.resolveGender(name); - const prhase = this.selectRandom(name, this.settings.schemas); - - return this.capitalizeFirst( - prhase.replace(/\{(.+?)\}/g, (_, type: string) => { - const variants = this.buildVariants(type, gender); - - return this.selectRandom(name, variants); - }) - ); - } } +/** + * Определение пола по имени. + * @param {string} name Имя персонажа + * @return {boolean | null} true, если мужской род; false, если женский род + */ +type GenderResolverFunction = (name: string) => (boolean | null); + +/** + * Класс настроек для шутки "Глупые статусы" + */ export class StupidTitleJokeSettings implements JokeSettings { enabled: boolean = true; chance: number = 100; @@ -207,12 +264,13 @@ export class StupidTitleJokeSettings implements JokeSettings { * Определение пола по имени. * По умолчанию род устанавливается случайным образом * - * Если установлено значение `null`, система попытается загрузить пол, установленный в настройках аккаунта. Если этот пол определить невозможно, то он будет выбран случайно. Эта настройка позволяет изменить это поведение, если ваш форум обладает ролевой системой, в которой пол определяется иным образом. - * - * @param name Имя персонажа - * @returns true, если мужской род; false, если женский род + * Если установлено значение `null`, система попытается загрузить пол, + * установленный в настройках аккаунта. Если этот пол определить невозможно, + * то он будет выбран случайно. Эта настройка позволяет изменить это + * поведение, если ваш форум обладает ролевой системой, в которой пол + * определяется иным образом. */ - gender_resolver: Function | null = null; + gender_resolver: GenderResolverFunction | null = null; /** * Разрешить возможно оскорбительные варианты @@ -221,7 +279,8 @@ export class StupidTitleJokeSettings implements JokeSettings { /** * Частота смены статусов (в минутах) - * Установите значение 0, что бы обновление происходило при каждом обновлении страницы + * Установите значение 0, что бы обновление происходило при + * каждом обновлении страницы */ change_frequency: number = 5; @@ -236,14 +295,14 @@ export class StupidTitleJokeSettings implements JokeSettings { * {p} - знак препинания */ schemas: StupidTitleWeightedVariants = { - "{adj} {noun}{p}": 10, - "{noun} {adj}{p}": 3, - "{adj}, {adj} {noun}{p}": 10, - "{adj} и очень {adj} {noun}{p}": 10, - "{adj} {noun} {verb}{p}": 10, - "{adj} {noun} {adv} {verb}{p}": 5, - "{adj} {noun} {verb} {place}{p}": 5, - "{adj} {noun} {adv} {verb} {place}{p}": 5, + '{adj} {noun}{p}': 10, + '{noun} {adj}{p}': 3, + '{adj}, {adj} {noun}{p}': 10, + '{adj} и очень {adj} {noun}{p}': 10, + '{adj} {noun} {verb}{p}': 10, + '{adj} {noun} {adv} {verb}{p}': 5, + '{adj} {noun} {verb} {place}{p}': 5, + '{adj} {noun} {adv} {verb} {place}{p}': 5, }; /** @@ -257,13 +316,13 @@ export class StupidTitleJokeSettings implements JokeSettings { place: {}, adv: {}, p: { - "": new StupidTitleSetting({ weight: 10 }), - ".": new StupidTitleSetting({ weight: 10 }), - "...": new StupidTitleSetting({ weight: 5 }), - "!": new StupidTitleSetting({ weight: 5 }), - "!!!": new StupidTitleSetting({ weight: 2 }), - "?": new StupidTitleSetting({ weight: 2 }), - "?!": new StupidTitleSetting({ weight: 1 }), + '': new StupidTitleSetting({weight: 15}), + '.': new StupidTitleSetting({weight: 10}), + '...': new StupidTitleSetting({weight: 5}), + '!': new StupidTitleSetting({weight: 5}), + '!!!': new StupidTitleSetting({weight: 2}), + '?': new StupidTitleSetting({weight: 2}), + '?!': new StupidTitleSetting({weight: 1}), }, }; } @@ -280,6 +339,16 @@ interface StupidTitleWeightedVariants { [key: string]: number; } +type StupidTitleSettingInitializer = { + weight?: number; + enabled?: boolean; + rude?: boolean; + gender?: boolean | null; +} + +/** + * Класс настройки + */ class StupidTitleSetting { weight: number = 10; @@ -289,42 +358,62 @@ class StupidTitleSetting { gender: boolean | null = null; - constructor(options: any = new Object()) { - for (const iterator of Object.entries(options)) { - if (iterator[0] in this) { - (this)[iterator[0]] = iterator[1]; - } - } + /** + * Создание класса + * @param {StupidTitleSettingInitializer} options + */ + constructor(options: StupidTitleSettingInitializer) { + this.weight ??= options.weight; + this.enabled ??= options.enabled; + this.rude ??= options.rude; + this.gender ??= options.gender; } } -export function BuildStupdiTitleVariant( - gender: boolean | null, - input: string +/** + * Метод создания списка слов + * @param {boolean | null} gender + * @param {string} input + * @return {StupidTitleVariant} + * @constructor + */ +export function BuildStupidTitleVariant( + gender: boolean | null, + input: string, ): StupidTitleVariant { const result: StupidTitleVariant = {}; - const words = input.split(",").map((word) => word.trim()); + const words = input.split(',').map((word) => word.trim()); words.forEach((word) => { - const clean_word = word.replace(/[^А-ЯЁа-яёA-Za-z\- ]/g, ""); + const cleanWord = word.replace(/[^А-ЯЁа-яёA-Za-z\- ]/g, ''); - if (clean_word === "") { + if (cleanWord === '') { return; } - result[clean_word] = new StupidTitleSetting({ + result[cleanWord] = new StupidTitleSetting({ gender, - rude: word.indexOf("$") >= 0, - enabled: word.indexOf("!") < 0, + rude: word.indexOf('$') >= 0, + enabled: word.indexOf('!') < 0, weight: - 10 * - (word.indexOf("$") >= 0 ? 0.5 : 1) * - (word.indexOf("%") >= 0 ? 0.5 : 1) * - (word.indexOf("^") >= 0 ? 2 : 1), + 10 * + (word.indexOf('$') >= 0 ? 0.5 : 1) * + (word.indexOf('%') >= 0 ? 0.5 : 1) * + (word.indexOf('^') >= 0 ? 2 : 1), }); }); return result; } -(window as any).BuildStupdiTitleVariant = BuildStupdiTitleVariant; +declare global { + interface Window { + BuildStupidTitleVariant( + gender: boolean | null, + input: string, + ): StupidTitleVariant; + } +} + +window.BuildStupidTitleVariant = BuildStupidTitleVariant; + diff --git a/src/main.ts b/src/main.ts index c496eda..541769d 100644 --- a/src/main.ts +++ b/src/main.ts @@ -1,19 +1,23 @@ -import { JokerClass } from "./joker"; -import { Joke } from "./joke"; -import { ShakeJoke } from "./jokes/shake"; -import { HumanitarianHellJoke } from "./jokes/humanitarian_hell"; -import { MirrorJoke } from "./jokes/mirror"; -import { CarnivalJoke } from "./jokes/carnival"; -import { CrazyLettersJoke } from "./jokes/crazy_letters"; -import { LetterChaosJoke } from "./jokes/letter_chaos"; -import { CursorEffectsJoke } from "./jokes/cursor"; -import { StupidTitleJoke } from "./jokes/stupid_title"; +import {JokerClass} from './joker'; +import {Joke, JokeSettings} from './joke'; +import {ShakeJoke} from './jokes/shake'; +import {HumanitarianHellJoke} from './jokes/humanitarian_hell'; +import {MirrorJoke} from './jokes/mirror'; +import {CarnivalJoke} from './jokes/carnival'; +import {CrazyLettersJoke} from './jokes/crazy_letters'; +import {LetterChaosJoke} from './jokes/letter_chaos'; +import {CursorEffectsJoke} from './jokes/cursor'; +import {StupidTitleJoke} from './jokes/stupid_title'; -(window as any).AprilJokes = ((jokes: JokeClassList): JokerClass => { +declare global { + interface Window { AprilJokes: JokerClass; } +} + +window.AprilJokes = ((jokes: JokeList): JokerClass => { const cl = new JokerClass(); - jokes.forEach((joke) => { - cl.add(new joke()); + jokes.forEach((CustomJoke) => { + cl.add(new CustomJoke()); }); $(() => cl.regularStart()); @@ -30,4 +34,4 @@ import { StupidTitleJoke } from "./jokes/stupid_title"; StupidTitleJoke, ]); -interface JokeClassList extends Array Joke> {} +interface JokeList extends Array Joke> {} diff --git a/src/types/FORUM.d.ts b/src/types/FORUM.d.ts new file mode 100644 index 0000000..b31d5a9 --- /dev/null +++ b/src/types/FORUM.d.ts @@ -0,0 +1,108 @@ +/** + * Настройки формы ответа MyBB + */ +export type MybbEditor = { + settings: MybbEditorSettings; + [key: string]: MybbEditorTag | MybbEditorSettings; +} + +/** + * Общий объект настройки тега MyBB + */ +export class MybbEditorTag { + /** + * Название кнопки. + */ + name: string; + + /** + * Функция, которая будет вызвана при нажатии кнопки. + */ + onclick: () => void; +} + +/** + * Общий объект настройки формы ответа MyBB + */ +export type MybbEditorSettings = { + autofocus: string +} + +/** + * Информация о теме + */ +export class MybbTopic { + /** + * Тема сообщения + */ + subject: string; + + /** + * Флаг закрытия + * @type "0"|"1" + */ + closed: string; + + /** + * Количество ответов в теме + */ + num_replies: string; + + /** + * Количество просмотров темы + */ + num_views: string; + + /** + * ID форума + */ + forum_id: string; + + /** + * Имя форума + */ + forum_name: string; + + /** + * Список модераторов форума, + * ключ - ID пользователя, значение - имя модератора + */ + moderators: { + [key in string]: string + }; + + /** + * Объект языков + */ + language: { + share_legend: string + }; +} + + +/** + * Настройки видео-хостингов + */ +// eslint-disable-next-line +export class MYBB_vsc { + // eslint-disable-next-line + cH: any; + RG: { [key: string]: MYBB_vsc_item }; + checkHost: (hostingItem: MYBB_vsc_item, input: string) => boolean; + clickHost: (element: HTMLAnchorElement) => void; + parse: () => void; + isLink: (input: string) => boolean; + message: (html: string) => void; + reInit: () => void; +} + +/** + * Настройка отдельного видео-хостинга + */ +// eslint-disable-next-line +type MYBB_vsc_item = { + l: '0' | '1'; + t: string; + x: RegExp; + nf: string; +} diff --git a/src/types/ForumDUtils.d.ts b/src/types/ForumDUtils.d.ts new file mode 100644 index 0000000..cbf3ff9 --- /dev/null +++ b/src/types/ForumDUtils.d.ts @@ -0,0 +1,28 @@ +/** + * Объект утилит ForumDUtils + */ +export class ForumDUtils { + /** + * Проверяет, разрешён ли запуск скрипта + */ + check(): Promise; + + /** + * Ошибка, сообщающая о невозможности запуска скрипта + */ + error(): Error; + + /** + * Набор настроек скриптов + */ + scripts: { + [key in string]: ForumDUtilsScript; + }; +} + +/** + * Класс настроек скриптов + */ +export abstract class ForumDUtilsScript { + +} diff --git a/src/html.d.ts b/src/types/html.d.ts similarity index 67% rename from src/html.d.ts rename to src/types/html.d.ts index 3a031d8..448f7d1 100644 --- a/src/html.d.ts +++ b/src/types/html.d.ts @@ -1,4 +1,4 @@ -declare module "*.html" { +declare module '*.html' { const content: string; export default content; } diff --git a/src/types/mybb.d.ts b/src/types/mybb.d.ts new file mode 100644 index 0000000..4b9460a --- /dev/null +++ b/src/types/mybb.d.ts @@ -0,0 +1,335 @@ +// eslint-disable-next-line camelcase +import {MYBB_vsc, MybbEditor, MybbTopic} from './FORUM'; +import {ForumDUtils} from './ForumDUtils'; + +declare global { + interface Window { + /** + * Объект для работы с ForumD Utils. + */ + FDU?: ForumDUtils; + + /** + * Объект настроек форума. + */ + FORUM: { + topic?: MybbTopic; + editor?: MybbEditor; + }; + + /** + * Вставить в форму цитату в теге [quote]. + * @param {string} author Автор сообщения + * @param {number} postId ID сообщения, из которого происходит цитата + */ + quote(author: string, postId: number): void; + + /** + * Вставка BB-кода. + * @param {string} tagStart Текст, что будет вставлен до выделения + * @param {string} tagEnd Текст, что будет вставлен после выделения + */ + bbcode(tagStart: string, tagEnd: string): void; + + /** + * Изменить видимость служебной области. + * @param {string} areaName Идентификатор области + */ + changeVisibility(areaName: string): void; + + /** + * Вставка сообщения. + * @param {string} value + */ + insert(value: string): void; + + /** + * Вставить смайл. + * @param {string} emote Код смайла + */ + smile(emote: string): void; + + /** + * Вставка тега таблицы. + * @param {number} rows Количество строк + * @param {number} columns Количество столбцов + */ + // eslint-disable-next-line camelcase + tag_table(rows: number, columns: number): void; + + /** + * Метод выбора видео-хостинга. + * @param {HTMLElement} element Элемент + * @param {Event|Event[]} event Событие + */ + // eslint-disable-next-line camelcase + MYBB_vsi(element: HTMLElement, event: Event|Event[]): void; + + /** + * Объект с правилами для видео-тегов. + */ + // eslint-disable-next-line camelcase + MYBB_vsc: MYBB_vsc; + + /** + * Вставка загруженного изображения. + * @param {HTMLElement | JQuery} element Элемент области вставки + */ + insertUploadedImage(element: HTMLElement | JQuery): void; + + /** + * Вставка тега спойлера. + * @param {string} spoilerType Тип спойлера + */ + // eslint-disable-next-line camelcase + tag_spoiler(spoilerType: string): void; + + /** + * Вставка символа клавиатуры. + * @param {string} character Вставляемый символ + */ + keyboard(character: string): void; + + /** + * Вставить обращение к пользователю. + * @param {string} target Имя пользователя + */ + to(target: string): void; + + // ===== Переменные форума ===== + + /** + * ID форума. + */ + BoardID: number; + + /** + * Категория форума в каталоге. + */ + BoardCat: number; + + /** + * Название стиля форума или `Custom`, если используется свой стиль. + */ + BoardStyle: string; + + /** + * API-код пользователя. + */ + ForumAPITicket: string; + + /** + * ID группы пользователя. + * `1` - это группа администраторов, `2` - модераторов, `3` - гостей. + */ + GroupID: number; + + /** + * Название группы пользователя. + */ + GroupTitle: string; + + /** + * Статус группы пользователя. + */ + GroupUserTitle: string; + + /** + * ID партнёра форума. + */ + PartnerID: number; + + /** + * Время запроса к форуму. + */ + RequestTime: number; + + /** + * Префикс URL для доступа к статическим файлам. + * Не имеет заключающей косой черты. + */ + StaticURL: string; + + /** + * Префикс URL для доступа к аватарам. + * Не имеет заключающей косой черты. + */ + AvatarsURL: string; + + /** + * Префикс URL для доступа к файлам форума. + * Не имеет заключающей косой черты. + */ + FilesURL: string; + + /** + * Префикс URL для доступа к скриптам. + * Не имеет заключающей косой черты. + */ + ScriptsURL: string; + + /** + * Префикс URL для доступа к загружаемым файлам. + * Не имеет заключающей косой черты. + */ + UploadsURL: string; + + /** + * ID пользователя. + */ + UserID?: number; + + /** + * Логин пользователя. + */ + UserLogin?: string; + + /** + * Имя пользователя. + */ + UserName?: string; + + /** + * Статус пользователя + */ + UserTitle?: string; + + /** + * Пол пользователя. + * 0 - мужской, 1 - женский. + */ + UserSex?: number; + + /** + * Возраст пользователя. + */ + UserAge?: number; + + /** + * Дата рождения пользователя. + */ + UserBirthDate?: string; + + /** + * Ссылка на аватар пользователя. + * Не содержит домен, но имеет начальную косую черту. + * @see AvatarsURL + */ + UserAvatar?: string; + + /** + * Время регистрации пользователя. + */ + UserRegistered?: number; + + /** + * Код приглашения пользователя. + */ + UserInviteCode?: string; + + /** + * Количество сообщений пользователя. + */ + UserPosts?: number; + + /** + * Время последнего сообщения. + */ + UserLastPost?: number; + + /** + * Время последнего посещения. + */ + UserLastVisit?: number; + + /** + * Время пребывания пользователя на форуме. + */ + UserTotalTime?: number; + + /** + * Количество плюсов, полученных пользователем. + */ + UserRespectPlus?: number; + + /** + * Количество минусов, полученных пользователем. + */ + UserRespectMinus?: number; + + /** + * Количество плюсов, поставленных пользователем. + */ + UserPositivePlus?: number; + + /** + * Количество плюсов, поставленных пользователем. + */ + UserPositiveMinus?: number; + + /** + * Уникальный ID пользователя. + */ + UserUniqueID?: string; + + /** + * Язык пользователя. + */ + UserLanguage?: string; + + /** + * Путь к папке. + */ + UserUploadsDir?: string; + + /** + * Дополнительное поле форума 1. + */ + UserFld1?: string; + + /** + * Дополнительное поле форума 2. + */ + UserFld2?: string; + + /** + * Дополнительное поле форума 3. + */ + UserFld3?: string; + + /** + * Дополнительное поле форума 4. + */ + UserFld4?: string; + + /** + * Дополнительное поле форума 5. + */ + UserFld5?: string; + + /** + * Дополнительное поле форума 6. + */ + UserFld6?: string; + + /** + * Дополнительное поле форума 7. + */ + UserFld7?: string; + + /** + * Дополнительное поле форума 8. + */ + UserFld8?: string; + + /** + * Дополнительное поле форума 9. + */ + UserFld9?: string; + } + + interface JQuery { + mybbModal(data: object): JQuery; + } + +} diff --git a/src/ui.ts b/src/ui.ts index db3401c..d4d902e 100644 --- a/src/ui.ts +++ b/src/ui.ts @@ -1,23 +1,36 @@ -/// -import { JokerClass } from "./joker"; -import $ from "jquery"; -import button_html from "./html/button.html"; -import styles_html from "./html/styles.html"; -import window_html from "./html/window.html"; +// / +import './types/html.d.ts'; +import './types/mybb.d.ts'; + +import {JokerClass} from './joker'; +import $ from 'jquery'; +import buttonHTML from './html/button.html'; +import stylesHTML from './html/styles.html'; +import windowHTML from './html/window.html'; + +/** + * Класс интерфейса настроек + */ export class JokerUI { joker: JokerClass; + /** + * Создание класса интерфейса настроек + * + * @param {JokerClass} joker + */ constructor(joker: JokerClass) { this.joker = joker; - $('link[rel="stylesheet"]').eq(0).before(styles_html); + $('link[rel="stylesheet"]').eq(0).before(stylesHTML); const button = this.button; button.hide(); - (button).mybbModal({ - title: "Настройки первоапрельских шуток", + + button.mybbModal({ + title: 'Настройки первоапрельских шуток', content: () => this.render(), closer: true, noscroll: true, @@ -25,40 +38,53 @@ export class JokerUI { }); } - get button() { - let button = $(".april-fools__button"); + /** + * Основная кнопка, открывающая настройки + * @return {JQuery} + */ + get button(): JQuery { + let button = $('.april-fools__button'); if (button.length === 0) { - button = $(button_html).appendTo("body"); + button = $(buttonHTML).appendTo('body'); } - return button; + return button as JQuery; } + /** + * Показать кнопку настроек + */ show() { this.button.show(); } - render(): JQuery { - const result: JQuery = $("
").html(window_html); - const row_template = $("#april-fools__window-row", result).html(); - const joke_container = $(".april-fools__jokes", result); + /** + * Создать окно настроек + * @return {JQuery} + */ + render(): JQuery { + const result = $('
').html(windowHTML) as JQuery; + const rowTemplate = $('#april-fools__window-row', result).html(); + const jokeContainer = $('.april-fools__jokes', result); for (const joke of Object.values(this.joker.jokes)) { - const row = $(eval("`" + row_template + "`")); + const row = $(eval('`' + rowTemplate + '`')); $('input[type="checkbox"]', row) - .prop("checked", joke.settings.enabled) - .on("click", (e) => - this.joker.toggleJoke(joke.id, (e).currentTarget.checked) + .prop('checked', joke.settings.enabled) + .on('click', (e) => { + const target = (e.currentTarget as HTMLInputElement); + this.joker.toggleJoke(joke.id, target.checked); + } ); - joke_container.append(row); + jokeContainer.append(row); } - $("button", result).on("click", async () => { + $('button', result).on('click', async () => { await this.joker.clearUserStates(); window.location.reload(); }); - return $(".april-fools__content", result); + return $('.april-fools__content', result); } }