ci: merge main to release (pull request #7313)

ci: merge main to release
This commit is contained in:
Robert Sparks 2024-04-10 11:46:24 -05:00 committed by GitHub
commit b528b3cfbb
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
28 changed files with 272 additions and 133 deletions

View file

@ -59,7 +59,7 @@ jobs:
path: geckodriver.log path: geckodriver.log
- name: Upload Coverage Results to Codecov - name: Upload Coverage Results to Codecov
uses: codecov/codecov-action@v4.1.0 uses: codecov/codecov-action@v4.1.1
with: with:
files: coverage.xml files: coverage.xml

77
.pnp.cjs generated
View file

@ -55,7 +55,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["browser-fs-access", "npm:0.35.0"],\ ["browser-fs-access", "npm:0.35.0"],\
["browserlist", "npm:1.0.1"],\ ["browserlist", "npm:1.0.1"],\
["c8", "npm:9.1.0"],\ ["c8", "npm:9.1.0"],\
["caniuse-lite", "npm:1.0.30001599"],\ ["caniuse-lite", "npm:1.0.30001603"],\
["d3", "npm:7.9.0"],\ ["d3", "npm:7.9.0"],\
["eslint", "npm:8.57.0"],\ ["eslint", "npm:8.57.0"],\
["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\ ["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\
@ -64,10 +64,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.6.2"],\ ["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.6.2"],\
["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\ ["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\
["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\ ["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.23.0"],\ ["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.24.0"],\
["file-saver", "npm:2.0.5"],\ ["file-saver", "npm:2.0.5"],\
["highcharts", "npm:11.4.0"],\ ["highcharts", "npm:11.4.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.16.0"],\ ["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.18.1"],\
["ical.js", "npm:1.5.0"],\ ["ical.js", "npm:1.5.0"],\
["jquery", "npm:3.7.1"],\ ["jquery", "npm:3.7.1"],\
["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\ ["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\
@ -94,7 +94,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["slugify", "npm:1.6.6"],\ ["slugify", "npm:1.6.6"],\
["sortablejs", "npm:1.15.2"],\ ["sortablejs", "npm:1.15.2"],\
["vanillajs-datepicker", "npm:1.3.4"],\ ["vanillajs-datepicker", "npm:1.3.4"],\
["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.2"],\ ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.3"],\
["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"],\ ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"],\
["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.0"],\ ["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.0"],\
["zxcvbn", "npm:4.4.2"]\ ["zxcvbn", "npm:4.4.2"]\
@ -2432,10 +2432,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\ ],\
"linkType": "SOFT"\ "linkType": "SOFT"\
}],\ }],\
["virtual:127f44ed2d4bdd83725c8820683da6ed922142e851761151ec4911dcca098a2d4d832b774a31e7abf98185d360ff83c999b319ea3314c86d38eca853072fb0d2#npm:2.1.3", {\ ["virtual:640261ed3b7a9880a388cc504caacf8ea790dd52f1cb31fbc3be445cb2adc6e73fc87097de620863105eb917510145ef2457d30000c7361456ab67ec0b895136#npm:2.1.3", {\
"packageLocation": "./.yarn/__virtual__/@sidvind-better-ajv-errors-virtual-ae7b5eb579/0/cache/@sidvind-better-ajv-errors-npm-2.1.3-e3d1c524a8-949cb805a1.zip/node_modules/@sidvind/better-ajv-errors/",\ "packageLocation": "./.yarn/__virtual__/@sidvind-better-ajv-errors-virtual-ff98ba00e3/0/cache/@sidvind-better-ajv-errors-npm-2.1.3-e3d1c524a8-949cb805a1.zip/node_modules/@sidvind/better-ajv-errors/",\
"packageDependencies": [\ "packageDependencies": [\
["@sidvind/better-ajv-errors", "virtual:127f44ed2d4bdd83725c8820683da6ed922142e851761151ec4911dcca098a2d4d832b774a31e7abf98185d360ff83c999b319ea3314c86d38eca853072fb0d2#npm:2.1.3"],\ ["@sidvind/better-ajv-errors", "virtual:640261ed3b7a9880a388cc504caacf8ea790dd52f1cb31fbc3be445cb2adc6e73fc87097de620863105eb917510145ef2457d30000c7361456ab67ec0b895136#npm:2.1.3"],\
["@babel/code-frame", "npm:7.16.7"],\ ["@babel/code-frame", "npm:7.16.7"],\
["@types/ajv", null],\ ["@types/ajv", null],\
["ajv", "npm:8.11.0"],\ ["ajv", "npm:8.11.0"],\
@ -2710,7 +2710,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.6.2"],\ ["@vitejs/plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.6.2"],\
["@types/vite", null],\ ["@types/vite", null],\
["@types/vue", null],\ ["@types/vue", null],\
["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.2"],\ ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.3"],\
["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\ ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"]\
],\ ],\
"packagePeers": [\ "packagePeers": [\
@ -3506,10 +3506,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\ ],\
"linkType": "HARD"\ "linkType": "HARD"\
}],\ }],\
["npm:1.0.30001599", {\ ["npm:1.0.30001603", {\
"packageLocation": "./.yarn/cache/caniuse-lite-npm-1.0.30001599-834cd4cb82-d7e619e2e7.zip/node_modules/caniuse-lite/",\ "packageLocation": "./.yarn/cache/caniuse-lite-npm-1.0.30001603-77af81f60b-e66e0d24b8.zip/node_modules/caniuse-lite/",\
"packageDependencies": [\ "packageDependencies": [\
["caniuse-lite", "npm:1.0.30001599"]\ ["caniuse-lite", "npm:1.0.30001603"]\
],\ ],\
"linkType": "HARD"\ "linkType": "HARD"\
}]\ }]\
@ -5095,25 +5095,26 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\ }]\
]],\ ]],\
["eslint-plugin-vue", [\ ["eslint-plugin-vue", [\
["npm:9.23.0", {\ ["npm:9.24.0", {\
"packageLocation": "./.yarn/cache/eslint-plugin-vue-npm-9.23.0-d36e581933-acb3a4dd27.zip/node_modules/eslint-plugin-vue/",\ "packageLocation": "./.yarn/cache/eslint-plugin-vue-npm-9.24.0-4c6dba51bf-2309b919d8.zip/node_modules/eslint-plugin-vue/",\
"packageDependencies": [\ "packageDependencies": [\
["eslint-plugin-vue", "npm:9.23.0"]\ ["eslint-plugin-vue", "npm:9.24.0"]\
],\ ],\
"linkType": "SOFT"\ "linkType": "SOFT"\
}],\ }],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.23.0", {\ ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.24.0", {\
"packageLocation": "./.yarn/__virtual__/eslint-plugin-vue-virtual-a9cf4d7c43/0/cache/eslint-plugin-vue-npm-9.23.0-d36e581933-acb3a4dd27.zip/node_modules/eslint-plugin-vue/",\ "packageLocation": "./.yarn/__virtual__/eslint-plugin-vue-virtual-e080dd5dc6/0/cache/eslint-plugin-vue-npm-9.24.0-4c6dba51bf-2309b919d8.zip/node_modules/eslint-plugin-vue/",\
"packageDependencies": [\ "packageDependencies": [\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.23.0"],\ ["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.24.0"],\
["@eslint-community/eslint-utils", "virtual:4286e12a3a0f74af013bc8f16c6d8fdde823cfbf6389660266b171e551f576c805b0a7a8eb2a7087a5cee7dfe6ebb6e1ea3808d93daf915edc95656907a381bb#npm:4.4.0"],\ ["@eslint-community/eslint-utils", "virtual:4286e12a3a0f74af013bc8f16c6d8fdde823cfbf6389660266b171e551f576c805b0a7a8eb2a7087a5cee7dfe6ebb6e1ea3808d93daf915edc95656907a381bb#npm:4.4.0"],\
["@types/eslint", null],\ ["@types/eslint", null],\
["eslint", "npm:8.57.0"],\ ["eslint", "npm:8.57.0"],\
["globals", "npm:13.24.0"],\
["natural-compare", "npm:1.4.0"],\ ["natural-compare", "npm:1.4.0"],\
["nth-check", "npm:2.1.1"],\ ["nth-check", "npm:2.1.1"],\
["postcss-selector-parser", "npm:6.0.15"],\ ["postcss-selector-parser", "npm:6.0.15"],\
["semver", "npm:7.6.0"],\ ["semver", "npm:7.6.0"],\
["vue-eslint-parser", "virtual:a9cf4d7c437b03eeeb49b01b4b3434ca26b6f59f98831796df73ffd0744dcbe1bfe9c60f8b7e2c803ab0f29084730afdc0220af1db5d8d3d00531e0df4f49dbe#npm:9.4.2"],\ ["vue-eslint-parser", "virtual:e080dd5dc65fb3541eb98fd929c3a1d3733f3aff4bb24b09a6b5cce9fba4a29aca07e286ef93079f2144caa0fd33bb6545549286d3a9f2b9a211caa1f4b68ff9#npm:9.4.2"],\
["xml-name-validator", "npm:4.0.0"]\ ["xml-name-validator", "npm:4.0.0"]\
],\ ],\
"packagePeers": [\ "packagePeers": [\
@ -5828,20 +5829,20 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\ }]\
]],\ ]],\
["html-validate", [\ ["html-validate", [\
["npm:8.16.0", {\ ["npm:8.18.1", {\
"packageLocation": "./.yarn/cache/html-validate-npm-8.16.0-71c478330f-857b05ab87.zip/node_modules/html-validate/",\ "packageLocation": "./.yarn/cache/html-validate-npm-8.18.1-c5271a0fb9-53479bf75b.zip/node_modules/html-validate/",\
"packageDependencies": [\ "packageDependencies": [\
["html-validate", "npm:8.16.0"]\ ["html-validate", "npm:8.18.1"]\
],\ ],\
"linkType": "SOFT"\ "linkType": "SOFT"\
}],\ }],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.16.0", {\ ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.18.1", {\
"packageLocation": "./.yarn/__virtual__/html-validate-virtual-127f44ed2d/0/cache/html-validate-npm-8.16.0-71c478330f-857b05ab87.zip/node_modules/html-validate/",\ "packageLocation": "./.yarn/__virtual__/html-validate-virtual-640261ed3b/0/cache/html-validate-npm-8.18.1-c5271a0fb9-53479bf75b.zip/node_modules/html-validate/",\
"packageDependencies": [\ "packageDependencies": [\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.16.0"],\ ["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.18.1"],\
["@babel/code-frame", "npm:7.16.7"],\ ["@babel/code-frame", "npm:7.16.7"],\
["@html-validate/stylish", "npm:4.1.0"],\ ["@html-validate/stylish", "npm:4.1.0"],\
["@sidvind/better-ajv-errors", "virtual:127f44ed2d4bdd83725c8820683da6ed922142e851761151ec4911dcca098a2d4d832b774a31e7abf98185d360ff83c999b319ea3314c86d38eca853072fb0d2#npm:2.1.3"],\ ["@sidvind/better-ajv-errors", "virtual:640261ed3b7a9880a388cc504caacf8ea790dd52f1cb31fbc3be445cb2adc6e73fc87097de620863105eb917510145ef2457d30000c7361456ab67ec0b895136#npm:2.1.3"],\
["@types/jest", null],\ ["@types/jest", null],\
["@types/jest-diff", null],\ ["@types/jest-diff", null],\
["@types/jest-snapshot", null],\ ["@types/jest-snapshot", null],\
@ -8338,7 +8339,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["browser-fs-access", "npm:0.35.0"],\ ["browser-fs-access", "npm:0.35.0"],\
["browserlist", "npm:1.0.1"],\ ["browserlist", "npm:1.0.1"],\
["c8", "npm:9.1.0"],\ ["c8", "npm:9.1.0"],\
["caniuse-lite", "npm:1.0.30001599"],\ ["caniuse-lite", "npm:1.0.30001603"],\
["d3", "npm:7.9.0"],\ ["d3", "npm:7.9.0"],\
["eslint", "npm:8.57.0"],\ ["eslint", "npm:8.57.0"],\
["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\ ["eslint-config-standard", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:17.1.0"],\
@ -8347,10 +8348,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.6.2"],\ ["eslint-plugin-n", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:16.6.2"],\
["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\ ["eslint-plugin-node", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:11.1.0"],\
["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\ ["eslint-plugin-promise", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:6.1.1"],\
["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.23.0"],\ ["eslint-plugin-vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:9.24.0"],\
["file-saver", "npm:2.0.5"],\ ["file-saver", "npm:2.0.5"],\
["highcharts", "npm:11.4.0"],\ ["highcharts", "npm:11.4.0"],\
["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.16.0"],\ ["html-validate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:8.18.1"],\
["ical.js", "npm:1.5.0"],\ ["ical.js", "npm:1.5.0"],\
["jquery", "npm:3.7.1"],\ ["jquery", "npm:3.7.1"],\
["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\ ["jquery-migrate", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.1"],\
@ -8377,7 +8378,7 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
["slugify", "npm:1.6.6"],\ ["slugify", "npm:1.6.6"],\
["sortablejs", "npm:1.15.2"],\ ["sortablejs", "npm:1.15.2"],\
["vanillajs-datepicker", "npm:1.3.4"],\ ["vanillajs-datepicker", "npm:1.3.4"],\
["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.2"],\ ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.3"],\
["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"],\ ["vue", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:3.4.21"],\
["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.0"],\ ["vue-router", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.3.0"],\
["zxcvbn", "npm:4.4.2"]\ ["zxcvbn", "npm:4.4.2"]\
@ -9267,17 +9268,17 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
}]\ }]\
]],\ ]],\
["vite", [\ ["vite", [\
["npm:4.5.2", {\ ["npm:4.5.3", {\
"packageLocation": "./.yarn/cache/vite-npm-4.5.2-e430b2c117-9d1f84f703.zip/node_modules/vite/",\ "packageLocation": "./.yarn/cache/vite-npm-4.5.3-5cedc7cb8f-fd3f512ce4.zip/node_modules/vite/",\
"packageDependencies": [\ "packageDependencies": [\
["vite", "npm:4.5.2"]\ ["vite", "npm:4.5.3"]\
],\ ],\
"linkType": "SOFT"\ "linkType": "SOFT"\
}],\ }],\
["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.2", {\ ["virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.3", {\
"packageLocation": "./.yarn/__virtual__/vite-virtual-8f548b7c00/0/cache/vite-npm-4.5.2-e430b2c117-9d1f84f703.zip/node_modules/vite/",\ "packageLocation": "./.yarn/__virtual__/vite-virtual-69c30fd9fd/0/cache/vite-npm-4.5.3-5cedc7cb8f-fd3f512ce4.zip/node_modules/vite/",\
"packageDependencies": [\ "packageDependencies": [\
["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.2"],\ ["vite", "virtual:dc3fc578bfa5e06182a4d2be39ede0bc5b74940b1ffe0d70c26892ab140a4699787750fba175dc306292e80b4aa2c8c5f68c2a821e69b2c37e360c0dff36ff66#npm:4.5.3"],\
["@types/less", null],\ ["@types/less", null],\
["@types/lightningcss", null],\ ["@types/lightningcss", null],\
["@types/node", null],\ ["@types/node", null],\
@ -9531,10 +9532,10 @@ function $$SETUP_STATE(hydrateRuntimeState, basePath) {
],\ ],\
"linkType": "SOFT"\ "linkType": "SOFT"\
}],\ }],\
["virtual:a9cf4d7c437b03eeeb49b01b4b3434ca26b6f59f98831796df73ffd0744dcbe1bfe9c60f8b7e2c803ab0f29084730afdc0220af1db5d8d3d00531e0df4f49dbe#npm:9.4.2", {\ ["virtual:e080dd5dc65fb3541eb98fd929c3a1d3733f3aff4bb24b09a6b5cce9fba4a29aca07e286ef93079f2144caa0fd33bb6545549286d3a9f2b9a211caa1f4b68ff9#npm:9.4.2", {\
"packageLocation": "./.yarn/__virtual__/vue-eslint-parser-virtual-6710b98248/0/cache/vue-eslint-parser-npm-9.4.2-3e4e696025-67f14c8ea1.zip/node_modules/vue-eslint-parser/",\ "packageLocation": "./.yarn/__virtual__/vue-eslint-parser-virtual-f703c550a2/0/cache/vue-eslint-parser-npm-9.4.2-3e4e696025-67f14c8ea1.zip/node_modules/vue-eslint-parser/",\
"packageDependencies": [\ "packageDependencies": [\
["vue-eslint-parser", "virtual:a9cf4d7c437b03eeeb49b01b4b3434ca26b6f59f98831796df73ffd0744dcbe1bfe9c60f8b7e2c803ab0f29084730afdc0220af1db5d8d3d00531e0df4f49dbe#npm:9.4.2"],\ ["vue-eslint-parser", "virtual:e080dd5dc65fb3541eb98fd929c3a1d3733f3aff4bb24b09a6b5cce9fba4a29aca07e286ef93079f2144caa0fd33bb6545549286d3a9f2b9a211caa1f4b68ff9#npm:9.4.2"],\
["@types/eslint", null],\ ["@types/eslint", null],\
["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\ ["debug", "virtual:b86a9fb34323a98c6519528ed55faa0d9b44ca8879307c0b29aa384bde47ff59a7d0c9051b31246f14521dfb71ba3c5d6d0b35c29fffc17bf875aa6ad977d9e8#npm:4.3.4"],\
["eslint", "npm:8.57.0"],\ ["eslint", "npm:8.57.0"],\

Binary file not shown.

Binary file not shown.

View file

@ -22,7 +22,7 @@
"eslint-plugin-import": "2.29.1", "eslint-plugin-import": "2.29.1",
"eslint-plugin-node": "11.1.0", "eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1", "eslint-plugin-promise": "6.1.1",
"npm-check-updates": "16.14.17" "npm-check-updates": "16.14.18"
} }
}, },
"node_modules/@aashutoshrathi/word-wrap": { "node_modules/@aashutoshrathi/word-wrap": {
@ -725,6 +725,12 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
"dev": true "dev": true
}, },
"node_modules/@types/semver-utils": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz",
"integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==",
"dev": true
},
"node_modules/@ungap/structured-clone": { "node_modules/@ungap/structured-clone": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@ -4079,11 +4085,12 @@
} }
}, },
"node_modules/npm-check-updates": { "node_modules/npm-check-updates": {
"version": "16.14.17", "version": "16.14.18",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.17.tgz", "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.18.tgz",
"integrity": "sha512-ElnDdXKe60f8S6RhzFeaGuH2TFJmt2cU2HjLdowldabdm27nWFCxV2ebeP3xGbQkzp2+RPDQNdW9HqU1lcY8ag==", "integrity": "sha512-9iaRe9ohx9ykdbLjPRIYcq1A0RkrPYUx9HmQK1JIXhfxtJCNE/+497H9Z4PGH6GWRALbz5KF+1iZoySK2uSEpQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/semver-utils": "^1.1.1",
"chalk": "^5.3.0", "chalk": "^5.3.0",
"cli-table3": "^0.6.3", "cli-table3": "^0.6.3",
"commander": "^10.0.1", "commander": "^10.0.1",
@ -6816,6 +6823,12 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
"dev": true "dev": true
}, },
"@types/semver-utils": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz",
"integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==",
"dev": true
},
"@ungap/structured-clone": { "@ungap/structured-clone": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@ -9249,11 +9262,12 @@
} }
}, },
"npm-check-updates": { "npm-check-updates": {
"version": "16.14.17", "version": "16.14.18",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.17.tgz", "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.18.tgz",
"integrity": "sha512-ElnDdXKe60f8S6RhzFeaGuH2TFJmt2cU2HjLdowldabdm27nWFCxV2ebeP3xGbQkzp2+RPDQNdW9HqU1lcY8ag==", "integrity": "sha512-9iaRe9ohx9ykdbLjPRIYcq1A0RkrPYUx9HmQK1JIXhfxtJCNE/+497H9Z4PGH6GWRALbz5KF+1iZoySK2uSEpQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/semver-utils": "^1.1.1",
"chalk": "^5.3.0", "chalk": "^5.3.0",
"cli-table3": "^0.6.3", "cli-table3": "^0.6.3",
"commander": "^10.0.1", "commander": "^10.0.1",

View file

@ -19,6 +19,6 @@
"eslint-plugin-import": "2.29.1", "eslint-plugin-import": "2.29.1",
"eslint-plugin-node": "11.1.0", "eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1", "eslint-plugin-promise": "6.1.1",
"npm-check-updates": "16.14.17" "npm-check-updates": "16.14.18"
} }
} }

