From 42da33f3c87711c801a8a0ef4e6f6a9847ea4f9d Mon Sep 17 00:00:00 2001 From: "Christopher S. Case" Date: Thu, 16 May 2024 15:33:15 -0500 Subject: [PATCH] upgrade to express v5. --- package-lock.json | 666 +++++++++--------- package.json | 4 +- src/client/components.d.ts | 3 + src/server/routes/accounts.ts | 23 +- src/server/routes/characters.ts | 25 +- src/server/routes/notebook.ts | 33 +- src/server/routes/roles.ts | 6 +- src/server/routes/systems/eote.ts | 9 +- src/server/routes/systems/genesys.ts | 9 +- src/server/routes/systems/utils/supplement.ts | 25 +- src/server/routes/utils/index.ts | 16 +- src/server/routes/utils/query.ts | 39 +- src/server/routes/utils/router.ts | 16 - src/server/server.ts | 16 +- 14 files changed, 462 insertions(+), 428 deletions(-) diff --git a/package-lock.json b/package-lock.json index b6fe9db5..2765dca4 100644 --- a/package-lock.json +++ b/package-lock.json @@ -12,13 +12,13 @@ "@strata-js/util-config": "^0.6.0", "@strata-js/util-logging": "^1.2.0", "axios": "^1.2.2", - "better-sqlite3": "^9.6.0", + "better-sqlite3": "^10.0.0", "body-parser": "^1.19.0", "connect-session-knex": "^4.0.0", "cookie-parser": "^1.4.3", "decoders": "^1.23.3", "dotenv": "^16.3.1", - "express": "^4.17.1", + "express": "^5.0.0-beta.3", "express-session": "^1.17.1", "helmet": "^7.1.0", "if-env": "^1.0.4", @@ -79,9 +79,9 @@ } }, "node_modules/@antfu/utils": { - "version": "0.7.7", - "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.7.tgz", - "integrity": "sha512-gFPqTG7otEJ8uP6wrhDv6mqwGWYZKNvAcCq6u9hOj0c+IKCEsY4L1oC9trPq2SaWIzAfHvqfBDxF591JkMf+kg==", + "version": "0.7.8", + "resolved": "https://registry.npmjs.org/@antfu/utils/-/utils-0.7.8.tgz", + "integrity": "sha512-rWQkqXRESdjXtc+7NRfK9lASQjpXJu1ayp7qi1d23zZorY+wBHVLHHoVcMsEnkqEBWTFqbztO7/QdJFzyEcLTg==", "dev": true, "funding": { "url": "https://github.com/sponsors/antfu" @@ -220,9 +220,9 @@ } }, "node_modules/@codemirror/lint": { - "version": "6.7.0", - "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.7.0.tgz", - "integrity": "sha512-LTLOL2nT41ADNSCCCCw8Q/UmdAFzB23OUYSjsHTdsVaH0XEo+orhuqbDNWzrzodm14w6FOxqxpmy4LF8Lixqjw==", + "version": "6.7.1", + "resolved": "https://registry.npmjs.org/@codemirror/lint/-/lint-6.7.1.tgz", + "integrity": "sha512-rELba6QJD20/bNXWP/cKTGLrwVEcpa2ViwULCV03ONcY1Je85++7sczVRUlnE4TJMjatx3IJTz6HX4NXi+moXw==", "dev": true, "dependencies": { "@codemirror/state": "^6.0.0", @@ -682,6 +682,28 @@ "url": "https://opencollective.com/eslint" } }, + "node_modules/@eslint/eslintrc/node_modules/brace-expansion": { + "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" + } + }, + "node_modules/@eslint/eslintrc/node_modules/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, "node_modules/@eslint/js": { "version": "8.57.0", "resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.57.0.tgz", @@ -692,9 +714,9 @@ } }, "node_modules/@floating-ui/core": { - "version": "1.6.1", - "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.1.tgz", - "integrity": "sha512-42UH54oPZHPdRHdw6BgoBD6cg/eVTmVrFcgeRDM3jbO7uxSoipVcmcIGFcA5jmOHO5apcyvBhkSKES3fQJnu7A==", + "version": "1.6.2", + "resolved": "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.2.tgz", + "integrity": "sha512-+2XpQV9LLZeanU4ZevzRnGFg2neDeKHgFLjP6YLW+tly0IvrhqT4u8enLGjLH3qeh85g19xY5rsAusfwTdn5lg==", "dev": true, "dependencies": { "@floating-ui/utils": "^0.2.0" @@ -839,6 +861,28 @@ "node": ">=10.10.0" } }, + "node_modules/@humanwhocodes/config-array/node_modules/brace-expansion": { + "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" + } + }, + "node_modules/@humanwhocodes/config-array/node_modules/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, "node_modules/@humanwhocodes/module-importer": { "version": "1.0.1", "resolved": "https://registry.npmjs.org/@humanwhocodes/module-importer/-/module-importer-1.0.1.tgz", @@ -1423,24 +1467,18 @@ "dev": true }, "node_modules/@types/jquery": { - "version": "3.5.29", - "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.29.tgz", - "integrity": "sha512-oXQQC9X9MOPRrMhPHHOsXqeQDnWeCDT3PelUIg/Oy8FAbzSZtFHRjc7IpbfFVmpLtJ+UOoywpRsuO5Jxjybyeg==", + "version": "3.5.30", + "resolved": "https://registry.npmjs.org/@types/jquery/-/jquery-3.5.30.tgz", + "integrity": "sha512-nbWKkkyb919DOUxjmRVk8vwtDb0/k8FKncmUKFi+NY+QXqWltooxTrswvz4LspQwxvLdvzBN1TImr6cw3aQx2A==", "dev": true, "dependencies": { "@types/sizzle": "*" } }, - "node_modules/@types/json-schema": { - "version": "7.0.15", - "resolved": "https://registry.npmjs.org/@types/json-schema/-/json-schema-7.0.15.tgz", - "integrity": "sha512-5+fP8P8MFNC+AyZCDxrB2pkZFPGzqQWUzpSeuuVLvm8VMcorNYavBqoFcxK8bQz4Qsbn4oUEEem4wDLfcysGHA==", - "dev": true - }, "node_modules/@types/lodash": { - "version": "4.17.1", - "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.1.tgz", - "integrity": "sha512-X+2qazGS3jxLAIz5JDXDzglAF3KpijdhFxlf/V1+hEsOUc+HnWi81L/uv/EvGuV90WY+7mPGFCUDGfQC3Gj95Q==", + "version": "4.17.3", + "resolved": "https://registry.npmjs.org/@types/lodash/-/lodash-4.17.3.tgz", + "integrity": "sha512-zmNrEJaBvNskZXQWaUQq6bktF4IDGVfDS78M+YEk5aCn9M/b94/mB/6WCyfH2/MjwBdc6QuOor95CIlKWYRL3A==", "dev": true }, "node_modules/@types/marked": { @@ -1460,9 +1498,9 @@ "dev": true }, "node_modules/@types/node": { - "version": "20.12.10", - "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.10.tgz", - "integrity": "sha512-Eem5pH9pmWBHoGAT8Dr5fdc5rYA+4NAovdM4EktRPVAAiJhmWWfQrA0cFhAbOsQdSfIHjAud6YdkbL69+zSKjw==", + "version": "20.12.12", + "resolved": "https://registry.npmjs.org/@types/node/-/node-20.12.12.tgz", + "integrity": "sha512-eWLDGF/FOSPtAvEqeRAQ4C8LSA7M1I7i0ky1I8U7kD1J5ITyW3AsRhQrKVoWf5pFKZ2kILsEGJhsI9r93PYnOw==", "dependencies": { "undici-types": "~5.26.4" } @@ -1488,12 +1526,6 @@ "integrity": "sha512-hKormJbkJqzQGhziax5PItDUTMAM9uE2XXQmM37dyd4hVM+5aVl7oVxMVUiVQn2oCQFN/LKCZdvSM0pFRqbSmQ==", "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==", - "dev": true - }, "node_modules/@types/send": { "version": "0.17.4", "resolved": "https://registry.npmjs.org/@types/send/-/send-0.17.4.tgz", @@ -1528,21 +1560,19 @@ "dev": true }, "node_modules/@typescript-eslint/eslint-plugin": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.8.0.tgz", - "integrity": "sha512-gFTT+ezJmkwutUPmB0skOj3GZJtlEGnlssems4AjkVweUPGj7jRwwqg0Hhg7++kPGJqKtTYx+R05Ftww372aIg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-7.9.0.tgz", + "integrity": "sha512-6e+X0X3sFe/G/54aC3jt0txuMTURqLyekmEHViqyA2VnxhLMpvA6nqmcjIy+Cr9tLDHPssA74BP5Mx9HQIxBEA==", "dev": true, "dependencies": { "@eslint-community/regexpp": "^4.10.0", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/type-utils": "7.8.0", - "@typescript-eslint/utils": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", - "debug": "^4.3.4", + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/type-utils": "7.9.0", + "@typescript-eslint/utils": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", "graphemer": "^1.4.0", "ignore": "^5.3.1", "natural-compare": "^1.4.0", - "semver": "^7.6.0", "ts-api-utils": "^1.3.0" }, "engines": { @@ -1563,15 +1593,15 @@ } }, "node_modules/@typescript-eslint/parser": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.8.0.tgz", - "integrity": "sha512-KgKQly1pv0l4ltcftP59uQZCi4HUYswCLbTqVZEJu7uLX8CTLyswqMLqLN+2QFz4jCptqWVV4SB7vdxcH2+0kQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-7.9.0.tgz", + "integrity": "sha512-qHMJfkL5qvgQB2aLvhUSXxbK7OLnDkwPzFalg458pxQgfxKDfT1ZDbHQM/I6mDIf/svlMkj21kzKuQ2ixJlatQ==", "dev": true, "dependencies": { - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/typescript-estree": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", "debug": "^4.3.4" }, "engines": { @@ -1591,13 +1621,13 @@ } }, "node_modules/@typescript-eslint/scope-manager": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.8.0.tgz", - "integrity": "sha512-viEmZ1LmwsGcnr85gIq+FCYI7nO90DVbE37/ll51hjv9aG+YZMb4WDE2fyWpUR4O/UrhGRpYXK/XajcGTk2B8g==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-7.9.0.tgz", + "integrity": "sha512-ZwPK4DeCDxr3GJltRz5iZejPFAAr4Wk3+2WIBaj1L5PYK5RgxExu/Y68FFVclN0y6GGwH8q+KgKRCvaTmFBbgQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0" + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1608,13 +1638,13 @@ } }, "node_modules/@typescript-eslint/type-utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.8.0.tgz", - "integrity": "sha512-H70R3AefQDQpz9mGv13Uhi121FNMh+WEaRqcXTX09YEDky21km4dV1ZXJIp8QjXc4ZaVkXVdohvWDzbnbHDS+A==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-7.9.0.tgz", + "integrity": "sha512-6Qy8dfut0PFrFRAZsGzuLoM4hre4gjzWJB6sUvdunCYZsYemTkzZNwF1rnGea326PHPT3zn5Lmg32M/xfJfByA==", "dev": true, "dependencies": { - "@typescript-eslint/typescript-estree": "7.8.0", - "@typescript-eslint/utils": "7.8.0", + "@typescript-eslint/typescript-estree": "7.9.0", + "@typescript-eslint/utils": "7.9.0", "debug": "^4.3.4", "ts-api-utils": "^1.3.0" }, @@ -1635,9 +1665,9 @@ } }, "node_modules/@typescript-eslint/types": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.8.0.tgz", - "integrity": "sha512-wf0peJ+ZGlcH+2ZS23aJbOv+ztjeeP8uQ9GgwMJGVLx/Nj9CJt17GWgWWoSmoRVKAX2X+7fzEnAjxdvK2gqCLw==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/types/-/types-7.9.0.tgz", + "integrity": "sha512-oZQD9HEWQanl9UfsbGVcZ2cGaR0YT5476xfWE0oE5kQa2sNK2frxOlkeacLOTh9po4AlUT5rtkGyYM5kew0z5w==", "dev": true, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1648,13 +1678,13 @@ } }, "node_modules/@typescript-eslint/typescript-estree": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.8.0.tgz", - "integrity": "sha512-5pfUCOwK5yjPaJQNy44prjCwtr981dO8Qo9J9PwYXZ0MosgAbfEMB008dJ5sNo3+/BN6ytBPuSvXUg9SAqB0dg==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-7.9.0.tgz", + "integrity": "sha512-zBCMCkrb2YjpKV3LA0ZJubtKCDxLttxfdGmwZvTqqWevUPN0FZvSI26FalGFFUZU/9YQK/A4xcQF9o/VVaCKAg==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/visitor-keys": "7.8.0", + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/visitor-keys": "7.9.0", "debug": "^4.3.4", "globby": "^11.1.0", "is-glob": "^4.0.3", @@ -1675,43 +1705,16 @@ } } }, - "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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/@typescript-eslint/typescript-estree/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/@typescript-eslint/utils": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.8.0.tgz", - "integrity": "sha512-L0yFqOCflVqXxiZyXrDr80lnahQfSOfc9ELAAZ75sqicqp2i36kEZZGuUymHNFoYOqxRT05up760b4iGsl02nQ==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-7.9.0.tgz", + "integrity": "sha512-5KVRQCzZajmT4Ep+NEgjXCvjuypVvYHUW7RHlXzNPuak2oWpVoD1jf5xCP0dPAuNIchjC7uQyvbdaSTFaLqSdA==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", - "@types/json-schema": "^7.0.15", - "@types/semver": "^7.5.8", - "@typescript-eslint/scope-manager": "7.8.0", - "@typescript-eslint/types": "7.8.0", - "@typescript-eslint/typescript-estree": "7.8.0", - "semver": "^7.6.0" + "@typescript-eslint/scope-manager": "7.9.0", + "@typescript-eslint/types": "7.9.0", + "@typescript-eslint/typescript-estree": "7.9.0" }, "engines": { "node": "^18.18.0 || >=20.0.0" @@ -1725,12 +1728,12 @@ } }, "node_modules/@typescript-eslint/visitor-keys": { - "version": "7.8.0", - "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.8.0.tgz", - "integrity": "sha512-q4/gibTNBQNA0lGyYQCmWRS5D15n8rXh4QjK3KV+MBPlTYHpfBUT3D3PaPR/HeNiI9W6R7FvlkcGhNyAoP+caA==", + "version": "7.9.0", + "resolved": "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-7.9.0.tgz", + "integrity": "sha512-iESPx2TNLDNGQLyjKhUvIKprlP49XNEK+MvIf9nIO7ZZaZdbnfWKHnXAgufpxqfA0YryH8XToi4+CjBgVnFTSQ==", "dev": true, "dependencies": { - "@typescript-eslint/types": "7.8.0", + "@typescript-eslint/types": "7.9.0", "eslint-visitor-keys": "^3.4.3" }, "engines": { @@ -2157,9 +2160,9 @@ "dev": true }, "node_modules/array-flatten": { - "version": "1.1.1", - "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", - "integrity": "sha512-PCVAQswWemu6UdxsDFFX/+gVeYqKAod3D3UVm91jHwynguOwAvYPhx8nNlM++NqRcK6CxxpUafjmhIdKiHibqg==" + "version": "3.0.0", + "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-3.0.0.tgz", + "integrity": "sha512-zPMVc3ZYlGLNk4mpK1NzP2wg0ml9t7fUgDsayR5Y5rSzxQilzR9FGu/EH2jQOcKSAeAfWeylyW8juy3OkWRvNA==" }, "node_modules/array-union": { "version": "2.1.0", @@ -2203,11 +2206,6 @@ "regenerator-runtime": "^0.10.5" } }, - "node_modules/babel-polyfill/node_modules/regenerator-runtime": { - "version": "0.10.5", - "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", - "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==" - }, "node_modules/babel-runtime": { "version": "6.26.0", "resolved": "https://registry.npmjs.org/babel-runtime/-/babel-runtime-6.26.0.tgz", @@ -2263,9 +2261,9 @@ } }, "node_modules/better-sqlite3": { - "version": "9.6.0", - "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-9.6.0.tgz", - "integrity": "sha512-yR5HATnqeYNVnkaUTf4bOP2dJSnyhP4puJN/QPRyx4YkBEEUxib422n2XzPqDEHjQQqazoYoADdAm5vE15+dAQ==", + "version": "10.0.0", + "resolved": "https://registry.npmjs.org/better-sqlite3/-/better-sqlite3-10.0.0.tgz", + "integrity": "sha512-rOz0JY8bt9oMgrFssP7GnvA5R3yln73y/NizzWqy3WlFth8Ux8+g4r/N9fjX97nn4X1YX6MTER2doNpTu5pqiA==", "hasInstallScript": true, "dependencies": { "bindings": "^1.5.0", @@ -2405,9 +2403,9 @@ } }, "node_modules/bootstrap-vue-next": { - "version": "0.17.5", - "resolved": "https://registry.npmjs.org/bootstrap-vue-next/-/bootstrap-vue-next-0.17.5.tgz", - "integrity": "sha512-W7DIcYdTjhuAnJFub+4vgbC8G1oxW5txiFFwnGE+obdfJ8B2xuW+cpOwh2EsdBYE9YGTgAHtZ6uiNGjYFsIohw==", + "version": "0.17.6", + "resolved": "https://registry.npmjs.org/bootstrap-vue-next/-/bootstrap-vue-next-0.17.6.tgz", + "integrity": "sha512-dfZdJEVlpmzVLGJUY15+yWBqC3iMd9iItBwVQ1FRcPcGUoziU45KcdF+YdEMHmRaVuT0VKfC96wpTFTeHrA0Mw==", "dev": true, "dependencies": { "@floating-ui/vue": "^1.0.6", @@ -2422,12 +2420,12 @@ } }, "node_modules/brace-expansion": { - "version": "1.1.11", - "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", - "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "version": "2.0.1", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-2.0.1.tgz", + "integrity": "sha512-XnAIvQ8eM+kC6aULx6wuQiwVsnzsi9d3WxzV3FpWTGA19F621kwdbsAcFKXgKUHZWsy+mY6iL1sHTxWEFCytDA==", + "dev": true, "dependencies": { - "balanced-match": "^1.0.0", - "concat-map": "0.0.1" + "balanced-match": "^1.0.0" } }, "node_modules/braces": { @@ -3159,9 +3157,9 @@ } }, "node_modules/eslint-plugin-vue": { - "version": "9.25.0", - "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.25.0.tgz", - "integrity": "sha512-tDWlx14bVe6Bs+Nnh3IGrD+hb11kf2nukfm6jLsmJIhmiRQ1SUaksvwY9U5MvPB0pcrg0QK0xapQkfITs3RKOA==", + "version": "9.26.0", + "resolved": "https://registry.npmjs.org/eslint-plugin-vue/-/eslint-plugin-vue-9.26.0.tgz", + "integrity": "sha512-eTvlxXgd4ijE1cdur850G6KalZqk65k1JKoOI2d1kT3hr8sPD07j1q98FRFdNnpxBELGPWxZmInxeHGF/GxtqQ==", "dev": true, "dependencies": { "@eslint-community/eslint-utils": "^4.4.0", @@ -3180,11 +3178,15 @@ "eslint": "^6.2.0 || ^7.0.0 || ^8.0.0 || ^9.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==", + "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, + "dependencies": { + "esrecurse": "^4.3.0", + "estraverse": "^5.2.0" + }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3192,15 +3194,11 @@ "url": "https://opencollective.com/eslint" } }, - "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==", + "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, - "dependencies": { - "esrecurse": "^4.3.0", - "estraverse": "^5.2.0" - }, "engines": { "node": "^12.22.0 || ^14.17.0 || >=16.0.0" }, @@ -3208,13 +3206,26 @@ "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==", + "node_modules/eslint/node_modules/brace-expansion": { + "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" + } + }, + "node_modules/eslint/node_modules/minimatch": { + "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" + }, "engines": { - "node": ">=4.0" + "node": "*" } }, "node_modules/esm": { @@ -3254,15 +3265,6 @@ "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==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/esrecurse": { "version": "4.3.0", "resolved": "https://registry.npmjs.org/esrecurse/-/esrecurse-4.3.0.tgz", @@ -3275,7 +3277,7 @@ "node": ">=4.0" } }, - "node_modules/esrecurse/node_modules/estraverse": { + "node_modules/estraverse": { "version": "5.3.0", "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", @@ -3375,18 +3377,18 @@ } }, "node_modules/express": { - "version": "4.19.2", - "resolved": "https://registry.npmjs.org/express/-/express-4.19.2.tgz", - "integrity": "sha512-5T6nhjsT+EOMzuck8JjBHARTHfMht0POzlA60WV2pMD3gyXw2LZnZ+ueGdNxG+0calOJcWKbpFcuzLZ91YWq9Q==", + "version": "5.0.0-beta.3", + "resolved": "https://registry.npmjs.org/express/-/express-5.0.0-beta.3.tgz", + "integrity": "sha512-e7Qizw4gMBVe1Ky2oNi5C1h6oS8aWDcY2yYxvRMy5aMc6t2aqobuHpQRfR3LRC9NAW/c6081SeGWMGBorLXePg==", "dependencies": { "accepts": "~1.3.8", - "array-flatten": "1.1.1", - "body-parser": "1.20.2", + "array-flatten": "3.0.0", + "body-parser": "2.0.0-beta.2", "content-disposition": "0.5.4", "content-type": "~1.0.4", "cookie": "0.6.0", "cookie-signature": "1.0.6", - "debug": "2.6.9", + "debug": "3.1.0", "depd": "2.0.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", @@ -3396,15 +3398,17 @@ "http-errors": "2.0.0", "merge-descriptors": "1.0.1", "methods": "~1.1.2", + "mime-types": "~2.1.34", "on-finished": "2.4.1", "parseurl": "~1.3.3", - "path-to-regexp": "0.1.7", + "path-is-absolute": "1.0.1", "proxy-addr": "~2.0.7", "qs": "6.11.0", "range-parser": "~1.2.1", + "router": "2.0.0-beta.2", "safe-buffer": "5.2.1", - "send": "0.18.0", - "serve-static": "1.15.0", + "send": "1.0.0-beta.2", + "serve-static": "2.0.0-beta.2", "setprototypeof": "1.2.0", "statuses": "2.0.1", "type-is": "~1.6.18", @@ -3412,7 +3416,7 @@ "vary": "~1.1.2" }, "engines": { - "node": ">= 0.10.0" + "node": ">= 4" } }, "node_modules/express-session": { @@ -3459,6 +3463,27 @@ "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/express/node_modules/body-parser": { + "version": "2.0.0-beta.2", + "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-2.0.0-beta.2.tgz", + "integrity": "sha512-oxdqeGYQcO5ovwwkC1A89R0Mf0v3+7smTVh0chGfzDeiK37bg5bYNtXDy3Nmzn6CShoIYk5+nHTyBoSZIWwnCA==", + "dependencies": { + "bytes": "3.1.2", + "content-type": "~1.0.5", + "debug": "3.1.0", + "destroy": "1.2.0", + "http-errors": "2.0.0", + "iconv-lite": "0.5.2", + "on-finished": "2.4.1", + "qs": "6.11.0", + "raw-body": "3.0.0-beta.1", + "type-is": "~1.6.18", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/express/node_modules/cookie": { "version": "0.6.0", "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.6.0.tgz", @@ -3468,18 +3493,43 @@ } }, "node_modules/express/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dependencies": { "ms": "2.0.0" } }, + "node_modules/express/node_modules/iconv-lite": { + "version": "0.5.2", + "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.5.2.tgz", + "integrity": "sha512-kERHXvpSaB4aU3eANwidg79K8FlrN77m8G9V+0vOR3HYaRifrlwMEpT7ZBJqLSEIHnEgJTHcWK82wwLwwKwtag==", + "dependencies": { + "safer-buffer": ">= 2.1.2 < 3" + }, + "engines": { + "node": ">=0.10.0" + } + }, "node_modules/express/node_modules/ms": { "version": "2.0.0", "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", "integrity": "sha512-Tpp60P6IUJDTuOq/5Z8cdskzJujfwqfOTkrwIwj7IRISpnkJnT6SyJ4PCPnGMoFjC9ddhal5KVIYtAt97ix05A==" }, + "node_modules/express/node_modules/raw-body": { + "version": "3.0.0-beta.1", + "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-3.0.0-beta.1.tgz", + "integrity": "sha512-XlSTHr67bCjSo5aOfAnN3x507zGvi3unF65BW57limYkc2ws/XB0mLUtJvvP7JGFeSPsYrlCv1ZrPGh0cwDxPQ==", + "dependencies": { + "bytes": "3.1.2", + "http-errors": "2.0.0", + "iconv-lite": "0.5.2", + "unpipe": "1.0.0" + }, + "engines": { + "node": ">= 0.8" + } + }, "node_modules/fast-copy": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/fast-copy/-/fast-copy-3.0.2.tgz", @@ -3656,6 +3706,16 @@ "node": "^10.12.0 || >=12.0.0" } }, + "node_modules/flat-cache/node_modules/brace-expansion": { + "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" + } + }, "node_modules/flat-cache/node_modules/glob": { "version": "7.2.3", "resolved": "https://registry.npmjs.org/glob/-/glob-7.2.3.tgz", @@ -3676,6 +3736,18 @@ "url": "https://github.com/sponsors/isaacs" } }, + "node_modules/flat-cache/node_modules/minimatch": { + "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" + }, + "engines": { + "node": "*" + } + }, "node_modules/flat-cache/node_modules/rimraf": { "version": "3.0.2", "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-3.0.2.tgz", @@ -3860,22 +3932,22 @@ "integrity": "sha512-SyHy3T1v2NUXn29OsWdxmK6RwHD+vkj3v8en8AOBZ1wBQ/hCAQ5bAQTD02kW4W9tUp/3Qh6J8r9EvntiyCmOOw==" }, "node_modules/glob": { - "version": "10.3.12", - "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.12.tgz", - "integrity": "sha512-TCNv8vJ+xz4QiqTpfOJA7HvYv+tNIRHKfUWw/q+v2jdgN4ebz+KY9tGx5J4rHP0o84mNP+ApH66HRX8us3Khqg==", + "version": "10.3.15", + "resolved": "https://registry.npmjs.org/glob/-/glob-10.3.15.tgz", + "integrity": "sha512-0c6RlJt1TICLyvJYIApxb8GsXoai0KUP7AxKKAtsYXdgJR1mGEUa7DgwShbdk1nly0PYoZj01xd4hzbq3fsjpw==", "dev": true, "dependencies": { "foreground-child": "^3.1.0", "jackspeak": "^2.3.6", "minimatch": "^9.0.1", "minipass": "^7.0.4", - "path-scurry": "^1.10.2" + "path-scurry": "^1.11.0" }, "bin": { "glob": "dist/esm/bin.mjs" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -3893,30 +3965,6 @@ "node": ">=10.13.0" } }, - "node_modules/glob/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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/glob/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/globals": { "version": "13.24.0", "resolved": "https://registry.npmjs.org/globals/-/globals-13.24.0.tgz", @@ -4126,9 +4174,9 @@ } }, "node_modules/immutable": { - "version": "4.3.5", - "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.5.tgz", - "integrity": "sha512-8eabxkth9gZatlwl5TBuJnCsoTADlL6ftEr7A4qgdaTsPyreilDSnUk57SO+jfKcNtxPa22U5KK6DSeAYhpBJw==", + "version": "4.3.6", + "resolved": "https://registry.npmjs.org/immutable/-/immutable-4.3.6.tgz", + "integrity": "sha512-Ju0+lEMyzMVZarkTn/gqRpdqd5dOPaz1mCZ0SH3JV6iFw81PldE/PEB1hWVEA288HPt4WXW8O7AWxB10M+03QQ==", "dev": true }, "node_modules/import-fresh": { @@ -4274,6 +4322,11 @@ "node": ">=8" } }, + "node_modules/is-promise": { + "version": "4.0.0", + "resolved": "https://registry.npmjs.org/is-promise/-/is-promise-4.0.0.tgz", + "integrity": "sha512-hvpoI6korhJMnej285dSg6nu1+e6uxs7zG3BYAm5byqDsgJNWwxzM6z6iZiAgQR4TJ30JmBTOwqZUw3WlyH3AQ==" + }, "node_modules/is-stream": { "version": "3.0.0", "resolved": "https://registry.npmjs.org/is-stream/-/is-stream-3.0.0.tgz", @@ -4748,17 +4801,6 @@ "node": ">=8.6" } }, - "node_modules/mime": { - "version": "1.6.0", - "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", - "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==", - "bin": { - "mime": "cli.js" - }, - "engines": { - "node": ">=4" - } - }, "node_modules/mime-db": { "version": "1.52.0", "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.52.0.tgz", @@ -4802,14 +4844,18 @@ } }, "node_modules/minimatch": { - "version": "3.1.2", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", - "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "version": "9.0.4", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", + "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", + "dev": true, "dependencies": { - "brace-expansion": "^1.1.7" + "brace-expansion": "^2.0.1" }, "engines": { - "node": "*" + "node": ">=16 || 14 >=14.17" + }, + "funding": { + "url": "https://github.com/sponsors/isaacs" } }, "node_modules/minimist": { @@ -4821,9 +4867,9 @@ } }, "node_modules/minipass": { - "version": "7.1.0", - "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.0.tgz", - "integrity": "sha512-oGZRv2OT1lO2UF1zUcwdTb3wqUwI0kBGTgt/T7OdSj6M6N5m3o5uPf0AIW6lVxGGoiWUR7e2AwTE+xiwK8WQig==", + "version": "7.1.1", + "resolved": "https://registry.npmjs.org/minipass/-/minipass-7.1.1.tgz", + "integrity": "sha512-UZ7eQ+h8ywIRAW1hIEl2AqdwzJucU/Kp59+8kkZeSvafXhZjul247BvIJjEVFVeON6d7lM46XX1HXCduKAS8VA==", "dev": true, "engines": { "node": ">=16 || 14 >=14.17" @@ -4932,6 +4978,26 @@ "npm-run-all": "bin/npm-run-all.js" } }, + "node_modules/npm-run-all/node_modules/brace-expansion": { + "version": "1.1.11", + "resolved": "https://registry.npmjs.org/brace-expansion/-/brace-expansion-1.1.11.tgz", + "integrity": "sha512-iCuPHDFgrHX7H2vEI/5xpz07zSHB00TpugqhmYtVmMO6518mCuRMoOYFldEBl0g187ufozdaHgWKcYFb61qGiA==", + "dependencies": { + "balanced-match": "^1.0.0", + "concat-map": "0.0.1" + } + }, + "node_modules/npm-run-all/node_modules/minimatch": { + "version": "3.1.2", + "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-3.1.2.tgz", + "integrity": "sha512-J7p63hRiAjw1NDEww1W7i37+ByIrOWO5XQQAzZ3VOcL0PNybwpfmV/N05zFAzwQ9USyEcX6t3UO+K5aqBQOIHw==", + "dependencies": { + "brace-expansion": "^1.1.7" + }, + "engines": { + "node": "*" + } + }, "node_modules/npm-run-all/node_modules/which": { "version": "1.3.1", "resolved": "https://registry.npmjs.org/which/-/which-1.3.1.tgz", @@ -5196,7 +5262,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" } @@ -5216,25 +5281,25 @@ "integrity": "sha512-LDJzPVEEEPR+y48z93A0Ed0yXb8pAByGWo/k5YYdYgpY2/2EsOsksJrq7lOHxryrVOn1ejG6oAp8ahvOIQD8sw==" }, "node_modules/path-scurry": { - "version": "1.10.2", - "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.10.2.tgz", - "integrity": "sha512-7xTavNy5RQXnsjANvVvMkEjvloOinkAjv/Z6Ildz9v2RinZ4SBKTWFOVRbaF8p0vpHnyjV/UwNDdKuUv6M5qcA==", + "version": "1.11.1", + "resolved": "https://registry.npmjs.org/path-scurry/-/path-scurry-1.11.1.tgz", + "integrity": "sha512-Xa4Nw17FS9ApQFJ9umLiJS4orGjm7ZzwUrwamcGQuHSzDyth9boKDaycYdDcZDuqYATXw4HFXgaqWTctW/v1HA==", "dev": true, "dependencies": { "lru-cache": "^10.2.0", "minipass": "^5.0.0 || ^6.0.2 || ^7.0.0" }, "engines": { - "node": ">=16 || 14 >=14.17" + "node": ">=16 || 14 >=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" } }, "node_modules/path-to-regexp": { - "version": "0.1.7", - "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", - "integrity": "sha512-5DFkuoqlv1uYQKxy8omFBeJPQcdoE07Kv2sferDCrAq1ohOU+MSDswDIbnx3YAM60qIOnYa53wBhXW0EbMonrQ==" + "version": "3.2.0", + "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-3.2.0.tgz", + "integrity": "sha512-jczvQbCUS7XmS7o+y1aEO9OBVFeZBQ1MDSEqmO7xSoPgOPoowY/SxLpZ6Vh97/8qHZOteiCKb7gkG9gA2ZUxJA==" }, "node_modules/path-type": { "version": "4.0.0", @@ -5270,9 +5335,9 @@ "integrity": "sha512-ch6OwaeaPYcova4kKZ15sbJ2hKb/VP48ZD2gE7i1J+L4MspCtBMAx8nMgz7bksc7IojCIIWuEhHibSMFH8m8oA==" }, "node_modules/picocolors": { - "version": "1.0.0", - "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.0.tgz", - "integrity": "sha512-1fygroTLlHu66zi26VoTDv8yRgm0Fccecssto+MhsZ0D/DGW2sm8E8AjW7NU5VVTRt5GxbeZ5qBuJr+HyLYkjQ==", + "version": "1.0.1", + "resolved": "https://registry.npmjs.org/picocolors/-/picocolors-1.0.1.tgz", + "integrity": "sha512-anP1Z8qwhkbmu7MFP5iTt+wQKXgwzf7zTyGlcdzabySa9vd0Xt392U0rVmz9poOaBj0uHJKyyo9/upk0HrEQew==", "dev": true }, "node_modules/picomatch": { @@ -5412,13 +5477,13 @@ "integrity": "sha512-cHjPPsE+vhj/tnhCy/wiMh3M3z3h/j15zHQX+S9GkTBgqJuTuJzYJ4gUyACLhDaJ7kk9ba9iRDmbH2tJU03OiA==" }, "node_modules/pkg-types": { - "version": "1.1.0", - "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.0.tgz", - "integrity": "sha512-/RpmvKdxKf8uILTtoOhAgf30wYbP2Qw+L9p3Rvshx1JZVX+XQNZQFjlbmGHEGIm4CkVPlSn+NXmIM8+9oWQaSA==", + "version": "1.1.1", + "resolved": "https://registry.npmjs.org/pkg-types/-/pkg-types-1.1.1.tgz", + "integrity": "sha512-ko14TjmDuQJ14zsotODv7dBlwxKhUKQEhuhmbqo1uCi9BB0Z2alo/wAXg6q1dTR5TyuqYyWhjtfe/Tsh+X28jQ==", "dev": true, "dependencies": { "confbox": "^0.1.7", - "mlly": "^1.6.1", + "mlly": "^1.7.0", "pathe": "^1.1.2" } }, @@ -5706,6 +5771,11 @@ "node": ">= 10.13.0" } }, + "node_modules/regenerator-runtime": { + "version": "0.10.5", + "resolved": "https://registry.npmjs.org/regenerator-runtime/-/regenerator-runtime-0.10.5.tgz", + "integrity": "sha512-02YopEIhAgiBHWeoTiA8aitHDt8z6w+rQqNuIftlM+ZtvSl/brTouaU7DW6GO/cHtvxJvS4Hwv2ibKdxIRi24w==" + }, "node_modules/resize-observer-polyfill": { "version": "1.5.1", "resolved": "https://registry.npmjs.org/resize-observer-polyfill/-/resize-observer-polyfill-1.5.1.tgz", @@ -5800,9 +5870,9 @@ "dev": true }, "node_modules/rimraf": { - "version": "5.0.5", - "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.5.tgz", - "integrity": "sha512-CqDakW+hMe/Bz202FPEymy68P+G50RfMQK+Qo5YUqc9SPipvbGjCGKd0RSKEelbsfQuw3g5NZDSrlZZAJurH1A==", + "version": "5.0.7", + "resolved": "https://registry.npmjs.org/rimraf/-/rimraf-5.0.7.tgz", + "integrity": "sha512-nV6YcJo5wbLW77m+8KjH8aB/7/rxQy9SZ0HY5shnwULfS+9nmTtVXAJET5NdZmCzA4fPI/Hm1wo/Po/4mopOdg==", "dev": true, "dependencies": { "glob": "^10.3.7" @@ -5811,7 +5881,7 @@ "rimraf": "dist/esm/bin.mjs" }, "engines": { - "node": ">=14" + "node": ">=14.18" }, "funding": { "url": "https://github.com/sponsors/isaacs" @@ -5852,6 +5922,23 @@ "fsevents": "~2.3.2" } }, + "node_modules/router": { + "version": "2.0.0-beta.2", + "resolved": "https://registry.npmjs.org/router/-/router-2.0.0-beta.2.tgz", + "integrity": "sha512-ascmzrv4IAB64SpWzFwYOA+jz6PaUbrzHLPsQrPjQ3uQTL2qlhwY9S2sRvvBMgUISQptQG457jcWWcWqtwrbag==", + "dependencies": { + "array-flatten": "3.0.0", + "is-promise": "4.0.0", + "methods": "~1.1.2", + "parseurl": "~1.3.3", + "path-to-regexp": "3.2.0", + "setprototypeof": "1.2.0", + "utils-merge": "1.0.1" + }, + "engines": { + "node": ">= 0.10" + } + }, "node_modules/rpgdicejs": { "version": "2.0.3", "resolved": "https://registry.npmjs.org/rpgdicejs/-/rpgdicejs-2.0.3.tgz", @@ -5919,9 +6006,9 @@ "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" }, "node_modules/sass": { - "version": "1.77.0", - "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.0.tgz", - "integrity": "sha512-eGj4HNfXqBWtSnvItNkn7B6icqH14i3CiCGbzMKs3BAPTq62pp9NBYsBgyN4cA+qssqo9r26lW4JSvlaUUWbgw==", + "version": "1.77.1", + "resolved": "https://registry.npmjs.org/sass/-/sass-1.77.1.tgz", + "integrity": "sha512-OMEyfirt9XEfyvocduUIOlUSkWOXS/LAt6oblR/ISXCTukyavjex+zQNm51pPCOiFKY1QpWvEH1EeCkgyV3I6w==", "dev": true, "dependencies": { "chokidar": ">=3.0.0 <4.0.0", @@ -5942,12 +6029,9 @@ "dev": true }, "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" - }, + "version": "7.6.2", + "resolved": "https://registry.npmjs.org/semver/-/semver-7.6.2.tgz", + "integrity": "sha512-FNAIBWCx9qcRhoHcgcJ0gvU7SN1lYU2ZXuSfl04bSC5OpvDHFyJCjdNHomPXxjQlCBU67YW64PzY7/VIEH7F2w==", "bin": { "semver": "bin/semver.js" }, @@ -5955,44 +6039,32 @@ "node": ">=10" } }, - "node_modules/semver/node_modules/lru-cache": { - "version": "6.0.0", - "resolved": "https://registry.npmjs.org/lru-cache/-/lru-cache-6.0.0.tgz", - "integrity": "sha512-Jo6dJ04CmSjuznwJSS3pUeWmd/H0ffTlkXXgwZi+eq1UCmqQwCh+eLsYOYCwY991i2Fah4h1BEMCx4qThGbsiA==", - "dependencies": { - "yallist": "^4.0.0" - }, - "engines": { - "node": ">=10" - } - }, "node_modules/send": { - "version": "0.18.0", - "resolved": "https://registry.npmjs.org/send/-/send-0.18.0.tgz", - "integrity": "sha512-qqWzuOjSFOuqPjFe4NOsMLafToQQwBSOEpS+FwEt3A2V3vKubTquT3vmLTQpFgMXp8AlFWFuP1qKaJZOtPpVXg==", + "version": "1.0.0-beta.2", + "resolved": "https://registry.npmjs.org/send/-/send-1.0.0-beta.2.tgz", + "integrity": "sha512-k1yHu/FNK745PULKdsGpQ+bVSXYNwSk+bWnYzbxGZbt5obZc0JKDVANsCRuJD1X/EG15JtP9eZpwxkhUxIYEcg==", "dependencies": { - "debug": "2.6.9", - "depd": "2.0.0", + "debug": "3.1.0", "destroy": "1.2.0", "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "etag": "~1.8.1", "fresh": "0.5.2", "http-errors": "2.0.0", - "mime": "1.6.0", + "mime-types": "~2.1.34", "ms": "2.1.3", "on-finished": "2.4.1", "range-parser": "~1.2.1", "statuses": "2.0.1" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.10" } }, "node_modules/send/node_modules/debug": { - "version": "2.6.9", - "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", - "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", + "version": "3.1.0", + "resolved": "https://registry.npmjs.org/debug/-/debug-3.1.0.tgz", + "integrity": "sha512-OX8XqP7/1a9cqkxYw2yXss15f26NKWBpDXQd0/uK/KPqdQhxbPa994hnzjcE2VqQpDslf55723cKPUOGSmMY3g==", "dependencies": { "ms": "2.0.0" } @@ -6008,17 +6080,17 @@ "integrity": "sha512-6FlzubTLZG3J2a/NVCAleEhjzq5oxgHyaCU9yYXvcLsvoVaHJq/s5xXI6/XXP6tz7R9xAOtHnSO/tXtF3WRTlA==" }, "node_modules/serve-static": { - "version": "1.15.0", - "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.15.0.tgz", - "integrity": "sha512-XGuRDNjXUijsUL0vl6nSD7cwURuzEgglbOaFuZM9g3kwDXOWVTck0jLzjPzGD+TazWbboZYu52/9/XPdUgne9g==", + "version": "2.0.0-beta.2", + "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-2.0.0-beta.2.tgz", + "integrity": "sha512-Ge718g4UJjzYoXFEGLY/VLSuTHp0kQcUV65QA98J8d3XREsVIHu53GBh9NWjDy4u2xwsSwRzu9nu7Q+b4o6Xyw==", "dependencies": { "encodeurl": "~1.0.2", "escape-html": "~1.0.3", "parseurl": "~1.3.3", - "send": "0.18.0" + "send": "^1.0.0-beta.2" }, "engines": { - "node": ">= 0.8.0" + "node": ">= 0.10" } }, "node_modules/set-function-length": { @@ -6728,30 +6800,6 @@ } } }, - "node_modules/unplugin-vue-components/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==", - "dev": true, - "dependencies": { - "balanced-match": "^1.0.0" - } - }, - "node_modules/unplugin-vue-components/node_modules/minimatch": { - "version": "9.0.4", - "resolved": "https://registry.npmjs.org/minimatch/-/minimatch-9.0.4.tgz", - "integrity": "sha512-KqWh+VchfxcMNRAJjj2tnsSJdNbHsVgnkBhTNrW7AjVo6OvLtxw8zfT9oLw1JSohlFzJ8jCoTgaoXvJ+kHt6fw==", - "dev": true, - "dependencies": { - "brace-expansion": "^2.0.1" - }, - "engines": { - "node": ">=16 || 14 >=14.17" - }, - "funding": { - "url": "https://github.com/sponsors/isaacs" - } - }, "node_modules/uri-js": { "version": "4.4.1", "resolved": "https://registry.npmjs.org/uri-js/-/uri-js-4.4.1.tgz", @@ -6898,31 +6946,6 @@ "eslint": ">=6.0.0" } }, - "node_modules/vue-eslint-parser/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, - "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/vue-eslint-parser/node_modules/estraverse": { - "version": "5.3.0", - "resolved": "https://registry.npmjs.org/estraverse/-/estraverse-5.3.0.tgz", - "integrity": "sha512-MMdARuVEQziNTeJD8DgMqmhwR11BRQ/cBP+pLtYdSTnf3MIO8fFeiINEbX36ZdNlfU/7A9f3gUw49B3oQsvwBA==", - "dev": true, - "engines": { - "node": ">=4.0" - } - }, "node_modules/vue-router": { "version": "4.3.2", "resolved": "https://registry.npmjs.org/vue-router/-/vue-router-4.3.2.tgz", @@ -7129,11 +7152,6 @@ "node": ">=0.4.0" } }, - "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/yaml": { "version": "2.4.2", "resolved": "https://registry.npmjs.org/yaml/-/yaml-2.4.2.tgz", diff --git a/package.json b/package.json index 684abde7..f8223b3b 100644 --- a/package.json +++ b/package.json @@ -17,13 +17,13 @@ "@strata-js/util-config": "^0.6.0", "@strata-js/util-logging": "^1.2.0", "axios": "^1.2.2", - "better-sqlite3": "^9.6.0", + "better-sqlite3": "^10.0.0", "body-parser": "^1.19.0", "connect-session-knex": "^4.0.0", "cookie-parser": "^1.4.3", "decoders": "^1.23.3", "dotenv": "^16.3.1", - "express": "^4.17.1", + "express": "^5.0.0-beta.3", "express-session": "^1.17.1", "helmet": "^7.1.0", "if-env": "^1.0.4", diff --git a/src/client/components.d.ts b/src/client/components.d.ts index 59a7a300..e8a9121b 100644 --- a/src/client/components.d.ts +++ b/src/client/components.d.ts @@ -23,6 +23,7 @@ declare module 'vue' { BFormCheckbox: typeof import('bootstrap-vue-next')['BFormCheckbox'] BFormGroup: typeof import('bootstrap-vue-next')['BFormGroup'] BFormInput: typeof import('bootstrap-vue-next')['BFormInput'] + BFormRadio: typeof import('bootstrap-vue-next')['BFormRadio'] BFormRow: typeof import('bootstrap-vue-next')['BFormRow'] BFormSelect: typeof import('bootstrap-vue-next')['BFormSelect'] BFormSpinbutton: typeof import('bootstrap-vue-next')['BFormSpinbutton'] @@ -30,6 +31,7 @@ declare module 'vue' { BInputGroup: typeof import('bootstrap-vue-next')['BInputGroup'] BInputGroupAppend: typeof import('bootstrap-vue-next')['BInputGroupAppend'] BInputGroupPrepend: typeof import('bootstrap-vue-next')['BInputGroupPrepend'] + BInputGroupText: typeof import('bootstrap-vue-next')['BInputGroupText'] BListGroup: typeof import('bootstrap-vue-next')['BListGroup'] BListGroupItem: typeof import('bootstrap-vue-next')['BListGroupItem'] BModal: typeof import('bootstrap-vue-next')['BModal'] @@ -44,6 +46,7 @@ declare module 'vue' { BRow: typeof import('bootstrap-vue-next')['BRow'] BTab: typeof import('bootstrap-vue-next')['BTab'] BTable: typeof import('bootstrap-vue-next')['BTable'] + BTableLite: typeof import('bootstrap-vue-next')['BTableLite'] BTableSimple: typeof import('bootstrap-vue-next')['BTableSimple'] BTabs: typeof import('bootstrap-vue-next')['BTabs'] BTbody: typeof import('bootstrap-vue-next')['BTbody'] diff --git a/src/server/routes/accounts.ts b/src/server/routes/accounts.ts index 76f24380..f536c452 100644 --- a/src/server/routes/accounts.ts +++ b/src/server/routes/accounts.ts @@ -4,13 +4,15 @@ import express from 'express'; -import { ensureAuthenticated, errorHandler, wrapAsync } from './utils'; - // Managers import * as accountMan from '../managers/account'; +import * as permsMan from '../managers/permissions'; +// Models import { Account } from '../models/account'; -import * as permsMan from '../managers/permissions'; + +// Utils +import { convertQueryToRecord, ensureAuthenticated, errorHandler } from './utils'; // Logger import logging from '@strata-js/util-logging'; @@ -22,17 +24,18 @@ const router = express.Router(); //---------------------------------------------------------------------------------------------------------------------- -router.get('/', wrapAsync(async(req, resp) => +router.get('/', async(req, resp) => { - const filters = { id: req.query.id, email: req.query.email, name: req.query.name }; + const query = convertQueryToRecord(req); + const filters = { id: query.id, email: query.email, name: query.name }; resp.json((await accountMan.list(filters)).map((accountObj) => { const { permissions, settings, groups, ...restAccount } = accountObj; return restAccount; })); -})); +}); -router.get('/:accountID', wrapAsync(async(req, resp) => +router.get('/:accountID', async(req, resp) => { const user = req.user as Account; const account = await accountMan.get(req.params.accountID); @@ -48,14 +51,14 @@ router.get('/:accountID', wrapAsync(async(req, resp) => const { permissions, groups, settings, ...restAccount } = account; resp.json(restAccount); } -})); +}); -router.patch('/:accountID', ensureAuthenticated, wrapAsync(async(req, resp) => +router.patch('/:accountID', ensureAuthenticated, async(req, resp) => { // Update the account const newAccount = await accountMan.update(req.params.accountID, req.body); resp.json(newAccount); -})); +}); //---------------------------------------------------------------------------------------------------------------------- // Error Handling diff --git a/src/server/routes/characters.ts b/src/server/routes/characters.ts index 316f6298..54897d2b 100644 --- a/src/server/routes/characters.ts +++ b/src/server/routes/characters.ts @@ -11,7 +11,7 @@ import * as permsMan from '../managers/permissions'; import sysMan from '../managers/system'; // Utils -import { ensureAuthenticated, errorHandler, interceptHTML, parseQuery, wrapAsync } from './utils'; +import { convertQueryToRecord, ensureAuthenticated, errorHandler, interceptHTML, parseQuery } from './utils'; import { Account } from '../models/account'; // Logger @@ -28,12 +28,14 @@ router.get('/', async(req, resp) => { interceptHTML(resp, async() => { + const query = convertQueryToRecord(req); + // If we pass in `owner`, it'll be an email address, so we need to look that up first, and shove the correct // account id into the filters as if that was passed in. - let owner = req.query.owner; + let owner = query.owner; if(owner) { - delete req.query.owner; + delete query.owner; if(Array.isArray(owner)) { @@ -44,16 +46,17 @@ router.get('/', async(req, resp) => { owner = owner.toLowerCase(); const account = await accountMan.getByEmail(owner); - req.query.accountID = `${ account.id }`; + query.accountID = `${ account.id }`; } } - const filters = parseQuery(req.query as Record); + const filters = parseQuery(query); + resp.json(await charMan.list(filters)); }); }); -router.post('/', ensureAuthenticated, wrapAsync(async(req, resp) => +router.post('/', ensureAuthenticated, async(req, resp) => { const char = { ...req.body }; const system = sysMan.get(char.system); @@ -70,7 +73,7 @@ router.post('/', ensureAuthenticated, wrapAsync(async(req, resp) => message: `The character with id '${ char.id }' has an invalid or unknown system '${ char.system }'.` }); } -})); +}); router.get('/:charID', (req, resp) => { @@ -80,7 +83,7 @@ router.get('/:charID', (req, resp) => }); }); -router.patch('/:charID', ensureAuthenticated, wrapAsync(async(req, resp) => +router.patch('/:charID', ensureAuthenticated, async(req, resp) => { // First, retrieve the character const char = await charMan.get(req.params.charID); @@ -113,9 +116,9 @@ router.patch('/:charID', ensureAuthenticated, wrapAsync(async(req, resp) => message: `You are not authorized to update character '${ req.params.charID }'.` }); } -})); +}); -router.delete('/:charID', ensureAuthenticated, wrapAsync(async(req, resp) => +router.delete('/:charID', ensureAuthenticated, async(req, resp) => { let char; try @@ -151,7 +154,7 @@ router.delete('/:charID', ensureAuthenticated, wrapAsync(async(req, resp) => message: `You are not authorized to update character '${ req.params.charID }'.` }); } -})); +}); //---------------------------------------------------------------------------------------------------------------------- // Error Handling diff --git a/src/server/routes/notebook.ts b/src/server/routes/notebook.ts index 7fb48579..cbbdfec4 100644 --- a/src/server/routes/notebook.ts +++ b/src/server/routes/notebook.ts @@ -4,7 +4,7 @@ import express from 'express'; -import { ensureAuthenticated, errorHandler, wrapAsync } from './utils'; +import { convertQueryToRecord, ensureAuthenticated, errorHandler } from './utils'; // Managers import * as noteMan from '../managers/notebook'; @@ -23,11 +23,12 @@ const router = express.Router(); //---------------------------------------------------------------------------------------------------------------------- -router.get('/', wrapAsync(async(req, resp) => +router.get('/', async(req, resp) => { if(req.isAuthenticated() && await hasPerm(req.user as Account, 'Notes/canViewAll')) { - const filters = { id: req.query.id, email: req.query.email, title: req.query.title }; + const query = convertQueryToRecord(req); + const filters = { id: query.id, email: query.email, title: query.title }; resp.json(await noteMan.list(filters)); } else @@ -39,20 +40,20 @@ router.get('/', wrapAsync(async(req, resp) => message: `You are not authorized to view all notes.` }); } -})); +}); -router.post('/', ensureAuthenticated, wrapAsync(async(req, resp) => +router.post('/', ensureAuthenticated, async(req, resp) => { const pages = req.body.pages; resp.json(await noteMan.add(pages)); -})); +}); -router.get('/:noteID', wrapAsync(async(req, resp) => +router.get('/:noteID', async(req, resp) => { resp.json(await noteMan.get(req.params.noteID)); -})); +}); -router.post('/:noteID/pages', ensureAuthenticated, wrapAsync(async(req, resp) => +router.post('/:noteID/pages', ensureAuthenticated, async(req, resp) => { const page = req.body; @@ -65,22 +66,22 @@ router.post('/:noteID/pages', ensureAuthenticated, wrapAsync(async(req, resp) => // Update the note resp.json(await noteMan.addPage(note.id, page)); -})); +}); -router.patch('/:noteID/pages/:pageID', ensureAuthenticated, wrapAsync(async(req, resp) => +router.patch('/:noteID/pages/:pageID', ensureAuthenticated, async(req, resp) => { // Update the note const newPage = await noteMan.updatePage(req.params.pageID, req.body); resp.json(newPage); -})); +}); -router.delete('/:noteID', ensureAuthenticated, wrapAsync(async(req, resp) => +router.delete('/:noteID', ensureAuthenticated, async(req, resp) => { // We don't check for existence, so we can be idempotent resp.json(await noteMan.remove(req.params.noteID)); -})); +}); -router.delete('/:noteID/pages/:pageID', ensureAuthenticated, wrapAsync(async(req, resp) => +router.delete('/:noteID/pages/:pageID', ensureAuthenticated, async(req, resp) => { const notebook = await noteMan.get(req.params.noteID); const page = (notebook.pages.filter((pageInst) => pageInst.id == req.params.pageID))[0]; @@ -95,7 +96,7 @@ router.delete('/:noteID/pages/:pageID', ensureAuthenticated, wrapAsync(async(req // We don't throw an error, so we can be idempotent resp.json({ status: 'ok' }); } -})); +}); //---------------------------------------------------------------------------------------------------------------------- // Error Handling diff --git a/src/server/routes/roles.ts b/src/server/routes/roles.ts index e7eca7cf..fc5b4ad5 100644 --- a/src/server/routes/roles.ts +++ b/src/server/routes/roles.ts @@ -4,7 +4,7 @@ import express from 'express'; -import { errorHandler, wrapAsync } from './utils'; +import { errorHandler } from './utils'; // Managers import * as rolesMan from '../managers/roles'; @@ -19,10 +19,10 @@ const router = express.Router(); //---------------------------------------------------------------------------------------------------------------------- -router.get('/', wrapAsync(async(_req, resp) => +router.get('/', async(_req, resp) => { resp.json((await rolesMan.list())); -})); +}); //---------------------------------------------------------------------------------------------------------------------- // Error Handling diff --git a/src/server/routes/systems/eote.ts b/src/server/routes/systems/eote.ts index 0576211b..60739f3c 100644 --- a/src/server/routes/systems/eote.ts +++ b/src/server/routes/systems/eote.ts @@ -9,7 +9,7 @@ import refMan from '../../managers/references'; // Utils import { buildSupplementRoute } from './utils/supplement'; -import { errorHandler, wrapAsync, parseQuery } from '../utils'; +import { errorHandler, parseQuery, convertQueryToRecord } from '../utils'; // Logger import logging from '@strata-js/util-logging'; @@ -30,11 +30,12 @@ buildSupplementRoute(router, '/talents', 'talent', 'eote'); buildSupplementRoute(router, '/weapons', 'weapon', 'eote'); buildSupplementRoute(router, '/forcepowers', 'forcepower', 'eote'); -router.get('/references', wrapAsync(async(req, resp) => +router.get('/references', async(req, resp) => { - const filters = parseQuery(req.query as Record); + const query = convertQueryToRecord(req); + const filters = parseQuery(query); resp.json(await refMan.getFiltered(filters, 'eote_reference')); -})); +}); //---------------------------------------------------------------------------------------------------------------------- // Error Handling diff --git a/src/server/routes/systems/genesys.ts b/src/server/routes/systems/genesys.ts index 417103b7..cab6a631 100644 --- a/src/server/routes/systems/genesys.ts +++ b/src/server/routes/systems/genesys.ts @@ -9,7 +9,7 @@ import refMan from '../../managers/references'; // Utils import { buildSupplementRoute } from './utils/supplement'; -import { errorHandler, parseQuery, wrapAsync } from '../utils'; +import { convertQueryToRecord, errorHandler, parseQuery } from '../utils'; // Logger import logging from '@strata-js/util-logging'; @@ -30,11 +30,12 @@ buildSupplementRoute(router, '/talents', 'talent', 'genesys'); buildSupplementRoute(router, '/weapons', 'weapon', 'genesys'); buildSupplementRoute(router, '/motivations', 'motivation', 'genesys'); -router.get('/references', wrapAsync(async(req, resp) => +router.get('/references', async(req, resp) => { - const filters = parseQuery(req.query as Record); + const query = convertQueryToRecord(req); + const filters = parseQuery(query); resp.json(await refMan.getFiltered(filters, 'genesys_reference')); -})); +}); //---------------------------------------------------------------------------------------------------------------------- // Error Handling diff --git a/src/server/routes/systems/utils/supplement.ts b/src/server/routes/systems/utils/supplement.ts index e75f2872..fa424d08 100644 --- a/src/server/routes/systems/utils/supplement.ts +++ b/src/server/routes/systems/utils/supplement.ts @@ -11,7 +11,7 @@ import * as suppMan from '../../../managers/supplement'; import { Account } from '../../../models/account'; // Utils -import { ensureAuthenticated, wrapAsync, parseQuery } from '../../utils'; +import { ensureAuthenticated, parseQuery, convertQueryToRecord } from '../../utils'; //---------------------------------------------------------------------------------------------------------------------- @@ -21,13 +21,14 @@ export function buildSupplementRoute(router : IRouter, path : string, type : str // Build Basic CRUD Routes for supplements //------------------------------------------------------------------------------------------------------------------ - router.get(path, wrapAsync(async(req, resp) => + router.get(path, async(req, resp) => { - const filters = parseQuery(req.query as Record); + const query = convertQueryToRecord(req); + const filters = parseQuery(query); resp.json(await suppMan.list(filters, type, systemPrefix, req.user as Account)); - })); + }); - router.get(`${ path }/:suppID`, wrapAsync(async(req, resp) => + router.get(`${ path }/:suppID`, async(req, resp) => { const suppID = parseInt(req.params.suppID); if(Number.isFinite(suppID)) @@ -42,14 +43,14 @@ export function buildSupplementRoute(router : IRouter, path : string, type : str message: `No ${ type } with id '${ suppID }' found.` }); } - })); + }); - router.post(path, ensureAuthenticated, wrapAsync(async(req, resp) => + router.post(path, ensureAuthenticated, async(req, resp) => { resp.json(await suppMan.add(req.body, type, systemPrefix, req.user as Account)); - })); + }); - router.patch(`${ path }/:suppID`, ensureAuthenticated, wrapAsync(async(req, resp) => + router.patch(`${ path }/:suppID`, ensureAuthenticated, async(req, resp) => { const suppID = parseInt(req.params.suppID); if(Number.isFinite(suppID)) @@ -64,9 +65,9 @@ export function buildSupplementRoute(router : IRouter, path : string, type : str message: `No ${ type } with id '${ suppID }' found.` }); } - })); + }); - router.delete(`${ path }/:suppID`, ensureAuthenticated, wrapAsync(async(req, resp) => + router.delete(`${ path }/:suppID`, ensureAuthenticated, async(req, resp) => { const suppID = parseInt(req.params.suppID); if(Number.isFinite(suppID)) @@ -81,7 +82,7 @@ export function buildSupplementRoute(router : IRouter, path : string, type : str message: `No ${ type } with id '${ suppID }' found.` }); } - })); + }); } //---------------------------------------------------------------------------------------------------------------------- diff --git a/src/server/routes/utils/index.ts b/src/server/routes/utils/index.ts index 40550710..08d1f3b9 100644 --- a/src/server/routes/utils/index.ts +++ b/src/server/routes/utils/index.ts @@ -2,19 +2,7 @@ // Router utils //---------------------------------------------------------------------------------------------------------------------- -export { filterByQuery, parseQuery } from './query'; - -export { - ensureAuthenticated, - errorHandler, - errorLogger, - interceptHTML, - requestLogger, - serveIndex, - wrapAsync, - MiddlewareFunction, - ErrorMiddlewareFunction, - JsonHandlerFunction -} from './router'; +export * from './query'; +export * from './router'; //---------------------------------------------------------------------------------------------------------------------- diff --git a/src/server/routes/utils/query.ts b/src/server/routes/utils/query.ts index 618d0b21..eb86e6b6 100644 --- a/src/server/routes/utils/query.ts +++ b/src/server/routes/utils/query.ts @@ -3,6 +3,7 @@ //---------------------------------------------------------------------------------------------------------------------- import _ from 'lodash'; +import { Request } from 'express'; import logging from '@strata-js/util-logging'; const logger = logging.getLogger(module.filename); @@ -204,6 +205,34 @@ function containsFilter(queryVal : QueryFilterVal) : (modelVal : QueryFilterVal) // Public API //---------------------------------------------------------------------------------------------------------------------- +/** + * Convert the request query object to a record. + * + * @param request - The request object. + * + * @returns a record of the query parameters. + */ +export function convertQueryToRecord(request : Request) : Record +{ + const record : Record = {}; + for(const key in request.query) + { + if(Object.prototype.hasOwnProperty.call(request.query, key)) + { + const value = request.query[key]; + if(Array.isArray(value)) + { + record[key] = value.map(String); + } + else + { + record[key] = String(value); + } + } + } + return record; +} + /** * Parse the query object for filters, and build a parse tree of those filters. * @@ -211,11 +240,17 @@ function containsFilter(queryVal : QueryFilterVal) : (modelVal : QueryFilterVal) * * @returns a parse tree of the query parameters. */ -export function parseQuery(queryObj : Record) : Record +export function parseQuery(queryObj : Record) : Record { const parseTree = {}; - _.forIn(queryObj, (value : string, key : string) => + _.forIn(queryObj, (value : string | string[], key : string) => { + // Convert arrays into single strings + if(Array.isArray(value)) + { + value = value.join(','); + } + // Check for greater than or less than if(value.substr(0, 2) === '>=') { diff --git a/src/server/routes/utils/router.ts b/src/server/routes/utils/router.ts index 940bac45..80b114bd 100644 --- a/src/server/routes/utils/router.ts +++ b/src/server/routes/utils/router.ts @@ -165,20 +165,4 @@ export function ensureAuthenticated(request : Request, response : Response, next } } -/** - * Wraps a router function in an async handler. - * - * @param handler - Express router function. - * - * @returns Express router function. - */ -export function wrapAsync(handler : JsonHandlerFunction) : MiddlewareFunction -{ - return function(req, res, next) - { - // Make sure to `.catch()` any errors and pass them along to the `next()` middleware in the chain - handler(req, res, next).catch(next); - }; -} // ebd wrapAsync - //---------------------------------------------------------------------------------------------------------------------- diff --git a/src/server/server.ts b/src/server/server.ts index 87e85da1..e03a262e 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -12,7 +12,7 @@ configUtil.load(`./config.yml`); import path from 'path'; import { AddressInfo } from 'net'; -import express, { Express, RequestHandler } from 'express'; +import express, { Express } from 'express'; import bodyParser from 'body-parser'; import cookieParser from 'cookie-parser'; import session from 'express-session'; @@ -33,18 +33,14 @@ import * as accountMan from './managers/account'; import * as permsMan from './managers/permissions'; // Session Store -// FIXME: This is broken by this project. -// @see https://github.com/gx0r/connect-session-knex/issues/97 -// import connectSessionKnex from 'connect-session-knex'; -// eslint-disable-next-line @typescript-eslint/no-var-requires -const connectSessionKnex = require('connect-session-knex'); +import connectSessionKnex from 'connect-session-knex'; const KnexSessionStore = connectSessionKnex(session); // Auth import GoogleAuth from './auth/google'; // Routes -import { requestLogger, wrapAsync, serveIndex, errorLogger } from './routes/utils'; +import { requestLogger, serveIndex, errorLogger } from './routes/utils'; import noteRouter from './routes/notebook'; import charRouter from './routes/characters'; import sysRouter from './routes/systems'; @@ -111,7 +107,7 @@ async function main() : Promise<{ app : Express, sio : any, server : any }> })); // Basic request logging - app.use(requestLogger(logger) as RequestHandler); + app.use(requestLogger(logger)); // Auth support app.use(cookieParser()); @@ -141,7 +137,7 @@ async function main() : Promise<{ app : Express, sio : any, server : any }> if(config.overrideAuth) { // Middleware to skip authentication, for testing with postman, or unit tests. - app.use(wrapAsync(async(req, _resp, next) => + app.use(async(req, _resp, next) => { let account = app.get('user'); @@ -158,7 +154,7 @@ async function main() : Promise<{ app : Express, sio : any, server : any }> req.user = account; } next?.(); - }) as RequestHandler); + }); } //------------------------------------------------------------------------------------------------------------------