ci: merge main to release

This commit is contained in:
Robert Sparks 2023-08-31 08:12:37 -05:00 committed by GitHub
commit 32bb4ef54f
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
69 changed files with 1825 additions and 579 deletions

View file

@ -71,7 +71,7 @@ jobs:
echo "NEXT_VERSION=$nextStrict" >> $GITHUB_ENV
- name: Create Draft Release
uses: ncipollo/release-action@v1.12.0
uses: ncipollo/release-action@v1.13.0
if: ${{ github.ref_name == 'release' }}
with:
prerelease: true
@ -352,7 +352,7 @@ jobs:
histCoveragePath: historical-coverage.json
- name: Create Release
uses: ncipollo/release-action@v1.12.0
uses: ncipollo/release-action@v1.13.0
if: ${{ env.SHOULD_DEPLOY == 'true' }}
with:
allowUpdates: true
@ -365,7 +365,7 @@ jobs:
token: ${{ secrets.GITHUB_TOKEN }}
- name: Update Baseline Coverage
uses: ncipollo/release-action@v1.12.0
uses: ncipollo/release-action@v1.13.0
if: ${{ github.event.inputs.updateCoverage == 'true' }}
with:
allowUpdates: true

View file

@ -130,6 +130,7 @@ jobs:
run: |
echo "Running checks..."
./ietf/manage.py check
./ietf/manage.py migrate --fake-initial
echo "Starting datatracker..."
./ietf/manage.py runserver 0.0.0.0:8000 --settings=settings_local &
echo "Waiting for datatracker to be ready..."

275
.pnp.cjs generated
View file