View file

@ -11,7 +11,7 @@
"nanoid": "5.0.6", "nanoid": "5.0.6",
"nanoid-dictionary": "5.0.0-beta.1", "nanoid-dictionary": "5.0.0-beta.1",
"slugify": "1.6.6", "slugify": "1.6.6",
"tar": "^6.2.0", "tar": "^6.2.1",
"yargs": "^17.7.2" "yargs": "^17.7.2"
}, },
"engines": { "engines": {
@ -483,9 +483,9 @@
} }
}, },
"node_modules/tar": { "node_modules/tar": {
"version": "6.2.0", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
"integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
"dependencies": { "dependencies": {
"chownr": "^2.0.0", "chownr": "^2.0.0",
"fs-minipass": "^2.0.0", "fs-minipass": "^2.0.0",
@ -977,9 +977,9 @@
} }
}, },
"tar": { "tar": {
"version": "6.2.0", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
"integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
"requires": { "requires": {
"chownr": "^2.0.0", "chownr": "^2.0.0",
"fs-minipass": "^2.0.0", "fs-minipass": "^2.0.0",

View file

@ -7,7 +7,7 @@
"nanoid": "5.0.6", "nanoid": "5.0.6",
"nanoid-dictionary": "5.0.0-beta.1", "nanoid-dictionary": "5.0.0-beta.1",
"slugify": "1.6.6", "slugify": "1.6.6",
"tar": "^6.2.0", "tar": "^6.2.1",
"yargs": "^17.7.2" "yargs": "^17.7.2"
}, },
"engines": { "engines": {

View file

@ -17,7 +17,7 @@
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"luxon": "^3.4.4", "luxon": "^3.4.4",
"pretty-bytes": "^6.1.1", "pretty-bytes": "^6.1.1",
"tar": "^6.2.0", "tar": "^6.2.1",
"yargs": "^17.7.2" "yargs": "^17.7.2"
}, },
"engines": { "engines": {
@ -1193,9 +1193,9 @@
} }
}, },
"node_modules/tar": { "node_modules/tar": {
"version": "6.2.0", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
"integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
"dependencies": { "dependencies": {
"chownr": "^2.0.0", "chownr": "^2.0.0",
"fs-minipass": "^2.0.0", "fs-minipass": "^2.0.0",
@ -2173,9 +2173,9 @@
} }
}, },
"tar": { "tar": {
"version": "6.2.0", "version": "6.2.1",
"resolved": "https://registry.npmjs.org/tar/-/tar-6.2.0.tgz", "resolved": "https://registry.npmjs.org/tar/-/tar-6.2.1.tgz",
"integrity": "sha512-/Wo7DcT0u5HUV486xg675HtjNd3BXZ6xDbzsCUZPt5iw8bTQ63bP0Raut3mvro9u+CUyq7YQd8Cx55fsZXxqLQ==", "integrity": "sha512-DZ4yORTwrbTj/7MZYq2w+/ZFdI6OZ/f9SFHR+71gIVUZhOQPHzVCLpvRnPgyaMpfWxxk/4ONva3GQSyNIKRv6A==",
"requires": { "requires": {
"chownr": "^2.0.0", "chownr": "^2.0.0",
"fs-minipass": "^2.0.0", "fs-minipass": "^2.0.0",

View file

@ -13,7 +13,7 @@
"lodash-es": "^4.17.21", "lodash-es": "^4.17.21",
"luxon": "^3.4.4", "luxon": "^3.4.4",
"pretty-bytes": "^6.1.1", "pretty-bytes": "^6.1.1",
"tar": "^6.2.0", "tar": "^6.2.1",
"yargs": "^17.7.2" "yargs": "^17.7.2"
}, },
"engines": { "engines": {

View file

@ -901,7 +901,7 @@ class CustomApiTests(TestCase):
r = self.client.get(url) r = self.client.get(url)
self.assertEqual(r.status_code, 200) self.assertEqual(r.status_code, 200)
@override_settings(APP_API_TOKENS={"ietf.api.views.email_aliases": ["valid-token"]}) @override_settings(APP_API_TOKENS={"ietf.api.views.draft_aliases": ["valid-token"]})
@mock.patch("ietf.api.views.DraftAliasGenerator") @mock.patch("ietf.api.views.DraftAliasGenerator")
def test_draft_aliases(self, mock): def test_draft_aliases(self, mock):
mock.return_value = (("alias1", ("a1", "a2")), ("alias2", ("a3", "a4"))) mock.return_value = (("alias1", ("a1", "a2")), ("alias2", ("a3", "a4")))
@ -935,7 +935,7 @@ class CustomApiTests(TestCase):
405, 405,
) )
@override_settings(APP_API_TOKENS={"ietf.api.views.email_aliases": ["valid-token"]}) @override_settings(APP_API_TOKENS={"ietf.api.views.group_aliases": ["valid-token"]})
@mock.patch("ietf.api.views.GroupAliasGenerator") @mock.patch("ietf.api.views.GroupAliasGenerator")
def test_group_aliases(self, mock): def test_group_aliases(self, mock):
mock.return_value = (("alias1", ("ietf",), ("a1", "a2")), ("alias2", ("ietf", "iab"), ("a3", "a4"))) mock.return_value = (("alias1", ("ietf",), ("a1", "a2")), ("alias2", ("ietf", "iab"), ("a3", "a4")))
@ -991,6 +991,28 @@ class CustomApiTests(TestCase):
self.assertCountEqual(result.keys(), ["addresses"]) self.assertCountEqual(result.keys(), ["addresses"])
self.assertCountEqual(result["addresses"], Email.objects.filter(active=True).values_list("address", flat=True)) self.assertCountEqual(result["addresses"], Email.objects.filter(active=True).values_list("address", flat=True))
@override_settings(APP_API_TOKENS={"ietf.api.views.role_holder_addresses": ["valid-token"]})
def test_role_holder_addresses(self):
url = urlreverse("ietf.api.views.role_holder_addresses")
r = self.client.get(url, headers={})
self.assertEqual(r.status_code, 403, "No api token, no access")
r = self.client.get(url, headers={"X-Api-Key": "not-valid-token"})
self.assertEqual(r.status_code, 403, "Bad api token, no access")
r = self.client.post(url, headers={"X-Api-Key": "valid-token"})
self.assertEqual(r.status_code, 405, "Bad method, no access")
emails = EmailFactory.create_batch(5)
email_queryset = Email.objects.filter(pk__in=[e.pk for e in emails])
with mock.patch("ietf.api.views.role_holder_emails", return_value=email_queryset):
r = self.client.get(url, headers={"X-Api-Key": "valid-token"})
self.assertEqual(r.status_code, 200, "Good api token and method, access")
content_dict = json.loads(r.content)
self.assertCountEqual(content_dict.keys(), ["addresses"])
self.assertEqual(
content_dict["addresses"],
sorted(e.address for e in emails),
)
class DirectAuthApiTests(TestCase): class DirectAuthApiTests(TestCase):

View file

@ -28,6 +28,8 @@ urlpatterns = [
url(r'^export/personal-information/$', api_views.PersonalInformationExportView.as_view()), url(r'^export/personal-information/$', api_views.PersonalInformationExportView.as_view()),
# Email alias information for groups # Email alias information for groups
url(r'^group/group-aliases/$', api_views.group_aliases), url(r'^group/group-aliases/$', api_views.group_aliases),
# Email addresses belonging to role holders
url(r'^group/role-holder-addresses/$', api_views.role_holder_addresses),
# Let IESG members set positions programmatically # Let IESG members set positions programmatically
url(r'^iesg/position', views_ballot.api_set_position), url(r'^iesg/position', views_ballot.api_set_position),
# Let Meetecho set session video URLs # Let Meetecho set session video URLs

View file

@ -29,7 +29,7 @@ from ietf.api import _api_list
from ietf.api.ietf_utils import is_valid_token, requires_api_token from ietf.api.ietf_utils import is_valid_token, requires_api_token
from ietf.api.serializer import JsonExportMixin from ietf.api.serializer import JsonExportMixin
from ietf.doc.utils import DraftAliasGenerator, fuzzy_find_documents from ietf.doc.utils import DraftAliasGenerator, fuzzy_find_documents
from ietf.group.utils import GroupAliasGenerator from ietf.group.utils import GroupAliasGenerator, role_holder_emails
from ietf.ietfauth.utils import role_required from ietf.ietfauth.utils import role_required
from ietf.ietfauth.views import send_account_creation_email from ietf.ietfauth.views import send_account_creation_email
from ietf.meeting.models import Meeting from ietf.meeting.models import Meeting
@ -452,7 +452,7 @@ def directauth(request):
return HttpResponse(status=405) return HttpResponse(status=405)
@requires_api_token("ietf.api.views.email_aliases") @requires_api_token
@csrf_exempt @csrf_exempt
def draft_aliases(request): def draft_aliases(request):
if request.method == "GET": if request.method == "GET":
@ -471,7 +471,7 @@ def draft_aliases(request):
return HttpResponse(status=405) return HttpResponse(status=405)
@requires_api_token("ietf.api.views.email_aliases") @requires_api_token
@csrf_exempt @csrf_exempt
def group_aliases(request): def group_aliases(request):
if request.method == "GET": if request.method == "GET":
@ -500,3 +500,18 @@ def active_email_list(request):
} }
) )
return HttpResponse(status=405) return HttpResponse(status=405)
@requires_api_token
def role_holder_addresses(request):
if request.method == "GET":
return JsonResponse(
{
"addresses": list(
role_holder_emails()
.order_by("address")
.values_list("address", flat=True)
)
}
)
return HttpResponse(status=405)

