From cbcb60dfda3bb9b5ce096df22005d9d583f3f8de Mon Sep 17 00:00:00 2001 From: James Hodgkinson Date: Fri, 12 Jan 2024 22:10:17 +1000 Subject: [PATCH 01/23] docs: minor fix for JSON formatting in config example docs (#1015) --- docs/configurations.md | 14 ++++++++------ 1 file changed, 8 insertions(+), 6 deletions(-) diff --git a/docs/configurations.md b/docs/configurations.md index ec7dfc1fa..1e0de2572 100644 --- a/docs/configurations.md +++ b/docs/configurations.md @@ -1,4 +1,6 @@ -`Configuration` tab can have multiple subtabs, for example, a tab for account configuration (Use to configure the account by adding account credentials), proxy configuration and logging level configuration. +The `Configuration` tab can have multiple subtabs, for example, a tab for +account configuration (to configure the account by adding account credentials), +proxy configuration and logging level configuration. ### Configuration Properties @@ -6,7 +8,7 @@ | ----------------------------------------------------------------- | ------ | ------------------------------------------------------- | | title\* | string | - | | description | string | To provide a brief summary of an configuration page. | -| subDescription(../advanced/sub_description) | object | To provide broader description of an configuration page | +| subDescription(../advanced/sub_description) | object | To provide broader description of an configuration page | | [tabs](#tabs-properties)\* | array | To specify a list of tab. | ### Tabs properties @@ -29,24 +31,24 @@ ### Usage -``` +```json "configuration": { "title": "Configuration", "description": "Set up your add-on", "tabs": [ { "name": "account", - "title": "Account" + "title": "Account", "table": {}, "entity": [] }, { "name": "proxy", - "title": "Proxy" + "title": "Proxy", "entity": [], "options": { "saveValidator": "" - }, + } } ] } From d40fcafb6ed3246d4d0ee41706db744548671857 Mon Sep 17 00:00:00 2001 From: vtsvetkov-splunk <142901247+vtsvetkov-splunk@users.noreply.github.com> Date: Fri, 12 Jan 2024 15:25:13 +0100 Subject: [PATCH 02/23] chore(ci): validate storybook build during CI (#1018) --- .github/workflows/build-ui.yml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/.github/workflows/build-ui.yml b/.github/workflows/build-ui.yml index a8d6a9113..ac90009a8 100644 --- a/.github/workflows/build-ui.yml +++ b/.github/workflows/build-ui.yml @@ -26,6 +26,8 @@ jobs: run: yarn run lint - name: Unit test run: yarn run test + - name: Validate storybook build + run: yarn run build-storybook - name: Build UCC UI run: yarn run build - name: List deps into dependencies.txt From bc82425555fe288d25e97293a24b2f2c9fcd3af3 Mon Sep 17 00:00:00 2001 From: vtsvetkov-splunk <142901247+vtsvetkov-splunk@users.noreply.github.com> Date: Mon, 15 Jan 2024 13:52:04 +0100 Subject: [PATCH 03/23] chore(renovate): ignore nodejs required version updates (#1020) --- renovate.json | 12 +++++++++++- 1 file changed, 11 insertions(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 974362834..eebeb4e27 100644 --- a/renovate.json +++ b/renovate.json @@ -20,6 +20,7 @@ "allowedVersions": "<2.0.0" }, { + "description": "Ignore packages that needs for SUI", "matchManagers": [ "npm" ], @@ -52,19 +53,28 @@ "enabled": false }, { + "description": "Ignore msw-storybook-addon since they bumps incorrectly while canary version is using", "matchManagers": [ "npm" ], "matchPackageNames": [ "msw-storybook-addon" ], - "allowedVersions": "!/next|canary/" + "dependencyDashboardApproval": true }, { + "description": "Update package.json versions together with yarn.lock", "matchManagers": [ "npm" ], "rangeStrategy": "bump" + }, + { + "description": "Ignore NodeJS", + "matchPackageNames": ["node"], + "matchManagers": ["npm"], + "matchDepTypes": [ "engines" ], + "dependencyDashboardApproval": true } ] } From 332db4361556b865418b16c6fbd8ce4912ba5084 Mon Sep 17 00:00:00 2001 From: James Hodgkinson Date: Tue, 16 Jan 2024 20:50:44 +1000 Subject: [PATCH 04/23] fix: OpenAPI schema generator fixes for when multiple inputs are defined (#1016) Previously it was trying to use the parent tables.actions object but that doesn't work when you've only got a single input. Also added a sample app that has multiple inputs to test, not sure how to add it to the test suite though? --------- Co-authored-by: sgoral --- .../commands/openapi_generator/ucc_to_oas.py | 6 +- tests/smoke/test_ucc_build.py | 12 + .../globalConfig.json | 472 ++++++++++++++++++ .../package/README.txt | 1 + .../package/app.manifest | 54 ++ .../package/default/app.conf | 15 + .../package/lib/requirements.txt | 1 + .../package/static/appIcon.png | Bin 0 -> 3348 bytes .../package/static/appIconAlt.png | Bin 0 -> 3348 bytes .../package/static/appIconAlt_2x.png | Bin 0 -> 6738 bytes .../package/static/appIcon_2x.png | Bin 0 -> 6738 bytes 11 files changed, 560 insertions(+), 1 deletion(-) create mode 100644 tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json create mode 100644 tests/testdata/test_addons/package_global_config_multi_input/package/README.txt create mode 100644 tests/testdata/test_addons/package_global_config_multi_input/package/app.manifest create mode 100644 tests/testdata/test_addons/package_global_config_multi_input/package/default/app.conf create mode 100644 tests/testdata/test_addons/package_global_config_multi_input/package/lib/requirements.txt create mode 100644 tests/testdata/test_addons/package_global_config_multi_input/package/static/appIcon.png create mode 100644 tests/testdata/test_addons/package_global_config_multi_input/package/static/appIconAlt.png create mode 100644 tests/testdata/test_addons/package_global_config_multi_input/package/static/appIconAlt_2x.png create mode 100644 tests/testdata/test_addons/package_global_config_multi_input/package/static/appIcon_2x.png diff --git a/splunk_add_on_ucc_framework/commands/openapi_generator/ucc_to_oas.py b/splunk_add_on_ucc_framework/commands/openapi_generator/ucc_to_oas.py index 9c6d0bcd0..85ed3e270 100644 --- a/splunk_add_on_ucc_framework/commands/openapi_generator/ucc_to_oas.py +++ b/splunk_add_on_ucc_framework/commands/openapi_generator/ucc_to_oas.py @@ -367,11 +367,15 @@ def __add_paths( global_config.pages.inputs, "services" # type: ignore[attr-defined] ): for service in global_config.pages.inputs.services: # type: ignore[attr-defined] + if hasattr(service, "table"): + actions = service.table.actions + else: + actions = global_config.pages.inputs.table.actions # type: ignore[attr-defined] open_api_object = __assign_ta_paths( open_api_object=open_api_object, path=f"/{global_config.meta.restRoot}_{service.name}", # type: ignore[attr-defined] path_name=service.name, - actions=global_config.pages.inputs.table.actions, # type: ignore[attr-defined] + actions=actions, page=GloblaConfigPages.INPUTS, ) return open_api_object diff --git a/tests/smoke/test_ucc_build.py b/tests/smoke/test_ucc_build.py index ce17f08a6..9613fdbb2 100644 --- a/tests/smoke/test_ucc_build.py +++ b/tests/smoke/test_ucc_build.py @@ -160,6 +160,18 @@ def test_ucc_generate_with_everything(): assert path.exists(expected_file_path) +def test_ucc_generate_with_multiple_inputs_tabs(): + package_folder = path.join( + path.dirname(path.realpath(__file__)), + "..", + "testdata", + "test_addons", + "package_global_config_multi_input", + "package", + ) + build.generate(source=package_folder) + + @pytest.mark.skipif(sys.version_info >= (3, 8), reason=PYTEST_SKIP_REASON) def test_ucc_generate_with_configuration(): with tempfile.TemporaryDirectory() as temp_dir: diff --git a/tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json b/tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json new file mode 100644 index 000000000..7334e6ec4 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json @@ -0,0 +1,472 @@ +{ + "pages": { + "configuration": { + "tabs": [ + { + "name": "account", + "table": { + "actions": [ + "edit", + "delete", + "clone" + ], + "header": [ + { + "label": "Name", + "field": "name" + }, + { + "label": "Auth Type", + "field": "auth_type" + } + ] + }, + "entity": [ + { + "type": "text", + "label": "Name", + "validators": [ + { + "type": "string", + "errorMsg": "Length of ID should be between 1 and 50", + "minLength": 1, + "maxLength": 50 + }, + { + "type": "regex", + "errorMsg": "Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.", + "pattern": "^[a-zA-Z]\\w*$" + } + ], + "field": "name", + "help": "Enter a unique name for this account.", + "required": true + }, + { + "type": "singleSelect", + "label": "Example Environment", + "options": { + "disableSearch": true, + "autoCompleteFields": [ + { + "value": "login.example.com", + "label": "Value1" + }, + { + "value": "test.example.com", + "label": "Value2" + }, + { + "value": "other", + "label": "Other" + } + ], + "display": true + }, + "help": "", + "field": "custom_endpoint", + "defaultValue": "login.example.com", + "required": true + }, + { + "type": "text", + "label": "Endpoint URL", + "help": "Enter the endpoint URL.", + "field": "endpoint", + "options": { + "display": false + } + }, + { + "type": "checkbox", + "label": "Example Checkbox", + "field": "account_checkbox", + "help": "This is an example checkbox for the account entity" + }, + { + "type": "radio", + "label": "Example Radio", + "field": "account_radio", + "defaultValue": "yes", + "help": "This is an example radio button for the account entity", + "required": true, + "options": { + "items": [ + { + "value": "yes", + "label": "Yes" + }, + { + "value": "no", + "label": "No" + } + ], + "display": true + } + }, + { + "type": "multipleSelect", + "label": "Example Multiple Select", + "field": "account_multiple_select", + "help": "This is an example multipleSelect for account entity", + "required": true, + "options": { + "items": [ + { + "value": "one", + "label": "Option One" + }, + { + "value": "two", + "label": "Option Two" + } + ] + } + }, + { + "type": "oauth", + "field": "oauth", + "label": "Not used", + "options": { + "auth_type": [ + "basic", + "oauth" + ], + "basic": [ + { + "oauth_field": "username", + "label": "Username", + "help": "Enter the username for this account.", + "field": "username" + }, + { + "oauth_field": "password", + "label": "Password", + "encrypted": true, + "help": "Enter the password for this account.", + "field": "password" + }, + { + "oauth_field": "security_token", + "label": "Security Token", + "encrypted": true, + "help": "Enter the security token.", + "field": "token" + } + ], + "oauth": [ + { + "oauth_field": "client_id", + "label": "Client Id", + "field": "client_id", + "help": "Enter the Client Id for this account." + }, + { + "oauth_field": "client_secret", + "label": "Client Secret", + "field": "client_secret", + "encrypted": true, + "help": "Enter the Client Secret key for this account." + }, + { + "oauth_field": "redirect_url", + "label": "Redirect url", + "field": "redirect_url", + "help": "Copy and paste this URL into your app." + } + ], + "auth_code_endpoint": "/services/oauth2/authorize", + "access_token_endpoint": "/services/oauth2/token", + "oauth_timeout": 30, + "oauth_state_enabled": false + } + }, + { + "field": "example_help_link", + "label": "", + "type": "helpLink", + "options": { + "text": "Help Link", + "link": "https://docs.splunk.com/Documentation" + } + } + ], + "title": "Account" + }, + { + "name": "proxy", + "entity": [ + { + "type": "checkbox", + "label": "Enable", + "field": "proxy_enabled" + }, + { + "type": "singleSelect", + "label": "Proxy Type", + "options": { + "disableSearch": true, + "autoCompleteFields": [ + { + "value": "http", + "label": "http" + }, + { + "value": "socks4", + "label": "socks4" + }, + { + "value": "socks5", + "label": "socks5" + } + ] + }, + "defaultValue": "http", + "field": "proxy_type" + }, + { + "type": "text", + "label": "Host", + "validators": [ + { + "type": "string", + "errorMsg": "Max host length is 4096", + "minLength": 0, + "maxLength": 4096 + } + ], + "field": "proxy_url" + }, + { + "type": "text", + "label": "Port", + "validators": [ + { + "type": "number", + "range": [ + 1, + 65535 + ] + } + ], + "field": "proxy_port" + }, + { + "type": "text", + "label": "Username", + "validators": [ + { + "type": "string", + "errorMsg": "Max length of username is 50", + "minLength": 0, + "maxLength": 50 + } + ], + "field": "proxy_username" + }, + { + "type": "text", + "label": "Password", + "validators": [ + { + "type": "string", + "errorMsg": "Max length of password is 8192", + "minLength": 0, + "maxLength": 8192 + } + ], + "encrypted": true, + "field": "proxy_password" + }, + { + "type": "checkbox", + "label": "Reverse DNS resolution", + "field": "proxy_rdns" + } + ], + "options": { + "saveValidator": "function(formData) { if(!formData.proxy_enabled || formData.proxy_enabled === '0') {return true; } if(!formData.proxy_url) { return 'Proxy Host can not be empty'; } if(!formData.proxy_port) { return 'Proxy Port can not be empty'; } return true; }" + }, + "title": "Proxy" + }, + { + "name": "logging", + "entity": [ + { + "type": "singleSelect", + "label": "Log level", + "options": { + "disableSearch": true, + "autoCompleteFields": [ + { + "value": "DEBUG", + "label": "DEBUG" + }, + { + "value": "INFO", + "label": "INFO" + }, + { + "value": "WARNING", + "label": "WARNING" + }, + { + "value": "ERROR", + "label": "ERROR" + }, + { + "value": "CRITICAL", + "label": "CRITICAL" + } + ] + }, + "defaultValue": "INFO", + "field": "loglevel" + } + ], + "title": "Logging" + }, + { + "name": "custom_abc", + "title": "Customized tab", + "entity": [ + { + "field": "testString", + "label": "Test String", + "type": "text", + "validators": [ + { + "type": "string", + "maxLength": 10, + "minLength": 5 + } + ] + }, + { + "field": "testNumber", + "label": "Test number", + "type": "text", + "validators": [ + { + "type": "number", + "range": [ + 1, + 10 + ] + } + ] + }, + { + "field": "testRegex", + "label": "Test regex", + "type": "text", + "validators": [ + { + "type": "regex", + "pattern": "^\\w+$", + "errorMsg": "Characters of Name should match regex ^\\w+$ ." + } + ] + }, + { + "field": "testEmail", + "label": "Test Email", + "type": "text", + "validators": [ + { + "type": "email" + } + ] + }, + { + "field": "testIpv4", + "label": "Test ipv4", + "type": "text", + "validators": [ + { + "type": "ipv4" + } + ] + }, + { + "field": "testDate", + "label": "Test date", + "type": "text", + "validators": [ + { + "type": "date" + } + ] + }, + { + "field": "testUrl", + "label": "Test url", + "type": "text", + "validators": [ + { + "type": "url" + } + ] + } + ] + } + ], + "title": "Configuration", + "description": "Set up your add-on" + }, + "inputs": { + "title": "Inputs", + "services": [ + { + "name": "example_input_one", + "description": "This is a description for Input One", + "title": "Example Input", + "entity": [], + "table": { + "actions": [ + "edit", + "enable", + "delete", + "clone" + ], + "header": [], + "moreInfo": [] + }, + "warning": { + "create": "Warning text for create mode", + "edit": "Warning text for edit mode", + "clone": "Warning text for clone mode", + "config": "Warning text for config mode" + } + }, + { + "name": "example_input_two", + "description": "This is a description for Input Two", + "title": "Example Input Two", + "entity": [], + "table": { + "actions": [ + "edit", + "enable", + "delete", + "clone" + ], + "header": [], + "moreInfo": [], + "customRow": { + "type": "external", + "src": "custom_row" + } + } + } + ] + } + }, + "meta": { + "name": "Splunk_TA_UCCExample", + "restRoot": "splunk_ta_uccexample", + "version": "0.0.1", + "displayName": "Splunk UCC test Add-on", + "schemaVersion": "0.0.3" + } +} diff --git a/tests/testdata/test_addons/package_global_config_multi_input/package/README.txt b/tests/testdata/test_addons/package_global_config_multi_input/package/README.txt new file mode 100644 index 000000000..530a9e548 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_multi_input/package/README.txt @@ -0,0 +1 @@ +Just a readme \ No newline at end of file diff --git a/tests/testdata/test_addons/package_global_config_multi_input/package/app.manifest b/tests/testdata/test_addons/package_global_config_multi_input/package/app.manifest new file mode 100644 index 000000000..a99395790 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_multi_input/package/app.manifest @@ -0,0 +1,54 @@ +{ + "schemaVersion": "2.0.0", + "info": { + "title": "Splunk Add-on for UCC Example", + "id": { + "group": null, + "name": "Splunk_TA_UCCExample", + "version": "7.0.1" + }, + "author": [ + { + "name": "Splunk Inc.", + "email": null, + "company": null + } + ], + "releaseDate": null, + "description": "Splunk Add-on for UCC Example", + "classification": { + "intendedAudience": null, + "categories": [], + "developmentStatus": null + }, + "commonInformationModels": null, + "license": { + "name": null, + "text": "LICENSES/Apache-2.0.txt", + "uri": null + }, + "privacyPolicy": { + "name": null, + "text": null, + "uri": null + }, + "releaseNotes": { + "name": null, + "text": "./README.txt", + "uri": null + } + }, + "dependencies": null, + "tasks": null, + "inputGroups": null, + "incompatibleApps": null, + "platformRequirements": null, + "supportedDeployments": [ + "_standalone", + "_distributed" + ], + "targetWorkloads": [ + "_search_heads", + "_indexers" + ] +} diff --git a/tests/testdata/test_addons/package_global_config_multi_input/package/default/app.conf b/tests/testdata/test_addons/package_global_config_multi_input/package/default/app.conf new file mode 100644 index 000000000..3e92b23bd --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_multi_input/package/default/app.conf @@ -0,0 +1,15 @@ +[install] +build = 0 + +[launcher] +author = Splunk Inc. +version = 0.1.0 +description = Splunk_TA_UCCExample + +[ui] +is_visible = false +label = Splunk_TA_UCCExample +docs_section_override=AddOns:released + +[package] +id = Splunk_TA_UCCExample diff --git a/tests/testdata/test_addons/package_global_config_multi_input/package/lib/requirements.txt b/tests/testdata/test_addons/package_global_config_multi_input/package/lib/requirements.txt new file mode 100644 index 000000000..4e63a1a57 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_multi_input/package/lib/requirements.txt @@ -0,0 +1 @@ +splunktaucclib diff --git a/tests/testdata/test_addons/package_global_config_multi_input/package/static/appIcon.png b/tests/testdata/test_addons/package_global_config_multi_input/package/static/appIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..88f67e7257157937dd747b21af2c7af4d3432386 GIT binary patch literal 3348 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 DQ5yUX literal 0 HcmV?d00001 diff --git a/tests/testdata/test_addons/package_global_config_multi_input/package/static/appIcon_2x.png b/tests/testdata/test_addons/package_global_config_multi_input/package/static/appIcon_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c638b3f159fc4047a35e86d577c49cb0234f6933 GIT binary patch literal 6738 zcma)Bby!sC+a6LH1W6HwMrs(kTV&{^Lt=mdhMHj*O36V$1OaJ8LMf4uP6?$`9h8t1 z7(i5F5NY_(-Tm!;*X|eRx=y|4zVGLLo;Ut@Pn@ygO==1@3IG5=4bjmuxwz~6JjqBe zuIAtBZeH97{7i0Y0IJ5=KVQ6%BXz9(002scpCfEWWevqD=L=qorQyv3j{ z2q&0WkT>!I4FD(wDO@~y!_ZJ*khhnQpF)r__b-IP#q-Z*5I67_1nsHJZDn8#)I^|Q zKxr{4F>!7c3Lp@ugmQ6JFwxTfgMRU*%2dWz~Dcj zeEj~%>mox?5EKali;080y+QxR^h2A#{xbQmOh2<=Bn)H%^F#QfoM9Jmo_`ZU!(IOe zou6NRS@<{FMZN!b-~Xw}MaoJSXafTUEf@+O0CUksA-sPT1_?#^!G4-l=Kj;=-&sG2 zztU8I`}m=uKF%MjUpe{Yx%`VV!N3w3QxS#2;_R!Uq}LR>};3|0rrXliQ7Yu=ER zm(|pklKNBmZ`8k(l|cVU_tzl%z3>05#Xo~e%4vY*4 z)MX{XQgRpR{Gt07^>0Cc{|5PIrT&nW|G#AaM*WAZ5en`G_knt8{T2FWNBsXv^}Dlw zk@#DfpJPqo0&>v}(4P}W1*`=6N88`<7n%y1C>RutK$#&BUMlK8*8`xjI|7aHb4MV7 znwmffaj+Cn&;aTT_xag){a5+^8|e={CD6}V`nOs8`;zdh^p}1iFxxT1SluW}i z002ffL`&T)hyZtsG9kCuUuC~#e{+03cK@^8i*I&6BEexqGQIvzRL>L0b#<|X8V?Gd zLKqsJK7VTQ{0bku+@jcEyySY?-6C^$v)>A?lTd)cpi5VsoujD37Mt2VU+f15ZrwQ! zbvrxU3g4Rd&oF;q-&S`L=sNaTUUDtRZ*1gb-)SMUvq|}CQgP23!_Hyoqe9-`xDSw6 z3A^d>$Xfovt?gES+9amwv6TS}6(hTu`=KL_G#@L~I`o7~;w8s;`Bk!eiSl%;buh$h z@7qr46N&f8iBFek4++xJ?Y(0BlC&Lb%PL&3){wsOqk6k09ZV0G7E<>R0FGFuU5u1& zfzvlG`b|vR2C!04WR!}79CJ(>PE6UVG_nlxxtD6IA9*Q!(IevBQKSKoVbJABUf`!^ zH9$fwVeUDD2|Jzb47(T%26ugga;n5k^gJ!5oX&N;^qyR+IqBj75r9m$){qLbQrt_7 zAt2$WlW4Iqrr|N{=0{9pDg1^_vzYOW6QbcE zn!QT(?4j$f_LM`+vI3qegm<-uYl7&mHUOEV1iPJBQb$rH^X21oB2C0OKIACAh`$tc z1=vuIp-I?iHDG?b=JJ8XD9?k50nlSX%(q&wAs;dIHsU^dBvm3-h*;|ZhUM9kSs2z? z-37Uik|+%A2x9fWA(5;Gclz`eW9UOh!NXQFet1$c{_>zcf{w~2nTVpUfG8(YpOp-f z7}s!KDRuQlo)WDY?^Y*ug{idh+@SHYss{0EwwlWWdFnYc#{Y*G1GOHI3Y^aS5i_b$V(42)B<7 zvk#UDEg6zh7&okF5HuRY%#tSDl);(h1@A!7CG(_+s4I2}YJx!GKGD|`t0ZDoDfV-I zYEvv)FMdN->;d=tfR-cdqH@|!OG#1D%Nm<9h`Ax|GJ@M2)|dBW=Cwdi8(5s*mdD7v zb`nV)9E9>T%#ESavZqp-nk47V+pN#ZB^af~N{kG(3~%-ln}e9VqDferhO#ruj%!&y zQftZYp^9h4$J0e#jFv9feb2^QhppCqUjFui9#~`?-oUN1-^_B;`KvFW&g3gqvsq_F zkNk+sNjCmB+86eM!fGMqI#g4u^7Xit|VLD->TE;}TNB11nh1N~qDtJpfPmJ%7yrtiQ2p;kVK_n~8@+1)P$u4KEqW%`~*?Bf~N za|Xvo-;V?l$H^$m`O?JacFk@;d$}$ZvC9!B3{qp$v>m++k+staRbF}@bR+1ayAl$5 zK$<(3LzY=cg|B4{Qaz8-?9;lf<72yHiyaSWzs0ec$+;D(q0K-X#IXp75-rCTOJK#?shjj*=qLKT&ZvNG%@(;vOD65x zyzKV~o258BFqd{=*)*uskB%X;el6pt2ouWMO(Ri=)d(3@}P zG*62-CuBuz+d2eoEzTd+ON*wvL(J&Qif%QdE$kJyYnAplRk;fcb;;tHwlC2UYNR|( zc`L+1#?y}>cxlF81-mV<=RBix^74IJ<8ahW2e&k(2ksK+r2S>^l0#ABcbmJ>zI}8! zKGhnqnD#p@BfleezzEz*xAS{r<->`-fcmU@r)eSU`cg|$CxN0?bX?ImID$2u7q3@C z%llA86dV$rqdQKbm13NbF_5J`%$nB>wB$D&iu=T4V%s>2(G(PIH&ph@yNt|uK zaa@0p=45Zp%69EFq4^*-g9eVU7o!|1$F;ScSv?Pl=gZ)T@XzbQ>^Yi}4fQ^3pQ5iC zzzld?2bGOm>C9y{`|?VHb8p%%o1|M4d|@}ryBz*mcm0ic*OYs;c<4ddl_)D2O3#Sn zggy|&?lX05MR7bk>Szg)<)pje$yVIvdo3-5_H>(CI_yEC+5pI z*<8?;$61hPcGeKzG%Q+~-)&ay$jY$ITJ(l$E8V}6cJP~QsP3y4sVRXZ)#E^XY|^|y zlFI2MRuy@m>pbCBVmoLLmy5Lv7g!;Mxi2-}n*0v8I^E(aF&}13=xd~rT?)a^Bm>bIK#Gaui*BaTasrwW*Mnz}-n)MuV+++0;Rn6v##d8c{~R zIs}-xRb#z5^Mk~?vDtL6u;#M${Ot#Qbo9++-(Zx*WmPw3UO0~I8+G#7;iR!9{<*V+ z@(9j5=00t{v1XPZFo+tn7@=ZP+{SaZ>6e=p4Wu?OAYB?`ZaH1lX6C}3r5UV!Xs4IM zZfH-fME1S@YQf?oWI>LlSE|6(+jK;FPud0|Y4-;_x0Hp?Dr)Ks$9qG8D?NAcM(2B$wbk|7 z9L>AXGTUYyOUaC8?k4mC4pZm3rH7{loy2{$Ixd(!EDzL!$YHE9v}e~NJ=4o8f}Aw? z>7A{ldS0)vjC=q&??55E3?Ik3>^SWCotF!3O83s!s!CTDZz2YjXE;*$Mu%M>;}Y<) zX6r{x^+Tmi^My=>BY8TKY zNrJgI^>F>x+x3Ez{h2odv`OuelB3+y=u;+mmBYw~NIVZZbWO>`>xxkNhzf1?lBvdbzGzM^icu3UV<*@NJ3CT zM}nl_VCPemgm?(#%LhsiKv-O7Vg1#mb z)bhk-j$j0G!_mV!E@l{4nVK|Q#@S9JYdA1i!+^E*iwfDLG!j-bYR3~De%w?|7yXbs z1yxPMtI>)Cm-Y0I8gzy1QAO5sv@+91D!r(e^?wdZ>ea?QI8{y8(+s7v68dr*k<$CX z8*4nn+f@HG*);TKjWeILTGhrZ@J)wl(ziCtD8*6;p!wL2V`I|V(p)6%!Ccc2&vAb8 zrAHR<6GtM;JAnD!&38?()B6uvhioTi#RRy*CuiotWg}7*vdwNqZs600(Bq2&@qF6-4D*cjYT$UkZOGI--U+ z)l31JLHv<7_QQO6l>N&P`;N2s0WIQOs4HvF)>O{x343x~cN+o+ctA_Q;7tPS`HAaS zEqqcC=AA+?WJ}CP?QcfWug{*59(rGG`XUxMQ*sTj-VY@{A;s}IlQF$FwH7|F*+RJV z;y<8vABkdXiu5?n9=sS*&J45Nr~x)mj&A-q>abkt4eS&iz3d$PkyA{=MM7MMgCqNO zfp00s<2GJEbX|BdiZ4*kDJnLb)M+EvPl=W_>WW!Q*FUiTL_@u#X%2IT>{lv#eZ#nKewBIH)xoHy^ zAF@sRpMZl`1yoJKLEU3huYT;vs^3IPNr_r7e;!L&hTTGMwdT*9KP)yZO#;&~YQor8a z0L;4^tnFD;8eA#z>{0FtPLc+NGr7n8eE4j!MW4 ze|G-kPaT=CQ*7J!M480FPTv)h?VB}p|{n%;x1EP zN725T(AbxokY{EVjovBP6qJ0>h8qh0U8>@xS)j>TvS~P}QeH~2Cz}?5LI*QIz7s_q z?fW8|J=L$~G);gSrrazkiseysHWO0h3ax2!VTo-$au?l{o)iC^{5|Pf$`h?ldk0}n z^)jIrrofg{aodL__^aO)URyFUBhwwf7LZJ8e|*c4URT3o!dw>5|JgTT zmtTY}LCUm9P^q*dq_DB{iJ(!ZCIcsAp@)@SPu#NJ*Yav&e(G+Gvq>bt#G!-Wl2)H+ z9lV-$m>HZTrz6VfIYPqPALqr^i8gTKjU?ya5wX>aI18}-F*Q$VLf;Ex03JdMUpX3E zW=JmIxhB+?d#@?bp8Oy$MqT>B;^V%tu10aO#91ck3}{M-!RtZp*3Zvt9sqXf^(EIJ zIg_M$edOYZ?avAF%hj~b8iHi@&19gwuU}}19UuDoGq+Nw#$AJ&E0krLCMt|d5SvD^O0eh2q8D&o$D z2ojPc@Q(HK;#c-%L-!bCYUNhfwsWZ5#H^k{N^)E8a4JT)G4p8B2paNcenq3M*h+M< z7CWjw4+?WY*@$I~5@w|YQkjg%1xO8nC9drwS69;e>|0#!tO{C`WTrR-^q~o!QuMrj zYZqZAt1Rn?C0j{7bBe;n=T*s!=Skw~mP2lZ%^t% zb&4$#{hzq3CT`I}WEc^_t>nqE*ZURQhvqZb!!HlId>64v>`u%moNC#Sy8q)hd*O#I z@AC6Ve1Tc59h;85T+g$gd~Ie{l;GO8iD>d-DGB>{-NxQFe<<6i=H$?<$<=LzUaqCA zc6SOdl$TiIZc9x%fuS;95myaYe+5-bl=lG5n3Dtx&)3Qro-PJXxCoDwqE<~s!d3P* z8m7Nz3%#ph>r!(bEL$grqYHG8SV$REZmG|k<1_3?nXb?muPa*U`UQFC_1hPjJO&9g z=`aUUZ5{L;P*rA$V6S9V)BpvY#5JNQlZ)SCu2h_W1%GX*%+A8=m7-gQWer~8jo^8W zuNIf^4$)g1O6%_Drq%4~6v^OgPsvzU@L5^H{)xWS;0ySuSU$DA7@Z^BS=Z&R}#v$!OKCp3jM;=2oO?Jn|^wq1&6S0k0b z8tzq)cd5Bq$Yu-7A{S&8@!qEEQy(WT;CL(v6P4V+`$fGaiW@3EA#G$gvV3ELHzL-L zS<<&(TGA<6I}iVOMVbBfaAUi8lTvgrmjiST&y0Oxk#CT%6m0x~_m=H5St=6NbFbtH z*YTx#e0!!uR^Ggm{WLr;Wg1Mmdp&`Kc-TR$!^8h#$AhfM^SamxTGvIWW7Kcp1lnG{ zB5K4sz-5*9Iz%B%uj!;wB{k#%H&BdQ^tBHZ)E-I=OtI)RF|5ZCtyBgNo06i)F1En( z6Bn?eot1BRFHDr7s5K_;T@jTa0LGG%b}!eTI>qEFJUlPF@?vwtC-JNgBMyfxu1q^} zPORyn&=U!qh9(i{Edil=?o-Y3*g=UmxY-YnGnSq%h8C{Btna&ec{e8d34(*qU-%SD zxGjgUDC^+3Qg?t-h)0|ru21d}UsekamsekHdBk4$&LPT*{T_MyKr>6SB=FU3zyfa= z$OMoWD7=?Z+C755vO2zF+lp)2%U-GbEO|prosje(T>1)Smzpqvn%Cm~+xskJCxKBV zr~UKw!?#Wfpl=%hG>b)VE9}{df;xa4pgEOyf~^``ty;U?0{kyK?W(do%u(WAnEmkcM-SwNp;ncKBj&#V DQ5yUX literal 0 HcmV?d00001 From 001501a614238ec688cf3ccb50d9bd4a9b815f71 Mon Sep 17 00:00:00 2001 From: vtsvetkov-splunk <142901247+vtsvetkov-splunk@users.noreply.github.com> Date: Thu, 18 Jan 2024 11:18:58 +0100 Subject: [PATCH 05/23] chore(renovate): ignore nodejs engines updates (#1021) --- renovate.json | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/renovate.json b/renovate.json index eebeb4e27..79e694d38 100644 --- a/renovate.json +++ b/renovate.json @@ -60,7 +60,7 @@ "matchPackageNames": [ "msw-storybook-addon" ], - "dependencyDashboardApproval": true + "allowedVersions": "!/next|canary/" }, { "description": "Update package.json versions together with yarn.lock", @@ -74,7 +74,7 @@ "matchPackageNames": ["node"], "matchManagers": ["npm"], "matchDepTypes": [ "engines" ], - "dependencyDashboardApproval": true + "enabled": false } ] } From d1090aa9709bf00daed3c85f9c0cac15b3376ad1 Mon Sep 17 00:00:00 2001 From: soleksy-splunk <143183665+soleksy-splunk@users.noreply.github.com> Date: Mon, 22 Jan 2024 11:02:42 +0100 Subject: [PATCH 06/23] chore: move base form view to ts (#998) moving BaseFormView to typescript --- ui/src/components/BaseFormTypes.ts | 149 ++ ui/src/components/BaseFormView.tsx | 1288 +++++++++++++++++ .../{BaseFormView.jsx => BaseFormView3.jsx} | 15 +- .../CheckboxGroup/CheckboxGroup.stories.tsx | 3 +- .../CheckboxGroupInputPage.stories.tsx | 4 +- ui/src/components/ControlWrapper.stories.ts | 11 +- ui/src/components/ControlWrapper.tsx | 74 +- ui/src/components/DeleteModal/DeleteModal.tsx | 2 +- .../EntityModal/EntityModal.test.tsx | 3 +- ui/src/components/EntityModal/EntityModal.tsx | 6 +- ui/src/components/EntityPage.tsx | 2 +- .../FileInputComponent.stories.tsx | 3 +- ui/src/components/MarkdownMessage.tsx | 2 +- ui/src/context/TableContext.jsx | 41 - ui/src/context/TableContext.tsx | 58 + .../pages/Input/stories/InputPage.stories.tsx | 3 +- ui/src/types/components/shareableTypes.ts | 3 + ui/src/types/globalConfig/entities.ts | 51 +- ui/src/types/globalConfig/meta.ts | 2 +- ui/src/types/modules.d.ts | 1 + ui/src/types/window.d.ts | 4 + ui/src/util/axiosCallWrapper.ts | 2 +- ui/src/util/messageUtil.js | 2 +- 23 files changed, 1585 insertions(+), 144 deletions(-) create mode 100644 ui/src/components/BaseFormTypes.ts create mode 100644 ui/src/components/BaseFormView.tsx rename ui/src/components/{BaseFormView.jsx => BaseFormView3.jsx} (99%) delete mode 100644 ui/src/context/TableContext.jsx create mode 100644 ui/src/context/TableContext.tsx create mode 100644 ui/src/types/components/shareableTypes.ts create mode 100644 ui/src/types/window.d.ts diff --git a/ui/src/components/BaseFormTypes.ts b/ui/src/components/BaseFormTypes.ts new file mode 100644 index 000000000..9cc0b2ad1 --- /dev/null +++ b/ui/src/components/BaseFormTypes.ts @@ -0,0 +1,149 @@ +import { z } from 'zod'; +import { Mode } from '../constants/modes'; +import { + AcceptableFormValueOrNull, + AcceptableFormValueOrNullish, +} from '../types/components/shareableTypes'; +import { AnyOfEntity, OAuthFields } from '../types/globalConfig/entities'; +import { MarkdownMessageProps } from './MarkdownMessage'; + +export type CurrentBaseFormInput = + | Record + | Record>; + +export interface CustomHookError { + name: string; + message: string; +} + +export interface BaseFormStateData { + [x: string]: { + disabled: boolean; + error: boolean; + fileNameToDisplay?: string; + value?: AcceptableFormValueOrNullish; + display: boolean; + markdownMessage?: MarkdownMessageProps; + dependencyValues?: string; + }; +} + +export interface BaseFormProps { + currentServiceState?: Record; + serviceName: string; + mode: Mode; + page: string; + stanzaName: string; + groupName?: string; + handleFormSubmit: (isSubmitting: boolean, closeEntity: boolean) => void; +} + +export interface BaseFormState { + serviceName?: string; + mode?: Mode; + page?: string; + stanzaName?: string; + data?: BaseFormStateData; + errorMsg?: string; + warningMsg?: string; +} + +export interface SingleSelectEntityType { + field: string; + type: 'singleSelect'; + label: string; + options: { + hideClearBtn: boolean; + autoCompleteFields: { + label: string; + value: 'oauth' | 'basic'; + }[]; + }; +} + +export interface UtilBaseForm { + setState: (callback: (prevState: BaseFormState) => void) => void; + setErrorFieldMsg: (field: string, msg: string) => void; + clearAllErrorMsg: (State: BaseFormState) => unknown; + setErrorMsg: (msg: string) => void; +} + +export interface UtilControlWrapper { + handleChange: (field: string, targetValue: string) => void; + addCustomValidator: ( + field: string, + validatorFunc: (submittedField: string, submittedValue: string) => void + ) => void; + utilCustomFunctions: { + setState: (callback: (prevState: BaseFormState) => void) => void; + setErrorFieldMsg: (field: string, msg: string) => void; + clearAllErrorMsg: (State: BaseFormState) => unknown; + setErrorMsg: (msg: string) => void; + }; +} + +export interface ServiceGroup { + label: string; + fields: string[]; + options?: { isExpandable?: boolean; expand?: boolean }; +} + +export interface OauthConfiguration { + popupWidth: number; + popupHeight: number; + authTimeout: number; + authCodeEndpoint: string | null; + accessTokenEndpoint: string | null; + authEndpointAccessTokenType: string | null; +} + +export interface CustomHook { + onCreate?: () => void; + onRender?: () => void; + onEditLoad?: () => void; + onSaveSuccess?: () => void; + onSaveFail?: () => void; + onChange?: (field: string, targetValue: string, tempState: BaseFormState) => void; + onSave?: (datadict?: Record) => boolean; +} + +export type AnyEntity = z.TypeOf | z.TypeOf; + +export type OAuthEntity = z.TypeOf; + +export interface BasicEntity { + disabled: boolean; + error: boolean; + display: boolean; + value?: AcceptableFormValueOrNullish; + fileNameToDisplay?: string; +} + +export interface ChangeRecord { + display?: { $set: boolean }; + value?: { $set: string | null }; + dependencyValues?: { $set: Record }; +} + +export interface CustomHookClass { + new ( + config: unknown, + serviceName: string, + state: BaseFormState, + mode: string, + util: { + setState: (callback: (prevState: BaseFormState) => void) => void; + setErrorFieldMsg: (field: string, msg: string) => void; + clearAllErrorMsg: (State: BaseFormState) => unknown; + setErrorMsg: (msg: string) => void; + } + ): { + onCreate?: () => void; + onRender?: () => void; + onEditLoad?: () => void; + onSaveSuccess?: () => void; + onSaveFail?: () => void; + onChange?: (field: string, targetValue: string, tempState: BaseFormState) => void; + onSave?: (datadict?: Record) => boolean; + }; +} diff --git a/ui/src/components/BaseFormView.tsx b/ui/src/components/BaseFormView.tsx new file mode 100644 index 000000000..cea8e85ce --- /dev/null +++ b/ui/src/components/BaseFormView.tsx @@ -0,0 +1,1288 @@ +import React, { PureComponent } from 'react'; +import update from 'immutability-helper'; +import { v4 as uuidv4 } from 'uuid'; + +import Message from '@splunk/react-ui/Message'; + +import ControlWrapper from './ControlWrapper'; +import Validator, { SaveValidator } from '../util/Validator'; +import { getUnifiedConfigs, generateToast } from '../util/util'; +import { MODE_CLONE, MODE_CREATE, MODE_EDIT, MODE_CONFIG } from '../constants/modes'; +import { PAGE_INPUT, PAGE_CONF } from '../constants/pages'; +import { axiosCallWrapper } from '../util/axiosCallWrapper'; +import { parseErrorMsg, getFormattedMessage } from '../util/messageUtil'; +import { getBuildDirPath } from '../util/script'; + +import { + ERROR_REQUEST_TIMEOUT_TRY_AGAIN, + ERROR_REQUEST_TIMEOUT_ACCESS_TOKEN_TRY_AGAIN, + ERROR_OCCURRED_TRY_AGAIN, + ERROR_AUTH_PROCESS_TERMINATED_TRY_AGAIN, + ERROR_STATE_MISSING_TRY_AGAIN, +} from '../constants/oAuthErrorMessage'; +import TableContext from '../context/TableContext'; +import Group from './Group'; +import { + AcceptableFormValueOrNull, + AcceptableFormValueOrNullish, +} from '../types/components/shareableTypes'; +import { + CustomHookError, + BaseFormProps, + BaseFormState, + SingleSelectEntityType, + BaseFormStateData, + CurrentBaseFormInput, + UtilBaseForm, + UtilControlWrapper, + ServiceGroup, + OauthConfiguration, + CustomHook, + AnyEntity, + OAuthEntity, + BasicEntity, + ChangeRecord, + CustomHookClass, +} from './BaseFormTypes'; + +function onCustomHookError(params: { methodName: string; error?: CustomHookError }) { + // eslint-disable-next-line no-console + console.error( + `[Custom Hook] Something went wrong while calling ${params.methodName}. Error: ${params.error?.name} ${params.error?.message}` + ); +} + +class BaseFormView extends PureComponent { + static contextType = TableContext; + + context!: React.ContextType; + + flag: boolean; + + currentInput: CurrentBaseFormInput; + + appName: string; + + groupEntities: string[]; + + endpoint: string; + + util: UtilBaseForm; + + onSavePromise?: Promise; + + utilControlWrapper: UtilControlWrapper; + + groups?: ServiceGroup[]; + + entities?: AnyEntity[]; + + options?: { saveValidator?: string }; + + hookDeferred?: Promise; + + // eslint-disable-next-line camelcase + mode_config_title?: string; + + dependencyMap: Map>; + + isOAuth: boolean; + + isAuthVal: boolean; + + authMap: Record; + + isoauthState?: boolean | null; + + isSingleOauth?: boolean; + + oauthConf?: OauthConfiguration; + + datadict: Record; + + hook?: CustomHook; + + // eslint-disable-next-line camelcase + state_enabled?: boolean; + + // eslint-disable-next-line camelcase + oauth_state?: string; + + isCalled?: boolean; + + isError?: boolean; + + isResponse?: boolean; + + childWin?: Window | null; + + customWarningMessage: string; + + constructor(props: BaseFormProps, context: React.ContextType) { + super(props); + // flag for to render hook method for once + this.flag = true; + this.state = {}; + this.datadict = {}; + this.currentInput = {}; + const globalConfig = getUnifiedConfigs(); + this.appName = globalConfig.meta.name; + this.groupEntities = []; + this.endpoint = + props.mode === MODE_EDIT || props.mode === MODE_CONFIG + ? `${this.props.serviceName}/${encodeURIComponent(this.props.stanzaName)}` + : `${this.props.serviceName}`; + + this.util = { + setState: (callback) => { + this.onSavePromise = new Promise((resolve) => { + this.setState( + (previousState) => callback(previousState), + () => resolve(true) + ); + }); + }, + setErrorFieldMsg: this.setErrorFieldMsg, + clearAllErrorMsg: this.clearAllErrorMsg, + setErrorMsg: this.setErrorMsg, + }; + + this.utilControlWrapper = { + handleChange: this.handleChange, + addCustomValidator: this.addCustomValidator, + utilCustomFunctions: this.util, + }; + this.customWarningMessage = ''; + + if (props.page === PAGE_INPUT) { + globalConfig.pages?.inputs?.services.forEach((service) => { + if (service.name === props.serviceName) { + this.groups = service.groups; + this.entities = service.entity; + this.updateGroupEntities(); + this.options = service.options; + if (service.hook) { + this.hookDeferred = this.loadHook( + service.hook.src, + service.hook.type, + globalConfig + ); + } + if ((props.mode === MODE_EDIT || props.mode === MODE_CLONE) && context) { + this.currentInput = + context?.rowData?.[props.serviceName]?.[props.stanzaName]; + } + if (props.mode !== 'delete') { + this.customWarningMessage = service?.warning?.[props.mode] || ''; + } + } + }); + } else { + globalConfig.pages.configuration.tabs.forEach((tab) => { + const flag = tab.table + ? tab.name === props.serviceName + : tab.name === props.stanzaName && props.serviceName === 'settings'; + + if (flag) { + this.entities = tab.entity; + this.options = tab.options; + if (props.mode !== 'delete') { + this.customWarningMessage = tab?.warning?.[props.mode] || ''; + } + if (tab.hook) { + this.hookDeferred = this.loadHook( + tab.hook.src, + tab.hook.type, + globalConfig + ); + } + + if (tab.table && (props.mode === MODE_EDIT || props.mode === MODE_CLONE)) { + if (context) { + this.currentInput = + context?.rowData?.[props.serviceName]?.[props.stanzaName]; + } + } else if (props.mode === MODE_CONFIG) { + if (props.currentServiceState) { + this.currentInput = props.currentServiceState; + } + this.mode_config_title = tab.title; + } else if (context) { + // TODO: validate if that case ever appear + this.currentInput = context?.rowData?.[props.serviceName]; + } + } + }); + } + this.dependencyMap = new Map(); + this.isOAuth = false; + this.isAuthVal = false; + this.authMap = {}; + let temState: BaseFormStateData = {}; + const temEntities: AnyEntity[] = []; + + this.entities?.forEach((e) => { + if (e.type === 'oauth') { + this.isOAuth = true; + if (props.page === PAGE_CONF && props.serviceName === 'account') { + const authType: ('basic' | 'oauth')[] = e?.options?.auth_type; + this.isoauthState = + typeof e?.options?.oauth_state_enabled !== 'undefined' + ? e?.options?.oauth_state_enabled + : null; + + if (authType.length > 1) { + this.isAuthVal = true; + // Defining state for auth_type in case of multiple Authentication + const tempEntity = { + disabled: false, + error: false, + display: true, + value: + this.currentInput?.auth_type === 'oauth' || + this.currentInput?.auth_type === 'basic' + ? this.currentInput?.auth_type + : authType[0], + }; + + temState.auth_type = tempEntity; + + const content = { + basic: 'Basic Authentication', + oauth: 'OAuth 2.0 Authentication', + }; + + // Defining Entity for auth_type in entitylist of globalConfig + const entity: SingleSelectEntityType = { + field: 'auth_type', + type: 'singleSelect', + label: 'Auth Type', + options: { + hideClearBtn: true, + autoCompleteFields: authType.map((type) => ({ + label: content[type], + value: type, + })), + }, + }; + + temEntities.push(entity); + } else { + this.isSingleOauth = authType.includes('oauth'); + } + + // Adding State and Entity(in entitylist) for every Fields of "oauth" type + // Iterating over everytype of Authentication under "oauth" type + authType?.forEach((type) => { + const authfields: string[] = []; + const fields = e?.options[type]; + if (fields) { + // For Particaular type iterating over fields + fields.forEach((field: OAuthEntity) => { + if (!field) { + return; + } + // every field for auth type + const tempEntity: BasicEntity = { + disabled: field?.options?.enable === false, + error: false, + display: temState?.auth_type + ? type === temState?.auth_type?.value + : true, + }; + + if (props.mode === MODE_CREATE) { + tempEntity.value = + typeof field?.defaultValue !== 'undefined' + ? field.defaultValue + : undefined; + } else { + const isEncrypted = field?.encrypted || false; + tempEntity.value = !isEncrypted + ? this.currentInput?.[field.field] + : ''; + } + + if (props.mode === MODE_EDIT) { + // .disableonEdit = false do not overwrite .disabled = true + tempEntity.disabled = + field?.options?.disableonEdit === true || + tempEntity.disabled; + } + + temState[field.field] = tempEntity; + // eslint-disable-next-line no-param-reassign + field.type = field?.type || 'text'; + + // Handled special case for redirect_url + if (field.field === 'redirect_url') { + tempEntity.value = window.location.href + .split('?')[0] + .replace( + 'configuration', + `${this.appName.toLowerCase()}_redirect` + ); + tempEntity.disabled = true; + } + + // TODO: why field is pushed isntead of tempEntity + // TODO: why temp entity is created at all + temEntities.push(field); + authfields?.push(field.field); + }); + this.authMap[type] = authfields; + } + }); + if (authType.includes('oauth')) { + // Storing O-Auth Configuration data to class variable to use later + + const oauthConfData = { + popupWidth: e?.options?.oauth_popup_width || 600, + popupHeight: e?.options?.oauth_popup_height || 600, + authTimeout: e?.options?.oauth_timeout || 180, + authCodeEndpoint: e?.options?.auth_code_endpoint || null, + accessTokenEndpoint: e?.options?.access_token_endpoint || null, + authEndpointAccessTokenType: + e?.options?.auth_endpoint_token_access_type || null, + }; + + this.oauthConf = oauthConfData; + } + } + } else { + const tempEntity: BasicEntity = { + disabled: false, + error: false, + display: true, + }; + + if (e.type !== 'helpLink' && e.type !== 'custom') { + e.encrypted = e?.encrypted || false; + + if (e.type === 'file' && this.currentInput?.[e.field]) { + /* + adding example name to enable possibility of removal file, + not forcing value addition as if value is encrypted it is shared as + string ie. ***** and it is considered a valid default value + if value is not encrypted it is pushed correctly along with this name + */ + tempEntity.fileNameToDisplay = 'Previous File'; + } + if (props.mode === MODE_CREATE) { + tempEntity.value = + typeof e.defaultValue !== 'undefined' ? e?.defaultValue : null; + tempEntity.display = + typeof e?.options?.display !== 'undefined' ? e.options.display : true; + tempEntity.error = false; + tempEntity.disabled = e?.options?.enable === false; + temState[e.field] = tempEntity; + } else if (props.mode === MODE_EDIT) { + tempEntity.value = + typeof this.currentInput?.[e.field] !== 'undefined' + ? this.currentInput?.[e.field] + : null; + tempEntity.value = e.encrypted ? '' : tempEntity.value; + tempEntity.display = + typeof e?.options?.display !== 'undefined' ? e.options.display : true; + tempEntity.error = false; + tempEntity.disabled = e?.options?.enable === false; + if (e.field === 'name') { + tempEntity.disabled = true; + } else if (typeof e?.options?.disableonEdit !== 'undefined') { + tempEntity.disabled = e.options.disableonEdit; + } + temState[e.field] = tempEntity; + } else if (props.mode === MODE_CLONE) { + tempEntity.value = + e.field === 'name' || e.encrypted ? '' : this.currentInput?.[e.field]; + tempEntity.display = + typeof e?.options?.display !== 'undefined' ? e.options.display : true; + tempEntity.error = false; + tempEntity.disabled = e?.options?.enable === false; + temState[e.field] = tempEntity; + } else if (props.mode === MODE_CONFIG) { + e.defaultValue = + typeof e.defaultValue !== 'undefined' ? e.defaultValue : undefined; + tempEntity.value = + typeof this.currentInput?.[e.field] !== 'undefined' + ? this.currentInput?.[e.field] + : e.defaultValue; + tempEntity.value = e.encrypted ? '' : tempEntity.value; + tempEntity.display = + typeof e?.options?.display !== 'undefined' ? e.options.display : true; + tempEntity.error = false; + tempEntity.disabled = e?.options?.enable === false; + if (e.field === 'name') { + tempEntity.disabled = true; + } else if (typeof e?.options?.disableonEdit !== 'undefined') { + tempEntity.disabled = e.options.disableonEdit; + } + temState[e.field] = tempEntity; + } else { + throw new Error(`Invalid mode : ${props.mode}`); + } + } else { + // TODO extract if before this if else block + temState[e.field] = tempEntity; + } + + // handle dependent fields + if (e.type === 'singleSelect' || e.type === 'multipleSelect') { + const fieldsDependedOn = e.options?.dependencies; + if (fieldsDependedOn) { + fieldsDependedOn.forEach((field: string) => { + const changeFields = this.dependencyMap.get(field); + if (changeFields && typeof e.field === 'string') { + changeFields[e.field] = fieldsDependedOn; + } else { + this.dependencyMap.set(field, { + [e.field]: fieldsDependedOn, + }); + } + }); + } + } + + temEntities.push(e); + } + }); + + this.entities = temEntities; + + // flatten the dependencyMap to remove redundant iterations for resolving them + // one-by-one in following loop + let flattenedMap: Record = {}; + this.dependencyMap.forEach((value) => { + flattenedMap = { ...flattenedMap, ...value }; + }); + + const changes: Record< + string, + { + dependencyValues: { + $set: Record; + }; + } + > = {}; + Object.keys(flattenedMap).forEach((field) => { + const values = flattenedMap[field]; + const data: Record = {}; + let load = true; + + values.forEach((dependency) => { + const required = !!this.entities?.find((e) => e.field === dependency)?.required; + + const currentValue = temState[dependency]?.value; + if (required && !currentValue) { + load = false; + data[dependency] = null; + } else { + data[dependency] = currentValue; + } + }); + + if (load) { + changes[field] = { + dependencyValues: { $set: data }, + }; + } + }); + + // apply dependency field changes in state + // @ts-expect-error variable changes should have property '$apply' + temState = update(temState, changes); + this.state = { + data: temState, + errorMsg: '', + warningMsg: this.customWarningMessage, + }; + + // Hook on create method call + if (this.hookDeferred) { + this.hookDeferred.then(() => { + if (typeof this.hook?.onCreate === 'function') { + try { + this.hook.onCreate(); + } catch (error) { + const errorInCorrecttype = error as CustomHookError; + onCustomHookError({ methodName: 'onCreate', error: errorInCorrecttype }); + } + } + }); + } + } + + updateGroupEntities = () => { + if (this.groups) { + this.groups.forEach((group) => { + group.fields.forEach((fieldName) => this.groupEntities.push(fieldName)); + }); + } + }; + + // eslint-disable-next-line react/no-unused-class-component-methods + handleSubmit = () => { + this.clearErrorMsg(); + this.props.handleFormSubmit(/* isSubmitting */ true, /* closeEntity */ false); + + this.datadict = {}; + + Object.keys(this.state.data || {}).forEach((field) => { + if (this.datadict) { + this.datadict[field] = this.state?.data?.[field].value; + } + }); + + if (this.hook && typeof this.hook.onSave === 'function') { + const validationPass = this.hook.onSave(this.datadict); + if (!validationPass) { + this.props.handleFormSubmit(/* isSubmitting */ false, /* closeEntity */ false); + return; + } + } + const executeValidationSubmit = () => { + Object.keys(this.state.data || {}).forEach((field) => { + this.datadict[field] = this.state?.data?.[field].value; + }); + + // validation for unique name + if ([MODE_CREATE, MODE_CLONE].includes(this.props.mode)) { + const isExistingName = Boolean( + Object.values(this.context?.rowData || {}).find((val) => + Object.keys(val).find((name) => name === this.datadict.name) + ) + ); + + if (isExistingName && this.entities) { + const index = this.entities.findIndex((e) => e.field === 'name'); + if (index !== -1) { + const entityLabel = this.entities?.[index].label; + const nameFromDict = this.datadict.name; + + if (entityLabel && nameFromDict && typeof nameFromDict !== 'object') { + this.setErrorFieldMsg( + 'name', + getFormattedMessage(2, [entityLabel, nameFromDict]) + ); + } + } + + this.props.handleFormSubmit(/* isSubmitting */ false, /* closeEntity */ false); + return; + } + } + + // validation condition of required fields in O-Auth + let temEntities; + if (this.isOAuth) { + let reqFields: string[] = []; + Object.keys(this.authMap).forEach((type) => { + // `isAuthVal` is required in a case where only single auth type is provided + if (type === this.datadict.auth_type || !this.isAuthVal) { + reqFields = [...reqFields, ...this.authMap[type]]; + } + }); + temEntities = this.entities?.map((e) => { + if (reqFields.includes(e.field)) { + // All oauth fields are required except if explicitely `required` is set to `false` + return { required: true, ...e }; + } + return e; + }); + } else { + temEntities = this.entities; + } + + // require elements for UI when they are visible + temEntities = temEntities?.map((entity) => { + if ( + entity?.type !== 'helpLink' && + entity?.type !== 'oauth' && + entity?.type !== 'custom' && + entity?.options?.requiredWhenVisible && + this?.state?.data?.[entity.field].display + ) { + return { required: true, ...entity }; + } + return entity; + }); + + // Validation of form fields on Submit + const validator = new Validator(temEntities); + let error: + | boolean + | { + errorField?: string; // TODO add typescript to validation and remove those assertions + errorMsg?: string; + } = validator.doValidation(this.datadict); + if (error) { + const errorWithCorretType = error as { + errorField?: string; + errorMsg?: string; + }; + this.setErrorFieldMsg( + errorWithCorretType?.errorField || '', + errorWithCorretType?.errorMsg || '' + ); + } else if (this.options && this.options.saveValidator) { + error = SaveValidator(this.options.saveValidator, this.datadict) as { + errorField?: string; + errorMsg?: string; + }; + if (error) { + this.setErrorMsg(error.errorMsg || ''); + } + } + + if (error) { + this.props.handleFormSubmit(false, false); + } else if ( + this.isOAuth && + (this.isSingleOauth || (this.isAuthVal && this.datadict.auth_type === 'oauth')) + ) { + // handle oauth Authentication + // Populate the parameter string with client_id, redirect_url and response_type + let parameters = `?response_type=code&client_id=${this.datadict.client_id}&redirect_uri=${this.datadict.redirect_url}`; + // Get the value for state_enabled + const stateEnabled = this.isoauthState != null ? this.isoauthState : false; + if (stateEnabled === true) { + this.state_enabled = true; + // Generating a cryptographically strong state parameter, which will be used ONLY during configuration + this.oauth_state = uuidv4().replace(/-/g, ''); + + // Appending the state in the headers + parameters = `${parameters}&state=${this.oauth_state}`; + } + + if (this.datadict.scope) { + parameters = `${parameters}&scope=${this.datadict.scope}`; + } + + if (this.oauthConf?.authEndpointAccessTokenType) { + parameters = `${parameters}&token_access_type=${this.oauthConf.authEndpointAccessTokenType}`; + } + + let host = encodeURI( + `https://${this.datadict.endpoint}${this.oauthConf?.authCodeEndpoint}${parameters}` + ); + const redirectURI = new URLSearchParams(host).get('redirect_uri'); + if (redirectURI) { + host = host.replace(redirectURI, encodeURIComponent(redirectURI)); + } + + (async () => { + this.isCalled = false; + this.isError = false; + this.isResponse = false; + // Get auth_type element from global config json + + // Open a popup to make auth request + this.childWin = window.open( + host, + `${this.appName} OAuth`, + `width=${this.oauthConf?.popupWidth}, height=${this.oauthConf?.popupHeight}` + ); + // Callback to receive data from redirect url + window.getMessage = (message) => { + this.isCalled = true; + // On Call back with Auth code this method will be called. + this.handleOauthToken(message); + }; + // Wait till we get auth_code from calling site through redirect url, we will wait for 3 mins + await this.waitForAuthentication(this.oauthConf?.authTimeout || 0); + + if (!this.isCalled && this.childWin?.closed) { + // Add error message if the user has close the authentication window without taking any action + this.setErrorMsg(ERROR_AUTH_PROCESS_TERMINATED_TRY_AGAIN); + this.props.handleFormSubmit(false, false); + return false; + } + + if (!this.isCalled) { + // Add timeout error message + this.setErrorMsg(ERROR_REQUEST_TIMEOUT_TRY_AGAIN); + this.props.handleFormSubmit(false, false); + return false; + } + + // Reset called flag as we have to wait till we get the access_token, refresh_token and instance_url + // Wait till we get the response, here we have added wait for 30 secs + await this.waitForBackendResponse(30); + + if (!this.isResponse && !this.isError) { + // Set error message to prevent saving. + this.isError = true; + + // Add timeout error message + this.setErrorMsg(ERROR_REQUEST_TIMEOUT_ACCESS_TOKEN_TRY_AGAIN); + this.props.handleFormSubmit( + /* isSubmitting */ false, + /* closeEntity */ false + ); + return false; + } + return true; + })().then(() => { + if (!this.isError) { + this.saveData(); + } else { + this.props.handleFormSubmit( + /* isSubmitting */ false, + /* closeEntity */ false + ); + } + }); + } else { + this.saveData(); + } + }; + if ( + this.hook && + typeof this.hook.onSave === 'function' && + typeof this.onSavePromise !== 'undefined' + ) { + this.onSavePromise.then(() => { + executeValidationSubmit(); + }); + } else { + executeValidationSubmit(); + } + }; + + saveData = () => { + const body = new URLSearchParams(); + Object.keys(this.datadict).forEach((key) => { + if (this.datadict[key] != null) { + // Custom logic for only sending file content in payload, not file name and file size. + if ( + typeof this.datadict[key] === 'object' && + this.entities?.find((x) => x?.field === key)?.type === 'file' + ) { + const { fileContent } = this.datadict?.[key] as { fileContent: string }; + body.append(key, fileContent); + } else if (this.datadict) { + body.append(key, String(this.datadict[key])); + } + } + }); + + // clear out fields of other authentication methods when using one + if (this.isAuthVal) { + Object.keys(this.authMap).forEach((type) => { + if (this.datadict.auth_type !== type) { + this.authMap[type].forEach((e) => { + body.set(e, ''); + }); + } + }); + } + + if (this.isOAuth) { + // Prevent passing redirect_url field used in OAuth to backend conf file + body.delete('redirect_url'); + } + if (this.props.mode === MODE_EDIT) { + body.delete('name'); + } + + axiosCallWrapper({ + serviceName: this.endpoint, + body, + customHeaders: { 'Content-Type': 'application/x-www-form-urlencoded' }, + method: 'post', + handleError: false, + }) + .then((response) => { + const val = response?.data?.entry[0]; + if (this.props.mode !== MODE_CONFIG) { + const tmpObj: Record> = {}; + + tmpObj[val.name] = { + // ADDON-38581: `datadict` provides fallback values if rh skips + ...this.datadict, + ...val.content, + id: val.id, + name: val.name, + serviceName: this.props.serviceName, + }; + + this.context?.setRowData( + update(this.context?.rowData, { + [this.props.serviceName]: { $merge: tmpObj }, + }) + ); + } + if (typeof this.hook?.onSaveSuccess === 'function') { + this.hook.onSaveSuccess(); + } + if (this.props.mode === MODE_EDIT) { + generateToast(`Updated "${val.name}"`, 'success'); + } else if (this.props.mode === MODE_CONFIG) { + generateToast( + `Updated "${this.mode_config_title ? this.mode_config_title : val.name}"`, + 'success' + ); + } else { + generateToast(`Created "${val.name}"`, 'success'); + } + this.props.handleFormSubmit(false, true); + }) + .catch((err) => { + const errorSubmitMsg = parseErrorMsg(err); + this.setState({ errorMsg: errorSubmitMsg }); + if (this.hook && typeof this.hook.onSaveFail === 'function') { + this.hook.onSaveFail(); + } + this.props.handleFormSubmit(false, false); + }); + }; + + handleChange = (field: string, targetValue: string) => { + this.setState((prevState) => { + const changes: Record = {}; + + if (field === 'auth_type') { + Object.keys(this.authMap).forEach((type) => { + if (type === targetValue) { + this.authMap[type].forEach((e) => { + // displaying correct oauth fields + changes[e] = { display: { $set: true } }; + }); + } else { + // hide other oauth fields + this.authMap[type].forEach((e) => { + changes[e] = { display: { $set: false } }; + }); + // TODO: extract this forEach and apply type === targetValue instead of direct boolean + } + }); + } + + if (this.dependencyMap.has(field)) { + const value = this.dependencyMap.get(field); + Object.keys(value || {}).forEach((loadField) => { + const data: Record = {}; + let load = true; + + value?.[loadField].forEach((dependency) => { + const required = !!this.entities?.find((e) => e.field === dependency) + ?.required; + + const currentValue = + dependency === field + ? targetValue + : prevState?.data?.[dependency]?.value; + if (required && !currentValue) { + load = false; + data[dependency] = null; + } else { + data[dependency] = currentValue; + } + }); + + if (load) { + changes[loadField] = { + dependencyValues: { $set: data }, + value: { $set: null }, + }; + } + }); + } + + changes[field] = { value: { $set: targetValue } }; + + // @ts-expect-error variable changes should have property '$apply' + const newFields = update(prevState, { data: changes }); + const tempState = this.clearAllErrorMsg(newFields); + + if (this.hookDeferred) { + this.hookDeferred.then(() => { + if (typeof this.hook?.onChange === 'function' && tempState) { + this.hook.onChange(field, targetValue, tempState); + } + }); + } + + return tempState; + }); + }; + + addCustomValidator = ( + field: string, + validatorFunc: (submittedField: string, submittedValue: string) => void + ) => { + const index = this.entities?.findIndex((x) => x.field === field); + const validator = [{ type: 'custom', validatorFunc }]; + if (index && this.entities?.[index]) { + // here the validators already exist for entities so new type is created here + // @ts-expect-error todo create a generalized type to also consider it + this.entities[index].validators = validator; + } + }; + + // Set error message to display and set error in perticular field + setErrorFieldMsg = (field: string, msg: string) => { + this.setState((previousState) => { + const newFields = update(previousState, { + data: { [field]: { error: { $set: true } } }, + }); + return { ...newFields, errorMsg: msg }; + }); + }; + + // Set error in perticular field + setErrorField = (field: string) => { + this.setState((previousState) => + update(previousState, { data: { [field]: { error: { $set: true } } } }) + ); + }; + + // Clear error message + clearErrorMsg = () => { + if (this.state.errorMsg) { + this.setState((previousState) => ({ ...previousState, errorMsg: '' })); + } + }; + + // Set error message + setErrorMsg = (msg: string) => { + this.setState((previousState) => ({ ...previousState, errorMsg: msg })); + }; + + // Clear error/warning message and errors from fields + clearAllErrorMsg = (State: BaseFormState) => { + const newFields = State ? { ...State } : { ...this.state }; + newFields.errorMsg = ''; + newFields.warningMsg = this.customWarningMessage || ''; + const newData: BaseFormStateData = State ? { ...State.data } : { ...this.state.data }; + const temData: BaseFormStateData = {}; + Object.keys(newData).forEach((key) => { + if (newData[key].error) { + temData[key] = { ...newData[key], error: false }; + } else { + temData[key] = newData[key]; + } + }); + newFields.data = temData; + return State ? newFields : null; + }; + + // Display error message + generateErrorMessage = () => { + if (this.state.errorMsg) { + return ( + + {this.state.errorMsg} + + ); + } + return null; + }; + + generateWarningMessage = () => { + if (this.state.warningMsg) { + return ( + + {this.state.warningMsg} + + ); + } + return null; + }; + + // generatesubmitMessage + loadHook = (module: string, type: string, globalConfig: unknown) => { + const myPromise = new Promise((resolve) => { + if (type === 'external') { + import(/* webpackIgnore: true */ `${getBuildDirPath()}/custom/${module}.js`).then( + (external) => { + const Hook = external.default; + this.hook = new Hook( + globalConfig, + this.props.serviceName, + this.state, + this.props.mode, + this.util, + this.props.groupName + ); + resolve(Hook); + } + ); + } else { + // @ts-expect-error should be exported to other js module and imported here + __non_webpack_require__( + [`app/${this.appName}/js/build/custom/${module}`], + (Hook: CustomHookClass) => { + this.hook = new Hook( + globalConfig, + this.props.serviceName, + this.state, + this.props.mode, + this.util + ); + resolve(Hook); + } + ); + } + }); + return myPromise; + }; + + /* + * Function to get access token, refresh token and instance url + * using rest call once oauth code received from child window + */ + // eslint-disable-next-line consistent-return + handleOauthToken = (message: { code: string; error: unknown; state: unknown }) => { + // Check message for error. If error show error message. + if (!message || (message && message.error) || message.code === undefined) { + this.setErrorMsg(ERROR_OCCURRED_TRY_AGAIN); + this.isError = true; + this.isResponse = true; + return false; + } + const stateResponse = message.state; + + if (this.state_enabled === true && this.oauth_state !== stateResponse) { + this.setErrorMsg(ERROR_STATE_MISSING_TRY_AGAIN); + this.isError = true; + this.isResponse = true; + return false; + } + + const code = decodeURIComponent(message.code); + const data: Record = { + method: 'POST', + url: `https://${this.datadict.endpoint}${this.oauthConf?.accessTokenEndpoint}`, + grant_type: 'authorization_code', + client_id: this.datadict.client_id, + client_secret: this.datadict.client_secret, + code, + redirect_uri: this.datadict.redirect_url, + }; + + if (this.datadict.scope) { + data.scope = this.datadict.scope; + } + + const body = new URLSearchParams(); + Object.keys(data).forEach((key) => { + const value = data[key]; + if (value) { + body.append(key, String(value)); + } + }); + + const OAuthEndpoint = `${this.appName}_oauth/oauth`; + // Internal handler call to get the access token and other values + axiosCallWrapper({ + endpointUrl: OAuthEndpoint, + body, + customHeaders: { 'Content-Type': 'application/x-www-form-urlencoded' }, + method: 'post', + handleError: false, + }) + .then((response) => { + if (response.data.entry[0].content.error === undefined) { + const accessToken = response.data.entry[0].content.access_token; + const instanceUrl = response.data.entry[0].content.instance_url; + const refreshToken = response.data.entry[0].content.refresh_token; + // TODO refactor those variables + this.datadict.instance_url = instanceUrl; + this.datadict.refresh_token = refreshToken; + this.datadict.access_token = accessToken; + this.isResponse = true; + return true; + } + this.setErrorMsg(response.data.entry[0].content.error); + this.isError = true; + this.isResponse = true; + return false; + }) + .catch(() => { + this.setErrorMsg(ERROR_OCCURRED_TRY_AGAIN); + this.isError = true; + this.isResponse = true; + return false; + }); + }; + + // Function to wait for authentication call back in child window. + // eslint-disable-next-line consistent-return + waitForAuthentication = async (count: number) => { + // eslint-disable-next-line no-param-reassign + count -= 1; + // Check if callback function called if called then exit from wait + if (this.isCalled === true) { + return true; + } + // If callback function is not called and count is not reached to 180 then return error for timeout + if (count === 0 || this.childWin?.closed) { + this.isError = true; + return false; + } + // else call sleep and recall the same function + await this.sleep(this.waitForAuthentication, count); + }; + + // Function to wait for backend call get response from backend + + // eslint-disable-next-line consistent-return + waitForBackendResponse = async (count: number) => { + // eslint-disable-next-line no-param-reassign + count += 1; + // Check if callback function called if called then exit from wait + if (this.isResponse === true) { + return true; + } + // If callback function is not called and count is not reached to 60 then return error for timeout + if (count === 60) { + return false; + } + // else call sleep and recall the same function + await this.sleep(this.waitForBackendResponse, count); + }; + + /* + * This function first add sleep for 1 secs and the call the function passed in argument + */ + sleep = async (fn: (...someArgs: number[]) => unknown, ...args: number[]) => { + await this.timeout(1000); + return fn(...args); + }; + + /* + * This function will resolve the promise once the provided timeout occurs + */ + // eslint-disable-next-line class-methods-use-this + timeout = (ms: number) => new Promise((resolve) => setTimeout(resolve, ms)); // eslint-disable-line no-promise-executor-return + + renderGroupElements = () => { + let el = null; + if (this.groups && this.groups.length) { + el = this.groups.map((group) => { + const collapsibleElement = + group.fields?.length && + group.fields.map((fieldName) => + this.entities?.map((e) => { + if (e.field === fieldName) { + const temState = this.state?.data?.[e.field]; + return ( + + ); + } + return null; + }) + ); + + return ( + + {collapsibleElement} + + ); + }); + } + return el; + }; + + render() { + // onRender method of Hook + if (this.flag) { + if (this.hookDeferred) { + this.hookDeferred.then(() => { + if (typeof this.hook?.onRender === 'function') { + try { + this.hook.onRender(); + } catch (error) { + const errorInCorrecttype = error as CustomHookError; + onCustomHookError({ + methodName: 'onRender', + error: errorInCorrecttype, + }); + } + } + }); + } + + if (this.props.mode === MODE_EDIT) { + if (this.hookDeferred) { + this.hookDeferred.then(() => { + if (typeof this.hook?.onEditLoad === 'function') { + try { + this.hook.onEditLoad(); + } catch (error) { + const errorInCorrecttype = error as CustomHookError; + onCustomHookError({ + methodName: 'onEditLoad', + error: errorInCorrecttype, + }); + } + } + }); + } + } + this.flag = false; + } + return ( +
+
+ {this.generateWarningMessage()} + {this.generateErrorMessage()} + {this.entities?.map((e) => { + // Return null if we need to show element in a group + if (this.groupEntities.includes(e.field)) { + return null; + } + + const temState = this.state?.data?.[e.field]; + + if (!temState) { + return null; + } + + return ( + + ); + })} + {this.renderGroupElements()} + +
+ ); + } +} + +export default BaseFormView; diff --git a/ui/src/components/BaseFormView.jsx b/ui/src/components/BaseFormView3.jsx similarity index 99% rename from ui/src/components/BaseFormView.jsx rename to ui/src/components/BaseFormView3.jsx index 8c8021f3a..632c7548b 100644 --- a/ui/src/components/BaseFormView.jsx +++ b/ui/src/components/BaseFormView3.jsx @@ -92,6 +92,7 @@ class BaseFormView extends PureComponent { const flag = tab.table ? tab.name === props.serviceName : tab.name === props.stanzaName && props.serviceName === 'settings'; + if (flag) { this.entities = tab.entity; this.options = tab.options; @@ -103,6 +104,7 @@ class BaseFormView extends PureComponent { globalConfig ); } + if (tab.table && (props.mode === MODE_EDIT || props.mode === MODE_CLONE)) { this.currentInput = context?.rowData?.[props.serviceName]?.[props.stanzaName]; @@ -140,6 +142,7 @@ class BaseFormView extends PureComponent { typeof this.currentInput?.auth_type !== 'undefined' ? this.currentInput?.auth_type : authType[0]; + tempEntity.display = true; tempEntity.error = false; tempEntity.disabled = false; @@ -190,6 +193,7 @@ class BaseFormView extends PureComponent { ? '' : this.currentInput?.[field.field]; } + tempEntity.display = typeof temState.auth_type !== 'undefined' ? type === temState.auth_type.value @@ -220,6 +224,7 @@ class BaseFormView extends PureComponent { ); tempEntity.disabled = true; } + temEntities.push(field); authfields.push(field.field); }); @@ -352,9 +357,9 @@ class BaseFormView extends PureComponent { let load = true; values.forEach((dependency) => { - const required = !!this.entities.find((e) => e.field === dependency).required; + const required = !!this.entities.find((e) => e.field === dependency)?.required; - const currentValue = temState[dependency].value; + const currentValue = temState[dependency]?.value; if (required && !currentValue) { load = false; data[dependency] = null; @@ -426,7 +431,7 @@ class BaseFormView extends PureComponent { // validation for unique name if ([MODE_CREATE, MODE_CLONE].includes(this.props.mode)) { const isExistingName = Boolean( - Object.values(this.context?.rowData).find((val) => + Object.values(this.context?.rowData || {}).find((val) => Object.keys(val).find((name) => name === this.datadict.name) ) ); @@ -714,10 +719,10 @@ class BaseFormView extends PureComponent { value[loadField].forEach((dependency) => { const required = !!this.entities.find((e) => e.field === dependency) - .required; + ?.required; const currentValue = - dependency === field ? targetValue : prevState.data[dependency].value; + dependency === field ? targetValue : prevState.data[dependency]?.value; if (required && !currentValue) { load = false; data[dependency] = null; diff --git a/ui/src/components/CheckboxGroup/CheckboxGroup.stories.tsx b/ui/src/components/CheckboxGroup/CheckboxGroup.stories.tsx index d480c5a15..09a5c9eb3 100644 --- a/ui/src/components/CheckboxGroup/CheckboxGroup.stories.tsx +++ b/ui/src/components/CheckboxGroup/CheckboxGroup.stories.tsx @@ -1,12 +1,11 @@ import type { Meta, StoryObj } from '@storybook/react'; -import BaseFormView from '../BaseFormView'; import CheckboxGroup from './CheckboxGroup'; import { MODE_CREATE, MODE_EDIT } from '../../constants/modes'; const meta = { component: CheckboxGroup, title: 'Components/CheckboxGroup', -} satisfies Meta; +} satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/src/components/CheckboxGroup/CheckboxGroupInputPage.stories.tsx b/ui/src/components/CheckboxGroup/CheckboxGroupInputPage.stories.tsx index ba9f443f7..1dffa8bbe 100644 --- a/ui/src/components/CheckboxGroup/CheckboxGroupInputPage.stories.tsx +++ b/ui/src/components/CheckboxGroup/CheckboxGroupInputPage.stories.tsx @@ -28,9 +28,9 @@ const meta = { const newInputBtn = canvas.getByRole('button', { name: 'Create New Input' }); await userEvent.click(newInputBtn); }, -} satisfies Meta; +} satisfies Meta; export default meta; -type Story = StoryObj; +type Story = StoryObj; export const InputPageView: Story = {}; diff --git a/ui/src/components/ControlWrapper.stories.ts b/ui/src/components/ControlWrapper.stories.ts index 29784cccf..419bcd7f3 100644 --- a/ui/src/components/ControlWrapper.stories.ts +++ b/ui/src/components/ControlWrapper.stories.ts @@ -12,7 +12,14 @@ type Story = StoryObj; export const Base: Story = { args: { utilityFuncts: { - utilCustomFunctions: {}, + utilCustomFunctions: { + setState: () => {}, + setErrorFieldMsg: () => {}, + clearAllErrorMsg: () => {}, + setErrorMsg: () => {}, + }, + handleChange: () => {}, + addCustomValidator: () => {}, }, value: '', display: true, @@ -28,7 +35,7 @@ export const Base: Story = { }, encrypted: true, required: true, - defaultValue: null, + defaultValue: undefined, }, serviceName: 'settings', mode: 'config', diff --git a/ui/src/components/ControlWrapper.tsx b/ui/src/components/ControlWrapper.tsx index 46259be5d..c3ee6925b 100644 --- a/ui/src/components/ControlWrapper.tsx +++ b/ui/src/components/ControlWrapper.tsx @@ -1,9 +1,10 @@ import React from 'react'; import ControlGroup from '@splunk/react-ui/ControlGroup'; import styled from 'styled-components'; - -import MarkdownMessage from './MarkdownMessage'; +import MarkdownMessage, { MarkdownMessageProps } from './MarkdownMessage'; import CONTROL_TYPE_MAP, { ComponentTypes } from '../constants/ControlTypeMap'; +import { AnyEntity, UtilControlWrapper } from './BaseFormTypes'; +import { AcceptableFormValueOrNullish } from '../types/components/shareableTypes'; const CustomElement = styled.div``; @@ -25,40 +26,16 @@ const ControlGroupWrapper = styled(ControlGroup).attrs((props: { dataName: strin interface ControlWrapperProps { mode: string; - utilityFuncts: { - handleChange?: () => void; - addCustomValidator?: ( - field: string, - validator: (submittedField: string, submittedValue: string) => void - ) => void; - utilCustomFunctions?: unknown; - }; - value: unknown; + utilityFuncts: UtilControlWrapper; + value: AcceptableFormValueOrNullish; display: boolean; error: boolean; - entity: { - type: unknown; - field: string; - label: string; - options: Record; - tooltip?: string; - help?: string; - encrypted?: boolean; - required?: boolean; - defaultValue?: unknown; - }; disabled: boolean; - markdownMessage?: { - text: string; - link: string; - color: string; - markdownType: 'link' | 'text' | 'hybrid'; - token: string; - linkText: string; - }; serviceName: string; dependencyValues: unknown; - fileNameToDisplay: string; + entity?: AnyEntity; + markdownMessage?: MarkdownMessageProps; + fileNameToDisplay?: string; } class ControlWrapper extends React.PureComponent { @@ -68,28 +45,19 @@ class ControlWrapper extends React.PureComponent { constructor(props: ControlWrapperProps) { super(props); - this.controlType = ControlWrapper.isString(props.entity.type) - ? CONTROL_TYPE_MAP[String(props.entity.type)] + this.controlType = ControlWrapper.isString(props.entity?.type) + ? CONTROL_TYPE_MAP[String(props.entity?.type)] : null; } render() { - const { - field, - type, - label, - tooltip, - help, - encrypted = false, - required, - } = this.props.entity; const { handleChange, addCustomValidator, utilCustomFunctions } = this.props.utilityFuncts; // We have to put empty object because markDownMessage prop can be undefined // because we are not explicitly setting it but expecting it from custom hooks only. const { text, link, color, markdownType, token, linkText } = this.props.markdownMessage || {}; let rowView; - if (this.props.entity.type === 'custom') { + if (this.props?.entity?.type === 'custom') { const data = { value: this.props.value, mode: this.props.mode, @@ -99,30 +67,28 @@ class ControlWrapper extends React.PureComponent { rowView = this.controlType ? React.createElement(this.controlType, { data, - field, handleChange, addCustomValidator, utilCustomFunctions, controlOptions: this.props.entity.options, + ...this?.props?.entity, }) - : `No View Found for ${type} type`; + : `No View Found for ${this?.props?.entity?.type} type`; } else { rowView = this.controlType ? React.createElement(this.controlType, { handleChange, value: this.props.value, - field, - controlOptions: this.props.entity.options, + controlOptions: this.props.entity?.options, error: this.props.error, disabled: this.props.disabled, - encrypted, dependencyValues: this.props.dependencyValues, - required, addCustomValidator, fileNameToDisplay: this.props.fileNameToDisplay, mode: this.props.mode, + ...this?.props?.entity, }) - : `No View Found for ${type} type`; + : `No View Found for ${this?.props?.entity?.type} type`; } const helpText = ( @@ -135,22 +101,20 @@ class ControlWrapper extends React.PureComponent { token={token || ''} linkText={linkText || ''} /> - {help} + {this?.props?.entity?.help || ''} ); return ( this.props.display && ( {rowView} diff --git a/ui/src/components/DeleteModal/DeleteModal.tsx b/ui/src/components/DeleteModal/DeleteModal.tsx index 2ef3d0803..b04ac6e41 100644 --- a/ui/src/components/DeleteModal/DeleteModal.tsx +++ b/ui/src/components/DeleteModal/DeleteModal.tsx @@ -64,7 +64,7 @@ class DeleteModal extends Component { return Promise.reject(err); }) .then(() => { - this.context.setRowData( + this.context?.setRowData( update(this.context.rowData, { [this.props.serviceName]: { $unset: [this.props.stanzaName] }, }) diff --git a/ui/src/components/EntityModal/EntityModal.test.tsx b/ui/src/components/EntityModal/EntityModal.test.tsx index 97d7675f2..38d35c1c5 100644 --- a/ui/src/components/EntityModal/EntityModal.test.tsx +++ b/ui/src/components/EntityModal/EntityModal.test.tsx @@ -15,6 +15,7 @@ import { getConfigWarningMessage, } from './TestConfig'; import { ERROR_AUTH_PROCESS_TERMINATED_TRY_AGAIN } from '../../constants/oAuthErrorMessage'; +import { Mode } from '../../constants/modes'; describe('Oauth field disabled on edit - diableonEdit property', () => { const handleRequestClose = jest.fn(); @@ -271,7 +272,7 @@ describe('EntityModal - custom warning', () => { setUnifiedConfig(newConfig); }; - const renderModal = (inputMode: string, page: string) => { + const renderModal = (inputMode: Mode, page: string) => { const props = { serviceName: 'account', mode: inputMode, diff --git a/ui/src/components/EntityModal/EntityModal.tsx b/ui/src/components/EntityModal/EntityModal.tsx index 787ea238f..640b2751d 100644 --- a/ui/src/components/EntityModal/EntityModal.tsx +++ b/ui/src/components/EntityModal/EntityModal.tsx @@ -4,7 +4,7 @@ import styled from 'styled-components'; import WaitSpinner from '@splunk/react-ui/WaitSpinner'; import { _ } from '@splunk/ui-utils/i18n'; -import { MODE_CLONE, MODE_CREATE, MODE_EDIT } from '../../constants/modes'; +import { MODE_CLONE, MODE_CREATE, MODE_EDIT, Mode } from '../../constants/modes'; import { StyledButton } from '../../pages/EntryPageStyle'; import BaseFormView from '../BaseFormView'; @@ -14,7 +14,7 @@ const ModalWrapper = styled(Modal)` export interface EntityModalProps { page: string; - mode: string; + mode: Mode; serviceName: string; handleRequestClose: () => void; stanzaName?: string; @@ -84,7 +84,7 @@ class EntityModal extends Component { page={this.props.page} serviceName={this.props.serviceName} mode={this.props.mode} - stanzaName={this.props.stanzaName} + stanzaName={this.props.stanzaName || 'unknownStanza'} handleFormSubmit={this.handleFormSubmit} groupName={this.props.groupName} /> diff --git a/ui/src/components/EntityPage.tsx b/ui/src/components/EntityPage.tsx index dc7ccf442..61866cf48 100644 --- a/ui/src/components/EntityPage.tsx +++ b/ui/src/components/EntityPage.tsx @@ -93,7 +93,7 @@ function EntityPage({ page={page} serviceName={serviceName} mode={mode} - stanzaName={stanzaName} + stanzaName={stanzaName || ''} handleFormSubmit={handleFormSubmit} groupName={groupName} /> diff --git a/ui/src/components/FileInputComponent/FileInputComponent.stories.tsx b/ui/src/components/FileInputComponent/FileInputComponent.stories.tsx index a215a0c33..d7cc54e5f 100644 --- a/ui/src/components/FileInputComponent/FileInputComponent.stories.tsx +++ b/ui/src/components/FileInputComponent/FileInputComponent.stories.tsx @@ -1,11 +1,10 @@ import type { Meta, StoryObj } from '@storybook/react'; import FileInputComponent from './FileInputComponent'; -import BaseFormView from '../BaseFormView'; const meta = { component: FileInputComponent, title: 'Components/FileInputComponent', -} satisfies Meta; +} satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/src/components/MarkdownMessage.tsx b/ui/src/components/MarkdownMessage.tsx index a79b385e3..a2ba2b73e 100644 --- a/ui/src/components/MarkdownMessage.tsx +++ b/ui/src/components/MarkdownMessage.tsx @@ -6,7 +6,7 @@ const MarkdownWrapper = styled.span` color: ${(props) => props.color}; `; -interface MarkdownMessageProps { +export interface MarkdownMessageProps { text: string; link: string; color: string; diff --git a/ui/src/context/TableContext.jsx b/ui/src/context/TableContext.jsx deleted file mode 100644 index c344c7398..000000000 --- a/ui/src/context/TableContext.jsx +++ /dev/null @@ -1,41 +0,0 @@ -import React, { createContext, useState } from 'react'; -import PropTypes from 'prop-types'; - -const TableContext = createContext({ - rowData: {}, - setRowData: () => {}, -}); - -export function TableContextProvider({ children }) { - const [rowData, setRowData] = useState({}); - const [searchText, setSearchText] = useState(''); - const [searchType, setSearchType] = useState('all'); - const [pageSize, setPageSize] = useState(10); - const [currentPage, setCurrentPage] = useState(0); - - return ( - - {children} - - ); -} - -TableContextProvider.propTypes = { - children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired, -}; - -export default TableContext; diff --git a/ui/src/context/TableContext.tsx b/ui/src/context/TableContext.tsx new file mode 100644 index 000000000..f2d4a1376 --- /dev/null +++ b/ui/src/context/TableContext.tsx @@ -0,0 +1,58 @@ +import React, { createContext, useState } from 'react'; +import PropTypes from 'prop-types'; +import { AcceptableFormValueOrNull } from '../types/components/shareableTypes'; + +// serviceName > specificRowName > dataForRow +type RowDataType = Record>>; + +export type TableContextProviderType = { + rowData: RowDataType; + setRowData: React.Dispatch>; + searchText: string; + setSearchText: React.Dispatch>; + searchType: string; + setSearchType: React.Dispatch>; + pageSize: number; + setPageSize: React.Dispatch>; + currentPage: number; + setCurrentPage: React.Dispatch>; +}; + +const TableContext = createContext(null); + +export function TableContextProvider({ + children, +}: { + children: (typeof PropTypes.node | typeof PropTypes.node)[]; +}) { + const [rowData, setRowData] = useState({}); + const [searchText, setSearchText] = useState(''); + const [searchType, setSearchType] = useState('all'); + const [pageSize, setPageSize] = useState(10); + const [currentPage, setCurrentPage] = useState(0); + + return ( + + {children} + + ); +} + +TableContextProvider.propTypes = { + children: PropTypes.oneOfType([PropTypes.arrayOf(PropTypes.node), PropTypes.node]).isRequired, +}; + +export default TableContext; diff --git a/ui/src/pages/Input/stories/InputPage.stories.tsx b/ui/src/pages/Input/stories/InputPage.stories.tsx index c19b92503..87d47f364 100644 --- a/ui/src/pages/Input/stories/InputPage.stories.tsx +++ b/ui/src/pages/Input/stories/InputPage.stories.tsx @@ -1,6 +1,5 @@ import type { Meta, StoryObj } from '@storybook/react'; import React from 'react'; -import BaseFormView from 'src/components/BaseFormView'; import { http, HttpResponse } from 'msw'; import { userEvent, within } from '@storybook/testing-library'; import { setUnifiedConfig } from '../../../util/util'; @@ -25,7 +24,7 @@ const meta = { ], }, }, -} satisfies Meta; +} satisfies Meta; export default meta; type Story = StoryObj; diff --git a/ui/src/types/components/shareableTypes.ts b/ui/src/types/components/shareableTypes.ts new file mode 100644 index 000000000..9716d612e --- /dev/null +++ b/ui/src/types/components/shareableTypes.ts @@ -0,0 +1,3 @@ +export type AcceptableFormValue = string | number | boolean | { fileContent?: string }; +export type AcceptableFormValueOrNull = AcceptableFormValue | null; +export type AcceptableFormValueOrNullish = AcceptableFormValueOrNull | undefined; diff --git a/ui/src/types/globalConfig/entities.ts b/ui/src/types/globalConfig/entities.ts index cc7b2fc31..c8bf3c0b1 100644 --- a/ui/src/types/globalConfig/entities.ts +++ b/ui/src/types/globalConfig/entities.ts @@ -23,16 +23,16 @@ const CommonEntityFields = z.object({ }); const CommonEditableEntityFields = CommonEntityFields.extend({ - required: z.boolean().optional().default(false), - encrypted: z.boolean().optional().default(false), + required: z.boolean().default(false).optional(), + encrypted: z.boolean().default(false).optional(), }); const CommonEditableEntityOptions = z.object({ placeholder: z.string().optional(), - display: z.boolean().optional().default(true), - disableonEdit: z.boolean().optional().default(false), - enable: z.boolean().optional().default(true), - requiredWhenVisible: z.boolean().optional().default(false), + display: z.boolean().default(true).optional(), + disableonEdit: z.boolean().default(false).optional(), + enable: z.boolean().default(true).optional(), + requiredWhenVisible: z.boolean().default(false).optional(), }); const AllValidators = z @@ -53,6 +53,7 @@ export const LinkEntity = CommonEntityFields.extend({ type: z.literal('helpLink'), label: z.string().optional(), options: z.object({ text: z.string(), link: z.string() }), + required: z.literal(false).default(false).optional(), }); export type LinkEntity = z.infer; @@ -60,7 +61,7 @@ export type LinkEntity = z.infer; export const TextEntity = CommonEditableEntityFields.extend({ type: z.literal('text'), validators: AllValidators.optional(), - defaultValue: z.union([z.string(), z.number()]).optional(), + defaultValue: z.union([z.string(), z.number(), z.boolean()]).optional(), options: CommonEditableEntityOptions.optional(), }); @@ -85,8 +86,8 @@ const AutoCompleteFields = z.array( ); const SelectCommonOptions = CommonEditableEntityOptions.extend({ - disableSearch: z.boolean().optional().default(false), - createSearchChoice: z.boolean().optional().default(false), + disableSearch: z.boolean().default(false).optional(), + createSearchChoice: z.boolean().default(false).optional(), referenceName: z.string().optional(), endpointUrl: z.string().optional(), allowList: z.string().optional(), @@ -179,22 +180,26 @@ export const FileEntity = CommonEditableEntityFields.extend({ .optional(), }); -const OAuthFields = z - .object({ - oauth_field: z.string(), - label: z.string(), - field: z.string(), - help: z.string(), - encrypted: z.boolean().default(false), - required: z.boolean().default(false), - defaultValue: z.union([z.string(), z.number(), z.boolean()]).optional(), - options: z.object({ +export const OAuthFields = z.object({ + oauth_field: z.string(), + label: z.string(), + field: z.string(), + type: z.literal('text').default('text').optional(), + help: z.string(), + encrypted: z.boolean().default(false).optional(), + required: z.boolean().default(false).optional(), + defaultValue: z.union([z.string(), z.number(), z.boolean()]).optional(), + options: z + .object({ placeholder: z.string().optional(), disableonEdit: z.boolean().optional(), - enable: z.boolean().optional().default(true), - }), - }) - .partial(); + enable: z.boolean().default(true).optional(), + display: z.literal(true).default(true).optional(), + requiredWhenVisible: z.boolean().default(false).optional(), + }) + .optional(), +}); + export const OAuthEntity = CommonEditableEntityFields.extend({ type: z.literal('oauth'), defaultValue: z.string().optional(), diff --git a/ui/src/types/globalConfig/meta.ts b/ui/src/types/globalConfig/meta.ts index 9139054c3..d0a1d19b6 100644 --- a/ui/src/types/globalConfig/meta.ts +++ b/ui/src/types/globalConfig/meta.ts @@ -7,7 +7,7 @@ export const meta = z.object({ apiVersion: z.string().optional(), version: z.string(), schemaVersion: z.string().optional(), - checkForUpdates: z.boolean().default(true), + checkForUpdates: z.boolean().default(true).optional(), }); export type meta = z.infer; diff --git a/ui/src/types/modules.d.ts b/ui/src/types/modules.d.ts index 18c1ddb96..808e1381a 100644 --- a/ui/src/types/modules.d.ts +++ b/ui/src/types/modules.d.ts @@ -3,3 +3,4 @@ declare module '@splunk/splunk-utils/url'; // declaring modules as utils does not seem to have types declare module '@splunk/ui-utils/i18n'; +declare module 'uuid'; diff --git a/ui/src/types/window.d.ts b/ui/src/types/window.d.ts new file mode 100644 index 000000000..f1b7cf20b --- /dev/null +++ b/ui/src/types/window.d.ts @@ -0,0 +1,4 @@ +interface Window { + open: () => void; + getMessage: (message: { code: string; error: unknown; state: unknown }) => void; +} diff --git a/ui/src/util/axiosCallWrapper.ts b/ui/src/util/axiosCallWrapper.ts index 95fec9782..b181d3354 100755 --- a/ui/src/util/axiosCallWrapper.ts +++ b/ui/src/util/axiosCallWrapper.ts @@ -18,7 +18,7 @@ interface CommonAxiosCall { cancelToken?: CancelToken; customHeaders?: Record; method?: 'get' | 'post' | 'delete'; - body?: Record; + body?: URLSearchParams; handleError?: boolean; callbackOnError?: (error: unknown) => void; } diff --git a/ui/src/util/messageUtil.js b/ui/src/util/messageUtil.js index ee18c55d4..969792855 100644 --- a/ui/src/util/messageUtil.js +++ b/ui/src/util/messageUtil.js @@ -4,7 +4,7 @@ import messageDict from '../constants/messageDict'; /** * @param {number} code a int value. - * @param {(string|number)[]=} msg arguments to format the message. + * @param {(string|number|boolean)[]=} msg arguments to format the message. * @returns {string} */ export const getFormattedMessage = (code, msg /* , ... , args */) => { From aada37364ed44e63732ac2b23807ce5b4bf084a3 Mon Sep 17 00:00:00 2001 From: soleksy-splunk <143183665+soleksy-splunk@users.noreply.github.com> Date: Thu, 25 Jan 2024 11:08:15 +0100 Subject: [PATCH 07/23] feat: ADDON-67533 implement support for oauth autorize and token urls (#1009) Add possibility to use `endpoint_authorize` and `endpoint_token` instead of single 'endpoint' field for oauth. Add `defaultValue` and `enable` into scheme for oauth fields --- docs/advanced/oauth_support.md | 3 + .../schema/schema.json | 6 + .../splunk_ta_uccexample_account.conf.spec | 2 + .../static/js/build/globalConfig.json | 12 ++ .../bin/splunk_ta_uccexample_rh_account.py | 14 +++ .../globalConfig.json | 17 ++- ui/src/components/BaseFormView.tsx | 8 +- ui/src/components/BaseFormView3.jsx | 9 +- .../EntityModal/EntityModal.test.tsx | 110 +++++++++++++++++- ui/src/components/EntityModal/TestConfig.ts | 71 +++++++++++ 10 files changed, 243 insertions(+), 9 deletions(-) diff --git a/docs/advanced/oauth_support.md b/docs/advanced/oauth_support.md index 57de1dddb..ca3e92bbb 100644 --- a/docs/advanced/oauth_support.md +++ b/docs/advanced/oauth_support.md @@ -16,6 +16,9 @@ Auth can be used inside the entity tag. Use `type: "oauth"` in the entity list a - `client_secret` this is client secret for the your app for which you want auth - `redirect_url` this will show redirect url which needs to be put in app's redirect url. - `endpoint` this will be endpoint for which we want to build oauth support. For example for salesforce that will be either "login.salesforce.com" or "test.salesforce.com" or any other custom endpoint. + - there is also a possibility to specify separate endpoints for authorize and token, to do that instead single 'endpoint' field use two separate ones: + - `endpoint_authorize` - to specify the endpoint used for authorization ie. login.salesforce.com + - `endpoint_token` - to specify the endpoint used for token acqusition ie. api.login.salesforce.com - `auth_code_endpoint` this must be present and its value should be endpoint value for getting the auth_code using the app. If the url to get auth_code is https://login.salesforce.com/services/oauth2/authorize then this will have value /services/oauth2/authorize - `access_token_endpoint` this must be present and its value should be endpoint value for getting access_token using the auth_code received. If the url to get access token is https://login.salesforce.com/services/oauth2/token then this will have value /services/oauth2/token - `auth_label` this allow user to have custom label for Auth Type dropdown diff --git a/splunk_add_on_ucc_framework/schema/schema.json b/splunk_add_on_ucc_framework/schema/schema.json index 7f17c0fdf..f918ed91f 100644 --- a/splunk_add_on_ucc_framework/schema/schema.json +++ b/splunk_add_on_ucc_framework/schema/schema.json @@ -1728,6 +1728,9 @@ "required": { "type": "boolean" }, + "defaultValue": { + "type": "string" + }, "options": { "type": "object", "properties": { @@ -1737,6 +1740,9 @@ }, "disableonEdit": { "type": "boolean" + }, + "enable": { + "type": "boolean" } }, "additionalProperties": false diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/splunk_ta_uccexample_account.conf.spec b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/splunk_ta_uccexample_account.conf.spec index dc513ec51..6e906e88e 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/splunk_ta_uccexample_account.conf.spec +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/README/splunk_ta_uccexample_account.conf.spec @@ -14,6 +14,8 @@ basic_oauth_text = client_id = client_secret = redirect_url = +endpoint_token = +endpoint_authorize = oauth_oauth_text = access_token = refresh_token = diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/appserver/static/js/build/globalConfig.json b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/appserver/static/js/build/globalConfig.json index 752e047a4..0c0148ac7 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/appserver/static/js/build/globalConfig.json +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/appserver/static/js/build/globalConfig.json @@ -176,6 +176,18 @@ "label": "Redirect url", "field": "redirect_url", "help": "Copy and paste this URL into your app." + }, + { + "oauth_field": "endpoint_token", + "label": "Token endpoint", + "field": "endpoint_token", + "help": "Put here endpoint used for token acqusition ie. login.salesforce.com" + }, + { + "oauth_field": "endpoint_authorize", + "label": "Authorize endpoint", + "field": "endpoint_authorize", + "help": "Put here endpoint used for authorization ie. login.salesforce.com" } ], "auth_code_endpoint": "/services/oauth2/authorize", diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_account.py b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_account.py index 2fd5e5dac..9d5b17c9d 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_account.py +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_account.py @@ -120,6 +120,20 @@ default=None, validator=None ), + field.RestField( + 'endpoint_token', + required=False, + encrypted=False, + default=None, + validator=None + ), + field.RestField( + 'endpoint_authorize', + required=False, + encrypted=False, + default=None, + validator=None + ), field.RestField( 'oauth_oauth_text', required=False, diff --git a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json index 0eefdc20f..fcda40154 100644 --- a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json +++ b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json @@ -190,6 +190,18 @@ "field": "redirect_url", "help": "Copy and paste this URL into your app." }, + { + "oauth_field": "endpoint_token", + "label": "Token endpoint", + "field": "endpoint_token", + "help": "Put here endpoint used for token acqusition ie. login.salesforce.com" + }, + { + "oauth_field": "endpoint_authorize", + "label": "Authorize endpoint", + "field": "endpoint_authorize", + "help": "Put here endpoint used for authorization ie. login.salesforce.com" + }, { "oauth_field": "oauth_some_text", "label": "Disabled on edit for oauth", @@ -197,7 +209,8 @@ "field": "oauth_oauth_text", "required": false, "options": { - "disableonEdit": true + "disableonEdit": true, + "enable": false } } ], @@ -1375,7 +1388,7 @@ "meta": { "name": "Splunk_TA_UCCExample", "restRoot": "splunk_ta_uccexample", - "version": "5.35.1R7fe3d58d", + "version": "5.35.1R537d4508", "displayName": "Splunk UCC test Add-on", "schemaVersion": "0.0.3" } diff --git a/ui/src/components/BaseFormView.tsx b/ui/src/components/BaseFormView.tsx index cea8e85ce..60c8ca4da 100644 --- a/ui/src/components/BaseFormView.tsx +++ b/ui/src/components/BaseFormView.tsx @@ -663,7 +663,9 @@ class BaseFormView extends PureComponent { } let host = encodeURI( - `https://${this.datadict.endpoint}${this.oauthConf?.authCodeEndpoint}${parameters}` + `https://${this.datadict.endpoint || this.datadict.endpoint_authorize}${ + this.oauthConf?.authCodeEndpoint + }${parameters}` ); const redirectURI = new URLSearchParams(host).get('redirect_uri'); if (redirectURI) { @@ -1053,7 +1055,9 @@ class BaseFormView extends PureComponent { const code = decodeURIComponent(message.code); const data: Record = { method: 'POST', - url: `https://${this.datadict.endpoint}${this.oauthConf?.accessTokenEndpoint}`, + url: `https://${this.datadict.endpoint || this.datadict.endpoint_token}${ + this.oauthConf?.accessTokenEndpoint + }`, grant_type: 'authorization_code', client_id: this.datadict.client_id, client_secret: this.datadict.client_secret, diff --git a/ui/src/components/BaseFormView3.jsx b/ui/src/components/BaseFormView3.jsx index 632c7548b..e2bdecba9 100644 --- a/ui/src/components/BaseFormView3.jsx +++ b/ui/src/components/BaseFormView3.jsx @@ -515,9 +515,10 @@ class BaseFormView extends PureComponent { if (this.oauthConf.authEndpointAccessTokenType) { parameters = `${parameters}&token_access_type=${this.oauthConf.authEndpointAccessTokenType}`; } - let host = encodeURI( - `https://${this.datadict.endpoint}${this.oauthConf.authCodeEndpoint}${parameters}` + `https://${this.datadict.endpoint || this.datadict.endpoint_authorize}${ + this.oauthConf.authCodeEndpoint + }${parameters}` ); const redirectURI = new URLSearchParams(host).get('redirect_uri'); host = host.replace(redirectURI, encodeURIComponent(redirectURI)); @@ -897,7 +898,9 @@ class BaseFormView extends PureComponent { const code = decodeURIComponent(message.code); const data = { method: 'POST', - url: `https://${this.datadict.endpoint}${this.oauthConf.accessTokenEndpoint}`, + url: `https://${this.datadict.endpoint || this.datadict.endpoint_token}${ + this.oauthConf.accessTokenEndpoint + }`, grant_type: 'authorization_code', client_id: this.datadict.client_id, client_secret: this.datadict.client_secret, diff --git a/ui/src/components/EntityModal/EntityModal.test.tsx b/ui/src/components/EntityModal/EntityModal.test.tsx index 38d35c1c5..06b83ab11 100644 --- a/ui/src/components/EntityModal/EntityModal.test.tsx +++ b/ui/src/components/EntityModal/EntityModal.test.tsx @@ -1,6 +1,7 @@ import React from 'react'; import { render, screen } from '@testing-library/react'; import userEvent from '@testing-library/user-event'; +import { AxiosResponse } from 'axios'; import EntityModal, { EntityModalProps } from './EntityModal'; import { setUnifiedConfig } from '../../util/util'; import { @@ -13,9 +14,11 @@ import { getConfigOauthOauthDisableonEdit, getConfigWithOauthDefaultValue, getConfigWarningMessage, + getConfigWithSeparatedEndpointsOAuth, } from './TestConfig'; import { ERROR_AUTH_PROCESS_TERMINATED_TRY_AGAIN } from '../../constants/oAuthErrorMessage'; import { Mode } from '../../constants/modes'; +import * as axiosWrapper from '../../util/axiosCallWrapper'; describe('Oauth field disabled on edit - diableonEdit property', () => { const handleRequestClose = jest.fn(); @@ -223,10 +226,10 @@ describe('EntityModal - auth_endpoint_token_access_type', () => { renderModalWithProps(props); - const cliendIdField = document.querySelector('.client_id')?.querySelector('input'); + const cliendIdField = document.querySelector('.client_id input'); expect(cliendIdField).toBeInTheDocument(); - const secretField = document.querySelector('.client_secret')?.querySelector('input'); + const secretField = document.querySelector('.client_secret input'); expect(secretField).toBeInTheDocument(); const redirectField = document.querySelector('.redirect_url'); @@ -341,3 +344,106 @@ describe('Default value', () => { expect(component).toHaveValue(DEFAULT_VALUE); }); }); + +describe('Oauth - separated endpoint authorization', () => { + const handleRequestClose = jest.fn(); + const setUpConfigWithSeparatedEndpoints = () => { + const newConfig = getConfigWithSeparatedEndpointsOAuth(); + setUnifiedConfig(newConfig); + }; + + const renderModalWithProps = (props: EntityModalProps) => { + render(); + }; + + const getFilledOauthFields = async () => { + const endpointAuth = document.querySelector('.endpoint_authorize input'); + const endpointToken = document.querySelector('.endpoint_token input'); + + if (endpointAuth) { + await userEvent.type(endpointAuth, 'authendpoint'); + } + if (endpointToken) { + await userEvent.type(endpointToken, 'tokenendpoint'); + } + return [endpointAuth, endpointToken]; + }; + + const spyOnWindowOpen = async (addButton: HTMLElement) => { + const windowOpenSpy = jest.spyOn(window, 'open') as jest.Mock; + + // mock opening verification window + windowOpenSpy.mockImplementation((url) => { + expect(url).toEqual( + 'https://authendpoint/services/oauth2/authorize?response_type=code&client_id=Client%20Id&redirect_uri=http%3A%2F%2Flocalhost%2F' + ); + + return { closed: true }; + }); + + await userEvent.click(addButton); + windowOpenSpy.mockRestore(); + }; + + const props = { + serviceName: 'account', + mode: 'create', + stanzaName: undefined, + formLabel: 'formLabel', + page: 'configuration', + groupName: '', + open: true, + handleRequestClose: () => {}, + } satisfies EntityModalProps; + + it('render modal with separated oauth fields', async () => { + setUpConfigWithSeparatedEndpoints(); + renderModalWithProps(props); + + const [endpointAuth, endpointToken] = await getFilledOauthFields(); + + expect(endpointAuth).toBeInTheDocument(); + expect(endpointAuth).toHaveValue('authendpoint'); + expect(endpointToken).toBeInTheDocument(); + expect(endpointToken).toHaveValue('tokenendpoint'); + }); + + it('check if correct authorization endpoint called', async () => { + setUpConfigWithSeparatedEndpoints(); + renderModalWithProps(props); + + await getFilledOauthFields(); + + const addButton = screen.getByRole('button', { name: /add/i }); + expect(addButton).toBeInTheDocument(); + + await spyOnWindowOpen(addButton); + }); + + it('check if correct auth token endpoint created', async () => { + setUpConfigWithSeparatedEndpoints(); + renderModalWithProps(props); + const backendTokenFunction = jest.fn(); + + await getFilledOauthFields(); + const addButton = screen.getByRole('button', { name: /add/i }); + expect(addButton).toBeInTheDocument(); + + await spyOnWindowOpen(addButton); + + // token is aquired on backend side so only thing we can check is if there is correct url created + jest.spyOn(axiosWrapper, 'axiosCallWrapper').mockImplementation((params) => { + backendTokenFunction((params?.body as unknown as URLSearchParams)?.get('url')); + return new Promise((r) => r({} as unknown as PromiseLike)); + }); + + // triggering manually external oauth window behaviour after success authorization + // eslint-disable-next-line @typescript-eslint/no-explicit-any + (window as any).getMessage({ code: 200, msg: 'testing message for oauth' }); + + // only purpose is to check if backend function receinved correct token url + expect(backendTokenFunction).toHaveBeenCalledWith( + 'https://tokenendpoint/services/oauth2/token' + ); + }); +}); diff --git a/ui/src/components/EntityModal/TestConfig.ts b/ui/src/components/EntityModal/TestConfig.ts index 8c2babd67..9bc19a914 100644 --- a/ui/src/components/EntityModal/TestConfig.ts +++ b/ui/src/components/EntityModal/TestConfig.ts @@ -421,3 +421,74 @@ export const getConfigWithOauthDefaultValue = () => { }; return newConfig satisfies z.infer; }; + +const entityOauthOauthSeparatedEndpoints = [ + { + type: 'oauth', + field: 'oauth_jest_test', + label: 'Not used', + required: true, + encrypted: false, + options: { + auth_type: ['oauth'], + oauth: [ + { + oauth_field: 'client_id', + label: 'Client Id', + field: 'client_id', + help: 'Enter the Client Id for this account.', + defaultValue: 'Client Id', + }, + { + oauth_field: 'client_secret', + label: 'Client Secret', + field: 'client_secret', + encrypted: true, + help: 'Enter the Client Secret key for this account.', + defaultValue: 'Client Secret', + }, + { + oauth_field: 'redirect_url', + label: 'Redirect url', + field: 'redirect_url', + help: 'Copy and paste this URL into your app.', + defaultValue: 'Redirect url', + }, + { + oauth_field: 'endpoint_token', + label: 'Token endpoint', + field: 'endpoint_token', + help: 'Put here endpoint used for token acqusition ie. login.salesforce.com', + }, + { + oauth_field: 'endpoint_authorize', + label: 'Authorize endpoint', + field: 'endpoint_authorize', + help: 'Put here endpoint used for authorization ie. login.salesforce.com', + }, + ], + auth_code_endpoint: '/services/oauth2/authorize', + access_token_endpoint: '/services/oauth2/token', + oauth_timeout: 3000, + oauth_state_enabled: false, + display: true, + disableonEdit: false, + enable: true, + }, + } satisfies z.infer, +]; + +export const getConfigWithSeparatedEndpointsOAuth = () => { + const globalConfig = getGlobalConfigMock(); + const newConfig = { + ...globalConfig, + pages: { + ...globalConfig.pages, + configuration: { + ...globalConfig.pages.configuration, + tabs: [{ entity: entityOauthOauthSeparatedEndpoints, ...defaultTableProps }], + }, + }, + }; + return newConfig satisfies z.infer; +}; From c73863499b9b546593000bc30fdf78f8e927b6d1 Mon Sep 17 00:00:00 2001 From: sgoral-splunk <138458044+sgoral-splunk@users.noreply.github.com> Date: Thu, 25 Jan 2024 16:33:20 +0100 Subject: [PATCH 08/23] feat: change avg() to sum() in PANEL_EVENTS_INGESTED_BY_SOURCETYPE_TEMPLATE panel (#1028) Changes for "Events ingested by sourcetype" panel: * Change SPL function from avg() to sum() * Change chart type from line to column --- docs/dashboard.md | 2 +- splunk_add_on_ucc_framework/dashboard.py | 4 ++-- .../Splunk_TA_UCCExample/default/data/ui/views/dashboard.xml | 4 ++-- tests/unit/test_dashboard.py | 4 ++-- 4 files changed, 7 insertions(+), 7 deletions(-) diff --git a/docs/dashboard.md b/docs/dashboard.md index 342c172df..d3e06ef34 100644 --- a/docs/dashboard.md +++ b/docs/dashboard.md @@ -78,7 +78,7 @@ Executes the following search: ``` index=_internal source=** action=events_ingested -| timechart avg(n_events) by sourcetype_ingested +| timechart sum(n_events) by sourcetype_ingested ``` > Note: is being replaced by the actual value during the build time. diff --git a/splunk_add_on_ucc_framework/dashboard.py b/splunk_add_on_ucc_framework/dashboard.py index a435a5f26..1f612cbb9 100644 --- a/splunk_add_on_ucc_framework/dashboard.py +++ b/splunk_add_on_ucc_framework/dashboard.py @@ -75,11 +75,11 @@ index=_internal source=*{addon_name}* action=events_ingested -| timechart avg(n_events) by sourcetype_ingested +| timechart sum(n_events) by sourcetype_ingested $log_time.earliest$ $log_time.latest$ - + diff --git a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/data/ui/views/dashboard.xml b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/data/ui/views/dashboard.xml index b5822d593..d571a84f9 100644 --- a/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/data/ui/views/dashboard.xml +++ b/tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample/default/data/ui/views/dashboard.xml @@ -31,11 +31,11 @@ index=_internal source=*splunk_ta_uccexample* action=events_ingested -| timechart avg(n_events) by sourcetype_ingested +| timechart sum(n_events) by sourcetype_ingested $log_time.earliest$ $log_time.latest$ - + diff --git a/tests/unit/test_dashboard.py b/tests/unit/test_dashboard.py index db0ef2eb5..3fb2ac349 100644 --- a/tests/unit/test_dashboard.py +++ b/tests/unit/test_dashboard.py @@ -40,11 +40,11 @@ index=_internal source=*splunk_ta_uccexample* action=events_ingested -| timechart avg(n_events) by sourcetype_ingested +| timechart sum(n_events) by sourcetype_ingested $log_time.earliest$ $log_time.latest$ - + From e1229b40e48ee485b3d301139834b869054643c0 Mon Sep 17 00:00:00 2001 From: MateuszMa Date: Thu, 25 Jan 2024 19:03:24 +0100 Subject: [PATCH 09/23] feat: add UCC version to globalConfig (#984) This PR adds versions of used UCC framework to TA internal files for traceability. see: [issue 983](https://github.com/splunk/addonfactory-ucc-generator/issues/983) --------- Co-authored-by: Artem Rys --- splunk_add_on_ucc_framework/commands/build.py | 1 + splunk_add_on_ucc_framework/global_config.py | 7 ++++++ .../schema/schema.json | 3 +++ tests/smoke/test_ucc_build.py | 25 +++++++++++++++++++ .../globalConfig.json | 5 ++-- .../globalConfig.json | 3 ++- .../globalConfig.json | 5 ++-- .../globalConfig.json | 5 ++-- 8 files changed, 47 insertions(+), 7 deletions(-) diff --git a/splunk_add_on_ucc_framework/commands/build.py b/splunk_add_on_ucc_framework/commands/build.py index accbc5d5b..a6477856b 100644 --- a/splunk_add_on_ucc_framework/commands/build.py +++ b/splunk_add_on_ucc_framework/commands/build.py @@ -502,6 +502,7 @@ def generate( logger.error(f"globalConfig file is not valid. Error: {e}") sys.exit(1) global_config.update_addon_version(addon_version) + global_config.add_ucc_version(__version__) global_config.dump(global_config.original_path) logger.info( f"Updated and saved add-on version in the globalConfig file to {addon_version}" diff --git a/splunk_add_on_ucc_framework/global_config.py b/splunk_add_on_ucc_framework/global_config.py index 5053b8170..1de6b5104 100644 --- a/splunk_add_on_ucc_framework/global_config.py +++ b/splunk_add_on_ucc_framework/global_config.py @@ -127,6 +127,10 @@ def display_name(self) -> str: def version(self) -> str: return self.meta["version"] + @property + def ucc_version(self) -> str: + return self.meta["_uccVersion"] + @property def original_path(self) -> str: return self._original_path @@ -150,6 +154,9 @@ def update_schema_version(self, new_schema_version: str) -> None: def update_addon_version(self, version: str) -> None: self._content.setdefault("meta", {})["version"] = version + def add_ucc_version(self, version: str) -> None: + self.content.setdefault("meta", {})["_uccVersion"] = version + def has_inputs(self) -> bool: return bool(self.inputs) diff --git a/splunk_add_on_ucc_framework/schema/schema.json b/splunk_add_on_ucc_framework/schema/schema.json index f918ed91f..fafad92fd 100644 --- a/splunk_add_on_ucc_framework/schema/schema.json +++ b/splunk_add_on_ucc_framework/schema/schema.json @@ -1628,6 +1628,9 @@ "type": "string", "pattern": "^(?:\\d{1,3}\\.){2}\\d{1,3}$" }, + "_uccVersion": { + "type": "string" + }, "checkForUpdates": { "type": "boolean", "default": true diff --git a/tests/smoke/test_ucc_build.py b/tests/smoke/test_ucc_build.py index 9613fdbb2..396017b75 100644 --- a/tests/smoke/test_ucc_build.py +++ b/tests/smoke/test_ucc_build.py @@ -11,6 +11,7 @@ import addonfactory_splunk_conf_parser_lib as conf_parser from splunk_add_on_ucc_framework.commands import build +from splunk_add_on_ucc_framework import __version__ PYTEST_SKIP_REASON = """Python 3.8 and higher preserves the order of the attrib fields when `tostring` function is used. @@ -59,7 +60,28 @@ def test_ucc_generate(): def test_ucc_generate_with_config_param(): """ Checks whether the package is build when the `config` flag is provided in the CLI. + Check if globalConfig and app.manifest contains current ucc version """ + + def check_ucc_versions(): + global_config_path = path.join( + path.dirname(path.realpath(__file__)), + "..", + "..", + "output", + "Splunk_TA_UCCExample", + "appserver", + "static", + "js", + "build", + "globalConfig.json", + ) + + with open(global_config_path) as _f: + global_config = json.load(_f) + + assert global_config["meta"]["_uccVersion"] == __version__ + package_folder = path.join( path.dirname(path.realpath(__file__)), "..", @@ -76,8 +98,11 @@ def test_ucc_generate_with_config_param(): "package_global_config_everything", "globalConfig.json", ) + build.generate(source=package_folder, config_path=config_path) + check_ucc_versions() + @pytest.mark.skipif(sys.version_info >= (3, 8), reason=PYTEST_SKIP_REASON) def test_ucc_generate_with_everything(): diff --git a/tests/testdata/test_addons/package_files_conflict_test/globalConfig.json b/tests/testdata/test_addons/package_files_conflict_test/globalConfig.json index 102b67c94..1e645f86b 100644 --- a/tests/testdata/test_addons/package_files_conflict_test/globalConfig.json +++ b/tests/testdata/test_addons/package_files_conflict_test/globalConfig.json @@ -212,8 +212,9 @@ "meta": { "name": "test_addon", "restRoot": "test_addon", - "version": "5.34.1Racdcfb2e", + "version": "5.36.2Ref7d7543", "displayName": "This is my add-on", - "schemaVersion": "0.0.3" + "schemaVersion": "0.0.3", + "_uccVersion": "5.36.2" } } diff --git a/tests/testdata/test_addons/package_global_config_configuration/globalConfig.json b/tests/testdata/test_addons/package_global_config_configuration/globalConfig.json index 13be07054..c30ad3aa8 100644 --- a/tests/testdata/test_addons/package_global_config_configuration/globalConfig.json +++ b/tests/testdata/test_addons/package_global_config_configuration/globalConfig.json @@ -420,6 +420,7 @@ "restRoot": "splunk_ta_uccexample", "version": "1.1.1", "displayName": "Splunk UCC test Add-on", - "schemaVersion": "0.0.3" + "schemaVersion": "0.0.3", + "_uccVersion": "5.36.2" } } diff --git a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json index fcda40154..8de7413b3 100644 --- a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json +++ b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json @@ -1388,8 +1388,9 @@ "meta": { "name": "Splunk_TA_UCCExample", "restRoot": "splunk_ta_uccexample", - "version": "5.35.1R537d4508", + "version": "5.36.2Ref7d7543", "displayName": "Splunk UCC test Add-on", - "schemaVersion": "0.0.3" + "schemaVersion": "0.0.3", + "_uccVersion": "5.36.2" } } diff --git a/tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json b/tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json index 7334e6ec4..996d556b3 100644 --- a/tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json +++ b/tests/testdata/test_addons/package_global_config_multi_input/globalConfig.json @@ -465,8 +465,9 @@ "meta": { "name": "Splunk_TA_UCCExample", "restRoot": "splunk_ta_uccexample", - "version": "0.0.1", + "version": "5.36.2Ref7d7543", "displayName": "Splunk UCC test Add-on", - "schemaVersion": "0.0.3" + "schemaVersion": "0.0.3", + "_uccVersion": "5.36.2" } } From 551f70150bd5994fddd0159c9610b3888c29ab86 Mon Sep 17 00:00:00 2001 From: soleksy-splunk <143183665+soleksy-splunk@users.noreply.github.com> Date: Fri, 26 Jan 2024 11:53:30 +0100 Subject: [PATCH 10/23] chore: remove unnecessary BaseFormView js copy (#1027) BaseFormView copy of js file was left to include other already existing changes and help to compare with ts version. After it is not required it should be deleted. type script version fully incorporated --- ui/src/components/BaseFormView3.jsx | 1130 --------------------------- 1 file changed, 1130 deletions(-) delete mode 100644 ui/src/components/BaseFormView3.jsx diff --git a/ui/src/components/BaseFormView3.jsx b/ui/src/components/BaseFormView3.jsx deleted file mode 100644 index e2bdecba9..000000000 --- a/ui/src/components/BaseFormView3.jsx +++ /dev/null @@ -1,1130 +0,0 @@ -import React, { PureComponent } from 'react'; -import PropTypes from 'prop-types'; -import update from 'immutability-helper'; -import { v4 as uuidv4 } from 'uuid'; - -import Message from '@splunk/react-ui/Message'; - -import ControlWrapper from './ControlWrapper'; -import Validator, { SaveValidator } from '../util/Validator'; -import { getUnifiedConfigs, generateToast } from '../util/util'; -import { MODE_CLONE, MODE_CREATE, MODE_EDIT, MODE_CONFIG } from '../constants/modes'; -import { PAGE_INPUT, PAGE_CONF } from '../constants/pages'; -import { axiosCallWrapper } from '../util/axiosCallWrapper'; -import { parseErrorMsg, getFormattedMessage } from '../util/messageUtil'; -import { getBuildDirPath } from '../util/script'; - -import { - ERROR_REQUEST_TIMEOUT_TRY_AGAIN, - ERROR_REQUEST_TIMEOUT_ACCESS_TOKEN_TRY_AGAIN, - ERROR_OCCURRED_TRY_AGAIN, - ERROR_AUTH_PROCESS_TERMINATED_TRY_AGAIN, - ERROR_STATE_MISSING_TRY_AGAIN, -} from '../constants/oAuthErrorMessage'; -import TableContext from '../context/TableContext'; -import Group from './Group'; - -function onCustomHookError(params) { - // eslint-disable-next-line no-console - console.error( - `[Custom Hook] Something went wrong while calling ${params.methodName}. Error: ${params.error?.name} ${params.error?.message}` - ); -} - -class BaseFormView extends PureComponent { - static contextType = TableContext; - - constructor(props, context) { - super(props); - // flag for to render hook method for once - this.flag = true; - this.state = {}; - this.currentInput = {}; - const globalConfig = getUnifiedConfigs(); - this.appName = globalConfig.meta.name; - this.groupEntities = []; - this.endpoint = - props.mode === MODE_EDIT || props.mode === MODE_CONFIG - ? `${this.props.serviceName}/${encodeURIComponent(this.props.stanzaName)}` - : `${this.props.serviceName}`; - - this.util = { - setState: (callback) => { - this.onSavePromise = new Promise((resolve) => { - this.setState((previousState) => callback(previousState), resolve); - }); - }, - setErrorFieldMsg: this.setErrorFieldMsg, - clearAllErrorMsg: this.clearAllErrorMsg, - setErrorMsg: this.setErrorMsg, - }; - - this.utilControlWrapper = { - handleChange: this.handleChange, - addCustomValidator: this.addCustomValidator, - utilCustomFunctions: this.util, - }; - this.customWarningMessage = ''; - - if (props.page === PAGE_INPUT) { - globalConfig.pages.inputs.services.forEach((service) => { - if (service.name === props.serviceName) { - this.groups = service.groups; - this.entities = service.entity; - this.updateGroupEntities(); - this.options = service.options; - if (service.hook) { - this.hookDeferred = this.loadHook( - service.hook.src, - service.hook.type, - globalConfig - ); - } - if (props.mode === MODE_EDIT || props.mode === MODE_CLONE) { - this.currentInput = - context?.rowData?.[props.serviceName]?.[props.stanzaName]; - } - this.customWarningMessage = service?.warning?.[props.mode] || ''; - } - }); - } else { - globalConfig.pages.configuration.tabs.forEach((tab) => { - const flag = tab.table - ? tab.name === props.serviceName - : tab.name === props.stanzaName && props.serviceName === 'settings'; - - if (flag) { - this.entities = tab.entity; - this.options = tab.options; - this.customWarningMessage = tab?.warning?.[props.mode] || ''; - if (tab.hook) { - this.hookDeferred = this.loadHook( - tab.hook.src, - tab.hook.type, - globalConfig - ); - } - - if (tab.table && (props.mode === MODE_EDIT || props.mode === MODE_CLONE)) { - this.currentInput = - context?.rowData?.[props.serviceName]?.[props.stanzaName]; - } else if (props.mode === MODE_CONFIG) { - this.currentInput = props.currentServiceState; - this.mode_config_title = tab.title; - } else { - this.currentInput = context?.rowData?.[props.serviceName]; - } - } - }); - } - this.dependencyMap = new Map(); - this.isOAuth = false; - this.isAuthVal = false; - this.authMap = {}; - let temState = {}; - const temEntities = []; - - this.entities.forEach((e) => { - if (e.type === 'oauth') { - this.isOAuth = true; - if (props.page === PAGE_CONF && props.serviceName === 'account') { - const authType = e?.options?.auth_type; - this.isoauthState = - typeof e?.options?.oauth_state_enabled !== 'undefined' - ? e?.options?.oauth_state_enabled - : null; - - if (authType.length > 1) { - this.isAuthVal = true; - // Defining state for auth_type in case of multiple Authentication - const tempEntity = {}; - tempEntity.value = - typeof this.currentInput?.auth_type !== 'undefined' - ? this.currentInput?.auth_type - : authType[0]; - - tempEntity.display = true; - tempEntity.error = false; - tempEntity.disabled = false; - temState.auth_type = tempEntity; - - // Defining Entity for auth_type in entitylist of globalConfig - const entity = {}; - entity.field = 'auth_type'; - entity.type = 'singleSelect'; - entity.label = 'Auth Type'; - const content = { - basic: 'Basic Authentication', - oauth: 'OAuth 2.0 Authentication', - }; - entity.options = {}; - entity.options.hideClearBtn = true; - entity.options.autoCompleteFields = authType.map((type) => ({ - label: content[type], - value: type, - })); - temEntities.push(entity); - } else { - this.isSingleOauth = authType.includes('oauth'); - } - - // Adding State and Entity(in entitylist) for every Fields of "oauth" type - // Iterating over everytype of Authentication under "oauth" type - authType.forEach((type) => { - const authfields = []; - const fields = e?.options[type]; - if (fields) { - // For Particaular type iterating over fields - fields.forEach((field) => { - // every field for auth type - const tempEntity = {}; - - if (props.mode === MODE_CREATE) { - tempEntity.value = - typeof field?.defaultValue !== 'undefined' - ? field.defaultValue - : null; - } else { - const isEncrypted = - typeof field?.encrypted !== 'undefined' - ? field?.encrypted - : false; - tempEntity.value = isEncrypted - ? '' - : this.currentInput?.[field.field]; - } - - tempEntity.display = - typeof temState.auth_type !== 'undefined' - ? type === temState.auth_type.value - : true; - tempEntity.error = false; - - tempEntity.disabled = field?.options?.enable === false; - - if (props.mode === MODE_EDIT) { - // .disableonEdit = false do not overwrite .disabled = true - tempEntity.disabled = - field?.options?.disableonEdit === true || - tempEntity.disabled; - } - - temState[field.field] = tempEntity; - // eslint-disable-next-line no-param-reassign - field.type = - typeof field?.type !== 'undefined' ? field.type : 'text'; - - // Handled special case for redirect_url - if (field.field === 'redirect_url') { - tempEntity.value = window.location.href - .split('?')[0] - .replace( - 'configuration', - `${this.appName.toLowerCase()}_redirect` - ); - tempEntity.disabled = true; - } - - temEntities.push(field); - authfields.push(field.field); - }); - this.authMap[type] = authfields; - } - }); - if (authType.includes('oauth')) { - const oauthConfData = {}; - // Storing O-Auth Configuration data to class variable to use later - oauthConfData.popupWidth = e.options.oauth_popup_width - ? e.options.oauth_popup_width - : 600; - oauthConfData.popupHeight = e.options.oauth_popup_height - ? e.options.oauth_popup_height - : 600; - oauthConfData.authTimeout = e.options.oauth_timeout - ? e.options.oauth_timeout - : 180; - oauthConfData.authCodeEndpoint = e.options.auth_code_endpoint - ? e.options.auth_code_endpoint - : null; - oauthConfData.accessTokenEndpoint = e.options.access_token_endpoint - ? e.options.access_token_endpoint - : null; - oauthConfData.authEndpointAccessTokenType = e.options - .auth_endpoint_token_access_type - ? e.options.auth_endpoint_token_access_type - : null; - this.oauthConf = oauthConfData; - } - } - } else { - const tempEntity = {}; - e.encrypted = typeof e.encrypted !== 'undefined' ? e.encrypted : false; - - if (e.type === 'file' && this.currentInput?.[e.field]) { - /* - adding example name to enable possibility of removal file, - not forcing value addition as if value is encrypted it is shared as - string ie. ***** and it is considered a valid default value - if value is not encrypted it is pushed correctly along with this name - */ - tempEntity.fileNameToDisplay = 'Previous File'; - } - - if (props.mode === MODE_CREATE) { - tempEntity.value = - typeof e.defaultValue !== 'undefined' ? e.defaultValue : null; - tempEntity.display = - typeof e?.options?.display !== 'undefined' ? e.options.display : true; - tempEntity.error = false; - tempEntity.disabled = e?.options?.enable === false; - temState[e.field] = tempEntity; - } else if (props.mode === MODE_EDIT) { - tempEntity.value = - typeof this.currentInput?.[e.field] !== 'undefined' - ? this.currentInput?.[e.field] - : null; - tempEntity.value = e.encrypted ? '' : tempEntity.value; - tempEntity.display = - typeof e?.options?.display !== 'undefined' ? e.options.display : true; - tempEntity.error = false; - tempEntity.disabled = e?.options?.enable === false; - if (e.field === 'name') { - tempEntity.disabled = true; - } else if (typeof e?.options?.disableonEdit !== 'undefined') { - tempEntity.disabled = e.options.disableonEdit; - } - temState[e.field] = tempEntity; - } else if (props.mode === MODE_CLONE) { - tempEntity.value = - e.field === 'name' || e.encrypted ? '' : this.currentInput?.[e.field]; - tempEntity.display = - typeof e?.options?.display !== 'undefined' ? e.options.display : true; - tempEntity.error = false; - tempEntity.disabled = e?.options?.enable === false; - temState[e.field] = tempEntity; - } else if (props.mode === MODE_CONFIG) { - e.defaultValue = typeof e.defaultValue !== 'undefined' ? e.defaultValue : null; - tempEntity.value = - typeof this.currentInput?.[e.field] !== 'undefined' - ? this.currentInput?.[e.field] - : e.defaultValue; - tempEntity.value = e.encrypted ? '' : tempEntity.value; - tempEntity.display = - typeof e?.options?.display !== 'undefined' ? e.options.display : true; - tempEntity.error = false; - tempEntity.disabled = e?.options?.enable === false; - if (e.field === 'name') { - tempEntity.disabled = true; - } else if (typeof e?.options?.disableonEdit !== 'undefined') { - tempEntity.disabled = e.options.disableonEdit; - } - temState[e.field] = tempEntity; - } else { - throw new Error('Invalid mode :', props.mode); - } - - // handle dependent fields - const fields = e.options?.dependencies; - if (fields) { - fields.forEach((field) => { - const changeFields = this.dependencyMap.get(field); - if (changeFields) { - changeFields[e.field] = fields; - } else { - this.dependencyMap.set(field, { - [e.field]: fields, - }); - } - }); - } - temEntities.push(e); - } - }); - - this.entities = temEntities; - - // flatten the dependencyMap to remove redundant iterations for resolving them - // one-by-one in following loop - let flattenedMap = {}; - this.dependencyMap.forEach((value) => { - flattenedMap = { ...flattenedMap, ...value }; - }); - - const changes = {}; - Object.keys(flattenedMap).forEach((field) => { - const values = flattenedMap[field]; - const data = {}; - let load = true; - - values.forEach((dependency) => { - const required = !!this.entities.find((e) => e.field === dependency)?.required; - - const currentValue = temState[dependency]?.value; - if (required && !currentValue) { - load = false; - data[dependency] = null; - } else { - data[dependency] = currentValue; - } - }); - - if (load) { - changes[field] = { - dependencyValues: { $set: data }, - }; - } - }); - - // apply dependency field changes in state - temState = update(temState, changes); - this.state = { - data: temState, - errorMsg: '', - warningMsg: this.customWarningMessage, - }; - - // Hook on create method call - if (this.hookDeferred) { - this.hookDeferred.then(() => { - if (typeof this.hook.onCreate === 'function') { - try { - this.hook.onCreate(); - } catch (error) { - onCustomHookError({ methodName: 'onCreate', error }); - } - } - }); - } - } - - updateGroupEntities = () => { - if (this.groups) { - this.groups.forEach((group) => { - group.fields.forEach((fieldName) => this.groupEntities.push(fieldName)); - }); - } - }; - - // eslint-disable-next-line react/no-unused-class-component-methods - handleSubmit = () => { - this.clearErrorMsg(); - this.props.handleFormSubmit(/* isSubmitting */ true, /* closeEntity */ false); - - this.datadict = {}; - - Object.keys(this.state.data).forEach((field) => { - this.datadict[field] = this.state.data[field].value; - }); - - if (this.hook && typeof this.hook.onSave === 'function') { - const validationPass = this.hook.onSave(this.datadict); - if (!validationPass) { - this.props.handleFormSubmit(/* isSubmitting */ false, /* closeEntity */ false); - return; - } - } - const executeValidationSubmit = () => { - Object.keys(this.state.data).forEach((field) => { - this.datadict[field] = this.state.data[field].value; - }); - - // validation for unique name - if ([MODE_CREATE, MODE_CLONE].includes(this.props.mode)) { - const isExistingName = Boolean( - Object.values(this.context?.rowData || {}).find((val) => - Object.keys(val).find((name) => name === this.datadict.name) - ) - ); - - if (isExistingName) { - const index = this.entities.findIndex((e) => e.field === 'name'); - this.setErrorFieldMsg( - 'name', - getFormattedMessage(2, [this.entities[index].label, this.datadict.name]) - ); - this.props.handleFormSubmit(/* isSubmitting */ false, /* closeEntity */ false); - return; - } - } - - // validation condition of required fields in O-Auth - let temEntities; - if (this.isOAuth) { - let reqFields = []; - Object.keys(this.authMap).forEach((type) => { - // `isAuthVal` is required in a case where only single auth type is provided - if (type === this.datadict.auth_type || !this.isAuthVal) { - reqFields = [...reqFields, ...this.authMap[type]]; - } - }); - temEntities = this.entities.map((e) => { - if (reqFields.includes(e.field)) { - // All oauth fields are required except if explicitely `required` is set to `false` - return { required: true, ...e }; - } - return e; - }); - } else { - temEntities = this.entities; - } - - // require elements for UI when they are visible - temEntities = temEntities.map((entity) => { - if (entity?.options?.requiredWhenVisible && this.state.data[entity.field].display) { - return { required: true, ...entity }; - } - return entity; - }); - - // Validation of form fields on Submit - const validator = new Validator(temEntities); - let error = validator.doValidation(this.datadict); - if (error) { - this.setErrorFieldMsg(error.errorField, error.errorMsg); - } else if (this.options && this.options.saveValidator) { - error = SaveValidator(this.options.saveValidator, this.datadict); - if (error) { - this.setErrorMsg(error.errorMsg); - } - } - - if (error) { - this.props.handleFormSubmit(/* isSubmitting */ false, /* closeEntity */ false); - } else if ( - this.isOAuth && - (this.isSingleOauth || (this.isAuthVal && this.datadict.auth_type === 'oauth')) - ) { - // handle oauth Authentication - // Populate the parameter string with client_id, redirect_url and response_type - let parameters = `?response_type=code&client_id=${this.datadict.client_id}&redirect_uri=${this.datadict.redirect_url}`; - // Get the value for state_enabled - const stateEnabled = this.isoauthState != null ? this.isoauthState : false; - if (stateEnabled === 'true' || stateEnabled === true) { - this.state_enabled = true; - // Generating a cryptographically strong state parameter, which will be used ONLY during configuration - this.oauth_state = uuidv4().replace(/-/g, ''); - - // Appending the state in the headers - parameters = `${parameters}&state=${this.oauth_state}`; - } - - if (this.datadict.scope) { - parameters = `${parameters}&scope=${this.datadict.scope}`; - } - - if (this.oauthConf.authEndpointAccessTokenType) { - parameters = `${parameters}&token_access_type=${this.oauthConf.authEndpointAccessTokenType}`; - } - let host = encodeURI( - `https://${this.datadict.endpoint || this.datadict.endpoint_authorize}${ - this.oauthConf.authCodeEndpoint - }${parameters}` - ); - const redirectURI = new URLSearchParams(host).get('redirect_uri'); - host = host.replace(redirectURI, encodeURIComponent(redirectURI)); - - (async () => { - this.isCalled = false; - this.isError = false; - this.isResponse = false; - // Get auth_type element from global config json - - // Open a popup to make auth request - this.childWin = window.open( - host, - `${this.appName} OAuth`, - `width=${this.oauthConf.popupWidth}, height=${this.oauthConf.popupHeight}` - ); - // Callback to receive data from redirect url - window.getMessage = (message) => { - this.isCalled = true; - // On Call back with Auth code this method will be called. - this.handleOauthToken(message); - }; - // Wait till we get auth_code from calling site through redirect url, we will wait for 3 mins - await this.waitForAuthentication(this.oauthConf.authTimeout); - - if (!this.isCalled && this.childWin.closed) { - // Add error message if the user has close the authentication window without taking any action - this.setErrorMsg(ERROR_AUTH_PROCESS_TERMINATED_TRY_AGAIN); - this.props.handleFormSubmit( - /* isSubmitting */ false, - /* closeEntity */ false - ); - return false; - } - - if (!this.isCalled) { - // Add timeout error message - this.setErrorMsg(ERROR_REQUEST_TIMEOUT_TRY_AGAIN); - this.props.handleFormSubmit( - /* isSubmitting */ false, - /* closeEntity */ false - ); - return false; - } - - // Reset called flag as we have to wait till we get the access_token, refresh_token and instance_url - // Wait till we get the response, here we have added wait for 30 secs - await this.waitForBackendResponse(30); - - if (!this.isResponse && !this.isError) { - // Set error message to prevent saving. - this.isError = true; - - // Add timeout error message - this.setErrorMsg(ERROR_REQUEST_TIMEOUT_ACCESS_TOKEN_TRY_AGAIN); - this.props.handleFormSubmit( - /* isSubmitting */ false, - /* closeEntity */ false - ); - return false; - } - return true; - })().then(() => { - if (!this.isError) { - this.saveData(); - } else { - this.props.handleFormSubmit( - /* isSubmitting */ false, - /* closeEntity */ false - ); - } - }); - } else { - this.saveData(); - } - }; - if ( - this.hook && - typeof this.hook.onSave === 'function' && - typeof this.onSavePromise !== 'undefined' - ) { - this.onSavePromise.then(() => { - executeValidationSubmit(); - }); - } else { - executeValidationSubmit(); - } - }; - - saveData = () => { - const body = new URLSearchParams(); - Object.keys(this.datadict).forEach((key) => { - if (this.datadict[key] != null) { - // Custom logic for only sending file content in payload, not file name and file size. - if ( - typeof this.datadict[key] === 'object' && - this.entities.find((x) => x.field === key).type === 'file' - ) { - body.append(key, this.datadict[key].fileContent); - } else { - body.append(key, this.datadict[key]); - } - } - }); - - // clear out fields of other authentication methods when using one - if (this.isAuthVal) { - Object.keys(this.authMap).forEach((type) => { - if (this.datadict.auth_type !== type) { - this.authMap[type].forEach((e) => { - body.set(e, ''); - }); - } - }); - } - - if (this.isOAuth) { - // Prevent passing redirect_url field used in OAuth to backend conf file - body.delete('redirect_url'); - } - if (this.props.mode === MODE_EDIT) { - body.delete('name'); - } - - axiosCallWrapper({ - serviceName: this.endpoint, - body, - customHeaders: { 'Content-Type': 'application/x-www-form-urlencoded' }, - method: 'post', - handleError: false, - }) - .then((response) => { - const val = response?.data?.entry[0]; - if (this.props.mode !== MODE_CONFIG) { - const tmpObj = {}; - - tmpObj[val.name] = { - // ADDON-38581: `datadict` provides fallback values if rh skips - ...this.datadict, - ...val.content, - id: val.id, - name: val.name, - serviceName: this.props.serviceName, - }; - - this.context.setRowData( - update(this.context?.rowData, { - [this.props.serviceName]: { $merge: tmpObj }, - }) - ); - } - if (this.hook && typeof this.hook.onSaveSuccess === 'function') { - this.hook.onSaveSuccess(); - } - if (this.props.mode === MODE_EDIT) { - generateToast(`Updated "${val.name}"`, 'success'); - } else if (this.props.mode === MODE_CONFIG) { - generateToast( - `Updated "${this.mode_config_title ? this.mode_config_title : val.name}"`, - 'success' - ); - } else { - generateToast(`Created "${val.name}"`, 'success'); - } - this.props.handleFormSubmit(/* isSubmitting */ false, /* closeEntity */ true); - }) - .catch((err) => { - const errorSubmitMsg = parseErrorMsg(err); - this.setState({ errorMsg: errorSubmitMsg }); - if (this.hook && typeof this.hook.onSaveFail === 'function') { - this.hook.onSaveFail(); - } - this.props.handleFormSubmit(/* isSubmitting */ false, /* closeEntity */ false); - }); - }; - - handleChange = (field, targetValue) => { - this.setState((prevState) => { - const changes = {}; - if (field === 'auth_type') { - Object.keys(this.authMap).forEach((type) => { - if (type === targetValue) { - this.authMap[type].forEach((e) => { - changes[e] = { display: { $set: true } }; - }); - } else { - this.authMap[type].forEach((e) => { - changes[e] = { display: { $set: false } }; - }); - } - }); - } - - if (this.dependencyMap.has(field)) { - const value = this.dependencyMap.get(field); - Object.keys(value).forEach((loadField) => { - const data = {}; - let load = true; - - value[loadField].forEach((dependency) => { - const required = !!this.entities.find((e) => e.field === dependency) - ?.required; - - const currentValue = - dependency === field ? targetValue : prevState.data[dependency]?.value; - if (required && !currentValue) { - load = false; - data[dependency] = null; - } else { - data[dependency] = currentValue; - } - }); - - if (load) { - changes[loadField] = { - dependencyValues: { $set: data }, - value: { $set: null }, - }; - } - }); - } - - changes[field] = { value: { $set: targetValue } }; - - const newFields = update(prevState, { data: changes }); - const tempState = this.clearAllErrorMsg(newFields); - - if (this.hookDeferred) { - this.hookDeferred.then(() => { - if (typeof this.hook.onChange === 'function') { - this.hook.onChange(field, targetValue, tempState); - } - }); - } - - return tempState; - }); - }; - - addCustomValidator = (field, validatorFunc) => { - const index = this.entities.findIndex((x) => x.field === field); - const validator = [{ type: 'custom', validatorFunc }]; - this.entities[index].validators = validator; - }; - - // Set error message to display and set error in perticular field - setErrorFieldMsg = (field, msg) => { - this.setState((previousState) => { - const newFields = update(previousState, { - data: { [field]: { error: { $set: true } } }, - }); - newFields.errorMsg = msg; - return newFields; - }); - }; - - // Set error in perticular field - // eslint-disable-next-line react/no-unused-class-component-methods - setErrorField = (field) => { - this.setState((previousState) => - update(previousState, { data: { [field]: { error: { $set: true } } } }) - ); - }; - - // Clear error message - clearErrorMsg = () => { - if (this.state.errorMsg) { - this.setState((previousState) => ({ ...previousState, errorMsg: '' })); - } - }; - - // Set error message - setErrorMsg = (msg) => { - this.setState((previousState) => ({ ...previousState, errorMsg: msg })); - }; - - // Clear error/warning message and errors from fields - clearAllErrorMsg = (State) => { - const newFields = State ? { ...State } : { ...this.state }; - newFields.errorMsg = ''; - newFields.warningMsg = this.customWarningMessage || ''; - const newData = State ? { ...State.data } : { ...this.state.data }; - const temData = {}; - Object.keys(newData).forEach((key) => { - if (newData[key].error) { - temData[key] = { ...newData[key], error: false }; - } else { - temData[key] = newData[key]; - } - }); - newFields.data = temData; - return State ? newFields : null; - }; - - // Display error message - generateErrorMessage = () => { - if (this.state.errorMsg) { - return ( - - {this.state.errorMsg} - - ); - } - return null; - }; - - generateWarningMessage = () => { - if (this.state.warningMsg) { - return ( - - {this.state.warningMsg} - - ); - } - return null; - }; - - // generatesubmitMessage - loadHook = (module, type, globalConfig) => { - const myPromise = new Promise((resolve) => { - if (type === 'external') { - import(/* webpackIgnore: true */ `${getBuildDirPath()}/custom/${module}.js`).then( - (external) => { - const Hook = external.default; - this.hook = new Hook( - globalConfig, - this.props.serviceName, - this.state, - this.props.mode, - this.util, - this.props.groupName - ); - resolve(Hook); - } - ); - } else { - __non_webpack_require__( - [`app/${this.appName}/js/build/custom/${module}`], - (Hook) => { - this.hook = new Hook( - globalConfig, - this.props.serviceName, - this.state, - this.props.mode, - this.util - ); - resolve(Hook); - } - ); - } - }); - return myPromise; - }; - - /* - * Function to get access token, refresh token and instance url - * using rest call once oauth code received from child window - */ - // eslint-disable-next-line consistent-return - handleOauthToken = (message) => { - // Check message for error. If error show error message. - if (!message || (message && message.error) || message.code === undefined) { - this.setErrorMsg(ERROR_OCCURRED_TRY_AGAIN); - this.isError = true; - this.isResponse = true; - return false; - } - const stateResponse = message.state; - - if (this.state_enabled === true && this.oauth_state !== stateResponse) { - this.setErrorMsg(ERROR_STATE_MISSING_TRY_AGAIN); - this.isError = true; - this.isResponse = true; - return false; - } - - const code = decodeURIComponent(message.code); - const data = { - method: 'POST', - url: `https://${this.datadict.endpoint || this.datadict.endpoint_token}${ - this.oauthConf.accessTokenEndpoint - }`, - grant_type: 'authorization_code', - client_id: this.datadict.client_id, - client_secret: this.datadict.client_secret, - code, - redirect_uri: this.datadict.redirect_url, - }; - - if (this.datadict.scope) { - data.scope = this.datadict.scope; - } - - const body = new URLSearchParams(); - Object.keys(data).forEach((key) => { - body.append(key, data[key]); - }); - - const OAuthEndpoint = `${this.appName}_oauth/oauth`; - // Internal handler call to get the access token and other values - axiosCallWrapper({ - endpointUrl: OAuthEndpoint, - body, - customHeaders: { 'Content-Type': 'application/x-www-form-urlencoded' }, - method: 'post', - handleError: false, - }) - .then((response) => { - if (response.data.entry[0].content.error === undefined) { - const accessToken = response.data.entry[0].content.access_token; - const instanceUrl = response.data.entry[0].content.instance_url; - const refreshToken = response.data.entry[0].content.refresh_token; - - this.datadict.instance_url = instanceUrl; - this.datadict.refresh_token = refreshToken; - this.datadict.access_token = accessToken; - this.isResponse = true; - return true; - } - this.setErrorMsg(response.data.entry[0].content.error); - this.isError = true; - this.isResponse = true; - return false; - }) - .catch(() => { - this.setErrorMsg(ERROR_OCCURRED_TRY_AGAIN); - this.isError = true; - this.isResponse = true; - return false; - }); - }; - - // Function to wait for authentication call back in child window. - // eslint-disable-next-line consistent-return - waitForAuthentication = async (count) => { - // eslint-disable-next-line no-param-reassign - count -= 1; - // Check if callback function called if called then exit from wait - if (this.isCalled === true) { - return true; - } - // If callback function is not called and count is not reached to 180 then return error for timeout - if (count === 0 || this.childWin.closed) { - this.isError = true; - return false; - } - // else call sleep and recall the same function - await this.sleep(this.waitForAuthentication, count); - }; - - // Function to wait for backend call get response from backend - - // eslint-disable-next-line consistent-return - waitForBackendResponse = async (count) => { - // eslint-disable-next-line no-param-reassign - count += 1; - // Check if callback function called if called then exit from wait - if (this.isResponse === true) { - return true; - } - // If callback function is not called and count is not reached to 60 then return error for timeout - if (count === 60) { - return false; - } - // else call sleep and recall the same function - await this.sleep(this.waitForBackendResponse, count); - }; - - /* - * This function first add sleep for 1 secs and the call the function passed in argument - */ - sleep = async (fn, ...args) => { - await this.timeout(1000); - return fn(...args); - }; - - /* - * This function will resolve the promise once the provided timeout occurs - */ - // eslint-disable-next-line class-methods-use-this - timeout = (ms) => new Promise((resolve) => setTimeout(resolve, ms)); // eslint-disable-line no-promise-executor-return - - renderGroupElements = () => { - let el = null; - if (this.groups && this.groups.length) { - el = this.groups.map((group) => { - const collapsibleElement = - group.fields?.length && - group.fields.map((fieldName) => - this.entities.map((e) => { - if (e.field === fieldName) { - const temState = this.state.data[e.field]; - return ( - - ); - } - return null; - }) - ); - - return ( - - {collapsibleElement} - - ); - }); - } - return el; - }; - - render() { - // onRender method of Hook - if (this.flag) { - if (this.hookDeferred) { - this.hookDeferred.then(() => { - if (typeof this.hook.onRender === 'function') { - try { - this.hook.onRender(); - } catch (error) { - onCustomHookError({ methodName: 'onRender', error }); - } - } - }); - } - - if (this.props.mode === MODE_EDIT) { - if (this.hookDeferred) { - this.hookDeferred.then(() => { - if (typeof this.hook.onEditLoad === 'function') { - try { - this.hook.onEditLoad(); - } catch (error) { - onCustomHookError({ methodName: 'onEditLoad', error }); - } - } - }); - } - } - this.flag = false; - } - return ( -
-
- {this.generateWarningMessage()} - {this.generateErrorMessage()} - {this.entities.map((e) => { - // Return null if we need to show element in a group - if (this.groupEntities.includes(e.field)) { - return null; - } - - const temState = this.state.data[e.field]; - - if (!temState) { - return null; - } - - return ( - - ); - })} - {this.renderGroupElements()} - -
- ); - } -} - -BaseFormView.propTypes = { - page: PropTypes.string, - serviceName: PropTypes.string, - stanzaName: PropTypes.string, - currentServiceState: PropTypes.object, - mode: PropTypes.string, - handleFormSubmit: PropTypes.func, - groupName: PropTypes.string, -}; - -export default BaseFormView; From 5ee23f5fb7ab9ca215d69da714f490179d08f4f1 Mon Sep 17 00:00:00 2001 From: Artem Rys Date: Fri, 26 Jan 2024 12:42:18 +0100 Subject: [PATCH 11/23] chore: remove Hubert from CODEOWNERS (#1029) --- .github/CODEOWNERS | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index 0c59afbe5..b3be68dd5 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,4 +1,3 @@ * @artemrys -/splunk_add_on_ucc_framework/commands/openapi_generator/ @hsekowski-splunk /splunk_add_on_ucc_framework/schema/schema.json @artemrys @vtsvetkov-splunk /ui/ @vtsvetkov-splunk From d0d69ee3d0c71e7e5b64850b67219244b265c031 Mon Sep 17 00:00:00 2001 From: soleksy-splunk <143183665+soleksy-splunk@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:42:27 +0100 Subject: [PATCH 12/23] feat: default warning hidden after any input (#1024) Standard behaviour of warning message to be always be displayed was not intuitive and was requested to be changed into hidden after any input change. there is additional property `alwaysDisplay` in warning message object that is false by default, which enables warning to be always displayed ``` "create": { "message": "Some warning for account text create", "alwaysDisplay": true }, ``` --- docs/advanced/custom_warning.md | 34 +++++++++++++++ docs/configurations.md | 4 +- docs/inputs/index.md | 2 +- mkdocs.yml | 1 + .../schema/schema.json | 24 +++++++---- .../globalConfig.json | 36 ++++++++++++---- ui/src/components/BaseFormView.tsx | 15 ++++--- .../EntityModal/EntityModal.test.tsx | 42 ++++++++++++++++++- ui/src/components/EntityModal/TestConfig.ts | 36 ++++++++++++++-- ui/src/types/globalConfig/pages.ts | 13 ++++-- 10 files changed, 174 insertions(+), 33 deletions(-) create mode 100644 docs/advanced/custom_warning.md diff --git a/docs/advanced/custom_warning.md b/docs/advanced/custom_warning.md new file mode 100644 index 000000000..d891fa153 --- /dev/null +++ b/docs/advanced/custom_warning.md @@ -0,0 +1,34 @@ +This feature allows us to pass broarder description on Input and Configuration page displayed under main description. + +### Warning Properties + +| Property | Type | Description | +| -------- | ------ | ----------------------------------------- | +| create | object | Warning object definition for create form | +| edit | object | Warning object definition for edit form | +| clone | object | Warning object definition for clone form | +| config | object | Warning object definition for config form | + +### Warning Object Properties + +| Property | Type | Description | +| ------------------------------------------------ | ------- | ------------------------------------------------------------------------------------------- | +| message\* | string | Text used for that description, you can put \n to add a breakline | +| alwaysDisplay | boolean | Force warning to be always displayed, even after input changes. Default value is **false**. | + +### Usage + +```json +"warning": { + "create": { + "message": "Some warning for create form", + "alwaysDisplay": true + }, + "edit": { + "message": "Some warning for edit form " + }, + "clone": { + "message": "Some warning for clone form" + } +}, +``` diff --git a/docs/configurations.md b/docs/configurations.md index 6d17431be..b5f9e4cd2 100644 --- a/docs/configurations.md +++ b/docs/configurations.md @@ -8,7 +8,7 @@ proxy configuration and logging level configuration. | ----------------------------------------------------------------- | ------ | ------------------------------------------------------- | | title\* | string | - | | description | string | To provide a brief summary of an configuration page. | -| [subDescription](../advanced/sub_description) | object | To provide broader description of an configuration page | +| [subDescription](./advanced/sub_description) | object | To provide broader description of an configuration page | | [tabs](#tabs-properties)\* | array | To specify a list of tab. | ### Tabs properties @@ -22,7 +22,7 @@ proxy configuration and logging level configuration. | style | string | By specifying this property in the global config file, the forms can either be opened as a new page or in a dialog.
Supported values are "page" or "dialog".
Default value is **dialog**. | | options | object | This property allows you to enable the [saveValidator](../advanced/save_validator) feature. | | hook | object | It is used to add custom behaviour to forms. Visit the [Custom Hook](../custom_ui_extensions/custom_hook) page to learn more. | -| warning | object | It is used to add custom warning message for each of modes ('create', 'edit', 'config', 'clone'), message is displayed on form | +| [warning](./advanced/custom_warning.md) | object | It is used to add custom warning message for each of modes ('create', 'edit', 'config', 'clone'), message is displayed on form | | conf | string | TBD | | restHandlerName | string | TBD | | restHandlerModule | string | TBD | diff --git a/docs/inputs/index.md b/docs/inputs/index.md index ed879b3f2..a563a5cdb 100644 --- a/docs/inputs/index.md +++ b/docs/inputs/index.md @@ -29,7 +29,7 @@ Developers are required to add services in the global config file to create a ne | style | string | By specifying this property in the global config file, the forms can either be opened as a new page or in a dialog.
Supported values are "page" or "dialog".
Default value is **dialog**. | | options | object | This property allows you to enable the [saveValidator](../advanced/save_validator) feature. | | hook | object | It is used to add custom behaviour to forms. Visit the [Custom Hook](../custom_ui_extensions/custom_hook) page to learn more. | -| warning | object | It is used to add custom warning message for each of modes ('create', 'edit', 'config', 'clone'), message is displayed on form | +| [warning](../advanced/custom_warning.md) | object | It is used to add custom warning message for each of modes ('create', 'edit', 'config', 'clone'), message is displayed on form | | [subDescription](../advanced/sub_description) | object | To provide broader description of an inputs page | | conf | string | TBD | | restHandlerName | string | TBD | diff --git a/mkdocs.yml b/mkdocs.yml index 2e4896834..bbc975475 100644 --- a/mkdocs.yml +++ b/mkdocs.yml @@ -64,6 +64,7 @@ nav: - Save Validator: "advanced/save_validator.md" - OS-dependent libraries: "advanced/os-dependent_libraries.md" - Sub Description: "advanced/sub_description.md" + - Custom Warning: "advanced/custom_warning.md" - Troubleshooting: "troubleshooting.md" - Contributing: "contributing.md" - Changelog: "CHANGELOG.md" diff --git a/splunk_add_on_ucc_framework/schema/schema.json b/splunk_add_on_ucc_framework/schema/schema.json index fafad92fd..3a29ab0dc 100644 --- a/splunk_add_on_ucc_framework/schema/schema.json +++ b/splunk_add_on_ucc_framework/schema/schema.json @@ -1974,22 +1974,32 @@ "type": "object", "properties": { "create": { - "type": "string", - "maxLength": 500 + "$ref": "#/definitions/WarningMessageObject" }, "edit": { - "type": "string", - "maxLength": 500 + "$ref": "#/definitions/WarningMessageObject" }, "clone": { - "type": "string", - "maxLength": 500 + "$ref": "#/definitions/WarningMessageObject" }, "config": { + "$ref": "#/definitions/WarningMessageObject" + } + } + }, + "WarningMessageObject": { + "type": "object", + "properties": { + "message": { "type": "string", "maxLength": 500 + }, + "alwaysDisplay": { + "type": "boolean", + "default": false } - } + }, + "required": ["message"] }, "Field": { "type": "string", diff --git a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json index 8de7413b3..646918be7 100644 --- a/tests/testdata/test_addons/package_global_config_everything/globalConfig.json +++ b/tests/testdata/test_addons/package_global_config_everything/globalConfig.json @@ -5,9 +5,16 @@ { "name": "account", "warning": { - "create": "Some warning for account text create", - "edit": "Some warning for account text edit", - "clone": "Some warning for account text clone" + "create": { + "message": "Some warning for account text create", + "alwaysDisplay": true + }, + "edit": { + "message": "Some warning for account text edit" + }, + "clone": { + "message": "Some warning for account text clone" + } }, "table": { "actions": [ @@ -251,7 +258,9 @@ { "name": "proxy", "warning": { - "config": "Some warning for proxy text config" + "config": { + "message": "Some warning for account text config" + } }, "entity": [ { @@ -355,7 +364,9 @@ { "name": "logging", "warning": { - "config": "Some logging for proxy text config" + "config": { + "message": "Some warning for account text config" + } }, "entity": [ { @@ -495,9 +506,18 @@ { "name": "example_input_one", "warning": { - "create": "Some warning for input text create", - "edit": "Some warning for input text edit", - "clone": "Some warning for input text clone" + "create": { + "message": "Some warning for account text create" + }, + "edit": { + "message": "Some warning for account text edit" + }, + "clone": { + "message": "Some warning for account text clone" + }, + "delete": { + "message": "Some warning for account text delete" + } }, "entity": [ { diff --git a/ui/src/components/BaseFormView.tsx b/ui/src/components/BaseFormView.tsx index 60c8ca4da..6c9557ca1 100644 --- a/ui/src/components/BaseFormView.tsx +++ b/ui/src/components/BaseFormView.tsx @@ -116,7 +116,7 @@ class BaseFormView extends PureComponent { childWin?: Window | null; - customWarningMessage: string; + customWarningMessage: { message: string; alwaysDisplay?: boolean }; constructor(props: BaseFormProps, context: React.ContextType) { super(props); @@ -152,7 +152,7 @@ class BaseFormView extends PureComponent { addCustomValidator: this.addCustomValidator, utilCustomFunctions: this.util, }; - this.customWarningMessage = ''; + this.customWarningMessage = { message: '' }; if (props.page === PAGE_INPUT) { globalConfig.pages?.inputs?.services.forEach((service) => { @@ -173,7 +173,9 @@ class BaseFormView extends PureComponent { context?.rowData?.[props.serviceName]?.[props.stanzaName]; } if (props.mode !== 'delete') { - this.customWarningMessage = service?.warning?.[props.mode] || ''; + this.customWarningMessage = service?.warning?.[props.mode] || { + message: '', + }; } } }); @@ -187,7 +189,7 @@ class BaseFormView extends PureComponent { this.entities = tab.entity; this.options = tab.options; if (props.mode !== 'delete') { - this.customWarningMessage = tab?.warning?.[props.mode] || ''; + this.customWarningMessage = tab?.warning?.[props.mode] || { message: '' }; } if (tab.hook) { this.hookDeferred = this.loadHook( @@ -494,7 +496,7 @@ class BaseFormView extends PureComponent { this.state = { data: temState, errorMsg: '', - warningMsg: this.customWarningMessage, + warningMsg: this.customWarningMessage?.message || '', }; // Hook on create method call @@ -955,7 +957,8 @@ class BaseFormView extends PureComponent { clearAllErrorMsg = (State: BaseFormState) => { const newFields = State ? { ...State } : { ...this.state }; newFields.errorMsg = ''; - newFields.warningMsg = this.customWarningMessage || ''; + newFields.warningMsg = + (this.customWarningMessage?.alwaysDisplay && this.customWarningMessage?.message) || ''; const newData: BaseFormStateData = State ? { ...State.data } : { ...this.state.data }; const temData: BaseFormStateData = {}; Object.keys(newData).forEach((key) => { diff --git a/ui/src/components/EntityModal/EntityModal.test.tsx b/ui/src/components/EntityModal/EntityModal.test.tsx index 06b83ab11..788bd5c06 100644 --- a/ui/src/components/EntityModal/EntityModal.test.tsx +++ b/ui/src/components/EntityModal/EntityModal.test.tsx @@ -15,6 +15,8 @@ import { getConfigWithOauthDefaultValue, getConfigWarningMessage, getConfigWithSeparatedEndpointsOAuth, + getConfigWarningMessageAlwaysDisplay, + WARNING_MESSAGES_ALWAYS_DISPLAY, } from './TestConfig'; import { ERROR_AUTH_PROCESS_TERMINATED_TRY_AGAIN } from '../../constants/oAuthErrorMessage'; import { Mode } from '../../constants/modes'; @@ -264,6 +266,8 @@ describe('EntityModal - auth_endpoint_token_access_type', () => { describe('EntityModal - custom warning', () => { const handleRequestClose = jest.fn(); + const DEFAULT_MODE = 'create'; + const DEFAULT_PAGE = 'configuration'; const setUpConfigWithWarningMessageForConfiguration = () => { const newConfig = getConfigWarningMessage(); @@ -309,10 +313,46 @@ describe('EntityModal - custom warning', () => { } renderModal(mode, page); - const warningMessage = screen.getByText(WARNING_MESSAGES[mode]); + const warningMessage = screen.getByText(WARNING_MESSAGES[mode]?.message); expect(warningMessage).toBeInTheDocument(); } ); + + it('warning disappears after input change', async () => { + setUpConfigWithWarningMessageForConfiguration(); + renderModal(DEFAULT_MODE, DEFAULT_PAGE); + const warningMessage = screen.getByText(WARNING_MESSAGES[DEFAULT_MODE]?.message); + expect(warningMessage).toBeInTheDocument(); + const anyInput = screen.getAllByRole('textbox'); + expect(anyInput[0]).toBeInTheDocument(); + + if (anyInput[0]) { + await userEvent.type(anyInput[0], 'aaa'); + } + + expect(warningMessage).not.toBeInTheDocument(); + }); + + const setUpConfigWithWarningMessageAlwaysDisplayed = () => { + const newConfig = getConfigWarningMessageAlwaysDisplay(); + setUnifiedConfig(newConfig); + }; + + it('warning always displayed', async () => { + setUpConfigWithWarningMessageAlwaysDisplayed(); + renderModal(DEFAULT_MODE, DEFAULT_PAGE); + const warningMessage = screen.getByText( + WARNING_MESSAGES_ALWAYS_DISPLAY[DEFAULT_MODE]?.message + ); + expect(warningMessage).toBeInTheDocument(); + const anyInput = screen.getAllByRole('textbox'); + expect(anyInput[0]).toBeInTheDocument(); + + if (anyInput[0]) { + await userEvent.type(anyInput[0], 'aaa'); + } + expect(warningMessage).toBeInTheDocument(); + }); }); describe('Default value', () => { diff --git a/ui/src/components/EntityModal/TestConfig.ts b/ui/src/components/EntityModal/TestConfig.ts index 9bc19a914..fdaa92c58 100644 --- a/ui/src/components/EntityModal/TestConfig.ts +++ b/ui/src/components/EntityModal/TestConfig.ts @@ -223,10 +223,17 @@ export const getConfigEnableFalseForOauth = () => { }; export const WARNING_MESSAGES = { - create: 'Some warning text create', - edit: 'Some warning text edit', - clone: 'Some warning text clone', - config: 'Some warning text config', + create: { message: 'Some warning text create' }, + edit: { message: 'Some warning text edit' }, + clone: { message: 'Some warning text clone' }, + config: { message: 'Some warning text config' }, +}; + +export const WARNING_MESSAGES_ALWAYS_DISPLAY = { + create: { message: 'Some warning text create', alwaysDisplay: true }, + edit: { message: 'Some warning text edit', alwaysDisplay: true }, + clone: { message: 'Some warning text clone', alwaysDisplay: true }, + config: { message: 'Some warning text config', alwaysDisplay: true }, }; export const getConfigWarningMessage = () => { @@ -246,6 +253,27 @@ export const getConfigWarningMessage = () => { return newConfig satisfies z.infer; }; +export const getConfigWarningMessageAlwaysDisplay = () => { + const globalConfig = getGlobalConfigMock(); + const newConfig = { + ...globalConfig, + pages: { + ...globalConfig.pages, + configuration: { + ...globalConfig.pages.configuration, + tabs: [ + { + entity: accessTokenMock, + ...defaultTableProps, + warning: WARNING_MESSAGES_ALWAYS_DISPLAY, + }, + ], + }, + }, + }; + return newConfig satisfies z.infer; +}; + export const getConfigWarningMessageForInputServices = () => { const globalConfig = getGlobalConfigMock(); const newConfig = { diff --git a/ui/src/types/globalConfig/pages.ts b/ui/src/types/globalConfig/pages.ts index 4e99a4baa..5f7cbec1d 100644 --- a/ui/src/types/globalConfig/pages.ts +++ b/ui/src/types/globalConfig/pages.ts @@ -30,12 +30,17 @@ const HooksSchema = z }) .optional(); +const WarningMessageSchema = z.object({ + message: z.string(), + alwaysDisplay: z.boolean().default(false).optional(), +}); + const WarningSchema = z .object({ - create: z.string().optional(), - edit: z.string().optional(), - config: z.string().optional(), - clone: z.string().optional(), + create: WarningMessageSchema.optional(), + edit: WarningMessageSchema.optional(), + config: WarningMessageSchema.optional(), + clone: WarningMessageSchema.optional(), }) .optional(); From d8cf13cd2b0d119bd8a01a3ffb8853c917cbedb9 Mon Sep 17 00:00:00 2001 From: Viktor Tsvetkov <142901247+vtsvetkov-splunk@users.noreply.github.com> Date: Fri, 26 Jan 2024 12:48:32 +0100 Subject: [PATCH 13/23] chore(renovate): disable msw-storybook-addon (#1030) --- renovate.json | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/renovate.json b/renovate.json index 79e694d38..f4be95fd0 100644 --- a/renovate.json +++ b/renovate.json @@ -60,7 +60,7 @@ "matchPackageNames": [ "msw-storybook-addon" ], - "allowedVersions": "!/next|canary/" + "enabled": false }, { "description": "Update package.json versions together with yarn.lock", From 86921c682f77c1936c16e46aa1c6ae34bb25ec64 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Fri, 26 Jan 2024 13:26:32 +0100 Subject: [PATCH 14/23] chore(deps): update all dependencies (#1000) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit [![Mend Renovate](https://app.renovatebot.com/images/banner.svg)](https://renovatebot.com) This PR contains the following updates: | Package | Change | Age | Adoption | Passing | Confidence | Type | Update | |---|---|---|---|---|---|---|---| | [@babel/core](https://babel.dev/docs/en/next/babel-core) ([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-core)) | [`^7.23.7` -> `^7.23.9`](https://renovatebot.com/diffs/npm/@babel%2fcore/7.23.7/7.23.9) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fcore/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fcore/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fcore/7.23.7/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fcore/7.23.7/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [@babel/eslint-parser](https://babel.dev/) ([source](https://togithub.com/babel/babel/tree/HEAD/eslint/babel-eslint-parser)) | [`^7.23.3` -> `^7.23.9`](https://renovatebot.com/diffs/npm/@babel%2feslint-parser/7.23.3/7.23.9) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2feslint-parser/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2feslint-parser/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2feslint-parser/7.23.3/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2feslint-parser/7.23.3/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [@babel/plugin-transform-runtime](https://babel.dev/docs/en/next/babel-plugin-transform-runtime) ([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-plugin-transform-runtime)) | [`^7.23.7` -> `^7.23.9`](https://renovatebot.com/diffs/npm/@babel%2fplugin-transform-runtime/7.23.7/7.23.9) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fplugin-transform-runtime/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fplugin-transform-runtime/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fplugin-transform-runtime/7.23.7/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fplugin-transform-runtime/7.23.7/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [@babel/preset-env](https://babel.dev/docs/en/next/babel-preset-env) ([source](https://togithub.com/babel/babel/tree/HEAD/packages/babel-preset-env)) | [`^7.23.7` -> `^7.23.9`](https://renovatebot.com/diffs/npm/@babel%2fpreset-env/7.23.7/7.23.9) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@babel%2fpreset-env/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@babel%2fpreset-env/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@babel%2fpreset-env/7.23.7/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@babel%2fpreset-env/7.23.7/7.23.9?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | @​splunk/react-ui | [`^4.23.0` -> `^4.24.0`](https://renovatebot.com/diffs/npm/@splunk%2freact-ui/4.23.0/4.24.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@splunk%2freact-ui/4.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@splunk%2freact-ui/4.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@splunk%2freact-ui/4.23.0/4.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@splunk%2freact-ui/4.23.0/4.24.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | minor | | @​splunk/splunk-utils | [`^2.3.4` -> `^3.0.0`](https://renovatebot.com/diffs/npm/@splunk%2fsplunk-utils/2.3.4/3.0.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@splunk%2fsplunk-utils/3.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@splunk%2fsplunk-utils/3.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@splunk%2fsplunk-utils/2.3.4/3.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@splunk%2fsplunk-utils/2.3.4/3.0.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | major | | [@storybook/addon-essentials](https://togithub.com/storybookjs/storybook/tree/next/code/addons/essentials) ([source](https://togithub.com/storybookjs/storybook/tree/HEAD/code/addons/essentials)) | [`^7.6.7` -> `^7.6.10`](https://renovatebot.com/diffs/npm/@storybook%2faddon-essentials/7.6.7/7.6.10) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2faddon-essentials/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2faddon-essentials/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2faddon-essentials/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2faddon-essentials/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [@storybook/addon-interactions](https://togithub.com/storybookjs/storybook/tree/next/code/addons/interactions) ([source](https://togithub.com/storybookjs/storybook/tree/HEAD/code/addons/interactions)) | [`^7.6.7` -> `^7.6.10`](https://renovatebot.com/diffs/npm/@storybook%2faddon-interactions/7.6.7/7.6.10) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2faddon-interactions/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2faddon-interactions/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2faddon-interactions/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2faddon-interactions/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [@storybook/addon-links](https://togithub.com/storybookjs/storybook/tree/next/code/addons/links) ([source](https://togithub.com/storybookjs/storybook/tree/HEAD/code/addons/links)) | [`^7.6.7` -> `^7.6.10`](https://renovatebot.com/diffs/npm/@storybook%2faddon-links/7.6.7/7.6.10) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2faddon-links/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2faddon-links/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2faddon-links/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2faddon-links/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [@storybook/blocks](https://togithub.com/storybookjs/storybook/tree/next/code/ui/blocks) ([source](https://togithub.com/storybookjs/storybook/tree/HEAD/code/ui/blocks)) | [`^7.6.7` -> `^7.6.10`](https://renovatebot.com/diffs/npm/@storybook%2fblocks/7.6.7/7.6.10) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2fblocks/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2fblocks/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2fblocks/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2fblocks/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [@storybook/react](https://togithub.com/storybookjs/storybook/tree/next/code/renderers/react) ([source](https://togithub.com/storybookjs/storybook/tree/HEAD/code/renderers/react)) | [`^7.6.7` -> `^7.6.10`](https://renovatebot.com/diffs/npm/@storybook%2freact/7.6.7/7.6.10) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2freact/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2freact/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2freact/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2freact/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [@storybook/react-webpack5](https://togithub.com/storybookjs/storybook/tree/next/code/frameworks/react-webpack5) ([source](https://togithub.com/storybookjs/storybook/tree/HEAD/code/frameworks/react-webpack5)) | [`^7.6.7` -> `^7.6.10`](https://renovatebot.com/diffs/npm/@storybook%2freact-webpack5/7.6.7/7.6.10) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@storybook%2freact-webpack5/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@storybook%2freact-webpack5/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@storybook%2freact-webpack5/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@storybook%2freact-webpack5/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [@testing-library/jest-dom](https://togithub.com/testing-library/jest-dom) | [`^6.1.6` -> `^6.3.0`](https://renovatebot.com/diffs/npm/@testing-library%2fjest-dom/6.1.6/6.3.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@testing-library%2fjest-dom/6.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@testing-library%2fjest-dom/6.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@testing-library%2fjest-dom/6.1.6/6.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@testing-library%2fjest-dom/6.1.6/6.3.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | minor | | [@types/node](https://togithub.com/DefinitelyTyped/DefinitelyTyped/tree/master/types/node) ([source](https://togithub.com/DefinitelyTyped/DefinitelyTyped/tree/HEAD/types/node)) | [`^20.10.6` -> `^20.11.7`](https://renovatebot.com/diffs/npm/@types%2fnode/20.10.6/20.11.7) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@types%2fnode/20.11.7?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@types%2fnode/20.11.7?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@types%2fnode/20.10.6/20.11.7?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@types%2fnode/20.10.6/20.11.7?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | minor | | [@typescript-eslint/eslint-plugin](https://togithub.com/typescript-eslint/typescript-eslint) ([source](https://togithub.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/eslint-plugin)) | [`^6.17.0` -> `^6.19.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2feslint-plugin/6.17.0/6.19.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2feslint-plugin/6.19.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@typescript-eslint%2feslint-plugin/6.19.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@typescript-eslint%2feslint-plugin/6.17.0/6.19.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2feslint-plugin/6.17.0/6.19.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | minor | | [@typescript-eslint/parser](https://togithub.com/typescript-eslint/typescript-eslint) ([source](https://togithub.com/typescript-eslint/typescript-eslint/tree/HEAD/packages/parser)) | [`^6.17.0` -> `^6.19.1`](https://renovatebot.com/diffs/npm/@typescript-eslint%2fparser/6.17.0/6.19.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/@typescript-eslint%2fparser/6.19.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/@typescript-eslint%2fparser/6.19.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/@typescript-eslint%2fparser/6.17.0/6.19.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/@typescript-eslint%2fparser/6.17.0/6.19.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | minor | | [actions/cache](https://togithub.com/actions/cache) | `v3` -> `v4` | [![age](https://developer.mend.io/api/mc/badges/age/github-tags/actions%2fcache/v4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/github-tags/actions%2fcache/v4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/github-tags/actions%2fcache/v3/v4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/actions%2fcache/v3/v4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | action | major | | [axios](https://axios-http.com) ([source](https://togithub.com/axios/axios)) | [`^1.6.5` -> `^1.6.7`](https://renovatebot.com/diffs/npm/axios/1.6.5/1.6.7) | [![age](https://developer.mend.io/api/mc/badges/age/npm/axios/1.6.7?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/axios/1.6.7?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/axios/1.6.5/1.6.7?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/axios/1.6.5/1.6.7?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | patch | | [css-loader](https://togithub.com/webpack-contrib/css-loader) | [`^6.8.1` -> `^6.9.1`](https://renovatebot.com/diffs/npm/css-loader/6.8.1/6.9.1) | [![age](https://developer.mend.io/api/mc/badges/age/npm/css-loader/6.9.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/css-loader/6.9.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/css-loader/6.8.1/6.9.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/css-loader/6.8.1/6.9.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | minor | | [eslint-plugin-jest](https://togithub.com/jest-community/eslint-plugin-jest) | [`^27.6.1` -> `^27.6.3`](https://renovatebot.com/diffs/npm/eslint-plugin-jest/27.6.1/27.6.3) | [![age](https://developer.mend.io/api/mc/badges/age/npm/eslint-plugin-jest/27.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/eslint-plugin-jest/27.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/eslint-plugin-jest/27.6.1/27.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/eslint-plugin-jest/27.6.1/27.6.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [importlib-metadata](https://togithub.com/python/importlib_metadata) | `6.7.0` -> `7.0.1` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/importlib-metadata/7.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/importlib-metadata/7.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/importlib-metadata/6.7.0/7.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/importlib-metadata/6.7.0/7.0.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dev | major | | [jsonschema](https://togithub.com/python-jsonschema/jsonschema) ([changelog](https://togithub.com/python-jsonschema/jsonschema/blob/main/CHANGELOG.rst)) | `4.17.3` -> `4.21.1` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/jsonschema/4.21.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/jsonschema/4.21.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/jsonschema/4.17.3/4.21.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/jsonschema/4.17.3/4.21.1?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | minor | | [mkdocs-material](https://togithub.com/squidfunk/mkdocs-material) | `9.2.7` -> `9.5.5` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/mkdocs-material/9.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/mkdocs-material/9.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/mkdocs-material/9.2.7/9.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/mkdocs-material/9.2.7/9.5.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dev | minor | | [msw](https://mswjs.io) ([source](https://togithub.com/mswjs/msw)) | [`^2.0.11` -> `^2.1.5`](https://renovatebot.com/diffs/npm/msw/2.0.11/2.1.5) | [![age](https://developer.mend.io/api/mc/badges/age/npm/msw/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/msw/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/msw/2.0.11/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/msw/2.0.11/2.1.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | minor | | [postcss](https://postcss.org/) ([source](https://togithub.com/postcss/postcss)) | [`^8.4.32` -> `^8.4.33`](https://renovatebot.com/diffs/npm/postcss/8.4.32/8.4.33) | [![age](https://developer.mend.io/api/mc/badges/age/npm/postcss/8.4.33?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/postcss/8.4.33?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/postcss/8.4.32/8.4.33?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/postcss/8.4.32/8.4.33?slim=true)](https://docs.renovatebot.com/merge-confidence/) | resolutions | patch | | [pytest-rerunfailures](https://togithub.com/pytest-dev/pytest-rerunfailures) | `11.1.2` -> `13.0` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pytest-rerunfailures/13.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pytest-rerunfailures/13.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pytest-rerunfailures/11.1.2/13.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pytest-rerunfailures/11.1.2/13.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dev | major | | pytest-splunk-addon | `5.2.4` -> `5.2.5` | [![age](https://developer.mend.io/api/mc/badges/age/pypi/pytest-splunk-addon/5.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/pypi/pytest-splunk-addon/5.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/pypi/pytest-splunk-addon/5.2.4/5.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/pypi/pytest-splunk-addon/5.2.4/5.2.5?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dev | patch | | [react-router-dom](https://togithub.com/remix-run/react-router) ([source](https://togithub.com/remix-run/react-router/tree/HEAD/packages/react-router-dom)) | [`^6.21.1` -> `^6.21.3`](https://renovatebot.com/diffs/npm/react-router-dom/6.21.1/6.21.3) | [![age](https://developer.mend.io/api/mc/badges/age/npm/react-router-dom/6.21.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/react-router-dom/6.21.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/react-router-dom/6.21.1/6.21.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/react-router-dom/6.21.1/6.21.3?slim=true)](https://docs.renovatebot.com/merge-confidence/) | dependencies | patch | | [splunk/appinspect-cli-action](https://togithub.com/splunk/appinspect-cli-action) | `v2.0` -> `v2.2` | [![age](https://developer.mend.io/api/mc/badges/age/github-tags/splunk%2fappinspect-cli-action/v2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/github-tags/splunk%2fappinspect-cli-action/v2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/github-tags/splunk%2fappinspect-cli-action/v2.0/v2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/github-tags/splunk%2fappinspect-cli-action/v2.0/v2.2?slim=true)](https://docs.renovatebot.com/merge-confidence/) | action | minor | | [storybook](https://togithub.com/storybookjs/storybook/tree/next/code/lib/cli) ([source](https://togithub.com/storybookjs/storybook/tree/HEAD/code/lib/cli)) | [`^7.6.7` -> `^7.6.10`](https://renovatebot.com/diffs/npm/storybook/7.6.7/7.6.10) | [![age](https://developer.mend.io/api/mc/badges/age/npm/storybook/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/storybook/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/storybook/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/storybook/7.6.7/7.6.10?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [style-loader](https://togithub.com/webpack-contrib/style-loader) | [`^3.3.3` -> `^3.3.4`](https://renovatebot.com/diffs/npm/style-loader/3.3.3/3.3.4) | [![age](https://developer.mend.io/api/mc/badges/age/npm/style-loader/3.3.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/style-loader/3.3.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/style-loader/3.3.3/3.3.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/style-loader/3.3.3/3.3.4?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | patch | | [webpack](https://togithub.com/webpack/webpack) | [`^5.89.0` -> `^5.90.0`](https://renovatebot.com/diffs/npm/webpack/5.89.0/5.90.0) | [![age](https://developer.mend.io/api/mc/badges/age/npm/webpack/5.90.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![adoption](https://developer.mend.io/api/mc/badges/adoption/npm/webpack/5.90.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![passing](https://developer.mend.io/api/mc/badges/compatibility/npm/webpack/5.89.0/5.90.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | [![confidence](https://developer.mend.io/api/mc/badges/confidence/npm/webpack/5.89.0/5.90.0?slim=true)](https://docs.renovatebot.com/merge-confidence/) | devDependencies | minor | --- ### Release Notes
babel/babel (@​babel/core) ### [`v7.23.9`](https://togithub.com/babel/babel/blob/HEAD/CHANGELOG.md#v7239-2024-01-25) [Compare Source](https://togithub.com/babel/babel/compare/v7.23.7...v7.23.9) ##### :bug: Bug Fix - `babel-helper-transform-fixture-test-runner`, `babel-plugin-transform-function-name`, `babel-plugin-transform-modules-systemjs`, `babel-preset-env` - [#​16225](https://togithub.com/babel/babel/pull/16225) fix: `systemjs` re-traverses helpers ([@​liuxingbaoyu](https://togithub.com/liuxingbaoyu)) - `babel-helper-create-class-features-plugin`, `babel-plugin-proposal-decorators` - [#​16226](https://togithub.com/babel/babel/pull/16226) Improve decorated private method check ([@​JLHwung](https://togithub.com/JLHwung)) - `babel-plugin-proposal-decorators`, `babel-plugin-transform-async-generator-functions`, `babel-plugin-transform-runtime`, `babel-preset-env` - [#​16224](https://togithub.com/babel/babel/pull/16224) Properly sort `core-js@3` imports ([@​nicolo-ribaudo](https://togithub.com/nicolo-ribaudo)) - `babel-traverse` - [#​15383](https://togithub.com/babel/babel/pull/15383) fix: Don't throw in `getTypeAnnotation` when using TS+inference ([@​liuxingbaoyu](https://togithub.com/liuxingbaoyu)) - Other - [#​16210](https://togithub.com/babel/babel/pull/16210) \[eslint] Fix `no-use-before-define` for class ref in fields ([@​nicolo-ribaudo](https://togithub.com/nicolo-ribaudo)) ##### :house: Internal - `babel-core`, `babel-parser`, `babel-template` - [#​16222](https://togithub.com/babel/babel/pull/16222) Migrate `eslint-parser` to cts ([@​liuxingbaoyu](https://togithub.com/liuxingbaoyu)) - `babel-types` - [#​16213](https://togithub.com/babel/babel/pull/16213) Remove `@babel/types` props that are not produced by the parser ([@​liuxingbaoyu](https://togithub.com/liuxingbaoyu)) ##### :running_woman: Performance - `babel-parser` - [#​16072](https://togithub.com/babel/babel/pull/16072) perf: Improve parser performance for typescript ([@​liuxingbaoyu](https://togithub.com/liuxingbaoyu)) ##### :microscope: Output optimization - `babel-helper-create-class-features-plugin`, `babel-plugin-proposal-decorators`, `babel-plugin-proposal-destructuring-private`, `babel-plugin-proposal-pipeline-operator`, `babel-plugin-transform-class-properties`, `babel-plugin-transform-class-static-block`, `babel-plugin-transform-new-target`, `babel-plugin-transform-parameters`, `babel-plugin-transform-private-methods`, `babel-preset-env` - [#​16218](https://togithub.com/babel/babel/pull/16218) Improve temporary variables for decorators ([@​liuxingbaoyu](https://togithub.com/liuxingbaoyu)) - `babel-helpers`, `babel-plugin-proposal-explicit-resource-management`, `babel-runtime-corejs2`, `babel-runtime-corejs3`, `babel-runtime` - [#​15959](https://togithub.com/babel/babel/pull/15959) Improve output of `using` ([@​liuxingbaoyu](https://togithub.com/liuxingbaoyu))
storybookjs/storybook (@​storybook/addon-essentials) ### [`v7.6.10`](https://togithub.com/storybookjs/storybook/blob/HEAD/CHANGELOG.md#7610) [Compare Source](https://togithub.com/storybookjs/storybook/compare/v7.6.9...v7.6.10) - CLI: Fix existing version detection in `upgrade` - [#​25642](https://togithub.com/storybookjs/storybook/pull/25642), thanks [@​JReinhold](https://togithub.com/JReinhold)! - React: Fix acorn ecma version warning - [#​25634](https://togithub.com/storybookjs/storybook/pull/25634), thanks [@​dannyhw](https://togithub.com/dannyhw)! ### [`v7.6.9`](https://togithub.com/storybookjs/storybook/compare/v7.6.8...fbb29c1a602b894833d828f57f68d1c86ae51479) [Compare Source](https://togithub.com/storybookjs/storybook/compare/v7.6.8...v7.6.9) ### [`v7.6.8`](https://togithub.com/storybookjs/storybook/blob/HEAD/CHANGELOG.md#768) [Compare Source](https://togithub.com/storybookjs/storybook/compare/v7.6.7...v7.6.8) - Addon-actions: Fix module resolution for react-native - [#​25296](https://togithub.com/storybookjs/storybook/pull/25296), thanks [@​dannyhw](https://togithub.com/dannyhw)! - Storysource: Fix import error - [#​25391](https://togithub.com/storybookjs/storybook/pull/25391), thanks [@​unional](https://togithub.com/unional)!
testing-library/jest-dom (@​testing-library/jest-dom) ### [`v6.3.0`](https://togithub.com/testing-library/jest-dom/releases/tag/v6.3.0) [Compare Source](https://togithub.com/testing-library/jest-dom/compare/v6.2.1...v6.3.0) ##### Features - Support for regular expressions in toHaveClass ([#​563](https://togithub.com/testing-library/jest-dom/issues/563)) ([9787ed5](https://togithub.com/testing-library/jest-dom/commit/9787ed59fcc930e3d33c8a6efe473da3eca01707)) ### [`v6.2.1`](https://togithub.com/testing-library/jest-dom/releases/tag/v6.2.1) [Compare Source](https://togithub.com/testing-library/jest-dom/compare/v6.2.0...v6.2.1) ##### Bug Fixes - Standalone types for "./matchers" export and add Bun support ([#​566](https://togithub.com/testing-library/jest-dom/issues/566)) ([5675b86](https://togithub.com/testing-library/jest-dom/commit/5675b8668c09345e064001784338a85b7bf9f2af)) ### [`v6.2.0`](https://togithub.com/testing-library/jest-dom/releases/tag/v6.2.0) [Compare Source](https://togithub.com/testing-library/jest-dom/compare/v6.1.6...v6.2.0) ##### Features - toHaveAccessibleDescription supports aria-description ([#​565](https://togithub.com/testing-library/jest-dom/issues/565)) ([1fb156c](https://togithub.com/testing-library/jest-dom/commit/1fb156c2b544e0069c56a72a2f1909fe04850f6c))
typescript-eslint/typescript-eslint (@​typescript-eslint/eslint-plugin) ### [`v6.19.1`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#6191-2024-01-22) [Compare Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v6.19.0...v6.19.1) ##### 🩹 Fixes - **type-utils:** preventing isUnsafeAssignment infinite recursive calls - **eslint-plugin:** \[no-unnecessary-condition] fix false positive for type variable ##### ❤️ Thank You - YeonJuan You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website. ### [`v6.19.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#6190-2024-01-15) [Compare Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v6.18.1...v6.19.0) ##### 🚀 Features - **eslint-plugin:** \[prefer-promise-reject-errors] add rule - **eslint-plugin:** \[no-array-delete] add new rule - **eslint-plugin:** \[no-useless-template-literals] add fix suggestions ##### 🩹 Fixes - **eslint-plugin:** \[no-unnecessary-type-assertion] detect unnecessary non-null-assertion on a call expression - **eslint-plugin:** \[no-unnecesary-type-assertion] treat unknown/any as nullable ##### ❤️ Thank You - auvred - Brad Zacher - Josh Goldberg ✨ - Joshua Chen - LJX - Steven - StyleShit You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website. ### [`v6.18.1`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#6181-2024-01-08) [Compare Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v6.18.0...v6.18.1) ##### 🩹 Fixes - **eslint-plugin:** \[no-non-null-assertion] provide valid fix when member access is on next line - **eslint-plugin:** \[no-unnecessary-condition] improve checking optional callee - **eslint-plugin:** \[prefer-readonly] support modifiers of unions and intersections - **eslint-plugin:** \[switch-exhaustiveness-check] fix new allowDefaultCaseForExhaustiveSwitch option ##### ❤️ Thank You - auvred - James - Josh Goldberg ✨ - YeonJuan You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website. ### [`v6.18.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/eslint-plugin/CHANGELOG.md#6180-2024-01-06) [Compare Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v6.17.0...v6.18.0) ##### 🚀 Features - **typescript-estree:** throw on invalid update expressions - **eslint-plugin:** \[no-var-requires, no-require-imports] allow option ##### ❤️ Thank You - auvred - Joshua Chen You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website.
typescript-eslint/typescript-eslint (@​typescript-eslint/parser) ### [`v6.19.1`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#6191-2024-01-22) [Compare Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v6.19.0...v6.19.1) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website. ### [`v6.19.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#6190-2024-01-15) [Compare Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v6.18.1...v6.19.0) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website. ### [`v6.18.1`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#6181-2024-01-08) [Compare Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v6.18.0...v6.18.1) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website. ### [`v6.18.0`](https://togithub.com/typescript-eslint/typescript-eslint/blob/HEAD/packages/parser/CHANGELOG.md#6180-2024-01-06) [Compare Source](https://togithub.com/typescript-eslint/typescript-eslint/compare/v6.17.0...v6.18.0) This was a version bump only for parser to align it with other projects, there were no code changes. You can read about our [versioning strategy](https://main--typescript-eslint.netlify.app/users/versioning) and [releases](https://main--typescript-eslint.netlify.app/users/releases) on our website.
actions/cache (actions/cache) ### [`v4`](https://togithub.com/actions/cache/compare/v3...v4) [Compare Source](https://togithub.com/actions/cache/compare/v3...v4)
axios/axios (axios) ### [`v1.6.7`](https://togithub.com/axios/axios/blob/HEAD/CHANGELOG.md#167-2024-01-25) [Compare Source](https://togithub.com/axios/axios/compare/v1.6.6...v1.6.7) ##### Bug Fixes - capture async stack only for rejections with native error objects; ([#​6203](https://togithub.com/axios/axios/issues/6203)) ([1a08f90](https://togithub.com/axios/axios/commit/1a08f90f402336e4d00e9ee82f211c6adb1640b0)) ##### Contributors to this release - avatar [Dmitriy Mozgovoy](https://togithub.com/DigitalBrainJS "+30/-26 (#​6203 )") - avatar [zhoulixiang](https://togithub.com/zh-lx "+0/-3 (#​6186 )") ### [`v1.6.6`](https://togithub.com/axios/axios/blob/HEAD/CHANGELOG.md#166-2024-01-24) [Compare Source](https://togithub.com/axios/axios/compare/v1.6.5...v1.6.6) ##### Bug Fixes - fixed missed dispatchBeforeRedirect argument ([#​5778](https://togithub.com/axios/axios/issues/5778)) ([a1938ff](https://togithub.com/axios/axios/commit/a1938ff073fcb0f89011f001dfbc1fa1dc995e39)) - wrap errors to improve async stack trace ([#​5987](https://togithub.com/axios/axios/issues/5987)) ([123f354](https://togithub.com/axios/axios/commit/123f354b920f154a209ea99f76b7b2ef3d9ebbab)) ##### Contributors to this release - avatar [Ilya Priven](https://togithub.com/ikonst "+91/-8 (#​5987 )") - avatar [Zao Soula](https://togithub.com/zaosoula "+6/-6 (#​5778 )")
webpack-contrib/css-loader (css-loader) ### [`v6.9.1`](https://togithub.com/webpack-contrib/css-loader/blob/HEAD/CHANGELOG.md#691-2024-01-18) [Compare Source](https://togithub.com/webpack-contrib/css-loader/compare/v6.9.0...v6.9.1) ### [`v6.9.0`](https://togithub.com/webpack-contrib/css-loader/blob/HEAD/CHANGELOG.md#690-2024-01-09) [Compare Source](https://togithub.com/webpack-contrib/css-loader/compare/v6.8.1...v6.9.0) ##### Features - updated generateExportEntry to expose node details ([#​1556](https://togithub.com/webpack-contrib/css-loader/issues/1556)) ([05002f3](https://togithub.com/webpack-contrib/css-loader/commit/05002f39e29afd7e12f9efca4d073bc23e3d2150)) ##### Bug Fixes - css experiment detection ([#​1559](https://togithub.com/webpack-contrib/css-loader/issues/1559)) ([f2cfe30](https://togithub.com/webpack-contrib/css-loader/commit/f2cfe30a8f6b0053a268c0d9c1943bb3c8f01338)) ##### [6.8.1](https://togithub.com/webpack-contrib/css-loader/compare/v6.8.0...v6.8.1) (2023-05-28) ##### Bug Fixes - use `cause` for original errors and warnings ([#​1526](https://togithub.com/webpack-contrib/css-loader/issues/1526)) ([ae3d8ae](https://togithub.com/webpack-contrib/css-loader/commit/ae3d8ae54ecb5706fe9c3449487cc8306699469f))
jest-community/eslint-plugin-jest (eslint-plugin-jest) ### [`v27.6.3`](https://togithub.com/jest-community/eslint-plugin-jest/blob/HEAD/CHANGELOG.md#2763-2024-01-12) [Compare Source](https://togithub.com/jest-community/eslint-plugin-jest/compare/v27.6.2...v27.6.3) ##### Bug Fixes - replace use of deprecated methods ([#​1453](https://togithub.com/jest-community/eslint-plugin-jest/issues/1453)) ([9204a51](https://togithub.com/jest-community/eslint-plugin-jest/commit/9204a51b4a43541e5e59c6c7fb3a3da1e2d49c2b)) ### [`v27.6.2`](https://togithub.com/jest-community/eslint-plugin-jest/blob/HEAD/CHANGELOG.md#2762-2024-01-10) [Compare Source](https://togithub.com/jest-community/eslint-plugin-jest/compare/v27.6.1...v27.6.2) ##### Reverts - Revert "chore: use relative path to parent `tsconfig.json` ([#​1476](https://togithub.com/jest-community/eslint-plugin-jest/issues/1476))" ([5e6199d](https://togithub.com/jest-community/eslint-plugin-jest/commit/5e6199d62154e21ccc732bc09d8bbb87bd3ef748)), closes [#​1476](https://togithub.com/jest-community/eslint-plugin-jest/issues/1476)
python/importlib_metadata (importlib-metadata) ### [`v7.0.1`](https://togithub.com/python/importlib_metadata/compare/v7.0.0...v7.0.1) [Compare Source](https://togithub.com/python/importlib_metadata/compare/v7.0.0...v7.0.1) ### [`v7.0.0`](https://togithub.com/python/importlib_metadata/compare/v6.11.0...v7.0.0) [Compare Source](https://togithub.com/python/importlib_metadata/compare/v6.11.0...v7.0.0) ### [`v6.11.0`](https://togithub.com/python/importlib_metadata/compare/v6.10.0...v6.11.0) [Compare Source](https://togithub.com/python/importlib_metadata/compare/v6.10.0...v6.11.0) ### [`v6.10.0`](https://togithub.com/python/importlib_metadata/compare/v6.9.0...v6.10.0) [Compare Source](https://togithub.com/python/importlib_metadata/compare/v6.9.0...v6.10.0) ### [`v6.9.0`](https://togithub.com/python/importlib_metadata/compare/v6.8.0...v6.9.0) [Compare Source](https://togithub.com/python/importlib_metadata/compare/v6.8.0...v6.9.0) ### [`v6.8.0`](https://togithub.com/python/importlib_metadata/compare/v6.7.0...v6.8.0) [Compare Source](https://togithub.com/python/importlib_metadata/compare/v6.7.0...v6.8.0)
python-jsonschema/jsonschema (jsonschema) ### [`v4.21.1`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4211) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.21.0...v4.21.1) \======= - Slightly speed up the `contains` keyword by removing some unnecessary validator (re-)creation. ### [`v4.21.0`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4210) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.20.0...v4.21.0) \======= - Fix the behavior of `enum` in the presence of `0` or `1` to properly consider `True` and `False` unequal ([#​1208](https://togithub.com/python-jsonschema/jsonschema/issues/1208)). - Special case the error message for `{min,max}{Items,Length,Properties}` when they're checking for emptiness rather than true length. ### [`v4.20.0`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4200) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.19.2...v4.20.0) \======= - Properly consider items (and properties) to be evaluated by `unevaluatedItems` (resp. `unevaluatedProperties`) when behind a `$dynamicRef` as specified by the 2020 and 2019 specifications. - `jsonschema.exceptions.ErrorTree.__setitem__` is now deprecated. More broadly, in general users of `jsonschema` should never be mutating objects owned by the library. ### [`v4.19.2`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4192) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.19.1...v4.19.2) \======= - Fix the error message for additional items when used with heterogeneous arrays. - Don't leak the `additionalItems` keyword into JSON Schema draft 2020-12, where it was replaced by `items`. ### [`v4.19.1`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4191) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.19.0...v4.19.1) \======= - Single label hostnames are now properly considered valid according to the `hostname` format. This is the behavior specified by the relevant RFC (1123). IDN hostname behavior was already correct. ### [`v4.19.0`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4190) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.18.6...v4.19.0) \======= - Importing the `Validator` protocol directly from the package root is deprecated. Import it from `jsonschema.protocols.Validator` instead. - Automatic retrieval of remote references (which is still deprecated) now properly succeeds even if the retrieved resource does not declare which version of JSON Schema it uses. Such resources are assumed to be 2020-12 schemas. This more closely matches the pre-referencing library behavior. ### [`v4.18.6`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4186) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.18.5...v4.18.6) \======= - Set a `jsonschema` specific user agent when automatically retrieving remote references (which is deprecated). ### [`v4.18.5`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4185) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.18.4...v4.18.5) \======= - Declare support for Py3.12 ### [`v4.18.4`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4184) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.18.3...v4.18.4) \======= - Improve the hashability of wrapped referencing exceptions when they contain hashable data. ### [`v4.18.3`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4183) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.18.2...v4.18.3) \======= - Properly preserve `applicable_validators` in extended validators. Specifically, validators extending early drafts where siblings of `$ref` were ignored will properly ignore siblings in the extended validator. ### [`v4.18.2`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4182) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.18.1...v4.18.2) \======= - Fix an additional regression with the deprecated `jsonschema.RefResolver` and pointer resolution. ### [`v4.18.1`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4181) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.18.0...v4.18.1) \======= - Fix a regression with `jsonschema.RefResolver` based resolution when used in combination with a custom validation dialect (via `jsonschema.validators.create`). ### [`v4.18.0`](https://togithub.com/python-jsonschema/jsonschema/blob/HEAD/CHANGELOG.rst#v4180) [Compare Source](https://togithub.com/python-jsonschema/jsonschema/compare/v4.17.3...v4.18.0) \======= This release majorly rehauls the way in which JSON Schema reference resolution is configured. It does so in a way that *should* be backwards compatible, preserving old behavior whilst emitting deprecation warnings. - `jsonschema.RefResolver` is now deprecated in favor of the new `referencing library `\_. `referencing` will begin in beta, but already is more compliant than the existing `$ref` support. This change is a culmination of a meaningful chunk of work to make `$ref` resolution more flexible and more correct. Backwards compatibility *should* be preserved for existing code which uses `RefResolver`, though doing so is again now deprecated, and all such use cases should be doable using the new APIs. Please file issues on the `referencing` tracker if there is functionality missing from it, or here on the `jsonschema` issue tracker if you have issues with existing code not functioning the same, or with figuring out how to change it to use `referencing`. In particular, this referencing change includes a change concerning *automatic* retrieval of remote references (retrieving `http://foo/bar` automatically within a schema). This behavior has always been a potential security risk and counter to the recommendations of the JSON Schema specifications; it has survived this long essentially only for backwards compatibility reasons, and now explicitly produces warnings. The `referencing` library itself will *not* automatically retrieve references if you interact directly with it, so the deprecated behavior is only triggered if you fully rely on the default `$ref` resolution behavior and also include remote references in your schema, which will still be retrieved during the deprecation period (after which they will become an error). - Support for Python 3.7 has been dropped, as it is nearing end-of-life. This should not be a "visible" change in the sense that `requires-python` has been updated, so users using 3.7 should still receive `v4.17.3` when installing the library. - On draft 2019-09, `unevaluatedItems` now properly does *not* consider items to be evaluated by an `additionalItems` schema if `items` is missing from the schema, as the specification says in this case that `additionalItems` must be completely ignored. - Fix the `date` format checker on Python 3.11 (when format assertion behavior is enabled), where it was too liberal ([#​1076](https://togithub.com/python-jsonschema/jsonschema/issues/1076)). - Speed up validation of `unevaluatedProperties` ([#​1075](https://togithub.com/python-jsonschema/jsonschema/issues/1075)). ## Deprecations - `jsonschema.RefResolver` -- see above for details on the replacement - `jsonschema.RefResolutionError` -- see above for details on the replacement - relying on automatic resolution of remote references -- see above for details on the replacement - importing `jsonschema.ErrorTree` -- instead import it via `jsonschema.exceptions.ErrorTree` - importing `jsonschema.FormatError` -- instead import it via `jsonschema.exceptions.FormatError`
squidfunk/mkdocs-material (mkdocs-material) ### [`v9.5.5`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.5.5): mkdocs-material-9.5.5 [Compare Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.5.4...9.5.5) - Updated Tagalog translations - Updated Pillow to 10.2 to mitigate security vulnerabilities - Improved resilience of instant navigation - Fixed [#​6687](https://togithub.com/squidfunk/mkdocs-material/issues/6687): Updated Mermaid.js to version 10.7.0 (latest) - Fixed [#​6652](https://togithub.com/squidfunk/mkdocs-material/issues/6652): Keyboard events in custom elements captured - Fixed [#​6582](https://togithub.com/squidfunk/mkdocs-material/issues/6582): Instant navigation doesn't correctly handle alternate URLs - Fixed [#​6565](https://togithub.com/squidfunk/mkdocs-material/issues/6565): Instant navigation doesn't allow for `onclick` handlers - Fixed [#​6345](https://togithub.com/squidfunk/mkdocs-material/issues/6345): Instant navigation sometimes breaks browser back button - Fixed [#​6334](https://togithub.com/squidfunk/mkdocs-material/issues/6334): Instant navigation doesn't correctly position anchors (Safari) - Fixed [#​6275](https://togithub.com/squidfunk/mkdocs-material/issues/6275): Instant navigation doesn't correctly resolve after 404 - Fixed [#​6102](https://togithub.com/squidfunk/mkdocs-material/issues/6102): Instant navigation reloads page on same link navigation ### [`v9.5.4`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.5.4): mkdocs-material-9.5.4 [Compare Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.5.3...9.5.4) - Fixed [#​6645](https://togithub.com/squidfunk/mkdocs-material/issues/6645): Local storage with invalid value can break site - Fixed [#​6635](https://togithub.com/squidfunk/mkdocs-material/issues/6635): Tags icons before default ignored if default is set ### [`v9.5.3`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.5.3): mkdocs-material-9.5.3 [Compare Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.5.2...9.5.3) - Limited version range of MkDocs to < 1.6 - Updated Macedonian translations - Fixed [#​6520](https://togithub.com/squidfunk/mkdocs-material/issues/6520): Group plugin crashes when using mike - Fixed [#​6494](https://togithub.com/squidfunk/mkdocs-material/issues/6494): Hide author's email address if disabled in git-authors plugin ### [`v9.5.2`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.5.2): mkdocs-material-9.5.2 [Compare Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.5.1...9.5.2) - Fixed types for `slugify` settings in blog plugin config - Fixed [#​6469](https://togithub.com/squidfunk/mkdocs-material/issues/6469): Horizontal scrollbars on MathJax containers ### [`v9.5.1`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.5.1): mkdocs-material-9.5.1 [Compare Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.5.0...9.5.1) - Updated Greek translations - Fixed [#​6464](https://togithub.com/squidfunk/mkdocs-material/issues/6464): Privacy plugin cannot be enabled - Fixed [#​6461](https://togithub.com/squidfunk/mkdocs-material/issues/6461): Sorting blog posts ignores time component in date ### [`v9.5.0`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.5.0): mkdocs-material-9.5.0 [Compare Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.4.14...9.5.0) Merged Insiders features of 'Goat's Horn' funding goal - Added privacy plugin: automatic downloading of external assets - Added support for card grids and grid layouts - Added support for improved tooltips - Added support for content tabs anchor links (deep linking) - Added support for automatic dark/light mode - Added support for document contributors ### [`v9.4.14`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.4.14): mkdocs-material-9.4.14 [Compare Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.4.13...9.4.14) - Added support for linking authors in blog posts ### [`v9.4.13`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.4.13): mkdocs-material-9.4.13 [Compare Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.4.12...9.4.13) - Fixed [#​6365](https://togithub.com/squidfunk/mkdocs-material/issues/6365): Blog plugin pagination links to previous pages broken - Fixed [#​5758](https://togithub.com/squidfunk/mkdocs-material/issues/5758): Updated Mermaid.js to version 10.6.1 (latest) ### [`v9.4.12`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.4.12): mkdocs-material-9.4.12 [Compare Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.4.11...9.4.12) - Improved blog plugin to generate Unicode-aware slugs by default - Fixed non-deterministic order of categories in blog plugin ### [`v9.4.11`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.4.11): mkdocs-material-9.4.11 [Compare Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.4.10...9.4.11) - Fixed [#​6364](https://togithub.com/squidfunk/mkdocs-material/issues/6364): Search plugin crashing when enabling theme while serving - Fixed blog plugin crashing when disabling pagination ### [`v9.4.10`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.4.10): mkdocs-material-9.4.10 [Compare Source](https://togithub.com/squidfunk/mkdocs-material/compare/9.4.9...9.4.10) - Fixed [#​6356](https://togithub.com/squidfunk/mkdocs-material/issues/6356): Version selector can't be disabled via mike's configuration - Fixed [#​6281](https://togithub.com/squidfunk/mkdocs-material/issues/6281): Navigation not rendering due to Safari bug (9.4.2 regression) - Fixed [#​6261](https://togithub.com/squidfunk/mkdocs-material/issues/6261): Navigation expansion animates on first load (9.4.2 regression) ### [`v9.4.9`](https://togithub.com/squidfunk/mkdocs-material/releases/tag/9.4.9): mkdocs-material-9.
--- ### Configuration 📅 **Schedule**: Branch creation - "every 2 weeks on Sunday" (UTC), Automerge - At any time (no schedule defined). 🚦 **Automerge**: Disabled by config. Please merge this manually once you are satisfied. ♻ **Rebasing**: Whenever PR becomes conflicted, or you tick the rebase/retry checkbox. 👻 **Immortal**: This PR will be recreated if closed unmerged. Get [config help](https://togithub.com/renovatebot/renovate/discussions) if that's undesired. --- - [ ] If you want to rebase/retry this PR, check this box --- This PR has been generated by [Mend Renovate](https://www.mend.io/free-developer-tools/renovate/). View repository job log [here](https://developer.mend.io/github/splunk/addonfactory-ucc-generator). Co-authored-by: renovate[bot] <29139614+renovate[bot]@users.noreply.github.com> --- .github/actions/cached-ui-deps/action.yml | 2 +- .github/workflows/build-test-release.yml | 2 +- poetry.lock | 9 +- ui/package.json | 50 +- ui/yarn.lock | 1174 ++++++++++++--------- 5 files changed, 721 insertions(+), 516 deletions(-) diff --git a/.github/actions/cached-ui-deps/action.yml b/.github/actions/cached-ui-deps/action.yml index 0864ccd1b..4b39a56c0 100644 --- a/.github/actions/cached-ui-deps/action.yml +++ b/.github/actions/cached-ui-deps/action.yml @@ -15,7 +15,7 @@ runs: run: echo "dir=$(yarn cache dir)" >> $GITHUB_OUTPUT shell: bash - name: Cache Dependencies - uses: actions/cache@v3 + uses: actions/cache@v4 id: yarn-cache with: path: ${{ steps.yarn-cache-dir-path.outputs.dir }} diff --git a/.github/workflows/build-test-release.yml b/.github/workflows/build-test-release.yml index 21b801592..bd885b204 100644 --- a/.github/workflows/build-test-release.yml +++ b/.github/workflows/build-test-release.yml @@ -282,7 +282,7 @@ jobs: poetry install mkdir tests/packaged poetry run ucc-gen package --path tests/testdata/expected_addons/expected_output_global_config_everything/Splunk_TA_UCCExample -o tests/packaged - - uses: splunk/appinspect-cli-action@v2.0 + - uses: splunk/appinspect-cli-action@v2.2 with: app_path: tests/packaged included_tags: ${{ matrix.tags }} diff --git a/poetry.lock b/poetry.lock index f61d83aa7..9ce7b799f 100644 --- a/poetry.lock +++ b/poetry.lock @@ -1133,13 +1133,13 @@ pytest = ">=5.3" [[package]] name = "pytest-splunk-addon" -version = "5.2.4" +version = "5.2.5" description = "A Dynamic test tool for Splunk Apps and Add-ons" optional = false python-versions = ">=3.7,<4.0" files = [ - {file = "pytest_splunk_addon-5.2.4-py3-none-any.whl", hash = "sha256:13eff67eadbeac6b0c1b54bf25b48aa56db3a8df99d1ed770b4f08a5372a69cc"}, - {file = "pytest_splunk_addon-5.2.4.tar.gz", hash = "sha256:ea30587c15279fc70166e23bb57e236e960281c9d5114763e5d9036a49e3ade7"}, + {file = "pytest_splunk_addon-5.2.5-py3-none-any.whl", hash = "sha256:b400f6071c847bf1ce4d410b3bd58d5f2d04372682be16642e692f7cea1ff3e0"}, + {file = "pytest_splunk_addon-5.2.5.tar.gz", hash = "sha256:759ace16f1ee2cd1e9fe8b3e0aa589aeb187efe0a45b7799a9700d00ec2fede6"}, ] [package.dependencies] @@ -1151,7 +1151,7 @@ jsonschema = ">=4,<5" junitparser = ">=2.2.0,<3.0.0" pytest = ">5.4.0,<8" pytest-ordering = ">=0.6,<0.7" -pytest-xdist = ">=2.3.0,<3.0.0" +pytest-xdist = ">=2.3.0" requests = ">=2.31.0,<3.0.0" splunk-sdk = ">=1.6" splunksplwrapper = ">=1.1.1,<2.0.0" @@ -1268,6 +1268,7 @@ files = [ {file = "PyYAML-6.0.1-cp311-cp311-win_amd64.whl", hash = "sha256:bf07ee2fef7014951eeb99f56f39c9bb4af143d8aa3c21b1677805985307da34"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_10_9_x86_64.whl", hash = "sha256:855fb52b0dc35af121542a76b9a84f8d1cd886ea97c84703eaa6d88e37a2ad28"}, {file = "PyYAML-6.0.1-cp312-cp312-macosx_11_0_arm64.whl", hash = "sha256:40df9b996c2b73138957fe23a16a4f0ba614f4c0efce1e9406a184b6d07fa3a9"}, + {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_aarch64.manylinux2014_aarch64.whl", hash = "sha256:a08c6f0fe150303c1c6b71ebcd7213c2858041a7e01975da3a99aed1e7a378ef"}, {file = "PyYAML-6.0.1-cp312-cp312-manylinux_2_17_x86_64.manylinux2014_x86_64.whl", hash = "sha256:6c22bec3fbe2524cde73d7ada88f6566758a8f7227bfbf93a408a9d86bcc12a0"}, {file = "PyYAML-6.0.1-cp312-cp312-musllinux_1_1_x86_64.whl", hash = "sha256:8d4e9c88387b0f5c7d5f281e55304de64cf7f9c0021a3525bd3b1c542da3b0e4"}, {file = "PyYAML-6.0.1-cp312-cp312-win32.whl", hash = "sha256:d483d2cdf104e7c9fa60c544d92981f12ad66a457afae824d146093b8c294c54"}, diff --git a/ui/package.json b/ui/package.json index a3ae3a335..7682e2d15 100644 --- a/ui/package.json +++ b/ui/package.json @@ -21,11 +21,11 @@ "@splunk/react-icons": "^4.2.0", "@splunk/react-page": "^6.3.3", "@splunk/react-toast-notifications": "^0.11.3", - "@splunk/react-ui": "^4.23.0", - "@splunk/splunk-utils": "^2.3.4", + "@splunk/react-ui": "^4.24.0", + "@splunk/splunk-utils": "^3.0.0", "@splunk/themes": "^0.16.4", "@splunk/ui-utils": "^1.6.0", - "axios": "^1.6.5", + "axios": "^1.6.7", "immutability-helper": "^3.1.1", "license-webpack-plugin": "^4.0.2", "lodash": "^4.17.21", @@ -33,47 +33,47 @@ "react": "^16.14.0", "react-dom": "^16.14.0", "react-is": "^16.13.1", - "react-router-dom": "^6.21.1", + "react-router-dom": "^6.21.3", "styled-components": "^5.3.11", "uuid": "^9.0.1", "zod": "^3.22.4" }, "devDependencies": { - "@babel/core": "^7.23.7", - "@babel/eslint-parser": "^7.23.3", - "@babel/plugin-transform-runtime": "^7.23.7", - "@babel/preset-env": "^7.23.7", + "@babel/core": "^7.23.9", + "@babel/eslint-parser": "^7.23.9", + "@babel/plugin-transform-runtime": "^7.23.9", + "@babel/preset-env": "^7.23.9", "@babel/preset-react": "^7.23.3", "@splunk/babel-preset": "^4.0.0", "@splunk/eslint-config": "^4.0.0", "@splunk/webpack-configs": "^7.0.2", - "@storybook/addon-essentials": "^7.6.7", - "@storybook/addon-interactions": "^7.6.7", - "@storybook/addon-links": "^7.6.7", - "@storybook/blocks": "^7.6.7", - "@storybook/react": "^7.6.7", - "@storybook/react-webpack5": "^7.6.7", + "@storybook/addon-essentials": "^7.6.10", + "@storybook/addon-interactions": "^7.6.10", + "@storybook/addon-links": "^7.6.10", + "@storybook/blocks": "^7.6.10", + "@storybook/react": "^7.6.10", + "@storybook/react-webpack5": "^7.6.10", "@storybook/testing-library": "^0.2.2", - "@testing-library/jest-dom": "^6.1.6", + "@testing-library/jest-dom": "^6.3.0", "@testing-library/react": "^12.1.5", "@testing-library/user-event": "^14.5.2", "@types/jest": "^29.5.11", "@types/js-yaml": "^4.0.9", - "@types/node": "^20.10.6", + "@types/node": "^20.11.7", "@types/react": "^16.14.51", - "@typescript-eslint/eslint-plugin": "^6.17.0", - "@typescript-eslint/parser": "^6.17.0", + "@typescript-eslint/eslint-plugin": "^6.19.1", + "@typescript-eslint/parser": "^6.19.1", "babel-eslint": "^10.1.0", "babel-jest": "^29.7.0", "babel-loader": "^8.3.0", "cross-env": "^7.0.3", - "css-loader": "^6.8.1", + "css-loader": "^6.9.1", "eslint": "^7.32.0", "eslint-config-airbnb": "^18.2.1", "eslint-config-prettier": "^7.2.0", "eslint-import-resolver-typescript": "^3.6.1", "eslint-plugin-import": "^2.29.1", - "eslint-plugin-jest": "^27.6.1", + "eslint-plugin-jest": "^27.6.3", "eslint-plugin-jsx-a11y": "^6.8.0", "eslint-plugin-prettier": "^4.2.1", "eslint-plugin-react": "^7.33.2", @@ -83,18 +83,18 @@ "jest": "^29.7.0", "jest-environment-jsdom": "^29.7.0", "js-yaml": "^4.1.0", - "msw": "^2.0.11", + "msw": "^2.1.5", "msw-storybook-addon": "2.0.0--canary.122.06f0c92.0", "prettier": "^2.8.8", "querystring-es3": "^0.2.1", - "storybook": "^7.6.7", - "style-loader": "^3.3.3", + "storybook": "^7.6.10", + "style-loader": "^3.3.4", "stylelint": "^14.16.1", "ts-node": "^10.9.2", "typescript": "^5.3.3", "undici": "^5.28.2", "url": "^0.11.3", - "webpack": "^5.89.0", + "webpack": "^5.90.0", "webpack-cli": "^5.1.4", "webpack-merge": "^5.10.0" }, @@ -103,7 +103,7 @@ "@types/react": "^16.14.35", "css-what": "^5.0.1", "glob-parent": "^5.1.2", - "postcss": "^8.4.32", + "postcss": "^8.4.33", "semver": "^7.5.4", "strip-ansi": "^6.0.1", "string-width": "^4.2.2" diff --git a/ui/yarn.lock b/ui/yarn.lock index 54904f279..5d37e9094 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -68,31 +68,31 @@ json5 "^2.2.3" semver "^6.3.1" -"@babel/core@^7.23.7": - version "7.23.7" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.7.tgz#4d8016e06a14b5f92530a13ed0561730b5c6483f" - integrity sha512-+UpDgowcmqe36d4NwqvKsyPMlOLNGMsfMmQ5WGCu+siCe3t3dfe9njrzGfdN4qq+bcNUt0+Vw6haRxBOycs4dw== +"@babel/core@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" + integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== dependencies: "@ampproject/remapping" "^2.2.0" "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" "@babel/helper-compilation-targets" "^7.23.6" "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.7" - "@babel/parser" "^7.23.6" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" - "@babel/types" "^7.23.6" + "@babel/helpers" "^7.23.9" + "@babel/parser" "^7.23.9" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" convert-source-map "^2.0.0" debug "^4.1.0" gensync "^1.0.0-beta.2" json5 "^2.2.3" semver "^6.3.1" -"@babel/eslint-parser@^7.23.3": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.3.tgz#7bf0db1c53b54da0c8a12627373554a0828479ca" - integrity sha512-9bTuNlyx7oSstodm1cR1bECj4fkiknsDa1YniISkJemMY3DGhJNYBECbe6QD/q54mp2J8VO66jW3/7uP//iFCw== +"@babel/eslint-parser@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/eslint-parser/-/eslint-parser-7.23.9.tgz#052c13b39144e21fdd1e03fc9b67e98976a1ebfc" + integrity sha512-xPndlO7qxiJbn0ATvfXQBjCS7qApc9xmKHArgI/FTEFxXas5dnjC/VqM37lfZun9dclRYcn+YQAr6uDFy0bB2g== dependencies: "@nicolo-ribaudo/eslint-scope-5-internals" "5.1.1-v1" eslint-visitor-keys "^2.1.0" @@ -168,6 +168,17 @@ lodash.debounce "^4.0.8" resolve "^1.14.2" +"@babel/helper-define-polyfill-provider@^0.5.0": + version "0.5.0" + resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b" + integrity sha512-NovQquuQLAQ5HuyjCz7WQP9MjRj7dx++yspwiyUiGl9ZyadHRSql1HZh5ogRd8W8w6YM6EQ/NTB8rgjLt5W65Q== + dependencies: + "@babel/helper-compilation-targets" "^7.22.6" + "@babel/helper-plugin-utils" "^7.22.5" + debug "^4.1.1" + lodash.debounce "^4.0.8" + resolve "^1.14.2" + "@babel/helper-environment-visitor@^7.22.20": version "7.22.20" resolved "https://registry.npmjs.org/@babel/helper-environment-visitor/-/helper-environment-visitor-7.22.20.tgz#96159db61d34a29dba454c959f5ae4a649ba9167" @@ -297,14 +308,14 @@ "@babel/traverse" "^7.23.6" "@babel/types" "^7.23.6" -"@babel/helpers@^7.23.7": - version "7.23.7" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.7.tgz#eb543c36f81da2873e47b76ee032343ac83bba60" - integrity sha512-6AMnjCoC8wjqBzDHkuqpa7jAKwvMo4dC+lr/TFBz+ucfulO1XMpDnwWPGBNwClOKZ8h6xn5N81W/R5OrcKtCbQ== +"@babel/helpers@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" + integrity sha512-87ICKgU5t5SzOT7sBMfCOZQ2rHjRU+Pcb9BoILMYz600W6DkVRLFBPwQ18gwUVvggqXivaUakpnxWQGbpywbBQ== dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.7" - "@babel/types" "^7.23.6" + "@babel/template" "^7.23.9" + "@babel/traverse" "^7.23.9" + "@babel/types" "^7.23.9" "@babel/highlight@^7.10.4", "@babel/highlight@^7.23.4": version "7.23.4" @@ -320,6 +331,11 @@ resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== +"@babel/parser@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" + integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== + "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression@^7.23.3": version "7.23.3" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression/-/plugin-bugfix-safari-id-destructuring-collision-in-function-expression-7.23.3.tgz#5cd1c87ba9380d0afb78469292c954fee5d2411a" @@ -548,10 +564,10 @@ "@babel/helper-remap-async-to-generator" "^7.22.20" "@babel/plugin-syntax-async-generators" "^7.8.4" -"@babel/plugin-transform-async-generator-functions@^7.23.7": - version "7.23.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.7.tgz#3aa0b4f2fa3788b5226ef9346cf6d16ec61f99cd" - integrity sha512-PdxEpL71bJp1byMG0va5gwQcXHxuEYC/BgI/e88mGTtohbZN28O5Yit0Plkkm/dBzCF/BxmbNcses1RH1T+urA== +"@babel/plugin-transform-async-generator-functions@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz#9adaeb66fc9634a586c5df139c6240d41ed801ce" + integrity sha512-8Q3veQEDGe14dTYuwagbRtwxQDnytyg1JFu4/HwEMETeofocrB0U0ejBJIXoeG/t2oXZ8kzCyI0ZZfbT80VFNQ== dependencies: "@babel/helper-environment-visitor" "^7.22.20" "@babel/helper-plugin-utils" "^7.22.5" @@ -613,6 +629,20 @@ "@babel/helper-split-export-declaration" "^7.22.6" globals "^11.1.0" +"@babel/plugin-transform-classes@^7.23.8": + version "7.23.8" + resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" + integrity sha512-yAYslGsY1bX6Knmg46RjiCiNSwJKv2IUC8qOdYKqMMr0491SXFhcHqOdRDeCRohOOIzwN/90C6mQ9qAKgrP7dg== + dependencies: + "@babel/helper-annotate-as-pure" "^7.22.5" + "@babel/helper-compilation-targets" "^7.23.6" + "@babel/helper-environment-visitor" "^7.22.20" + "@babel/helper-function-name" "^7.23.0" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-replace-supers" "^7.22.20" + "@babel/helper-split-export-declaration" "^7.22.6" + globals "^11.1.0" + "@babel/plugin-transform-computed-properties@^7.23.3": version "7.23.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-computed-properties/-/plugin-transform-computed-properties-7.23.3.tgz#652e69561fcc9d2b50ba4f7ac7f60dcf65e86474" @@ -749,6 +779,16 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-validator-identifier" "^7.22.20" +"@babel/plugin-transform-modules-systemjs@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz#105d3ed46e4a21d257f83a2f9e2ee4203ceda6be" + integrity sha512-KDlPRM6sLo4o1FkiSlXoAa8edLXFsKKIda779fbLrvmeuc3itnjCtaO6RrtoaANsIJANj+Vk1zqbZIMhkCAHVw== + dependencies: + "@babel/helper-hoist-variables" "^7.22.5" + "@babel/helper-module-transforms" "^7.23.3" + "@babel/helper-plugin-utils" "^7.22.5" + "@babel/helper-validator-identifier" "^7.22.20" + "@babel/plugin-transform-modules-umd@^7.23.3": version "7.23.3" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-umd/-/plugin-transform-modules-umd-7.23.3.tgz#5d4395fccd071dfefe6585a4411aa7d6b7d769e9" @@ -904,16 +944,16 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-runtime@^7.23.7": - version "7.23.7" - resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.7.tgz#52bbd20054855beb9deae3bee9ceb05289c343e6" - integrity sha512-fa0hnfmiXc9fq/weK34MUV0drz2pOL/vfKWvN7Qw127hiUPabFCUMgAbYWcchRzMJit4o5ARsK/s+5h0249pLw== +"@babel/plugin-transform-runtime@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/plugin-transform-runtime/-/plugin-transform-runtime-7.23.9.tgz#2c64d0680fc8e09e1dfe8fd5c646fe72abd82004" + integrity sha512-A7clW3a0aSjm3ONU9o2HAILSegJCYlEZmOhmBRReVtIpY/Z/p7yIZ+wR41Z+UipwdGuqwtID/V/dOdZXjwi9gQ== dependencies: "@babel/helper-module-imports" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" - babel-plugin-polyfill-corejs2 "^0.4.7" - babel-plugin-polyfill-corejs3 "^0.8.7" - babel-plugin-polyfill-regenerator "^0.5.4" + babel-plugin-polyfill-corejs2 "^0.4.8" + babel-plugin-polyfill-corejs3 "^0.9.0" + babel-plugin-polyfill-regenerator "^0.5.5" semver "^6.3.1" "@babel/plugin-transform-shorthand-properties@^7.23.3": @@ -1079,10 +1119,10 @@ core-js-compat "^3.31.0" semver "^6.3.1" -"@babel/preset-env@^7.23.7": - version "7.23.7" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.7.tgz#e5d69b9f14db8a13bae4d8e5ce7f360973626241" - integrity sha512-SY27X/GtTz/L4UryMNJ6p4fH4nsgWbz84y9FE0bQeWJP6O5BhgVCt53CotQKHCOeXJel8VyhlhujhlltKms/CA== +"@babel/preset-env@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz#beace3b7994560ed6bf78e4ae2073dff45387669" + integrity sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A== dependencies: "@babel/compat-data" "^7.23.5" "@babel/helper-compilation-targets" "^7.23.6" @@ -1111,13 +1151,13 @@ "@babel/plugin-syntax-top-level-await" "^7.14.5" "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" "@babel/plugin-transform-arrow-functions" "^7.23.3" - "@babel/plugin-transform-async-generator-functions" "^7.23.7" + "@babel/plugin-transform-async-generator-functions" "^7.23.9" "@babel/plugin-transform-async-to-generator" "^7.23.3" "@babel/plugin-transform-block-scoped-functions" "^7.23.3" "@babel/plugin-transform-block-scoping" "^7.23.4" "@babel/plugin-transform-class-properties" "^7.23.3" "@babel/plugin-transform-class-static-block" "^7.23.4" - "@babel/plugin-transform-classes" "^7.23.5" + "@babel/plugin-transform-classes" "^7.23.8" "@babel/plugin-transform-computed-properties" "^7.23.3" "@babel/plugin-transform-destructuring" "^7.23.3" "@babel/plugin-transform-dotall-regex" "^7.23.3" @@ -1133,7 +1173,7 @@ "@babel/plugin-transform-member-expression-literals" "^7.23.3" "@babel/plugin-transform-modules-amd" "^7.23.3" "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-modules-systemjs" "^7.23.3" + "@babel/plugin-transform-modules-systemjs" "^7.23.9" "@babel/plugin-transform-modules-umd" "^7.23.3" "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" "@babel/plugin-transform-new-target" "^7.23.3" @@ -1159,9 +1199,9 @@ "@babel/plugin-transform-unicode-regex" "^7.23.3" "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.7" - babel-plugin-polyfill-corejs3 "^0.8.7" - babel-plugin-polyfill-regenerator "^0.5.4" + babel-plugin-polyfill-corejs2 "^0.4.8" + babel-plugin-polyfill-corejs3 "^0.9.0" + babel-plugin-polyfill-regenerator "^0.5.5" core-js-compat "^3.31.0" semver "^6.3.1" @@ -1238,6 +1278,15 @@ "@babel/parser" "^7.22.15" "@babel/types" "^7.22.15" +"@babel/template@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" + integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== + dependencies: + "@babel/code-frame" "^7.23.5" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" + "@babel/traverse@^7.18.9", "@babel/traverse@^7.23.2", "@babel/traverse@^7.23.6", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": version "7.23.6" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5" @@ -1254,10 +1303,10 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/traverse@^7.23.7": - version "7.23.7" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.7.tgz#9a7bf285c928cb99b5ead19c3b1ce5b310c9c305" - integrity sha512-tY3mM8rH9jM0YHFGyfC0/xf+SB5eKUu7HPj7/k3fpi9dAlsMc5YbQvDi0Sh2QTPXqMhyaAtzAr807TIyfQrmyg== +"@babel/traverse@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" + integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== dependencies: "@babel/code-frame" "^7.23.5" "@babel/generator" "^7.23.6" @@ -1265,8 +1314,8 @@ "@babel/helper-function-name" "^7.23.0" "@babel/helper-hoist-variables" "^7.22.5" "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.6" - "@babel/types" "^7.23.6" + "@babel/parser" "^7.23.9" + "@babel/types" "^7.23.9" debug "^4.3.1" globals "^11.1.0" @@ -1279,6 +1328,15 @@ "@babel/helper-validator-identifier" "^7.22.20" to-fast-properties "^2.0.0" +"@babel/types@^7.23.9": + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" + integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== + dependencies: + "@babel/helper-string-parser" "^7.23.4" + "@babel/helper-validator-identifier" "^7.22.20" + to-fast-properties "^2.0.0" + "@base2/pretty-print-object@1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@base2/pretty-print-object/-/pretty-print-object-1.0.1.tgz#371ba8be66d556812dc7fb169ebc3c08378f69d4" @@ -1296,13 +1354,6 @@ dependencies: cookie "^0.5.0" -"@bundled-es-modules/js-levenshtein@^2.0.1": - version "2.0.1" - resolved "https://registry.npmjs.org/@bundled-es-modules/js-levenshtein/-/js-levenshtein-2.0.1.tgz#b02bbbd546358ab77080a430f0911cfc2b3779c4" - integrity sha512-DERMS3yfbAljKsQc0U2wcqGKUWpdFjwqWuoMugEJlqBnKO180/n+4SR/J8MRDt1AN48X1ovgoD9KrdVXcaa3Rg== - dependencies: - js-levenshtein "^1.1.6" - "@bundled-es-modules/statuses@^1.0.1": version "1.0.1" resolved "https://registry.npmjs.org/@bundled-es-modules/statuses/-/statuses-1.0.1.tgz#761d10f44e51a94902c4da48675b71a76cc98872" @@ -1864,6 +1915,14 @@ "@jridgewell/resolve-uri" "^3.1.0" "@jridgewell/sourcemap-codec" "^1.4.14" +"@jridgewell/trace-mapping@^0.3.20": + version "0.3.22" + resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" + integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== + dependencies: + "@jridgewell/resolve-uri" "^3.1.0" + "@jridgewell/sourcemap-codec" "^1.4.14" + "@juggle/resize-observer@^3.3.1": version "3.4.0" resolved "https://registry.npmjs.org/@juggle/resize-observer/-/resize-observer-3.4.0.tgz#08d6c5e20cf7e4cc02fd181c4b0c225cd31dbb60" @@ -1882,10 +1941,10 @@ resolved "https://registry.npmjs.org/@mswjs/cookies/-/cookies-1.1.0.tgz#1528eb43630caf83a1d75d5332b30e75e9bb1b5b" integrity sha512-0ZcCVQxifZmhwNBoQIrystCb+2sWBY2Zw8lpfJBPCHGCA/HWqehITeCRVIv4VMy8MPlaHo2w2pTHFV2pFfqKPw== -"@mswjs/interceptors@^0.25.13": - version "0.25.13" - resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.25.13.tgz#c7f8b845b5fdbd8f0f71fbbde06d8a40a9e81b35" - integrity sha512-xfjR81WwXPHwhDbqJRHlxYmboJuiSaIKpP4I5TJVFl/EmByOU13jOBT9hmEnxcjR3jvFYoqoNKt7MM9uqerj9A== +"@mswjs/interceptors@^0.25.15": + version "0.25.15" + resolved "https://registry.npmjs.org/@mswjs/interceptors/-/interceptors-0.25.15.tgz#183c5761d3c20e07ac49a206df39a5b6df9e8242" + integrity sha512-s4jdyxmq1eeftfDXJ7MUiK/jlvYaU8Sr75+42hHCVBrYez0k51RHbMitKIKdmsF92Q6gwhp8Sm1MmvdA9llpcg== dependencies: "@open-draft/deferred-promise" "^2.2.0" "@open-draft/logger" "^0.3.0" @@ -2365,10 +2424,10 @@ "@react-spring/shared" "~9.2.6-beta.0" "@react-spring/types" "~9.2.6-beta.0" -"@remix-run/router@1.14.1": - version "1.14.1" - resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.14.1.tgz#6d2dd03d52e604279c38911afc1079d58c50a755" - integrity sha512-Qg4DMQsfPNAs88rb2xkdk03N3bjK4jgX5fR24eHCTR9q6PrhZQZ4UJBPzCHJkIpTRN1UKxx2DzjZmnC+7Lj0Ow== +"@remix-run/router@1.14.2": + version "1.14.2" + resolved "https://registry.npmjs.org/@remix-run/router/-/router-1.14.2.tgz#4d58f59908d9197ba3179310077f25c88e49ed17" + integrity sha512-ACXpdMM9hmKZww21yEqWwiLws/UPLhNKvimN8RrYSqPSvB3ov7sLvAcfvaxePeLvccTQKGdkDIhLYApZVDFuKg== "@sinclair/typebox@^0.27.8": version "0.27.8" @@ -2472,6 +2531,35 @@ tinycolor2 "^1.4.1" use-typed-event-listener "^3.0.0" +"@splunk/react-ui@^4.24.0": + version "4.24.0" + resolved "https://registry.npmjs.org/@splunk/react-ui/-/react-ui-4.24.0.tgz#1250eda179f30c51d22c289d41a07ff0e2fd7c3e" + integrity sha512-qrPKWe8H4w6hl3dIPPeIDgvWqwAk9DjhkVbKw3ffInrLk32bbA816y5WfQZdi0rBhZLOKNl1j4Om875qO33mpQ== + dependencies: + "@dnd-kit/core" "6.0.8" + "@dnd-kit/sortable" "7.0.2" + "@dnd-kit/utilities" "3.2.1" + "@splunk/react-icons" "^4.2.0" + "@splunk/themes" "^0.16.4" + "@splunk/ui-utils" "^1.6.0" + "@types/commonmark" "^0.27.6" + "@types/lodash" "^4.14.156" + "@types/react" "^16.9.38" + "@types/react-dom" "^16.9.8" + "@types/react-resize-detector" "^3.1.1" + "@types/styled-components" "^5.1.0" + "@types/tinycolor2" "^1.4.2" + commonmark "^0.30.0" + commonmark-react-renderer "^4.3.2" + decimal.js-light "^2.2.3" + lodash "^4.17.14" + moment "^2.29.4" + prop-types "^15.6.2" + react-resize-detector "^3.2.1" + react-spring "9.2.4" + tinycolor2 "^1.4.1" + use-typed-event-listener "^3.0.0" + "@splunk/splunk-utils@^2.3.4": version "2.3.4" resolved "https://registry.npmjs.org/@splunk/splunk-utils/-/splunk-utils-2.3.4.tgz#0c86aba8c0c18ce341f04d2d7b38584cfa52befc" @@ -2482,6 +2570,15 @@ scriptjs "^2.5.8" semver "^7.3.8" +"@splunk/splunk-utils@^3.0.0": + version "3.0.0" + resolved "https://registry.npmjs.org/@splunk/splunk-utils/-/splunk-utils-3.0.0.tgz#8e0a13b689c6161f19fc4a5e0cb2392b6485c7d2" + integrity sha512-v2MpSrBqvqjgnKM4+VZmijpeb7Xt3D7KE6mahXwj7QfL0SisDYFIGzA4bNQF5KzBmyoRkyNVnL76FjEblLGDUA== + dependencies: + "@splunk/ui-utils" "^1.6.0" + lodash "^4.17.14" + scriptjs "^2.5.8" + "@splunk/themes@^0.16.3", "@splunk/themes@^0.16.4": version "0.16.4" resolved "https://registry.npmjs.org/@splunk/themes/-/themes-0.16.4.tgz#883ad2ebb2527e8a62d5ed97036906553b44144b" @@ -2512,152 +2609,152 @@ webpack-livereload-plugin "^3.0.2" webpack-merge "^5.9.0" -"@storybook/addon-actions@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.7.tgz#2985d5417c65a9a0bce75a487b09bf1d1140b943" - integrity sha512-+6EZvhIeKEqG/RNsU3R5DxOrd60BL5GEvmzE2w60s2eKaNNxtyilDjiO1g4z2s2zDNyr7JL/Ft03pJ0Jgo0lew== +"@storybook/addon-actions@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-actions/-/addon-actions-7.6.10.tgz#5b43534e158797114db032f4ad8505a81809ed00" + integrity sha512-pcKmf0H/caGzKDy8cz1adNSjv+KOBWLJ11RzGExrWm+Ad5ACifwlsQPykJ3TQ/21sTd9IXVrE9uuq4LldEnPbg== dependencies: - "@storybook/core-events" "7.6.7" + "@storybook/core-events" "7.6.10" "@storybook/global" "^5.0.0" "@types/uuid" "^9.0.1" dequal "^2.0.2" polished "^4.2.2" uuid "^9.0.0" -"@storybook/addon-backgrounds@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.7.tgz#1795abcb45def9ac05fec1d293bf69061201315a" - integrity sha512-55sBy1YUqponAVe+qL16qtWxdf63vHEnIoqFyHEwGpk7K9IhFA1BmdSpFr5VnWEwXeJXKj30db78frh2LUdk3Q== +"@storybook/addon-backgrounds@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-backgrounds/-/addon-backgrounds-7.6.10.tgz#4ecfc017befd400e5eabad347ab1819c2ea67a8c" + integrity sha512-kGzsN1QkfyI8Cz7TErEx9OCB3PMzpCFGLd/iy7FreXwbMbeAQ3/9fYgKUsNOYgOhuTz7S09koZUWjS/WJuZGFA== dependencies: "@storybook/global" "^5.0.0" memoizerific "^1.11.3" ts-dedent "^2.0.0" -"@storybook/addon-controls@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.7.tgz#b9ba4ab78efecf01fde2eecb18ec26e2a2412f6a" - integrity sha512-DJ3gfvcdCgqi7AQxu83vx0AEUKiuJrNcSATfWV3Jqi8dH6fYO2yqpemHEeWOEy+DAHxIOaqLKwb1QjIBj+vSRQ== +"@storybook/addon-controls@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-controls/-/addon-controls-7.6.10.tgz#6cd309440bf2b86c21f11a8b5f20bc1340d6c045" + integrity sha512-LjwCQRMWq1apLtFwDi6U8MI6ITUr+KhxJucZ60tfc58RgB2v8ayozyDAonFEONsx9YSR1dNIJ2Z/e2rWTBJeYA== dependencies: - "@storybook/blocks" "7.6.7" + "@storybook/blocks" "7.6.10" lodash "^4.17.21" ts-dedent "^2.0.0" -"@storybook/addon-docs@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.7.tgz#47f111c4bcf0ea8f238d70219b2c65562f6810ee" - integrity sha512-2dfajNhweofJ3LxjGO83UE5sBMvKtJB0Agj7q8mMtK/9PUCUcbvsFSyZnO/s6X1zAjSn5ZrirbSoTXU4IqxwSA== +"@storybook/addon-docs@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-docs/-/addon-docs-7.6.10.tgz#aab69f253a9cfbb57fd84062f00fac08f9c796cd" + integrity sha512-GtyQ9bMx1AOOtl6ZS9vwK104HFRK+tqzxddRRxhXkpyeKu3olm9aMgXp35atE/3fJSqyyDm2vFtxxH8mzBA20A== dependencies: "@jest/transform" "^29.3.1" "@mdx-js/react" "^2.1.5" - "@storybook/blocks" "7.6.7" - "@storybook/client-logger" "7.6.7" - "@storybook/components" "7.6.7" - "@storybook/csf-plugin" "7.6.7" - "@storybook/csf-tools" "7.6.7" + "@storybook/blocks" "7.6.10" + "@storybook/client-logger" "7.6.10" + "@storybook/components" "7.6.10" + "@storybook/csf-plugin" "7.6.10" + "@storybook/csf-tools" "7.6.10" "@storybook/global" "^5.0.0" "@storybook/mdx2-csf" "^1.0.0" - "@storybook/node-logger" "7.6.7" - "@storybook/postinstall" "7.6.7" - "@storybook/preview-api" "7.6.7" - "@storybook/react-dom-shim" "7.6.7" - "@storybook/theming" "7.6.7" - "@storybook/types" "7.6.7" + "@storybook/node-logger" "7.6.10" + "@storybook/postinstall" "7.6.10" + "@storybook/preview-api" "7.6.10" + "@storybook/react-dom-shim" "7.6.10" + "@storybook/theming" "7.6.10" + "@storybook/types" "7.6.10" fs-extra "^11.1.0" remark-external-links "^8.0.0" remark-slug "^6.0.0" ts-dedent "^2.0.0" -"@storybook/addon-essentials@^7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.7.tgz#6de31f175b0771739ec56dcf445dee0535f1847c" - integrity sha512-nNLMrpIvc04z4XCA+kval/44eKAFJlUJeeL2pxwP7F/PSzjWe5BXv1bQHOiw8inRO5II0PzqwWnVCI9jsj7K5A== - dependencies: - "@storybook/addon-actions" "7.6.7" - "@storybook/addon-backgrounds" "7.6.7" - "@storybook/addon-controls" "7.6.7" - "@storybook/addon-docs" "7.6.7" - "@storybook/addon-highlight" "7.6.7" - "@storybook/addon-measure" "7.6.7" - "@storybook/addon-outline" "7.6.7" - "@storybook/addon-toolbars" "7.6.7" - "@storybook/addon-viewport" "7.6.7" - "@storybook/core-common" "7.6.7" - "@storybook/manager-api" "7.6.7" - "@storybook/node-logger" "7.6.7" - "@storybook/preview-api" "7.6.7" +"@storybook/addon-essentials@^7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-essentials/-/addon-essentials-7.6.10.tgz#9078abe56b15d976e3d4c15247c748b2e8e53c30" + integrity sha512-cjbuCCK/3dtUity0Uqi5LwbkgfxqCCE5x5mXZIk9lTMeDz5vB9q6M5nzncVDy8F8przF3NbDLLgxKlt8wjiICg== + dependencies: + "@storybook/addon-actions" "7.6.10" + "@storybook/addon-backgrounds" "7.6.10" + "@storybook/addon-controls" "7.6.10" + "@storybook/addon-docs" "7.6.10" + "@storybook/addon-highlight" "7.6.10" + "@storybook/addon-measure" "7.6.10" + "@storybook/addon-outline" "7.6.10" + "@storybook/addon-toolbars" "7.6.10" + "@storybook/addon-viewport" "7.6.10" + "@storybook/core-common" "7.6.10" + "@storybook/manager-api" "7.6.10" + "@storybook/node-logger" "7.6.10" + "@storybook/preview-api" "7.6.10" ts-dedent "^2.0.0" -"@storybook/addon-highlight@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.7.tgz#53fb3ba648fcbcfafa2162299fa240b492631d0b" - integrity sha512-2F/tJdn45d4zrvf/cmE1vsczl99wK8+I+kkj0G7jLsrJR0w1zTgbgjy6T9j86HBTBvWcnysNFNIRWPAOh5Wdbw== +"@storybook/addon-highlight@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-highlight/-/addon-highlight-7.6.10.tgz#19cad3d67655e9b9eef3d2f6760789fc29ba0790" + integrity sha512-dIuS5QmoT1R+gFOcf6CoBa6D9UR5/wHCfPqPRH8dNNcCLtIGSHWQ4v964mS5OCq1Huj7CghmR15lOUk7SaYwUA== dependencies: "@storybook/global" "^5.0.0" -"@storybook/addon-interactions@^7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.6.7.tgz#742ea9816bb6eb41abd5f22d6ebac81dc997b7ee" - integrity sha512-iXE2m9i/1D2baYkRgoYe9zwcAjtBOxBfW4o2AS0pzBNPN7elpP9C6mIa0ScpSltawBfIjfe6iQRXAMXOsIIh3Q== +"@storybook/addon-interactions@^7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-interactions/-/addon-interactions-7.6.10.tgz#e1522ed169021f808401dfc46271b8c896abd258" + integrity sha512-lEsAdP/PrOZK/KmRbZ/fU4RjEqDP+e/PBlVVVJT2QvHniWK/xxkjCD0axsHU/XuaeQRFhmg0/KR342PC/cIf9A== dependencies: "@storybook/global" "^5.0.0" - "@storybook/types" "7.6.7" + "@storybook/types" "7.6.10" jest-mock "^27.0.6" polished "^4.2.2" ts-dedent "^2.2.0" -"@storybook/addon-links@^7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.6.7.tgz#9f9c9a259bcb383d6d139c49472a9cd932a157ff" - integrity sha512-O5LekPslkAIDtXC/TCIyg/3c0htBxDYwb/s+NrZUPTNWJsngxvTAwp6aIk6aVSeSCFUMWvBFcVsuV3hv+ndK6w== +"@storybook/addon-links@^7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-links/-/addon-links-7.6.10.tgz#e437d35b360ac9a33ee6078d901417a73f916629" + integrity sha512-s/WkSYHpr2pb9p57j6u/xDBg3TKJhBq55YMl0GB5gXgkRPIeuGbPhGJhm2yTGVFLvXgr/aHHnOxb/R/W8PiRhA== dependencies: "@storybook/csf" "^0.1.2" "@storybook/global" "^5.0.0" ts-dedent "^2.0.0" -"@storybook/addon-measure@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.7.tgz#32f8c53a0cead48040017493d2d8e088038fc65d" - integrity sha512-t1RnnNO4Xzgnsxu63FlZwsCTF0+9jKxr44NiJAUOxW9ppbCvs/JfSDOOvcDRtPWyjgnyzexNUUctMfxvLrU01A== +"@storybook/addon-measure@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-measure/-/addon-measure-7.6.10.tgz#5e41d64aa6e02b9c6df1696d918058979598250e" + integrity sha512-OVfTI56+kc4hLWfZ/YPV3WKj/aA9e4iKXYxZyPdhfX4Z8TgZdD1wv9Z6e8DKS0H5kuybYrHKHaID5ki6t7qz3w== dependencies: "@storybook/global" "^5.0.0" tiny-invariant "^1.3.1" -"@storybook/addon-outline@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.7.tgz#5f33444af0c07482ee75a381742fef002fb0b52e" - integrity sha512-gu2y46ijjMkXlxy1f8Cctgjw5b5y8vSIqNAYlrs5/Qy+hJAWyU6lj2PFGOCCUG4L+F45fAjwWAin6qz43+WnRQ== +"@storybook/addon-outline@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-outline/-/addon-outline-7.6.10.tgz#02b51084cc1d555c270995cebfe512924df0ce7e" + integrity sha512-RVJrEoPArhI6zAIMNl1Gz0zrj84BTfEWYYz0yDWOTVgvN411ugsoIk1hw0671MOneXJ2RcQ9MFIeV/v6AVDQYg== dependencies: "@storybook/global" "^5.0.0" ts-dedent "^2.0.0" -"@storybook/addon-toolbars@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.7.tgz#666641dd01f5e0291b857c19c738dceac279f2da" - integrity sha512-vT+YMzw8yVwndhJglI0XtELfXWq1M0HEy5ST3XPzbjmsJ54LgTf1b29UMkh0E/05qBQNFCcbT9B/tLxqWezxlg== +"@storybook/addon-toolbars@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-toolbars/-/addon-toolbars-7.6.10.tgz#4d841e87acca5455a8339a29c1062612ccb07df6" + integrity sha512-PaXY/oj9yxF7/H0CNdQKcioincyCkfeHpISZriZbZqhyqsjn3vca7RFEmsB88Q+ou6rMeqyA9st+6e2cx/Ct6A== -"@storybook/addon-viewport@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.7.tgz#ea1cdb71abf2ed3be6e6b89d78ea1f5cd506723c" - integrity sha512-Q/BKjJaKzl4RWxH45K2iIXwkicj4ReVAUIpIyd7dPBb/Bx+hEDYZxR5dDg82AMkZdA71x5ttMnuDSuVpmWAE6g== +"@storybook/addon-viewport@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/addon-viewport/-/addon-viewport-7.6.10.tgz#834bad76a56e4117ffb2dc935d349dca3b49bcc3" + integrity sha512-+bA6juC/lH4vEhk+w0rXakaG8JgLG4MOYrIudk5vJKQaC6X58LIM9N4kzIS2KSExRhkExXBPrWsnMfCo7uxmKg== dependencies: memoizerific "^1.11.3" -"@storybook/blocks@7.6.7", "@storybook/blocks@^7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.7.tgz#7fad3d24d9d66ddd04483156b720adcdf9d41812" - integrity sha512-+QEvGQ0he/YvFS3lsZORJWxhQIyqcCDWsxbJxJiByePd+Z4my3q8xwtPhHW0TKRL0xUgNE/GnTfMMqJfevTuSw== +"@storybook/blocks@7.6.10", "@storybook/blocks@^7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/blocks/-/blocks-7.6.10.tgz#353a5efa6a922a9a3766254f9f24cc2adad34f83" + integrity sha512-oSIukGC3yuF8pojABC/HLu5tv2axZvf60TaUs8eDg7+NiiKhzYSPoMQxs5uMrKngl+EJDB92ESgWT9vvsfvIPg== dependencies: - "@storybook/channels" "7.6.7" - "@storybook/client-logger" "7.6.7" - "@storybook/components" "7.6.7" - "@storybook/core-events" "7.6.7" + "@storybook/channels" "7.6.10" + "@storybook/client-logger" "7.6.10" + "@storybook/components" "7.6.10" + "@storybook/core-events" "7.6.10" "@storybook/csf" "^0.1.2" - "@storybook/docs-tools" "7.6.7" + "@storybook/docs-tools" "7.6.10" "@storybook/global" "^5.0.0" - "@storybook/manager-api" "7.6.7" - "@storybook/preview-api" "7.6.7" - "@storybook/theming" "7.6.7" - "@storybook/types" "7.6.7" + "@storybook/manager-api" "7.6.10" + "@storybook/preview-api" "7.6.10" + "@storybook/theming" "7.6.10" + "@storybook/types" "7.6.10" "@types/lodash" "^4.14.167" color-convert "^2.0.1" dequal "^2.0.2" @@ -2671,15 +2768,15 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/builder-manager@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.7.tgz#03ac44dfd4127d147d69af495c1e9aba2d9eda9c" - integrity sha512-6HYpj6+g/qbDMvImVz/G/aANbkhppyBa1ozfHxLK7tRD79YvozCWmj2Z9umRekPv9VIeMxnI5EEzJXOsoMX5DQ== +"@storybook/builder-manager@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/builder-manager/-/builder-manager-7.6.10.tgz#fc30b19dd74e6f6ae896d8f4045552c3206c25f9" + integrity sha512-f+YrjZwohGzvfDtH8BHzqM3xW0p4vjjg9u7uzRorqUiNIAAKHpfNrZ/WvwPlPYmrpAHt4xX/nXRJae4rFSygPw== dependencies: "@fal-works/esbuild-plugin-global-externals" "^2.1.2" - "@storybook/core-common" "7.6.7" - "@storybook/manager" "7.6.7" - "@storybook/node-logger" "7.6.7" + "@storybook/core-common" "7.6.10" + "@storybook/manager" "7.6.10" + "@storybook/node-logger" "7.6.10" "@types/ejs" "^3.1.1" "@types/find-cache-dir" "^3.2.1" "@yarnpkg/esbuild-plugin-pnp" "^3.0.0-rc.10" @@ -2693,26 +2790,27 @@ process "^0.11.10" util "^0.12.4" -"@storybook/builder-webpack5@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.6.7.tgz#65c830e1bf24879ddddf5ff4163278d9fa842b28" - integrity sha512-b5AaWXOHwIXl5Q1iRRl6eRhljId0Zsg0ANawDoubK1y1jsBoQtWal7c4TQPMeLAd2G30fc3sW5zCdb9rCo2Vrg== +"@storybook/builder-webpack5@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/builder-webpack5/-/builder-webpack5-7.6.10.tgz#9cd8ae541e836c089e17e5f8d527b9cad6d4d99f" + integrity sha512-ja47rdy75tAs37T+JLSqgUGJiba+74zM/8IpEZAzgJmGxLetnHuCWEDskZWh3NXemxYS2uCvsg5rNc+dL9z4RA== dependencies: "@babel/core" "^7.23.2" - "@storybook/channels" "7.6.7" - "@storybook/client-logger" "7.6.7" - "@storybook/core-common" "7.6.7" - "@storybook/core-events" "7.6.7" - "@storybook/core-webpack" "7.6.7" - "@storybook/node-logger" "7.6.7" - "@storybook/preview" "7.6.7" - "@storybook/preview-api" "7.6.7" + "@storybook/channels" "7.6.10" + "@storybook/client-logger" "7.6.10" + "@storybook/core-common" "7.6.10" + "@storybook/core-events" "7.6.10" + "@storybook/core-webpack" "7.6.10" + "@storybook/node-logger" "7.6.10" + "@storybook/preview" "7.6.10" + "@storybook/preview-api" "7.6.10" "@swc/core" "^1.3.82" "@types/node" "^18.0.0" "@types/semver" "^7.3.4" babel-loader "^9.0.0" browser-assert "^1.2.1" case-sensitive-paths-webpack-plugin "^2.4.0" + cjs-module-lexer "^1.2.3" constants-browserify "^1.0.0" css-loader "^6.7.1" es-module-lexer "^1.4.1" @@ -2736,35 +2834,35 @@ webpack-hot-middleware "^2.25.1" webpack-virtual-modules "^0.5.0" -"@storybook/channels@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.7.tgz#23a0c59ebfdfbb83e4a49d8d3fafdd25a9a67140" - integrity sha512-u1hURhfQHHtZyRIDUENRCp+CRRm7IQfcjQaoWI06XCevQPuhVEtFUfXHjG+J74aA/JuuTLFUtqwNm1zGqbXTAQ== +"@storybook/channels@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/channels/-/channels-7.6.10.tgz#04fd2c2f0b530bb8d236f5763e8df8cb5fa7c921" + integrity sha512-ITCLhFuDBKgxetuKnWwYqMUWlU7zsfH3gEKZltTb+9/2OAWR7ez0iqU7H6bXP1ridm0DCKkt2UMWj2mmr9iQqg== dependencies: - "@storybook/client-logger" "7.6.7" - "@storybook/core-events" "7.6.7" + "@storybook/client-logger" "7.6.10" + "@storybook/core-events" "7.6.10" "@storybook/global" "^5.0.0" qs "^6.10.0" telejson "^7.2.0" tiny-invariant "^1.3.1" -"@storybook/cli@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.7.tgz#51f12a6cb2cdd10b78f255caca61ef12ffccebc6" - integrity sha512-DwDWzkifBH17ry+n+d+u52Sv69dZQ+04ETJdDDzghcyAcKnFzrRNukj4tJ21cm+ZAU/r0fKR9d4Qpbogca9fAg== +"@storybook/cli@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/cli/-/cli-7.6.10.tgz#2436276c5404b166a9f795fef44bbd75826d9bfe" + integrity sha512-pK1MEseMm73OMO2OVoSz79QWX8ymxgIGM8IeZTCo9gImiVRChMNDFYcv8yPWkjuyesY8c15CoO48aR7pdA1OjQ== dependencies: "@babel/core" "^7.23.2" "@babel/preset-env" "^7.23.2" "@babel/types" "^7.23.0" "@ndelangen/get-tarball" "^3.0.7" - "@storybook/codemod" "7.6.7" - "@storybook/core-common" "7.6.7" - "@storybook/core-events" "7.6.7" - "@storybook/core-server" "7.6.7" - "@storybook/csf-tools" "7.6.7" - "@storybook/node-logger" "7.6.7" - "@storybook/telemetry" "7.6.7" - "@storybook/types" "7.6.7" + "@storybook/codemod" "7.6.10" + "@storybook/core-common" "7.6.10" + "@storybook/core-events" "7.6.10" + "@storybook/core-server" "7.6.10" + "@storybook/csf-tools" "7.6.10" + "@storybook/node-logger" "7.6.10" + "@storybook/telemetry" "7.6.10" + "@storybook/types" "7.6.10" "@types/semver" "^7.3.4" "@yarnpkg/fslib" "2.10.3" "@yarnpkg/libzip" "2.3.0" @@ -2789,31 +2887,30 @@ puppeteer-core "^2.1.1" read-pkg-up "^7.0.1" semver "^7.3.7" - simple-update-notifier "^2.0.0" strip-json-comments "^3.0.1" tempy "^1.0.1" ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/client-logger@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.7.tgz#a2cb75a668c09bf091c1925c3403e3f2f8b1e4e1" - integrity sha512-A16zpWgsa0gSdXMR9P3bWVdC9u/1B1oG4H7Z1+JhNzgnL3CdyOYO0qFSiAtNBso4nOjIAJVb6/AoBzdRhmSVQg== +"@storybook/client-logger@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/client-logger/-/client-logger-7.6.10.tgz#5d66feb18a21836f84b63f71cf5b3a85d669f049" + integrity sha512-U7bbpu21ntgePMz/mKM18qvCSWCUGCUlYru8mgVlXLCKqFqfTeP887+CsPEQf29aoE3cLgDrxqbRJ1wxX9kL9A== dependencies: "@storybook/global" "^5.0.0" -"@storybook/codemod@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.7.tgz#49ee0e824dcb0ae8f1d887266e82ee694d149b6f" - integrity sha512-an2pD5OHqO7CE8Wb7JxjrDnpQgeoxB22MyOs8PPJ9Rvclhpjg+Ku9RogoObYm//zR4g406l7Ec8mTltUkVCEOA== +"@storybook/codemod@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/codemod/-/codemod-7.6.10.tgz#21cc0e69df6f57d567fc27264310f820662d62fa" + integrity sha512-pzFR0nocBb94vN9QCJLC3C3dP734ZigqyPmd0ZCDj9Xce2ytfHK3v1lKB6TZWzKAZT8zztauECYxrbo4LVuagw== dependencies: "@babel/core" "^7.23.2" "@babel/preset-env" "^7.23.2" "@babel/types" "^7.23.0" "@storybook/csf" "^0.1.2" - "@storybook/csf-tools" "7.6.7" - "@storybook/node-logger" "7.6.7" - "@storybook/types" "7.6.7" + "@storybook/csf-tools" "7.6.10" + "@storybook/node-logger" "7.6.10" + "@storybook/types" "7.6.10" "@types/cross-spawn" "^6.0.2" cross-spawn "^7.0.3" globby "^11.0.2" @@ -2822,38 +2919,38 @@ prettier "^2.8.0" recast "^0.23.1" -"@storybook/components@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/components/-/components-7.6.7.tgz#a9d58745b7a11cd7fcb154cfebdbd22b9d210c4e" - integrity sha512-1HN4p+MCI4Tx9VGZayZyqbW7SB7mXQLnS5fUbTE1gXaMYHpzFvcrRNROeV1LZPClJX6qx1jgE5ngZojhxGuxMA== +"@storybook/components@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/components/-/components-7.6.10.tgz#2d1b8c66c374327663b91f65db3b1be5749a1a6b" + integrity sha512-H5hF8pxwtbt0LxV24KMMsPlbYG9Oiui3ObvAQkvGu6q62EYxRPeNSrq3GBI5XEbI33OJY9bT24cVaZx18dXqwQ== dependencies: "@radix-ui/react-select" "^1.2.2" "@radix-ui/react-toolbar" "^1.0.4" - "@storybook/client-logger" "7.6.7" + "@storybook/client-logger" "7.6.10" "@storybook/csf" "^0.1.2" "@storybook/global" "^5.0.0" - "@storybook/theming" "7.6.7" - "@storybook/types" "7.6.7" + "@storybook/theming" "7.6.10" + "@storybook/types" "7.6.10" memoizerific "^1.11.3" use-resize-observer "^9.1.0" util-deprecate "^1.0.2" -"@storybook/core-client@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.7.tgz#5dfd61519101ead2056a2f2b6ef3f265b257899a" - integrity sha512-ZQivyEzYsZok8vRj5Qan7LbiMUnO89rueWzTnZs4IS6JIaQtjoPI1rGVq+h6qOCM6tki478hic8FS+zwGQ6q+w== +"@storybook/core-client@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/core-client/-/core-client-7.6.10.tgz#cd427d7017c1f32b2e956b4eb8ea89f3424b60c9" + integrity sha512-DjnzSzSNDmZyxyg6TxugzWQwOsW+n/iWVv6sHNEvEd5STr0mjuJjIEELmv58LIr5Lsre5+LEddqHsyuLyt8ubg== dependencies: - "@storybook/client-logger" "7.6.7" - "@storybook/preview-api" "7.6.7" + "@storybook/client-logger" "7.6.10" + "@storybook/preview-api" "7.6.10" -"@storybook/core-common@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.7.tgz#69801d7a70b4ed6dab5dec589f612814628d3807" - integrity sha512-F1fJnauVSPQtAlpicbN/O4XW38Ai8kf/IoU0Hgm9gEwurIk6MF5hiVLsaTI/5GUbrepMl9d9J+iIL4lHAT8IyA== +"@storybook/core-common@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/core-common/-/core-common-7.6.10.tgz#00b73761eb3c4452105a7d79b5179237a6f01b32" + integrity sha512-K3YWqjCKMnpvYsWNjOciwTH6zWbuuZzmOiipziZaVJ+sB1XYmH52Y3WGEm07TZI8AYK9DRgwA13dR/7W0nw72Q== dependencies: - "@storybook/core-events" "7.6.7" - "@storybook/node-logger" "7.6.7" - "@storybook/types" "7.6.7" + "@storybook/core-events" "7.6.10" + "@storybook/node-logger" "7.6.10" + "@storybook/types" "7.6.10" "@types/find-cache-dir" "^3.2.1" "@types/node" "^18.0.0" "@types/node-fetch" "^2.6.4" @@ -2875,33 +2972,33 @@ resolve-from "^5.0.0" ts-dedent "^2.0.0" -"@storybook/core-events@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.7.tgz#ee8823090cc4e30fddebe72be29738e4b2e66b11" - integrity sha512-KZ5d03c47pnr5/kY26pJtWq7WpmCPXLbgyjJZDSc+TTY153BdZksvlBXRHtqM1yj2UM6QsSyIuiJaADJNAbP2w== +"@storybook/core-events@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/core-events/-/core-events-7.6.10.tgz#d521cbdadebfa56caaa8815a1e132694a20f05e9" + integrity sha512-yccDH67KoROrdZbRKwxgTswFMAco5nlCyxszCDASCLygGSV2Q2e+YuywrhchQl3U6joiWi3Ps1qWu56NeNafag== dependencies: ts-dedent "^2.0.0" -"@storybook/core-server@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.7.tgz#6d1c3b0d71296bf00438ba5112156f96fc78b2cb" - integrity sha512-elKRv/DNahNNkGcQY/FdOBrLPmZF0T0fwmAmbc4qqeAisjl+to9TO77zdo2ieaEHKyRwE3B3dOB4EXomdF4N/g== +"@storybook/core-server@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/core-server/-/core-server-7.6.10.tgz#53bf43b8b3c999c87196774a0b92e2e10a434e4c" + integrity sha512-2icnqJkn3vwq0eJPP0rNaHd7IOvxYf5q4lSVl2AWTxo/Ae19KhokI6j/2vvS2XQJMGQszwshlIwrZUNsj5p0yw== dependencies: "@aw-web-design/x-default-browser" "1.4.126" "@discoveryjs/json-ext" "^0.5.3" - "@storybook/builder-manager" "7.6.7" - "@storybook/channels" "7.6.7" - "@storybook/core-common" "7.6.7" - "@storybook/core-events" "7.6.7" + "@storybook/builder-manager" "7.6.10" + "@storybook/channels" "7.6.10" + "@storybook/core-common" "7.6.10" + "@storybook/core-events" "7.6.10" "@storybook/csf" "^0.1.2" - "@storybook/csf-tools" "7.6.7" + "@storybook/csf-tools" "7.6.10" "@storybook/docs-mdx" "^0.1.0" "@storybook/global" "^5.0.0" - "@storybook/manager" "7.6.7" - "@storybook/node-logger" "7.6.7" - "@storybook/preview-api" "7.6.7" - "@storybook/telemetry" "7.6.7" - "@storybook/types" "7.6.7" + "@storybook/manager" "7.6.10" + "@storybook/node-logger" "7.6.10" + "@storybook/preview-api" "7.6.10" + "@storybook/telemetry" "7.6.10" + "@storybook/types" "7.6.10" "@types/detect-port" "^1.3.0" "@types/node" "^18.0.0" "@types/pretty-hrtime" "^1.0.0" @@ -2929,36 +3026,36 @@ watchpack "^2.2.0" ws "^8.2.3" -"@storybook/core-webpack@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.6.7.tgz#ca7d70171e104403709d83d8ad8a4027cee5b5c1" - integrity sha512-+UpjJc1fXs9KPIRbTzsBVDgsGQb+VlU3Z7w7XJM1M6ERQrvNAX3oj0iLdDK/AO1ks1qTg+meLFnVwpgKxcTTqg== +"@storybook/core-webpack@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/core-webpack/-/core-webpack-7.6.10.tgz#e4ca086973d4d10f08b5bed789f1398eb983d8b1" + integrity sha512-+GiCRp+2Hw0NO3NYRKamG/U5SyOQ8tOfRUxuAqWI7nduXwB3WWdjji3/ofjqOm/ryKesuQFtfhozaczvBJBvng== dependencies: - "@storybook/core-common" "7.6.7" - "@storybook/node-logger" "7.6.7" - "@storybook/types" "7.6.7" + "@storybook/core-common" "7.6.10" + "@storybook/node-logger" "7.6.10" + "@storybook/types" "7.6.10" "@types/node" "^18.0.0" ts-dedent "^2.0.0" -"@storybook/csf-plugin@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.7.tgz#c4eb87aab082febd8d13dd6c20a01bb2f2bc19af" - integrity sha512-YL7e6H4iVcsDI0UpgpdQX2IiGDrlbgaQMHQgDLWXmZyKxBcy0ONROAX5zoT1ml44EHkL60TMaG4f7SinviJCog== +"@storybook/csf-plugin@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/csf-plugin/-/csf-plugin-7.6.10.tgz#479cffe04c68a87f60589a6891a306805c758437" + integrity sha512-Sc+zZg/BnPH2X28tthNaQBnDiFfO0QmfjVoOx0fGYM9SvY3P5ehzWwp5hMRBim6a/twOTzePADtqYL+t6GMqqg== dependencies: - "@storybook/csf-tools" "7.6.7" + "@storybook/csf-tools" "7.6.10" unplugin "^1.3.1" -"@storybook/csf-tools@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.7.tgz#1707bc5d6289ec79aeab472877aadda76def5015" - integrity sha512-hyRbUGa2Uxvz3U09BjcOfMNf/5IYgRum1L6XszqK2O8tK9DGte1r6hArCIAcqiEmFMC40d0kalPzqu6WMNn7sg== +"@storybook/csf-tools@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/csf-tools/-/csf-tools-7.6.10.tgz#320638f64e2e14cf539dd55188f676fd82789be5" + integrity sha512-TnDNAwIALcN6SA4l00Cb67G02XMOrYU38bIpFJk5VMDX2dvgPjUtJNBuLmEbybGcOt7nPyyFIHzKcY5FCVGoWA== dependencies: "@babel/generator" "^7.23.0" "@babel/parser" "^7.23.0" "@babel/traverse" "^7.23.2" "@babel/types" "^7.23.0" "@storybook/csf" "^0.1.2" - "@storybook/types" "7.6.7" + "@storybook/types" "7.6.10" fs-extra "^11.1.0" recast "^0.23.1" ts-dedent "^2.0.0" @@ -2982,14 +3079,14 @@ resolved "https://registry.npmjs.org/@storybook/docs-mdx/-/docs-mdx-0.1.0.tgz#33ba0e39d1461caf048b57db354b2cc410705316" integrity sha512-JDaBR9lwVY4eSH5W8EGHrhODjygPd6QImRbwjAuJNEnY0Vw4ie3bPkeGfnacB3OBW6u/agqPv2aRlR46JcAQLg== -"@storybook/docs-tools@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.7.tgz#dc496827c50e9ae30dffd0f42076dd085b9b2cd3" - integrity sha512-enTO/xVjBqwUraGCYTwdyjMvug3OSAM7TPPUEJ3KPieJNwAzcYkww/qNDMIAR4S39zPMrkAmtS3STvVadlJz7g== +"@storybook/docs-tools@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/docs-tools/-/docs-tools-7.6.10.tgz#90ce6bcf468b8d0a479fb75e9a6ff87f482095dc" + integrity sha512-UgbikducoXzqQHf2TozO0f2rshaeBNnShVbL5Ai4oW7pDymBmrfzdjGbF/milO7yxNKcoIByeoNmu384eBamgQ== dependencies: - "@storybook/core-common" "7.6.7" - "@storybook/preview-api" "7.6.7" - "@storybook/types" "7.6.7" + "@storybook/core-common" "7.6.10" + "@storybook/preview-api" "7.6.10" + "@storybook/types" "7.6.10" "@types/doctrine" "^0.0.3" assert "^2.1.0" doctrine "^3.0.0" @@ -3000,19 +3097,19 @@ resolved "https://registry.npmjs.org/@storybook/global/-/global-5.0.0.tgz#b793d34b94f572c1d7d9e0f44fac4e0dbc9572ed" integrity sha512-FcOqPAXACP0I3oJ/ws6/rrPT9WGhu915Cg8D02a9YxLo0DE9zI+a9A5gRGvmQ09fiWPukqI8ZAEoQEdWUKMQdQ== -"@storybook/manager-api@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.7.tgz#6e7816df4e789aca73456a383d8da8fc984b7815" - integrity sha512-3Wk/BvuGUlw/X05s57zZO7gJbzfUeE9Xe+CSIvuH7RY5jx9PYnNwqNlTXPXhJ5LPvwMthae7WJVn3SuBpbptoQ== +"@storybook/manager-api@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/manager-api/-/manager-api-7.6.10.tgz#0c2932f42bb97de8fb25240844fcf64474fc8905" + integrity sha512-8eGVpRlpunuFScDtc7nxpPJf/4kJBAAZlNdlhmX09j8M3voX6GpcxabBamSEX5pXZqhwxQCshD4IbqBmjvadlw== dependencies: - "@storybook/channels" "7.6.7" - "@storybook/client-logger" "7.6.7" - "@storybook/core-events" "7.6.7" + "@storybook/channels" "7.6.10" + "@storybook/client-logger" "7.6.10" + "@storybook/core-events" "7.6.10" "@storybook/csf" "^0.1.2" "@storybook/global" "^5.0.0" - "@storybook/router" "7.6.7" - "@storybook/theming" "7.6.7" - "@storybook/types" "7.6.7" + "@storybook/router" "7.6.10" + "@storybook/theming" "7.6.10" + "@storybook/types" "7.6.10" dequal "^2.0.2" lodash "^4.17.21" memoizerific "^1.11.3" @@ -3020,38 +3117,38 @@ telejson "^7.2.0" ts-dedent "^2.0.0" -"@storybook/manager@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.7.tgz#993b4dd4800496ee4161c29e853efe7ee2c1a67f" - integrity sha512-ZCrkB2zEXogzdOcVzD242ZVm4tlHqrayotnI6iOn9uiun0Pgny0m2d7s9Zge6K2dTOO1vZiOHuA/Mr6nnIDjsA== +"@storybook/manager@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/manager/-/manager-7.6.10.tgz#eb1b71c802fbf04353f3bf017dfb102eb0db217e" + integrity sha512-Co3sLCbNYY6O4iH2ggmRDLCPWLj03JE5s/DOG8OVoXc6vBwTc/Qgiyrsxxp6BHQnPpM0mxL6aKAxE3UjsW/Nog== "@storybook/mdx2-csf@^1.0.0": version "1.1.0" resolved "https://registry.npmjs.org/@storybook/mdx2-csf/-/mdx2-csf-1.1.0.tgz#97f6df04d0bf616991cc1005a073ac004a7281e5" integrity sha512-TXJJd5RAKakWx4BtpwvSNdgTDkKM6RkXU8GK34S/LhidQ5Pjz3wcnqb0TxEkfhK/ztbP8nKHqXFwLfa2CYkvQw== -"@storybook/node-logger@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.7.tgz#35cee2b3e4d234b0b0735715d8856dc141d4a9b0" - integrity sha512-XLih8MxylkpZG9+8tgp8sPGc2tldlWF+DpuAkUv6J3Mc81mPyc3cQKQWZ7Hb+m1LpRGqKV4wyOQj1rC+leVMoQ== +"@storybook/node-logger@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/node-logger/-/node-logger-7.6.10.tgz#d4c52d04384d2728d6610fb0afff6eb1feb50fd4" + integrity sha512-ZBuqrv4bjJzKXyfRGFkVIi+z6ekn6rOPoQao4KmsfLNQAUUsEdR8Baw/zMnnU417zw5dSEaZdpuwx75SCQAeOA== -"@storybook/postinstall@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.7.tgz#edb389a2b2d5c85cdf5dfdcc3f19971437e24e89" - integrity sha512-mrpRmcwFd9FcvtHPXA9x6vOrHLVCKScZX/Xx2QPWgAvB3W6uzP8G+8QNb1u834iToxrWeuszUMB9UXZK4Qj5yg== +"@storybook/postinstall@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/postinstall/-/postinstall-7.6.10.tgz#9e81c54b1f23f71a59a6db7ee8a4d5ac40852d17" + integrity sha512-SMdXtednPCy3+SRJ7oN1OPN1oVFhj3ih+ChOEX8/kZ5J3nfmV3wLPtsZvFGUCf0KWQEP1xL+1Urv48mzMKcV/w== -"@storybook/preset-react-webpack@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.6.7.tgz#e5eb2a516a7590b46d146c9a3b9caca333327324" - integrity sha512-olKTivJmbyuiPIa99/4Gx3zxbBplyXgbNso9ZAXHnSf7rBD0irV5oRqk+gFlEFJDHkK9vnpWMenly7vzX8QCXQ== +"@storybook/preset-react-webpack@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/preset-react-webpack/-/preset-react-webpack-7.6.10.tgz#86b34f7156258ddf6481bffd6c638e5382d01054" + integrity sha512-fUcr4dmXJdPIQdjkhA4bE8QF8Pavr4BSLxovtTRupbWxtRjZxJrH5hf+0HZycq1cp9umO/11Lsmw9Nx5Xg3Eww== dependencies: "@babel/preset-flow" "^7.22.15" "@babel/preset-react" "^7.22.15" "@pmmmwh/react-refresh-webpack-plugin" "^0.5.11" - "@storybook/core-webpack" "7.6.7" - "@storybook/docs-tools" "7.6.7" - "@storybook/node-logger" "7.6.7" - "@storybook/react" "7.6.7" + "@storybook/core-webpack" "7.6.10" + "@storybook/docs-tools" "7.6.10" + "@storybook/node-logger" "7.6.10" + "@storybook/react" "7.6.10" "@storybook/react-docgen-typescript-plugin" "1.0.6--canary.9.0c3f3b7.0" "@types/node" "^18.0.0" "@types/semver" "^7.3.4" @@ -3063,17 +3160,17 @@ semver "^7.3.7" webpack "5" -"@storybook/preview-api@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.7.tgz#4f963c95749157f0f9db7fc92c431214057f90e8" - integrity sha512-ja85ItrT6q2TeBQ6n0CNoRi1R6L8yF2kkis9hVeTQHpwLdZyHUTRqqR5WmhtLqqQXcofyasBPOeJV06wuOhgRQ== +"@storybook/preview-api@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/preview-api/-/preview-api-7.6.10.tgz#b8d5a4f897745fc28f0ae75f7e0e9278b0e4a50a" + integrity sha512-5A3etoIwZCx05yuv3KSTv1wynN4SR4rrzaIs/CTBp3BC4q1RBL+Or/tClk0IJPXQMlx/4Y134GtNIBbkiDofpw== dependencies: - "@storybook/channels" "7.6.7" - "@storybook/client-logger" "7.6.7" - "@storybook/core-events" "7.6.7" + "@storybook/channels" "7.6.10" + "@storybook/client-logger" "7.6.10" + "@storybook/core-events" "7.6.10" "@storybook/csf" "^0.1.2" "@storybook/global" "^5.0.0" - "@storybook/types" "7.6.7" + "@storybook/types" "7.6.10" "@types/qs" "^6.9.5" dequal "^2.0.2" lodash "^4.17.21" @@ -3083,10 +3180,10 @@ ts-dedent "^2.0.0" util-deprecate "^1.0.2" -"@storybook/preview@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.7.tgz#50b70a58f9a8f95273e1fd963bbe358935b04dde" - integrity sha512-/ddKIyT+6b8CKGJAma1wood4nwCAoi/E1olCqgpCmviMeUtAiMzgK0xzPwvq5Mxkz/cPeXVi8CQgaQZCa4yvNA== +"@storybook/preview@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/preview/-/preview-7.6.10.tgz#895053c97f7e09141c6321fa42390fa8af377bef" + integrity sha512-F07BzVXTD3byq+KTWtvsw3pUu3fQbyiBNLFr2CnfU4XSdLKja5lDt8VqDQq70TayVQOf5qfUTzRd4M6pQkjw1w== "@storybook/react-docgen-typescript-plugin@1.0.6--canary.9.0c3f3b7.0": version "1.0.6--canary.9.0c3f3b7.0" @@ -3101,33 +3198,33 @@ react-docgen-typescript "^2.2.2" tslib "^2.0.0" -"@storybook/react-dom-shim@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.7.tgz#73db51e895998e91984de751814b22cf7cdfb426" - integrity sha512-b/rmy/YzVrwP+ifyZG4yXVIdeFVdTbmziodHUlbrWiUNsqtTZZur9kqkKRUH/7ofji9MFe81nd0MRlcTNFomqg== +"@storybook/react-dom-shim@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/react-dom-shim/-/react-dom-shim-7.6.10.tgz#d16df5d65a51ed66df92430d8f51d50bd177f2c2" + integrity sha512-M+N/h6ximacaFdIDjMN2waNoWwApeVYTpFeoDppiFTvdBTXChyIuiPgYX9QSg7gDz92OaA52myGOot4wGvXVzg== -"@storybook/react-webpack5@^7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-7.6.7.tgz#a31658bc9d8129bf359dc2d73a566f381093de67" - integrity sha512-/HK+v8vmeApN4WI5RyaDdhPhjFuEQfMQmvZLl+ewpamhJNMRr4nvrdvxOSfBw46zFubKgieuxEcW+VxHwvZ1og== +"@storybook/react-webpack5@^7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/react-webpack5/-/react-webpack5-7.6.10.tgz#f9d3cb4abc4177d43cefcc62d497b2cbee2b5181" + integrity sha512-LWwasiSLEg4wqsMjoRHcOn6BXv2ZyZfTfQV7gCvaX732xf0teblh+/GltAz8x+BtFXruXWmZ8bJ5cd9U4I6hUg== dependencies: - "@storybook/builder-webpack5" "7.6.7" - "@storybook/preset-react-webpack" "7.6.7" - "@storybook/react" "7.6.7" + "@storybook/builder-webpack5" "7.6.10" + "@storybook/preset-react-webpack" "7.6.10" + "@storybook/react" "7.6.10" "@types/node" "^18.0.0" -"@storybook/react@7.6.7", "@storybook/react@^7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/react/-/react-7.6.7.tgz#53af9e97c1c3d0a59601637f655cefb93a426505" - integrity sha512-uT9IBPDM1SQg6FglWqb7IemOJ1Z8kYB5rehIDEDToi0u5INihSY8rHd003TxG4Wx4REp6J+rfbDJO2aVui/gxA== +"@storybook/react@7.6.10", "@storybook/react@^7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/react/-/react-7.6.10.tgz#aca5c446f43de75981f19d112a8a04d7abd0a03d" + integrity sha512-wwBn1cg2uZWW4peqqBjjU7XGmFq8HdkVUtWwh6dpfgmlY1Aopi+vPgZt7pY9KkWcTOq5+DerMdSfwxukpc3ajQ== dependencies: - "@storybook/client-logger" "7.6.7" - "@storybook/core-client" "7.6.7" - "@storybook/docs-tools" "7.6.7" + "@storybook/client-logger" "7.6.10" + "@storybook/core-client" "7.6.10" + "@storybook/docs-tools" "7.6.10" "@storybook/global" "^5.0.0" - "@storybook/preview-api" "7.6.7" - "@storybook/react-dom-shim" "7.6.7" - "@storybook/types" "7.6.7" + "@storybook/preview-api" "7.6.10" + "@storybook/react-dom-shim" "7.6.10" + "@storybook/types" "7.6.10" "@types/escodegen" "^0.0.6" "@types/estree" "^0.0.51" "@types/node" "^18.0.0" @@ -3143,23 +3240,23 @@ type-fest "~2.19" util-deprecate "^1.0.2" -"@storybook/router@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/router/-/router-7.6.7.tgz#790eed44a20496376c6e6fad2dc79c18bb79d28e" - integrity sha512-kkhNSdC3fXaQxILg8a26RKk4/ZbF/AUVrepUEyO8lwvbJ6LItTyWSE/4I9Ih4qV2Mjx33ncc8vLqM9p8r5qnMA== +"@storybook/router@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/router/-/router-7.6.10.tgz#b1f2c550eeb9f7146eefa33c5460e4149a62d721" + integrity sha512-G/H4Jn2+y8PDe8Zbq4DVxF/TPn0/goSItdILts39JENucHiuGBCjKjSWGBe1rkwKi1tUbB3yhxJVrLagxFEPpQ== dependencies: - "@storybook/client-logger" "7.6.7" + "@storybook/client-logger" "7.6.10" memoizerific "^1.11.3" qs "^6.10.0" -"@storybook/telemetry@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.7.tgz#46aed41588fca4f081a9127c473cde1ae8b954e0" - integrity sha512-NHGzC/LGLXpK4AFbVj8ln5ab86ZiiNFvORQMn3+LNGwUt3ZdsHBzExN+WPZdw7OPtfk4ubUY89FXH2GedhTALw== +"@storybook/telemetry@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/telemetry/-/telemetry-7.6.10.tgz#31c0edfb9c7005cf9b5922e51ca896218e3d81ea" + integrity sha512-p3mOSUtIyy2tF1z6pQXxNh1JzYFcAm97nUgkwLzF07GfEdVAPM+ftRSLFbD93zVvLEkmLTlsTiiKaDvOY/lQWg== dependencies: - "@storybook/client-logger" "7.6.7" - "@storybook/core-common" "7.6.7" - "@storybook/csf-tools" "7.6.7" + "@storybook/client-logger" "7.6.10" + "@storybook/core-common" "7.6.10" + "@storybook/csf-tools" "7.6.10" chalk "^4.1.0" detect-package-manager "^2.0.1" fetch-retry "^5.0.2" @@ -3175,22 +3272,22 @@ "@testing-library/user-event" "^14.4.0" ts-dedent "^2.2.0" -"@storybook/theming@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.7.tgz#82450f9c8f59c266e2fa22a1d893fb14bb690d37" - integrity sha512-+42rfC4rZtWVAXJ7JBUQKnQ6vWBXJVHZ9HtNUWzQLPR9sJSMmHnnSMV6y5tizGgZqmBnAIkuoYk+Tt6NfwUmSA== +"@storybook/theming@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/theming/-/theming-7.6.10.tgz#c09d66d19f5756964cc89b1f94051545fc4aaea7" + integrity sha512-f5tuy7yV3TOP3fIboSqpgLHy0wKayAw/M8HxX0jVET4Z4fWlFK0BiHJabQ+XEdAfQM97XhPFHB2IPbwsqhCEcQ== dependencies: "@emotion/use-insertion-effect-with-fallbacks" "^1.0.0" - "@storybook/client-logger" "7.6.7" + "@storybook/client-logger" "7.6.10" "@storybook/global" "^5.0.0" memoizerific "^1.11.3" -"@storybook/types@7.6.7": - version "7.6.7" - resolved "https://registry.npmjs.org/@storybook/types/-/types-7.6.7.tgz#f3935fbd3ba7f958e18106fd1626452a8961ef8c" - integrity sha512-VcGwrI4AkBENxkoAUJ+Z7SyMK73hpoY0TTtw2J7tc05/xdiXhkQTX15Qa12IBWIkoXCyNrtaU+q7KR8Tjzi+uw== +"@storybook/types@7.6.10": + version "7.6.10" + resolved "https://registry.npmjs.org/@storybook/types/-/types-7.6.10.tgz#20cfb2dfeba2ecf54721de131276041d073fe42e" + integrity sha512-hcS2HloJblaMpCAj2axgGV+53kgSRYPT0a1PG1IHsZaYQILfHSMmBqM8XzXXYTsgf9250kz3dqFX1l0n3EqMlQ== dependencies: - "@storybook/channels" "7.6.7" + "@storybook/channels" "7.6.10" "@types/babel__core" "^7.0.0" "@types/express" "^4.7.0" file-system-cache "2.3.0" @@ -3302,17 +3399,17 @@ lz-string "^1.5.0" pretty-format "^27.0.2" -"@testing-library/jest-dom@^6.1.6": - version "6.1.6" - resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.1.6.tgz#d9a3ce61cd74ea792622d3da78a830f6786e8d93" - integrity sha512-YwuiOdYEcxhfC2u5iNKlvg2Q5MgbutovP6drq7J1HrCbvR+G58BbtoCoq+L/kNlrNFsu2Kt3jaFAviLVxYHJZg== +"@testing-library/jest-dom@^6.3.0": + version "6.3.0" + resolved "https://registry.npmjs.org/@testing-library/jest-dom/-/jest-dom-6.3.0.tgz#e8d308e0c0e91d882340cbbfdea0e4daa7987d36" + integrity sha512-hJVIrkFizEQxoWsGBlycTcQhrpoCH4DhXfrnHFFXgkx3Xdm15zycsq5Ep+vpw4W8S0NJa8cxDHcuJib+1tEbhg== dependencies: "@adobe/css-tools" "^4.3.2" "@babel/runtime" "^7.9.2" aria-query "^5.0.0" chalk "^3.0.0" css.escape "^1.5.1" - dom-accessibility-api "^0.5.6" + dom-accessibility-api "^0.6.3" lodash "^4.17.15" redent "^3.0.0" @@ -3418,10 +3515,10 @@ dependencies: "@types/node" "*" -"@types/cookie@^0.4.1": - version "0.4.1" - resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.4.1.tgz#bfd02c1f2224567676c1545199f87c3a861d878d" - integrity sha512-XW/Aa8APYr6jSVVA1y/DEIZX0/GMKLEVekNG727R8cs56ahETkRAy/3DR7+fJyh7oUgGwNQaRfXCun0+KbWY7Q== +"@types/cookie@^0.6.0": + version "0.6.0" + resolved "https://registry.npmjs.org/@types/cookie/-/cookie-0.6.0.tgz#eac397f28bf1d6ae0ae081363eca2f425bedf0d5" + integrity sha512-4Kh9a6B2bQciAhf7FSuMRRkUWecJgJu9nPnx3yzpsfXX/c50REIqpHY4C82bXP90qrLtXtkDxTZosYO3UpOwlA== "@types/cross-spawn@^6.0.2": version "6.0.6" @@ -3476,7 +3573,7 @@ "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^1.0.0": +"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -3563,11 +3660,6 @@ expect "^29.0.0" pretty-format "^29.0.0" -"@types/js-levenshtein@^1.1.1": - version "1.1.3" - resolved "https://registry.npmjs.org/@types/js-levenshtein/-/js-levenshtein-1.1.3.tgz#a6fd0bdc8255b274e5438e0bfb25f154492d1106" - integrity sha512-jd+Q+sD20Qfu9e2aEXogiO3vpOC1PYJOUdyN9gvs4Qrvkg4wF43L5OhqrPeokdv8TL0/mXoYfpkcoGZMNN2pkQ== - "@types/js-yaml@^4.0.9": version "4.0.9" resolved "https://registry.npmjs.org/@types/js-yaml/-/js-yaml-4.0.9.tgz#cd82382c4f902fed9691a2ed79ec68c5898af4c2" @@ -3644,10 +3736,10 @@ dependencies: undici-types "~5.26.4" -"@types/node@^20.10.6": - version "20.10.6" - resolved "https://registry.npmjs.org/@types/node/-/node-20.10.6.tgz#a3ec84c22965802bf763da55b2394424f22bfbb5" - integrity sha512-Vac8H+NlRNNlAmDfGUP7b5h/KA+AtWIzuXy0E6OyP8f1tCLYAtPvKRRDJjAPqhpCb0t6U2j7/xqAuLEebW2kiw== +"@types/node@^20.11.7": + version "20.11.7" + resolved "https://registry.npmjs.org/@types/node/-/node-20.11.7.tgz#cb49aedd758c978c30806d0c38b520ed2a3df6e0" + integrity sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A== dependencies: undici-types "~5.26.4" @@ -3748,7 +3840,7 @@ resolved "https://registry.npmjs.org/@types/stack-utils/-/stack-utils-2.0.3.tgz#6209321eb2c1712a7e7466422b8cb1fc0d9dd5d8" integrity sha512-9aEbYZ3TbYMznPdcdr3SmIrLXwC/AKZXQeCf9Pgao5CKb8CyHuEX5jzWPTkvregvhRJHcpRO6BFoGW9ycaOkYw== -"@types/statuses@^2.0.1": +"@types/statuses@^2.0.4": version "2.0.4" resolved "https://registry.npmjs.org/@types/statuses/-/statuses-2.0.4.tgz#041143ba4a918e8f080f8b0ffbe3d4cb514e2315" integrity sha512-eqNDvZsCNY49OAXB0Firg/Sc2BgoWsntsLUdybGFOhAfCD6QJ2n9HXUIHGqt5qjrxmMv4wS8WLAw43ZkKcJ8Pw== @@ -3801,16 +3893,16 @@ dependencies: "@types/yargs-parser" "*" -"@typescript-eslint/eslint-plugin@^6.17.0": - version "6.17.0" - resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.17.0.tgz#dfc38f790704ba8a54a1277c51efdb489f6ecf9f" - integrity sha512-Vih/4xLXmY7V490dGwBQJTpIZxH4ZFH6eCVmQ4RFkB+wmaCTDAx4dtgoWwMNGKLkqRY1L6rPqzEbjorRnDo4rQ== +"@typescript-eslint/eslint-plugin@^6.19.1": + version "6.19.1" + resolved "https://registry.npmjs.org/@typescript-eslint/eslint-plugin/-/eslint-plugin-6.19.1.tgz#bb0676af940bc23bf299ca58dbdc6589c2548c2e" + integrity sha512-roQScUGFruWod9CEyoV5KlCYrubC/fvG8/1zXuT0WTcxX87GnMMmnksMwSg99lo1xiKrBzw2icsJPMAw1OtKxg== dependencies: "@eslint-community/regexpp" "^4.5.1" - "@typescript-eslint/scope-manager" "6.17.0" - "@typescript-eslint/type-utils" "6.17.0" - "@typescript-eslint/utils" "6.17.0" - "@typescript-eslint/visitor-keys" "6.17.0" + "@typescript-eslint/scope-manager" "6.19.1" + "@typescript-eslint/type-utils" "6.19.1" + "@typescript-eslint/utils" "6.19.1" + "@typescript-eslint/visitor-keys" "6.19.1" debug "^4.3.4" graphemer "^1.4.0" ignore "^5.2.4" @@ -3818,15 +3910,15 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/parser@^6.17.0": - version "6.17.0" - resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.17.0.tgz#8cd7a0599888ca6056082225b2fdf9a635bf32a1" - integrity sha512-C4bBaX2orvhK+LlwrY8oWGmSl4WolCfYm513gEccdWZj0CwGadbIADb0FtVEcI+WzUyjyoBj2JRP8g25E6IB8A== +"@typescript-eslint/parser@^6.19.1": + version "6.19.1" + resolved "https://registry.npmjs.org/@typescript-eslint/parser/-/parser-6.19.1.tgz#68a87bb21afaf0b1689e9cdce0e6e75bc91ada78" + integrity sha512-WEfX22ziAh6pRE9jnbkkLGp/4RhTpffr2ZK5bJ18M8mIfA8A+k97U9ZyaXCEJRlmMHh7R9MJZWXp/r73DzINVQ== dependencies: - "@typescript-eslint/scope-manager" "6.17.0" - "@typescript-eslint/types" "6.17.0" - "@typescript-eslint/typescript-estree" "6.17.0" - "@typescript-eslint/visitor-keys" "6.17.0" + "@typescript-eslint/scope-manager" "6.19.1" + "@typescript-eslint/types" "6.19.1" + "@typescript-eslint/typescript-estree" "6.19.1" + "@typescript-eslint/visitor-keys" "6.19.1" debug "^4.3.4" "@typescript-eslint/scope-manager@5.62.0": @@ -3837,21 +3929,21 @@ "@typescript-eslint/types" "5.62.0" "@typescript-eslint/visitor-keys" "5.62.0" -"@typescript-eslint/scope-manager@6.17.0": - version "6.17.0" - resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.17.0.tgz#70e6c1334d0d76562dfa61aed9009c140a7601b4" - integrity sha512-RX7a8lwgOi7am0k17NUO0+ZmMOX4PpjLtLRgLmT1d3lBYdWH4ssBUbwdmc5pdRX8rXon8v9x8vaoOSpkHfcXGA== +"@typescript-eslint/scope-manager@6.19.1": + version "6.19.1" + resolved "https://registry.npmjs.org/@typescript-eslint/scope-manager/-/scope-manager-6.19.1.tgz#2f527ee30703a6169a52b31d42a1103d80acd51b" + integrity sha512-4CdXYjKf6/6aKNMSly/BP4iCSOpvMmqtDzRtqFyyAae3z5kkqEjKndR5vDHL8rSuMIIWP8u4Mw4VxLyxZW6D5w== dependencies: - "@typescript-eslint/types" "6.17.0" - "@typescript-eslint/visitor-keys" "6.17.0" + "@typescript-eslint/types" "6.19.1" + "@typescript-eslint/visitor-keys" "6.19.1" -"@typescript-eslint/type-utils@6.17.0": - version "6.17.0" - resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.17.0.tgz#5febad3f523e393006614cbda28b826925b728d5" - integrity sha512-hDXcWmnbtn4P2B37ka3nil3yi3VCQO2QEB9gBiHJmQp5wmyQWqnjA85+ZcE8c4FqnaB6lBwMrPkgd4aBYz3iNg== +"@typescript-eslint/type-utils@6.19.1": + version "6.19.1" + resolved "https://registry.npmjs.org/@typescript-eslint/type-utils/-/type-utils-6.19.1.tgz#6a130e3afe605a4898e043fa9f72e96309b54935" + integrity sha512-0vdyld3ecfxJuddDjACUvlAeYNrHP/pDeQk2pWBR2ESeEzQhg52DF53AbI9QCBkYE23lgkhLCZNkHn2hEXXYIg== dependencies: - "@typescript-eslint/typescript-estree" "6.17.0" - "@typescript-eslint/utils" "6.17.0" + "@typescript-eslint/typescript-estree" "6.19.1" + "@typescript-eslint/utils" "6.19.1" debug "^4.3.4" ts-api-utils "^1.0.1" @@ -3860,10 +3952,10 @@ resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-5.62.0.tgz#258607e60effa309f067608931c3df6fed41fd2f" integrity sha512-87NVngcbVXUahrRTqIK27gD2t5Cu1yuCXxbLcFtCzZGlfyVWWh8mLHkoxzjsB6DDNnvdL+fW8MiwPEJyGJQDgQ== -"@typescript-eslint/types@6.17.0": - version "6.17.0" - resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.17.0.tgz#844a92eb7c527110bf9a7d177e3f22bd5a2f40cb" - integrity sha512-qRKs9tvc3a4RBcL/9PXtKSehI/q8wuU9xYJxe97WFxnzH8NWWtcW3ffNS+EWg8uPvIerhjsEZ+rHtDqOCiH57A== +"@typescript-eslint/types@6.19.1": + version "6.19.1" + resolved "https://registry.npmjs.org/@typescript-eslint/types/-/types-6.19.1.tgz#2d4c9d492a63ede15e7ba7d129bdf7714b77f771" + integrity sha512-6+bk6FEtBhvfYvpHsDgAL3uo4BfvnTnoge5LrrCj2eJN8g3IJdLTD4B/jK3Q6vo4Ql/Hoip9I8aB6fF+6RfDqg== "@typescript-eslint/typescript-estree@5.62.0": version "5.62.0" @@ -3878,13 +3970,13 @@ semver "^7.3.7" tsutils "^3.21.0" -"@typescript-eslint/typescript-estree@6.17.0": - version "6.17.0" - resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.17.0.tgz#b913d19886c52d8dc3db856903a36c6c64fd62aa" - integrity sha512-gVQe+SLdNPfjlJn5VNGhlOhrXz4cajwFd5kAgWtZ9dCZf4XJf8xmgCTLIqec7aha3JwgLI2CK6GY1043FRxZwg== +"@typescript-eslint/typescript-estree@6.19.1": + version "6.19.1" + resolved "https://registry.npmjs.org/@typescript-eslint/typescript-estree/-/typescript-estree-6.19.1.tgz#796d88d88882f12e85bb33d6d82d39e1aea54ed1" + integrity sha512-aFdAxuhzBFRWhy+H20nYu19+Km+gFfwNO4TEqyszkMcgBDYQjmPJ61erHxuT2ESJXhlhrO7I5EFIlZ+qGR8oVA== dependencies: - "@typescript-eslint/types" "6.17.0" - "@typescript-eslint/visitor-keys" "6.17.0" + "@typescript-eslint/types" "6.19.1" + "@typescript-eslint/visitor-keys" "6.19.1" debug "^4.3.4" globby "^11.1.0" is-glob "^4.0.3" @@ -3892,17 +3984,17 @@ semver "^7.5.4" ts-api-utils "^1.0.1" -"@typescript-eslint/utils@6.17.0": - version "6.17.0" - resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.17.0.tgz#f2b16d4c9984474656c420438cdede7eccd4079e" - integrity sha512-LofsSPjN/ITNkzV47hxas2JCsNCEnGhVvocfyOcLzT9c/tSZE7SfhS/iWtzP1lKNOEfLhRTZz6xqI8N2RzweSQ== +"@typescript-eslint/utils@6.19.1": + version "6.19.1" + resolved "https://registry.npmjs.org/@typescript-eslint/utils/-/utils-6.19.1.tgz#df93497f9cfddde2bcc2a591da80536e68acd151" + integrity sha512-JvjfEZuP5WoMqwh9SPAPDSHSg9FBHHGhjPugSRxu5jMfjvBpq5/sGTD+9M9aQ5sh6iJ8AY/Kk/oUYVEMAPwi7w== dependencies: "@eslint-community/eslint-utils" "^4.4.0" "@types/json-schema" "^7.0.12" "@types/semver" "^7.5.0" - "@typescript-eslint/scope-manager" "6.17.0" - "@typescript-eslint/types" "6.17.0" - "@typescript-eslint/typescript-estree" "6.17.0" + "@typescript-eslint/scope-manager" "6.19.1" + "@typescript-eslint/types" "6.19.1" + "@typescript-eslint/typescript-estree" "6.19.1" semver "^7.5.4" "@typescript-eslint/utils@^5.10.0", "@typescript-eslint/utils@^5.45.0": @@ -3927,12 +4019,12 @@ "@typescript-eslint/types" "5.62.0" eslint-visitor-keys "^3.3.0" -"@typescript-eslint/visitor-keys@6.17.0": - version "6.17.0" - resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.17.0.tgz#3ed043709c39b43ec1e58694f329e0b0430c26b6" - integrity sha512-H6VwB/k3IuIeQOyYczyyKN8wH6ed8EwliaYHLxOIhyF0dYEIsN8+Bk3GE19qafeMKyZJJHP8+O1HiFhFLUNKSg== +"@typescript-eslint/visitor-keys@6.19.1": + version "6.19.1" + resolved "https://registry.npmjs.org/@typescript-eslint/visitor-keys/-/visitor-keys-6.19.1.tgz#2164073ed4fc34a5ff3b5e25bb5a442100454c4c" + integrity sha512-gkdtIO+xSO/SmI0W68DBg4u1KElmIUo3vXzgHyGPs6cxgB0sa3TlptRAAE0hUY1hM6FcDKEv7aIwiTGm76cXfQ== dependencies: - "@typescript-eslint/types" "6.17.0" + "@typescript-eslint/types" "6.19.1" eslint-visitor-keys "^3.4.1" "@webassemblyjs/ast@1.11.6", "@webassemblyjs/ast@^1.11.5": @@ -4472,10 +4564,10 @@ axe-core@=4.7.0: resolved "https://registry.npmjs.org/axe-core/-/axe-core-4.7.0.tgz#34ba5a48a8b564f67e103f0aa5768d76e15bbbbf" integrity sha512-M0JtH+hlOL5pLQwHOLNYZaXuhqmvS8oExsqB1SBYgA4Dk7u/xx+YdGHXaK5pyUfed5mYXdlYiphWq3G8cRi5JQ== -axios@^1.6.5: - version "1.6.5" - resolved "https://registry.npmjs.org/axios/-/axios-1.6.5.tgz#2c090da14aeeab3770ad30c3a1461bc970fb0cd8" - integrity sha512-Ii012v05KEVuUoFWmMW/UQv9aRIc3ZwkWDcM+h5Il8izZCtRVpDUfwpoFf7eOtajT3QiGR4yDUx7lPqHJULgbg== +axios@^1.6.7: + version "1.6.7" + resolved "https://registry.npmjs.org/axios/-/axios-1.6.7.tgz#7b48c2e27c96f9c68a2f8f31e2ab19f59b06b0a7" + integrity sha512-/hDJGff6/c7u0hDkvkGxR/oy6CbCs8ziCsC7SqmhjfozqiJGc8Z11wrv9z9lYfY4K8l+H9TpjcMDX0xOZmx+RA== dependencies: follow-redirects "^1.15.4" form-data "^4.0.0" @@ -4562,7 +4654,7 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.4.6, babel-plugin-polyfill-corejs2@^0.4.7: +babel-plugin-polyfill-corejs2@^0.4.6: version "0.4.7" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz#679d1b94bf3360f7682e11f2cb2708828a24fe8c" integrity sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ== @@ -4571,7 +4663,16 @@ babel-plugin-polyfill-corejs2@^0.4.6, babel-plugin-polyfill-corejs2@^0.4.7: "@babel/helper-define-polyfill-provider" "^0.4.4" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.5, babel-plugin-polyfill-corejs3@^0.8.7: +babel-plugin-polyfill-corejs2@^0.4.8: + version "0.4.8" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" + integrity sha512-OtIuQfafSzpo/LhnJaykc0R/MMnuLSSVjVYy9mHArIZ9qTCSZ6TpWCuEKZYVoN//t8HqBNScHrOtCrIK5IaGLg== + dependencies: + "@babel/compat-data" "^7.22.6" + "@babel/helper-define-polyfill-provider" "^0.5.0" + semver "^6.3.1" + +babel-plugin-polyfill-corejs3@^0.8.5: version "0.8.7" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== @@ -4579,13 +4680,28 @@ babel-plugin-polyfill-corejs3@^0.8.5, babel-plugin-polyfill-corejs3@^0.8.7: "@babel/helper-define-polyfill-provider" "^0.4.4" core-js-compat "^3.33.1" -babel-plugin-polyfill-regenerator@^0.5.3, babel-plugin-polyfill-regenerator@^0.5.4: +babel-plugin-polyfill-corejs3@^0.9.0: + version "0.9.0" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz#9eea32349d94556c2ad3ab9b82ebb27d4bf04a81" + integrity sha512-7nZPG1uzK2Ymhy/NbaOWTg3uibM2BmGASS4vHS4szRZAIR8R6GwA/xAujpdrXU5iyklrimWnLWU+BLF9suPTqg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.5.0" + core-js-compat "^3.34.0" + +babel-plugin-polyfill-regenerator@^0.5.3: version "0.5.4" resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz#c6fc8eab610d3a11eb475391e52584bacfc020f4" integrity sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg== dependencies: "@babel/helper-define-polyfill-provider" "^0.4.4" +babel-plugin-polyfill-regenerator@^0.5.5: + version "0.5.5" + resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a" + integrity sha512-OJGYZlhLqBh2DDHeqAxWB1XIvr49CxiJ2gIt61/PU55CQK4Z58OzMqjDe1zwQdQk+rBYsRc+1rJmdajM3gimHg== + dependencies: + "@babel/helper-define-polyfill-provider" "^0.5.0" + "babel-plugin-styled-components@>= 1.12.0": version "2.1.4" resolved "https://registry.npmjs.org/babel-plugin-styled-components/-/babel-plugin-styled-components-2.1.4.tgz#9a1f37c7f32ef927b4b008b529feb4a2c82b1092" @@ -4743,7 +4859,7 @@ browserify-zlib@^0.1.4: dependencies: pako "~0.2.0" -browserslist@^4.14.5, browserslist@^4.22.2: +browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.22.2: version "4.22.2" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== @@ -4931,7 +5047,7 @@ citty@^0.1.4, citty@^0.1.5: dependencies: consola "^3.2.3" -cjs-module-lexer@^1.0.0: +cjs-module-lexer@^1.0.0, cjs-module-lexer@^1.2.3: version "1.2.3" resolved "https://registry.npmjs.org/cjs-module-lexer/-/cjs-module-lexer-1.2.3.tgz#6c370ab19f8a3394e318fe682686ec0ac684d107" integrity sha512-0TNiGstbQmCFwt4akjjBg5pLRTSyj/PkWQ1ZoO2zntmg9yLqSRxwEa4iCfQLGjqhiqBfOJa7W/E8wfGrTDmlZQ== @@ -5192,6 +5308,13 @@ core-js-compat@^3.31.0, core-js-compat@^3.33.1: dependencies: browserslist "^4.22.2" +core-js-compat@^3.34.0: + version "3.35.1" + resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz#215247d7edb9e830efa4218ff719beb2803555e2" + integrity sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw== + dependencies: + browserslist "^4.22.2" + core-js-pure@^3.23.3: version "3.34.0" resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.34.0.tgz#981e462500708664c91b827a75b011f04a8134a0" @@ -5272,7 +5395,7 @@ css-functions-list@^3.1.0: resolved "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea" integrity sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ== -css-loader@^6.7.1, css-loader@^6.8.1: +css-loader@^6.7.1: version "6.8.1" resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== @@ -5286,6 +5409,20 @@ css-loader@^6.7.1, css-loader@^6.8.1: postcss-value-parser "^4.2.0" semver "^7.3.8" +css-loader@^6.9.1: + version "6.9.1" + resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz#9ec9a434368f2bdfeffbf8f6901a1ce773586c6b" + integrity sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ== + dependencies: + icss-utils "^5.1.0" + postcss "^8.4.33" + postcss-modules-extract-imports "^3.0.0" + postcss-modules-local-by-default "^4.0.4" + postcss-modules-scope "^3.1.1" + postcss-modules-values "^4.0.0" + postcss-value-parser "^4.2.0" + semver "^7.5.4" + css-select@^4.1.3: version "4.3.0" resolved "https://registry.npmjs.org/css-select/-/css-select-4.3.0.tgz#db7129b2846662fd8628cfc496abb2b59e41529b" @@ -5583,11 +5720,16 @@ doctrine@^3.0.0: dependencies: esutils "^2.0.2" -dom-accessibility-api@^0.5.6, dom-accessibility-api@^0.5.9: +dom-accessibility-api@^0.5.9: version "0.5.16" resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.5.16.tgz#5a7429e6066eb3664d911e33fb0e45de8eb08453" integrity sha512-X7BJ2yElsnOJ30pZF4uIIDfBEVgF4XEBxL9Bxhy6dnrm5hkzqmsWHGTiHqRiITNhMyFLyAiWndIJP7Z1NTteDg== +dom-accessibility-api@^0.6.3: + version "0.6.3" + resolved "https://registry.npmjs.org/dom-accessibility-api/-/dom-accessibility-api-0.6.3.tgz#993e925cc1d73f2c662e7d75dd5a5445259a8fd8" + integrity sha512-7ZgogeTnjuHbo+ct10G9Ffp0mif17idi0IyWNVA/wcwcm7NPOD/WEHVP3n7n3MhXqxoIYm8d6MuZohYWIZ4T3w== + dom-converter@^0.2.0: version "0.2.0" resolved "https://registry.npmjs.org/dom-converter/-/dom-converter-0.2.0.tgz#6721a9daee2e293682955b6afe416771627bb768" @@ -6041,10 +6183,10 @@ eslint-plugin-import@^2.29.1: semver "^6.3.1" tsconfig-paths "^3.15.0" -eslint-plugin-jest@^27.6.1: - version "27.6.1" - resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.1.tgz#5e43b07f3ca48d72e4b4fa243531e5153d9ca1dc" - integrity sha512-WEYkyVXD9NlmFBKvrkmzrC+C9yZoz5pAml2hO19PlS3spJtoiwj4p2u8spd/7zx5IvRsZsCmsoImaAvBB9X93Q== +eslint-plugin-jest@^27.6.3: + version "27.6.3" + resolved "https://registry.npmjs.org/eslint-plugin-jest/-/eslint-plugin-jest-27.6.3.tgz#8acb8b1e45597fe1f4d4cf25163d90119efc12be" + integrity sha512-+YsJFVH6R+tOiO3gCJon5oqn4KWc+mDq2leudk8mrp8RFubLOo9CVyi3cib4L7XMpxExmkmBZQTPDYVBzgpgOA== dependencies: "@typescript-eslint/utils" "^5.10.0" @@ -6981,7 +7123,7 @@ he@^1.2.0: resolved "https://registry.npmjs.org/he/-/he-1.2.0.tgz#84ae65fa7eafb165fddb61566ae14baf05664f0f" integrity sha512-F/1DnUGPopORZi0ni+CvrCgHQ5FyEAHRLSApuYWMmrbSwoN2Mn/7k+Gl38gJnR7yyDZk6WLXwiGod1JOWNDKGw== -headers-polyfill@^4.0.1: +headers-polyfill@^4.0.2: version "4.0.2" resolved "https://registry.npmjs.org/headers-polyfill/-/headers-polyfill-4.0.2.tgz#9115a76eee3ce8fbf95b6e3c6bf82d936785b44a" integrity sha512-EWGTfnTqAO2L/j5HZgoM/3z82L7necsJ0pO9Tp0X1wil3PDLrkypTBRgVO2ExehEEvUycejZD3FuRaXpZZc3kw== @@ -8038,11 +8180,6 @@ jest@^29.7.0: import-local "^3.0.2" jest-cli "^29.7.0" -js-levenshtein@^1.1.6: - version "1.1.6" - resolved "https://registry.npmjs.org/js-levenshtein/-/js-levenshtein-1.1.6.tgz#c6cee58eb3550372df8deb85fad5ce66ce01d59d" - integrity sha512-X2BB11YZtrRqY4EnQcLX5Rh373zbK4alC1FW7D7MBhL2gtcC17cTnr6DmfHZeS0s2rTHjUTMMHfG7gO8SSdw+g== - "js-tokens@^3.0.0 || ^4.0.0", js-tokens@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/js-tokens/-/js-tokens-4.0.0.tgz#19203fb59991df98e3a287050d4647cdeaf32499" @@ -8678,32 +8815,29 @@ msw-storybook-addon@2.0.0--canary.122.06f0c92.0: dependencies: is-node-process "^1.0.1" -msw@^2.0.11: - version "2.0.11" - resolved "https://registry.npmjs.org/msw/-/msw-2.0.11.tgz#f0a5878952a79bb5c0ef489bd01755170ed01adf" - integrity sha512-dAXFS2DxZX0uFqMPhS3oUAu8S/5IQ5qKKSwtXl3/dMTeML0C8JfSvbeWtowYg6pu4Iehgp5L/pHLrlIcG++y/A== +msw@^2.1.5: + version "2.1.5" + resolved "https://registry.npmjs.org/msw/-/msw-2.1.5.tgz#f6736ad33120f01e939416275625dcf7e7b28d14" + integrity sha512-r39AZk4taMmUEYwtzDAgFy38feqJy1yaKykvo0QE8q7H7c28yH/WIlOmE7oatjkC3dMgpTYfND8MaxeywgU+Yg== dependencies: "@bundled-es-modules/cookie" "^2.0.0" - "@bundled-es-modules/js-levenshtein" "^2.0.1" "@bundled-es-modules/statuses" "^1.0.1" "@mswjs/cookies" "^1.1.0" - "@mswjs/interceptors" "^0.25.13" + "@mswjs/interceptors" "^0.25.15" "@open-draft/until" "^2.1.0" - "@types/cookie" "^0.4.1" - "@types/js-levenshtein" "^1.1.1" - "@types/statuses" "^2.0.1" + "@types/cookie" "^0.6.0" + "@types/statuses" "^2.0.4" chalk "^4.1.2" chokidar "^3.4.2" graphql "^16.8.1" - headers-polyfill "^4.0.1" + headers-polyfill "^4.0.2" inquirer "^8.2.0" is-node-process "^1.2.0" - js-levenshtein "^1.1.6" - outvariant "^1.4.0" + outvariant "^1.4.2" path-to-regexp "^6.2.0" - strict-event-emitter "^0.5.0" - type-fest "^2.19.0" - yargs "^17.3.1" + strict-event-emitter "^0.5.1" + type-fest "^4.9.0" + yargs "^17.7.2" mute-stream@0.0.8: version "0.0.8" @@ -9026,7 +9160,7 @@ os-tmpdir@~1.0.2: resolved "https://registry.npmjs.org/os-tmpdir/-/os-tmpdir-1.0.2.tgz#bbe67406c79aa85c5cfec766fe5734555dfa1274" integrity sha512-D2FR03Vir7FIu45XBY20mTb+/ZSWB00sjU9jdQXt83gDrI4Ztz5Fs7/yy74g2N5SVQY4xY1qDr4rNddwYRVX0g== -outvariant@^1.2.1, outvariant@^1.4.0: +outvariant@^1.2.1, outvariant@^1.4.0, outvariant@^1.4.2: version "1.4.2" resolved "https://registry.npmjs.org/outvariant/-/outvariant-1.4.2.tgz#f54f19240eeb7f15b28263d5147405752d8e2066" integrity sha512-Ou3dJ6bA/UJ5GVHxah4LnqDwZRwAmWxrG3wtrHrbGnP4RnLCtA64A4F+ae7Y8ww660JaddSoArUR5HjipWSHAQ== @@ -9312,6 +9446,15 @@ postcss-modules-local-by-default@^4.0.3: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" +postcss-modules-local-by-default@^4.0.4: + version "4.0.4" + resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" + integrity sha512-L4QzMnOdVwRm1Qb8m4x8jsZzKAaPAgrUF1r/hjDR2Xj7R+8Zsf97jAlSQzWtKx5YNiNGN8QxmPFIc/sh+RQl+Q== + dependencies: + icss-utils "^5.0.0" + postcss-selector-parser "^6.0.2" + postcss-value-parser "^4.1.0" + postcss-modules-scope@^3.0.0: version "3.1.0" resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz#fbfddfda93a31f310f1d152c2bb4d3f3c5592ee0" @@ -9319,6 +9462,13 @@ postcss-modules-scope@^3.0.0: dependencies: postcss-selector-parser "^6.0.4" +postcss-modules-scope@^3.1.1: + version "3.1.1" + resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" + integrity sha512-uZgqzdTleelWjzJY+Fhti6F3C9iF1JR/dODLs/JDefozYcKTBCdD8BIl6nNPbTbcLnGrk56hzwZC2DaGNvYjzA== + dependencies: + postcss-selector-parser "^6.0.4" + postcss-modules-values@^4.0.0: version "4.0.0" resolved "https://registry.npmjs.org/postcss-modules-values/-/postcss-modules-values-4.0.0.tgz#d7c5e7e68c3bb3c9b27cbf48ca0bb3ffb4602c9c" @@ -9349,10 +9499,10 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.32: - version "8.4.32" - resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.32.tgz#1dac6ac51ab19adb21b8b34fd2d93a86440ef6c9" - integrity sha512-D/kj5JNu6oo2EIy+XL/26JEDTlIbB8hw85G8StOE6L74RQAVVP5rej6wxCNqyMbR4RkPfqvezVbPw81Ngd6Kcw== +postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.33: + version "8.4.33" + resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" + integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== dependencies: nanoid "^3.3.7" picocolors "^1.0.0" @@ -9698,20 +9848,20 @@ react-resize-detector@^3.2.1: prop-types "^15.6.2" resize-observer-polyfill "^1.5.1" -react-router-dom@^6.21.1: - version "6.21.1" - resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.1.tgz#58b459d2fe1841388c95bb068f85128c45e27349" - integrity sha512-QCNrtjtDPwHDO+AO21MJd7yIcr41UetYt5jzaB9Y1UYaPTCnVuJq6S748g1dE11OQlCFIQg+RtAA1SEZIyiBeA== +react-router-dom@^6.21.3: + version "6.21.3" + resolved "https://registry.npmjs.org/react-router-dom/-/react-router-dom-6.21.3.tgz#ef3a7956a3699c7b82c21fcb3dbc63c313ed8c5d" + integrity sha512-kNzubk7n4YHSrErzjLK72j0B5i969GsuCGazRl3G6j1zqZBLjuSlYBdVdkDOgzGdPIffUOc9nmgiadTEVoq91g== dependencies: - "@remix-run/router" "1.14.1" - react-router "6.21.1" + "@remix-run/router" "1.14.2" + react-router "6.21.3" -react-router@6.21.1: - version "6.21.1" - resolved "https://registry.npmjs.org/react-router/-/react-router-6.21.1.tgz#8db7ee8d7cfc36513c9a66b44e0897208c33be34" - integrity sha512-W0l13YlMTm1YrpVIOpjCADJqEUpz1vm+CMo47RuFX4Ftegwm6KOYsL5G3eiE52jnJpKvzm6uB/vTKTPKM8dmkA== +react-router@6.21.3: + version "6.21.3" + resolved "https://registry.npmjs.org/react-router/-/react-router-6.21.3.tgz#8086cea922c2bfebbb49c6594967418f1f167d70" + integrity sha512-a0H638ZXULv1OdkmiK6s6itNhoy33ywxmUFT/xtSoVyf9VnC7n7+VT4LjVzdIHSaF5TIh9ylUgxMXksHTgGrKg== dependencies: - "@remix-run/router" "1.14.1" + "@remix-run/router" "1.14.2" react-spring@9.2.4: version "9.2.4" @@ -10247,13 +10397,6 @@ signal-exit@^4.0.1, signal-exit@^4.1.0: resolved "https://registry.npmjs.org/signal-exit/-/signal-exit-4.1.0.tgz#952188c1cbd546070e2dd20d0f41c0ae0530cb04" integrity sha512-bzyZ1e88w9O1iNJbKnOlvYTrWPDl46O1bG0D3XInv+9tkPrxrN8jUUTiFlDkkmKWgn1M6CfIA13SuGqOa9Korw== -simple-update-notifier@^2.0.0: - version "2.0.0" - resolved "https://registry.npmjs.org/simple-update-notifier/-/simple-update-notifier-2.0.0.tgz#d70b92bdab7d6d90dfd73931195a30b6e3d7cebb" - integrity sha512-a2B9Y0KlNXl9u/vsW6sTIu9vGEpfKu2wRV6l1H3XEas/0gUIzGzBoP/IouTcUQbm9JWZLH3COxyn03TYlFax6w== - dependencies: - semver "^7.5.3" - sisteransi@^1.0.5: version "1.0.5" resolved "https://registry.npmjs.org/sisteransi/-/sisteransi-1.0.5.tgz#134d681297756437cc05ca01370d3a7a571075ed" @@ -10369,19 +10512,19 @@ store2@^2.14.2: resolved "https://registry.npmjs.org/store2/-/store2-2.14.2.tgz#56138d200f9fe5f582ad63bc2704dbc0e4a45068" integrity sha512-siT1RiqlfQnGqgT/YzXVUNsom9S0H1OX+dpdGN1xkyYATo4I6sep5NmsRD/40s3IIOvlCq6akxkqG82urIZW1w== -storybook@^7.6.7: - version "7.6.7" - resolved "https://registry.npmjs.org/storybook/-/storybook-7.6.7.tgz#90865997e806cbce278481fce1bb5be1984964fc" - integrity sha512-1Cd895dqYIT5MOUOCDlD73OTWoJubLq/sWC7AMzkMrLu76yD4Cu6f+wv1HDrRAheRaCaeT3yhYEhsMB6qHIcaA== +storybook@^7.6.10: + version "7.6.10" + resolved "https://registry.npmjs.org/storybook/-/storybook-7.6.10.tgz#2185d26cd7b43390e3e2c7581586e2f60cdbd9bd" + integrity sha512-ypFeGhQTUBBfqSUVZYh7wS5ghn3O2wILCiQc4459SeUpvUn+skcqw/TlrwGSoF5EWjDA7gtRrWDxO3mnlPt5Cw== dependencies: - "@storybook/cli" "7.6.7" + "@storybook/cli" "7.6.10" stream-shift@^1.0.0: version "1.0.1" resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== -strict-event-emitter@^0.5.0, strict-event-emitter@^0.5.1: +strict-event-emitter@^0.5.1: version "0.5.1" resolved "https://registry.npmjs.org/strict-event-emitter/-/strict-event-emitter-0.5.1.tgz#1602ece81c51574ca39c6815e09f1a3e8550bd93" integrity sha512-vMgjE/GGEPEFnhFub6pa4FmJBRBVOLpIII2hvCZ8Kzb7K0hlHo7mQv6xYrBvCL2LtAIBwFUK8wvuJgTVSQ5MFQ== @@ -10525,11 +10668,16 @@ strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1 resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@^3.3.1, style-loader@^3.3.3: +style-loader@^3.3.1: version "3.3.3" resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== +style-loader@^3.3.4: + version "3.3.4" + resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" + integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== + style-search@^0.1.0: version "0.1.0" resolved "https://registry.npmjs.org/style-search/-/style-search-0.1.0.tgz#7958c793e47e32e07d2b5cafe5c0bf8e12e77902" @@ -10739,6 +10887,17 @@ terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.7: serialize-javascript "^6.0.1" terser "^5.16.8" +terser-webpack-plugin@^5.3.10: + version "5.3.10" + resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" + integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== + dependencies: + "@jridgewell/trace-mapping" "^0.3.20" + jest-worker "^27.4.5" + schema-utils "^3.1.1" + serialize-javascript "^6.0.1" + terser "^5.26.0" + terser@^5.10.0, terser@^5.16.8: version "5.26.0" resolved "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz#ee9f05d929f4189a9c28a0feb889d96d50126fe1" @@ -10749,6 +10908,16 @@ terser@^5.10.0, terser@^5.16.8: commander "^2.20.0" source-map-support "~0.5.20" +terser@^5.26.0: + version "5.27.0" + resolved "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz#70108689d9ab25fef61c4e93e808e9fd092bf20c" + integrity sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A== + dependencies: + "@jridgewell/source-map" "^0.3.3" + acorn "^8.8.2" + commander "^2.20.0" + source-map-support "~0.5.20" + test-exclude@^6.0.0: version "6.0.0" resolved "https://registry.npmjs.org/test-exclude/-/test-exclude-6.0.0.tgz#04a8698661d805ea6fa293b6cb9e63ac044ef15e" @@ -10962,6 +11131,11 @@ type-fest@^2.19.0, type-fest@~2.19: resolved "https://registry.npmjs.org/type-fest/-/type-fest-2.19.0.tgz#88068015bb33036a598b952e55e9311a60fd3a9b" integrity sha512-RAH822pAdBgcNMAfWnCBU3CFZcfZ/i1eZjwFU/dsLKumyuuP3niueg2UAukXYF0E2AAoc82ZSSf9J0WQBinzHA== +type-fest@^4.9.0: + version "4.10.1" + resolved "https://registry.npmjs.org/type-fest/-/type-fest-4.10.1.tgz#35e6cd34d1fe331cf261d8ebb83e64788b89db4b" + integrity sha512-7ZnJYTp6uc04uYRISWtiX3DSKB/fxNQT0B5o1OUeCqiQiwF+JC9+rJiZIDrPrNCLLuTqyQmh4VdQqh/ZOkv9MQ== + type-is@~1.6.18: version "1.6.18" resolved "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz#4e552cd05df09467dcbc4ef739de89f2cf37c131" @@ -11383,7 +11557,7 @@ webpack-virtual-modules@^0.6.1: resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz#ac6fdb9c5adb8caecd82ec241c9631b7a3681b6f" integrity sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg== -webpack@5, webpack@^5.89.0: +webpack@5: version "5.89.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== @@ -11413,6 +11587,36 @@ webpack@5, webpack@^5.89.0: watchpack "^2.4.0" webpack-sources "^3.2.3" +webpack@^5.90.0: + version "5.90.0" + resolved "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz#313bfe16080d8b2fee6e29b6c986c0714ad4290e" + integrity sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w== + dependencies: + "@types/eslint-scope" "^3.7.3" + "@types/estree" "^1.0.5" + "@webassemblyjs/ast" "^1.11.5" + "@webassemblyjs/wasm-edit" "^1.11.5" + "@webassemblyjs/wasm-parser" "^1.11.5" + acorn "^8.7.1" + acorn-import-assertions "^1.9.0" + browserslist "^4.21.10" + chrome-trace-event "^1.0.2" + enhanced-resolve "^5.15.0" + es-module-lexer "^1.2.1" + eslint-scope "5.1.1" + events "^3.2.0" + glob-to-regexp "^0.4.1" + graceful-fs "^4.2.9" + json-parse-even-better-errors "^2.3.1" + loader-runner "^4.2.0" + mime-types "^2.1.27" + neo-async "^2.6.2" + schema-utils "^3.2.0" + tapable "^2.1.1" + terser-webpack-plugin "^5.3.10" + watchpack "^2.4.0" + webpack-sources "^3.2.3" + websocket-driver@>=0.5.1: version "0.7.4" resolved "https://registry.npmjs.org/websocket-driver/-/websocket-driver-0.7.4.tgz#89ad5295bbf64b480abcba31e4953aca706f5760" @@ -11641,7 +11845,7 @@ yargs-parser@^21.1.1: resolved "https://registry.npmjs.org/yargs-parser/-/yargs-parser-21.1.1.tgz#9096bceebf990d21bb31fa9516e0ede294a77d35" integrity sha512-tVpsJW7DdjecAiFpbIB1e3qxIQsE6NoPc5/eTdrbbIC4h0LVsWhnoa3g+m2HclBIujHzsxZ4VJVA+GUuc2/LBw== -yargs@^17.3.1: +yargs@^17.3.1, yargs@^17.7.2: version "17.7.2" resolved "https://registry.npmjs.org/yargs/-/yargs-17.7.2.tgz#991df39aca675a192b816e1e0363f9d75d2aa269" integrity sha512-7dSzzRQ++CKnNI/krKnYRV7JKKPUXMEh61soaHKg9mrWEhzFWhFnxPxGl+69cD1Ou63C13NUPCnmIcrvqCuM6w== From 62b26a3f8ad51accf173a14d480905c38f980e04 Mon Sep 17 00:00:00 2001 From: "renovate[bot]" <29139614+renovate[bot]@users.noreply.github.com> Date: Mon, 29 Jan 2024 11:03:43 +0100 Subject: [PATCH 15/23] chore(deps): lock file maintenance (#893) --- ui/yarn.lock | 819 ++++++++++++++------------------------------------- 1 file changed, 222 insertions(+), 597 deletions(-) diff --git a/ui/yarn.lock b/ui/yarn.lock index 5d37e9094..e6a1f76bd 100644 --- a/ui/yarn.lock +++ b/ui/yarn.lock @@ -8,9 +8,9 @@ integrity sha512-1Yjs2SvM8TflER/OD3cOjhWWOZb58A2t7wpE2S9XfBYTiIl+XFhQG2bjy4Pu1I+EAlCNUzRDYDdFwFYUKvXcIA== "@adobe/css-tools@^4.3.2": - version "4.3.2" - resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.2.tgz#a6abc715fb6884851fca9dad37fc34739a04fd11" - integrity sha512-DA5a1C0gD/pLOvhv33YMrbf2FK3oUzwNl9oOJqE4XVjuEtt6XIakRcsd7eLiOSPkp1kTRQGICTA8cKra/vFbjw== + version "4.3.3" + resolved "https://registry.npmjs.org/@adobe/css-tools/-/css-tools-4.3.3.tgz#90749bde8b89cd41764224f5aac29cd4138f75ff" + integrity sha512-rE0Pygv0sEZ4vBWHlAgJLGDU7Pm8xoO6p3wsEceb7GYAjScrOHpEo8KK/eVkAcnSM+slAEtXjA2JpdjLp4fJQQ== "@ampproject/remapping@^2.2.0": version "2.2.1" @@ -34,7 +34,7 @@ dependencies: "@babel/highlight" "^7.10.4" -"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.22.13", "@babel/code-frame@^7.23.5": +"@babel/code-frame@^7.0.0", "@babel/code-frame@^7.10.4", "@babel/code-frame@^7.12.13", "@babel/code-frame@^7.16.7", "@babel/code-frame@^7.23.5": version "7.23.5" resolved "https://registry.npmjs.org/@babel/code-frame/-/code-frame-7.23.5.tgz#9009b69a8c602293476ad598ff53e4562e15c244" integrity sha512-CgH3s1a96LipHCmSUmYFPwY7MNx8C3avkq7i4Wl3cfa662ldtUe4VM1TPXX70pfmrlWTb6jLqTYrZyT2ZTJBgA== @@ -47,28 +47,7 @@ resolved "https://registry.npmjs.org/@babel/compat-data/-/compat-data-7.23.5.tgz#ffb878728bb6bdcb6f4510aa51b1be9afb8cfd98" integrity sha512-uU27kfDRlhfKl+w1U6vp16IuvSLtjAxdArVXPa9BvLkrr7CYIsxH5adpHObeAGY/41+syctUWOZ140a2Rvkgjw== -"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.9", "@babel/core@^7.23.0", "@babel/core@^7.23.2": - version "7.23.6" - resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.6.tgz#8be77cd77c55baadcc1eae1c33df90ab6d2151d4" - integrity sha512-FxpRyGjrMJXh7X3wGLGhNDCRiwpWEF74sKjTLDJSG5Kyvow3QZaG0Adbqzi9ZrVjTWpsX+2cxWXD71NMg93kdw== - dependencies: - "@ampproject/remapping" "^2.2.0" - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helpers" "^7.23.6" - "@babel/parser" "^7.23.6" - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.6" - "@babel/types" "^7.23.6" - convert-source-map "^2.0.0" - debug "^4.1.0" - gensync "^1.0.0-beta.2" - json5 "^2.2.3" - semver "^6.3.1" - -"@babel/core@^7.23.9": +"@babel/core@^7.11.6", "@babel/core@^7.12.3", "@babel/core@^7.18.9", "@babel/core@^7.23.0", "@babel/core@^7.23.2", "@babel/core@^7.23.9": version "7.23.9" resolved "https://registry.npmjs.org/@babel/core/-/core-7.23.9.tgz#b028820718000f267870822fec434820e9b1e4d1" integrity sha512-5q0175NOjddqpvvzU+kDiSOAk4PfdO6FvwCWoQ6RO7rTzEe8vlo+4HVfcnAREhD4npMs0e9uZypjTwzZPCf/cw== @@ -134,9 +113,9 @@ semver "^6.3.1" "@babel/helper-create-class-features-plugin@^7.18.6", "@babel/helper-create-class-features-plugin@^7.22.15", "@babel/helper-create-class-features-plugin@^7.23.6": - version "7.23.6" - resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.6.tgz#b04d915ce92ce363666f816a884cdcfc9be04953" - integrity sha512-cBXU1vZni/CpGF29iTu4YRbOZt3Wat6zCoMDxRF1MayiEc4URxOj31tT65HUM0CRpMowA3HCJaAOVOUnMf96cw== + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/helper-create-class-features-plugin/-/helper-create-class-features-plugin-7.23.9.tgz#fddfdf51fca28f23d16b9e3935a4732690acfad6" + integrity sha512-B2L9neXTIyPQoXDm+NtovPvG6VOLWnaXu3BIeVDWwdKFgG30oNa6CqVGiJPDWQwIAK49t9gnQI9c6K6RzabiKw== dependencies: "@babel/helper-annotate-as-pure" "^7.22.5" "@babel/helper-environment-visitor" "^7.22.20" @@ -157,17 +136,6 @@ regexpu-core "^5.3.1" semver "^6.3.1" -"@babel/helper-define-polyfill-provider@^0.4.4": - version "0.4.4" - resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.4.4.tgz#64df615451cb30e94b59a9696022cffac9a10088" - integrity sha512-QcJMILQCu2jm5TFPGA3lCpJJTeEP+mqeXooG/NZbg/h5FTFi6V0+99ahlRsW8/kRLyb24LZVCCiclDedhLKcBA== - dependencies: - "@babel/helper-compilation-targets" "^7.22.6" - "@babel/helper-plugin-utils" "^7.22.5" - debug "^4.1.1" - lodash.debounce "^4.0.8" - resolve "^1.14.2" - "@babel/helper-define-polyfill-provider@^0.5.0": version "0.5.0" resolved "https://registry.npmjs.org/@babel/helper-define-polyfill-provider/-/helper-define-polyfill-provider-0.5.0.tgz#465805b7361f461e86c680f1de21eaf88c25901b" @@ -299,15 +267,6 @@ "@babel/template" "^7.22.15" "@babel/types" "^7.22.19" -"@babel/helpers@^7.23.6": - version "7.23.6" - resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.6.tgz#d03af2ee5fb34691eec0cda90f5ecbb4d4da145a" - integrity sha512-wCfsbN4nBidDRhpDhvcKlzHWCTlgJYUUdSJfzXb2NuBssDSIjc3xcb+znA7l+zYsFljAcGM0aFkN40cR3lXiGA== - dependencies: - "@babel/template" "^7.22.15" - "@babel/traverse" "^7.23.6" - "@babel/types" "^7.23.6" - "@babel/helpers@^7.23.9": version "7.23.9" resolved "https://registry.npmjs.org/@babel/helpers/-/helpers-7.23.9.tgz#c3e20bbe7f7a7e10cb9b178384b4affdf5995c7d" @@ -326,12 +285,7 @@ chalk "^2.4.2" js-tokens "^4.0.0" -"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.22.15", "@babel/parser@^7.23.0", "@babel/parser@^7.23.6", "@babel/parser@^7.7.0": - version "7.23.6" - resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.6.tgz#ba1c9e512bda72a47e285ae42aff9d2a635a9e3b" - integrity sha512-Z2uID7YJ7oNvAI20O9X0bblw7Qqs8Q2hFy0R9tAfnfLkp5MW0UH9eUvnDSnFwKZ0AvgS1ucqR4KzvVHgnke1VQ== - -"@babel/parser@^7.23.9": +"@babel/parser@^7.1.0", "@babel/parser@^7.14.7", "@babel/parser@^7.20.7", "@babel/parser@^7.23.0", "@babel/parser@^7.23.9", "@babel/parser@^7.7.0": version "7.23.9" resolved "https://registry.npmjs.org/@babel/parser/-/parser-7.23.9.tgz#7b903b6149b0f8fa7ad564af646c4c38a77fc44b" integrity sha512-9tcKgqKbs3xGJ+NtKF2ndOBBLVwPjl1SHxPQkd36r3Dlirw3xWUeGaTbqr7uGZcTaxkVNwc+03SVP7aCdWrTlA== @@ -352,14 +306,6 @@ "@babel/helper-skip-transparent-expression-wrappers" "^7.22.5" "@babel/plugin-transform-optional-chaining" "^7.23.3" -"@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.3": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.3.tgz#20c60d4639d18f7da8602548512e9d3a4c8d7098" - integrity sha512-XaJak1qcityzrX0/IU5nKHb34VaibwP3saKqG6a/tppelgllOH13LUann4ZCIBcVOeE6H18K4Vx9QKkVww3z/w== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly@^7.23.7": version "7.23.7" resolved "https://registry.npmjs.org/@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly/-/plugin-bugfix-v8-static-class-fields-redefine-readonly-7.23.7.tgz#516462a95d10a9618f197d39ad291a9b47ae1d7b" @@ -554,16 +500,6 @@ dependencies: "@babel/helper-plugin-utils" "^7.22.5" -"@babel/plugin-transform-async-generator-functions@^7.23.4": - version "7.23.4" - resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.4.tgz#93ac8e3531f347fba519b4703f9ff2a75c6ae27a" - integrity sha512-efdkfPhHYTtn0G6n2ddrESE91fgXxjlqLsnUtPWnJs4a4mZIbUaK7ffqKIIUKXSHwcDvaCVX6GXkaJJFqtX7jw== - dependencies: - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-remap-async-to-generator" "^7.22.20" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-transform-async-generator-functions@^7.23.9": version "7.23.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-async-generator-functions/-/plugin-transform-async-generator-functions-7.23.9.tgz#9adaeb66fc9634a586c5df139c6240d41ed801ce" @@ -614,21 +550,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/plugin-syntax-class-static-block" "^7.14.5" -"@babel/plugin-transform-classes@^7.23.5": - version "7.23.5" - resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.5.tgz#e7a75f815e0c534cc4c9a39c56636c84fc0d64f2" - integrity sha512-jvOTR4nicqYC9yzOHIhXG5emiFEOpappSJAl73SDSEDcybD+Puuze8Tnpb9p9qEyYup24tq891gkaygIFvWDqg== - dependencies: - "@babel/helper-annotate-as-pure" "^7.22.5" - "@babel/helper-compilation-targets" "^7.22.15" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-optimise-call-expression" "^7.22.5" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-replace-supers" "^7.22.20" - "@babel/helper-split-export-declaration" "^7.22.6" - globals "^11.1.0" - "@babel/plugin-transform-classes@^7.23.8": version "7.23.8" resolved "https://registry.npmjs.org/@babel/plugin-transform-classes/-/plugin-transform-classes-7.23.8.tgz#d08ae096c240347badd68cdf1b6d1624a6435d92" @@ -769,16 +690,6 @@ "@babel/helper-plugin-utils" "^7.22.5" "@babel/helper-simple-access" "^7.22.5" -"@babel/plugin-transform-modules-systemjs@^7.23.3": - version "7.23.3" - resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.3.tgz#fa7e62248931cb15b9404f8052581c302dd9de81" - integrity sha512-ZxyKGTkF9xT9YJuKQRo19ewf3pXpopuYQd8cDXqNzc3mUNbOME0RKMoZxviQk74hwzfQsEe66dE92MaZbdHKNQ== - dependencies: - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-module-transforms" "^7.23.3" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-identifier" "^7.22.20" - "@babel/plugin-transform-modules-systemjs@^7.23.9": version "7.23.9" resolved "https://registry.npmjs.org/@babel/plugin-transform-modules-systemjs/-/plugin-transform-modules-systemjs-7.23.9.tgz#105d3ed46e4a21d257f83a2f9e2ee4203ceda6be" @@ -1033,93 +944,7 @@ "@babel/helper-create-regexp-features-plugin" "^7.22.15" "@babel/helper-plugin-utils" "^7.22.5" -"@babel/preset-env@^7.2.0", "@babel/preset-env@^7.23.2": - version "7.23.6" - resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.6.tgz#ad0ea799d5a3c07db5b9a172819bbd444092187a" - integrity sha512-2XPn/BqKkZCpzYhUUNZ1ssXw7DcXfKQEjv/uXZUXgaebCMYmkEsfZ2yY+vv+xtXv50WmL5SGhyB6/xsWxIvvOQ== - dependencies: - "@babel/compat-data" "^7.23.5" - "@babel/helper-compilation-targets" "^7.23.6" - "@babel/helper-plugin-utils" "^7.22.5" - "@babel/helper-validator-option" "^7.23.5" - "@babel/plugin-bugfix-safari-id-destructuring-collision-in-function-expression" "^7.23.3" - "@babel/plugin-bugfix-v8-spread-parameters-in-optional-chaining" "^7.23.3" - "@babel/plugin-bugfix-v8-static-class-fields-redefine-readonly" "^7.23.3" - "@babel/plugin-proposal-private-property-in-object" "7.21.0-placeholder-for-preset-env.2" - "@babel/plugin-syntax-async-generators" "^7.8.4" - "@babel/plugin-syntax-class-properties" "^7.12.13" - "@babel/plugin-syntax-class-static-block" "^7.14.5" - "@babel/plugin-syntax-dynamic-import" "^7.8.3" - "@babel/plugin-syntax-export-namespace-from" "^7.8.3" - "@babel/plugin-syntax-import-assertions" "^7.23.3" - "@babel/plugin-syntax-import-attributes" "^7.23.3" - "@babel/plugin-syntax-import-meta" "^7.10.4" - "@babel/plugin-syntax-json-strings" "^7.8.3" - "@babel/plugin-syntax-logical-assignment-operators" "^7.10.4" - "@babel/plugin-syntax-nullish-coalescing-operator" "^7.8.3" - "@babel/plugin-syntax-numeric-separator" "^7.10.4" - "@babel/plugin-syntax-object-rest-spread" "^7.8.3" - "@babel/plugin-syntax-optional-catch-binding" "^7.8.3" - "@babel/plugin-syntax-optional-chaining" "^7.8.3" - "@babel/plugin-syntax-private-property-in-object" "^7.14.5" - "@babel/plugin-syntax-top-level-await" "^7.14.5" - "@babel/plugin-syntax-unicode-sets-regex" "^7.18.6" - "@babel/plugin-transform-arrow-functions" "^7.23.3" - "@babel/plugin-transform-async-generator-functions" "^7.23.4" - "@babel/plugin-transform-async-to-generator" "^7.23.3" - "@babel/plugin-transform-block-scoped-functions" "^7.23.3" - "@babel/plugin-transform-block-scoping" "^7.23.4" - "@babel/plugin-transform-class-properties" "^7.23.3" - "@babel/plugin-transform-class-static-block" "^7.23.4" - "@babel/plugin-transform-classes" "^7.23.5" - "@babel/plugin-transform-computed-properties" "^7.23.3" - "@babel/plugin-transform-destructuring" "^7.23.3" - "@babel/plugin-transform-dotall-regex" "^7.23.3" - "@babel/plugin-transform-duplicate-keys" "^7.23.3" - "@babel/plugin-transform-dynamic-import" "^7.23.4" - "@babel/plugin-transform-exponentiation-operator" "^7.23.3" - "@babel/plugin-transform-export-namespace-from" "^7.23.4" - "@babel/plugin-transform-for-of" "^7.23.6" - "@babel/plugin-transform-function-name" "^7.23.3" - "@babel/plugin-transform-json-strings" "^7.23.4" - "@babel/plugin-transform-literals" "^7.23.3" - "@babel/plugin-transform-logical-assignment-operators" "^7.23.4" - "@babel/plugin-transform-member-expression-literals" "^7.23.3" - "@babel/plugin-transform-modules-amd" "^7.23.3" - "@babel/plugin-transform-modules-commonjs" "^7.23.3" - "@babel/plugin-transform-modules-systemjs" "^7.23.3" - "@babel/plugin-transform-modules-umd" "^7.23.3" - "@babel/plugin-transform-named-capturing-groups-regex" "^7.22.5" - "@babel/plugin-transform-new-target" "^7.23.3" - "@babel/plugin-transform-nullish-coalescing-operator" "^7.23.4" - "@babel/plugin-transform-numeric-separator" "^7.23.4" - "@babel/plugin-transform-object-rest-spread" "^7.23.4" - "@babel/plugin-transform-object-super" "^7.23.3" - "@babel/plugin-transform-optional-catch-binding" "^7.23.4" - "@babel/plugin-transform-optional-chaining" "^7.23.4" - "@babel/plugin-transform-parameters" "^7.23.3" - "@babel/plugin-transform-private-methods" "^7.23.3" - "@babel/plugin-transform-private-property-in-object" "^7.23.4" - "@babel/plugin-transform-property-literals" "^7.23.3" - "@babel/plugin-transform-regenerator" "^7.23.3" - "@babel/plugin-transform-reserved-words" "^7.23.3" - "@babel/plugin-transform-shorthand-properties" "^7.23.3" - "@babel/plugin-transform-spread" "^7.23.3" - "@babel/plugin-transform-sticky-regex" "^7.23.3" - "@babel/plugin-transform-template-literals" "^7.23.3" - "@babel/plugin-transform-typeof-symbol" "^7.23.3" - "@babel/plugin-transform-unicode-escapes" "^7.23.3" - "@babel/plugin-transform-unicode-property-regex" "^7.23.3" - "@babel/plugin-transform-unicode-regex" "^7.23.3" - "@babel/plugin-transform-unicode-sets-regex" "^7.23.3" - "@babel/preset-modules" "0.1.6-no-external-plugins" - babel-plugin-polyfill-corejs2 "^0.4.6" - babel-plugin-polyfill-corejs3 "^0.8.5" - babel-plugin-polyfill-regenerator "^0.5.3" - core-js-compat "^3.31.0" - semver "^6.3.1" - -"@babel/preset-env@^7.23.9": +"@babel/preset-env@^7.2.0", "@babel/preset-env@^7.23.2", "@babel/preset-env@^7.23.9": version "7.23.9" resolved "https://registry.npmjs.org/@babel/preset-env/-/preset-env-7.23.9.tgz#beace3b7994560ed6bf78e4ae2073dff45387669" integrity sha512-3kBGTNBBk9DQiPoXYS0g0BYlwTQYUTifqgKTjxUwEUkduRT2QOa0FPGBJ+NROQhGyYO5BuTJwGvBnqKDykac6A== @@ -1247,14 +1072,14 @@ "@babel/plugin-transform-typescript" "^7.23.3" "@babel/register@^7.22.15": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/register/-/register-7.22.15.tgz#c2c294a361d59f5fa7bcc8b97ef7319c32ecaec7" - integrity sha512-V3Q3EqoQdn65RCgTLwauZaTfd1ShhwPmbBv+1dkZV/HpCGMKVyn6oFcRlI7RaKqiDQjX2Qd3AuoEguBgdjIKlg== + version "7.23.7" + resolved "https://registry.npmjs.org/@babel/register/-/register-7.23.7.tgz#485a5e7951939d21304cae4af1719fdb887bc038" + integrity sha512-EjJeB6+kvpk+Y5DAkEAmbOBEFkh9OASx0huoEkqYTFxAZHzOAX2Oh5uwAUuL2rUddqfM0SA+KPXV2TbzoZ2kvQ== dependencies: clone-deep "^4.0.1" find-cache-dir "^2.0.0" make-dir "^2.1.0" - pirates "^4.0.5" + pirates "^4.0.6" source-map-support "^0.5.16" "@babel/regjsgen@^0.8.0": @@ -1263,22 +1088,13 @@ integrity sha512-x/rqGMdzj+fWZvCOYForTghzbtqPDZ5gPwaoNGHdgDfF2QA/XZbCBp4Moo5scrkAMPhB7z26XM/AaHuIJdgauA== "@babel/runtime@^7.10.2", "@babel/runtime@^7.12.5", "@babel/runtime@^7.13.10", "@babel/runtime@^7.17.8", "@babel/runtime@^7.23.2", "@babel/runtime@^7.8.4", "@babel/runtime@^7.9.2": - version "7.23.6" - resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.6.tgz#c05e610dc228855dc92ef1b53d07389ed8ab521d" - integrity sha512-zHd0eUrf5GZoOWVCXp6koAKQTfZV07eit6bGPmJgnZdnSAvvZee6zniW2XMF7Cmc4ISOOnPy3QaSiIJGJkVEDQ== + version "7.23.9" + resolved "https://registry.npmjs.org/@babel/runtime/-/runtime-7.23.9.tgz#47791a15e4603bb5f905bc0753801cf21d6345f7" + integrity sha512-0CX6F+BI2s9dkUqr08KFrAIZgNFj75rdBU/DjCyYLIaV/quFjkk6T+EJ2LkZHyZTbEV4L5p97mNkUsHl2wLFAw== dependencies: regenerator-runtime "^0.14.0" -"@babel/template@^7.22.15", "@babel/template@^7.3.3": - version "7.22.15" - resolved "https://registry.npmjs.org/@babel/template/-/template-7.22.15.tgz#09576efc3830f0430f4548ef971dde1350ef2f38" - integrity sha512-QPErUVm4uyJa60rkI73qneDacvdvzxshT3kksGqlGWYdOTIUOwJ7RDUL8sGqslY1uXWSL6xMFKEXDS3ox2uF0w== - dependencies: - "@babel/code-frame" "^7.22.13" - "@babel/parser" "^7.22.15" - "@babel/types" "^7.22.15" - -"@babel/template@^7.23.9": +"@babel/template@^7.22.15", "@babel/template@^7.23.9", "@babel/template@^7.3.3": version "7.23.9" resolved "https://registry.npmjs.org/@babel/template/-/template-7.23.9.tgz#f881d0487cba2828d3259dcb9ef5005a9731011a" integrity sha512-+xrD2BWLpvHKNmX2QbpdpsBaWnRxahMwJjO+KZk2JOElj5nSmKezyS1B4u+QbHMTX69t4ukm6hh9lsYQ7GHCKA== @@ -1287,23 +1103,7 @@ "@babel/parser" "^7.23.9" "@babel/types" "^7.23.9" -"@babel/traverse@^7.18.9", "@babel/traverse@^7.23.2", "@babel/traverse@^7.23.6", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": - version "7.23.6" - resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.6.tgz#b53526a2367a0dd6edc423637f3d2d0f2521abc5" - integrity sha512-czastdK1e8YByZqezMPFiZ8ahwVMh/ESl9vPgvgdB9AmFMGP5jfpFax74AQgl5zj4XHzqeYAg2l8PuUeRS1MgQ== - dependencies: - "@babel/code-frame" "^7.23.5" - "@babel/generator" "^7.23.6" - "@babel/helper-environment-visitor" "^7.22.20" - "@babel/helper-function-name" "^7.23.0" - "@babel/helper-hoist-variables" "^7.22.5" - "@babel/helper-split-export-declaration" "^7.22.6" - "@babel/parser" "^7.23.6" - "@babel/types" "^7.23.6" - debug "^4.3.1" - globals "^11.1.0" - -"@babel/traverse@^7.23.9": +"@babel/traverse@^7.18.9", "@babel/traverse@^7.23.2", "@babel/traverse@^7.23.9", "@babel/traverse@^7.4.5", "@babel/traverse@^7.7.0": version "7.23.9" resolved "https://registry.npmjs.org/@babel/traverse/-/traverse-7.23.9.tgz#2f9d6aead6b564669394c5ce0f9302bb65b9d950" integrity sha512-I/4UJ9vs90OkBtY6iiiTORVMyIhJ4kAVmsKo9KFc8UOxMeUfi2hvtIBsET5u9GizXE6/GFSuKCTNfgCswuEjRg== @@ -1319,16 +1119,7 @@ debug "^4.3.1" globals "^11.1.0" -"@babel/types@^7.0.0", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": - version "7.23.6" - resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.6.tgz#be33fdb151e1f5a56877d704492c240fc71c7ccd" - integrity sha512-+uarb83brBzPKN38NX1MkB6vb6+mwvR6amUulqAE7ccQw1pEl+bCia9TbdG1lsnFP7lZySvUn37CHyXQdfTwzg== - dependencies: - "@babel/helper-string-parser" "^7.23.4" - "@babel/helper-validator-identifier" "^7.22.20" - to-fast-properties "^2.0.0" - -"@babel/types@^7.23.9": +"@babel/types@^7.0.0", "@babel/types@^7.18.9", "@babel/types@^7.20.7", "@babel/types@^7.22.15", "@babel/types@^7.22.19", "@babel/types@^7.22.5", "@babel/types@^7.23.0", "@babel/types@^7.23.4", "@babel/types@^7.23.6", "@babel/types@^7.23.9", "@babel/types@^7.3.3", "@babel/types@^7.4.4", "@babel/types@^7.7.0": version "7.23.9" resolved "https://registry.npmjs.org/@babel/types/-/types-7.23.9.tgz#1dd7b59a9a2b5c87f8b41e52770b5ecbf492e002" integrity sha512-dQjSq/7HaSjRM43FFGnv5keM2HsxpmyV1PfaSVm0nzzjwwTmjOe6J4bC8e3+pTEIgHaHj+1ZlLThRJ2auc/w1Q== @@ -1595,32 +1386,32 @@ resolved "https://registry.npmjs.org/@fastify/busboy/-/busboy-2.1.0.tgz#0709e9f4cb252351c609c6e6d8d6779a8d25edff" integrity sha512-+KpH+QxZU7O4675t3mnkQKcZZg56u+K/Ct2K+N2AZYNVK8kyeo/bI18tI8aPm3tvNNRyTWfj6s5tnGNlcbQRsA== -"@floating-ui/core@^1.4.2": - version "1.5.2" - resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.5.2.tgz#53a0f7a98c550e63134d504f26804f6b83dbc071" - integrity sha512-Ii3MrfY/GAIN3OhXNzpCKaLxHQfJF9qvwq/kEJYdqDxeIHa01K8sldugal6TmeeXl+WMvhv9cnVzUTaFFJF09A== +"@floating-ui/core@^1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@floating-ui/core/-/core-1.6.0.tgz#fa41b87812a16bf123122bf945946bae3fdf7fc1" + integrity sha512-PcF++MykgmTj3CIyOQbKA/hDzOAiqI3mhuoN44WRCopIs1sgoDoU4oty4Jtqaj/y3oDU6fnVSm4QG0a3t5i0+g== dependencies: - "@floating-ui/utils" "^0.1.3" + "@floating-ui/utils" "^0.2.1" -"@floating-ui/dom@^1.5.1": - version "1.5.3" - resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.5.3.tgz#54e50efcb432c06c23cd33de2b575102005436fa" - integrity sha512-ClAbQnEqJAKCJOEbbLo5IUlZHkNszqhuxS4fHAVxRPXPya6Ysf2G8KypnYcOTpx6I8xcgF9bbHb6g/2KpbV8qA== +"@floating-ui/dom@^1.6.0": + version "1.6.0" + resolved "https://registry.npmjs.org/@floating-ui/dom/-/dom-1.6.0.tgz#282f31c5c7d2aaef3999e09f2c06280a020364d1" + integrity sha512-SZ0BEXzsaaS6THZfZJUcAobbZTD+MvfGM42bxgeg0Tnkp4/an/avqwAXiVLsFtIBZtfsx3Ymvwx0+KnnhdA/9g== dependencies: - "@floating-ui/core" "^1.4.2" - "@floating-ui/utils" "^0.1.3" + "@floating-ui/core" "^1.6.0" + "@floating-ui/utils" "^0.2.1" "@floating-ui/react-dom@^2.0.0": - version "2.0.4" - resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.4.tgz#b076fafbdfeb881e1d86ae748b7ff95150e9f3ec" - integrity sha512-CF8k2rgKeh/49UrnIBs4BdxPUV6vize/Db1d/YbCLyp9GiVZ0BEwf5AiDSxJRCr6yOkGqTFHtmrULxkEfYZ7dQ== + version "2.0.7" + resolved "https://registry.npmjs.org/@floating-ui/react-dom/-/react-dom-2.0.7.tgz#873e0a55a25d8ddbbccd159d6ab4a4b98eb05494" + integrity sha512-B5GJxKUyPcGsvE1vua+Abvw0t6zVMyTbtG+Jk7BoI4hfc5Ahv50dstRIAn0nS0274kR9gnKwxIXyGA8EzBZJrA== dependencies: - "@floating-ui/dom" "^1.5.1" + "@floating-ui/dom" "^1.6.0" -"@floating-ui/utils@^0.1.3": - version "0.1.6" - resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.1.6.tgz#22958c042e10b67463997bd6ea7115fe28cbcaf9" - integrity sha512-OfX7E2oUDYxtBvsuS4e/jSn4Q9Qb6DzgeYtsAdkPZ47znpoNsMgZw0+tVijiv3uGNR6dgNlty6r9rzIzHjtd/A== +"@floating-ui/utils@^0.2.1": + version "0.2.1" + resolved "https://registry.npmjs.org/@floating-ui/utils/-/utils-0.2.1.tgz#16308cea045f0fc777b6ff20a9f25474dd8293d2" + integrity sha512-9TANp6GPoMtYzQdt54kfAyMmz1+osLlXdg2ENroU7zzrtflTLrrC/lgrIfaSe+Wu0b89GKccT7vxXA0MoAIO+Q== "@humanwhocodes/config-array@^0.5.0": version "0.5.0" @@ -1907,15 +1698,7 @@ "@jridgewell/resolve-uri" "^3.0.3" "@jridgewell/sourcemap-codec" "^1.4.10" -"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.9": - version "0.3.20" - resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.20.tgz#72e45707cf240fa6b081d0366f8265b0cd10197f" - integrity sha512-R8LcPeWZol2zR8mmH3JeKQ6QRCFb7XgUhV9ZlGhHLGyg4wpPiPZNQOOWhFZhxKw8u//yTbNGI42Bx/3paXEQ+Q== - dependencies: - "@jridgewell/resolve-uri" "^3.1.0" - "@jridgewell/sourcemap-codec" "^1.4.14" - -"@jridgewell/trace-mapping@^0.3.20": +"@jridgewell/trace-mapping@^0.3.12", "@jridgewell/trace-mapping@^0.3.17", "@jridgewell/trace-mapping@^0.3.18", "@jridgewell/trace-mapping@^0.3.20", "@jridgewell/trace-mapping@^0.3.9": version "0.3.22" resolved "https://registry.npmjs.org/@jridgewell/trace-mapping/-/trace-mapping-0.3.22.tgz#72a621e5de59f5f1ef792d0793a82ee20f645e4c" integrity sha512-Wf963MzWtA2sjrNt+g18IAln9lKnlRp+K2eH4jjIoF1wYeq3aMREpG09xhlhdzS0EjwU7qmUJYangWa+151vZw== @@ -2435,9 +2218,9 @@ integrity sha512-+Fj43pSMwJs4KRrH/938Uf+uAELIgVBmQzg/q1YG10djyfA3TnrU8N8XzqCh/okZdszqBQTZf96idMfE5lnwTA== "@sinonjs/commons@^3.0.0": - version "3.0.0" - resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.0.tgz#beb434fe875d965265e04722ccfc21df7f755d72" - integrity sha512-jXBtWAF4vmdNmZgD5FoKsVLv3rPgDnLgPbU84LIJ3otV44vJlDRokVng5v8NFJdCf/da9legHcKaRuZs4L7faA== + version "3.0.1" + resolved "https://registry.npmjs.org/@sinonjs/commons/-/commons-3.0.1.tgz#1029357e44ca901a615585f6d27738dbc89084cd" + integrity sha512-K3mCHKQ9sVh8o1C9cxkwxaOmXoAMlDxC1mYyHrjqOWEcBjYr76t96zL2zlj5dUGZ3HSw240X1qgH3Mjf1yJWpQ== dependencies: type-detect "4.0.8" @@ -2502,36 +2285,7 @@ prop-types "^15.6.2" react-flip-move "^3.0.1" -"@splunk/react-ui@^4.22.0", "@splunk/react-ui@^4.23.0": - version "4.23.0" - resolved "https://registry.npmjs.org/@splunk/react-ui/-/react-ui-4.23.0.tgz#16b32add8ce35cc68a04654df10e345e2490e93f" - integrity sha512-rlhRvhjVnRgJrvGRcDd+WXdkW6ihc5m6H/Gu2khKuFS3ycXQSDR/hZgYhih7Gz2bHSjd8B3FQslfQItcPVcUgA== - dependencies: - "@dnd-kit/core" "6.0.8" - "@dnd-kit/sortable" "7.0.2" - "@dnd-kit/utilities" "3.2.1" - "@splunk/react-icons" "^4.2.0" - "@splunk/themes" "^0.16.4" - "@splunk/ui-utils" "^1.6.0" - "@types/commonmark" "^0.27.6" - "@types/lodash" "^4.14.156" - "@types/react" "^16.9.38" - "@types/react-dom" "^16.9.8" - "@types/react-resize-detector" "^3.1.1" - "@types/styled-components" "^5.1.0" - "@types/tinycolor2" "^1.4.2" - commonmark "^0.30.0" - commonmark-react-renderer "^4.3.2" - decimal.js-light "^2.2.3" - lodash "^4.17.14" - moment "^2.29.4" - prop-types "^15.6.2" - react-resize-detector "^3.2.1" - react-spring "9.2.4" - tinycolor2 "^1.4.1" - use-typed-event-listener "^3.0.0" - -"@splunk/react-ui@^4.24.0": +"@splunk/react-ui@^4.22.0", "@splunk/react-ui@^4.23.0", "@splunk/react-ui@^4.24.0": version "4.24.0" resolved "https://registry.npmjs.org/@splunk/react-ui/-/react-ui-4.24.0.tgz#1250eda179f30c51d22c289d41a07ff0e2fd7c3e" integrity sha512-qrPKWe8H4w6hl3dIPPeIDgvWqwAk9DjhkVbKw3ffInrLk32bbA816y5WfQZdi0rBhZLOKNl1j4Om875qO33mpQ== @@ -3292,74 +3046,74 @@ "@types/express" "^4.7.0" file-system-cache "2.3.0" -"@swc/core-darwin-arm64@1.3.101": - version "1.3.101" - resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.101.tgz#9ffdc0e77c31b20877fa7405c82905e0c76738d0" - integrity sha512-mNFK+uHNPRXSnfTOG34zJOeMl2waM4hF4a2NY7dkMXrPqw9CoJn4MwTXJcyMiSz1/BnNjjTCHF3Yhj0jPxmkzQ== - -"@swc/core-darwin-x64@1.3.101": - version "1.3.101" - resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.101.tgz#e50130e21e3cfd3029fd6cea43e8309b58ad9fa6" - integrity sha512-B085j8XOx73Fg15KsHvzYWG262bRweGr3JooO1aW5ec5pYbz5Ew9VS5JKYS03w2UBSxf2maWdbPz2UFAxg0whw== - -"@swc/core-linux-arm-gnueabihf@1.3.101": - version "1.3.101" - resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.101.tgz#8cd36328e794b3c42b6c8e578bb1f42e59ba0231" - integrity sha512-9xLKRb6zSzRGPqdz52Hy5GuB1lSjmLqa0lST6MTFads3apmx4Vgs8Y5NuGhx/h2I8QM4jXdLbpqQlifpzTlSSw== - -"@swc/core-linux-arm64-gnu@1.3.101": - version "1.3.101" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.101.tgz#d15e3885eb13a1512ba62f00ce4f5bb19f710a0c" - integrity sha512-oE+r1lo7g/vs96Weh2R5l971dt+ZLuhaUX+n3BfDdPxNHfObXgKMjO7E+QS5RbGjv/AwiPCxQmbdCp/xN5ICJA== - -"@swc/core-linux-arm64-musl@1.3.101": - version "1.3.101" - resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.101.tgz#851d4cc1079b091fee36f5f64335232210749d7a" - integrity sha512-OGjYG3H4BMOTnJWJyBIovCez6KiHF30zMIu4+lGJTCrxRI2fAjGLml3PEXj8tC3FMcud7U2WUn6TdG0/te2k6g== - -"@swc/core-linux-x64-gnu@1.3.101": - version "1.3.101" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.101.tgz#3a2a7c584db2e05a798e28361440424914563fa3" - integrity sha512-/kBMcoF12PRO/lwa8Z7w4YyiKDcXQEiLvM+S3G9EvkoKYGgkkz4Q6PSNhF5rwg/E3+Hq5/9D2R+6nrkF287ihg== - -"@swc/core-linux-x64-musl@1.3.101": - version "1.3.101" - resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.101.tgz#45d1d53945994f08e93703b8de24ccac88538d0c" - integrity sha512-kDN8lm4Eew0u1p+h1l3JzoeGgZPQ05qDE0czngnjmfpsH2sOZxVj1hdiCwS5lArpy7ktaLu5JdRnx70MkUzhXw== - -"@swc/core-win32-arm64-msvc@1.3.101": - version "1.3.101" - resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.101.tgz#b2610b8354e5fbca7cc5be3f728e61b046227fa8" - integrity sha512-9Wn8TTLWwJKw63K/S+jjrZb9yoJfJwCE2RV5vPCCWmlMf3U1AXj5XuWOLUX+Rp2sGKau7wZKsvywhheWm+qndQ== - -"@swc/core-win32-ia32-msvc@1.3.101": - version "1.3.101" - resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.101.tgz#c919175bb4cd5e9fcfa56fbd3708167c1d445c68" - integrity sha512-onO5KvICRVlu2xmr4//V2je9O2XgS1SGKpbX206KmmjcJhXN5EYLSxW9qgg+kgV5mip+sKTHTAu7IkzkAtElYA== - -"@swc/core-win32-x64-msvc@1.3.101": - version "1.3.101" - resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.101.tgz#17743fe425caffc596fde5965c9c4cf9a48aa26a" - integrity sha512-T3GeJtNQV00YmiVw/88/nxJ/H43CJvFnpvBHCVn17xbahiVUOPOduh3rc9LgAkKiNt/aV8vU3OJR+6PhfMR7UQ== +"@swc/core-darwin-arm64@1.3.106": + version "1.3.106" + resolved "https://registry.npmjs.org/@swc/core-darwin-arm64/-/core-darwin-arm64-1.3.106.tgz#05adb015d4f8abe7b8b435af10b6e24863cf3b6c" + integrity sha512-XYcbViNyHnnm7RWOAO1YipMmthM7m2aXF32b0y+JMLYFBEyFpjVX9btLkzeL7wRx/5B3I35yJNhE+xyx0Q1Gkw== + +"@swc/core-darwin-x64@1.3.106": + version "1.3.106" + resolved "https://registry.npmjs.org/@swc/core-darwin-x64/-/core-darwin-x64-1.3.106.tgz#da3aa19bcea1caf77b9267b48c40506b3fbc9e3e" + integrity sha512-YKDPhUdfuwhmOUS9+CaIwl/0Tp+f1b73BH2EIESuxSNsogZf18a8HQ8O0fQEwdiwmA5LEqw47cj+kfOWV/0+kw== + +"@swc/core-linux-arm-gnueabihf@1.3.106": + version "1.3.106" + resolved "https://registry.npmjs.org/@swc/core-linux-arm-gnueabihf/-/core-linux-arm-gnueabihf-1.3.106.tgz#08c4f0b56c4607e124868f9793d5d6e198abdb3e" + integrity sha512-bHxxJXogvFfocLL5inZxxtx/x/WgKozigp80Vbx0viac1fPDJrqKBw2X4MzpMiuTRAGVQ03jJI6pDwbSBf+yDw== + +"@swc/core-linux-arm64-gnu@1.3.106": + version "1.3.106" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-gnu/-/core-linux-arm64-gnu-1.3.106.tgz#cfa2ac91ca279bf09db8ef001a139a3840a2b05a" + integrity sha512-c7jue++CHLgtpeaakEukoCLT9eNrImizbleE9Y7Is8CHqLq/7DG4s+7ma9DFKXIzW2MpTg9byIEQfpqSphVW6A== + +"@swc/core-linux-arm64-musl@1.3.106": + version "1.3.106" + resolved "https://registry.npmjs.org/@swc/core-linux-arm64-musl/-/core-linux-arm64-musl-1.3.106.tgz#1eff9b3e51a84ea13e0be4de2784bbb28a0e097b" + integrity sha512-51EaC3Q8qAhLtWVnAVqoYX/gk3tK31cCBzUpwCcmhianhEBM2/WtKRAS4MqPhE8VVZuN3WjO2c2JaF2mX0yuoA== + +"@swc/core-linux-x64-gnu@1.3.106": + version "1.3.106" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-gnu/-/core-linux-x64-gnu-1.3.106.tgz#c3c7681efaeb36c528eb0cd133e0e52a85554a5b" + integrity sha512-tOUi8BB6jAeCXgx7ESLNnX7nrbMVKQ/XajK77v7Ad4SXf9HYArnimBJpXUUyVFJTXLSv4e6c7s6XHHqXb5Lwcg== + +"@swc/core-linux-x64-musl@1.3.106": + version "1.3.106" + resolved "https://registry.npmjs.org/@swc/core-linux-x64-musl/-/core-linux-x64-musl-1.3.106.tgz#1e7287e379c503f8e565eab7fc5065739611690f" + integrity sha512-binLw4Lbd83NPy4/m/teH2nbaifxveSD+sKDvpxywRbvYW2I0w/iCBpUBcbnl16TQF4TPOGpq5YwG9lVxPVw5g== + +"@swc/core-win32-arm64-msvc@1.3.106": + version "1.3.106" + resolved "https://registry.npmjs.org/@swc/core-win32-arm64-msvc/-/core-win32-arm64-msvc-1.3.106.tgz#02d7418c202a33906949a5e6924baaaa0a3fce5f" + integrity sha512-n4ttBWr8tM7DPzwcEOIBTyTMHZTzCmbic/HTtxEsPyMAf/Daen+yrTKzjPP6k2usfSrjkxA780RSJJxI1N8r2w== + +"@swc/core-win32-ia32-msvc@1.3.106": + version "1.3.106" + resolved "https://registry.npmjs.org/@swc/core-win32-ia32-msvc/-/core-win32-ia32-msvc-1.3.106.tgz#22f07b4710e79e22c7828ad89e87636671680e2d" + integrity sha512-GhDNIwxE5FhkujESI6h/4ysT3wxwmrzTUlZYaR8rRui6a6SdX9feIPUHPEE5o5hpyp+xqlmvRxKkRxOnwsq8iA== + +"@swc/core-win32-x64-msvc@1.3.106": + version "1.3.106" + resolved "https://registry.npmjs.org/@swc/core-win32-x64-msvc/-/core-win32-x64-msvc-1.3.106.tgz#cc28822b1476345ef4ee2a1895ff7c51a42dd45f" + integrity sha512-2M6yWChuMS1+/MPo3Dor0SOMkvmiugonWlzsZBAu/oZboH2xKrHSRv7brsBujb2Oe47r+NsbV+vq9tnnP9Vl1Q== "@swc/core@^1.3.82": - version "1.3.101" - resolved "https://registry.npmjs.org/@swc/core/-/core-1.3.101.tgz#4e8f1583094a73c410e48a0bebdeccdc6c66d4a5" - integrity sha512-w5aQ9qYsd/IYmXADAnkXPGDMTqkQalIi+kfFf/MHRKTpaOL7DHjMXwPp/n8hJ0qNjRvchzmPtOqtPBiER50d8A== + version "1.3.106" + resolved "https://registry.npmjs.org/@swc/core/-/core-1.3.106.tgz#7e054f8a7db56de3f519c48db03f58e3f09fe8ee" + integrity sha512-++QPSPkFq2qELYVScxNHJC42hKQChjiTWS2P0QQ5JWT4NHb9lmNSfrc1ylFIyImwRnxsW2MTBALLYLf95EFAsg== dependencies: "@swc/counter" "^0.1.1" "@swc/types" "^0.1.5" optionalDependencies: - "@swc/core-darwin-arm64" "1.3.101" - "@swc/core-darwin-x64" "1.3.101" - "@swc/core-linux-arm-gnueabihf" "1.3.101" - "@swc/core-linux-arm64-gnu" "1.3.101" - "@swc/core-linux-arm64-musl" "1.3.101" - "@swc/core-linux-x64-gnu" "1.3.101" - "@swc/core-linux-x64-musl" "1.3.101" - "@swc/core-win32-arm64-msvc" "1.3.101" - "@swc/core-win32-ia32-msvc" "1.3.101" - "@swc/core-win32-x64-msvc" "1.3.101" + "@swc/core-darwin-arm64" "1.3.106" + "@swc/core-darwin-x64" "1.3.106" + "@swc/core-linux-arm-gnueabihf" "1.3.106" + "@swc/core-linux-arm64-gnu" "1.3.106" + "@swc/core-linux-arm64-musl" "1.3.106" + "@swc/core-linux-x64-gnu" "1.3.106" + "@swc/core-linux-x64-musl" "1.3.106" + "@swc/core-win32-arm64-msvc" "1.3.106" + "@swc/core-win32-ia32-msvc" "1.3.106" + "@swc/core-win32-x64-msvc" "1.3.106" "@swc/counter@^0.1.1": version "0.1.2" @@ -3386,9 +3140,9 @@ pretty-format "^27.0.2" "@testing-library/dom@^9.0.0": - version "9.3.3" - resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.3.tgz#108c23a5b0ef51121c26ae92eb3179416b0434f5" - integrity sha512-fB0R+fa3AUqbLHWyxXa2kGVtf1Fe1ZZFr0Zp6AIbIAzXb2mKbEXl+PCQNUOaq5lbTab5tfctfXRNsWXxa2f7Aw== + version "9.3.4" + resolved "https://registry.npmjs.org/@testing-library/dom/-/dom-9.3.4.tgz#50696ec28376926fec0a1bf87d9dbac5e27f60ce" + integrity sha512-FlS4ZWlp97iiNWig0Muq8p+3rVDjRiYE+YKGbAqXOu9nwJFFOdL00kFpz42M+4huzYi86vAK1sOOfyOG45muIQ== dependencies: "@babel/code-frame" "^7.10.4" "@babel/runtime" "^7.12.5" @@ -3422,12 +3176,7 @@ "@testing-library/dom" "^8.0.0" "@types/react-dom" "<18.0.0" -"@testing-library/user-event@^14.4.0": - version "14.5.1" - resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.1.tgz#27337d72046d5236b32fd977edee3f74c71d332f" - integrity sha512-UCcUKrUYGj7ClomOo2SpNVvx4/fkd/2BbIHDCle8A0ax+P3bU7yJwDBDrS6ZwdTMARWTGODX1hEsCcO+7beJjg== - -"@testing-library/user-event@^14.5.2": +"@testing-library/user-event@^14.4.0", "@testing-library/user-event@^14.5.2": version "14.5.2" resolved "https://registry.npmjs.org/@testing-library/user-event/-/user-event-14.5.2.tgz#db7257d727c891905947bd1c1a99da20e03c2ebd" integrity sha512-YAh82Wh4TIrxYLmfGcixwD18oIjyC1pFQC2Y01F2lzV2HTMiYrI0nze0FD0ocB//CKS/7jIUgae+adPqxK5yCQ== @@ -3489,9 +3238,9 @@ "@babel/types" "^7.0.0" "@types/babel__traverse@*", "@types/babel__traverse@^7.0.6", "@types/babel__traverse@^7.18.0": - version "7.20.4" - resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.4.tgz#ec2c06fed6549df8bc0eb4615b683749a4a92e1b" - integrity sha512-mSM/iKUk5fDDrEV/e83qY+Cr3I1+Q3qqTuEn++HAWYjEa1+NxZr6CNrcJGf2ZTnq4HoFGC3zaTPZTobCzCFukA== + version "7.20.5" + resolved "https://registry.npmjs.org/@types/babel__traverse/-/babel__traverse-7.20.5.tgz#7b7502be0aa80cc4ef22978846b983edaafcd4dd" + integrity sha512-WXCyOcRtH37HAUkpXhUduaxdm82b4GSlyTqajXviN4EfiuPgNYR109xMCKvpl6zPIpua0DGlMEDCq+g8EdoheQ== dependencies: "@babel/types" "^7.20.7" @@ -3566,14 +3315,14 @@ "@types/estree" "*" "@types/eslint@*": - version "8.56.0" - resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.0.tgz#e28d045b8e530a33c9cbcfbf02332df0d1380a2c" - integrity sha512-FlsN0p4FhuYRjIxpbdXovvHQhtlG05O1GG/RNWvdAxTboR438IOTwmrY/vLA+Xfgg06BTkP045M3vpFwTMv1dg== + version "8.56.2" + resolved "https://registry.npmjs.org/@types/eslint/-/eslint-8.56.2.tgz#1c72a9b794aa26a8b94ad26d5b9aa51c8a6384bb" + integrity sha512-uQDwm1wFHmbBbCZCqAlq6Do9LYwByNZHWzXppSnay9SuwJ+VRbjkbLABer54kcPnMSlG6Fdiy2yaFXm/z9Z5gw== dependencies: "@types/estree" "*" "@types/json-schema" "*" -"@types/estree@*", "@types/estree@^1.0.0", "@types/estree@^1.0.5": +"@types/estree@*", "@types/estree@^1.0.5": version "1.0.5" resolved "https://registry.npmjs.org/@types/estree/-/estree-1.0.5.tgz#a6ce3e556e00fd9895dd872dd172ad0d4bd687f4" integrity sha512-/kYRxGDLWzHOB7q+wtSUQlFrtcdUccpfy+X+9iMBpHK8QLLhx2wIPYuS5DYtR9Wa/YlZAbIovy7qVdB1Aq6Lyw== @@ -3584,9 +3333,9 @@ integrity sha512-CuPgU6f3eT/XgKKPqKd/gLZV1Xmvf1a2R5POBOGQa6uv82xpls89HU5zKeVoyR8XzHd1RGNOlQlvUe3CFkjWNQ== "@types/express-serve-static-core@^4.17.33": - version "4.17.41" - resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.41.tgz#5077defa630c2e8d28aa9ffc2c01c157c305bef6" - integrity sha512-OaJ7XLaelTgrvlZD8/aa0vvvxZdUmlCn6MtWeB7TkiKW70BQLc9XEPpDLPdbo52ZhXUCrznlWdCHWxJWtdyajA== + version "4.17.42" + resolved "https://registry.npmjs.org/@types/express-serve-static-core/-/express-serve-static-core-4.17.42.tgz#2a276952acc73d1b8dc63fd4210647abbc553a71" + integrity sha512-ckM3jm2bf/MfB3+spLPWYPUH573plBFwpOhqQ2WottxYV85j1HQFlxmnTq57X1yHY9awZPig06hL/cLMgNWHIQ== dependencies: "@types/node" "*" "@types/qs" "*" @@ -3715,31 +3464,24 @@ integrity sha512-hov8bUuiLiyFPGyFPE1lwWhmzYbirOXQNNo40+y3zow8aFVTeyn3VWL0VFFfdNddA8S4Vf0Tc062rzyNr7Paag== "@types/node-fetch@^2.6.4": - version "2.6.10" - resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.10.tgz#ff5c1ceacab782f2b7ce69957d38c1c27b0dc469" - integrity sha512-PPpPK6F9ALFTn59Ka3BaL+qGuipRfxNE8qVgkp0bVixeiR2c2/L+IVOiBdu9JhhT22sWnQEp6YyHGI2b2+CMcA== + version "2.6.11" + resolved "https://registry.npmjs.org/@types/node-fetch/-/node-fetch-2.6.11.tgz#9b39b78665dae0e82a08f02f4967d62c66f95d24" + integrity sha512-24xFj9R5+rfQJLRyM56qh+wnVSYhyXC2tkoBndtY0U+vubqNsYXGjufB2nn8Q6gt0LrARwL6UBtMCSVCwl4B1g== dependencies: "@types/node" "*" form-data "^4.0.0" -"@types/node@*": - version "20.10.5" - resolved "https://registry.npmjs.org/@types/node/-/node-20.10.5.tgz#47ad460b514096b7ed63a1dae26fad0914ed3ab2" - integrity sha512-nNPsNE65wjMxEKI93yOP+NPGGBJz/PoN3kZsVLee0XMiJolxSekEVD8wRwBUBqkwc7UWop0edW50yrCQW4CyRw== +"@types/node@*", "@types/node@^20.11.7": + version "20.11.7" + resolved "https://registry.npmjs.org/@types/node/-/node-20.11.7.tgz#cb49aedd758c978c30806d0c38b520ed2a3df6e0" + integrity sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A== dependencies: undici-types "~5.26.4" "@types/node@^18.0.0": - version "18.19.3" - resolved "https://registry.npmjs.org/@types/node/-/node-18.19.3.tgz#e4723c4cb385641d61b983f6fe0b716abd5f8fc0" - integrity sha512-k5fggr14DwAytoA/t8rPrIz++lXK7/DqckthCmoZOKNsEbJkId4Z//BqgApXBUGrGddrigYa1oqheo/7YmW4rg== - dependencies: - undici-types "~5.26.4" - -"@types/node@^20.11.7": - version "20.11.7" - resolved "https://registry.npmjs.org/@types/node/-/node-20.11.7.tgz#cb49aedd758c978c30806d0c38b520ed2a3df6e0" - integrity sha512-GPmeN1C3XAyV5uybAf4cMLWT9fDWcmQhZVtMFu7OR32WjrqGG+Wnk2V1d0bmtUyE/Zy1QJ9BxyiTih9z8Oks8A== + version "18.19.10" + resolved "https://registry.npmjs.org/@types/node/-/node-18.19.10.tgz#4de314ab66faf6bc8ba691021a091ddcdf13a158" + integrity sha512-IZD8kAM02AW1HRDTPOlz3npFava678pr8Ie9Vp8uRhBROXAv8MXT2pCnGZZAKYdromsNQLHQcfWQ6EOatVLtqA== dependencies: undici-types "~5.26.4" @@ -3795,9 +3537,9 @@ "@types/react" "*" "@types/react@*", "@types/react@>=16", "@types/react@^16", "@types/react@^16.14.35", "@types/react@^16.14.51", "@types/react@^16.9.38", "@types/react@^17": - version "16.14.54" - resolved "https://registry.npmjs.org/@types/react/-/react-16.14.54.tgz#43bba37fca0af34f6fd52468098331f0a218aea3" - integrity sha512-54MOeVbxTlC8U6XBy2sLhLaHg/QGP0gPEWIpl1E5tNTJDz/SdFktT3OuvAfKxpSXATUmKXDozHvxbT3XohJgDQ== + version "16.14.56" + resolved "https://registry.npmjs.org/@types/react/-/react-16.14.56.tgz#4cf37850a87edcb9f3526648338eff35d283c9ab" + integrity sha512-MxuHB7dvVm5yOxRr7hJoonLG0JY8YvqZtaQ9Quirp3Oe4FLFjAgxkxsKE6IspdHPpRVZKo2ZoDEravWO81EeYA== dependencies: "@types/prop-types" "*" "@types/scheduler" "*" @@ -3870,9 +3612,9 @@ integrity sha512-IfYcSBWE3hLpBg8+X2SEa8LVkJdJEkT2Ese2aaLs3ptGdVtABxndrMaxuFlQ1qdFf9Q5rDvDpxI3WwgvKFAsQA== "@types/uuid@^9.0.1": - version "9.0.7" - resolved "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.7.tgz#b14cebc75455eeeb160d5fe23c2fcc0c64f724d8" - integrity sha512-WUtIVRUZ9i5dYXefDEAI7sh9/O7jGvHg7Df/5O/gtH3Yabe5odI3UWopVR1qbPXQtvOxWu3mM4XxlYeZtMWF4g== + version "9.0.8" + resolved "https://registry.npmjs.org/@types/uuid/-/uuid-9.0.8.tgz#7545ba4fc3c003d6c756f651f3bf163d8f0f29ba" + integrity sha512-jg+97EGIcY9AGHJJRaaPVgetKDsrTgbRjQ5Msgjh/DQKEFl0DtyRr/VCOyD1T2R1MNeWPK/u7JoGhlDZnKBAfA== "@types/yargs-parser@*": version "21.0.3" @@ -4233,9 +3975,9 @@ acorn-walk@^7.2.0: integrity sha512-OPdCF6GsMIP+Az+aWfAAOEt2/+iVDKE7oy6lJ098aoe59oAmK76qV6Gw60SbZ8jHuG2wH058GF4pLFbYamYrVA== acorn-walk@^8.0.2, acorn-walk@^8.1.1: - version "8.3.1" - resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.1.tgz#2f10f5b69329d90ae18c58bf1fa8fccd8b959a43" - integrity sha512-TgUZgYvqZprrl7YldZNoa9OciCAyZR+Ejm9eXzKCmjsF5IKp/wgQ7Z/ZpjpGTIUPwrHQIcYeI8qDh4PsEwxMbw== + version "8.3.2" + resolved "https://registry.npmjs.org/acorn-walk/-/acorn-walk-8.3.2.tgz#7703af9415f1b6db9315d6895503862e231d34aa" + integrity sha512-cjkyv4OtNCIeqhHrfS81QWXoCBPExR/J62oyEqepVw8WaQeSqpW2uhuLPh1m9eWhDuOo/jUXVTlifvesOWp/4A== acorn@^7.4.0, acorn@^7.4.1: version "7.4.1" @@ -4243,9 +3985,9 @@ acorn@^7.4.0, acorn@^7.4.1: integrity sha512-nQyp0o1/mNdbTO1PO6kHkwSrmgZ0MT/jCCpNiwbUjGoRN4dlBhqJtoQuCnEOKzgTVwg0ZWiCoQy6SxMebQVh8A== acorn@^8.1.0, acorn@^8.11.2, acorn@^8.4.1, acorn@^8.7.1, acorn@^8.8.1, acorn@^8.8.2: - version "8.11.2" - resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.2.tgz#ca0d78b51895be5390a5903c5b3bdcdaf78ae40b" - integrity sha512-nc0Axzp/0FILLEVsm4fNwLCwMttvhEI263QtVPQcbpfZZ3ts0hLsZGOpE6czNlid7CJ9MlyH8reXkpsf3YUY4w== + version "8.11.3" + resolved "https://registry.npmjs.org/acorn/-/acorn-8.11.3.tgz#71e0b14e13a4ec160724b38fb7b0f233b1b81d7a" + integrity sha512-Y9rRfJG5jcKOE0CLisYbojUjIrIEE7AGMzA/Sm4BslANhbS+cDMpgBdcPT91oJ7OuJ9hYJBx59RjbhxVnrF8Xg== address@^1.0.1: version "1.2.2" @@ -4654,15 +4396,6 @@ babel-plugin-jest-hoist@^29.6.3: "@types/babel__core" "^7.1.14" "@types/babel__traverse" "^7.0.6" -babel-plugin-polyfill-corejs2@^0.4.6: - version "0.4.7" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.7.tgz#679d1b94bf3360f7682e11f2cb2708828a24fe8c" - integrity sha512-LidDk/tEGDfuHW2DWh/Hgo4rmnw3cduK6ZkOI1NPFceSK3n/yAGeOsNT7FLnSGHkXj3RHGSEVkN3FsCTY6w2CQ== - dependencies: - "@babel/compat-data" "^7.22.6" - "@babel/helper-define-polyfill-provider" "^0.4.4" - semver "^6.3.1" - babel-plugin-polyfill-corejs2@^0.4.8: version "0.4.8" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs2/-/babel-plugin-polyfill-corejs2-0.4.8.tgz#dbcc3c8ca758a290d47c3c6a490d59429b0d2269" @@ -4672,14 +4405,6 @@ babel-plugin-polyfill-corejs2@^0.4.8: "@babel/helper-define-polyfill-provider" "^0.5.0" semver "^6.3.1" -babel-plugin-polyfill-corejs3@^0.8.5: - version "0.8.7" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.8.7.tgz#941855aa7fdaac06ed24c730a93450d2b2b76d04" - integrity sha512-KyDvZYxAzkC0Aj2dAPyDzi2Ym15e5JKZSK+maI7NAwSqofvuFglbSsxE7wUOvTg9oFVnHMzVzBKcqEb4PJgtOA== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.4" - core-js-compat "^3.33.1" - babel-plugin-polyfill-corejs3@^0.9.0: version "0.9.0" resolved "https://registry.npmjs.org/babel-plugin-polyfill-corejs3/-/babel-plugin-polyfill-corejs3-0.9.0.tgz#9eea32349d94556c2ad3ab9b82ebb27d4bf04a81" @@ -4688,13 +4413,6 @@ babel-plugin-polyfill-corejs3@^0.9.0: "@babel/helper-define-polyfill-provider" "^0.5.0" core-js-compat "^3.34.0" -babel-plugin-polyfill-regenerator@^0.5.3: - version "0.5.4" - resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.4.tgz#c6fc8eab610d3a11eb475391e52584bacfc020f4" - integrity sha512-S/x2iOCvDaCASLYsOOgWOq4bCfKYVqvO/uxjkaYyZ3rVsVE3CeAI/c84NpyuBBymEgNvHgjEot3a9/Z/kXvqsg== - dependencies: - "@babel/helper-define-polyfill-provider" "^0.4.4" - babel-plugin-polyfill-regenerator@^0.5.5: version "0.5.5" resolved "https://registry.npmjs.org/babel-plugin-polyfill-regenerator/-/babel-plugin-polyfill-regenerator-0.5.5.tgz#8b0c8fc6434239e5d7b8a9d1f832bb2b0310f06a" @@ -4859,7 +4577,7 @@ browserify-zlib@^0.1.4: dependencies: pako "~0.2.0" -browserslist@^4.14.5, browserslist@^4.21.10, browserslist@^4.22.2: +browserslist@^4.21.10, browserslist@^4.22.2: version "4.22.2" resolved "https://registry.npmjs.org/browserslist/-/browserslist-4.22.2.tgz#704c4943072bd81ea18997f3bd2180e89c77874b" integrity sha512-0UgcrvQmBDvZHFGdYUehrCNIazki7/lUP3kkoi/r3YB2amZbFM9J43ZRkJTXBUZK4gmx56+Sqk9+Vs9mwZx9+A== @@ -4961,9 +4679,9 @@ camelize@^1.0.0: integrity sha512-dU+Tx2fsypxTgtLoE36npi3UqcjSSMNYfkqgmoEhtZrraP5VWq0K7FkWVTYa8eMPtnU/G2txVsfdCJTn9uzpuQ== caniuse-lite@^1.0.30001565: - version "1.0.30001572" - resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001572.tgz#1ccf7dc92d2ee2f92ed3a54e11b7b4a3041acfa0" - integrity sha512-1Pbh5FLmn5y4+QhNyJE9j3/7dK44dGB83/ZMjv/qJk86TvDbjk0LosiZo0i0WB0Vx607qMX9jYrn1VLHCkN4rw== + version "1.0.30001580" + resolved "https://registry.npmjs.org/caniuse-lite/-/caniuse-lite-1.0.30001580.tgz#e3c76bc6fe020d9007647044278954ff8cd17d1e" + integrity sha512-mtj5ur2FFPZcCEpXFy8ADXbDACuNFXg6mxVDqp7tqooX6l3zwm+d8EPoeOSIFRDvHs8qu7/SLFOGniULkcH2iA== case-sensitive-paths-webpack-plugin@^2.4.0: version "2.4.0" @@ -5040,7 +4758,7 @@ ci-info@^3.2.0: resolved "https://registry.npmjs.org/ci-info/-/ci-info-3.9.0.tgz#4279a62028a7b1f262f3473fc9605f5e218c59b4" integrity sha512-NIxF55hv4nSqQswkAeiOi1r83xy8JldOFDTWiug55KBu9Jnblncd2U6ViHmYgHf01TPZS77NJBhBMKdWj9HQMQ== -citty@^0.1.4, citty@^0.1.5: +citty@^0.1.5: version "0.1.5" resolved "https://registry.npmjs.org/citty/-/citty-0.1.5.tgz#fe37ceae5dc764af75eb2fece99d2bf527ea4e50" integrity sha512-AS7n5NSc0OQVMV9v6wt3ByujNIrne0/cTjiC2MYqhvao57VNfiuVksTSr2p17nVOhEr2KtqiAkGwHcgMC/qUuQ== @@ -5301,14 +5019,7 @@ cookie@0.5.0, cookie@^0.5.0: resolved "https://registry.npmjs.org/cookie/-/cookie-0.5.0.tgz#d1f5d71adec6558c58f389987c366aa47e994f8b" integrity sha512-YZ3GUyn/o8gfKJlnlX7g7xq4gyO6OSuhGPKaaGssGB2qgDUS0gPgtTvoyZLTt9Ab6dC4hfc9dV5arkvc/OCmrw== -core-js-compat@^3.31.0, core-js-compat@^3.33.1: - version "3.34.0" - resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.34.0.tgz#61a4931a13c52f8f08d924522bba65f8c94a5f17" - integrity sha512-4ZIyeNbW/Cn1wkMMDy+mvrRUxrwFNjKwbhCfQpDd+eLgYipDqp8oGFGtLmhh18EDPKA0g3VUBYOxQGGwvWLVpA== - dependencies: - browserslist "^4.22.2" - -core-js-compat@^3.34.0: +core-js-compat@^3.31.0, core-js-compat@^3.34.0: version "3.35.1" resolved "https://registry.npmjs.org/core-js-compat/-/core-js-compat-3.35.1.tgz#215247d7edb9e830efa4218ff719beb2803555e2" integrity sha512-sftHa5qUJY3rs9Zht1WEnmkvXputCyDBczPnr7QDgL8n3qrF3CMXY4VPSYtOLLiOUJcah2WNXREd48iOl6mQIw== @@ -5316,9 +5027,9 @@ core-js-compat@^3.34.0: browserslist "^4.22.2" core-js-pure@^3.23.3: - version "3.34.0" - resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.34.0.tgz#981e462500708664c91b827a75b011f04a8134a0" - integrity sha512-pmhivkYXkymswFfbXsANmBAewXx86UBfmagP+w0wkK06kLsLlTK5oQmsURPivzMkIBQiYq2cjamcZExIwlFQIg== + version "3.35.1" + resolved "https://registry.npmjs.org/core-js-pure/-/core-js-pure-3.35.1.tgz#f33ad7fdf9dddae260339a30e5f8363f5c49a3bc" + integrity sha512-zcIdi/CL3MWbBJYo5YCeVAAx+Sy9yJE9I3/u9LkFABwbeaPhTMRWraM8mYFp9jW5Z50hOy7FVzCc8dCrpZqtIQ== core-util-is@~1.0.0: version "1.0.3" @@ -5395,21 +5106,7 @@ css-functions-list@^3.1.0: resolved "https://registry.npmjs.org/css-functions-list/-/css-functions-list-3.2.1.tgz#2eb205d8ce9f9ce74c5c1d7490b66b77c45ce3ea" integrity sha512-Nj5YcaGgBtuUmn1D7oHqPW0c9iui7xsTsj5lIX8ZgevdfhmjFfKB3r8moHJtNJnctnYXJyYX5I1pp90HM4TPgQ== -css-loader@^6.7.1: - version "6.8.1" - resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.8.1.tgz#0f8f52699f60f5e679eab4ec0fcd68b8e8a50a88" - integrity sha512-xDAXtEVGlD0gJ07iclwWVkLoZOpEvAWaSyf6W18S2pOC//K8+qUDIx8IIT3D+HjnmkJPQeesOPv5aiUaJsCM2g== - dependencies: - icss-utils "^5.1.0" - postcss "^8.4.21" - postcss-modules-extract-imports "^3.0.0" - postcss-modules-local-by-default "^4.0.3" - postcss-modules-scope "^3.0.0" - postcss-modules-values "^4.0.0" - postcss-value-parser "^4.2.0" - semver "^7.3.8" - -css-loader@^6.9.1: +css-loader@^6.7.1, css-loader@^6.9.1: version "6.9.1" resolved "https://registry.npmjs.org/css-loader/-/css-loader-6.9.1.tgz#9ec9a434368f2bdfeffbf8f6901a1ce773586c6b" integrity sha512-OzABOh0+26JKFdMzlK6PY1u5Zx8+Ck7CVRlcGNZoY9qwJjdfu2VWFuprTIpPW+Av5TZTVViYWcFQaEEQURLknQ== @@ -5621,9 +5318,9 @@ define-properties@^1.1.3, define-properties@^1.2.0, define-properties@^1.2.1: object-keys "^1.1.1" defu@^6.1.3: - version "6.1.3" - resolved "https://registry.npmjs.org/defu/-/defu-6.1.3.tgz#6d7f56bc61668e844f9f593ace66fd67ef1205fd" - integrity sha512-Vy2wmG3NTkmHNg/kzpuvHhkqeIx3ODWqasgCRbKtbXEN0G+HpEEv9BtJLp7ZG1CZloFaC41Ah3ZFbq7aqCqMeQ== + version "6.1.4" + resolved "https://registry.npmjs.org/defu/-/defu-6.1.4.tgz#4e0c9cf9ff68fe5f3d7f2765cc1a012dfdcb0479" + integrity sha512-mEQCMmwJu317oSz8CwdIOdwf3xMif1ttiM8LTufzc3g6kR+9Pe236twL8j3IYT1F7GfRgGcW6MWxzZjLIkuHIg== del@^6.0.0: version "6.1.1" @@ -5788,9 +5485,9 @@ dotenv-expand@^10.0.0: integrity sha512-GopVGCpVS1UKH75VKHGuQFqS1Gusej0z4FyQkPdwjil2gNIv+LNsqBlboOzpJFZKVT95GkCyWJbBSdFEFUWI2A== dotenv@^16.0.0: - version "16.3.1" - resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.3.1.tgz#369034de7d7e5b120972693352a3bf112172cc3e" - integrity sha512-IPzF4w4/Rd94bA9imS68tZBaYyBWSCE47V1RGuMrB94iyTOIEwRmVL2x/4An+6mETpLrKJ5hQkB8W4kFAadeIQ== + version "16.4.1" + resolved "https://registry.npmjs.org/dotenv/-/dotenv-16.4.1.tgz#1d9931f1d3e5d2959350d1250efab299561f7f11" + integrity sha512-CjA3y+Dr3FyFDOAMnxZEGtnW9KBR2M0JvvUtXNW+dYJL5ROWxP9DUHCwgFqpMk0OXCc0ljhaNTr2w/kutYIcHQ== duplexify@^3.5.0, duplexify@^3.6.0: version "3.7.1" @@ -5815,9 +5512,9 @@ ejs@^3.1.8: jake "^10.8.5" electron-to-chromium@^1.4.601: - version "1.4.616" - resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.616.tgz#4bddbc2c76e1e9dbf449ecd5da3d8119826ea4fb" - integrity sha512-1n7zWYh8eS0L9Uy+GskE0lkBUNK83cXTVJI0pU3mGprFsbfSdAc15VTFbo+A+Bq4pwstmL30AVcEU3Fo463lNg== + version "1.4.647" + resolved "https://registry.npmjs.org/electron-to-chromium/-/electron-to-chromium-1.4.647.tgz#3c8d4815e5ed2fbdd37f4ab7333cd9f8fc56d53a" + integrity sha512-Z/fTNGwc45WrYQhPaEcz5tAJuZZ8G7S/DBnhS6Kgp4BxnS40Z/HqlJ0hHg3Z79IGVzuVartIlTcjw/cQbPLgOw== emittery@^0.13.1: version "0.13.1" @@ -6692,14 +6389,14 @@ flatted@^3.2.9: integrity sha512-36yxDn5H7OFZQla0/jFJmbIKTdZAQHngCedGxiMmpNfEZM0sdEeT+WczLQrjK6D7o2aiyLYDnkw0R3JK0Qv1RQ== flow-parser@0.*: - version "0.225.1" - resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.225.1.tgz#78f16d90c724bfa2149acf5e129bc5a85fc82988" - integrity sha512-50fjR6zbLQcpq5IFNkheUSY/AFPxVeeLiBM5B3NQBSKId2G0cUuExOlDDOguxc49dl9lnh8hI1xcYlPJWNp4KQ== + version "0.227.0" + resolved "https://registry.npmjs.org/flow-parser/-/flow-parser-0.227.0.tgz#e50b65be9dc6810438c975e816a68005fbcd5107" + integrity sha512-nOygtGKcX/siZK/lFzpfdHEfOkfGcTW7rNroR1Zsz6T/JxSahPALXVt5qVHq/fgvMJuv096BTKbgxN3PzVBaDA== follow-redirects@^1.15.4: - version "1.15.4" - resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.4.tgz#cdc7d308bf6493126b17ea2191ea0ccf3e535adf" - integrity sha512-Cr4D/5wlrb0z9dgERpUL3LrmPKVDsETIJhaCMeDfuFYcqa5bldGV6wBsAN6X/vxlXQtFBMrXdXxdL8CbDTGniw== + version "1.15.5" + resolved "https://registry.npmjs.org/follow-redirects/-/follow-redirects-1.15.5.tgz#54d4d6d062c0fa7d9d17feb008461550e3ba8020" + integrity sha512-vSFWUON1B+yAw1VN4xMfxgn5fTUiaOzAJCKBwIIgT/+7CuGy9+r+5gITvP62j3RmaD5Ph65UaERdOSRGUzZtgw== for-each@^0.3.3: version "0.3.3" @@ -7087,7 +6784,7 @@ has-flag@^4.0.0: resolved "https://registry.npmjs.org/has-flag/-/has-flag-4.0.0.tgz#944771fd9c81c81265c4d6941860da06bb59479b" integrity sha512-EykJT/Q1KjTWctppgIAgfSO0tKVuZUjhgMr17kqTumMl6Afv3EISleU7qZUzoXDFTAHTDC4NOoG/ZxU3EvlMPQ== -has-property-descriptors@^1.0.0: +has-property-descriptors@^1.0.0, has-property-descriptors@^1.0.1: version "1.0.1" resolved "https://registry.npmjs.org/has-property-descriptors/-/has-property-descriptors-1.0.1.tgz#52ba30b6c5ec87fd89fa574bc1c39125c6f65340" integrity sha512-VsX8eaIewvas0xnvinAe9bw4WfIeODpGYikiWYLH+dma0Jw6KHYqWiWfhQlgOVK8D6PvjubK5Uc4P0iIhIcNVg== @@ -8517,9 +8214,9 @@ lru-cache@^6.0.0: yallist "^4.0.0" "lru-cache@^9.1.1 || ^10.0.0": - version "10.1.0" - resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.1.0.tgz#2098d41c2dc56500e6c88584aa656c84de7d0484" - integrity sha512-/1clY/ui8CzjKFyjdvwPWJUYKiFVXG2I2cY0ssG7h4+hwk+XOIX7ZSG9Q7TW8TW3Kp3BUSqgFWBLgL4PJ+Blag== + version "10.2.0" + resolved "https://registry.npmjs.org/lru-cache/-/lru-cache-10.2.0.tgz#0bd445ca57363465900f4d1f9bd8db343a4d95c3" + integrity sha512-2bIM8x+VAf6JT4bKAljS1qUWgMsqZRPGJS6FSahIMPVvctcNhyVp7AJu7quxOW9jwkryBReKZY5tY5JYv2n/7Q== lz-string@^1.5.0: version "1.5.0" @@ -8583,9 +8280,9 @@ map-or-similar@^1.5.0: integrity sha512-0aF7ZmVon1igznGI4VS30yugpduQW3y3GkcgGJOp7d8x8QrizhigUxjI/m2UojsXXto+jLAH3KSz+xOJTiORjg== markdown-to-jsx@^7.1.8: - version "7.3.2" - resolved "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.3.2.tgz#f286b4d112dad3028acc1e77dfe1f653b347e131" - integrity sha512-B+28F5ucp83aQm+OxNrPkS8z0tMKaeHiy0lHJs3LqCyDQFtWuenaIrkaVTgAm1pf1AU85LXltva86hlaT17i8Q== + version "7.4.0" + resolved "https://registry.npmjs.org/markdown-to-jsx/-/markdown-to-jsx-7.4.0.tgz#4606c5c549a6f6cb87604c35f5ee4f42959ffb6b" + integrity sha512-zilc+MIkVVXPyTb4iIUTIz9yyqfcWjszGXnwF9K/aiBWcHXFcmdEMTkG01/oQhwSCH7SY1BnG6+ev5BzWmbPrg== mathml-tag-names@^2.1.3: version "2.1.3" @@ -8989,14 +8686,14 @@ nwsapi@^2.2.2: integrity sha512-ub5E4+FBPKwAZx0UwIQOjYWGHTEq5sPqHQNRN8Z9e4A7u3Tj1weLJsL59yH9vmvqEtBHaOmT6cYQKIZOxp35FQ== nypm@^0.3.3: - version "0.3.3" - resolved "https://registry.npmjs.org/nypm/-/nypm-0.3.3.tgz#e775fd8f62c3ed7d60958ede80911410cb792724" - integrity sha512-FHoxtTscAE723e80d2M9cJRb4YVjL82Ra+ZV+YqC6rfNZUWahi+ZhPF+krnR+bdMvibsfHCtgKXnZf5R6kmEPA== + version "0.3.6" + resolved "https://registry.npmjs.org/nypm/-/nypm-0.3.6.tgz#940b558e6e56c2ed5dc43adf6dcf2c16577a80ff" + integrity sha512-2CATJh3pd6CyNfU5VZM7qSwFu0ieyabkEdnogE30Obn1czrmOYiZ8DOZLe1yBdLKWoyD3Mcy2maUs+0MR3yVjQ== dependencies: - citty "^0.1.4" + citty "^0.1.5" execa "^8.0.1" - pathe "^1.1.1" - ufo "^1.3.0" + pathe "^1.1.2" + ufo "^1.3.2" object-assign@^4.1.0, object-assign@^4.1.1: version "4.1.1" @@ -9344,10 +9041,10 @@ path-type@^4.0.0: resolved "https://registry.npmjs.org/path-type/-/path-type-4.0.0.tgz#84ed01c0a7ba380afe09d90a8c180dcd9d03043b" integrity sha512-gDKb8aZMDeD/tZWs9P6+q0J9Mwkdl6xMV8TjnGP3qJVJ06bdMgkbBlLU8IdfOsIsFz2BW1rNVT3XuNEl8zPAvw== -pathe@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.1.tgz#1dd31d382b974ba69809adc9a7a347e65d84829a" - integrity sha512-d+RQGp0MAYTIaDBIMmOfMwz3E+LOZnxx1HZd5R18mmCZY0QBlK0LDZfPc8FW8Ed2DlvsuE6PRjroDY+wg4+j/Q== +pathe@^1.1.1, pathe@^1.1.2: + version "1.1.2" + resolved "https://registry.npmjs.org/pathe/-/pathe-1.1.2.tgz#6c4cb47a945692e48a1ddd6e4094d170516437ec" + integrity sha512-whLdWMYL2TwI08hn8/ZqAbrVemu0LNaNNJZX73O6qaIdCTfXutsLhMkjdENX0qhsQ9uIimo4/aQOmXkoon2nDQ== peek-stream@^1.1.0: version "1.1.3" @@ -9378,7 +9075,7 @@ pify@^4.0.1: resolved "https://registry.npmjs.org/pify/-/pify-4.0.1.tgz#4b2cd25c50d598735c50292224fd8c6df41e3231" integrity sha512-uB80kBFb/tfd68bVleG9T5GGsGPjJrLAUpR5PZIrhBnIaRTQRjqdJSsIKkOP6OAIFbj7GOrcudc5pNjZ+geV2g== -pirates@^4.0.4, pirates@^4.0.5: +pirates@^4.0.4, pirates@^4.0.6: version "4.0.6" resolved "https://registry.npmjs.org/pirates/-/pirates-4.0.6.tgz#3018ae32ecfcff6c29ba2267cbf21166ac1f36b9" integrity sha512-saLsH7WeYYPiD25LDuLRRY/i+6HaPYr6G1OUlN39otzkSTxKnubR9RTxS3/Kk50s1g2JTgFwWQDQyplC5/SHZg== @@ -9437,15 +9134,6 @@ postcss-modules-extract-imports@^3.0.0: resolved "https://registry.npmjs.org/postcss-modules-extract-imports/-/postcss-modules-extract-imports-3.0.0.tgz#cda1f047c0ae80c97dbe28c3e76a43b88025741d" integrity sha512-bdHleFnP3kZ4NYDhuGlVK+CMrQ/pqUm8bx/oGL93K6gVwiclvX5x0n76fYMKuIGKzlABOy13zsvqjb0f92TEXw== -postcss-modules-local-by-default@^4.0.3: - version "4.0.3" - resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.3.tgz#b08eb4f083050708998ba2c6061b50c2870ca524" - integrity sha512-2/u2zraspoACtrbFRnTijMiQtb4GW4BvatjaG/bCjYQo8kLTdevCUlwuBHx2sCnSyrI3x3qj4ZK1j5LQBgzmwA== - dependencies: - icss-utils "^5.0.0" - postcss-selector-parser "^6.0.2" - postcss-value-parser "^4.1.0" - postcss-modules-local-by-default@^4.0.4: version "4.0.4" resolved "https://registry.npmjs.org/postcss-modules-local-by-default/-/postcss-modules-local-by-default-4.0.4.tgz#7cbed92abd312b94aaea85b68226d3dec39a14e6" @@ -9455,13 +9143,6 @@ postcss-modules-local-by-default@^4.0.4: postcss-selector-parser "^6.0.2" postcss-value-parser "^4.1.0" -postcss-modules-scope@^3.0.0: - version "3.1.0" - resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.0.tgz#fbfddfda93a31f310f1d152c2bb4d3f3c5592ee0" - integrity sha512-SaIbK8XW+MZbd0xHPf7kdfA/3eOt7vxJ72IRecn3EzuZVLr1r0orzf0MX/pN8m+NMDoo6X/SQd8oeKqGZd8PXg== - dependencies: - postcss-selector-parser "^6.0.4" - postcss-modules-scope@^3.1.1: version "3.1.1" resolved "https://registry.npmjs.org/postcss-modules-scope/-/postcss-modules-scope-3.1.1.tgz#32cfab55e84887c079a19bbb215e721d683ef134" @@ -9487,9 +9168,9 @@ postcss-safe-parser@^6.0.0: integrity sha512-FARHN8pwH+WiS2OPCxJI8FuRJpTVnn6ZNFiqAM2aeW2LwTHWWmWgIyKC6cUo0L8aeKiF/14MNvnpls6R2PBeMQ== postcss-selector-parser@^6.0.11, postcss-selector-parser@^6.0.2, postcss-selector-parser@^6.0.4: - version "6.0.14" - resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.14.tgz#9d45f1afbebedae6811a17f49d09754f2ad153b3" - integrity sha512-65xXYsT40i9GyWzlHQ5ShZoK7JZdySeOozi/tz2EezDo6c04q6+ckYMeoY7idaie1qp2dT5KoYQ2yky6JuoHnA== + version "6.0.15" + resolved "https://registry.npmjs.org/postcss-selector-parser/-/postcss-selector-parser-6.0.15.tgz#11cc2b21eebc0b99ea374ffb9887174855a01535" + integrity sha512-rEYkQOMUCEMhsKbK66tbEU9QVIxbhN18YiniAwA7XQYTVBqrBy+P2p5JcdqsHgKM2zWylp8d7J6eszocfds5Sw== dependencies: cssesc "^3.0.0" util-deprecate "^1.0.2" @@ -9499,7 +9180,7 @@ postcss-value-parser@^4.0.2, postcss-value-parser@^4.1.0, postcss-value-parser@^ resolved "https://registry.npmjs.org/postcss-value-parser/-/postcss-value-parser-4.2.0.tgz#723c09920836ba6d3e5af019f92bc0971c02e514" integrity sha512-1NNCs6uurfkVbeXG4S8JFT9t19m45ICnif8zWLd5oPSZ50QnwMfK+H3jv408d4jw/7Bttv5axS5IiHoLaVNHeQ== -postcss@^8.4.19, postcss@^8.4.21, postcss@^8.4.33: +postcss@^8.4.19, postcss@^8.4.33: version "8.4.33" resolved "https://registry.npmjs.org/postcss/-/postcss-8.4.33.tgz#1378e859c9f69bf6f638b990a0212f43e2aaa742" integrity sha512-Kkpbhhdjw2qQs2O2DGX+8m5OVqEcbB9HRBvuYM9pgrjEFUg30A9LmXNlTAUj4S9kgtGyrMbTzVjH7E+s5Re2yg== @@ -9755,9 +9436,9 @@ react-docgen-typescript@^2.2.2: integrity sha512-tvg2ZtOpOi6QDwsb3GZhOjDkkX0h8Z2gipvTg6OVMUyoYoURhEiRNePT8NZItTVCDh39JJHnLdfCOkzoLbFnTg== react-docgen@^7.0.0: - version "7.0.1" - resolved "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.1.tgz#b6528fe45385908645ffbee1ec0d65709e1e047c" - integrity sha512-rCz0HBIT0LWbIM+///LfRrJoTKftIzzwsYDf0ns5KwaEjejMHQRtphcns+IXFHDNY9pnz6G8l/JbbI6pD4EAIA== + version "7.0.3" + resolved "https://registry.npmjs.org/react-docgen/-/react-docgen-7.0.3.tgz#f811b785f07b1f2023cb899b6bcf9d522b21b95d" + integrity sha512-i8aF1nyKInZnANZ4uZrH49qn1paRgBZ7wZiCNBMnenlPzEv0mRl+ShpTVEI6wZNl8sSc79xZkivtgLKQArcanQ== dependencies: "@babel/core" "^7.18.9" "@babel/traverse" "^7.18.9" @@ -10201,12 +9882,12 @@ rxjs@^7.5.5: tslib "^2.1.0" safe-array-concat@^1.0.1: - version "1.0.1" - resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.0.1.tgz#91686a63ce3adbea14d61b14c99572a8ff84754c" - integrity sha512-6XbUAseYE2KtOuGueyeobCySj9L4+66Tn6KQMOPQJrAJEowYKW/YR/MGJZl7FdydUdaFu4LYyDZjxf4/Nmo23Q== + version "1.1.0" + resolved "https://registry.npmjs.org/safe-array-concat/-/safe-array-concat-1.1.0.tgz#8d0cae9cb806d6d1c06e08ab13d847293ebe0692" + integrity sha512-ZdQ0Jeb9Ofti4hbt5lX3T2JcAamT9hfzYU1MNB+z/jaEbB6wfFfPIR/zEORmZqobkCCJhSjodobH6WHNmJ97dg== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.2.1" + call-bind "^1.0.5" + get-intrinsic "^1.2.2" has-symbols "^1.0.3" isarray "^2.0.5" @@ -10226,12 +9907,12 @@ safe-json-parse@~1.0.1: integrity sha512-o0JmTu17WGUaUOHa1l0FPGXKBfijbxK6qoHzlkihsDXxzBHvJcA7zgviKR92Xs841rX9pK16unfphLq0/KqX7A== safe-regex-test@^1.0.0: - version "1.0.0" - resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.0.tgz#793b874d524eb3640d1873aad03596db2d4f2295" - integrity sha512-JBUUzyOgEwXQY1NuPtvcj/qcBDbDmEvWufhlnXZIm75DEHp+afM1r1ujJpJsV/gSM4t59tpDyPi1sd6ZaPFfsA== + version "1.0.2" + resolved "https://registry.npmjs.org/safe-regex-test/-/safe-regex-test-1.0.2.tgz#3ba32bdb3ea35f940ee87e5087c60ee786c3f6c5" + integrity sha512-83S9w6eFq12BBIJYvjMux6/dkirb8+4zJRA9cxNBVb7Wq5fJBW+Xze48WqR8pxua7bDuAaaAxtVVd4Idjp1dBQ== dependencies: - call-bind "^1.0.2" - get-intrinsic "^1.1.3" + call-bind "^1.0.5" + get-intrinsic "^1.2.2" is-regex "^1.1.4" "safer-buffer@>= 2.1.2 < 3", "safer-buffer@>= 2.1.2 < 3.0.0": @@ -10314,9 +9995,9 @@ send@0.18.0: statuses "2.0.1" serialize-javascript@^6.0.1: - version "6.0.1" - resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.1.tgz#b206efb27c3da0b0ab6b52f48d170b7996458e5c" - integrity sha512-owoXEFjWRllis8/M1Q+Cw5k8ZH40e3zhp/ovX+Xr/vi1qj6QesbyXXViFbpNvWvPNAD62SutwEXavefrLJWj7w== + version "6.0.2" + resolved "https://registry.npmjs.org/serialize-javascript/-/serialize-javascript-6.0.2.tgz#defa1e055c83bf6d59ea805d8da862254eb6a6c2" + integrity sha512-Saa1xPByTTq2gdeFZYLLo+RFE35NHZkAbqZeWNd3BpzppeVisAqpDjcp8dyf6uIvEqJRd46jemmyA4iFIeVk8g== dependencies: randombytes "^2.1.0" @@ -10331,14 +10012,15 @@ serve-static@1.15.0: send "0.18.0" set-function-length@^1.1.1: - version "1.1.1" - resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.1.1.tgz#4bc39fafb0307224a33e106a7d35ca1218d659ed" - integrity sha512-VoaqjbBJKiWtg4yRcKBQ7g7wnGnLV3M8oLvVWwOk2PdYY6PEFegR1vezXR0tw6fZGF9csVakIRjrJiy2veSBFQ== + version "1.2.0" + resolved "https://registry.npmjs.org/set-function-length/-/set-function-length-1.2.0.tgz#2f81dc6c16c7059bda5ab7c82c11f03a515ed8e1" + integrity sha512-4DBHDoyHlM1IRPGYcoxexgh67y4ueR53FKV1yyxwFMY7aCqcN/38M1+SwZ/qJQ8iLv7+ck385ot4CcisOAPT9w== dependencies: define-data-property "^1.1.1" - get-intrinsic "^1.2.1" + function-bind "^1.1.2" + get-intrinsic "^1.2.2" gopd "^1.0.1" - has-property-descriptors "^1.0.0" + has-property-descriptors "^1.0.1" set-function-name@^2.0.0, set-function-name@^2.0.1: version "2.0.1" @@ -10461,9 +10143,9 @@ spdx-correct@^3.0.0: spdx-license-ids "^3.0.0" spdx-exceptions@^2.1.0: - version "2.3.0" - resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.3.0.tgz#3f28ce1a77a00372683eade4a433183527a2163d" - integrity sha512-/tTrYOC7PPI1nUAgx34hUpqXuyJG+DTHJTnIULG4rDygi4xu/tfgmq1e1cIRwRzwZgo4NLySi+ricLkZkw4i5A== + version "2.4.0" + resolved "https://registry.npmjs.org/spdx-exceptions/-/spdx-exceptions-2.4.0.tgz#c07a4ede25b16e4f78e6707bbd84b15a45c19c1b" + integrity sha512-hcjppoJ68fhxA/cjbN4T8N6uCUejN8yFw69ttpqtBeCbF3u13n7mb31NB9jKwGTTWWnt9IbRA/mf1FprYS8wfw== spdx-expression-parse@^3.0.0: version "3.0.1" @@ -10520,9 +10202,9 @@ storybook@^7.6.10: "@storybook/cli" "7.6.10" stream-shift@^1.0.0: - version "1.0.1" - resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.1.tgz#d7088281559ab2778424279b0877da3c392d5a3d" - integrity sha512-AiisoFqQ0vbGcZgQPY1cdP2I76glaVA/RauYR4G4thNFgkTqr90yXTo4LYX60Jl+sIlPNHHdGSwo01AvbKUSVQ== + version "1.0.3" + resolved "https://registry.npmjs.org/stream-shift/-/stream-shift-1.0.3.tgz#85b8fab4d71010fc3ba8772e8046cc49b8a3864b" + integrity sha512-76ORR0DO1o1hlKwTbi/DM3EXWGf3ZJYO8cXX5RJwnul2DEg2oyoZyjLNoQM8WsvZiFKCRfC1O0J7iCvie3RZmQ== strict-event-emitter@^0.5.1: version "0.5.1" @@ -10668,12 +10350,7 @@ strip-json-comments@^3.0.1, strip-json-comments@^3.1.0, strip-json-comments@^3.1 resolved "https://registry.npmjs.org/strip-json-comments/-/strip-json-comments-3.1.1.tgz#31f1281b3832630434831c310c01cccda8cbe006" integrity sha512-6fPc+R4ihwqP6N/aIv2f1gMH8lOVtWQHoqC4yK6oSDVVocumAsfCqjkXnqiYMhmMwS/mEHLp7Vehlt3ql6lEig== -style-loader@^3.3.1: - version "3.3.3" - resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.3.tgz#bba8daac19930169c0c9c96706749a597ae3acff" - integrity sha512-53BiGLXAcll9maCYtZi2RCQZKa8NQQai5C4horqKyRmHj9H7QmcUyucrH+4KW/gBQbXM2AsB0axoEcFZPlfPcw== - -style-loader@^3.3.4: +style-loader@^3.3.1, style-loader@^3.3.4: version "3.3.4" resolved "https://registry.npmjs.org/style-loader/-/style-loader-3.3.4.tgz#f30f786c36db03a45cbd55b6a70d930c479090e7" integrity sha512-0WqXzrsMTyb8yjZJHDqwmnwRJvhALK9LfRtRc6B4UTWe8AijYLZYZ9thuJTZc2VfQWINADW/j+LiJnfy2RoC1w== @@ -10876,18 +10553,7 @@ tempy@^1.0.1: type-fest "^0.16.0" unique-string "^2.0.0" -terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.7: - version "5.3.9" - resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.9.tgz#832536999c51b46d468067f9e37662a3b96adfe1" - integrity sha512-ZuXsqE07EcggTWQjXUj+Aot/OMcD0bMKGgF63f7UxYcu5/AJF53aIpK1YoP5xR9l6s/Hy2b+t1AM0bLNPRuhwA== - dependencies: - "@jridgewell/trace-mapping" "^0.3.17" - jest-worker "^27.4.5" - schema-utils "^3.1.1" - serialize-javascript "^6.0.1" - terser "^5.16.8" - -terser-webpack-plugin@^5.3.10: +terser-webpack-plugin@^5.3.1, terser-webpack-plugin@^5.3.10: version "5.3.10" resolved "https://registry.npmjs.org/terser-webpack-plugin/-/terser-webpack-plugin-5.3.10.tgz#904f4c9193c6fd2a03f693a2150c62a92f40d199" integrity sha512-BKFPWlPDndPs+NGGCr1U59t0XScL5317Y0UReNrHaw9/FwhPENlq6bfgs+4yPfyP51vqC1bQ4rp1EfXW5ZSH9w== @@ -10898,17 +10564,7 @@ terser-webpack-plugin@^5.3.10: serialize-javascript "^6.0.1" terser "^5.26.0" -terser@^5.10.0, terser@^5.16.8: - version "5.26.0" - resolved "https://registry.npmjs.org/terser/-/terser-5.26.0.tgz#ee9f05d929f4189a9c28a0feb889d96d50126fe1" - integrity sha512-dytTGoE2oHgbNV9nTzgBEPaqAWvcJNl66VZ0BkJqlvp71IjO8CxdBx/ykCNb47cLnCmCvRZ6ZR0tLkqvZCdVBQ== - dependencies: - "@jridgewell/source-map" "^0.3.3" - acorn "^8.8.2" - commander "^2.20.0" - source-map-support "~0.5.20" - -terser@^5.26.0: +terser@^5.10.0, terser@^5.26.0: version "5.27.0" resolved "https://registry.npmjs.org/terser/-/terser-5.27.0.tgz#70108689d9ab25fef61c4e93e808e9fd092bf20c" integrity sha512-bi1HRwVRskAjheeYl291n3JC4GgO/Ty4z1nVs5AAsmonJulGxpSektecnNedrwK9C7vpvVtcX3cw00VSLt7U2A== @@ -11193,7 +10849,7 @@ typescript@^5.3.3: resolved "https://registry.npmjs.org/typescript/-/typescript-5.3.3.tgz#b3ce6ba258e72e6305ba66f5c9b452aaee3ffe37" integrity sha512-pXWcraxM0uxAS+tN0AG/BF2TyqmHO014Z070UsJ+pFvYuRSq8KH8DmWpnbXe0pEPDHXZV3FcAbJkijJ5oNEnWw== -ufo@^1.3.0: +ufo@^1.3.2: version "1.3.2" resolved "https://registry.npmjs.org/ufo/-/ufo-1.3.2.tgz#c7d719d0628a1c80c006d2240e0d169f6e3c0496" integrity sha512-o+ORpgGwaYQXgqGDwd+hkS4PuZ3QnmqMMxRuajK/a38L6fTpcE5GPIfrf+L/KemFzfUpeUQc1rRS1iDBozvnFA== @@ -11557,37 +11213,7 @@ webpack-virtual-modules@^0.6.1: resolved "https://registry.npmjs.org/webpack-virtual-modules/-/webpack-virtual-modules-0.6.1.tgz#ac6fdb9c5adb8caecd82ec241c9631b7a3681b6f" integrity sha512-poXpCylU7ExuvZK8z+On3kX+S8o/2dQ/SVYueKA0D4WEMXROXgY8Ez50/bQEUmvoSMMrWcrJqCHuhAbsiwg7Dg== -webpack@5: - version "5.89.0" - resolved "https://registry.npmjs.org/webpack/-/webpack-5.89.0.tgz#56b8bf9a34356e93a6625770006490bf3a7f32dc" - integrity sha512-qyfIC10pOr70V+jkmud8tMfajraGCZMBWJtrmuBymQKCrLTRejBI8STDp1MCyZu/QTdZSeacCQYpYNQVOzX5kw== - dependencies: - "@types/eslint-scope" "^3.7.3" - "@types/estree" "^1.0.0" - "@webassemblyjs/ast" "^1.11.5" - "@webassemblyjs/wasm-edit" "^1.11.5" - "@webassemblyjs/wasm-parser" "^1.11.5" - acorn "^8.7.1" - acorn-import-assertions "^1.9.0" - browserslist "^4.14.5" - chrome-trace-event "^1.0.2" - enhanced-resolve "^5.15.0" - es-module-lexer "^1.2.1" - eslint-scope "5.1.1" - events "^3.2.0" - glob-to-regexp "^0.4.1" - graceful-fs "^4.2.9" - json-parse-even-better-errors "^2.3.1" - loader-runner "^4.2.0" - mime-types "^2.1.27" - neo-async "^2.6.2" - schema-utils "^3.2.0" - tapable "^2.1.1" - terser-webpack-plugin "^5.3.7" - watchpack "^2.4.0" - webpack-sources "^3.2.3" - -webpack@^5.90.0: +webpack@5, webpack@^5.90.0: version "5.90.0" resolved "https://registry.npmjs.org/webpack/-/webpack-5.90.0.tgz#313bfe16080d8b2fee6e29b6c986c0714ad4290e" integrity sha512-bdmyXRCXeeNIePv6R6tGPyy20aUobw4Zy8r0LUS2EWO+U+Ke/gYDgsCh7bl5rB6jPpr4r0SZa6dPxBxLooDT3w== @@ -11734,7 +11360,6 @@ wordwrap@^1.0.0: integrity sha512-gvVzJFlPycKc5dZN4yPkP8w7Dc37BtP1yczEneOb4uq34pXZcvrtRTmWV8W+Ume+XCxKgbjM+nevkyFPMybd4Q== "wrap-ansi-cjs@npm:wrap-ansi@^7.0.0", wrap-ansi@^7.0.0: - name wrap-ansi-cjs version "7.0.0" resolved "https://registry.npmjs.org/wrap-ansi/-/wrap-ansi-7.0.0.tgz#67e145cff510a6a6984bdf1152911d69d2eb9e43" integrity sha512-YVGIj2kamLSTxw6NsZjoBxfSwsn0ycdesmc4p+Q21c5zPuZ1pl+NfxVdxPtdHvmNVOQ6XSYG4AUtyt/Fi7D16Q== From 05171cd9504b50fcd00cc66b41070dd3fb13bd1d Mon Sep 17 00:00:00 2001 From: sgoral-splunk <138458044+sgoral-splunk@users.noreply.github.com> Date: Tue, 30 Jan 2024 17:41:18 +0100 Subject: [PATCH 16/23] chore: add log_exception to demo addon (#1031) Change custom exception handler in demo add-on to the one provided by solnlib. --- .../templates/input.name.init-template | 7 +------ .../demo_addon_for_splunk/package/bin/demo_input.py | 7 +------ 2 files changed, 2 insertions(+), 12 deletions(-) diff --git a/splunk_add_on_ucc_framework/templates/input.name.init-template b/splunk_add_on_ucc_framework/templates/input.name.init-template index 9b6311cc9..95075d266 100644 --- a/splunk_add_on_ucc_framework/templates/input.name.init-template +++ b/splunk_add_on_ucc_framework/templates/input.name.init-template @@ -1,7 +1,6 @@ import json import logging import sys -import traceback import import_declare_test from solnlib import conf_manager, log @@ -98,11 +97,7 @@ class Input(smi.Script): ) log.modular_input_end(logger, normalized_input_name) except Exception as e: - logger.error( - f"Exception raised while ingesting data for " - f"{{addon_input_name}}: {e}. Traceback: " - f"{traceback.format_exc()}" - ) + log.log_exception(logger, e, msg_before="Exception raised while ingesting data for demo_input: ") if __name__ == "__main__": diff --git a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/bin/demo_input.py b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/bin/demo_input.py index b81e105d5..2a0f9aee9 100644 --- a/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/bin/demo_input.py +++ b/tests/testdata/expected_addons/expected_addon_after_init/demo_addon_for_splunk/package/bin/demo_input.py @@ -1,7 +1,6 @@ import json import logging import sys -import traceback import import_declare_test from solnlib import conf_manager, log @@ -98,11 +97,7 @@ def stream_events(self, inputs: smi.InputDefinition, event_writer: smi.EventWrit ) log.modular_input_end(logger, normalized_input_name) except Exception as e: - logger.error( - f"Exception raised while ingesting data for " - f"demo_input: {e}. Traceback: " - f"{traceback.format_exc()}" - ) + log.log_exception(logger, e, msg_before="Exception raised while ingesting data for demo_input: ") if __name__ == "__main__": From 751990c65793f88edde305039bd61018d43a481b Mon Sep 17 00:00:00 2001 From: sgoral-splunk <138458044+sgoral-splunk@users.noreply.github.com> Date: Thu, 1 Feb 2024 12:18:56 +0100 Subject: [PATCH 17/23] feat: customizing version of pip in build, add legacy resolver as optional (#1035) * pip version is now adjusted by `--pip-version` flag in the build command. If not provided latest pip is installed. * `--use-deprecated=legacy-resolver` is now an optional parameter of pip install (disabled by default) and can be added to pip install using `--pip-legacy-resolver` flag in the build command --- docs/quickstart.md | 5 ++ splunk_add_on_ucc_framework/commands/build.py | 12 ++- .../install_python_libraries.py | 26 ++++++- splunk_add_on_ucc_framework/main.py | 15 ++++ tests/unit/test_install_python_libraries.py | 71 ++++++++++++++++- tests/unit/test_main.py | 77 +++++++++++++++++++ 6 files changed, 198 insertions(+), 8 deletions(-) diff --git a/docs/quickstart.md b/docs/quickstart.md index 6e75d0896..b1205813d 100644 --- a/docs/quickstart.md +++ b/docs/quickstart.md @@ -121,6 +121,11 @@ It takes the following parameters: * `-v` / `--verbose` - [optional] show detailed information about created/copied/modified/conflict files after build is complete. This option is in experimental mode. Default: `False`. +* `--pip-version` - [optional] pip version that will be used to install python libraries. Default: `latest`. +* `--pip-legacy-resolver` - [optional] Use old pip dependency resolver by adding flag '--use-deprecated=legacy-resolver' + to pip install command. Default: `False`. PLEASE NOTE: this flag is deprecated and will be removed from pip in the future. +Instead of using this flag, the correct solution would be to fix the packages your project depends on to work properly with the new resolver. +Additionally, please note that this flag is not compatible with pip version `23.2`, use `23.2.1` instead. #### Verbose mode diff --git a/splunk_add_on_ucc_framework/commands/build.py b/splunk_add_on_ucc_framework/commands/build.py index a6477856b..4ca985543 100644 --- a/splunk_add_on_ucc_framework/commands/build.py +++ b/splunk_add_on_ucc_framework/commands/build.py @@ -450,6 +450,8 @@ def generate( output_directory: Optional[str] = None, python_binary_name: str = "python3", verbose_file_summary_report: bool = False, + pip_version: str = "latest", + pip_legacy_resolver: bool = False, ) -> None: logger.info(f"ucc-gen version {__version__} is used") logger.info(f"Python binary name to use: {python_binary_name}") @@ -545,6 +547,8 @@ def generate( python_binary_name, includes_ui=True, os_libraries=global_config.os_libraries, + pip_version=pip_version, + pip_legacy_resolver=pip_legacy_resolver, ) except SplunktaucclibNotFound as e: logger.error(str(e)) @@ -609,7 +613,13 @@ def generate( "Skipped generating UI components as globalConfig file does not exist" ) ucc_lib_target = os.path.join(output_directory, ta_name, "lib") - install_python_libraries(source, ucc_lib_target, python_binary_name) + install_python_libraries( + source, + ucc_lib_target, + python_binary_name, + pip_version=pip_version, + pip_legacy_resolver=pip_legacy_resolver, + ) logger.info( f"Installed add-on requirements into {ucc_lib_target} from {source}" ) diff --git a/splunk_add_on_ucc_framework/install_python_libraries.py b/splunk_add_on_ucc_framework/install_python_libraries.py index cadcf2e29..f499031b7 100644 --- a/splunk_add_on_ucc_framework/install_python_libraries.py +++ b/splunk_add_on_ucc_framework/install_python_libraries.py @@ -97,6 +97,8 @@ def install_python_libraries( python_binary_name: str, includes_ui: bool = False, os_libraries: Optional[List[OSDependentLibraryConfig]] = None, + pip_version: str = "latest", + pip_legacy_resolver: bool = False, ) -> None: path_to_requirements_file = os.path.join(source_path, "lib", "requirements.txt") if os.path.isfile(path_to_requirements_file): @@ -107,6 +109,8 @@ def install_python_libraries( requirements_file_path=path_to_requirements_file, installation_path=ucc_lib_target, installer=python_binary_name, + pip_version=pip_version, + pip_legacy_resolver=pip_legacy_resolver, ) if includes_ui and not _pip_is_lib_installed( installer=python_binary_name, @@ -149,26 +153,40 @@ def install_libraries( requirements_file_path: str, installation_path: str, installer: str, + pip_version: str = "latest", + pip_legacy_resolver: bool = False, ) -> None: """ Upgrades `pip` version to the latest one and installs requirements to the specified path. """ - pip_version = "23.1.2" - pip_update_command = f"--upgrade pip=={pip_version}" + if pip_version == "latest": + pip_update_command = "--upgrade pip" + else: + pip_update_command = f"--upgrade pip=={pip_version.strip()}" + + if pip_version.strip() == "23.2" and pip_legacy_resolver: + logger.error( + "You cannot use the legacy resolver with pip 23.2. " + "Please remove '--pip-legacy-resolver' from your build command or " + "use a different version of pip e.g. 23.2.1" + ) + sys.exit(1) + + deps_resolver = "--use-deprecated=legacy-resolver " if pip_legacy_resolver else "" pip_install_command = ( f'-r "{requirements_file_path}" ' f"--no-compile " f"--prefer-binary " f"--ignore-installed " - f"--use-deprecated=legacy-resolver " + f"{deps_resolver}" f'--target "{installation_path}"' ) - _pip_install( installer=installer, command=pip_update_command, command_desc="pip upgrade" ) + _pip_install( installer=installer, command=pip_install_command, command_desc="pip install" ) diff --git a/splunk_add_on_ucc_framework/main.py b/splunk_add_on_ucc_framework/main.py index c38444ab4..7273a8fb6 100644 --- a/splunk_add_on_ucc_framework/main.py +++ b/splunk_add_on_ucc_framework/main.py @@ -113,6 +113,19 @@ def main(argv: Optional[Sequence[str]] = None) -> int: "created/copied/modified/conflict files after build is complete" ), ) + build_parser.add_argument( + "--pip-version", + type=str, + help="pip version that will be used to install libraries.", + default="latest", + ) + build_parser.add_argument( + "--pip-legacy-resolver", + action="store_true", + default=False, + help="Use old pip dependency resolver by adding flag '--use-deprecated=legacy-resolver' " + "to pip install command.", + ) package_parser = subparsers.add_parser("package", description="Package an add-on") package_parser.add_argument( @@ -189,6 +202,8 @@ def main(argv: Optional[Sequence[str]] = None) -> int: output_directory=args.output, python_binary_name=args.python_binary_name, verbose_file_summary_report=args.verbose, + pip_version=args.pip_version, + pip_legacy_resolver=args.pip_legacy_resolver, ) if args.command == "package": package.package(path_to_built_addon=args.path, output_directory=args.output) diff --git a/tests/unit/test_install_python_libraries.py b/tests/unit/test_install_python_libraries.py index 6fa84abe5..5defd5e73 100644 --- a/tests/unit/test_install_python_libraries.py +++ b/tests/unit/test_install_python_libraries.py @@ -81,10 +81,9 @@ def test_install_libraries(mock_subprocess_call): expected_install_command = ( 'python3 -m pip install -r "package/lib/requirements.txt"' " --no-compile --prefer-binary --ignore-installed " - '--use-deprecated=legacy-resolver --target "' - '/path/to/output/addon_name/lib"' + '--target "/path/to/output/addon_name/lib"' ) - expected_pip_update_command = "python3 -m pip install --upgrade pip==23.1.2" + expected_pip_update_command = "python3 -m pip install --upgrade pip" mock_subprocess_call.assert_has_calls( [ mock.call(expected_pip_update_command, shell=True, env=None), @@ -409,3 +408,69 @@ def test_install_libraries_version_mismatch( assert version_mismatch_log in caplog.messages assert error_description in caplog.messages mock_remove_packages.assert_not_called() + + +@mock.patch("subprocess.call", autospec=True) +def test_install_libraries_custom_pip(mock_subprocess_call): + mock_subprocess_call.return_value = 0 + + install_libraries( + "package/lib/requirements.txt", + "/path/to/output/addon_name/lib", + "python3", + pip_version="21.666.666", + ) + + expected_install_command = ( + 'python3 -m pip install -r "package/lib/requirements.txt"' + " --no-compile --prefer-binary --ignore-installed " + '--target "/path/to/output/addon_name/lib"' + ) + expected_pip_update_command = "python3 -m pip install --upgrade pip==21.666.666" + mock_subprocess_call.assert_has_calls( + [ + mock.call(expected_pip_update_command, shell=True, env=None), + mock.call(expected_install_command, shell=True, env=None), + ] + ) + + +@mock.patch("subprocess.call", autospec=True) +def test_install_libraries_legacy_resolver(mock_subprocess_call): + mock_subprocess_call.return_value = 0 + + install_libraries( + "package/lib/requirements.txt", + "/path/to/output/addon_name/lib", + "python3", + pip_legacy_resolver=True, + ) + + expected_install_command = ( + 'python3 -m pip install -r "package/lib/requirements.txt"' + " --no-compile --prefer-binary --ignore-installed " + '--use-deprecated=legacy-resolver --target "/path/to/output/addon_name/lib"' + ) + expected_pip_update_command = "python3 -m pip install --upgrade pip" + mock_subprocess_call.assert_has_calls( + [ + mock.call(expected_pip_update_command, shell=True, env=None), + mock.call(expected_install_command, shell=True, env=None), + ] + ) + + +def test_install_libraries_legacy_resolver_with_wrong_pip(caplog): + with pytest.raises(SystemExit): + install_libraries( + "package/lib/requirements.txt", + "/path/to/output/addon_name/lib", + "python3", + pip_version=" 23.2 ", + pip_legacy_resolver=True, + ) + expected_msg = ( + "You cannot use the legacy resolver with pip 23.2. " + "Please remove '--pip-legacy-resolver' from your build command or use a different version of pip e.g. 23.2.1" + ) + assert expected_msg in caplog.text diff --git a/tests/unit/test_main.py b/tests/unit/test_main.py index a238bb749..a424feeec 100644 --- a/tests/unit/test_main.py +++ b/tests/unit/test_main.py @@ -17,6 +17,8 @@ "output_directory": None, "python_binary_name": "python3", "verbose_file_summary_report": False, + "pip_version": "latest", + "pip_legacy_resolver": False, }, ), ( @@ -28,6 +30,8 @@ "output_directory": None, "python_binary_name": "python3", "verbose_file_summary_report": False, + "pip_version": "latest", + "pip_legacy_resolver": False, }, ), ( @@ -39,6 +43,8 @@ "output_directory": None, "python_binary_name": "python3", "verbose_file_summary_report": False, + "pip_version": "latest", + "pip_legacy_resolver": False, }, ), ( @@ -50,6 +56,8 @@ "output_directory": None, "python_binary_name": "python3", "verbose_file_summary_report": False, + "pip_version": "latest", + "pip_legacy_resolver": False, }, ), ( @@ -61,6 +69,8 @@ "output_directory": None, "python_binary_name": "python3", "verbose_file_summary_report": True, + "pip_version": "latest", + "pip_legacy_resolver": False, }, ), ( @@ -79,6 +89,8 @@ "output_directory": None, "python_binary_name": "python.exe", "verbose_file_summary_report": False, + "pip_version": "latest", + "pip_legacy_resolver": False, }, ), ( @@ -99,6 +111,8 @@ "output_directory": None, "python_binary_name": "python.exe", "verbose_file_summary_report": False, + "pip_version": "latest", + "pip_legacy_resolver": False, }, ), ( @@ -121,6 +135,8 @@ "output_directory": "new_output", "python_binary_name": "python.exe", "verbose_file_summary_report": False, + "pip_version": "latest", + "pip_legacy_resolver": False, }, ), ( @@ -144,6 +160,8 @@ "output_directory": "new_output", "python_binary_name": "python.exe", "verbose_file_summary_report": False, + "pip_version": "latest", + "pip_legacy_resolver": False, }, ), ( @@ -168,6 +186,65 @@ "output_directory": "new_output", "python_binary_name": "python.exe", "verbose_file_summary_report": True, + "pip_version": "latest", + "pip_legacy_resolver": False, + }, + ), + ( + [ + "build", + "-v", + "--source", + "package", + "--config", + "/path/to/globalConfig.yaml", + "--ta-version", + "2.2.0", + "--output", + "new_output", + "--python-binary-name", + "python.exe", + "--pip-version", + "21.0.0", + ], + { + "source": "package", + "config_path": "/path/to/globalConfig.yaml", + "addon_version": "2.2.0", + "output_directory": "new_output", + "python_binary_name": "python.exe", + "verbose_file_summary_report": True, + "pip_version": "21.0.0", + "pip_legacy_resolver": False, + }, + ), + ( + [ + "build", + "-v", + "--source", + "package", + "--config", + "/path/to/globalConfig.yaml", + "--ta-version", + "2.2.0", + "--output", + "new_output", + "--python-binary-name", + "python.exe", + "--pip-version", + "21.0.0", + "--pip-legacy-resolver", + ], + { + "source": "package", + "config_path": "/path/to/globalConfig.yaml", + "addon_version": "2.2.0", + "output_directory": "new_output", + "python_binary_name": "python.exe", + "verbose_file_summary_report": True, + "pip_version": "21.0.0", + "pip_legacy_resolver": True, }, ), ], From b5476ce8cc8050becc82a85417c8e94c482633bc Mon Sep 17 00:00:00 2001 From: Viktor Tsvetkov <142901247+vtsvetkov-splunk@users.noreply.github.com> Date: Thu, 1 Feb 2024 15:08:17 +0100 Subject: [PATCH 18/23] chore(codeowners): assign user groups to code owners (#1038) --- .github/CODEOWNERS | 14 +++++++++++--- 1 file changed, 11 insertions(+), 3 deletions(-) diff --git a/.github/CODEOWNERS b/.github/CODEOWNERS index b3be68dd5..b10f657ca 100644 --- a/.github/CODEOWNERS +++ b/.github/CODEOWNERS @@ -1,3 +1,11 @@ -* @artemrys -/splunk_add_on_ucc_framework/schema/schema.json @artemrys @vtsvetkov-splunk -/ui/ @vtsvetkov-splunk +* @splunk/ucc-developers + +/ui/ @splunk/ucc-ui-developers +*.ts @splunk/ucc-ui-developers +*.tsx @splunk/ucc-ui-developers + +*.py @splunk/ucc-be-developers +/tests @splunk/ucc-be-developers +/splunk_add_on_ucc_framework @splunk/ucc-be-developers + +/splunk_add_on_ucc_framework/schema/schema.json @splunk/ucc-developers From b56e8b4125e99bdcacbfb5ca7174ecb82738dad1 Mon Sep 17 00:00:00 2001 From: sgoral-splunk <138458044+sgoral-splunk@users.noreply.github.com> Date: Thu, 1 Feb 2024 16:30:34 +0100 Subject: [PATCH 19/23] ci: fix pipeline for forks (#1040) skip THIRDPARTY build substeps for fork pull requests --- .github/workflows/build-test-release.yml | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/.github/workflows/build-test-release.yml b/.github/workflows/build-test-release.yml index bd885b204..c03df1097 100644 --- a/.github/workflows/build-test-release.yml +++ b/.github/workflows/build-test-release.yml @@ -94,10 +94,13 @@ jobs: with: name: UCC-UI-build path: built-ui/ + - uses: actions/download-artifact@v4 + if: "! github.event.pull_request.head.repo.fork " with: name: THIRDPARTY - run: cp -f THIRDPARTY NOTICE + if: "! github.event.pull_request.head.repo.fork " - run: curl -sSL https://install.python-poetry.org | python3 - --version 1.5.1 - run: poetry install - name: Check docs @@ -301,6 +304,7 @@ jobs: - semgrep - pre-commit runs-on: ubuntu-latest + if: "! github.event.pull_request.head.repo.fork " steps: - uses: actions/checkout@v4 with: From 64099f0d2dc0f84fb727ae8f97a3ee8bc597915d Mon Sep 17 00:00:00 2001 From: Viktor Tsvetkov <142901247+vtsvetkov-splunk@users.noreply.github.com> Date: Mon, 5 Feb 2024 17:08:55 +0100 Subject: [PATCH 20/23] chore(msw-addon): fix api mocking for storybook (#1046) --- ui/.storybook/main.ts | 3 +- ui/.storybook/preview.tsx | 35 ++++++++++++++----- ui/package.json | 6 ++-- .../CheckboxGroup/checkboxGroupMocks.ts | 8 ----- ui/src/mocks/globalConfigMock.ts | 1 + ui/src/public/mockServiceWorker.js | 4 +-- 6 files changed, 34 insertions(+), 23 deletions(-) diff --git a/ui/.storybook/main.ts b/ui/.storybook/main.ts index 02470b64e..c82e12d01 100644 --- a/ui/.storybook/main.ts +++ b/ui/.storybook/main.ts @@ -8,7 +8,6 @@ const config: StorybookConfig = { '@storybook/addon-links', '@storybook/addon-essentials', '@storybook/addon-interactions', - 'msw-storybook-addon', ], framework: { name: '@storybook/react-webpack5', @@ -19,7 +18,7 @@ const config: StorybookConfig = { }, staticDirs: ['../src/public'], webpackFinal: async (config) => { - const alias = config.resolve.alias || {}; + const alias = config.resolve?.alias || {}; return { ...config, resolve: { diff --git a/ui/.storybook/preview.tsx b/ui/.storybook/preview.tsx index 2e2e97f4c..11b0af8b2 100644 --- a/ui/.storybook/preview.tsx +++ b/ui/.storybook/preview.tsx @@ -24,20 +24,37 @@ const preview: Preview = { disable: true, }, msw: { - handlers: [ - ...serverHandlers, - http.get(`globalConfig.json`, () => - HttpResponse.json({ - pages: {}, - meta: {}, - }) - ), - ], + handlers: { + common: [ + ...serverHandlers, + http.get(`globalConfig.json`, () => + HttpResponse.json({ + pages: {}, + meta: {}, + }) + ), + http.post(`/servicesNS/:user/-/:serviceName`, async ({ request }) => + HttpResponse.json( + { + messages: [ + { + text: `Submitted body: ${decodeURIComponent( + await request.text() + )}`, + }, + ], + }, + { status: 500 } + ) + ), + ], + }, }, controls: { sort: 'requiredFirst', }, }, + loaders: [mswLoader], decorators: [withSplunkThemeToolbar], }; diff --git a/ui/package.json b/ui/package.json index 7682e2d15..3c589d7f3 100644 --- a/ui/package.json +++ b/ui/package.json @@ -113,6 +113,8 @@ "yarn": "^1.22.21" }, "msw": { - "workerDirectory": "src/public" + "workerDirectory": [ + "src/public" + ] } -} +} \ No newline at end of file diff --git a/ui/src/components/CheckboxGroup/checkboxGroupMocks.ts b/ui/src/components/CheckboxGroup/checkboxGroupMocks.ts index 71044c2e4..bc4cf2244 100644 --- a/ui/src/components/CheckboxGroup/checkboxGroupMocks.ts +++ b/ui/src/components/CheckboxGroup/checkboxGroupMocks.ts @@ -12,12 +12,4 @@ export const serverHandlers = [ ], }) ), - http.post(`/servicesNS/:user/-/:serviceName`, async ({ request }) => - HttpResponse.json( - { - messages: [{ text: `Submitted body: ${decodeURIComponent(await request.text())}` }], - }, - { status: 500 } - ) - ), ]; diff --git a/ui/src/mocks/globalConfigMock.ts b/ui/src/mocks/globalConfigMock.ts index bbad17b7a..1812be41c 100644 --- a/ui/src/mocks/globalConfigMock.ts +++ b/ui/src/mocks/globalConfigMock.ts @@ -160,6 +160,7 @@ const globalConfigMock: z.input = { type: 'singleSelect', label: 'Account to use', options: { + createSearchChoice: true, referenceName: 'account', }, help: 'Account to use for this input.', diff --git a/ui/src/public/mockServiceWorker.js b/ui/src/public/mockServiceWorker.js index e369128ec..a2745d127 100644 --- a/ui/src/public/mockServiceWorker.js +++ b/ui/src/public/mockServiceWorker.js @@ -2,13 +2,13 @@ /* tslint:disable */ /** - * Mock Service Worker (2.0.11). + * Mock Service Worker (2.1.5). * @see https://github.com/mswjs/msw * - Please do NOT modify this file. * - Please do NOT serve this file on production. */ -const INTEGRITY_CHECKSUM = 'c5f7f8e188b673ea4e677df7ea3c5a39' +const INTEGRITY_CHECKSUM = '223d191a56023cd36aa88c802961b911' const IS_MOCKED_RESPONSE = Symbol('isMockedResponse') const activeClientIds = new Set() From afee5116dfa8daf08ea22a1c4fceea2ffadba55c Mon Sep 17 00:00:00 2001 From: Viktor Tsvetkov <142901247+vtsvetkov-splunk@users.noreply.github.com> Date: Tue, 6 Feb 2024 10:11:36 +0100 Subject: [PATCH 21/23] chore(renovate): separate npm and poetry dependencies (#1050) --- renovate.json | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/renovate.json b/renovate.json index f4be95fd0..0a176cdef 100644 --- a/renovate.json +++ b/renovate.json @@ -15,6 +15,11 @@ "every 2 weeks on Sunday" ], "packageRules": [ + { + "description": "Separate npm and poetry dependencies", + "matchPackagePatterns": ["*"], + "groupName": "{{manager}}" + }, { "matchPackageNames": ["urllib3"], "allowedVersions": "<2.0.0" From 04b847f39cccdd5937faf309fe8a81699d9b8919 Mon Sep 17 00:00:00 2001 From: livehybrid <5527349+livehybrid@users.noreply.github.com> Date: Tue, 6 Feb 2024 11:30:28 +0000 Subject: [PATCH 22/23] feat: allow wildcards in .uccignore file (#1012) Currently it is not possible to put wildcards in the .uccignore file, this can be problematic if you do not know the exact filename that needs to be ignored, for example a developer may be developing a TA on a Mac which could create darwin related binaries in the lib/ folder. Other "ignore" files, such as .gitignore and .dockerignore allow for wildcards and therefore developers may expect that same with uccignore. .uccignore: ``` ... lib/**/*darwin*.so ``` Before: ``` ... WARNING: While ignoring the files mentioned in .uccignore '/output//lib/**/*darwin*.so was not found INFO: Removed ['', '/output//lib/**/*darwin*.so'] files ... ``` Note, in the above it does not expand the wildcards, the WARNING says that there was no match, however the INFO contradicts and suggests that it has been removed (which it has not). After: ``` ... INFO: Removed ['/output//lib/_cffi_backend.cpython-39-darwin.so', '/output//lib/charset_normalizer/md__mypyc.cpython-39-darwin.so', '/output//lib/charset_normalizer/md.cpython-39-darwin.so'] files ... ``` Note: The list of removed files is now representative of what was removed, rather than the wildcard, so the developer can see exactly what has been ignored/removed. This also fixes #1011 --------- Co-authored-by: sgoral --- docs/uccignore.md | 26 +- splunk_add_on_ucc_framework/commands/build.py | 39 +- tests/smoke/test_ucc_build.py | 88 + .../.uccignore | 4 + .../LICENSES/Apache-2.0.txt | 1 + .../globalConfig.json | 1416 +++++++++++++++++ .../package/README.txt | 1 + .../package/app.manifest | 54 + .../bin/splunk_ta_uccexample_custom_rh.py | 20 + .../splunk_ta_uccexample_rh_three_custom.py | 49 + .../package/default/eventtypes.conf | 4 + .../package/default/tags.conf | 4 + .../package/lib/requirements.txt | 1 + .../package/static/appIcon.png | Bin 0 -> 3348 bytes .../package/static/appIconAlt.png | Bin 0 -> 3348 bytes .../package/static/appIconAlt_2x.png | Bin 0 -> 6738 bytes .../package/static/appIcon_2x.png | Bin 0 -> 6738 bytes 17 files changed, 1688 insertions(+), 19 deletions(-) create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/.uccignore create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/LICENSES/Apache-2.0.txt create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/globalConfig.json create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/package/README.txt create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/package/app.manifest create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/package/bin/splunk_ta_uccexample_custom_rh.py create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/package/bin/splunk_ta_uccexample_rh_three_custom.py create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/package/default/eventtypes.conf create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/package/default/tags.conf create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/package/lib/requirements.txt create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/package/static/appIcon.png create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/package/static/appIconAlt.png create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/package/static/appIconAlt_2x.png create mode 100644 tests/testdata/test_addons/package_global_config_everything_uccignore/package/static/appIcon_2x.png diff --git a/docs/uccignore.md b/docs/uccignore.md index 9e4efd566..07b51d781 100644 --- a/docs/uccignore.md +++ b/docs/uccignore.md @@ -5,4 +5,28 @@ add-on recursively overrides the output folder. It is expected to be placed in the same folder as `globalConfig` file to have effect. -You will see a warning message in case ignored file is not found in the output folder. +Uccignore supports wildcard expressions, thanks to which we can find all files matching a specific pattern. + +e.g. for given file structure + +``` +... +└── lib + └── 3rdparty + │ ├── linux + │ ├   └── pycache.pyc + │ ├── linux_with_deps + │ ├   └── pycache.pyc + │ └── windows + │ └── pycache.pyc + └── requests + │ └── pycache.pyc + └── urllib + └── pycache.pyc +``` + +we can remove all `.pyc` files by adding `lib/**/pycache.pyc` to the .uccignore file. +If we want to remove all `.pyc` files just from the `3rdparty` directory, we need to change pattern to `lib/3rdparty/**/pycache.pyc`. +If we want to remove only for one specific platform, we need to provide the exact path e.g. **`lib/3rdparty/windows/pycache.pyc`**. + +In case no file is found for the specified pattern, you will see an appropriate warning message. diff --git a/splunk_add_on_ucc_framework/commands/build.py b/splunk_add_on_ucc_framework/commands/build.py index 4ca985543..6f6a3db4d 100644 --- a/splunk_add_on_ucc_framework/commands/build.py +++ b/splunk_add_on_ucc_framework/commands/build.py @@ -14,6 +14,7 @@ # limitations under the License. # import configparser +import glob import json import logging import os @@ -195,30 +196,32 @@ def _get_ignore_list( os.path.join(output_directory, addon_name, utils.get_os_path(path)) ).strip() for path in ignore_list + if path.strip() ] return ignore_list -def _remove_listed_files(ignore_list: List[str]) -> None: +def _remove_listed_files(ignore_list: List[str]) -> List[str]: """ Return path of files/folders to removed in output folder. Args: - ignore_list (list): List of files/folder to removed in output directory. - + ignore_list (list): List of files/folder patterns to be removed in output directory. """ - for path in ignore_list: - if os.path.exists(path): - if os.path.isfile(path): - os.remove(path) - elif os.path.isdir(path): - shutil.rmtree(path, ignore_errors=True) - else: - logger.warning( - "While ignoring the files mentioned in .uccignore {} was not found".format( - path - ) - ) + removed_list = [] + for pattern in ignore_list: + paths = glob.glob(pattern, recursive=True) + if not paths: + logger.warning(f"No files found for the specified pattern: {pattern}") + continue + for path in paths: + if os.path.exists(path): + if os.path.isfile(path): + os.remove(path) + elif os.path.isdir(path): + shutil.rmtree(path, ignore_errors=True) + removed_list.append(path) + return removed_list def generate_data_ui( @@ -629,9 +632,9 @@ def generate( os.path.abspath(os.path.join(source, os.pardir, ".uccignore")), output_directory, ) - _remove_listed_files(ignore_list) - if ignore_list: - logger.info(f"Removed {ignore_list} files") + removed_list = _remove_listed_files(ignore_list) + if removed_list: + logger.info("Removed:\n{}".format("\n".join(removed_list))) utils.recursive_overwrite(source, os.path.join(output_directory, ta_name)) logger.info("Copied package directory") diff --git a/tests/smoke/test_ucc_build.py b/tests/smoke/test_ucc_build.py index 396017b75..15dc73276 100644 --- a/tests/smoke/test_ucc_build.py +++ b/tests/smoke/test_ucc_build.py @@ -429,3 +429,91 @@ def summarize_types(raw_expected_logs): # summary messages must be the same but might come in different order assert log_line.message in expected_logs.keys() assert log_line.levelname == expected_logs[log_line.message] + + +@pytest.mark.skipif(sys.version_info >= (3, 8), reason=PYTEST_SKIP_REASON) +def test_ucc_generate_with_everything_uccignore(caplog): + with tempfile.TemporaryDirectory() as temp_dir: + package_folder = path.join( + path.dirname(path.realpath(__file__)), + "..", + "testdata", + "test_addons", + "package_global_config_everything_uccignore", + "package", + ) + build.generate(source=package_folder, output_directory=temp_dir) + + expected_warning_msg = ( + f"No files found for the specified pattern: " + f"{temp_dir}/Splunk_TA_UCCExample/bin/wrong_pattern" + ) + + edm1 = "Removed:" + edm2 = f"\n{temp_dir}/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_one.py" + edm3 = f"\n{temp_dir}/Splunk_TA_UCCExample/bin/example_input_one.py" + edm4 = f"\n{temp_dir}/Splunk_TA_UCCExample/bin/splunk_ta_uccexample_rh_example_input_two.py" + + assert expected_warning_msg in caplog.text + assert (edm1 + edm2 + edm3 + edm4) in caplog.text or ( + edm1 + edm3 + edm2 + edm4 + ) in caplog.text + + expected_folder = path.join( + path.dirname(__file__), + "..", + "testdata", + "expected_addons", + "expected_output_global_config_everything", + "Splunk_TA_UCCExample", + ) + actual_folder = path.join(temp_dir, "Splunk_TA_UCCExample") + _compare_app_conf(expected_folder, actual_folder) + files_to_be_equal = [ + ("README.txt",), + ("default", "alert_actions.conf"), + ("default", "eventtypes.conf"), + ("default", "inputs.conf"), + ("default", "restmap.conf"), + ("default", "tags.conf"), + ("default", "splunk_ta_uccexample_settings.conf"), + ("default", "web.conf"), + ("default", "server.conf"), + ("default", "data", "ui", "alerts", "test_alert.html"), + ("default", "data", "ui", "nav", "default.xml"), + ("default", "data", "ui", "views", "configuration.xml"), + ("default", "data", "ui", "views", "inputs.xml"), + ("default", "data", "ui", "views", "dashboard.xml"), + ("default", "data", "ui", "views", "splunk_ta_uccexample_redirect.xml"), + ("bin", "splunk_ta_uccexample", "modalert_test_alert_helper.py"), + ("bin", "example_input_two.py"), + ("bin", "example_input_three.py"), + ("bin", "example_input_four.py"), + ("bin", "import_declare_test.py"), + ("bin", "splunk_ta_uccexample_rh_account.py"), + ("bin", "splunk_ta_uccexample_rh_three_custom.py"), + ("bin", "splunk_ta_uccexample_rh_example_input_four.py"), + ("bin", "splunk_ta_uccexample_custom_rh.py"), + ("bin", "splunk_ta_uccexample_rh_oauth.py"), + ("bin", "splunk_ta_uccexample_rh_settings.py"), + ("bin", "test_alert.py"), + ("README", "alert_actions.conf.spec"), + ("README", "inputs.conf.spec"), + ("README", "splunk_ta_uccexample_account.conf.spec"), + ("README", "splunk_ta_uccexample_settings.conf.spec"), + ("metadata", "default.meta"), + ] + helpers.compare_file_content( + files_to_be_equal, + expected_folder, + actual_folder, + ) + files_to_exist = [ + ("static", "appIcon.png"), + ("static", "appIcon_2x.png"), + ("static", "appIconAlt.png"), + ("static", "appIconAlt_2x.png"), + ] + for f in files_to_exist: + expected_file_path = path.join(expected_folder, *f) + assert path.exists(expected_file_path) diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/.uccignore b/tests/testdata/test_addons/package_global_config_everything_uccignore/.uccignore new file mode 100644 index 000000000..9ab92ea97 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/.uccignore @@ -0,0 +1,4 @@ +**/**one.py + +bin/splunk_ta_uccexample_rh_example_input_two.py +bin/wrong_pattern diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/LICENSES/Apache-2.0.txt b/tests/testdata/test_addons/package_global_config_everything_uccignore/LICENSES/Apache-2.0.txt new file mode 100644 index 000000000..33195b0f8 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/LICENSES/Apache-2.0.txt @@ -0,0 +1 @@ +dummy apache license \ No newline at end of file diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/globalConfig.json b/tests/testdata/test_addons/package_global_config_everything_uccignore/globalConfig.json new file mode 100644 index 000000000..646918be7 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/globalConfig.json @@ -0,0 +1,1416 @@ +{ + "pages": { + "configuration": { + "tabs": [ + { + "name": "account", + "warning": { + "create": { + "message": "Some warning for account text create", + "alwaysDisplay": true + }, + "edit": { + "message": "Some warning for account text edit" + }, + "clone": { + "message": "Some warning for account text clone" + } + }, + "table": { + "actions": [ + "edit", + "delete", + "clone" + ], + "header": [ + { + "label": "Name", + "field": "name" + }, + { + "label": "Auth Type", + "field": "auth_type" + } + ] + }, + "entity": [ + { + "type": "text", + "label": "Name", + "validators": [ + { + "type": "string", + "errorMsg": "Length of ID should be between 1 and 50", + "minLength": 1, + "maxLength": 50 + }, + { + "type": "regex", + "errorMsg": "Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.", + "pattern": "^[a-zA-Z]\\w*$" + } + ], + "field": "name", + "help": "Enter a unique name for this account.", + "required": true + }, + { + "type": "singleSelect", + "label": "Example Environment", + "options": { + "disableSearch": true, + "autoCompleteFields": [ + { + "value": "login.example.com", + "label": "Value1" + }, + { + "value": "test.example.com", + "label": "Value2" + }, + { + "value": "other", + "label": "Other" + } + ], + "display": true + }, + "help": "", + "field": "custom_endpoint", + "defaultValue": "login.example.com", + "required": true + }, + { + "type": "text", + "label": "Endpoint URL", + "help": "Enter the endpoint URL.", + "field": "endpoint", + "options": { + "display": false, + "requiredWhenVisible": true + } + }, + { + "type": "checkbox", + "label": "Example Checkbox", + "field": "account_checkbox", + "help": "This is an example checkbox for the account entity" + }, + { + "type": "radio", + "label": "Example Radio", + "field": "account_radio", + "defaultValue": "yes", + "help": "This is an example radio button for the account entity", + "required": true, + "options": { + "items": [ + { + "value": "yes", + "label": "Yes" + }, + { + "value": "no", + "label": "No" + } + ], + "display": true + } + }, + { + "type": "multipleSelect", + "label": "Example Multiple Select", + "field": "account_multiple_select", + "help": "This is an example multipleSelect for account entity", + "required": true, + "options": { + "items": [ + { + "value": "one", + "label": "Option One" + }, + { + "value": "two", + "label": "Option Two" + } + ] + } + }, + { + "type": "oauth", + "field": "oauth", + "label": "Not used", + "options": { + "auth_type": [ + "basic", + "oauth" + ], + "basic": [ + { + "oauth_field": "username", + "label": "Username", + "help": "Enter the username for this account.", + "field": "username" + }, + { + "oauth_field": "password", + "label": "Password", + "encrypted": true, + "help": "Enter the password for this account.", + "field": "password" + }, + { + "oauth_field": "security_token", + "label": "Security Token", + "encrypted": true, + "help": "Enter the security token.", + "field": "token" + }, + { + "oauth_field": "some_text", + "label": "Disabled on edit for oauth", + "help": "Enter text for field disabled on edit", + "field": "basic_oauth_text", + "required": false, + "options": { + "disableonEdit": true + } + } + ], + "oauth": [ + { + "oauth_field": "client_id", + "label": "Client Id", + "field": "client_id", + "help": "Enter the Client Id for this account." + }, + { + "oauth_field": "client_secret", + "label": "Client Secret", + "field": "client_secret", + "encrypted": true, + "help": "Enter the Client Secret key for this account." + }, + { + "oauth_field": "redirect_url", + "label": "Redirect url", + "field": "redirect_url", + "help": "Copy and paste this URL into your app." + }, + { + "oauth_field": "endpoint_token", + "label": "Token endpoint", + "field": "endpoint_token", + "help": "Put here endpoint used for token acqusition ie. login.salesforce.com" + }, + { + "oauth_field": "endpoint_authorize", + "label": "Authorize endpoint", + "field": "endpoint_authorize", + "help": "Put here endpoint used for authorization ie. login.salesforce.com" + }, + { + "oauth_field": "oauth_some_text", + "label": "Disabled on edit for oauth", + "help": "Enter text for field disabled on edit", + "field": "oauth_oauth_text", + "required": false, + "options": { + "disableonEdit": true, + "enable": false + } + } + ], + "auth_code_endpoint": "/services/oauth2/authorize", + "access_token_endpoint": "/services/oauth2/token", + "oauth_timeout": 30, + "oauth_state_enabled": false + } + }, + { + "field": "example_help_link", + "label": "", + "type": "helpLink", + "options": { + "text": "Help Link", + "link": "https://docs.splunk.com/Documentation" + } + }, + { + "field": "config1_help_link", + "type": "helpLink", + "options": { + "text": "Add-on configuration documentation", + "link": "https://docs.splunk.com/Documentation" + } + }, + { + "field": "config2_help_link", + "type": "helpLink", + "options": { + "text": "SSL configuration documentation", + "link": "https://docs.splunk.com/Documentation" + } + } + ], + "title": "Account" + }, + { + "name": "proxy", + "warning": { + "config": { + "message": "Some warning for account text config" + } + }, + "entity": [ + { + "type": "checkbox", + "label": "Enable", + "field": "proxy_enabled" + }, + { + "type": "singleSelect", + "label": "Proxy Type", + "options": { + "disableSearch": true, + "autoCompleteFields": [ + { + "value": "http", + "label": "http" + }, + { + "value": "socks4", + "label": "socks4" + }, + { + "value": "socks5", + "label": "socks5" + } + ] + }, + "defaultValue": "http", + "field": "proxy_type" + }, + { + "type": "text", + "label": "Host", + "validators": [ + { + "type": "string", + "errorMsg": "Max host length is 4096", + "minLength": 0, + "maxLength": 4096 + }, + { + "type": "regex", + "errorMsg": "Proxy Host should not have special characters", + "pattern": "^[a-zA-Z]\\w*$" + } + ], + "field": "proxy_url" + }, + { + "type": "text", + "label": "Port", + "validators": [ + { + "type": "number", + "range": [ + 1, + 65535 + ] + } + ], + "field": "proxy_port" + }, + { + "type": "text", + "label": "Username", + "validators": [ + { + "type": "string", + "errorMsg": "Max length of username is 50", + "minLength": 0, + "maxLength": 50 + } + ], + "field": "proxy_username" + }, + { + "type": "text", + "label": "Password", + "validators": [ + { + "type": "string", + "errorMsg": "Max length of password is 8192", + "minLength": 0, + "maxLength": 8192 + } + ], + "encrypted": true, + "field": "proxy_password" + }, + { + "type": "checkbox", + "label": "Reverse DNS resolution", + "field": "proxy_rdns" + } + ], + "options": { + "saveValidator": "function(formData) { if(!formData.proxy_enabled || formData.proxy_enabled === '0') {return true; } if(!formData.proxy_url) { return 'Proxy Host can not be empty'; } if(!formData.proxy_port) { return 'Proxy Port can not be empty'; } return true; }" + }, + "title": "Proxy" + }, + { + "name": "logging", + "warning": { + "config": { + "message": "Some warning for account text config" + } + }, + "entity": [ + { + "type": "singleSelect", + "label": "Log level", + "options": { + "disableSearch": true, + "autoCompleteFields": [ + { + "value": "DEBUG", + "label": "DEBUG" + }, + { + "value": "INFO", + "label": "INFO" + }, + { + "value": "WARNING", + "label": "WARNING" + }, + { + "value": "ERROR", + "label": "ERROR" + }, + { + "value": "CRITICAL", + "label": "CRITICAL" + } + ] + }, + "defaultValue": "INFO", + "field": "loglevel" + } + ], + "title": "Logging" + }, + { + "name": "custom_abc", + "title": "Customized tab", + "entity": [ + { + "field": "testString", + "label": "Test String", + "type": "text", + "validators": [ + { + "type": "string", + "maxLength": 10, + "minLength": 5 + } + ] + }, + { + "field": "testNumber", + "label": "Test Number", + "type": "text", + "validators": [ + { + "type": "number", + "range": [ + 1, + 10 + ] + } + ] + }, + { + "field": "testRegex", + "label": "Test Regex", + "type": "text", + "validators": [ + { + "type": "regex", + "pattern": "^\\w+$", + "errorMsg": "Characters of Name should match regex ^\\w+$ ." + } + ] + }, + { + "field": "testEmail", + "label": "Test Email", + "type": "text", + "validators": [ + { + "type": "email" + } + ] + }, + { + "field": "testIpv4", + "label": "Test Ipv4", + "type": "text", + "validators": [ + { + "type": "ipv4" + } + ] + }, + { + "field": "testDate", + "label": "Test Date", + "type": "text", + "validators": [ + { + "type": "date" + } + ] + }, + { + "field": "testUrl", + "label": "Test Url", + "type": "text", + "validators": [ + { + "type": "url" + } + ] + } + ] + } + ], + "title": "Configuration", + "description": "Set up your add-on", + "subDescription": { + "text": "Configuration page - Ingesting data from to Splunk Cloud? Have you tried the new Splunk Data Manager yet?\nData Manager makes AWS data ingestion simpler, more automated and centrally managed for you, while co-existing with AWS and/or Kinesis TAs.\nRead our [[blogPost]] to learn more about Data Manager and it's availability on your Splunk Cloud instance.", + "links": [ + { + "slug": "blogPost", + "link": "https://splk.it/31oy2b2", + "linkText": "blog post" + } + ] + } + }, + "inputs": { + "services": [ + { + "name": "example_input_one", + "warning": { + "create": { + "message": "Some warning for account text create" + }, + "edit": { + "message": "Some warning for account text edit" + }, + "clone": { + "message": "Some warning for account text clone" + }, + "delete": { + "message": "Some warning for account text delete" + } + }, + "entity": [ + { + "type": "text", + "label": "Name", + "validators": [ + { + "type": "regex", + "errorMsg": "Input Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.", + "pattern": "^[a-zA-Z]\\w*$" + }, + { + "type": "string", + "errorMsg": "Length of input name should be between 1 and 100", + "minLength": 1, + "maxLength": 100 + } + ], + "field": "name", + "help": "A unique name for the data input.", + "required": true + }, + { + "type": "checkbox", + "label": "Example Checkbox", + "field": "input_one_checkbox", + "help": "This is an example checkbox for the input one entity", + "defaultValue": true + }, + { + "type": "radio", + "label": "Example Radio", + "field": "input_one_radio", + "defaultValue": "yes", + "help": "This is an example radio button for the input one entity", + "required": false, + "options": { + "items": [ + { + "value": "yes", + "label": "Yes" + }, + { + "value": "no", + "label": "No" + } + ], + "display": true + } + }, + { + "field": "singleSelectTest", + "label": "Single Select Group Test", + "type": "singleSelect", + "options": { + "createSearchChoice": true, + "autoCompleteFields": [ + { + "label": "Group1", + "children": [ + { + "value": "one", + "label": "One" + }, + { + "value": "two", + "label": "Two" + } + ] + }, + { + "label": "Group2", + "children": [ + { + "value": "three", + "label": "Three" + }, + { + "value": "four", + "label": "Four" + } + ] + } + ] + } + }, + { + "field": "multipleSelectTest", + "label": "Multiple Select Test", + "type": "multipleSelect", + "defaultValue": "a|b", + "options": { + "delimiter": "|", + "items": [ + { + "value": "a", + "label": "A" + }, + { + "value": "b", + "label": "B" + } + ] + } + }, + { + "type": "text", + "label": "Interval", + "validators": [ + { + "type": "regex", + "errorMsg": "Interval must be an integer.", + "pattern": "^\\-[1-9]\\d*$|^\\d*$" + } + ], + "field": "interval", + "help": "Time interval of the data input, in seconds.", + "required": true + }, + { + "type": "singleSelect", + "label": "Index", + "validators": [ + { + "type": "string", + "errorMsg": "Length of index name should be between 1 and 80.", + "minLength": 1, + "maxLength": 80 + } + ], + "defaultValue": "default", + "options": { + "endpointUrl": "data/indexes", + "denyList": "^_.*$", + "createSearchChoice": true + }, + "field": "index", + "required": true + }, + { + "type": "singleSelect", + "label": "Example Account", + "options": { + "referenceName": "account" + }, + "help": "", + "field": "account", + "required": true + }, + { + "type": "text", + "label": "Object", + "validators": [ + { + "type": "string", + "errorMsg": "Max length of text input is 8192", + "minLength": 0, + "maxLength": 8192 + } + ], + "field": "object", + "help": "The name of the object to query for.", + "required": true + }, + { + "type": "text", + "label": "Object Fields", + "validators": [ + { + "type": "string", + "errorMsg": "Max length of text input is 8192", + "minLength": 0, + "maxLength": 8192 + } + ], + "field": "object_fields", + "help": "Object fields from which to collect data. Delimit multiple fields using a comma.", + "required": true + }, + { + "type": "text", + "label": "Order By", + "validators": [ + { + "type": "string", + "errorMsg": "Max length of text input is 8192", + "minLength": 0, + "maxLength": 8192 + } + ], + "defaultValue": "LastModifiedDate", + "field": "order_by", + "help": "The datetime field by which to query results in ascending order for indexing.", + "required": true + }, + { + "type": "radio", + "label": "Use existing data input?", + "field": "use_existing_checkpoint", + "defaultValue": "yes", + "help": "Data input already exists. Select `No` if you want to reset the data collection.", + "required": false, + "options": { + "items": [ + { + "value": "yes", + "label": "Yes" + }, + { + "value": "no", + "label": "No" + } + ], + "display": false + } + }, + { + "type": "text", + "label": "Query Start Date", + "validators": [ + { + "type": "regex", + "errorMsg": "Invalid date and time format", + "pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$" + } + ], + "field": "start_date", + "help": "The datetime after which to query and index records, in this format: \"YYYY-MM-DDThh:mm:ss.000z\".\nDefaults to 90 days earlier from now.", + "tooltip": "Changing this parameter may result in gaps or duplication in data collection.", + "required": false + }, + { + "type": "text", + "label": "Limit", + "validators": [ + { + "type": "string", + "errorMsg": "Max length of text input is 8192", + "minLength": 0, + "maxLength": 8192 + } + ], + "defaultValue": "1000", + "field": "limit", + "help": "The maximum number of results returned by the query.", + "required": false + }, + { + "type": "textarea", + "label": "Example Textarea Field", + "field": "example_textarea_field", + "help": "Help message", + "options": { + "rowsMin": 3, + "rowsMax": 15 + }, + "required": true + }, + { + "field": "example_help_link", + "label": "", + "type": "helpLink", + "options": { + "text": "Help Link", + "link": "https://docs.splunk.com/Documentation" + } + } + ], + "title": "Example Input One" + }, + { + "name": "example_input_two", + "entity": [ + { + "type": "text", + "label": "Name", + "validators": [ + { + "type": "regex", + "errorMsg": "Input Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.", + "pattern": "^[a-zA-Z]\\w*$" + }, + { + "type": "string", + "errorMsg": "Length of input name should be between 1 and 100", + "minLength": 1, + "maxLength": 100 + } + ], + "field": "name", + "help": "A unique name for the data input.", + "required": true + }, + { + "type": "text", + "label": "Interval", + "validators": [ + { + "type": "regex", + "errorMsg": "Interval must be an integer.", + "pattern": "^\\-[1-9]\\d*$|^\\d*$" + } + ], + "field": "interval", + "help": "Time interval of the data input, in seconds .", + "required": true + }, + { + "type": "singleSelect", + "label": "Index", + "validators": [ + { + "type": "string", + "errorMsg": "Length of index name should be between 1 and 80.", + "minLength": 1, + "maxLength": 80 + } + ], + "defaultValue": "default", + "options": { + "endpointUrl": "data/indexes", + "denyList": "^_.*$", + "createSearchChoice": true + }, + "field": "index", + "required": true + }, + { + "type": "singleSelect", + "label": "Example Account", + "options": { + "referenceName": "account" + }, + "help": "", + "field": "account", + "required": true + }, + { + "type": "multipleSelect", + "label": "Example Multiple Select", + "field": "input_two_multiple_select", + "help": "This is an example multipleSelect for input two entity", + "required": true, + "options": { + "items": [ + { + "value": "one", + "label": "Option One" + }, + { + "value": "two", + "label": "Option Two" + } + ] + } + }, + { + "type": "checkbox", + "label": "Example Checkbox", + "field": "input_two_checkbox", + "help": "This is an example checkbox for the input two entity" + }, + { + "type": "radio", + "label": "Example Radio", + "field": "input_two_radio", + "help": "This is an example radio button for the input two entity", + "required": true, + "options": { + "items": [ + { + "value": "yes", + "label": "Yes" + }, + { + "value": "no", + "label": "No" + } + ], + "display": true + } + }, + { + "type": "radio", + "label": "Use existing data input?", + "field": "use_existing_checkpoint", + "defaultValue": "yes", + "help": "Data input already exists. Select `No` if you want to reset the data collection.", + "required": false, + "options": { + "items": [ + { + "value": "yes", + "label": "Yes" + }, + { + "value": "no", + "label": "No" + } + ], + "display": false + } + }, + { + "type": "text", + "label": "Query Start Date", + "validators": [ + { + "type": "regex", + "errorMsg": "Invalid date and time format", + "pattern": "^(\\d{4}-\\d{2}-\\d{2}T\\d{2}:\\d{2}:\\d{2}.\\d{3}z)?$" + } + ], + "field": "start_date", + "help": "The date and time, in \"YYYY-MM-DDThh:mm:ss.000z\" format, after which to query and index records. \nThe default is 90 days before today.", + "tooltip": "Changing this parameter may result in gaps or duplication in data collection.", + "required": false + }, + { + "field": "example_help_link", + "label": "", + "type": "helpLink", + "options": { + "text": "Help Link", + "link": "https://docs.splunk.com/Documentation" + } + }, + { + "field": "apis", + "label": "APIs/Interval (in seconds)", + "type": "checkboxGroup", + "options": { + "groups": [ + { + "label": "EC2", + "options": { + "isExpandable": true + }, + "fields": [ + "ec2_volumes", + "ec2_instances", + "ec2_reserved_instances", + "ebs_snapshots", + "rds_instances", + "rds_reserved_instances", + "ec2_key_pairs", + "ec2_security_groups", + "ec2_images", + "ec2_addresses" + ] + }, + { + "label": "ELB", + "options": { + "isExpandable": true + }, + "fields": [ + "classic_load_balancers", + "application_load_balancers" + ] + }, + { + "label": "VPC", + "options": { + "isExpandable": true + }, + "fields": [ + "vpcs", + "vpc_network_acls", + "vpc_subnets" + ] + } + ], + "rows": [ + { + "field": "ec2_volumes", + "checkbox": { + "defaultValue": true + }, + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "ec2_instances", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "ec2_reserved_instances", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "ebs_snapshots", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "rds_instances", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "rds_reserved_instances", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "ec2_key_pairs", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "ec2_security_groups", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "ec2_images", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "ec2_addresses", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "classic_load_balancers", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "application_load_balancers", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "vpcs", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "vpc_network_acls", + "input": { + "defaultValue": 3600, + "required": true + } + }, + { + "field": "vpc_subnets", + "input": { + "defaultValue": 3600, + "required": true + } + } + ] + } + } + ], + "title": "Example Input Two" + }, + { + "name": "example_input_three", + "restHandlerName": "splunk_ta_uccexample_rh_three_custom", + "entity": [ + { + "type": "text", + "label": "Name", + "validators": [ + { + "type": "regex", + "errorMsg": "Input Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.", + "pattern": "^[a-zA-Z]\\w*$" + }, + { + "type": "string", + "errorMsg": "Length of input name should be between 1 and 100", + "minLength": 1, + "maxLength": 100 + } + ], + "field": "name", + "help": "A unique name for the data input.", + "required": true + }, + { + "type": "text", + "label": "Interval", + "validators": [ + { + "type": "regex", + "errorMsg": "Interval must be an integer.", + "pattern": "^\\-[1-9]\\d*$|^\\d*$" + } + ], + "field": "interval", + "help": "Time interval of the data input, in seconds.", + "required": true + } + ], + "title": "Example Input Three" + }, + { + "name": "example_input_four", + "restHandlerModule": "splunk_ta_uccexample_custom_rh", + "restHandlerClass": "CustomRestHandler", + "entity": [ + { + "type": "text", + "label": "Name", + "validators": [ + { + "type": "regex", + "errorMsg": "Input Name must begin with a letter and consist exclusively of alphanumeric characters and underscores.", + "pattern": "^[a-zA-Z]\\w*$" + }, + { + "type": "string", + "errorMsg": "Length of input name should be between 1 and 100", + "minLength": 1, + "maxLength": 100 + } + ], + "field": "name", + "help": "A unique name for the data input.", + "required": true + }, + { + "type": "text", + "label": "Interval", + "validators": [ + { + "type": "regex", + "errorMsg": "Interval must be an integer.", + "pattern": "^\\-[1-9]\\d*$|^\\d*$" + } + ], + "field": "interval", + "help": "Time interval of the data input, in seconds.", + "required": true + } + ], + "title": "Example Input Four" + } + ], + "title": "Inputs", + "description": "Manage your data inputs", + "subDescription": { + "text": "Input page - Ingesting data from to Splunk Cloud? Have you tried the new Splunk Data Manager yet?\nData Manager makes AWS data ingestion simpler, more automated and centrally managed for you, while co-existing with AWS and/or Kinesis TAs.\nRead our [[blogPost]] to learn more about Data Manager and it's availability on your Splunk Cloud instance.", + "links": [ + { + "slug": "blogPost", + "link": "https://splk.it/31oy2b2", + "linkText": "blog post" + } + ] + }, + "table": { + "actions": [ + "edit", + "enable", + "delete", + "clone" + ], + "header": [ + { + "label": "Name", + "field": "name" + }, + { + "label": "Account", + "field": "account" + }, + { + "label": "Interval", + "field": "interval" + }, + { + "label": "Index", + "field": "index" + }, + { + "label": "Status", + "field": "disabled" + } + ], + "moreInfo": [ + { + "label": "Name", + "field": "name" + }, + { + "label": "Interval", + "field": "interval" + }, + { + "label": "Index", + "field": "index" + }, + { + "label": "Status", + "field": "disabled", + "mapping": { + "true": "Disabled", + "false": "Enabled" + } + }, + { + "label": "Example Account", + "field": "account" + }, + { + "label": "Object", + "field": "object" + }, + { + "label": "Object Fields", + "field": "object_fields" + }, + { + "label": "Order By", + "field": "order_by" + }, + { + "label": "Query Start Date", + "field": "start_date" + }, + { + "label": "Limit", + "field": "limit" + } + ] + } + }, + "dashboard": { + "panels": [ + { + "name": "addon_version" + }, + { + "name": "events_ingested_by_sourcetype" + }, + { + "name": "errors_in_the_addon" + } + ] + } + }, + "alerts": [ + { + "name": "test_alert", + "label": "Test Alert", + "description": "Description for test Alert Action", + "activeResponse": { + "task": [ + "Create", + "Update" + ], + "supportsAdhoc": true, + "subject": [ + "endpoint" + ], + "category": [ + "Information Conveyance", + "Information Portrayal" + ], + "technology": [ + { + "version": [ + "1.0.0" + ], + "product": "Test Incident Update", + "vendor": "Splunk" + } + ], + "drilldownUri": "search?q=search%20index%3D\"_internal\"&earliest=0&latest=", + "sourcetype": "test:incident" + }, + "entity": [ + { + "type": "text", + "label": "Name", + "field": "name", + "defaultValue": "xyz", + "required": true, + "help": "Please enter your name" + }, + { + "type": "checkbox", + "label": "All Incidents", + "field": "all_incidents", + "defaultValue": 0, + "required": false, + "help": "Tick if you want to update all incidents/problems" + }, + { + "type": "singleSelect", + "label": "Table List", + "field": "table_list", + "options": { + "items": [ + { + "value": "Incident", + "label": "incident" + }, + { + "value": "Problem", + "label": "problem" + } + ] + }, + "help": "Please select the table", + "required": false, + "defaultValue": "problem" + }, + { + "type": "radio", + "label": "Action:", + "field": "action", + "options": { + "items": [ + { + "value": "Update", + "label": "update" + }, + { + "value": "Delete", + "label": "delete" + } + ] + }, + "help": "Select the action you want to perform", + "required": true, + "defaultValue": "two" + }, + { + "type": "singleSelectSplunkSearch", + "label": "Select Account", + "field": "account", + "search": "| rest /servicesNS/nobody/Splunk_TA_UCCExample/splunk_ta_uccexample_account | dedup title", + "options": { + "items": [ + { + "label": "earliest", + "value": "-4@h" + }, + { + "label": "latest", + "value": "now" + } + ] + }, + "valueField": "title", + "labelField": "title", + "help": "Select the account from the dropdown", + "required": true + } + ] + } + ], + "meta": { + "name": "Splunk_TA_UCCExample", + "restRoot": "splunk_ta_uccexample", + "version": "5.36.2Ref7d7543", + "displayName": "Splunk UCC test Add-on", + "schemaVersion": "0.0.3", + "_uccVersion": "5.36.2" + } +} diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/package/README.txt b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/README.txt new file mode 100644 index 000000000..530a9e548 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/README.txt @@ -0,0 +1 @@ +Just a readme \ No newline at end of file diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/package/app.manifest b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/app.manifest new file mode 100644 index 000000000..a99395790 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/app.manifest @@ -0,0 +1,54 @@ +{ + "schemaVersion": "2.0.0", + "info": { + "title": "Splunk Add-on for UCC Example", + "id": { + "group": null, + "name": "Splunk_TA_UCCExample", + "version": "7.0.1" + }, + "author": [ + { + "name": "Splunk Inc.", + "email": null, + "company": null + } + ], + "releaseDate": null, + "description": "Splunk Add-on for UCC Example", + "classification": { + "intendedAudience": null, + "categories": [], + "developmentStatus": null + }, + "commonInformationModels": null, + "license": { + "name": null, + "text": "LICENSES/Apache-2.0.txt", + "uri": null + }, + "privacyPolicy": { + "name": null, + "text": null, + "uri": null + }, + "releaseNotes": { + "name": null, + "text": "./README.txt", + "uri": null + } + }, + "dependencies": null, + "tasks": null, + "inputGroups": null, + "incompatibleApps": null, + "platformRequirements": null, + "supportedDeployments": [ + "_standalone", + "_distributed" + ], + "targetWorkloads": [ + "_search_heads", + "_indexers" + ] +} diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/package/bin/splunk_ta_uccexample_custom_rh.py b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/bin/splunk_ta_uccexample_custom_rh.py new file mode 100644 index 000000000..77a709101 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/bin/splunk_ta_uccexample_custom_rh.py @@ -0,0 +1,20 @@ +import import_declare_test + +from splunktaucclib.rest_handler.admin_external import AdminExternalHandler + + +class CustomRestHandler(AdminExternalHandler): + def __init__(self, *args, **kwargs): + AdminExternalHandler.__init__(self, *args, **kwargs) + + def handleList(self, confInfo): + AdminExternalHandler.handleList(self, confInfo) + + def handleEdit(self, confInfo): + AdminExternalHandler.handleEdit(self, confInfo) + + def handleCreate(self, confInfo): + AdminExternalHandler.handleCreate(self, confInfo) + + def handleRemove(self, confInfo): + AdminExternalHandler.handleRemove(self, confInfo) diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/package/bin/splunk_ta_uccexample_rh_three_custom.py b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/bin/splunk_ta_uccexample_rh_three_custom.py new file mode 100644 index 000000000..396a11231 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/bin/splunk_ta_uccexample_rh_three_custom.py @@ -0,0 +1,49 @@ +import import_declare_test + +from splunktaucclib.rest_handler.endpoint import ( + field, + validator, + RestModel, + DataInputModel, +) +from splunktaucclib.rest_handler import admin_external, util +from splunktaucclib.rest_handler.admin_external import AdminExternalHandler +import logging + +util.remove_http_proxy_env_vars() + + +fields = [ + field.RestField( + 'interval', + required=True, + encrypted=False, + default=None, + validator=validator.Pattern( + regex=r"""^\-[1-9]\d*$|^\d*$""", + ) + ), + + field.RestField( + 'disabled', + required=False, + validator=None + ) + +] +model = RestModel(fields, name=None) + + + +endpoint = DataInputModel( + 'example_input_three', + model, +) + + +if __name__ == '__main__': + logging.getLogger().addHandler(logging.NullHandler()) + admin_external.handle( + endpoint, + handler=AdminExternalHandler, + ) diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/package/default/eventtypes.conf b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/default/eventtypes.conf new file mode 100644 index 000000000..6e6b4fcdd --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/default/eventtypes.conf @@ -0,0 +1,4 @@ + +# Just something +[UCC_NOT_GENERATED] +search = index=_internal sourcetype=splunkd \ No newline at end of file diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/package/default/tags.conf b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/default/tags.conf new file mode 100644 index 000000000..4c63aaf25 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/default/tags.conf @@ -0,0 +1,4 @@ + +[eventtype=UCC_NOT_GENERATED] +notalert = enabled + diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/package/lib/requirements.txt b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/lib/requirements.txt new file mode 100644 index 000000000..4e63a1a57 --- /dev/null +++ b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/lib/requirements.txt @@ -0,0 +1 @@ +splunktaucclib diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/package/static/appIcon.png b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/static/appIcon.png new file mode 100644 index 0000000000000000000000000000000000000000..88f67e7257157937dd747b21af2c7af4d3432386 GIT binary patch literal 3348 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 DQ5yUX literal 0 HcmV?d00001 diff --git a/tests/testdata/test_addons/package_global_config_everything_uccignore/package/static/appIcon_2x.png b/tests/testdata/test_addons/package_global_config_everything_uccignore/package/static/appIcon_2x.png new file mode 100644 index 0000000000000000000000000000000000000000..c638b3f159fc4047a35e86d577c49cb0234f6933 GIT binary patch literal 6738 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 DQ5yUX literal 0 HcmV?d00001 From b7f179ab20e3bae831f1e7ed5b499ceff59ce6bd Mon Sep 17 00:00:00 2001 From: Viktor Tsvetkov <142901247+vtsvetkov-splunk@users.noreply.github.com> Date: Tue, 6 Feb 2024 12:30:47 +0100 Subject: [PATCH 23/23] fix(EntityModal): prevent Enter from submitting the form in Modal window (#1047) ## The problem Enter for a form with single input triggers the form submission. [The specification](https://html.spec.whatwg.org/multipage/form-control-infrastructure.html#implicit-submission). The form submission was not properly handled. ## The fix - hook up on form submission by adding callback onSubmit for `
` element - prevent default behavior (sending GET with formdata in params and redirect) and proceed with our handlers (validation and sending as JSON with AJAX) ## References - https://splunk.atlassian.net/browse/ADDON-61126 - https://splunk.atlassian.net/browse/ADDON-58706 Resolves #875 --- ui/src/components/BaseFormView.tsx | 9 ++++++--- ui/src/components/ConfigurationFormView.jsx | 7 +++++-- ui/src/components/EntityModal/EntityModal.tsx | 7 ++++--- ui/src/components/EntityPage.tsx | 6 ++++-- 4 files changed, 19 insertions(+), 10 deletions(-) diff --git a/ui/src/components/BaseFormView.tsx b/ui/src/components/BaseFormView.tsx index 6c9557ca1..ccc147188 100644 --- a/ui/src/components/BaseFormView.tsx +++ b/ui/src/components/BaseFormView.tsx @@ -522,8 +522,8 @@ class BaseFormView extends PureComponent { } }; - // eslint-disable-next-line react/no-unused-class-component-methods - handleSubmit = () => { + handleSubmit = (event: React.MouseEvent | React.FormEvent) => { + event.preventDefault(); this.clearErrorMsg(); this.props.handleFormSubmit(/* isSubmitting */ true, /* closeEntity */ false); @@ -1253,7 +1253,10 @@ class BaseFormView extends PureComponent { } return (
- + {this.generateWarningMessage()} {this.generateErrorMessage()} {this.entities?.map((e) => { diff --git a/ui/src/components/ConfigurationFormView.jsx b/ui/src/components/ConfigurationFormView.jsx index 949badf82..87b6cc284 100644 --- a/ui/src/components/ConfigurationFormView.jsx +++ b/ui/src/components/ConfigurationFormView.jsx @@ -37,8 +37,11 @@ function ConfigurationFormView({ serviceName }) { }); }, [serviceName]); - const handleSubmit = () => { - form.current.handleSubmit(); + /** + * @param event {React.MouseEvent} + */ + const handleSubmit = (event) => { + form.current.handleSubmit(event); }; const handleFormSubmit = (set) => { diff --git a/ui/src/components/EntityModal/EntityModal.tsx b/ui/src/components/EntityModal/EntityModal.tsx index 640b2751d..0c47c6456 100644 --- a/ui/src/components/EntityModal/EntityModal.tsx +++ b/ui/src/components/EntityModal/EntityModal.tsx @@ -4,7 +4,8 @@ import styled from 'styled-components'; import WaitSpinner from '@splunk/react-ui/WaitSpinner'; import { _ } from '@splunk/ui-utils/i18n'; -import { MODE_CLONE, MODE_CREATE, MODE_EDIT, Mode } from '../../constants/modes'; +import { ButtonClickHandler } from '@splunk/react-ui/Button'; +import { Mode, MODE_CLONE, MODE_CREATE, MODE_EDIT } from '../../constants/modes'; import { StyledButton } from '../../pages/EntryPageStyle'; import BaseFormView from '../BaseFormView'; @@ -53,8 +54,8 @@ class EntityModal extends Component { this.props.handleRequestClose(); }; - handleSubmit = () => { - const result = this.form.current?.handleSubmit(); + handleSubmit: ButtonClickHandler = (e) => { + const result = this.form.current?.handleSubmit(e); if (result) { this.handleRequestClose(); } diff --git a/ui/src/components/EntityPage.tsx b/ui/src/components/EntityPage.tsx index 61866cf48..fbe689153 100644 --- a/ui/src/components/EntityPage.tsx +++ b/ui/src/components/EntityPage.tsx @@ -8,6 +8,7 @@ import { variables } from '@splunk/themes'; import Heading from '@splunk/react-ui/Heading'; import styled from 'styled-components'; +import { ButtonClickHandler } from '@splunk/react-ui/Button'; import { MODE_CLONE, MODE_CREATE, MODE_EDIT, Mode } from '../constants/modes'; import BaseFormView from './BaseFormView'; import { SubTitleComponent } from '../pages/Input/InputPageStyle'; @@ -55,8 +56,8 @@ function EntityPage({ buttonText = _('Update'); } - const handleSubmit = () => { - const result = form.current?.handleSubmit(); + const handleSubmit: ButtonClickHandler = (e) => { + const result = form.current?.handleSubmit(e); if (result) { handleRequestClose(); } @@ -107,6 +108,7 @@ function EntityPage({ style={{ width: '80px' }} /> : buttonText} onClick={handleSubmit}