@ -46,9 +46,9 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@parcel/transformer-inline-string", "npm:2.9.3"],\
["@parcel/transformer-sass", "npm:2.9.3"],\
["@popperjs/core", "npm:2.11.8"],\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.2"],\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.3"],\
["@twuni/emojify", "npm:1.0.2"],\
["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.2.3"],\
["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.3"],\
["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.0"],\
["bootstrap-icons", "npm:1.10.5"],\
["browser-fs-access", "npm:0.34.1"],\
@ -56,17 +56,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["c8", "npm:8.0.1"],\
["caniuse-lite", "npm:1.0.30001519"],\
["d3", "npm:7.8.5"],\
["eslint", "npm:8.45.0"],\
["eslint", "npm:8.47.0"],\
["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\
["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.13.3"],\
["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.0"],\
["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.14.0"],\
["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.1"],\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.1"],\
["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\
["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.16.1"],\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.17.0"],\
["file-saver", "npm:2.0.5"],\
["highcharts", "npm:11.1.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.1.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.2.0"],\
["ical.js", "npm:1.5.0"],\
["jquery", "npm:3.7.0"],\
["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\
@ -74,7 +74,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["list.js", "npm:2.3.1"],\
["lodash", "npm:4.17.21"],\
["lodash-es", "npm:4.17.21"],\
["luxon", "npm:3.3.0"],\
["luxon", "npm:3.4.0"],\
["moment", "npm:2.29.4"],\
["moment-timezone", "npm:0.5.43"],\
["ms", "npm:2.1.3"],\
@ -84,7 +84,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["pinia", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.1.6"],\
["pinia-plugin-persist", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:1.0.0"],\
["pug", "npm:3.0.2"],\
["sass", "npm:1.64.1"],\
["sass", "npm:1.66.1"],\
["seedrandom", "npm:3.0.5"],\
["select2", "npm:4.1.0-rc.0"],\
["select2-bootstrap-5-theme", "npm:1.3.0"],\
@ -92,7 +92,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["shepherd.js", "npm:11.1.1"],\
["slugify", "npm:1.6.6"],\
["sortablejs", "npm:1.15.0"],\
["vanillajs-datepicker", "npm:1.3.3"],\
["vanillajs-datepicker", "npm:1.3.4"],\
["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.4.9"],\
["vue", "npm:3.3.4"],\
["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.2.4"],\
@ -438,12 +438,12 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "SOFT"\
}],\
["virtual:a03a909c3f5870829b2a1f1c58cd72dd0904272c636f0500be601a3bd781404d19a891ad23156b2b680426d08dbfc464b1e4ab195d463ee4ff16262a9e851f5e#npm:4.4.0", {\
"packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-c51d166267/0/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip/node_modules/@eslint-community/eslint-utils/",\
["virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0", {\
"packageLocation": "./.yarn/__virtual__/@eslint-community-eslint-utils-virtual-5ceedd2a81/0/cache/@eslint-community-eslint-utils-npm-4.4.0-d1791bd5a3-cdfe3ae42b.zip/node_modules/@eslint-community/eslint-utils/",\
"packageDependencies": [\
["@eslint-community/eslint-utils", "virtual:a03a909c3f5870829b2a1f1c58cd72dd0904272c636f0500be601a3bd781404d19a891ad23156b2b680426d08dbfc464b1e4ab195d463ee4ff16262a9e851f5e#npm:4.4.0"],\
["@eslint-community/eslint-utils", "virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0"],\
["@types/eslint", null],\
["eslint", "npm:8.45.0"],\
["eslint", "npm:8.47.0"],\
["eslint-visitor-keys", "npm:3.3.0"]\
],\
"packagePeers": [\
@ -454,19 +454,19 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@eslint-community/regexpp", [\
["npm:4.4.1", {\
"packageLocation": "./.yarn/cache/@eslint-community-regexpp-npm-4.4.1-44c7391499-db97d8d08e.zip/node_modules/@eslint-community/regexpp/",\
"packageDependencies": [\
["@eslint-community/regexpp", "npm:4.4.1"]\
],\
"linkType": "HARD"\
}],\
["npm:4.5.1", {\
"packageLocation": "./.yarn/cache/@eslint-community-regexpp-npm-4.5.1-bf72922237-6d901166d6.zip/node_modules/@eslint-community/regexpp/",\
"packageDependencies": [\
["@eslint-community/regexpp", "npm:4.5.1"]\
],\
"linkType": "HARD"\
}],\
["npm:4.8.0", {\
"packageLocation": "./.yarn/cache/@eslint-community-regexpp-npm-4.8.0-92ece47e3d-601e6d033d.zip/node_modules/@eslint-community/regexpp/",\
"packageDependencies": [\
["@eslint-community/regexpp", "npm:4.8.0"]\
],\
"linkType": "HARD"\
}]\
]],\
["@eslint/eslintrc", [\
@ -488,10 +488,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@eslint/js", [\
["npm:8.44.0", {\
"packageLocation": "./.yarn/cache/@eslint-js-npm-8.44.0-66b473d41b-fc53958322.zip/node_modules/@eslint/js/",\
["npm:8.48.0", {\
"packageLocation": "./.yarn/cache/@eslint-js-npm-8.48.0-cee42a7097-b2755f9c0e.zip/node_modules/@eslint/js/",\
"packageDependencies": [\
["@eslint/js", "npm:8.44.0"]\
["@eslint/js", "npm:8.48.0"]\
],\
"linkType": "HARD"\
}]\
@ -654,7 +654,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@fullcalendar/core", "npm:6.1.8"],\
["@types/fullcalendar__core", null],\
["@types/luxon", null],\
["luxon", "npm:3.3.0"]\
["luxon", "npm:3.4.0"]\
],\
"packagePeers": [\
"@fullcalendar/core",\
@ -2346,17 +2346,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@rollup/pluginutils", [\
["npm:5.0.2", {\
"packageLocation": "./.yarn/cache/@rollup-pluginutils-npm-5.0.2-6aa9d0ddd4-edea15e543.zip/node_modules/@rollup/pluginutils/",\
["npm:5.0.3", {\
"packageLocation": "./.yarn/cache/@rollup-pluginutils-npm-5.0.3-33f9e7f020-8efbdeac53.zip/node_modules/@rollup/pluginutils/",\
"packageDependencies": [\
["@rollup/pluginutils", "npm:5.0.2"]\
["@rollup/pluginutils", "npm:5.0.3"]\
],\
"linkType": "SOFT"\
}],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.2", {\
"packageLocation": "./.yarn/__virtual__/@rollup-pluginutils-virtual-ca58d3a074/0/cache/@rollup-pluginutils-npm-5.0.2-6aa9d0ddd4-edea15e543.zip/node_modules/@rollup/pluginutils/",\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.3", {\
"packageLocation": "./.yarn/__virtual__/@rollup-pluginutils-virtual-e8c80fae3a/0/cache/@rollup-pluginutils-npm-5.0.3-33f9e7f020-8efbdeac53.zip/node_modules/@rollup/pluginutils/",\
"packageDependencies": [\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.2"],\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.3"],\
["@types/estree", "npm:1.0.0"],\
["@types/rollup", null],\
["estree-walker", "npm:2.0.2"],\
@ -2378,10 +2378,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "SOFT"\
}],\
["virtual:bbfdcb87fdcbacbba9ebe8ba4b476510d780b50c748b7a71307807b8e2c47cca6be20627a384f24b655b80a0ab5fd5b193ef3274afb79c45d120013674fc6a35#npm:2.0.0", {\
"packageLocation": "./.yarn/__virtual__/@sidvind-better-ajv-errors-virtual-fb9d43dbe5/0/cache/@sidvind-better-ajv-errors-npm-2.0.0-3531bddef9-12b0d87855.zip/node_modules/@sidvind/better-ajv-errors/",\
["virtual:d54cf140bc899b791890b50d03f9737577eb8c2e0b480e2b1bc40b168f05a300b97a0338d73f013a8f7410236526aba6ee56a063db404e7ae64ba5f1e4e85cb8#npm:2.0.0", {\
"packageLocation": "./.yarn/__virtual__/@sidvind-better-ajv-errors-virtual-23ff750c09/0/cache/@sidvind-better-ajv-errors-npm-2.0.0-3531bddef9-12b0d87855.zip/node_modules/@sidvind/better-ajv-errors/",\
"packageDependencies": [\
["@sidvind/better-ajv-errors", "virtual:bbfdcb87fdcbacbba9ebe8ba4b476510d780b50c748b7a71307807b8e2c47cca6be20627a384f24b655b80a0ab5fd5b193ef3274afb79c45d120013674fc6a35#npm:2.0.0"],\
["@sidvind/better-ajv-errors", "virtual:d54cf140bc899b791890b50d03f9737577eb8c2e0b480e2b1bc40b168f05a300b97a0338d73f013a8f7410236526aba6ee56a063db404e7ae64ba5f1e4e85cb8#npm:2.0.0"],\
["@babel/code-frame", "npm:7.16.7"],\
["@types/ajv", null],\
["ajv", "npm:8.11.0"],\
@ -2627,17 +2627,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["@vitejs/plugin-vue", [\
["npm:4.2.3", {\
"packageLocation": "./.yarn/cache/@vitejs-plugin-vue-npm-4.2.3-f2af5ce2fe-1c70c1cd18.zip/node_modules/@vitejs/plugin-vue/",\
["npm:4.3.3", {\
"packageLocation": "./.yarn/cache/@vitejs-plugin-vue-npm-4.3.3-ffc8f9f2ac-17f8d73708.zip/node_modules/@vitejs/plugin-vue/",\
"packageDependencies": [\
["@vitejs/plugin-vue", "npm:4.2.3"]\
["@vitejs/plugin-vue", "npm:4.3.3"]\
],\
"linkType": "SOFT"\
}],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.2.3", {\
"packageLocation": "./.yarn/__virtual__/@vitejs-plugin-vue-virtual-ad1e69b525/0/cache/@vitejs-plugin-vue-npm-4.2.3-f2af5ce2fe-1c70c1cd18.zip/node_modules/@vitejs/plugin-vue/",\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.3", {\
"packageLocation": "./.yarn/__virtual__/@vitejs-plugin-vue-virtual-c26a0d639a/0/cache/@vitejs-plugin-vue-npm-4.3.3-ffc8f9f2ac-17f8d73708.zip/node_modules/@vitejs/plugin-vue/",\
"packageDependencies": [\
["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.2.3"],\
["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.3"],\
["@types/vite", null],\
["@types/vue", null],\
["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.4.9"],\
@ -4619,14 +4619,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["eslint", [\
["npm:8.45.0", {\
"packageLocation": "./.yarn/cache/eslint-npm-8.45.0-a03a909c3f-3e6dcce5cc.zip/node_modules/eslint/",\
["npm:8.47.0", {\
"packageLocation": "./.yarn/cache/eslint-npm-8.47.0-84c6b60ea8-1988617f70.zip/node_modules/eslint/",\
"packageDependencies": [\
["eslint", "npm:8.45.0"],\
["@eslint-community/eslint-utils", "virtual:a03a909c3f5870829b2a1f1c58cd72dd0904272c636f0500be601a3bd781404d19a891ad23156b2b680426d08dbfc464b1e4ab195d463ee4ff16262a9e851f5e#npm:4.4.0"],\
["@eslint-community/regexpp", "npm:4.4.1"],\
["eslint", "npm:8.47.0"],\
["@eslint-community/eslint-utils", "virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0"],\
["@eslint-community/regexpp", "npm:4.8.0"],\
["@eslint/eslintrc", "npm:2.1.2"],\
["@eslint/js", "npm:8.44.0"],\
["@eslint/js", "npm:8.48.0"],\
["@humanwhocodes/config-array", "npm:0.11.10"],\
["@humanwhocodes/module-importer", "npm:1.0.1"],\
["@nodelib/fs.walk", "npm:1.2.8"],\
@ -4636,8 +4636,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\
["doctrine", "npm:3.0.0"],\
["escape-string-regexp", "npm:4.0.0"],\
["eslint-scope", "npm:7.2.0"],\
["eslint-visitor-keys", "npm:3.4.1"],\
["eslint-scope", "npm:7.2.2"],\
["eslint-visitor-keys", "npm:3.4.3"],\
["espree", "npm:9.6.1"],\
["esquery", "npm:1.5.0"],\
["esutils", "npm:2.0.3"],\
@ -4680,8 +4680,8 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@types/eslint-plugin-import", null],\
["@types/eslint-plugin-n", null],\
["@types/eslint-plugin-promise", null],\
["eslint", "npm:8.45.0"],\
["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.0"],\
["eslint", "npm:8.47.0"],\
["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.1"],\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.1"],\
["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"]\
],\
@ -4718,10 +4718,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "SOFT"\
}],\
["virtual:ec3843619a313054d408df3901c13ec8bb0acce27ef6bd14eee15f259bc019cfdb93e958a7f4ce4e64688e7e47232df540c3c57af900bead08c4578c9e8e4b3a#npm:2.8.0", {\
"packageLocation": "./.yarn/__virtual__/eslint-module-utils-virtual-6de382c6db/0/cache/eslint-module-utils-npm-2.8.0-05e42bcab0-74c6dfea76.zip/node_modules/eslint-module-utils/",\
["virtual:ef2ff17f0affe5aeeb05f2e27f2212e975bb78d898c026b74cc62e05a17de36abb35a54f0831f2ff5fced26e6128bfc2c0cf332f7c60149823619b008d0ea480#npm:2.8.0", {\
"packageLocation": "./.yarn/__virtual__/eslint-module-utils-virtual-0e305f99a7/0/cache/eslint-module-utils-npm-2.8.0-05e42bcab0-74c6dfea76.zip/node_modules/eslint-module-utils/",\
"packageDependencies": [\
["eslint-module-utils", "virtual:ec3843619a313054d408df3901c13ec8bb0acce27ef6bd14eee15f259bc019cfdb93e958a7f4ce4e64688e7e47232df540c3c57af900bead08c4578c9e8e4b3a#npm:2.8.0"],\
["eslint-module-utils", "virtual:ef2ff17f0affe5aeeb05f2e27f2212e975bb78d898c026b74cc62e05a17de36abb35a54f0831f2ff5fced26e6128bfc2c0cf332f7c60149823619b008d0ea480#npm:2.8.0"],\
["@types/eslint", null],\
["@types/eslint-import-resolver-node", null],\
["@types/eslint-import-resolver-typescript", null],\
@ -4729,7 +4729,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@types/typescript-eslint__parser", null],\
["@typescript-eslint/parser", null],\
["debug", "virtual:65bed195431eadffc59e2238eb20cc12d9a1665bc7458ce780a9320ff795091b03cb5c4c2094938315ddd967b5b02c0f1df67b3ed435c69b7457092b7cc06ed8#npm:3.2.7"],\
["eslint", "npm:8.45.0"],\
["eslint", "npm:8.47.0"],\
["eslint-import-resolver-node", "npm:0.3.7"],\
["eslint-import-resolver-typescript", null],\
["eslint-import-resolver-webpack", null]\
@ -4750,20 +4750,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["eslint-plugin-cypress", [\
["npm:2.13.3", {\
"packageLocation": "./.yarn/cache/eslint-plugin-cypress-npm-2.13.3-0ad3bff9c9-9affbcee29.zip/node_modules/eslint-plugin-cypress/",\
["npm:2.14.0", {\
"packageLocation": "./.yarn/cache/eslint-plugin-cypress-npm-2.14.0-4d90862e1d-3fa118a757.zip/node_modules/eslint-plugin-cypress/",\
"packageDependencies": [\
["eslint-plugin-cypress", "npm:2.13.3"]\
["eslint-plugin-cypress", "npm:2.14.0"]\
],\
"linkType": "SOFT"\
}],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.13.3", {\
"packageLocation": "./.yarn/__virtual__/eslint-plugin-cypress-virtual-2dc00cb202/0/cache/eslint-plugin-cypress-npm-2.13.3-0ad3bff9c9-9affbcee29.zip/node_modules/eslint-plugin-cypress/",\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.14.0", {\
"packageLocation": "./.yarn/__virtual__/eslint-plugin-cypress-virtual-57ccfb2b3e/0/cache/eslint-plugin-cypress-npm-2.14.0-4d90862e1d-3fa118a757.zip/node_modules/eslint-plugin-cypress/",\
"packageDependencies": [\
["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.13.3"],\
["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.14.0"],\
["@types/eslint", null],\
["eslint", "npm:8.45.0"],\
["globals", "npm:11.12.0"]\
["eslint", "npm:8.47.0"],\
["globals", "npm:13.21.0"]\
],\
"packagePeers": [\
"@types/eslint",\
@ -4785,7 +4785,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageDependencies": [\
["eslint-plugin-es", "virtual:5cccaf00e87dfff96dbbb5eaf7a3055373358b8114d6a1adfb32f54ed6b40ba06068d3aa1fdd8062899a0cad040f68c17cc6b72bac2cdbe9700f3d6330d112f3#npm:3.0.1"],\
["@types/eslint", null],\
["eslint", "npm:8.45.0"],\
["eslint", "npm:8.47.0"],\
["eslint-utils", "npm:2.1.0"],\
["regexpp", "npm:3.2.0"]\
],\
@ -4808,10 +4808,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageLocation": "./.yarn/__virtual__/eslint-plugin-es-x-virtual-7882922717/0/cache/eslint-plugin-es-x-npm-7.1.0-35735e8bbc-a19924313c.zip/node_modules/eslint-plugin-es-x/",\
"packageDependencies": [\
["eslint-plugin-es-x", "virtual:adc54309e8e54b60324bd0d3562e4cdf4588bb7e8e9bf0e8567ae0b912e220b364ab900a1f69ea824481e4ed94aa6d687c737b8f554fa53b86231581c20d170a#npm:7.1.0"],\
["@eslint-community/eslint-utils", "virtual:a03a909c3f5870829b2a1f1c58cd72dd0904272c636f0500be601a3bd781404d19a891ad23156b2b680426d08dbfc464b1e4ab195d463ee4ff16262a9e851f5e#npm:4.4.0"],\
["@eslint-community/eslint-utils", "virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0"],\
["@eslint-community/regexpp", "npm:4.5.1"],\
["@types/eslint", null],\
["eslint", "npm:8.45.0"]\
["eslint", "npm:8.47.0"]\
],\
"packagePeers": [\
"@types/eslint",\
@ -4821,17 +4821,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["eslint-plugin-import", [\
["npm:2.28.0", {\
"packageLocation": "./.yarn/cache/eslint-plugin-import-npm-2.28.0-7894c48955-f9eba311b9.zip/node_modules/eslint-plugin-import/",\
["npm:2.28.1", {\
"packageLocation": "./.yarn/cache/eslint-plugin-import-npm-2.28.1-2056ddf35c-e8ae6dd8f0.zip/node_modules/eslint-plugin-import/",\
"packageDependencies": [\
["eslint-plugin-import", "npm:2.28.0"]\
["eslint-plugin-import", "npm:2.28.1"]\
],\
"linkType": "SOFT"\
}],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.0", {\
"packageLocation": "./.yarn/__virtual__/eslint-plugin-import-virtual-ec3843619a/0/cache/eslint-plugin-import-npm-2.28.0-7894c48955-f9eba311b9.zip/node_modules/eslint-plugin-import/",\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.1", {\
"packageLocation": "./.yarn/__virtual__/eslint-plugin-import-virtual-ef2ff17f0a/0/cache/eslint-plugin-import-npm-2.28.1-2056ddf35c-e8ae6dd8f0.zip/node_modules/eslint-plugin-import/",\
"packageDependencies": [\
["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.0"],\
["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.1"],\
["@types/eslint", null],\
["@types/typescript-eslint__parser", null],\
["@typescript-eslint/parser", null],\
@ -4841,17 +4841,16 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["array.prototype.flatmap", "npm:1.3.1"],\
["debug", "virtual:65bed195431eadffc59e2238eb20cc12d9a1665bc7458ce780a9320ff795091b03cb5c4c2094938315ddd967b5b02c0f1df67b3ed435c69b7457092b7cc06ed8#npm:3.2.7"],\
["doctrine", "npm:2.1.0"],\
["eslint", "npm:8.45.0"],\
["eslint", "npm:8.47.0"],\
["eslint-import-resolver-node", "npm:0.3.7"],\
["eslint-module-utils", "virtual:ec3843619a313054d408df3901c13ec8bb0acce27ef6bd14eee15f259bc019cfdb93e958a7f4ce4e64688e7e47232df540c3c57af900bead08c4578c9e8e4b3a#npm:2.8.0"],\
["eslint-module-utils", "virtual:ef2ff17f0affe5aeeb05f2e27f2212e975bb78d898c026b74cc62e05a17de36abb35a54f0831f2ff5fced26e6128bfc2c0cf332f7c60149823619b008d0ea480#npm:2.8.0"],\
["has", "npm:1.0.3"],\
["is-core-module", "npm:2.12.1"],\
["is-core-module", "npm:2.13.0"],\
["is-glob", "npm:4.0.3"],\
["minimatch", "npm:3.1.2"],\
["object.fromentries", "npm:2.0.6"],\
["object.groupby", "npm:1.0.0"],\
["object.values", "npm:1.1.6"],\
["resolve", "patch:resolve@npm%3A1.22.4#~builtin<compat/resolve>::version=1.22.4&hash=07638b"],\
["semver", "npm:6.3.1"],\
["tsconfig-paths", "npm:3.14.2"]\
],\
@ -4876,10 +4875,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageLocation": "./.yarn/__virtual__/eslint-plugin-n-virtual-adc54309e8/0/cache/eslint-plugin-n-npm-16.0.1-6a07bf1b46-407002bb06.zip/node_modules/eslint-plugin-n/",\
"packageDependencies": [\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.1"],\
["@eslint-community/eslint-utils", "virtual:a03a909c3f5870829b2a1f1c58cd72dd0904272c636f0500be601a3bd781404d19a891ad23156b2b680426d08dbfc464b1e4ab195d463ee4ff16262a9e851f5e#npm:4.4.0"],\
["@eslint-community/eslint-utils", "virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0"],\
["@types/eslint", null],\
["builtins", "npm:5.0.1"],\
["eslint", "npm:8.45.0"],\
["eslint", "npm:8.47.0"],\
["eslint-plugin-es-x", "virtual:adc54309e8e54b60324bd0d3562e4cdf4588bb7e8e9bf0e8567ae0b912e220b364ab900a1f69ea824481e4ed94aa6d687c737b8f554fa53b86231581c20d170a#npm:7.1.0"],\
["ignore", "npm:5.2.4"],\
["is-core-module", "npm:2.12.1"],\
@ -4907,7 +4906,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageDependencies": [\
["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\
["@types/eslint", null],\
["eslint", "npm:8.45.0"],\
["eslint", "npm:8.47.0"],\
["eslint-plugin-es", "virtual:5cccaf00e87dfff96dbbb5eaf7a3055373358b8114d6a1adfb32f54ed6b40ba06068d3aa1fdd8062899a0cad040f68c17cc6b72bac2cdbe9700f3d6330d112f3#npm:3.0.1"],\
["eslint-utils", "npm:2.1.0"],\
["ignore", "npm:5.2.0"],\
@ -4935,7 +4934,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
"packageDependencies": [\
["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\
["@types/eslint", null],\
["eslint", "npm:8.45.0"]\
["eslint", "npm:8.47.0"]\
],\
"packagePeers": [\
"@types/eslint",\
@ -4945,25 +4944,25 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["eslint-plugin-vue", [\
["npm:9.16.1", {\
"packageLocation": "./.yarn/cache/eslint-plugin-vue-npm-9.16.1-4e9625bf90-b2f9d0deef.zip/node_modules/eslint-plugin-vue/",\
["npm:9.17.0", {\
"packageLocation": "./.yarn/cache/eslint-plugin-vue-npm-9.17.0-c32115eab8-2ef53a0387.zip/node_modules/eslint-plugin-vue/",\
"packageDependencies": [\
["eslint-plugin-vue", "npm:9.16.1"]\
["eslint-plugin-vue", "npm:9.17.0"]\
],\
"linkType": "SOFT"\
}],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.16.1", {\
"packageLocation": "./.yarn/__virtual__/eslint-plugin-vue-virtual-3fd334a097/0/cache/eslint-plugin-vue-npm-9.16.1-4e9625bf90-b2f9d0deef.zip/node_modules/eslint-plugin-vue/",\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.17.0", {\
"packageLocation": "./.yarn/__virtual__/eslint-plugin-vue-virtual-e39e5d6bef/0/cache/eslint-plugin-vue-npm-9.17.0-c32115eab8-2ef53a0387.zip/node_modules/eslint-plugin-vue/",\
"packageDependencies": [\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.16.1"],\
["@eslint-community/eslint-utils", "virtual:a03a909c3f5870829b2a1f1c58cd72dd0904272c636f0500be601a3bd781404d19a891ad23156b2b680426d08dbfc464b1e4ab195d463ee4ff16262a9e851f5e#npm:4.4.0"],\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.17.0"],\
["@eslint-community/eslint-utils", "virtual:84c6b60ea80c2e474ae2eb1949a4b42a725b5ad125a348fd9ccd31d528ef15de82d28192a86b98baf21067fd8c90bd02753cac42e9ee96bf5f8084788455b3e4#npm:4.4.0"],\
["@types/eslint", null],\
["eslint", "npm:8.45.0"],\
["eslint", "npm:8.47.0"],\
["natural-compare", "npm:1.4.0"],\
["nth-check", "npm:2.1.1"],\
["postcss-selector-parser", "npm:6.0.13"],\
["semver", "npm:7.5.4"],\
["vue-eslint-parser", "virtual:3fd334a0979036e65c7ec1ddc81d4f430fc73cf88b23447bbea68e11677926afefc90ff6a0eaff2ade480382733ea5c63f31601fb26346981b5cb3dc503d8c0f#npm:9.3.1"],\
["vue-eslint-parser", "virtual:e39e5d6bef7a93bd3b21c5c9ba6ef825c92fc73c8d9c9e01699e1dc11e40fd3bc150ba16509e2cf59495cb098c32b2e4a85c0c21802fddeffc3208b01f4f5a16#npm:9.3.1"],\
["xml-name-validator", "npm:4.0.0"]\
],\
"packagePeers": [\
@ -4983,10 +4982,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "HARD"\
}],\
["npm:7.2.0", {\
"packageLocation": "./.yarn/cache/eslint-scope-npm-7.2.0-88784f5a38-64591a2d8b.zip/node_modules/eslint-scope/",\
["npm:7.2.2", {\
"packageLocation": "./.yarn/cache/eslint-scope-npm-7.2.2-53cb0df8e8-ec97dbf5fb.zip/node_modules/eslint-scope/",\
"packageDependencies": [\
["eslint-scope", "npm:7.2.0"],\
["eslint-scope", "npm:7.2.2"],\
["esrecurse", "npm:4.3.0"],\
["estraverse", "npm:5.3.0"]\
],\
@ -5024,6 +5023,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["eslint-visitor-keys", "npm:3.4.1"]\
],\
"linkType": "HARD"\
}],\
["npm:3.4.3", {\
"packageLocation": "./.yarn/cache/eslint-visitor-keys-npm-3.4.3-a356ac7e46-36e9ef87fc.zip/node_modules/eslint-visitor-keys/",\
"packageDependencies": [\
["eslint-visitor-keys", "npm:3.4.3"]\
],\
"linkType": "HARD"\
}]\
]],\
["espree", [\
@ -5461,13 +5467,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["globals", [\
["npm:11.12.0", {\
"packageLocation": "./.yarn/cache/globals-npm-11.12.0-1fa7f41a6c-67051a45ec.zip/node_modules/globals/",\
"packageDependencies": [\
["globals", "npm:11.12.0"]\
],\
"linkType": "HARD"\
}],\
["npm:13.15.0", {\
"packageLocation": "./.yarn/cache/globals-npm-13.15.0-c0b0c83a7a-383ade0873.zip/node_modules/globals/",\
"packageDependencies": [\
@ -5483,6 +5482,14 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["type-fest", "npm:0.20.2"]\
],\
"linkType": "HARD"\
}],\
["npm:13.21.0", {\
"packageLocation": "./.yarn/cache/globals-npm-13.21.0-c0829ce1cb-86c92ca8a0.zip/node_modules/globals/",\
"packageDependencies": [\
["globals", "npm:13.21.0"],\
["type-fest", "npm:0.20.2"]\
],\
"linkType": "HARD"\
}]\
]],\
["globalthis", [\
@ -5633,20 +5640,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["html-validate", [\
["npm:8.1.0", {\
"packageLocation": "./.yarn/cache/html-validate-npm-8.1.0-2e8bfe64f2-179443c0bd.zip/node_modules/html-validate/",\
["npm:8.2.0", {\
"packageLocation": "./.yarn/cache/html-validate-npm-8.2.0-51da0ed7e6-793287a454.zip/node_modules/html-validate/",\
"packageDependencies": [\
["html-validate", "npm:8.1.0"]\
["html-validate", "npm:8.2.0"]\
],\
"linkType": "SOFT"\
}],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.1.0", {\
"packageLocation": "./.yarn/__virtual__/html-validate-virtual-bbfdcb87fd/0/cache/html-validate-npm-8.1.0-2e8bfe64f2-179443c0bd.zip/node_modules/html-validate/",\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.2.0", {\
"packageLocation": "./.yarn/__virtual__/html-validate-virtual-d54cf140bc/0/cache/html-validate-npm-8.2.0-51da0ed7e6-793287a454.zip/node_modules/html-validate/",\
"packageDependencies": [\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.1.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.2.0"],\
["@babel/code-frame", "npm:7.16.7"],\
["@html-validate/stylish", "npm:4.1.0"],\
["@sidvind/better-ajv-errors", "virtual:bbfdcb87fdcbacbba9ebe8ba4b476510d780b50c748b7a71307807b8e2c47cca6be20627a384f24b655b80a0ab5fd5b193ef3274afb79c45d120013674fc6a35#npm:2.0.0"],\
["@sidvind/better-ajv-errors", "virtual:d54cf140bc899b791890b50d03f9737577eb8c2e0b480e2b1bc40b168f05a300b97a0338d73f013a8f7410236526aba6ee56a063db404e7ae64ba5f1e4e85cb8#npm:2.0.0"],\
["@types/jest", null],\
["@types/jest-diff", null],\
["@types/jest-snapshot", null],\
@ -6683,10 +6690,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["luxon", [\
["npm:3.3.0", {\
"packageLocation": "./.yarn/cache/luxon-npm-3.3.0-bdbae9bfd5-50cf17a0dc.zip/node_modules/luxon/",\
["npm:3.4.0", {\
"packageLocation": "./.yarn/cache/luxon-npm-3.4.0-8e0b97226e-ca9b6d0e0a.zip/node_modules/luxon/",\
"packageDependencies": [\
["luxon", "npm:3.3.0"]\
["luxon", "npm:3.4.0"]\
],\
"linkType": "HARD"\
}]\
@ -8014,16 +8021,6 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["supports-preserve-symlinks-flag", "npm:1.0.0"]\
],\
"linkType": "HARD"\
}],\
["patch:resolve@npm%3A1.22.4#~builtin<compat/resolve>::version=1.22.4&hash=07638b", {\
"packageLocation": "./.yarn/cache/resolve-patch-5850eadd70-c45f2545fd.zip/node_modules/resolve/",\
"packageDependencies": [\
["resolve", "patch:resolve@npm%3A1.22.4#~builtin<compat/resolve>::version=1.22.4&hash=07638b"],\
["is-core-module", "npm:2.13.0"],\
["path-parse", "npm:1.0.7"],\
["supports-preserve-symlinks-flag", "npm:1.0.0"]\
],\
"linkType": "HARD"\
}]\
]],\
["resolve-from", [\
@ -8100,9 +8097,9 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@parcel/transformer-inline-string", "npm:2.9.3"],\
["@parcel/transformer-sass", "npm:2.9.3"],\
["@popperjs/core", "npm:2.11.8"],\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.2"],\
["@rollup/pluginutils", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.0.3"],\
["@twuni/emojify", "npm:1.0.2"],\
["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.2.3"],\
["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.3"],\
["bootstrap", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:5.3.0"],\
["bootstrap-icons", "npm:1.10.5"],\
["browser-fs-access", "npm:0.34.1"],\
@ -8110,17 +8107,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["c8", "npm:8.0.1"],\
["caniuse-lite", "npm:1.0.30001519"],\
["d3", "npm:7.8.5"],\
["eslint", "npm:8.45.0"],\
["eslint", "npm:8.47.0"],\
["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\
["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.13.3"],\
["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.0"],\
["eslint-plugin-cypress", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.14.0"],\
["eslint-plugin-import", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.28.1"],\
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.0.1"],\
["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\
["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.16.1"],\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.17.0"],\
["file-saver", "npm:2.0.5"],\
["highcharts", "npm:11.1.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.1.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.2.0"],\
["ical.js", "npm:1.5.0"],\
["jquery", "npm:3.7.0"],\
["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\
@ -8128,7 +8125,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["list.js", "npm:2.3.1"],\
["lodash", "npm:4.17.21"],\
["lodash-es", "npm:4.17.21"],\
["luxon", "npm:3.3.0"],\
["luxon", "npm:3.4.0"],\
["moment", "npm:2.29.4"],\
["moment-timezone", "npm:0.5.43"],\
["ms", "npm:2.1.3"],\
@ -8138,7 +8135,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["pinia", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:2.1.6"],\
["pinia-plugin-persist", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:1.0.0"],\
["pug", "npm:3.0.2"],\
["sass", "npm:1.64.1"],\
["sass", "npm:1.66.1"],\
["seedrandom", "npm:3.0.5"],\
["select2", "npm:4.1.0-rc.0"],\
["select2-bootstrap-5-theme", "npm:1.3.0"],\
@ -8146,7 +8143,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["shepherd.js", "npm:11.1.1"],\
["slugify", "npm:1.6.6"],\
["sortablejs", "npm:1.15.0"],\
["vanillajs-datepicker", "npm:1.3.3"],\
["vanillajs-datepicker", "npm:1.3.4"],\
["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.4.9"],\
["vue", "npm:3.3.4"],\
["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.2.4"],\
@ -8235,10 +8232,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "HARD"\
}],\
["npm:1.64.1", {\
"packageLocation": "./.yarn/cache/sass-npm-1.64.1-d9daafa43e-e908f96f3d.zip/node_modules/sass/",\
["npm:1.66.1", {\
"packageLocation": "./.yarn/cache/sass-npm-1.66.1-563acb4a8f-74fc11d0fc.zip/node_modules/sass/",\
"packageDependencies": [\
["sass", "npm:1.64.1"],\
["sass", "npm:1.66.1"],\
["chokidar", "npm:3.5.3"],\
["immutable", "npm:4.0.0"],\
["source-map-js", "npm:1.0.2"]\
@ -8965,10 +8962,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\
]],\
["vanillajs-datepicker", [\
["npm:1.3.3", {\
"packageLocation": "./.yarn/cache/vanillajs-datepicker-npm-1.3.3-c1fde0e681-be830750a5.zip/node_modules/vanillajs-datepicker/",\
["npm:1.3.4", {\
"packageLocation": "./.yarn/cache/vanillajs-datepicker-npm-1.3.4-bc86e15a9c-830958f8af.zip/node_modules/vanillajs-datepicker/",\
"packageDependencies": [\
["vanillajs-datepicker", "npm:1.3.3"]\
["vanillajs-datepicker", "npm:1.3.4"]\
],\
"linkType": "HARD"\
}]\
@ -9021,7 +9018,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["lightningcss", null],\
["postcss", "npm:8.4.27"],\
["rollup", "npm:3.28.0"],\
["sass", "npm:1.64.1"],\
["sass", "npm:1.66.1"],\
["stylus", null],\
["sugarss", null],\
["terser", null]\
@ -9148,13 +9145,13 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\
"linkType": "SOFT"\
}],\
["virtual:3fd334a0979036e65c7ec1ddc81d4f430fc73cf88b23447bbea68e11677926afefc90ff6a0eaff2ade480382733ea5c63f31601fb26346981b5cb3dc503d8c0f#npm:9.3.1", {\
"packageLocation": "./.yarn/__virtual__/vue-eslint-parser-virtual-6364f2b44e/0/cache/vue-eslint-parser-npm-9.3.1-a0feb51670-6d1476b45f.zip/node_modules/vue-eslint-parser/",\
["virtual:e39e5d6bef7a93bd3b21c5c9ba6ef825c92fc73c8d9c9e01699e1dc11e40fd3bc150ba16509e2cf59495cb098c32b2e4a85c0c21802fddeffc3208b01f4f5a16#npm:9.3.1", {\
"packageLocation": "./.yarn/__virtual__/vue-eslint-parser-virtual-a1cfa0fa2e/0/cache/vue-eslint-parser-npm-9.3.1-a0feb51670-6d1476b45f.zip/node_modules/vue-eslint-parser/",\
"packageDependencies": [\
["vue-eslint-parser", "virtual:3fd334a0979036e65c7ec1ddc81d4f430fc73cf88b23447bbea68e11677926afefc90ff6a0eaff2ade480382733ea5c63f31601fb26346981b5cb3dc503d8c0f#npm:9.3.1"],\
["vue-eslint-parser", "virtual:e39e5d6bef7a93bd3b21c5c9ba6ef825c92fc73c8d9c9e01699e1dc11e40fd3bc150ba16509e2cf59495cb098c32b2e4a85c0c21802fddeffc3208b01f4f5a16#npm:9.3.1"],\
["@types/eslint", null],\
["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\
["eslint", "npm:8.45.0"],\
["eslint", "npm:8.47.0"],\
["eslint-scope", "npm:7.1.1"],\
["eslint-visitor-keys", "npm:3.3.0"],\
["espree", "npm:9.3.2"],\

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View file

@ -14,12 +14,12 @@
"chart.js": "3.5.1",
"chartjs-node-canvas": "4.1.6",
"lodash": "4.17.21",
"luxon": "3.3.0"
"luxon": "3.4.0"
},
"devDependencies": {
"eslint": "8.45.0",
"eslint": "8.47.0",
"eslint-config-standard": "17.1.0",
"eslint-plugin-import": "2.28.0",
"eslint-plugin-import": "2.28.1",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
"npm-check-updates": "16.10.16"
@ -88,18 +88,18 @@
}
},
"node_modules/@eslint-community/regexpp": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz",
"integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==",
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz",
"integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
"node_modules/@eslint/eslintrc": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz",
"integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
"integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
@ -120,9 +120,9 @@
}
},
"node_modules/@eslint/js": {
"version": "8.44.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
"integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz",
"integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -1765,27 +1765,27 @@
}
},
"node_modules/eslint": {
"version": "8.45.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
"integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
"version": "8.47.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz",
"integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.4.0",
"@eslint/eslintrc": "^2.1.0",
"@eslint/js": "8.44.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.2",
"@eslint/js": "^8.47.0",
"@humanwhocodes/config-array": "^0.11.10",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"ajv": "^6.10.0",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.2.0",
"eslint-visitor-keys": "^3.4.1",
"espree": "^9.6.0",
"eslint-scope": "^7.2.2",
"eslint-visitor-keys": "^3.4.3",
"espree": "^9.6.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
@ -1913,9 +1913,9 @@
}
},
"node_modules/eslint-plugin-import": {
"version": "2.28.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz",
"integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==",
"version": "2.28.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz",
"integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==",
"dev": true,
"dependencies": {
"array-includes": "^3.1.6",
@ -1927,13 +1927,12 @@
"eslint-import-resolver-node": "^0.3.7",
"eslint-module-utils": "^2.8.0",
"has": "^1.0.3",
"is-core-module": "^2.12.1",
"is-core-module": "^2.13.0",
"is-glob": "^4.0.3",
"minimatch": "^3.1.2",
"object.fromentries": "^2.0.6",
"object.groupby": "^1.0.0",
"object.values": "^1.1.6",
"resolve": "^1.22.3",
"semver": "^6.3.1",
"tsconfig-paths": "^3.14.2"
},
@ -2117,9 +2116,9 @@
}
},
"node_modules/eslint-scope": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
"integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
"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",
@ -2157,9 +2156,9 @@
}
},
"node_modules/eslint-visitor-keys": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
"integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
"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,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -2587,9 +2586,9 @@
}
},
"node_modules/globals": {
"version": "13.20.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
"integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
"version": "13.21.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
"integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
"dev": true,
"dependencies": {
"type-fest": "^0.20.2"
@ -3551,9 +3550,9 @@
}
},
"node_modules/luxon": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz",
"integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==",
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz",
"integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==",
"engines": {
"node": ">=12"
}
@ -6124,15 +6123,15 @@
}
},
"@eslint-community/regexpp": {
"version": "4.4.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.4.0.tgz",
"integrity": "sha512-A9983Q0LnDGdLPjxyXQ00sbV+K+O+ko2Dr+CZigbHWtX9pNfxlaBkMR8X1CztI73zuEyEBXTVjx7CE+/VSwDiQ==",
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz",
"integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==",
"dev": true
},
"@eslint/eslintrc": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz",
"integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
"integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
@ -6147,9 +6146,9 @@
}
},
"@eslint/js": {
"version": "8.44.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
"integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz",
"integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==",
"dev": true
},
"@humanwhocodes/config-array": {
@ -7373,27 +7372,27 @@
"dev": true
},
"eslint": {
"version": "8.45.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
"integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
"version": "8.47.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz",
"integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.4.0",
"@eslint/eslintrc": "^2.1.0",
"@eslint/js": "8.44.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.2",
"@eslint/js": "^8.47.0",
"@humanwhocodes/config-array": "^0.11.10",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"ajv": "^6.10.0",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.2.0",
"eslint-visitor-keys": "^3.4.1",
"espree": "^9.6.0",
"eslint-scope": "^7.2.2",
"eslint-visitor-keys": "^3.4.3",
"espree": "^9.6.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
@ -7488,9 +7487,9 @@
}
},
"eslint-plugin-import": {
"version": "2.28.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz",
"integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==",
"version": "2.28.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz",
"integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==",
"dev": true,
"requires": {
"array-includes": "^3.1.6",
@ -7502,13 +7501,12 @@
"eslint-import-resolver-node": "^0.3.7",
"eslint-module-utils": "^2.8.0",
"has": "^1.0.3",
"is-core-module": "^2.12.1",
"is-core-module": "^2.13.0",
"is-glob": "^4.0.3",
"minimatch": "^3.1.2",
"object.fromentries": "^2.0.6",
"object.groupby": "^1.0.0",
"object.values": "^1.1.6",
"resolve": "^1.22.3",
"semver": "^6.3.1",
"tsconfig-paths": "^3.14.2"
},
@ -7635,9 +7633,9 @@
"requires": {}
},
"eslint-scope": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
"integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
"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,
"requires": {
"esrecurse": "^4.3.0",
@ -7662,9 +7660,9 @@
}
},
"eslint-visitor-keys": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
"integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
"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
},
"espree": {
@ -7970,9 +7968,9 @@
}
},
"globals": {
"version": "13.20.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
"integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
"version": "13.21.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
"integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@ -8659,9 +8657,9 @@
}
},
"luxon": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz",
"integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg=="
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz",
"integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw=="
},
"make-dir": {
"version": "3.1.0",

View file

@ -11,12 +11,12 @@
"chart.js": "3.5.1",
"chartjs-node-canvas": "4.1.6",
"lodash": "4.17.21",
"luxon": "3.3.0"
"luxon": "3.4.0"
},
"devDependencies": {
"eslint": "8.45.0",
"eslint": "8.47.0",
"eslint-config-standard": "17.1.0",
"eslint-plugin-import": "2.28.0",
"eslint-plugin-import": "2.28.1",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
"npm-check-updates": "16.10.16"

View file

@ -10,7 +10,7 @@
"license": "ISC",
"dependencies": {
"@octokit/core": "^4.2.4",
"luxon": "^3.4.0"
"luxon": "^3.4.2"
}
},
"node_modules/@octokit/auth-token": {
@ -141,9 +141,9 @@
}
},
"node_modules/luxon": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz",
"integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==",
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.2.tgz",
"integrity": "sha512-uBoAVCVcajsrqy3pv7eo5jEUz1oeLmCcnMv8n4AJpT5hbpN9lUssAXibNElpbLce3Mhm9dyBzwYLs9zctM/0tA==",
"engines": {
"node": ">=12"
}
@ -315,9 +315,9 @@
"integrity": "sha512-VRSzKkbMm5jMDoKLbltAkFQ5Qr7VDiTFGXxYFXXowVj387GeGNOCsOH6Msy00SGZ3Fp84b1Naa1psqgcCIEP5Q=="
},
"luxon": {
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz",
"integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw=="
"version": "3.4.2",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.2.tgz",
"integrity": "sha512-uBoAVCVcajsrqy3pv7eo5jEUz1oeLmCcnMv8n4AJpT5hbpN9lUssAXibNElpbLce3Mhm9dyBzwYLs9zctM/0tA=="
},
"node-fetch": {
"version": "2.6.7",

View file

@ -11,6 +11,6 @@
"license": "ISC",
"dependencies": {
"@octokit/core": "^4.2.4",
"luxon": "^3.4.0"
"luxon": "^3.4.2"
}
}

View file

@ -15,7 +15,7 @@
"keypress": "^0.2.1",
"listr2": "^6.6.1",
"lodash-es": "^4.17.21",
"luxon": "^3.3.0",
"luxon": "^3.4.0",
"pretty-bytes": "^6.1.1",
"tar": "^6.1.15",
"yargs": "^17.7.2"
@ -859,9 +859,9 @@
}
},
"node_modules/luxon": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz",
"integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==",
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz",
"integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==",
"engines": {
"node": ">=12"
}
@ -1950,9 +1950,9 @@
"integrity": "sha512-ozCC6gdQ+glXOQsveKD0YsDy8DSQFjDTz4zyzEHNV5+JP5D62LmfDZ6o1cycFx9ouG940M5dE8C8CTewdj2YWQ=="
},
"luxon": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz",
"integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg=="
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz",
"integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw=="
},
"mimic-fn": {
"version": "2.1.0",

View file

@ -11,7 +11,7 @@
"keypress": "^0.2.1",
"listr2": "^6.6.1",
"lodash-es": "^4.17.21",
"luxon": "^3.3.0",
"luxon": "^3.4.0",
"pretty-bytes": "^6.1.1",
"tar": "^6.1.15",
"yargs": "^17.7.2"

View file

@ -8,7 +8,6 @@ ALLOWED_HOSTS = ['*']
from ietf.settings_postgresqldb import DATABASES # pyflakes:ignore
IDSUBMIT_IDNITS_BINARY = "/usr/local/bin/idnits"
IDSUBMIT_REPOSITORY_PATH = "test/id/"
IDSUBMIT_STAGING_PATH = "test/staging/"
AGENDA_PATH = '/assets/www6s/proceedings/'
@ -50,6 +49,7 @@ STATUS_CHANGE_PATH = '/assets/ietf-ftp/status-changes/'
INTERNET_DRAFT_ARCHIVE_DIR = '/assets/archive/id'
INTERNET_ALL_DRAFTS_ARCHIVE_DIR = '/assets/archive/id'
BIBXML_BASE_PATH = '/assets/ietfdata/derived/bibxml'
IDSUBMIT_REPOSITORY_PATH = INTERNET_DRAFT_PATH
NOMCOM_PUBLIC_KEYS_DIR = 'data/nomcom_keys/public_keys/'
SLIDE_STAGING_PATH = 'test/staging/'

View file

@ -2799,7 +2799,7 @@ class PdfizedTests(TestCase):
url = urlreverse(self.view, kwargs=argdict)
r = self.client.get(url)
self.assertEqual(r.status_code,200)
self.assertEqual(r.get('Content-Type'),'application/pdf;charset=utf-8')
self.assertEqual(r.get('Content-Type'),'application/pdf')
def should_404(self, argdict):
url = urlreverse(self.view, kwargs=argdict)

View file

@ -976,7 +976,7 @@ def document_pdfized(request, name, rev=None, ext=None):
pdf = doc.pdfized()
if pdf:
return HttpResponse(pdf,content_type='application/pdf;charset=utf-8')
return HttpResponse(pdf,content_type='application/pdf')
else:
raise Http404

View file

@ -5,6 +5,8 @@ import re
from functools import update_wrapper
from base64 import b64encode
import debug # pyflakes:ignore
from django import forms
@ -12,6 +14,7 @@ from django import forms
from django.contrib import admin
from django.contrib.admin.utils import unquote
from django.core.management import load_command_class
from django.db.models import BinaryField
from django.http import Http404
from django.shortcuts import render
from django.utils.encoding import force_str
@ -20,7 +23,7 @@ from django.utils.translation import gettext as _
from ietf.group.models import (Group, GroupFeatures, GroupHistory, GroupEvent, GroupURL, GroupMilestone,
GroupMilestoneHistory, GroupStateTransitions, Role, RoleHistory, ChangeStateGroupEvent,
MilestoneGroupEvent, GroupExtResource, )
MilestoneGroupEvent, GroupExtResource, Appeal, AppealArtifact )
from ietf.name.models import GroupTypeName
from ietf.utils.validators import validate_external_resource_value
@ -291,3 +294,52 @@ class GroupExtResourceAdmin(admin.ModelAdmin):
search_fields = ['group__acronym', 'value', 'display_name', 'name__slug',]
raw_id_fields = ['group', ]
admin.site.register(GroupExtResource, GroupExtResourceAdmin)
class AppealAdmin(admin.ModelAdmin):
list_display = ["group", "date", "name"]
search_fields = ["group__acronym", "date", "name"]
raw_id_fields = ["group"]
admin.site.register(Appeal, AppealAdmin)
# From https://stackoverflow.com/questions/58529099/adding-file-upload-widget-for-binaryfield-to-django-admin
class BinaryFileInput(forms.ClearableFileInput):
def is_initial(self, value):
"""
Return whether value is considered to be initial value.
"""
return bool(value)
def format_value(self, value):
"""Format the size of the value in the db.
We can't render it's name or url, but we'd like to give some information
as to wether this file is not empty/corrupt.
"""
if self.is_initial(value):
return f'{len(value)} bytes'
def value_from_datadict(self, data, files, name):
"""Return the file contents so they can be put in the db."""
upload = super().value_from_datadict(data, files, name)
if upload:
bits = upload.read()
return b64encode(bits).decode("ascii") # Who made this so hard?
class RestrictContentTypeChoicesForm(forms.ModelForm):
content_type = forms.ChoiceField(
choices=(
( "text/markdown;charset=utf-8", "Markdown"),
( "application/pdf", "PDF")
)
)
class AppealArtifactAdmin(admin.ModelAdmin):
list_display = ["display_title", "appeal","date"]
ordering = ["-appeal__date", "date"]
formfield_overrides = {
BinaryField: { "widget": BinaryFileInput() },
}
form = RestrictContentTypeChoicesForm
admin.site.register(AppealArtifact, AppealArtifactAdmin)

View file

@ -7,8 +7,16 @@ from typing import List # pyflakes:ignore
from django.utils import timezone
from ietf.group.models import Group, Role, GroupEvent, GroupMilestone, \
GroupHistory, RoleHistory
from ietf.group.models import (
Appeal,
AppealArtifact,
Group,
GroupEvent,
GroupMilestone,
GroupHistory,
Role,
RoleHistory
)
from ietf.review.factories import ReviewTeamSettingsFactory
from ietf.utils.timezone import date_today
@ -120,3 +128,34 @@ class RoleHistoryFactory(factory.django.DjangoModelFactory):
person = factory.SubFactory('ietf.person.factories.PersonFactory')
email = factory.LazyAttribute(lambda obj: obj.person.email())
class AppealFactory(factory.django.DjangoModelFactory):
class Meta:
model=Appeal
name=factory.Faker("sentence")
group=factory.SubFactory(GroupFactory, acronym="iab")
class AppealArtifactFactory(factory.django.DjangoModelFactory):
class Meta:
model=AppealArtifact
appeal = factory.SubFactory(AppealFactory)
artifact_type = factory.SubFactory("ietf.name.factories.AppealArtifactTypeNameFactory", slug="appeal")
content_type = "text/markdown;charset=utf-8"
# Needs newer factory_boy
# bits = factory.Transformer(
# "Some example **Markdown**",
# lambda o: memoryview(o.encode("utf-8") if isinstance(o,str) else o)
# )
#
# Usage: a = AppealArtifactFactory(set_bits__using="foo bar") or
# a = AppealArtifactFactory(set_bits__using=b"foo bar")
@factory.post_generation
def set_bits(obj, create, extracted, **kwargs):
if not create:
return
using = kwargs.pop("using","Some example **Markdown**")
if isinstance(using, str):
using = using.encode("utf-8")
obj.bits = memoryview(using)

View file

@ -0,0 +1,205 @@
# Copyright The IETF Trust 2023, All Rights Reserved
import debug # pyflakes: ignore
import datetime
import shutil
import subprocess
import tempfile
from pathlib import Path
from django.core.management.base import BaseCommand
from ietf.group.models import Appeal, AppealArtifact
from ietf.name.models import AppealArtifactTypeName
PDF_FILES = [
"2006-01-04-appeal.pdf",
"2006-08-24-appeal.pdf",
"2006-09-11-appeal.pdf",
"2008-11-29-appeal.pdf",
"2010-06-07-appeal.pdf",
"2010-06-07-response.pdf",
"2013-07-08-appeal.pdf",
"2015-06-22-appeal.pdf",
"2019-01-31-appeal.pdf",
"2019-01-31-response.pdf",
]
NAME_PART_MAP = {
"appeal": "appeal",
"response": "response",
"appeal_with_response": "response",
"reply_to_response": "reply",
}
def bits_name(date, part):
part_type = part["type"]
name_fragment = NAME_PART_MAP[part_type]
prefix = f"{date:%Y-%m-%d}-{name_fragment}"
if f"{prefix}.pdf" in PDF_FILES:
ext = "pdf"
else:
ext = "md"
return f"{prefix}.{ext}"
def date_from_string(datestring):
year, month, day = [int(part) for part in datestring.split("-")]
return datetime.date(year, month, day)
def work_to_do():
# Taken from https://www.iab.org/appeals/ on 2023-08-24 - some lines carved out below as exceptions
input = """
2020-07-31 IAB appeal for arpa assignment (Timothy McSweeney) IAB Response (2020-08-26)
2019-01-31 An appeal to make the procedure related to Independent Submission Stream more transparent (Shyam Bandyopadhyay) IAB Response (2019-03-06)
2015-06-22 Appeal to the IAB concerning the IESG response to his appeal concerning the IESG approval of the draft-ietf-ianaplan-icg-response (JFC Morfin) IAB Response (2015-07-08)
2013-07-08 Appeal to the IAB irt. RFC 6852 (JFC Morfin) IAB Response (2013-07-17)
2010-06-07 Appeal over the IESG Publication of the IDNA2008 Document Set Without Appropriate Explanation to the Internet Community (JFC Morfin) IAB Response (2010-08-20)
2008-11-29 Appeal to the IAB Concerning the Way Users Are Not Permitted To Adequately Contribute to the IETF (JFC Morfin) IAB Response (2009-01-28)
2006-10-10 Complaints about suspension from the ietf@ietf.org mailing list (Todd Glassey) IAB Response (2006-10-31)
2006-09-11 Appeal to the IAB over IESG dismissed appeals from J-F C. Morfin (JFC Morfin) IAB Response (2006-12-05)
2006-09-10 Appeal of IESG Decision of July 10, 2006 from Dean Anderson (Dean Anderson) IAB Response (2006-09-27)
2006-08-24 Appeal Against the decision to consider expediting an RFC Publication from J-F C. Morfin (JFC Morfin) IAB Response (2006-09-07)
2006-04-18 Appeal Against IESG PR-Action from Dean Anderson (Dean Anderson) IAB Response (2006-07-13)
2006-02-08 Appeal Against IESG Decision by Julian Mehnle (Julian Mehnle) IAB Response (2006-03-02)
2006-01-04 Appeal Against IESG Decision by Jefsey Morfin (JFC Morfin) IAB Response (2006-01-31)
2003-01-04 Appeal against IESG decision (Robert Elz) IAB Response (includes original appeal)(2003-02-15)
2000-11-15 Appeal Against IESG Action by Mr. D J Bernstein (D J Bernstein) IAB Response (2001-02-26)
1999-10-23 Appeal against IESG Inaction by W.A. Simpson (William Allen Simpson) IAB Response (2000-01-11)
1999-05-01 Appeal against IESG action (William Allen Simpson) IAB Response (1999-10-05)
1996-03-06 Appeal SNMPv2 SMI Appeal by Mr. David T. Perkins, IAB consideration (David Perkins) IAB Response (includes original appeal) (1996-03-06)
"""
work = []
for line in input.split("\n"):
line = line.strip()
if line == "":
continue
appeal_date = line[:10]
response_date = line[-11:-1]
title = line[11:-12].strip().split(")")[0] + ")"
item = dict(title=title, date=appeal_date, parts=[])
if appeal_date in [
"2006-10-10",
"2000-11-15",
"1999-10-23",
"1999-05-01",
"1996-03-06",
]:
item["parts"].append(dict(type="appeal_with_response", date=response_date))
else:
item["parts"].append(dict(type="appeal", date=appeal_date))
item["parts"].append(dict(type="response", date=response_date))
work.append(item)
# Hand building the items for the following
# exceptions="""
# 2003-10-09 Appeal to the IAB on the site-local issue (Tony Hain)
# IAB Response (2003-11-12)
# Tony Hain reply to IAB Response (2003-11-18)
# 1995-02-18 (etc.) Appeal Against IESG Inaction by Mr. Dave Cocker, Mr W. Simpson (Dave Crocker, William Allen Simpson) IAB Response (1995-04-04 and 1995-04-05)
# """
item = dict(
title="Appeal to the IAB on the site-local issue (Tony Hain)",
date="2003-10-09",
parts=[],
)
item["parts"].append(
dict(
type="appeal",
date="2003-10-09",
)
)
item["parts"].append(
dict(
type="response",
date="2003-11-12",
)
)
item["parts"].append(
dict(
type="reply_to_response",
date="2003-11-18",
)
)
work.append(item)
item = dict(
title="Appeal Against IESG Inaction by Mr. Dave Cocker, Mr W. Simpson (Dave Crocker, William Allen Simpson)",
date="1995-02-18",
parts=[],
)
item["parts"].append(
dict(
type="appeal",
date="1995-02-18",
)
)
item["parts"].append(
dict(
type="response",
date="1995-04-05",
)
)
work.append(item)
for item in work:
item["date"] = date_from_string(item["date"])
for part in item["parts"]:
part["date"] = date_from_string(part["date"])
work.sort(key=lambda o: o["date"])
return work
class Command(BaseCommand):
help = "Performs a one-time import of IAB appeals"
def handle(self, *args, **options):
tmpdir = tempfile.mkdtemp()
process = subprocess.Popen(
["git", "clone", "https://github.com/kesara/iab-scraper.git", tmpdir],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
stdout, stderr = process.communicate()
if not Path(tmpdir).joinpath("iab_appeals", "1995-02-18-appeal.md").exists():
print("Git clone of the iab-scraper directory did not go as expected")
print("stdout:", stdout)
print("stderr:", stderr)
print(f"Clean up {tmpdir} manually")
exit(-1)
work = work_to_do()
for item in work:
# IAB is group 7
appeal = Appeal.objects.create(name=item["title"], date=item["date"], group_id=7)
for part in item["parts"]:
bits_file_name = bits_name(item["date"], part)
if bits_file_name.endswith(".pdf"):
content_type = "application/pdf"
else:
content_type = "text/markdown;charset=utf-8"
with Path(tmpdir).joinpath("iab_appeals", bits_file_name).open(
"rb"
) as source_file:
bits = source_file.read()
artifact_type = AppealArtifactTypeName.objects.get(slug=part["type"])
AppealArtifact.objects.create(
appeal = appeal,
artifact_type=artifact_type,
date=part["date"],
content_type=content_type,
bits=bits,
)
shutil.rmtree(tmpdir)

View file

@ -0,0 +1,83 @@
# Copyright The IETF Trust 2023, All Rights Reserved
from django.db import migrations, models
import django.db.models.deletion
import ietf.utils.models
import ietf.utils.timezone
class Migration(migrations.Migration):
dependencies = [
("name", "0007_appeal_artifact_typename"),
("group", "0001_initial"),
]
operations = [
migrations.CreateModel(
name="Appeal",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("name", models.CharField(max_length=512)),
("date", models.DateField(default=ietf.utils.timezone.date_today)),
(
"group",
models.ForeignKey(
on_delete=django.db.models.deletion.PROTECT, to="group.group"
),
),
],
options={
"ordering": ["-date", "-id"],
},
),
migrations.CreateModel(
name="AppealArtifact",
fields=[
(
"id",
models.AutoField(
auto_created=True,
primary_key=True,
serialize=False,
verbose_name="ID",
),
),
("date", models.DateField(default=ietf.utils.timezone.date_today)),
(
"title",
models.CharField(
blank=True,
help_text="The artifact_type.name will be used if this field is blank",
max_length=256,
),
),
("order", models.IntegerField(default=0)),
("content_type", models.CharField(max_length=32)),
("bits", models.BinaryField(editable=True)),
(
"appeal",
ietf.utils.models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE, to="group.appeal"
),
),
(
"artifact_type",
ietf.utils.models.ForeignKey(
on_delete=django.db.models.deletion.CASCADE,
to="name.appealartifacttypename",
),
),
],
options={
"ordering": ["date", "order", "artifact_type__order"],
},
),
]

View file

@ -13,16 +13,19 @@ from django.db import models
from django.db.models.deletion import CASCADE, PROTECT
from django.dispatch import receiver
from django.utils import timezone
from django.utils.text import slugify
import debug # pyflakes:ignore
from ietf.name.models import (GroupStateName, GroupTypeName, DocTagName, GroupMilestoneStateName, RoleName,
AgendaTypeName, AgendaFilterTypeName, ExtResourceName, SessionPurposeName)
AgendaTypeName, AgendaFilterTypeName, ExtResourceName, SessionPurposeName,
AppealArtifactTypeName )
from ietf.person.models import Email, Person
from ietf.utils.db import IETFJSONField
from ietf.utils.mail import formataddr, send_mail_text
from ietf.utils import log
from ietf.utils.models import ForeignKey, OneToOneField
from ietf.utils.timezone import date_today
from ietf.utils.validators import JSONForeignKeyListValidator
@ -409,6 +412,46 @@ class RoleHistory(models.Model):
class Meta:
verbose_name_plural = "role histories"
class Appeal(models.Model):
name = models.CharField(max_length=512)
group = models.ForeignKey(Group, on_delete=models.PROTECT)
date = models.DateField(default=date_today)
class Meta:
ordering = ['-date', '-id']
def __str__(self):
return f"{self.date} - {self.name}"
class AppealArtifact(models.Model):
appeal = ForeignKey(Appeal)
artifact_type = ForeignKey(AppealArtifactTypeName)
date = models.DateField(default=date_today)
title = models.CharField(max_length=256, blank=True, help_text="The artifact_type.name will be used if this field is blank")
order = models.IntegerField(default=0)
content_type = models.CharField(max_length=32)
# "Abusing" BinaryField (see the django docs) for the small number of
# these things we have on purpose. Later, any non-markdown content may
# move off into statics instead.
bits = models.BinaryField(editable=True)
class Meta:
ordering = ['date', 'order', 'artifact_type__order']
def display_title(self):
if self.title != "":
return self.title
else:
return self.artifact_type.name
def is_markdown(self):
return self.content_type == "text/markdown;charset=utf-8"
def download_name(self):
return f"{self.date}-{slugify(self.display_title())}.{'md' if self.is_markdown() else 'pdf'}"
def __str__(self):
return f"{self.date} {self.display_title()} : {self.appeal.name}"
# --- Signal hooks for group models ---

View file

@ -13,7 +13,7 @@ from ietf import api
from ietf.group.models import (Group, GroupStateTransitions, GroupMilestone, GroupHistory, # type: ignore
GroupURL, Role, GroupEvent, RoleHistory, GroupMilestoneHistory, MilestoneGroupEvent,
ChangeStateGroupEvent, GroupFeatures, GroupExtResource)
ChangeStateGroupEvent, GroupFeatures, GroupExtResource, Appeal, AppealArtifact)
from ietf.person.resources import PersonResource
@ -333,3 +333,42 @@ class GroupExtResourceResource(ModelResource):
"name": ALL_WITH_RELATIONS,
}
api.group.register(GroupExtResourceResource())
class AppealResource(ModelResource):
group = ToOneField(GroupResource, 'group')
class Meta:
queryset = Appeal.objects.all()
serializer = api.Serializer()
cache = SimpleCache()
#resource_name = 'appeal'
ordering = ['id', ]
filtering = {
"id": ALL,
"name": ALL,
"date": ALL,
"group": ALL_WITH_RELATIONS,
}
api.group.register(AppealResource())
from ietf.name.resources import AppealArtifactTypeNameResource
class AppealArtifactResource(ModelResource):
appeal = ToOneField(AppealResource, 'appeal')
artifact_type = ToOneField(AppealArtifactTypeNameResource, 'artifact_type')
class Meta:
excludes= ("bits",)
queryset = AppealArtifact.objects.all()
serializer = api.Serializer()
cache = SimpleCache()
#resource_name = 'appealartifact'
ordering = [ "id", ]
filtering = {
"id": ALL,
"date": ALL,
"title": ALL,
"order": ALL,
"content_type": ALL,
"appeal": ALL_WITH_RELATIONS,
"artifact_type": ALL_WITH_RELATIONS,
}
api.group.register(AppealArtifactResource())

View file

@ -0,0 +1,71 @@
# Copyright The IETF Trust 2023, All Rights Reserved
import debug # pyflakes: ignore
import datetime
from pyquery import PyQuery
from django.urls import reverse as urlreverse
from ietf.utils.test_utils import login_testing_unauthorized, TestCase
from ietf.group.factories import (
AppealFactory,
AppealArtifactFactory,
)
class AppealTests(TestCase):
def test_download_name(self):
artifact = AppealArtifactFactory()
self.assertEqual(artifact.download_name(),f"{artifact.date}-appeal.md")
artifact = AppealArtifactFactory(content_type="application/pdf",artifact_type__slug="response")
self.assertEqual(artifact.download_name(),f"{artifact.date}-response.pdf")
def test_appeal_list_view(self):
appeal_date = datetime.date.today()-datetime.timedelta(days=14)
response_date = appeal_date+datetime.timedelta(days=8)
appeal = AppealFactory(name="A name to look for", date=appeal_date)
appeal_artifact = AppealArtifactFactory(appeal=appeal, artifact_type__slug="appeal", date=appeal_date)
response_artifact = AppealArtifactFactory(appeal=appeal, artifact_type__slug="response", content_type="application/pdf", date=response_date)
url = urlreverse("ietf.group.views.appeals", kwargs=dict(acronym="iab"))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertEqual(len(q("#appeals > tbody > tr")), 1)
self.assertEqual(q("#appeal-1-date").text(), f"{appeal_date}")
self.assertEqual(f"{appeal_artifact.display_title()} - {appeal_date}", q("#artifact-1-1").text())
self.assertEqual(f"{response_artifact.display_title()} - {response_date}", q("#artifact-1-2").text())
self.assertIsNone(q("#artifact-1-1").attr("download"))
self.assertEqual(q("#artifact-1-2").attr("download"), response_artifact.download_name())
def test_markdown_view(self):
artifact = AppealArtifactFactory()
url = urlreverse("ietf.group.views.appeal_artifact", kwargs=dict(acronym="iab", artifact_id=artifact.pk))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertEqual(q("#content>p>strong").text(),"Markdown")
self.assertIsNone(q("#content a").attr("download"))
self.client.login(username='secretary', password='secretary+password')
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
q = PyQuery(r.content)
self.assertEqual(q("#content a").attr("download"), artifact.download_name())
def test_markdown_download(self):
artifact = AppealArtifactFactory()
url = urlreverse("ietf.group.views.appeal_artifact_markdown", kwargs=dict(acronym="iab", artifact_id=artifact.pk))
login_testing_unauthorized(self, "secretary", url)
r = self.client.get(url)
self.assertContains(r, "**Markdown**", status_code=200)
def test_pdf_download(self):
artifact = AppealArtifactFactory(content_type="application/pdf") # The bits won't _really_ be pdf
url = urlreverse("ietf.group.views.appeal_artifact", kwargs=dict(acronym="iab", artifact_id=artifact.pk))
r = self.client.get(url)
self.assertEqual(r.status_code, 200)
self.assertEqual(r.get("Content-Disposition"), f'attachment; filename="{artifact.download_name()}"')
self.assertEqual(r.get("Content-Type"), artifact.content_type)
self.assertEqual(r.content, artifact.bits.tobytes())

View file

@ -48,6 +48,11 @@ info_detail_urls = [
url(r'^reset_next_reviewer/$', views.reset_next_reviewer),
url(r'^email-aliases/$', RedirectView.as_view(pattern_name=views.email,permanent=False),name='ietf.group.urls_info_details.redirect.email'),
url(r'^statements/$', views.statements),
url(r'^appeals/$', views.appeals),
url(r'^appeals/artifact/(?P<artifact_id>\d+)$', views.appeal_artifact),
url(r'^appeals/artifact/(?P<artifact_id>\d+)/markdown$', views.appeal_artifact_markdown),
]

View file

@ -235,6 +235,7 @@ def construct_group_menu_context(request, group, selected, group_type, others):
entries.append(("Meetings", urlreverse("ietf.group.views.meetings", kwargs=kwargs)))
if group.acronym in ["iab", "iesg"]:
entries.append(("Statements", urlreverse("ietf.group.views.statements", kwargs=kwargs)))
entries.append(("Appeals", urlreverse("ietf.group.views.appeals", kwargs=kwargs)))
entries.append(("History", urlreverse("ietf.group.views.history", kwargs=kwargs)))
entries.append(("Photos", urlreverse("ietf.group.views.group_photos", kwargs=kwargs)))
entries.append(("Email expansions", urlreverse("ietf.group.views.email", kwargs=kwargs)))

View file

@ -72,7 +72,7 @@ from ietf.group.forms import (GroupForm, StatusUpdateForm, ConcludeGroupForm, St
AddUnavailablePeriodForm, EndUnavailablePeriodForm, ReviewSecretarySettingsForm, )
from ietf.group.mails import email_admin_re_charter, email_personnel_change, email_comment
from ietf.group.models import ( Group, Role, GroupEvent, GroupStateTransitions,
ChangeStateGroupEvent, GroupFeatures )
ChangeStateGroupEvent, GroupFeatures, AppealArtifact )
from ietf.group.utils import (get_charter_text, can_manage_all_groups_of_type,
milestone_reviewer_for_group_type, can_provide_status_update,
can_manage_materials, group_attribute_change_desc,
@ -111,7 +111,7 @@ from ietf.doc.models import LastCallDocEvent
from ietf.name.models import ReviewAssignmentStateName
from ietf.utils.mail import send_mail_text, parse_preformatted
from ietf.ietfauth.utils import user_is_person
from ietf.ietfauth.utils import user_is_person, role_required
from ietf.dbtemplate.models import DBTemplate
from ietf.mailtrigger.utils import gather_address_lists
from ietf.mailtrigger.models import Recipient
@ -2119,5 +2119,48 @@ def statements(request, acronym, group_type=None):
),
)
def appeals(request, acronym, group_type=None):
if not acronym in ["iab", "iesg"]:
raise Http404
group = get_group_or_404(acronym, group_type)
appeals = group.appeal_set.all()
return render(
request,
"group/appeals.html",
construct_group_menu_context(
request,
group,
"appeals",
group_type,
{
"group": group,
"appeals": appeals,
},
),
)
def appeal_artifact(request, acronym, artifact_id, group_type=None):
artifact = get_object_or_404(AppealArtifact, pk=artifact_id)
if artifact.is_markdown():
artifact_html = markdown.markdown(artifact.bits.tobytes().decode("utf-8"))
return render(
request,
"group/appeal_artifact.html",
dict(artifact=artifact, artifact_html=artifact_html)
)
else:
return HttpResponse(
artifact.bits,
headers = {
"Content-Type": artifact.content_type,
"Content-Disposition": f'attachment; filename="{artifact.download_name()}"'
}
)
@role_required("Secretariat")
def appeal_artifact_markdown(request, acronym, artifact_id, group_type=None):
artifact = get_object_or_404(AppealArtifact, pk=artifact_id)
if artifact.is_markdown():
return HttpResponse(artifact.bits, content_type=artifact.content_type)
else:
raise Http404

View file

@ -0,0 +1,240 @@
# Copyright The IETF Trust 2023, All Rights Reserved
import datetime
import os
import shutil
import subprocess
import tempfile
from pathlib import Path
from django.core.management.base import BaseCommand
from django.conf import settings
from ietf.doc.models import Document, DocAlias, DocEvent
from ietf.meeting.models import Meeting, Session
def agendas_to_import():
return [
"2018-09-05.md",
"2018-09-12.md",
"2018-09-26.md",
"2018-10-03.md",
"2018-10-10.md",
"2018-10-24.md",
"2018-11-04.md",
"2018-11-05.md",
"2018-11-08.md",
"2018-11-21.md",
"2018-11-28.md",
"2018-12-05.md",
"2018-12-19.md",
"2019-01-09.md",
"2019-01-16.md",
"2019-01-23.md",
"2019-02-06.md",
"2019-02-13.md",
"2019-02-27.md",
"2019-03-06.md",
"2019-03-13.md",
"2019-03-24.md",
"2019-03-25.md",
"2019-03-28.md",
"2019-04-10.md",
"2019-04-17.md",
"2019-05-01.md",
"2019-05-08.md",
"2019-05-29.md",
"2019-06-12.md",
"2019-06-26.md",
"2019-07-10.md",
"2019-07-21.md",
"2019-07-25.md",
"2019-08-07.md",
"2019-08-21.md",
"2019-08-28.md",
"2019-09-04.md",
"2019-09-18.md",
"2019-10-02.md",
"2019-10-16.md",
"2019-10-30.md",
"2019-11-17.md",
"2019-11-18.md",
"2019-11-21.md",
"2019-12-04.md",
"2019-12-11.md",
"2019-12-18.md",
"2020-01-08.md",
"2020-01-15.md",
"2020-01-22.md",
"2020-02-05.md",
"2020-02-12.md",
"2020-02-19.md",
"2020-03-04.md",
"2020-03-11.md",
"2020-03-18.md",
"2020-04-01.md",
"2020-04-08.md",
"2020-04-15.md",
"2020-04-29.md",
"2020-05-13.md",
"2020-05-20.md",
"2020-05-27.md",
"2020-06-10.md",
"2020-06-17.md",
"2020-07-01.md",
"2020-07-15.md",
"2020-08-12.md",
"2020-08-26.md",
"2020-09-09.md",
"2020-09-23.md",
"2020-10-07.md",
"2020-10-14.md",
"2020-10-21.md",
"2020-11-04.md",
"2020-12-02.md",
"2020-12-16.md",
"2021-01-06.md",
"2021-01-13.md",
"2021-01-20.md",
"2021-01-27.md",
"2021-02-03.md",
"2021-02-10.md",
"2021-02-17.md",
"2021-02-24.md",
"2021-03-03.md",
"2021-03-24.md",
"2021-03-31.md",
"2021-04-07.md",
"2021-04-14.md",
"2021-04-21.md",
"2021-05-05.md",
"2021-05-12.md",
"2021-05-19.md",
"2021-05-26.md",
"2021-06-02.md",
"2021-06-16.md",
"2021-06-23.md",
"2021-06-30.md",
"2021-07-14.md",
"2021-07-21.md",
"2021-08-11.md",
"2021-08-25.md",
"2021-09-01.md",
"2021-09-08.md",
"2021-09-22.md",
"2021-10-06.md",
"2021-10-20.md",
"2021-10-27.md",
"2021-11-17.md",
"2021-12-01.md",
"2021-12-08.md",
"2021-12-15.md",
"2022-01-12.md",
"2022-01-19.md",
"2022-02-02.md",
"2022-02-16.md",
"2022-02-23.md",
"2022-03-02.md",
"2022-03-09.md",
"2022-03-20.md",
"2022-04-06.md",
"2022-04-13.md",
"2022-04-20.md",
"2022-04-27.md",
"2022-05-04.md",
"2022-05-11.md",
"2022-06-01.md",
"2022-06-15.md",
"2022-06-22.md",
"2022-06-29.md",
"2022-07-06.md",
"2022-07-24.md",
"2022-07-26.md",
"2022-08-10.md",
"2022-08-24.md",
"2022-09-07.md",
"2022-09-21.md",
"2022-09-28.md",
"2022-10-05.md",
"2022-10-12.md",
"2022-10-26.md",
"2022-11-06.md",
"2022-11-08.md",
"2022-11-10.md",
"2022-11-23.md",
"2022-12-07.md",
"2022-12-14.md",
]
class Command(BaseCommand):
help = "Performs a one-time import of older IAB agendas"
def handle(self, *args, **options):
if Document.objects.filter(name="agenda-interim-2018-iab-26-20180905").exists():
print("Command has already been run - exiting")
exit(0)
tmpdir = tempfile.mkdtemp()
process = subprocess.Popen(
["git", "clone", "https://github.com/kesara/iab-scraper.git", tmpdir],
stdout=subprocess.PIPE,
stderr=subprocess.PIPE,
)
stdout, stderr = process.communicate()
if not Path(tmpdir).joinpath("iab_agendas", "2018-09-05.md").exists():
print("Git clone of the iab-scraper directory did not go as expected")
print("stdout:", stdout)
print("stderr:", stderr)
print(f"Clean up {tmpdir} manually")
exit(-1)
agendas = agendas_to_import()
for agenda in agendas:
[year, month, day] = [int(part) for part in agenda[:10].split("-")]
agenda_date = datetime.date(year, month, day)
meeting = Meeting.objects.get(
date=agenda_date, type_id="interim", session__group__acronym="iab"
)
counter = int(meeting.number.split("-")[3])
agenda_docname = (
f"agenda-interim-{year}-iab-{counter:02d}-{agenda_date:%Y%m%d}"
)
agenda_filename = f"{agenda_docname}-00.md"
# Create Document
doc = Document.objects.create(
name=agenda_docname,
type_id="agenda",
title=f"Agenda {meeting.number} {agenda_date:%Y-%m-%d}",
group_id=7, # The IAB group
rev="00",
uploaded_filename=agenda_filename,
)
DocAlias.objects.create(name=doc.name).docs.add(doc)
e = DocEvent.objects.create(
type="comment",
doc=doc,
rev="00",
by_id=1, # The "(System)" person
desc="Agenda moved into datatracker from iab wordpress website",
)
doc.save_with_history([e])
session = Session.objects.get(meeting=meeting)
# Add Document to Session
session.sessionpresentation_set.create(document=doc, rev=doc.rev)
# Put file in place
source = Path(tmpdir).joinpath("iab_agendas", agenda)
dest = Path(settings.AGENDA_PATH).joinpath(
meeting.number, "agenda", agenda_filename
)
if dest.exists():
print(f"WARNING: {dest} already exists - not overwriting it.")
else:
os.makedirs(dest.parent, exist_ok=True)
shutil.copy(source, dest)
shutil.rmtree(tmpdir)

View file

@ -2,63 +2,141 @@
from django.contrib import admin
from ietf.name.models import (
AgendaTypeName, BallotPositionName, ConstraintName, ContinentName, CountryName, DBTemplateTypeName,
DocRelationshipName, DocReminderTypeName, DocTagName, DocTypeName, DraftSubmissionStateName,
FeedbackTypeName, FormalLanguageName, GroupMilestoneStateName, GroupStateName, GroupTypeName,
ImportantDateName, IntendedStdLevelName, IprDisclosureStateName, IprEventTypeName,
IprLicenseTypeName, LiaisonStatementEventTypeName, LiaisonStatementPurposeName,
LiaisonStatementState, LiaisonStatementTagName, MeetingTypeName, NomineePositionStateName,
ReviewRequestStateName, ReviewResultName, ReviewTypeName, RoleName, RoomResourceName,
SessionStatusName, StdLevelName, StreamName, TimeSlotTypeName, TopicAudienceName,
DocUrlTagName, ReviewAssignmentStateName, ReviewerQueuePolicyName, TimerangeName,
ExtResourceName, ExtResourceTypeName, SlideSubmissionStatusName, ProceedingsMaterialTypeName,
AgendaFilterTypeName, SessionPurposeName, TelechatAgendaSectionName )
AgendaTypeName,
BallotPositionName,
ConstraintName,
ContinentName,
CountryName,
DBTemplateTypeName,
DocRelationshipName,
DocReminderTypeName,
DocTagName,
DocTypeName,
DraftSubmissionStateName,
FeedbackTypeName,
FormalLanguageName,
GroupMilestoneStateName,
GroupStateName,
GroupTypeName,
ImportantDateName,
IntendedStdLevelName,
IprDisclosureStateName,
IprEventTypeName,
IprLicenseTypeName,
LiaisonStatementEventTypeName,
LiaisonStatementPurposeName,
LiaisonStatementState,
LiaisonStatementTagName,
MeetingTypeName,
NomineePositionStateName,
ReviewRequestStateName,
ReviewResultName,
ReviewTypeName,
RoleName,
RoomResourceName,
SessionStatusName,
StdLevelName,
StreamName,
TimeSlotTypeName,
TopicAudienceName,
DocUrlTagName,
ReviewAssignmentStateName,
ReviewerQueuePolicyName,
TimerangeName,
ExtResourceName,
ExtResourceTypeName,
SlideSubmissionStatusName,
ProceedingsMaterialTypeName,
AgendaFilterTypeName,
SessionPurposeName,
TelechatAgendaSectionName,
AppealArtifactTypeName,
)
from ietf.stats.models import CountryAlias
class NameAdmin(admin.ModelAdmin):
list_display = ["slug", "name", "desc", "used", "order"]
search_fields = ["slug", "name"]
prepopulate_from = { "slug": ("name",) }
prepopulate_from = {"slug": ("name",)}
class DocRelationshipNameAdmin(NameAdmin):
list_display = ["slug", "name", "revname", "desc", "used"]
admin.site.register(DocRelationshipName, DocRelationshipNameAdmin)
class DocTypeNameAdmin(NameAdmin):
list_display = ["slug", "name", "prefix", "desc", "used"]
admin.site.register(DocTypeName, DocTypeNameAdmin)
class GroupTypeNameAdmin(NameAdmin):
list_display = ["slug", "name", "verbose_name", "desc", "used"]
admin.site.register(GroupTypeName, GroupTypeNameAdmin)
class CountryAliasInline(admin.TabularInline):
model = CountryAlias
extra = 1
class CountryNameAdmin(NameAdmin):
list_display = ["slug", "name", "continent", "in_eu"]
list_filter = ["continent", "in_eu"]
inlines = [CountryAliasInline]
admin.site.register(CountryName, CountryNameAdmin)
class ImportantDateNameAdmin(NameAdmin):
list_display = ["slug", "name", "desc", "used", "default_offset_days"]
ordering = ('-used','default_offset_days',)
admin.site.register(ImportantDateName,ImportantDateNameAdmin)
ordering = (
"-used",
"default_offset_days",
)
admin.site.register(ImportantDateName, ImportantDateNameAdmin)
class ExtResourceNameAdmin(NameAdmin):
list_display = ["slug", "name", "type", "desc", "used",]
admin.site.register(ExtResourceName,ExtResourceNameAdmin)
list_display = [
"slug",
"name",
"type",
"desc",
"used",
]
admin.site.register(ExtResourceName, ExtResourceNameAdmin)
class ProceedingsMaterialTypeNameAdmin(NameAdmin):
list_display = ["slug", "name", "desc", "used", "order",]
list_display = [
"slug",
"name",
"desc",
"used",
"order",
]
admin.site.register(ProceedingsMaterialTypeName, ProceedingsMaterialTypeNameAdmin)
admin.site.register(AgendaFilterTypeName, NameAdmin)
admin.site.register(AgendaTypeName, NameAdmin)
admin.site.register(AppealArtifactTypeName, NameAdmin)
admin.site.register(BallotPositionName, NameAdmin)
admin.site.register(ConstraintName, NameAdmin)
admin.site.register(ContinentName, NameAdmin)

13
ietf/name/factories.py Normal file
View file

@ -0,0 +1,13 @@
# Copyright The IETF Trust 2023, All Rights Reserved
# -*- coding: utf-8 -*-
import factory
from .models import (
AppealArtifactTypeName,
)
class AppealArtifactTypeNameFactory(factory.django.DjangoModelFactory):
class Meta:
model = AppealArtifactTypeName
django_get_or_create = ("slug",)

View file

@ -6615,6 +6615,56 @@
"model": "name.agendatypename",
"pk": "workshop"
},
{
"fields": {
"desc": "The content of an appeal",
"name": "Appeal",
"order": 1,
"used": true
},
"model": "name.appealartifacttypename",
"pk": "appeal"
},
{
"fields": {
"desc": "The content of an appeal combined with the content of a response",
"name": "Response (with appeal included)",
"order": 2,
"used": true
},
"model": "name.appealartifacttypename",
"pk": "appeal_with_response"
},
{
"fields": {
"desc": "Other content related to an appeal",
"name": "Other content",
"order": 5,
"used": true
},
"model": "name.appealartifacttypename",
"pk": "other_content"
},
{
"fields": {
"desc": "The content of a reply to an appeal response",
"name": "Reply to response",
"order": 4,
"used": true
},
"model": "name.appealartifacttypename",
"pk": "reply_to_response"
},
{
"fields": {
"desc": "The content of a response to an appeal",
"name": "Response",
"order": 3,
"used": true
},
"model": "name.appealartifacttypename",
"pk": "response"
},
{
"fields": {
"blocking": false,
@ -11773,13 +11823,24 @@
"model": "name.importantdatename",
"pk": "draftwgagenda"
},
{
"fields": {
"default_offset_days": -12,
"desc": "Early registration and payment cut-off at UTC 23:59",
"name": "Early cutoff",
"order": 0,
"used": true
},
"model": "name.importantdatename",
"pk": "early"
},
{
"fields": {
"default_offset_days": -47,
"desc": "Early Bird registration and payment cut-off at UTC 23:59",
"name": "Earlybird cutoff",
"order": 0,
"used": true
"used": false
},
"model": "name.importantdatename",
"pk": "earlybird"
@ -11900,11 +11961,22 @@
"desc": "Standard rate registration and payment cut-off at UTC 23:59.",
"name": "Standard rate registration ends",
"order": 18,
"used": true
"used": false
},
"model": "name.importantdatename",
"pk": "stdratecutoff"
},
{
"fields": {
"default_offset_days": -47,
"desc": "Super Early registration cutoff at UTC 23:59",
"name": "Super Early cutoff",
"order": 0,
"used": true
},
"model": "name.importantdatename",
"pk": "superearly"
},
{
"fields": {
"desc": "",
@ -16455,7 +16527,7 @@
"fields": {
"command": "xym",
"switch": "--version",
"time": "2023-07-17T07:09:47.664Z",
"time": "2023-08-22T07:09:39.542Z",
"used": true,
"version": "xym 0.7.0"
},
@ -16466,7 +16538,7 @@
"fields": {
"command": "pyang",
"switch": "--version",
"time": "2023-07-17T07:09:48.075Z",
"time": "2023-08-22T07:09:39.881Z",
"used": true,
"version": "pyang 2.5.3"
},
@ -16477,7 +16549,7 @@
"fields": {
"command": "yanglint",
"switch": "--version",
"time": "2023-07-17T07:09:48.104Z",
"time": "2023-08-22T07:09:39.899Z",
"used": true,
"version": "yanglint SO 1.9.2"
},
@ -16488,9 +16560,9 @@
"fields": {
"command": "xml2rfc",
"switch": "--version",
"time": "2023-07-17T07:09:49.075Z",
"time": "2023-08-22T07:09:40.791Z",
"used": true,
"version": "xml2rfc 3.17.4"
"version": "xml2rfc 3.18.0"
},
"model": "utils.versioninfo",
"pk": 4

View file

@ -0,0 +1,59 @@
# Copyright The IETF Trust 2023, All Rights Reserved
from django.db import migrations, models
def forward(apps, schema_editor):
AppealArtifactTypeName = apps.get_model("name", "AppealArtifactTypeName")
for slug, name, desc, order in [
("appeal", "Appeal", "The content of an appeal", 1),
(
"appeal_with_response",
"Response (with appeal included)",
"The content of an appeal combined with the content of a response",
2,
),
("response", "Response", "The content of a response to an appeal", 3),
(
"reply_to_response",
"Reply to response",
"The content of a reply to an appeal response",
4,
),
("other_content", "Other content", "Other content related to an appeal", 5),
]:
AppealArtifactTypeName.objects.create(
slug=slug, name=name, desc=desc, order=order
)
def reverse(apps, schema_editor):
AppealArtifactTypeName = apps.get_model("name", "AppealArtifactTypeName")
AppealArtifactTypeName.objects.delete()
class Migration(migrations.Migration):
dependencies = [
("name", "0006_feedbacktypename_data"),
]
operations = [
migrations.CreateModel(
name="AppealArtifactTypeName",
fields=[
(
"slug",
models.CharField(max_length=32, primary_key=True, serialize=False),
),
("name", models.CharField(max_length=255)),
("desc", models.TextField(blank=True)),
("used", models.BooleanField(default=True)),
("order", models.IntegerField(default=0)),
],
options={
"ordering": ["order", "name"],
"abstract": False,
},
),
migrations.RunPython(forward, reverse),
]

View file

@ -150,4 +150,7 @@ class ExtResourceName(NameModel):
class SlideSubmissionStatusName(NameModel):
"Pending, Accepted, Rejected"
class TelechatAgendaSectionName(NameModel):
"roll_call", "minutes", "action_items"
"""roll_call, minutes, action_items"""
class AppealArtifactTypeName(NameModel):
pass

View file

@ -18,7 +18,8 @@ from ietf.name.models import ( AgendaFilterTypeName, AgendaTypeName, BallotPosit
ReviewAssignmentStateName, ReviewRequestStateName, ReviewResultName, ReviewTypeName,
RoleName, RoomResourceName, SessionStatusName, StdLevelName, StreamName, TimeSlotTypeName,
TopicAudienceName, ReviewerQueuePolicyName, TimerangeName, ExtResourceTypeName, ExtResourceName,
SlideSubmissionStatusName, ProceedingsMaterialTypeName, SessionPurposeName, TelechatAgendaSectionName )
SlideSubmissionStatusName, ProceedingsMaterialTypeName, SessionPurposeName, TelechatAgendaSectionName,
AppealArtifactTypeName )
class TimeSlotTypeNameResource(ModelResource):
class Meta:
@ -737,3 +738,17 @@ class TelechatAgendaSectionNameResource(ModelResource):
"order": ALL,
}
api.name.register(TelechatAgendaSectionNameResource())
class AppealArtifactTypeNameResource(ModelResource):
class Meta:
cache = SimpleCache()
queryset = AppealArtifactTypeName.objects.all()
serializer = api.Serializer()
filtering = {
"slug": ALL,
"name": ALL,
"desc": ALL,
"used": ALL,
"order": ALL,
}
api.name.register(AppealArtifactTypeNameResource())

View file

@ -1,7 +1,27 @@
@use "sass:map";
$font-family-sans-serif: "Inter", system-ui, -apple-system, "Segoe UI", Roboto, "Helvetica Neue", "Noto Sans", "Liberation Sans", Arial, sans-serif, "Apple Color Emoji", "Segoe UI Emoji", "Segoe UI Symbol", "Noto Color Emoji";
$font-family-monospace: "Noto Sans Mono", SFMono-Regular, Menlo, Monaco, Consolas, "Liberation Mono", "Courier New", monospace;
$font-family-sans-serif: "Inter",
system-ui,
-apple-system,
"Segoe UI",
Roboto,
"Helvetica Neue",
"Noto Sans",
"Liberation Sans",
Arial,
sans-serif,
"Apple Color Emoji",
"Segoe UI Emoji",
"Segoe UI Symbol",
"Noto Color Emoji";
$font-family-monospace: "Noto Sans Mono",
SFMono-Regular,
Menlo,
Monaco,
Consolas,
"Liberation Mono",
"Courier New",
monospace;
@import "bootstrap/scss/functions";
@ -25,7 +45,7 @@ $color-mode-type: data;
@import "bootstrap/scss/forms";
@import "bootstrap/scss/buttons";
@import "bootstrap/scss/transitions";
// @import "bootstrap/scss/dropdown";
@import "bootstrap/scss/dropdown";
@import "bootstrap/scss/button-group";
@import "bootstrap/scss/nav";
@import "bootstrap/scss/navbar";
@ -65,12 +85,16 @@ $color-mode-type: data;
scrollbar-width: none;
}
.sidebar-toggle[aria-expanded="true"] {
.sidebar-toggle[aria-expanded="true"] .sidebar-shown {
display: none;
}
.sidebar-toggle[aria-expanded="false"] {
display: inherit;
.sidebar-toggle[aria-expanded="false"] .sidebar-collapsed {
display: none;
}
.sidebar-toolbar {
z-index: 1;
}
// Toggle classes for dark/light modes
@ -94,6 +118,11 @@ $color-mode-type: data;
}
}
// Show theme toggler checkbox
.dropdown-menu .active .bi {
display: block !important;
}
@media screen {
@include media-breakpoint-down(md) {
body {
@ -354,7 +383,7 @@ tbody.meta tr {
page-break-inside: avoid;
}
/*
/*
a:link,
a:visited {
// color: inherit;

View file

@ -3,6 +3,7 @@
* Copyright 2011-2023 The Bootstrap Authors
* Licensed under the Creative Commons Attribution 3.0 Unported License.
*
* Based on the below, with some changes for the datatracker:
* https://github.com/twbs/bootstrap/blob/main/site/static/docs/5.3/assets/js/color-modes.js
*/
@ -45,9 +46,10 @@
// Commented-out lines are from the original bs5 js, which uses a more complicated pref dropdown.
// Kept them here for easier future diffing.
const themeSwitcherText = document.querySelector('#bd-theme-text')
// const activeThemeIcon = document.querySelector('.theme-icon-active use')
const activeThemeIcon = document.querySelector('.theme-icon-active')
const btnToActive = document.querySelector(`[data-bs-theme-value="${theme}"]`)
// const svgOfActiveBtn = btnToActive.querySelector('svg use').getAttribute('href')
const iconPattern = new RegExp(/\bbi-[\w-]+\b/);
const iconOfActiveBtn = btnToActive.querySelector('i').className.match(iconPattern)[0]
document.querySelectorAll('[data-bs-theme-value]').forEach(element => {
element.classList.remove('active')
@ -56,10 +58,13 @@
btnToActive.classList.add('active')
btnToActive.setAttribute('aria-pressed', 'true')
// activeThemeIcon.setAttribute('href', svgOfActiveBtn)
// const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`
// themeSwitcher.setAttribute('aria-label', themeSwitcherLabel)
if (activeThemeIcon) {
activeThemeIcon.className = activeThemeIcon.className.replace(iconPattern, iconOfActiveBtn)
}
if (themeSwitcherText) {
const themeSwitcherLabel = `${themeSwitcherText.textContent} (${btnToActive.dataset.bsThemeValue})`
themeSwitcher.setAttribute('aria-label', themeSwitcherLabel)
}
if (focus) {
themeSwitcher.focus()
}

View file

@ -79,11 +79,18 @@ class Submission(models.Model):
return Document.objects.filter(name=self.name).first()
def latest_checks(self):
checks = [ self.checks.filter(checker=c).latest('time') for c in self.checks.values_list('checker', flat=True).distinct() ]
return checks
"""Latest check of each type, excluding any that did not apply
Ignores any checks where passed is None
"""
latest_for_each_checker = [
self.checks.filter(checker=c).latest("time")
for c in self.checks.values_list("checker", flat=True).distinct()
]
return [check for check in latest_for_each_checker if check.passed is not None]
def has_yang(self):
return any ( [ c.checker=='yang validation' and c.passed is not None for c in self.latest_checks()] )
return any(c.checker == "yang validation" for c in self.latest_checks())
@property
def replaces_names(self):

View file

@ -3808,3 +3808,54 @@ class TestOldNamesAreProtected(BaseSubmitTestCase):
files["xml"], _ = submission_file("draft-something-hascapitalletters-00", "draft-something-hascapitalletters-00.xml", None, "test_submission.xml")
r = self.post_to_upload_submission(url, files)
self.assertContains(r,"Case-conflicting draft name found",status_code=200)
class SubmissionStatusTests(BaseSubmitTestCase):
"""Tests of the submission_status view
Many tests are interspersed in the monolithic tests above. We can aspire to break these
out more modularly, though.
"""
def test_submission_checks(self):
for state_slug in ("uploaded", "cancel", "posted"):
submission = SubmissionFactory(state_id=state_slug)
url = urlreverse(
"ietf.submit.views.submission_status",
kwargs={"submission_id": submission.pk},
)
# No checks
r = self.client.get(url)
self.assertContains(
r,
"No submission checks were applied to your Internet-Draft.",
status_code=200,
)
# Inapplicable check
submission.checks.create(
checker="yang validation", passed=None, message="Yang message"
)
r = self.client.get(url)
self.assertContains(
r,
"No submission checks were applied to your Internet-Draft.",
status_code=200,
)
# Passed check
submission.checks.create(
checker="idnits check", passed=True, message="idnits ok"
)
r = self.client.get(url)
self.assertContains(
r,
"Your Internet-Draft has been verified to pass the submission checks.",
status_code=200,
)
# Failed check + passed check
submission.checks.filter(checker="yang validation").update(passed=False)
r = self.client.get(url)
self.assertContains(
r,
"Your Internet-Draft failed at least one submission check.",
status_code=200,
)

View file

@ -11,6 +11,8 @@ import time
import traceback
import xml2rfc
from pathlib import Path
from shutil import move
from typing import Optional, Union # pyflakes:ignore
from unidecode import unidecode
@ -639,24 +641,27 @@ def cancel_submission(submission):
submission.save()
remove_submission_files(submission)
def rename_submission_files(submission, prev_rev, new_rev):
for ext in settings.IDSUBMIT_FILE_TYPES:
source = os.path.join(settings.IDSUBMIT_STAGING_PATH, '%s-%s.%s' % (submission.name, prev_rev, ext))
dest = os.path.join(settings.IDSUBMIT_STAGING_PATH, '%s-%s.%s' % (submission.name, new_rev, ext))
if os.path.exists(source):
os.rename(source, dest)
staging_path = Path(settings.IDSUBMIT_STAGING_PATH)
source = staging_path / f"{submission.name}-{prev_rev}.{ext}"
dest = staging_path / f"{submission.name}-{new_rev}.{ext}"
if source.exists():
move(source, dest)
def move_files_to_repository(submission):
for ext in settings.IDSUBMIT_FILE_TYPES:
source = os.path.join(settings.IDSUBMIT_STAGING_PATH, '%s-%s.%s' % (submission.name, submission.rev, ext))
dest = os.path.join(settings.IDSUBMIT_REPOSITORY_PATH, '%s-%s.%s' % (submission.name, submission.rev, ext))
if os.path.exists(source):
os.rename(source, dest)
else:
if os.path.exists(dest):
log.log("Intended to move '%s' to '%s', but found source missing while destination exists.")
elif ext in submission.file_types.split(','):
raise ValueError("Intended to move '%s' to '%s', but found source and destination missing.")
fname = f"{submission.name}-{submission.rev}.{ext}"
source = Path(settings.IDSUBMIT_STAGING_PATH) / fname
dest = Path(settings.IDSUBMIT_REPOSITORY_PATH) / fname
if source.exists():
move(source, dest)
elif dest.exists():
log.log("Intended to move '%s' to '%s', but found source missing while destination exists.")
elif ext in submission.file_types.split(','):
raise ValueError("Intended to move '%s' to '%s', but found source and destination missing.")
def remove_staging_files(name, rev, exts=None):

View file

@ -317,8 +317,13 @@ def submission_status(request, submission_id, access_token=None):
if access_token and not key_matched:
raise Http404
errors = validate_submission(submission)
passes_checks = all([ c.passed!=False for c in submission.checks.all() ])
if submission.state.slug == "cancel":
errors = {}
else:
errors = validate_submission(submission)
latest_checks = submission.latest_checks()
applied_any_checks = len(latest_checks) > 0
passes_checks = applied_any_checks and all(c.passed for c in latest_checks)
is_secretariat = has_role(request.user, "Secretariat")
is_chair = submission.group and submission.group.has_role(request.user, "chair")
@ -353,7 +358,21 @@ def submission_status(request, submission_id, access_token=None):
message = None
if submission.state_id == "cancel":
message = ('error', 'This submission has been cancelled, modification is no longer possible.')
# would be nice to have a less heuristic mechansim for reporting async processing failure
async_processing_error = submission.submissionevent_set.filter(
desc__startswith="Submission rejected: A system error occurred"
).exists()
if async_processing_error:
message = (
"error",
"This submission has been cancelled due to a system error during processing. "
"Modification is no longer possible.",
)
else:
message = (
"error",
"This submission has been cancelled, modification is no longer possible.",
)
elif submission.state_id == "auth":
message = ('success', 'The submission is pending email authentication. An email has been sent to: %s' % ", ".join(confirmation_list))
elif submission.state_id == "grp-appr":
@ -530,6 +549,7 @@ def submission_status(request, submission_id, access_token=None):
'selected': 'status',
'submission': submission,
'errors': errors,
'applied_any_checks': applied_any_checks,
'passes_checks': passes_checks,
'submitter_form': submitter_form,
'replaces_form': replaces_form,

View file

@ -50,7 +50,7 @@
</ul>
</div>
<div class="d-flex align-items-center">
<a class="nav-link {% if server_mode and server_mode != "production" %}text-danger{% else %}text-warning{% endif %} d-none d-xl-inline me-xl-4"
<a class="nav-link text-danger d-none d-xl-inline me-xl-4"
target="_blank"
href="https://github.com/ietf-tools/datatracker/issues/new/choose">
Report a bug

View file

@ -51,17 +51,50 @@
</head>
<body>
{% analytical_body_top %}
<button class="btn btn-outline-secondary position-fixed top-0 end-0 m-2 sidebar-toggle"
type="button"
id="sidebar-on"
data-bs-toggle="collapse"
data-bs-target="#sidebar"
aria-expanded="{% if request.COOKIES.sidebar != 'off'%}true{% else %}false{% endif %}"
aria-controls="sidebar"
aria-label="Show metadata sidebar"
title="Show metadata sidebar">
<i class="bi bi-layout-sidebar-reverse"></i>
</button>
<div class="btn-toolbar sidebar-toolbar position-fixed top-0 end-0 m-2 m-lg-3">
<div class="dropdown">
<button class="btn btn-outline-secondary btn-sm me-1 dropdown-toggle d-flex align-items-center"
id="bd-theme" type="button" aria-expanded="false" data-bs-toggle="dropdown"
aria-label="Toggle theme">
<i class="theme-icon-active bi bi-circle-half"></i>
</button>
<ul class="dropdown-menu" aria-labelledby="bd-theme">
<li>
<button type="button" class="dropdown-item d-flex align-items-center"
data-bs-theme-value="light" aria-pressed="false">
<i class="me-2 opacity-50 theme-icon bi bi-sun-fill"></i>
Light<i class="bi bi-check2 ms-auto d-none"></i>
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center"
data-bs-theme-value="dark" aria-pressed="false">
<i class="me-2 opacity-50 theme-icon bi bi-moon-stars-fill"></i>
Dark<i class="bi bi-check2 ms-auto d-none"></i>
</button>
</li>
<li>
<button type="button" class="dropdown-item d-flex align-items-center active"
data-bs-theme-value="auto" aria-pressed="true">
<i class="me-2 opacity-50 theme-icon bi bi-circle-half"></i>
Auto<i class="bi bi-check2 ms-auto d-none"></i>
</button>
</li>
</ul>
</div>
<button class="btn btn-outline-secondary btn-sm sidebar-toggle"
type="button"
data-bs-toggle="collapse"
data-bs-target="#sidebar"
aria-expanded="{% if request.COOKIES.sidebar != 'off'%}true{% else %}false{% endif %}"
aria-controls="sidebar"
aria-label="Toggle metadata sidebar"
title="Toggle metadata sidebar">
<i class="bi bi-layout-sidebar-reverse sidebar-shown"></i>
<i class="bi bi-arrow-bar-up sidebar-collapsed"></i>
</button>
</div>
<nav class="navbar bg-light-subtle px-1 fixed-top d-print-none d-md-none">
<a class="nav-link ps-1"
href="{% url 'ietf.doc.views_doc.document_main' name=doc.canonical_name %}">
@ -139,17 +172,6 @@
</div>
<div class="d-print-none col-md-3 bg-light-subtle collapse{% if request.COOKIES.sidebar != 'off'%} show{% endif %}" id="sidebar">
<div class="position-fixed border-start sidebar overflow-scroll overscroll-none no-scrollbar">
<button class="btn btn-outline-secondary float-end m-2"
type="button"
id="sidebar-off"
data-bs-toggle="collapse"
data-bs-target="#sidebar"
aria-expanded="{% if request.COOKIES.sidebar != 'off'%}true{% else %}false{% endif %}"
aria-controls="sidebar"
aria-label="Hide metadata sidebar"
title="Hide metadata sidebar">
<i class="bi bi-arrow-bar-up"></i>
</button>
<div class="pt-2 pt-lg-3 px-md-2 px-lg-3">
<a class="btn btn-primary btn-sm" href="{% url 'ietf.doc.views_doc.document_main' name=doc.canonical_name %}">Datatracker</a>
<p class="fw-bold pt-2">

View file

@ -0,0 +1,24 @@
{% extends "base.html" %}
{% load ietf_filters %}
{# Copyright The IETF Trust 2023. All Rights Reserved. #}
{% load origin %}
{% block title %}{{artifact.display_title}} - {{artifact.appeal.name}}{% endblock %}
{% block pagehead %}
<meta name="description"
content="{{artifact.date}} = {{artifact.display_title}} - {{artifact.appeal.name}}">
{% endblock %}
{% block content %}
{% origin %}
<h1>
{{artifact.appeal.name}} - {{artifact.appeal.date}}
<br>
<small class="text-body-secondary">{{ artifact.display_title }} - {{ artifact.date }}</small>
</h1>
{{ artifact_html }}
{% if request.user|has_role:"Secretariat" %}
<hr>
<div>
<a class="btn btn-primary btn-sm" download="{{artifact.download_name}}" href="{% url 'ietf.group.views.appeal_artifact_markdown' acronym=artifact.appeal.group.acronym artifact_id=artifact.pk %}">Download markdown source</a>
</div>
{% endif %}
{% endblock %}

View file

@ -0,0 +1,38 @@
{% extends "group/group_base.html" %}
{# Copyright The IETF Trust 2023, All Rights Reserved #}
{% load origin %}
{% load ietf_filters person_filters textfilters %}
{% load static %}
{% block pagehead %}
<link rel="stylesheet" href="{% static "ietf/css/list.css" %}">
{% endblock %}
{% block group_content %}
{% origin %}
<h2 class="my-3">{{group.acronym|upper}} Appeals</h2>
<table id="appeals" class="my-3 table table-sm table-striped tablesorter">
<thead>
<tr>
<th class="col-1" scope="col" data-sort="date">Date</th>
<th scope="col" data-sort="appeal">Appeal</th>
</tr>
</thead>
<tbody>
{% for appeal in appeals %}
<tr id="appeal-{{forloop.counter}}">
<td id="appeal-{{forloop.counter}}-date">{{ appeal.date|date:"Y-m-d" }}</td>
<td>{{appeal.name}}
<div class="buttonlist">
{% for part in appeal.appealartifact_set.all %}
<a id="artifact-{{forloop.parentloop.counter}}-{{forloop.counter}}" class="btn btn-primary btn-sm" href="{% url 'ietf.group.views.appeal_artifact' acronym=group.acronym artifact_id=part.pk %}"{% if not part.is_markdown %} download="{{part.download_name}}"{%endif%}>{{part.display_title}} - {{part.date|date:"Y-m-d"}}</a>
{% endfor %}
</div>
</td>
</tr>
{% endfor %}
</tbody>
</table>
{% endblock %}
{% block js %}
<script src="{% static "ietf/js/list.js" %}"></script>
{% endblock %}

View file

@ -135,6 +135,10 @@
</td>
<td>
{% if not s.canceled %}
<a class="btn btn-sm {% if not s.agenda %}btn-secondary disabled{% else %}btn-primary{% endif %}"
{% if s.agenda %}href="{{ s.agenda.get_absolute_url }}"{% endif %}>
Agenda
</a>
<a class="btn btn-sm {% if not s.minutes %}btn-secondary disabled{% else %}btn-primary{% endif %}"
{% if s.minutes %}href="{{ s.minutes.get_absolute_url }}"{% endif %}>
Minutes

View file

@ -40,8 +40,10 @@
<p class="alert {% if passes_checks %}alert-success{% else %}alert-warning{% endif %} my-3">
{% if passes_checks %}
Your Internet-Draft has been verified to pass the submission checks.
{% elif applied_any_checks %}
Your Internet-Draft failed at least one submission check.
{% else %}
Your Internet-Draft has <b>NOT</b> been verified to pass the submission checks.
No submission checks were applied to your Internet-Draft.
{% endif %}
</p>
{% if submission.authors|length > 5 %}
@ -70,41 +72,39 @@
{% endif %}
{% endfor %}
{% for check in submission.latest_checks %}
{% if check.passed != None %}
<button class="btn btn-{% if check.passed %}{% if check.warnings %}warning{% elif check.errors %}danger{% else %}success{% endif %}{% else %}danger{% endif %}"
type="button"
data-bs-toggle="modal"
data-bs-target="#check-{{ check.pk }}">
View {{ check.checker }}
</button>
<div class="modal fade"
id="check-{{ check.pk }}"
tabindex="-1"
role="dialog"
aria-labelledby="check-{{ check.pk }}"
aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-xl">
<div class="modal-content">
<div class="modal-header">
<p class="h5 modal-title" id="{{ check.checker|slugify }}-label">
{{ check.checker|title }} for {{ submission.name }}-{{ submission.rev }}
</p>
<button type="button"
class="btn-close"
data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body" id="{{ check.checker|slugify }}-message">
<pre>{{ check.message|urlize_ietf_docs|linkify }}</pre>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
<button class="btn btn-{% if check.passed %}{% if check.warnings %}warning{% elif check.errors %}danger{% else %}success{% endif %}{% else %}danger{% endif %}"
type="button"
data-bs-toggle="modal"
data-bs-target="#check-{{ check.pk }}">
View {{ check.checker }}
</button>
<div class="modal fade"
id="check-{{ check.pk }}"
tabindex="-1"
role="dialog"
aria-labelledby="check-{{ check.pk }}"
aria-hidden="true">
<div class="modal-dialog modal-dialog-scrollable modal-xl">
<div class="modal-content">
<div class="modal-header">
<p class="h5 modal-title" id="{{ check.checker|slugify }}-label">
{{ check.checker|title }} for {{ submission.name }}-{{ submission.rev }}
</p>
<button type="button"
class="btn-close"
data-bs-dismiss="modal"
aria-label="Close"></button>
</div>
<div class="modal-body" id="{{ check.checker|slugify }}-message">
<pre>{{ check.message|urlize_ietf_docs|linkify }}</pre>
</div>
<div class="modal-footer">
<button type="button" class="btn btn-secondary" data-bs-dismiss="modal">Close</button>
</div>
</div>
</div>
{% endif %}
{% endfor %}
</div>
{% endfor %}
{% endif %}
<div class="modal fade"
id="twopages"
@ -152,9 +152,13 @@
{% endwith %}
Please contact the secretariat for assistance if it has been more than an hour.
</div>
{% else %}
{% else %}
<h2 class="mt-5">Meta-data from the submission</h2>
{% if errors %}
{% if submission.state.slug == "cancel" %}
<div class="alert alert-warning my-3">
<b>Note:</b> The meta-data shown for a cancelled draft may be incorrect or incomplete.
</div>
{% elif errors %}
<div class="alert alert-danger my-3">
<p>
<b>Meta-Data errors found!</b>

View file

@ -31,7 +31,7 @@
"list.js": "2.3.1",
"lodash": "4.17.21",
"lodash-es": "4.17.21",
"luxon": "3.3.0",
"luxon": "3.4.0",
"moment": "2.29.4",
"moment-timezone": "0.5.43",
"ms": "2.1.3",
@ -45,7 +45,7 @@
"shepherd.js": "11.1.1",
"slugify": "1.6.6",
"sortablejs": "1.15.0",
"vanillajs-datepicker": "1.3.3",
"vanillajs-datepicker": "1.3.4",
"vue": "3.3.4",
"vue-router": "4.2.4",
"zxcvbn": "4.4.2"
@ -54,23 +54,23 @@
"@parcel/optimizer-data-url": "2.9.3",
"@parcel/transformer-inline-string": "2.9.3",
"@parcel/transformer-sass": "2.9.3",
"@rollup/pluginutils": "5.0.2",
"@vitejs/plugin-vue": "4.2.3",
"@rollup/pluginutils": "5.0.3",
"@vitejs/plugin-vue": "4.3.3",
"browserlist": "latest",
"c8": "8.0.1",
"eslint": "8.45.0",
"eslint": "8.47.0",
"eslint-config-standard": "17.1.0",
"eslint-plugin-cypress": "2.13.3",
"eslint-plugin-import": "2.28.0",
"eslint-plugin-cypress": "2.14.0",
"eslint-plugin-import": "2.28.1",
"eslint-plugin-n": "16.0.1",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
"eslint-plugin-vue": "9.16.1",
"html-validate": "8.1.0",
"eslint-plugin-vue": "9.17.0",
"html-validate": "8.2.0",
"jquery-migrate": "3.4.1",
"parcel": "2.9.3",
"pug": "3.0.2",
"sass": "1.64.1",
"sass": "1.66.1",
"seedrandom": "3.0.5",
"vite": "4.4.9"
},

View file

@ -9,16 +9,16 @@
"@faker-js/faker": "8.0.2",
"lodash": "4.17.21",
"lodash-es": "4.17.21",
"luxon": "3.3.0",
"luxon": "3.4.0",
"ms": "2.1.3",
"seedrandom": "3.0.5",
"slugify": "1.6.6"
},
"devDependencies": {
"@playwright/test": "1.36.1",
"eslint": "8.45.0",
"@playwright/test": "1.37.1",
"eslint": "8.47.0",
"eslint-config-standard": "17.1.0",
"eslint-plugin-import": "2.28.0",
"eslint-plugin-import": "2.28.1",
"eslint-plugin-n": "16.0.1",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
@ -60,18 +60,18 @@
}
},
"node_modules/@eslint-community/regexpp": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
"integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz",
"integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==",
"dev": true,
"engines": {
"node": "^12.0.0 || ^14.0.0 || >=16.0.0"
}
},
"node_modules/@eslint/eslintrc": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz",
"integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
"integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
"dev": true,
"dependencies": {
"ajv": "^6.12.4",
@ -92,9 +92,9 @@
}
},
"node_modules/@eslint/js": {
"version": "8.44.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
"integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz",
"integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==",
"dev": true,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -399,13 +399,13 @@
}
},
"node_modules/@playwright/test": {
"version": "1.36.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.36.1.tgz",
"integrity": "sha512-YK7yGWK0N3C2QInPU6iaf/L3N95dlGdbsezLya4n0ZCh3IL7VgPGxC6Gnznh9ApWdOmkJeleT2kMTcWPRZvzqg==",
"version": "1.37.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz",
"integrity": "sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==",
"dev": true,
"dependencies": {
"@types/node": "*",
"playwright-core": "1.36.1"
"playwright-core": "1.37.1"
},
"bin": {
"playwright": "cli.js"
@ -1587,27 +1587,27 @@
}
},
"node_modules/eslint": {
"version": "8.45.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
"integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
"version": "8.47.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz",
"integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==",
"dev": true,
"dependencies": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.4.0",
"@eslint/eslintrc": "^2.1.0",
"@eslint/js": "8.44.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.2",
"@eslint/js": "^8.47.0",
"@humanwhocodes/config-array": "^0.11.10",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"ajv": "^6.10.0",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.2.0",
"eslint-visitor-keys": "^3.4.1",
"espree": "^9.6.0",
"eslint-scope": "^7.2.2",
"eslint-visitor-keys": "^3.4.3",
"espree": "^9.6.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
@ -1735,9 +1735,9 @@
}
},
"node_modules/eslint-plugin-import": {
"version": "2.28.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz",
"integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==",
"version": "2.28.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz",
"integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==",
"dev": true,
"dependencies": {
"array-includes": "^3.1.6",
@ -1749,13 +1749,12 @@
"eslint-import-resolver-node": "^0.3.7",
"eslint-module-utils": "^2.8.0",
"has": "^1.0.3",
"is-core-module": "^2.12.1",
"is-core-module": "^2.13.0",
"is-glob": "^4.0.3",
"minimatch": "^3.1.2",
"object.fromentries": "^2.0.6",
"object.groupby": "^1.0.0",
"object.values": "^1.1.6",
"resolve": "^1.22.3",
"semver": "^6.3.1",
"tsconfig-paths": "^3.14.2"
},
@ -1906,9 +1905,9 @@
}
},
"node_modules/eslint-scope": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
"integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
"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",
@ -1922,9 +1921,9 @@
}
},
"node_modules/eslint-visitor-keys": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
"integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
"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,
"engines": {
"node": "^12.22.0 || ^14.17.0 || >=16.0.0"
@ -2369,9 +2368,9 @@
}
},
"node_modules/globals": {
"version": "13.20.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
"integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
"version": "13.21.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
"integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
"dev": true,
"dependencies": {
"type-fest": "^0.20.2"
@ -3310,9 +3309,9 @@
}
},
"node_modules/luxon": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz",
"integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg==",
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz",
"integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw==",
"engines": {
"node": ">=12"
}
@ -4289,9 +4288,9 @@
}
},
"node_modules/playwright-core": {
"version": "1.36.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.36.1.tgz",
"integrity": "sha512-7+tmPuMcEW4xeCL9cp9KxmYpQYHKkyjwoXRnoeTowaeNat8PoBMk/HwCYhqkH2fRkshfKEOiVus/IhID2Pg8kg==",
"version": "1.37.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.1.tgz",
"integrity": "sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==",
"dev": true,
"bin": {
"playwright-core": "cli.js"
@ -5744,15 +5743,15 @@
}
},
"@eslint-community/regexpp": {
"version": "4.5.1",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.5.1.tgz",
"integrity": "sha512-Z5ba73P98O1KUYCCJTUeVpja9RcGoMdncZ6T49FCUl2lN38JtCJ+3WgIDBv0AuY4WChU5PmtJmOCTlN6FZTFKQ==",
"version": "4.8.0",
"resolved": "https://registry.npmjs.org/@eslint-community/regexpp/-/regexpp-4.8.0.tgz",
"integrity": "sha512-JylOEEzDiOryeUnFbQz+oViCXS0KsvR1mvHkoMiu5+UiBvy+RYX7tzlIIIEstF/gVa2tj9AQXk3dgnxv6KxhFg==",
"dev": true
},
"@eslint/eslintrc": {
"version": "2.1.1",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.1.tgz",
"integrity": "sha512-9t7ZA7NGGK8ckelF0PQCfcxIUzs1Md5rrO6U/c+FIQNanea5UZC0wqKXH4vHBccmu4ZJgZ2idtPeW7+Q2npOEA==",
"version": "2.1.2",
"resolved": "https://registry.npmjs.org/@eslint/eslintrc/-/eslintrc-2.1.2.tgz",
"integrity": "sha512-+wvgpDsrB1YqAMdEUCcnTlpfVBH7Vqn6A/NT3D8WVXFIaKMlErPIZT3oCIAVCOtarRpMtelZLqJeU3t7WY6X6g==",
"dev": true,
"requires": {
"ajv": "^6.12.4",
@ -5767,9 +5766,9 @@
}
},
"@eslint/js": {
"version": "8.44.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.44.0.tgz",
"integrity": "sha512-Ag+9YM4ocKQx9AarydN0KY2j0ErMHNIocPDrVo8zAE44xLTjEtz81OdR68/cydGtk6m6jDb5Za3r2useMzYmSw==",
"version": "8.48.0",
"resolved": "https://registry.npmjs.org/@eslint/js/-/js-8.48.0.tgz",
"integrity": "sha512-ZSjtmelB7IJfWD2Fvb7+Z+ChTIKWq6kjda95fLcQKNS5aheVHn4IkfgRQE3sIIzTcSLwLcLZUD9UBt+V7+h+Pw==",
"dev": true
},
"@faker-js/faker": {
@ -5984,14 +5983,14 @@
"optional": true
},
"@playwright/test": {
"version": "1.36.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.36.1.tgz",
"integrity": "sha512-YK7yGWK0N3C2QInPU6iaf/L3N95dlGdbsezLya4n0ZCh3IL7VgPGxC6Gnznh9ApWdOmkJeleT2kMTcWPRZvzqg==",
"version": "1.37.1",
"resolved": "https://registry.npmjs.org/@playwright/test/-/test-1.37.1.tgz",
"integrity": "sha512-bq9zTli3vWJo8S3LwB91U0qDNQDpEXnw7knhxLM0nwDvexQAwx9tO8iKDZSqqneVq+URd/WIoz+BALMqUTgdSg==",
"dev": true,
"requires": {
"@types/node": "*",
"fsevents": "2.3.2",
"playwright-core": "1.36.1"
"playwright-core": "1.37.1"
}
},
"@pnpm/network.ca-file": {
@ -6859,27 +6858,27 @@
"dev": true
},
"eslint": {
"version": "8.45.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.45.0.tgz",
"integrity": "sha512-pd8KSxiQpdYRfYa9Wufvdoct3ZPQQuVuU5O6scNgMuOMYuxvH0IGaYK0wUFjo4UYYQQCUndlXiMbnxopwvvTiw==",
"version": "8.47.0",
"resolved": "https://registry.npmjs.org/eslint/-/eslint-8.47.0.tgz",
"integrity": "sha512-spUQWrdPt+pRVP1TTJLmfRNJJHHZryFmptzcafwSvHsceV81djHOdnEeDmkdotZyLNjDhrOasNK8nikkoG1O8Q==",
"dev": true,
"requires": {
"@eslint-community/eslint-utils": "^4.2.0",
"@eslint-community/regexpp": "^4.4.0",
"@eslint/eslintrc": "^2.1.0",
"@eslint/js": "8.44.0",
"@eslint-community/regexpp": "^4.6.1",
"@eslint/eslintrc": "^2.1.2",
"@eslint/js": "^8.47.0",
"@humanwhocodes/config-array": "^0.11.10",
"@humanwhocodes/module-importer": "^1.0.1",
"@nodelib/fs.walk": "^1.2.8",
"ajv": "^6.10.0",
"ajv": "^6.12.4",
"chalk": "^4.0.0",
"cross-spawn": "^7.0.2",
"debug": "^4.3.2",
"doctrine": "^3.0.0",
"escape-string-regexp": "^4.0.0",
"eslint-scope": "^7.2.0",
"eslint-visitor-keys": "^3.4.1",
"espree": "^9.6.0",
"eslint-scope": "^7.2.2",
"eslint-visitor-keys": "^3.4.3",
"espree": "^9.6.1",
"esquery": "^1.4.2",
"esutils": "^2.0.2",
"fast-deep-equal": "^3.1.3",
@ -6963,9 +6962,9 @@
}
},
"eslint-plugin-import": {
"version": "2.28.0",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.0.tgz",
"integrity": "sha512-B8s/n+ZluN7sxj9eUf7/pRFERX0r5bnFA2dCaLHy2ZeaQEAz0k+ZZkFWRFHJAqxfxQDx6KLv9LeIki7cFdwW+Q==",
"version": "2.28.1",
"resolved": "https://registry.npmjs.org/eslint-plugin-import/-/eslint-plugin-import-2.28.1.tgz",
"integrity": "sha512-9I9hFlITvOV55alzoKBI+K9q74kv0iKMeY6av5+umsNwayt59fz692daGyjR+oStBQgx6nwR9rXldDev3Clw+A==",
"dev": true,
"requires": {
"array-includes": "^3.1.6",
@ -6977,13 +6976,12 @@
"eslint-import-resolver-node": "^0.3.7",
"eslint-module-utils": "^2.8.0",
"has": "^1.0.3",
"is-core-module": "^2.12.1",
"is-core-module": "^2.13.0",
"is-glob": "^4.0.3",
"minimatch": "^3.1.2",
"object.fromentries": "^2.0.6",
"object.groupby": "^1.0.0",
"object.values": "^1.1.6",
"resolve": "^1.22.3",
"semver": "^6.3.1",
"tsconfig-paths": "^3.14.2"
},
@ -7085,9 +7083,9 @@
"requires": {}
},
"eslint-scope": {
"version": "7.2.0",
"resolved": "https://registry.npmjs.org/eslint-scope/-/eslint-scope-7.2.0.tgz",
"integrity": "sha512-DYj5deGlHBfMt15J7rdtyKNq/Nqlv5KfU4iodrQ019XESsRnwXH9KAE0y3cwtUHDo2ob7CypAnCqefh6vioWRw==",
"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,
"requires": {
"esrecurse": "^4.3.0",
@ -7095,9 +7093,9 @@
}
},
"eslint-visitor-keys": {
"version": "3.4.1",
"resolved": "https://registry.npmjs.org/eslint-visitor-keys/-/eslint-visitor-keys-3.4.1.tgz",
"integrity": "sha512-pZnmmLwYzf+kWaM/Qgrvpen51upAktaaiI01nsJD/Yr3lMOdNtq0cxkrrg16w64VtisN6okbs7Q8AfGqj4c9fA==",
"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
},
"espree": {
@ -7424,9 +7422,9 @@
}
},
"globals": {
"version": "13.20.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.20.0.tgz",
"integrity": "sha512-Qg5QtVkCy/kv3FUSlu4ukeZDVf9ee0iXLAUYX13gbR17bnejFTzr4iS9bY7kwCf1NztRNm1t91fjOiyx4CSwPQ==",
"version": "13.21.0",
"resolved": "https://registry.npmjs.org/globals/-/globals-13.21.0.tgz",
"integrity": "sha512-ybyme3s4yy/t/3s35bewwXKOf7cvzfreG2lH0lZl0JB7I4GxRP2ghxOK/Nb9EkRXdbBXZLfq/p/0W2JUONB/Gg==",
"dev": true,
"requires": {
"type-fest": "^0.20.2"
@ -8103,9 +8101,9 @@
}
},
"luxon": {
"version": "3.3.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.3.0.tgz",
"integrity": "sha512-An0UCfG/rSiqtAIiBPO0Y9/zAnHUZxAMiCpTd5h2smgsj7GGmcenvrvww2cqNA8/4A5ZrD1gJpHN2mIHZQF+Mg=="
"version": "3.4.0",
"resolved": "https://registry.npmjs.org/luxon/-/luxon-3.4.0.tgz",
"integrity": "sha512-7eDo4Pt7aGhoCheGFIuq4Xa2fJm4ZpmldpGhjTYBNUYNCN6TIEP6v7chwwwt3KRp7YR+rghbfvjyo3V5y9hgBw=="
},
"make-fetch-happen": {
"version": "11.1.1",
@ -8828,9 +8826,9 @@
"dev": true
},
"playwright-core": {
"version": "1.36.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.36.1.tgz",
"integrity": "sha512-7+tmPuMcEW4xeCL9cp9KxmYpQYHKkyjwoXRnoeTowaeNat8PoBMk/HwCYhqkH2fRkshfKEOiVus/IhID2Pg8kg==",
"version": "1.37.1",
"resolved": "https://registry.npmjs.org/playwright-core/-/playwright-core-1.37.1.tgz",
"integrity": "sha512-17EuQxlSIYCmEMwzMqusJ2ztDgJePjrbttaefgdsiqeLWidjYz9BxXaTaZWxH1J95SHGk6tjE+dwgWILJoUZfA==",
"dev": true
},
"prelude-ls": {

View file

@ -7,10 +7,10 @@
"test:debug": "playwright test --debug"
},
"devDependencies": {
"@playwright/test": "1.36.1",
"eslint": "8.45.0",
"@playwright/test": "1.37.1",
"eslint": "8.47.0",
"eslint-config-standard": "17.1.0",
"eslint-plugin-import": "2.28.0",
"eslint-plugin-import": "2.28.1",
"eslint-plugin-n": "16.0.1",
"eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1",
@ -20,7 +20,7 @@
"@faker-js/faker": "8.0.2",
"lodash": "4.17.21",
"lodash-es": "4.17.21",
"luxon": "3.3.0",
"luxon": "3.4.0",
"ms": "2.1.3",
"seedrandom": "3.0.5",
"slugify": "1.6.6"

204
yarn.lock
View file

@ -264,13 +264,6 @@ __metadata:
languageName: node
linkType: hard
"@eslint-community/regexpp@npm:^4.4.0":
version: 4.4.1
resolution: "@eslint-community/regexpp@npm:4.4.1"
checksum: db97d8d08e784147b55ab0dda5892503c1a0eebad94d1c4646d89a94f02ca70b25f05d8e021fc05a075e7eb312e03e21f63d84f0b327719f8cf3bb64e66917cb
languageName: node
linkType: hard
"@eslint-community/regexpp@npm:^4.5.0":
version: 4.5.1
resolution: "@eslint-community/regexpp@npm:4.5.1"
@ -278,7 +271,14 @@ __metadata:
languageName: node
linkType: hard
"@eslint/eslintrc@npm:^2.1.0":
"@eslint-community/regexpp@npm:^4.6.1":
version: 4.8.0
resolution: "@eslint-community/regexpp@npm:4.8.0"
checksum: 601e6d033d556e98e8c929905bef335f20d7389762812df4d0f709d9b4d2631610dda975fb272e23b5b68e24a163b3851b114c8080a0a19fb4c141a1eff6305b
languageName: node
linkType: hard
"@eslint/eslintrc@npm:^2.1.2":
version: 2.1.2
resolution: "@eslint/eslintrc@npm:2.1.2"
dependencies:
@ -295,10 +295,10 @@ __metadata:
languageName: node
linkType: hard
"@eslint/js@npm:8.44.0":
version: 8.44.0
resolution: "@eslint/js@npm:8.44.0"
checksum: fc539583226a28f5677356e9f00d2789c34253f076643d2e32888250e509a4e13aafe0880cb2425139051de0f3a48d25bfc5afa96b7304f203b706c17340e3cf
"@eslint/js@npm:^8.47.0":
version: 8.48.0
resolution: "@eslint/js@npm:8.48.0"
checksum: b2755f9c0ee810c886eba3c50dcacb184ba5a5cd1cbc01988ee506ad7340653cae0bd55f1d95c64b56dfc6d25c2caa7825335ffd2c50165bae9996fe0f396851
languageName: node
linkType: hard
@ -1730,9 +1730,9 @@ __metadata:
languageName: node
linkType: hard
"@rollup/pluginutils@npm:5.0.2":
version: 5.0.2
resolution: "@rollup/pluginutils@npm:5.0.2"
"@rollup/pluginutils@npm:5.0.3":
version: 5.0.3
resolution: "@rollup/pluginutils@npm:5.0.3"
dependencies:
"@types/estree": ^1.0.0
estree-walker: ^2.0.2
@ -1742,7 +1742,7 @@ __metadata:
peerDependenciesMeta:
rollup:
optional: true
checksum: edea15e543bebc7dcac3b0ac8bc7b8e8e6dbd46e2864dbe5dd28072de1fbd5b0e10d545a610c0edaa178e8a7ac432e2a2a52e547ece1308471412caba47db8ce
checksum: 8efbdeac53c58ba7b26c353a0a95acb0286cb6afec9816e0c52c3537404be80af11d897f78416a3339a8a76cbce8600269bdf4853edfdebcc89b2e90c56bf3d9
languageName: node
linkType: hard
@ -1960,13 +1960,13 @@ __metadata:
languageName: node
linkType: hard
"@vitejs/plugin-vue@npm:4.2.3":
version: 4.2.3
resolution: "@vitejs/plugin-vue@npm:4.2.3"
"@vitejs/plugin-vue@npm:4.3.3":
version: 4.3.3
resolution: "@vitejs/plugin-vue@npm:4.3.3"
peerDependencies:
vite: ^4.0.0
vue: ^3.2.25
checksum: 1c70c1cd18f6ba3ed6cdf1391a0d441dd8e9a89c728f7eb20d74c84e75fef1fdc651836cce9bf59a8a48e5b2caebf6ca60a908fdd8527a476a750afd2b458592
checksum: 17f8d737085a7f0e65cdc5347b44d844980b84775e884e7432e623644c3bb5916703139967743c94b70e3db57689d2d2511850cd4adeb9886075fd49fef7124d
languageName: node
linkType: hard
@ -2169,7 +2169,7 @@ __metadata:
languageName: node
linkType: hard
"ajv@npm:^6.10.0, ajv@npm:^6.12.4":
"ajv@npm:^6.12.4":
version: 6.12.6
resolution: "ajv@npm:6.12.6"
dependencies:
@ -3740,14 +3740,14 @@ browserlist@latest:
languageName: node
linkType: hard
"eslint-plugin-cypress@npm:2.13.3":
version: 2.13.3
resolution: "eslint-plugin-cypress@npm:2.13.3"
"eslint-plugin-cypress@npm:2.14.0":
version: 2.14.0
resolution: "eslint-plugin-cypress@npm:2.14.0"
dependencies:
globals: ^11.12.0
globals: ^13.20.0
peerDependencies:
eslint: ">= 3.2.1"
checksum: 9affbcee29e030a4251c4794f7533e8e8c0e3b98ab3470a2c730ed059f733c5857a04c7ac214cc0ca7aeef1b11242e72595de7fc1f6b8b4d4578d9eca10af203
checksum: 3fa118a757aebb1aa6b419b2944744796aa4fa3cc1e2e19fa97777fd6792fba12b5ae117bf19bf7e7d9a1abdd48398cfba9ca6f2c62fd690a2108a9a02f3f2ae
languageName: node
linkType: hard
@ -3787,9 +3787,9 @@ browserlist@latest:
languageName: node
linkType: hard
"eslint-plugin-import@npm:2.28.0":
version: 2.28.0
resolution: "eslint-plugin-import@npm:2.28.0"
"eslint-plugin-import@npm:2.28.1":
version: 2.28.1
resolution: "eslint-plugin-import@npm:2.28.1"
dependencies:
array-includes: ^3.1.6
array.prototype.findlastindex: ^1.2.2
@ -3800,18 +3800,17 @@ browserlist@latest:
eslint-import-resolver-node: ^0.3.7
eslint-module-utils: ^2.8.0
has: ^1.0.3
is-core-module: ^2.12.1
is-core-module: ^2.13.0
is-glob: ^4.0.3
minimatch: ^3.1.2
object.fromentries: ^2.0.6
object.groupby: ^1.0.0
object.values: ^1.1.6
resolve: ^1.22.3
semver: ^6.3.1
tsconfig-paths: ^3.14.2
peerDependencies:
eslint: ^2 || ^3 || ^4 || ^5 || ^6 || ^7.2.0 || ^8
checksum: f9eba311b93ca1bb89311856b1f7285bd79e0181d7eb70fe115053ff77e2235fea749b30f538b78927dc65769340b5be61f4c9581d1c82bcdcccb2061f440ad1
checksum: e8ae6dd8f06d8adf685f9c1cfd46ac9e053e344a05c4090767e83b63a85c8421ada389807a39e73c643b9bff156715c122e89778169110ed68d6428e12607edf
languageName: node
linkType: hard
@ -3876,9 +3875,9 @@ browserlist@latest:
languageName: node
linkType: hard
"eslint-plugin-vue@npm:9.16.1":
version: 9.16.1
resolution: "eslint-plugin-vue@npm:9.16.1"
"eslint-plugin-vue@npm:9.17.0":
version: 9.17.0
resolution: "eslint-plugin-vue@npm:9.17.0"
dependencies:
"@eslint-community/eslint-utils": ^4.4.0
natural-compare: ^1.4.0
@ -3889,7 +3888,7 @@ browserlist@latest:
xml-name-validator: ^4.0.0
peerDependencies:
eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
checksum: b2f9d0deefb124faacbd1aaf3f593962cd13547f8816782987299cb089693cec5e6e4036227242ad1dc17b6772fb579bc2042942486017a00c3c05eefeea36bd
checksum: 2ef53a03876f7c96828ad10dae7d1c4d87b51e348f58b16de3f2bedbbff9a3410eabfaf65e4890b0b7ae6d1e710c1c370998d5bc64d6ca3095a95713b3a4cf67
languageName: node
linkType: hard
@ -3903,13 +3902,13 @@ browserlist@latest:
languageName: node
linkType: hard
"eslint-scope@npm:^7.2.0":
version: 7.2.0
resolution: "eslint-scope@npm:7.2.0"
"eslint-scope@npm:^7.2.2":
version: 7.2.2
resolution: "eslint-scope@npm:7.2.2"
dependencies:
esrecurse: ^4.3.0
estraverse: ^5.2.0
checksum: 64591a2d8b244ade9c690b59ef238a11d5c721a98bcee9e9f445454f442d03d3e04eda88e95a4daec558220a99fa384309d9faae3d459bd40e7a81b4063980ae
checksum: ec97dbf5fb04b94e8f4c5a91a7f0a6dd3c55e46bfc7bbcd0e3138c3a76977570e02ed89a1810c778dcd72072ff0e9621ba1379b4babe53921d71e2e4486fda3e
languageName: node
linkType: hard
@ -3961,26 +3960,33 @@ browserlist@latest:
languageName: node
linkType: hard
"eslint@npm:8.45.0":
version: 8.45.0
resolution: "eslint@npm:8.45.0"
"eslint-visitor-keys@npm:^3.4.3":
version: 3.4.3
resolution: "eslint-visitor-keys@npm:3.4.3"
checksum: 36e9ef87fca698b6fd7ca5ca35d7b2b6eeaaf106572e2f7fd31c12d3bfdaccdb587bba6d3621067e5aece31c8c3a348b93922ab8f7b2cbc6aaab5e1d89040c60
languageName: node
linkType: hard
"eslint@npm:8.47.0":
version: 8.47.0
resolution: "eslint@npm:8.47.0"
dependencies:
"@eslint-community/eslint-utils": ^4.2.0
"@eslint-community/regexpp": ^4.4.0
"@eslint/eslintrc": ^2.1.0
"@eslint/js": 8.44.0
"@eslint-community/regexpp": ^4.6.1
"@eslint/eslintrc": ^2.1.2
"@eslint/js": ^8.47.0
"@humanwhocodes/config-array": ^0.11.10
"@humanwhocodes/module-importer": ^1.0.1
"@nodelib/fs.walk": ^1.2.8
ajv: ^6.10.0
ajv: ^6.12.4
chalk: ^4.0.0
cross-spawn: ^7.0.2
debug: ^4.3.2
doctrine: ^3.0.0
escape-string-regexp: ^4.0.0
eslint-scope: ^7.2.0
eslint-visitor-keys: ^3.4.1
espree: ^9.6.0
eslint-scope: ^7.2.2
eslint-visitor-keys: ^3.4.3
espree: ^9.6.1
esquery: ^1.4.2
esutils: ^2.0.2
fast-deep-equal: ^3.1.3
@ -4004,7 +4010,7 @@ browserlist@latest:
text-table: ^0.2.0
bin:
eslint: bin/eslint.js
checksum: 3e6dcce5cc43c5e301662db88ee26d1d188b22c177b9f104d7eefd1191236980bd953b3670fe2fac287114b26d7c5420ab48407d7ea1c3a446d6313c000009da
checksum: 1988617f703eadc5c7540468d54dc8e5171cf2bb9483f6172799cd1ff54a9a5e4470f003784e8cef92687eaa14de37172732787040e67817581a20bcb9c15970
languageName: node
linkType: hard
@ -4019,7 +4025,7 @@ browserlist@latest:
languageName: node
linkType: hard
"espree@npm:^9.6.0":
"espree@npm:^9.6.0, espree@npm:^9.6.1":
version: 9.6.1
resolution: "espree@npm:9.6.1"
dependencies:
@ -4412,13 +4418,6 @@ browserlist@latest:
languageName: node
linkType: hard
"globals@npm:^11.12.0":
version: 11.12.0
resolution: "globals@npm:11.12.0"
checksum: 67051a45eca3db904aee189dfc7cd53c20c7d881679c93f6146ddd4c9f4ab2268e68a919df740d39c71f4445d2b38ee360fc234428baea1dbdfe68bbcb46979e
languageName: node
linkType: hard
"globals@npm:^13.19.0":
version: 13.19.0
resolution: "globals@npm:13.19.0"
@ -4437,6 +4436,15 @@ browserlist@latest:
languageName: node
linkType: hard
"globals@npm:^13.20.0":
version: 13.21.0
resolution: "globals@npm:13.21.0"
dependencies:
type-fest: ^0.20.2
checksum: 86c92ca8a04efd864c10852cd9abb1ebe6d447dcc72936783e66eaba1087d7dba5c9c3421a48d6ca722c319378754dbcc3f3f732dbe47592d7de908edf58a773
languageName: node
linkType: hard
"globalthis@npm:^1.0.3":
version: 1.0.3
resolution: "globalthis@npm:1.0.3"
@ -4559,9 +4567,9 @@ browserlist@latest:
languageName: node
linkType: hard
"html-validate@npm:8.1.0":
version: 8.1.0
resolution: "html-validate@npm:8.1.0"
"html-validate@npm:8.2.0":
version: 8.2.0
resolution: "html-validate@npm:8.2.0"
dependencies:
"@babel/code-frame": ^7.10.0
"@html-validate/stylish": ^4.1.0
@ -4587,7 +4595,7 @@ browserlist@latest:
optional: true
bin:
html-validate: bin/html-validate.js
checksum: 179443c0bd5f76e0e98a3c5f9bea022bfe20ed17358506dc2cdcb907e2fc26684d7d1ff1ed495283473354c233d209a80b36ec0ce2f633c35603ecc88126cc9a
checksum: 793287a4549d9c12692a19b8e5e8de64f745c99300c698488c97ec46cee12261fa27e7ea4e3aa951d42a13642fe74aa63b21b2c5ec3faeee41e0aad92857b255
languageName: node
linkType: hard
@ -5509,10 +5517,10 @@ browserlist@latest:
languageName: node
linkType: hard
"luxon@npm:3.3.0":
version: 3.3.0
resolution: "luxon@npm:3.3.0"
checksum: 50cf17a0dc155c3dcacbeae8c0b7e80db425e0ba97b9cbdf12a7fc142d841ff1ab1560919f033af46240ed44e2f70c49f76e3422524c7fc8bb8d81ca47c66187
"luxon@npm:3.4.0":
version: 3.4.0
resolution: "luxon@npm:3.4.0"
checksum: ca9b6d0e0a8d156574b7e84014ac8e4b60d116d6d7a0fb65ef48eeb8e4415dad6350b76c5ee34f795cadf8b3f9a5fe7a6885733f561e554c50dffb0b704a840b
languageName: node
linkType: hard
@ -6736,19 +6744,6 @@ browserlist@latest:
languageName: node
linkType: hard
"resolve@npm:^1.22.3":
version: 1.22.4
resolution: "resolve@npm:1.22.4"
dependencies:
is-core-module: ^2.13.0
path-parse: ^1.0.7
supports-preserve-symlinks-flag: ^1.0.0
bin:
resolve: bin/resolve
checksum: 23f25174c2736ce24c6d918910e0d1f89b6b38fefa07a995dff864acd7863d59a7f049e691f93b4b2ee29696303390d921552b6d1b841ed4a8101f517e1d0124
languageName: node
linkType: hard
"resolve@patch:resolve@^1.10.1#~builtin<compat/resolve>, resolve@patch:resolve@^1.15.1#~builtin<compat/resolve>":
version: 1.22.0
resolution: "resolve@patch:resolve@npm%3A1.22.0#~builtin<compat/resolve>::version=1.22.0&hash=07638b"
@ -6788,19 +6783,6 @@ browserlist@latest:
languageName: node
linkType: hard
"resolve@patch:resolve@^1.22.3#~builtin<compat/resolve>":
version: 1.22.4
resolution: "resolve@patch:resolve@npm%3A1.22.4#~builtin<compat/resolve>::version=1.22.4&hash=07638b"
dependencies:
is-core-module: ^2.13.0
path-parse: ^1.0.7
supports-preserve-symlinks-flag: ^1.0.0
bin:
resolve: bin/resolve
checksum: c45f2545fdc4d21883861b032789e20aa67a2f2692f68da320cc84d5724cd02f2923766c5354b3210897e88f1a7b3d6d2c7c22faeead8eed7078e4c783a444bc
languageName: node
linkType: hard
"retry@npm:^0.12.0":
version: 0.12.0
resolution: "retry@npm:0.12.0"
@ -6864,9 +6846,9 @@ browserlist@latest:
"@parcel/transformer-inline-string": 2.9.3
"@parcel/transformer-sass": 2.9.3
"@popperjs/core": 2.11.8
"@rollup/pluginutils": 5.0.2
"@rollup/pluginutils": 5.0.3
"@twuni/emojify": 1.0.2
"@vitejs/plugin-vue": 4.2.3
"@vitejs/plugin-vue": 4.3.3
bootstrap: 5.3.0
bootstrap-icons: 1.10.5
browser-fs-access: 0.34.1
@ -6874,17 +6856,17 @@ browserlist@latest:
c8: 8.0.1
caniuse-lite: 1.0.30001519
d3: 7.8.5
eslint: 8.45.0
eslint: 8.47.0
eslint-config-standard: 17.1.0
eslint-plugin-cypress: 2.13.3
eslint-plugin-import: 2.28.0
eslint-plugin-cypress: 2.14.0
eslint-plugin-import: 2.28.1
eslint-plugin-n: 16.0.1
eslint-plugin-node: 11.1.0
eslint-plugin-promise: 6.1.1
eslint-plugin-vue: 9.16.1
eslint-plugin-vue: 9.17.0
file-saver: 2.0.5
highcharts: 11.1.0
html-validate: 8.1.0
html-validate: 8.2.0
ical.js: 1.5.0
jquery: 3.7.0
jquery-migrate: 3.4.1
@ -6892,7 +6874,7 @@ browserlist@latest:
list.js: 2.3.1
lodash: 4.17.21
lodash-es: 4.17.21
luxon: 3.3.0
luxon: 3.4.0
moment: 2.29.4
moment-timezone: 0.5.43
ms: 2.1.3
@ -6902,7 +6884,7 @@ browserlist@latest:
pinia: 2.1.6
pinia-plugin-persist: 1.0.0
pug: 3.0.2
sass: 1.64.1
sass: 1.66.1
seedrandom: 3.0.5
select2: 4.1.0-rc.0
select2-bootstrap-5-theme: 1.3.0
@ -6910,7 +6892,7 @@ browserlist@latest:
shepherd.js: 11.1.1
slugify: 1.6.6
sortablejs: 1.15.0
vanillajs-datepicker: 1.3.3
vanillajs-datepicker: 1.3.4
vite: 4.4.9
vue: 3.3.4
vue-router: 4.2.4
@ -6978,16 +6960,16 @@ browserlist@latest:
languageName: node
linkType: hard
"sass@npm:1.64.1":
version: 1.64.1
resolution: "sass@npm:1.64.1"
"sass@npm:1.66.1":
version: 1.66.1
resolution: "sass@npm:1.66.1"
dependencies:
chokidar: ">=3.0.0 <4.0.0"
immutable: ^4.0.0
source-map-js: ">=0.6.2 <2.0.0"
bin:
sass: sass.js
checksum: e908f96f3d5fa5869e2f2aec97548c93d6ef390680af89870fcae8bdbaee2392ac650fbeae8d2ef8e4c99cb9f81e6b3624e1cb659af6d6e746332a22233b5ad8
checksum: 74fc11d0fcd5e16c5331b57dd59865705a299c64e89f2b99646869caeb011dc8d0b6144a6c74a90c264e9ef70654207dbf44fc9b7e3393f8bd14809b904c8a52
languageName: node
linkType: hard
@ -7647,10 +7629,10 @@ browserlist@latest:
languageName: node
linkType: hard
"vanillajs-datepicker@npm:1.3.3":
version: 1.3.3
resolution: "vanillajs-datepicker@npm:1.3.3"
checksum: be830750a5998f2525356558331e907c7628ec57e665282909fc642680e6fda0e69ad15975b78fcf4715425109175393537d8f82aa9acee02fa0cb485ea0231c
"vanillajs-datepicker@npm:1.3.4":
version: 1.3.4
resolution: "vanillajs-datepicker@npm:1.3.4"
checksum: 830958f8af5c586ee81ba2b75a76771db425d4eddb68ec08d1b49ac898674376ef3517a0d40eefaf4926a815c23179c54e1637d7327df090f22cdb98056074cf
languageName: node
linkType: hard