View file

@ -1547,21 +1547,12 @@ def document_ballot_content(request, doc, ballot_id, editable=True):
def document_ballot(request, name, ballot_id=None): def document_ballot(request, name, ballot_id=None):
doc = get_object_or_404(Document, name=name) doc = get_object_or_404(Document, name=name)
all_ballots = list(BallotDocEvent.objects.filter(doc=doc, type="created_ballot").order_by("time")) ballots = BallotDocEvent.objects.filter(doc=doc, type="created_ballot").order_by("time")
if not ballot_id: if ballot_id is not None:
if all_ballots: ballot = ballots.filter(id=ballot_id).first()
ballot = all_ballots[-1]
else:
raise Http404("Ballot not found for: %s" % name)
ballot_id = ballot.id
else: else:
ballot_id = int(ballot_id) ballot = ballots.last()
for b in all_ballots: if not ballot:
if b.id == ballot_id:
ballot = b
break
if not ballot_id or not ballot:
raise Http404("Ballot not found for: %s" % name) raise Http404("Ballot not found for: %s" % name)
if ballot.ballot_type.slug == "irsg-approve": if ballot.ballot_type.slug == "irsg-approve":
@ -1571,14 +1562,13 @@ def document_ballot(request, name, ballot_id=None):
top = render_document_top(request, doc, ballot_tab, name) top = render_document_top(request, doc, ballot_tab, name)
c = document_ballot_content(request, doc, ballot_id, editable=True) c = document_ballot_content(request, doc, ballot.id, editable=True)
request.session['ballot_edit_return_point'] = request.path_info request.session['ballot_edit_return_point'] = request.path_info
return render(request, "doc/document_ballot.html", return render(request, "doc/document_ballot.html",
dict(doc=doc, dict(doc=doc,
top=top, top=top,
ballot_content=c, ballot_content=c,
# ballot_type_slug=ballot.ballot_type.slug,
)) ))
def document_irsg_ballot(request, name, ballot_id=None): def document_irsg_ballot(request, name, ballot_id=None):

View file

@ -18,10 +18,16 @@ import debug # pyflakes:ignore
from ietf.doc.factories import DocumentFactory, WgDraftFactory, EditorialDraftFactory from ietf.doc.factories import DocumentFactory, WgDraftFactory, EditorialDraftFactory
from ietf.doc.models import DocEvent, RelatedDocument, Document from ietf.doc.models import DocEvent, RelatedDocument, Document
from ietf.group.models import Role, Group from ietf.group.models import Role, Group
from ietf.group.utils import get_group_role_emails, get_child_group_role_emails, get_group_ad_emails, GroupAliasGenerator from ietf.group.utils import (
get_group_role_emails,
get_child_group_role_emails,
get_group_ad_emails,
GroupAliasGenerator,
role_holder_emails,
)
from ietf.group.factories import GroupFactory, RoleFactory from ietf.group.factories import GroupFactory, RoleFactory
from ietf.person.factories import PersonFactory, EmailFactory from ietf.person.factories import PersonFactory, EmailFactory
from ietf.person.models import Person from ietf.person.models import Email, Person
from ietf.utils.test_utils import login_testing_unauthorized, TestCase from ietf.utils.test_utils import login_testing_unauthorized, TestCase
class StreamTests(TestCase): class StreamTests(TestCase):
@ -240,3 +246,41 @@ class GroupRoleEmailTests(TestCase):
self.assertGreater(len(emails), 0) self.assertGreater(len(emails), 0)
for item in emails: for item in emails:
self.assertIn('@', item) self.assertIn('@', item)
def test_role_holder_emails(self):
# The test fixtures create a bunch of addresses that pollute this test's results - disable them
Email.objects.update(active=False)
role_holders = [
RoleFactory(name_id="member", group__type_id=gt).person
for gt in [
"ag",
"area",
"dir",
"iab",
"ietf",
"irtf",
"nomcom",
"rg",
"team",
"wg",
"rag",
]
]
# Expect an additional active email to be included
EmailFactory(
person=role_holders[0],
active=True,
)
# Do not expect an inactive email to be included
EmailFactory(
person=role_holders[1],
active=False,
)
# Do not expect address on a role-holder for a different group type
RoleFactory(name_id="member", group__type_id="adhoc") # arbitrary type not in the of-interest list
self.assertCountEqual(
role_holder_emails(),
Email.objects.filter(active=True, person__in=role_holders),
)

View file

@ -425,3 +425,28 @@ class GroupAliasGenerator:
chair_emails = get_group_role_emails(group, ["chair", "delegate"]) chair_emails = get_group_role_emails(group, ["chair", "delegate"])
if chair_emails: if chair_emails:
yield group.acronym + "-chairs", ["ietf"], list(chair_emails) yield group.acronym + "-chairs", ["ietf"], list(chair_emails)
def role_holder_emails():
"""Get queryset of active Emails for group role holders"""
group_types_of_interest = [
"ag",
"area",
"dir",
"iab",
"ietf",
"irtf",
"nomcom",
"rg",
"team",
"wg",
"rag",
]
roles = Role.objects.filter(
group__state__slug="active",
group__type__in=group_types_of_interest,
)
emails = Email.objects.filter(active=True).exclude(
address__startswith="unknown-email-"
)
return emails.filter(person__role__in=roles).distinct()

View file

@ -1099,6 +1099,7 @@ def create_interim_session_conferences(sessions):
try: try:
confs = meetecho_manager.create( confs = meetecho_manager.create(
group=session.group, group=session.group,
session_id=session.pk,
description=str(session), description=str(session),
start_time=ts.utc_start_time(), start_time=ts.utc_start_time(),
duration=ts.duration, duration=ts.duration,

View file

@ -487,7 +487,7 @@ class InterimTests(TestCase):
mock.reset_mock() mock.reset_mock()
mock_conf_mgr.create.return_value = [ mock_conf_mgr.create.return_value = [
Conference( Conference(
manager=mock_conf_mgr, id=1, public_id='some-uuid', description='desc', manager=mock_conf_mgr, id=int(sessions[0].pk), public_id='some-uuid', description='desc',
start_time=timeslots[0].utc_start_time(), duration=timeslots[0].duration, url='fake-meetecho-url', start_time=timeslots[0].utc_start_time(), duration=timeslots[0].duration, url='fake-meetecho-url',
deletion_token='please-delete-me', deletion_token='please-delete-me',
), ),
@ -498,6 +498,7 @@ class InterimTests(TestCase):
mock_conf_mgr.create.call_args[1], mock_conf_mgr.create.call_args[1],
{ {
'group': sessions[0].group, 'group': sessions[0].group,
'session_id': sessions[0].id,
'description': str(sessions[0]), 'description': str(sessions[0]),
'start_time': timeslots[0].utc_start_time(), 'start_time': timeslots[0].utc_start_time(),
'duration': timeslots[0].duration, 'duration': timeslots[0].duration,
@ -512,12 +513,12 @@ class InterimTests(TestCase):
mock.reset_mock() mock.reset_mock()
mock_conf_mgr.create.side_effect = [ mock_conf_mgr.create.side_effect = [
[Conference( [Conference(
manager=mock_conf_mgr, id=1, public_id='some-uuid', description='desc', manager=mock_conf_mgr, id=int(sessions[0].pk), public_id='some-uuid', description='desc',
start_time=timeslots[0].utc_start_time(), duration=timeslots[0].duration, url='different-fake-meetecho-url', start_time=timeslots[0].utc_start_time(), duration=timeslots[0].duration, url='different-fake-meetecho-url',
deletion_token='please-delete-me', deletion_token='please-delete-me',
)], )],
[Conference( [Conference(
manager=mock_conf_mgr, id=2, public_id='another-uuid', description='desc', manager=mock_conf_mgr, id=int(sessions[1].pk), public_id='another-uuid', description='desc',
start_time=timeslots[1].utc_start_time(), duration=timeslots[1].duration, url='another-fake-meetecho-url', start_time=timeslots[1].utc_start_time(), duration=timeslots[1].duration, url='another-fake-meetecho-url',
deletion_token='please-delete-me-too', deletion_token='please-delete-me-too',
)], )],
@ -528,16 +529,18 @@ class InterimTests(TestCase):
mock_conf_mgr.create.call_args_list, mock_conf_mgr.create.call_args_list,
[ [
({ ({
'group': sessions[0].group, 'group': sessions[0].group,
'description': str(sessions[0]), 'session_id': sessions[0].id,
'start_time': timeslots[0].utc_start_time(), 'description': str(sessions[0]),
'duration': timeslots[0].duration, 'start_time': timeslots[0].utc_start_time(),
'duration': timeslots[0].duration,
},), },),
({ ({
'group': sessions[1].group, 'group': sessions[1].group,
'description': str(sessions[1]), 'session_id': sessions[1].id,
'start_time': timeslots[1].utc_start_time(), 'description': str(sessions[1]),
'duration': timeslots[1].duration, 'start_time': timeslots[1].utc_start_time(),
'duration': timeslots[1].duration,
},), },),
] ]
) )

View file

@ -115,6 +115,7 @@ class MeetechoAPI:
def schedule_meeting( def schedule_meeting(
self, self,
wg_token: str, wg_token: str,
room_id: int,
description: str, description: str,
start_time: datetime.datetime, start_time: datetime.datetime,
duration: datetime.timedelta, duration: datetime.timedelta,
@ -139,6 +140,7 @@ class MeetechoAPI:
} }
:param wg_token: token retrieved via retrieve_wg_tokens() :param wg_token: token retrieved via retrieve_wg_tokens()
:param room_id: int id to identify the room (will be echoed as room.id)
:param description: str describing the meeting :param description: str describing the meeting
:param start_time: starting time as a datetime :param start_time: starting time as a datetime
:param duration: duration as a timedelta :param duration: duration as a timedelta
@ -151,6 +153,7 @@ class MeetechoAPI:
"meeting/interim/createRoom", "meeting/interim/createRoom",
api_token=wg_token, api_token=wg_token,
json={ json={
"room_id": room_id,
"description": description, "description": description,
"start_time": self._serialize_time(start_time), "start_time": self._serialize_time(start_time),
"duration": self._serialize_duration(duration), "duration": self._serialize_duration(duration),
@ -455,9 +458,10 @@ class ConferenceManager(Manager):
response = self.api.fetch_meetings(self.wg_token(group)) response = self.api.fetch_meetings(self.wg_token(group))
return Conference.from_api_dict(self, response["rooms"]) return Conference.from_api_dict(self, response["rooms"])
def create(self, group, description, start_time, duration, extrainfo=""): def create(self, group, session_id, description, start_time, duration, extrainfo=""):
response = self.api.schedule_meeting( response = self.api.schedule_meeting(
wg_token=self.wg_token(group), wg_token=self.wg_token(group),
room_id=int(session_id),
description=description, description=description,
start_time=start_time, start_time=start_time,
duration=duration, duration=duration,

View file

@ -82,7 +82,7 @@ class APITests(TestCase):
'rooms': { 'rooms': {
'3d55bce0-535e-4ba8-bb8e-734911cf3c32': { '3d55bce0-535e-4ba8-bb8e-734911cf3c32': {
'room': { 'room': {
'id': 18, 'id': 18, # should match room_id in api.schedule_meeting() below
'start_time': '2021-09-14 10:00:00', 'start_time': '2021-09-14 10:00:00',
'duration': 130, 'duration': 130,
'description': 'interim-2021-wgname-01', 'description': 'interim-2021-wgname-01',
@ -97,6 +97,7 @@ class APITests(TestCase):
api = MeetechoAPI(API_BASE, CLIENT_ID, CLIENT_SECRET) api = MeetechoAPI(API_BASE, CLIENT_ID, CLIENT_SECRET)
api_response = api.schedule_meeting( api_response = api.schedule_meeting(
wg_token='my-token', wg_token='my-token',
room_id=18,
start_time=datetime.datetime(2021, 9, 14, 10, 0, 0, tzinfo=datetime.timezone.utc), start_time=datetime.datetime(2021, 9, 14, 10, 0, 0, tzinfo=datetime.timezone.utc),
duration=datetime.timedelta(minutes=130), duration=datetime.timedelta(minutes=130),
description='interim-2021-wgname-01', description='interim-2021-wgname-01',
@ -116,6 +117,7 @@ class APITests(TestCase):
self.assertEqual( self.assertEqual(
request.json(), request.json(),
{ {
'room_id': 18,
'duration': 130, 'duration': 130,
'start_time': '2021-09-14 10:00:00', 'start_time': '2021-09-14 10:00:00',
'extrainfo': 'message for staff', 'extrainfo': 'message for staff',
@ -485,7 +487,7 @@ class ConferenceManagerTests(TestCase):
'rooms': { 'rooms': {
'session-1-uuid': { 'session-1-uuid': {
'room': { 'room': {
'id': 1, 'id': 1, # value should match session_id param to cm.create() below
'start_time': datetime.datetime(2022,2,4,1,2,3, tzinfo=datetime.timezone.utc), 'start_time': datetime.datetime(2022,2,4,1,2,3, tzinfo=datetime.timezone.utc),
'duration': datetime.timedelta(minutes=45), 'duration': datetime.timedelta(minutes=45),
'description': 'some-description', 'description': 'some-description',
@ -496,7 +498,7 @@ class ConferenceManagerTests(TestCase):
}, },
} }
cm = ConferenceManager(settings.MEETECHO_API_CONFIG) cm = ConferenceManager(settings.MEETECHO_API_CONFIG)
result = cm.create('group', 'desc', 'starttime', 'dur', 'extra') result = cm.create('group', '1', 'desc', 'starttime', 'dur', 'extra')
self.assertEqual( self.assertEqual(
result, result,
[Conference( [Conference(
@ -515,6 +517,7 @@ class ConferenceManagerTests(TestCase):
kwargs, kwargs,
{ {
'wg_token': 'atoken', 'wg_token': 'atoken',
'room_id': 1,
'description': 'desc', 'description': 'desc',
'start_time': 'starttime', 'start_time': 'starttime',
'duration': 'dur', 'duration': 'dur',

View file

@ -21,7 +21,7 @@
"bootstrap": "5.3.3", "bootstrap": "5.3.3",
"bootstrap-icons": "1.11.3", "bootstrap-icons": "1.11.3",
"browser-fs-access": "0.35.0", "browser-fs-access": "0.35.0",
"caniuse-lite": "1.0.30001599", "caniuse-lite": "1.0.30001603",
"d3": "7.9.0", "d3": "7.9.0",
"file-saver": "2.0.5", "file-saver": "2.0.5",
"highcharts": "11.4.0", "highcharts": "11.4.0",
@ -66,14 +66,14 @@
"eslint-plugin-n": "16.6.2", "eslint-plugin-n": "16.6.2",
"eslint-plugin-node": "11.1.0", "eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1", "eslint-plugin-promise": "6.1.1",
"eslint-plugin-vue": "9.23.0", "eslint-plugin-vue": "9.24.0",
"html-validate": "8.16.0", "html-validate": "8.18.1",
"jquery-migrate": "3.4.1", "jquery-migrate": "3.4.1",
"parcel": "2.12.0", "parcel": "2.12.0",
"pug": "3.0.2", "pug": "3.0.2",
"sass": "1.72.0", "sass": "1.72.0",
"seedrandom": "3.0.5", "seedrandom": "3.0.5",
"vite": "4.5.2" "vite": "4.5.3"
}, },
"targets": { "targets": {
"ietf": { "ietf": {

View file

@ -22,7 +22,7 @@
"eslint-plugin-n": "16.6.2", "eslint-plugin-n": "16.6.2",
"eslint-plugin-node": "11.1.0", "eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1", "eslint-plugin-promise": "6.1.1",
"npm-check-updates": "16.14.17" "npm-check-updates": "16.14.18"
} }
}, },
"node_modules/@aashutoshrathi/word-wrap": { "node_modules/@aashutoshrathi/word-wrap": {
@ -563,6 +563,12 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
"dev": true "dev": true
}, },
"node_modules/@types/semver-utils": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz",
"integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==",
"dev": true
},
"node_modules/@ungap/structured-clone": { "node_modules/@ungap/structured-clone": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@ -3804,11 +3810,12 @@
} }
}, },
"node_modules/npm-check-updates": { "node_modules/npm-check-updates": {
"version": "16.14.17", "version": "16.14.18",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.17.tgz", "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.18.tgz",
"integrity": "sha512-ElnDdXKe60f8S6RhzFeaGuH2TFJmt2cU2HjLdowldabdm27nWFCxV2ebeP3xGbQkzp2+RPDQNdW9HqU1lcY8ag==", "integrity": "sha512-9iaRe9ohx9ykdbLjPRIYcq1A0RkrPYUx9HmQK1JIXhfxtJCNE/+497H9Z4PGH6GWRALbz5KF+1iZoySK2uSEpQ==",
"dev": true, "dev": true,
"dependencies": { "dependencies": {
"@types/semver-utils": "^1.1.1",
"chalk": "^5.3.0", "chalk": "^5.3.0",
"cli-table3": "^0.6.3", "cli-table3": "^0.6.3",
"commander": "^10.0.1", "commander": "^10.0.1",
@ -6347,6 +6354,12 @@
"integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==", "integrity": "sha512-dRLjCWHYg4oaA77cxO64oO+7JwCwnIzkZPdrrC71jQmQtlhM556pwKo5bUzqvZndkVbeFLIIi+9TC40JNF5hNQ==",
"dev": true "dev": true
}, },
"@types/semver-utils": {
"version": "1.1.3",
"resolved": "https://registry.npmjs.org/@types/semver-utils/-/semver-utils-1.1.3.tgz",
"integrity": "sha512-T+YwkslhsM+CeuhYUxyAjWm7mJ5am/K10UX40RuA6k6Lc7eGtq8iY2xOzy7Vq0GOqhl/xZl5l2FwURZMTPTUww==",
"dev": true
},
"@ungap/structured-clone": { "@ungap/structured-clone": {
"version": "1.2.0", "version": "1.2.0",
"resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz", "resolved": "https://registry.npmjs.org/@ungap/structured-clone/-/structured-clone-1.2.0.tgz",
@ -8721,11 +8734,12 @@
} }
}, },
"npm-check-updates": { "npm-check-updates": {
"version": "16.14.17", "version": "16.14.18",
"resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.17.tgz", "resolved": "https://registry.npmjs.org/npm-check-updates/-/npm-check-updates-16.14.18.tgz",
"integrity": "sha512-ElnDdXKe60f8S6RhzFeaGuH2TFJmt2cU2HjLdowldabdm27nWFCxV2ebeP3xGbQkzp2+RPDQNdW9HqU1lcY8ag==", "integrity": "sha512-9iaRe9ohx9ykdbLjPRIYcq1A0RkrPYUx9HmQK1JIXhfxtJCNE/+497H9Z4PGH6GWRALbz5KF+1iZoySK2uSEpQ==",
"dev": true, "dev": true,
"requires": { "requires": {
"@types/semver-utils": "^1.1.1",
"chalk": "^5.3.0", "chalk": "^5.3.0",
"cli-table3": "^0.6.3", "cli-table3": "^0.6.3",
"commander": "^10.0.1", "commander": "^10.0.1",

View file

@ -14,7 +14,7 @@
"eslint-plugin-n": "16.6.2", "eslint-plugin-n": "16.6.2",
"eslint-plugin-node": "11.1.0", "eslint-plugin-node": "11.1.0",
"eslint-plugin-promise": "6.1.1", "eslint-plugin-promise": "6.1.1",
"npm-check-updates": "16.14.17" "npm-check-updates": "16.14.18"
}, },
"dependencies": { "dependencies": {
"@faker-js/faker": "8.4.1", "@faker-js/faker": "8.4.1",

View file

@ -2684,10 +2684,10 @@ browserlist@latest:
languageName: node languageName: node
linkType: hard linkType: hard
"caniuse-lite@npm:1.0.30001599": "caniuse-lite@npm:1.0.30001603":
version: 1.0.30001599 version: 1.0.30001603
resolution: "caniuse-lite@npm:1.0.30001599" resolution: "caniuse-lite@npm:1.0.30001603"
checksum: d7e619e2e723547b7311ba0ca5134d9cd55df548e93dbedcf8a6e4ec74c7db91969c4272fb1ab2fd94cddeac6a8176ebf05853eb06689d5e76bb97d979a214b0 checksum: e66e0d24b899c2ed3fdcc2dd44df29c4fc06d74fa8f43abe81fc7cff4a72b092d438e0fb5b7daeb252ee267519f32c6c7d229a15e7a4f4263afef6ea3832b661
languageName: node languageName: node
linkType: hard linkType: hard
@ -3985,11 +3985,12 @@ browserlist@latest:
languageName: node languageName: node
linkType: hard linkType: hard
"eslint-plugin-vue@npm:9.23.0": "eslint-plugin-vue@npm:9.24.0":
version: 9.23.0 version: 9.24.0
resolution: "eslint-plugin-vue@npm:9.23.0" resolution: "eslint-plugin-vue@npm:9.24.0"
dependencies: dependencies:
"@eslint-community/eslint-utils": ^4.4.0 "@eslint-community/eslint-utils": ^4.4.0
globals: ^13.24.0
natural-compare: ^1.4.0 natural-compare: ^1.4.0
nth-check: ^2.1.1 nth-check: ^2.1.1
postcss-selector-parser: ^6.0.15 postcss-selector-parser: ^6.0.15
@ -3998,7 +3999,7 @@ browserlist@latest:
xml-name-validator: ^4.0.0 xml-name-validator: ^4.0.0
peerDependencies: peerDependencies:
eslint: ^6.2.0 || ^7.0.0 || ^8.0.0 eslint: ^6.2.0 || ^7.0.0 || ^8.0.0
checksum: acb3a4dd27a815be37b63fc735c88bf9bfd12a5147639635eb6e473c7fdf47f69a78693ffeb67581ffd11e0016c134bb56a667193b958a189cbfc2df3e93160b checksum: 2309b919d8fced6210c11e09107f443990063c0392843909cf50fad682e820c48bf5cc28b82a1239c03fd7ceeb4239e1baa653370c4c76689ec5fb8a970cd303
languageName: node languageName: node
linkType: hard linkType: hard
@ -4714,9 +4715,9 @@ browserlist@latest:
languageName: node languageName: node
linkType: hard linkType: hard
"html-validate@npm:8.16.0": "html-validate@npm:8.18.1":
version: 8.16.0 version: 8.18.1
resolution: "html-validate@npm:8.16.0" resolution: "html-validate@npm:8.18.1"
dependencies: dependencies:
"@babel/code-frame": ^7.10.0 "@babel/code-frame": ^7.10.0
"@html-validate/stylish": ^4.1.0 "@html-validate/stylish": ^4.1.0
@ -4745,7 +4746,7 @@ browserlist@latest:
optional: true optional: true
bin: bin:
html-validate: bin/html-validate.js html-validate: bin/html-validate.js
checksum: 857b05ab87ae8b92d9d256dfc45def15275d6038bb7456afb00c6e23872acc4bc7bcc50be89ce82bad36f6c4026603106f57574f1058f3ae3f2e35fca0f34a15 checksum: 53479bf75bcb6ad748a6543583de6a26bfb55d85c0ae793bd6619c0079795f482c01b4168a7dea2584219f31b8a05c3ea2a0d5ebfd639099caf623263d3ac536
languageName: node languageName: node
linkType: hard linkType: hard
@ -7042,7 +7043,7 @@ browserlist@latest:
browser-fs-access: 0.35.0 browser-fs-access: 0.35.0
browserlist: latest browserlist: latest
c8: 9.1.0 c8: 9.1.0
caniuse-lite: 1.0.30001599 caniuse-lite: 1.0.30001603
d3: 7.9.0 d3: 7.9.0
eslint: 8.57.0 eslint: 8.57.0
eslint-config-standard: 17.1.0 eslint-config-standard: 17.1.0
@ -7051,10 +7052,10 @@ browserlist@latest:
eslint-plugin-n: 16.6.2 eslint-plugin-n: 16.6.2
eslint-plugin-node: 11.1.0 eslint-plugin-node: 11.1.0
eslint-plugin-promise: 6.1.1 eslint-plugin-promise: 6.1.1
eslint-plugin-vue: 9.23.0 eslint-plugin-vue: 9.24.0
file-saver: 2.0.5 file-saver: 2.0.5
highcharts: 11.4.0 highcharts: 11.4.0
html-validate: 8.16.0 html-validate: 8.18.1
ical.js: 1.5.0 ical.js: 1.5.0
jquery: 3.7.1 jquery: 3.7.1
jquery-migrate: 3.4.1 jquery-migrate: 3.4.1
@ -7081,7 +7082,7 @@ browserlist@latest:
slugify: 1.6.6 slugify: 1.6.6
sortablejs: 1.15.2 sortablejs: 1.15.2
vanillajs-datepicker: 1.3.4 vanillajs-datepicker: 1.3.4
vite: 4.5.2 vite: 4.5.3
vue: 3.4.21 vue: 3.4.21
vue-router: 4.3.0 vue-router: 4.3.0
zxcvbn: 4.4.2 zxcvbn: 4.4.2
@ -7876,9 +7877,9 @@ browserlist@latest:
languageName: node languageName: node
linkType: hard linkType: hard
"vite@npm:4.5.2": "vite@npm:4.5.3":
version: 4.5.2 version: 4.5.3
resolution: "vite@npm:4.5.2" resolution: "vite@npm:4.5.3"
dependencies: dependencies:
esbuild: ^0.18.10 esbuild: ^0.18.10
fsevents: ~2.3.2 fsevents: ~2.3.2
@ -7912,7 +7913,7 @@ browserlist@latest:
optional: true optional: true
bin: bin:
vite: bin/vite.js vite: bin/vite.js
checksum: 9d1f84f703c2660aced34deee7f309278ed368880f66e9570ac115c793d91f7fffb80ab19c602b3c8bc1341fe23437d86a3fcca2a9ef82f7ef0cdac5a40d0c86 checksum: fd3f512ce48ca2a1fe60ad0376283b832de9272725fdbc65064ae9248f792de87b0f27a89573115e23e26784800daca329f8a9234d298ba6f60e808a9c63883c
languageName: node languageName: node
linkType: hard linkType: hard